initial commit main
authorNils Forssén <forssennils@gmail.com>
Mon, 2 Nov 2026 21:11:29 +0000 (22:11 +0100)
committerNils Forssén <forssennils@gmail.com>
Mon, 2 Nov 2026 21:11:29 +0000 (22:11 +0100)
25 files changed:
.vs/halloween_puff/v14/.atsuo [new file with mode: 0644]
halloween_puff.atsln [new file with mode: 0644]
halloween_puff/Debug/Makefile [new file with mode: 0644]
halloween_puff/Debug/halloween_puff.eep [new file with mode: 0644]
halloween_puff/Debug/halloween_puff.elf [new file with mode: 0644]
halloween_puff/Debug/halloween_puff.hex [new file with mode: 0644]
halloween_puff/Debug/halloween_puff.lss [new file with mode: 0644]
halloween_puff/Debug/halloween_puff.map [new file with mode: 0644]
halloween_puff/Debug/main.d [new file with mode: 0644]
halloween_puff/Debug/main.o [new file with mode: 0644]
halloween_puff/Debug/makedep.mk [new file with mode: 0644]
halloween_puff/Debug/memoryfile.xml [new file with mode: 0644]
halloween_puff/Release/Makefile [new file with mode: 0644]
halloween_puff/Release/halloween_puff.eep [new file with mode: 0644]
halloween_puff/Release/halloween_puff.elf [new file with mode: 0644]
halloween_puff/Release/halloween_puff.hex [new file with mode: 0644]
halloween_puff/Release/halloween_puff.lss [new file with mode: 0644]
halloween_puff/Release/halloween_puff.map [new file with mode: 0644]
halloween_puff/Release/main.d [new file with mode: 0644]
halloween_puff/Release/main.o [new file with mode: 0644]
halloween_puff/Release/makedep.mk [new file with mode: 0644]
halloween_puff/Release/memoryfile.xml [new file with mode: 0644]
halloween_puff/halloween_puff.componentinfo.xml [new file with mode: 0644]
halloween_puff/halloween_puff.cproj [new file with mode: 0644]
halloween_puff/main.c [new file with mode: 0644]

diff --git a/.vs/halloween_puff/v14/.atsuo b/.vs/halloween_puff/v14/.atsuo
new file mode 100644 (file)
index 0000000..5c49617
Binary files /dev/null and b/.vs/halloween_puff/v14/.atsuo differ
diff --git a/halloween_puff.atsln b/halloween_puff.atsln
new file mode 100644 (file)
index 0000000..3e08982
--- /dev/null
@@ -0,0 +1,22 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Atmel Studio Solution File, Format Version 11.00
+VisualStudioVersion = 14.0.23107.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "halloween_puff", "halloween_puff\halloween_puff.cproj", "{2285C48D-296E-43FD-A7B6-69885F64CFFD}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|AVR = Debug|AVR
+               Release|AVR = Release|AVR
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {2285C48D-296E-43FD-A7B6-69885F64CFFD}.Debug|AVR.ActiveCfg = Debug|AVR
+               {2285C48D-296E-43FD-A7B6-69885F64CFFD}.Debug|AVR.Build.0 = Debug|AVR
+               {2285C48D-296E-43FD-A7B6-69885F64CFFD}.Release|AVR.ActiveCfg = Release|AVR
+               {2285C48D-296E-43FD-A7B6-69885F64CFFD}.Release|AVR.Build.0 = Release|AVR
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/halloween_puff/Debug/Makefile b/halloween_puff/Debug/Makefile
new file mode 100644 (file)
index 0000000..b4b4c39
--- /dev/null
@@ -0,0 +1,125 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+SHELL := cmd.exe
+RM := rm -rf
+
+USER_OBJS :=
+
+LIBS := 
+PROJ := 
+
+O_SRCS := 
+C_SRCS := 
+S_SRCS := 
+S_UPPER_SRCS := 
+OBJ_SRCS := 
+ASM_SRCS := 
+PREPROCESSING_SRCS := 
+OBJS := 
+OBJS_AS_ARGS := 
+C_DEPS := 
+C_DEPS_AS_ARGS := 
+EXECUTABLES := 
+OUTPUT_FILE_PATH :=
+OUTPUT_FILE_PATH_AS_ARGS :=
+AVR_APP_PATH :=$$$AVR_APP_PATH$$$
+QUOTE := "
+ADDITIONAL_DEPENDENCIES:=
+OUTPUT_FILE_DEP:=
+LIB_DEP:=
+LINKER_SCRIPT_DEP:=
+
+# Every subdirectory with source files must be described here
+SUBDIRS := 
+
+
+# Add inputs and outputs from these tool invocations to the build variables 
+C_SRCS +=  \
+../main.c
+
+
+PREPROCESSING_SRCS += 
+
+
+ASM_SRCS += 
+
+
+OBJS +=  \
+main.o
+
+OBJS_AS_ARGS +=  \
+main.o
+
+C_DEPS +=  \
+main.d
+
+C_DEPS_AS_ARGS +=  \
+main.d
+
+OUTPUT_FILE_PATH +=halloween_puff.elf
+
+OUTPUT_FILE_PATH_AS_ARGS +=halloween_puff.elf
+
+ADDITIONAL_DEPENDENCIES:=
+
+OUTPUT_FILE_DEP:= ./makedep.mk
+
+LIB_DEP+= 
+
+LINKER_SCRIPT_DEP+= 
+
+
+# AVR32/GNU C Compiler
+./main.o: .././main.c
+       @echo Building file: $<
+       @echo Invoking: XC8 C Compiler : 2.36
+       $(QUOTE)C:\Program Files\Microchip\xc8\v2.36\bin\xc8-cc.exe$(QUOTE)  -mcpu=ATmega88P  -mdfp="C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\xc8"  -c -x c -funsigned-char -funsigned-bitfields -mext=cci -D__ATmega88P__ -DDEBUG  -Og -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"   -o "$@" "$<" 
+       @echo Finished building: $<
+       
+
+
+
+
+# AVR32/GNU Preprocessing Assembler
+
+
+
+# AVR32/GNU Assembler
+
+
+
+
+ifneq ($(MAKECMDGOALS),clean)
+ifneq ($(strip $(C_DEPS)),)
+-include $(C_DEPS)
+endif
+endif
+
+# Add inputs and outputs from these tool invocations to the build variables 
+
+# All Target
+all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES)
+
+$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP) $(LINKER_SCRIPT_DEP)
+       @echo Building target: $@
+       @echo Invoking:  XC8 C Linker : 2.36
+       $(QUOTE)C:\Program Files\Microchip\xc8\v2.36\bin\xc8-cc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -mcpu=ATmega88P  -mdfp="C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\xc8"  -Wl,-Map="halloween_puff.map" -funsigned-char -funsigned-bitfields -Wl,--start-group -Wl,-lm  -Wl,--end-group -Wl,--gc-sections -Og -ffunction-sections -fdata-sections -fpack-struct -fshort-enums --memorysummary,memoryfile.xml  
+       @echo Finished building target: $@
+       "C:\Program Files\Microchip\xc8\v2.36\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures  "halloween_puff.elf" "halloween_puff.hex"
+       "C:\Program Files\Microchip\xc8\v2.36\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "halloween_puff.elf" "halloween_puff.eep" || exit 0
+       "C:\Program Files\Microchip\xc8\v2.36\bin\avr-objdump.exe" -h -S "halloween_puff.elf" > "halloween_puff.lss"
+       
+       
+
+
+
+
+
+# Other Targets
+clean:
+       -$(RM) $(OBJS_AS_ARGS) $(EXECUTABLES)  
+       -$(RM) $(C_DEPS_AS_ARGS)   
+       rm -rf "halloween_puff.elf" "halloween_puff.hex" "halloween_puff.eep" "halloween_puff.map" "halloween_puff.usersignatures" "halloween_puff.a"  "halloween_puff.lss"
+       
\ No newline at end of file
diff --git a/halloween_puff/Debug/halloween_puff.eep b/halloween_puff/Debug/halloween_puff.eep
new file mode 100644 (file)
index 0000000..7c166a1
--- /dev/null
@@ -0,0 +1 @@
+:00000001FF
diff --git a/halloween_puff/Debug/halloween_puff.elf b/halloween_puff/Debug/halloween_puff.elf
new file mode 100644 (file)
index 0000000..14fb8ec
Binary files /dev/null and b/halloween_puff/Debug/halloween_puff.elf differ
diff --git a/halloween_puff/Debug/halloween_puff.hex b/halloween_puff/Debug/halloween_puff.hex
new file mode 100644 (file)
index 0000000..208b0d0
--- /dev/null
@@ -0,0 +1,185 @@
+:100000001CC02DC52CC52BC52AC529C528C527C58B
+:1000100026C525C524C523C522C521C51BC41FC5AA
+:100020001EC51DC51CC51BC51AC51DC318C517C5D2
+:1000300016C515C501000305800011241FBECFEFB2
+:10004000D4E0DEBFCDBFE4E3F0E040E017C0B591FF
+:10005000A59135912591059107FD0CC0959185914C
+:10006000EF01F92FE82F05900D92A217B307D9F7EA
+:10007000FE0104C01D92A217B307E1F7E933F407AC
+:0A00800031F79DD2C9C4F894FFCFF8
+:10008A0042760575B6735572E3705F6FCA6D246C5C
+:10009A006E6AA768D066E964F262EC60D75EB45C07
+:1000AA00825A4358F6559B533451C04E404CB4497A
+:1000BA001D477B44CE41173F573C8D39BA36DF3353
+:1000CA00FC30112E1F2B2728282524221A1F0C1C2E
+:1000DA00F918E215C812AB0F8C0C6B0948062403F9
+:1000EA000000DCFCB8F995F674F355F038ED1EEA19
+:1000FA0007E7F4E3E6E0DCDDD8DAD9D7E1D4EFD1DB
+:02010A0004CF20
+:10010C0046696E64696E6720746F6E6573004B652B
+:10011C00793A2000202020202020202020202000A0
+:09012C0046313A002046323A0047
+:0C0135003132333435363738392A302364
+:100142002F923F924F925F926F927F928F929F92E5
+:10015200AF92BF92CF92DF92EF92FF920F931F93D3
+:10016200CF93DF93CDB7DEB7CF50D1400FB6F8941F
+:10017200DEBF0FBECDBF5C01C45FDE4F79836883F3
+:10018200CC50D140C25FDE4F59834883CE50D1401C
+:1001920080E090E040E050E0BA010CC0FC01EE0FBC
+:1001A200FF1FEA0DFB1D20813181420F531F611D8C
+:1001B200711D01968F3F910589F380F3452F562FCC
+:1001C200672F7727CA5FDE4F59834883C650D140D5
+:1001D200CB5FDE4F1882C550D140DAC0F801EE0F76
+:1001E200FF1FEA0DFB1D80819181A0E0B0E0CA5F94
+:1001F200DE4F28813981C650D140A901330F660BE9
+:10020200770B841B950BA60BB70BAC01BD0122F437
+:10021200495F5F4F6F4F7F4F6A017B01689412F80D
+:10022200F594E794D794C7941694D1F7CB5FDE4F39
+:100232003881C550D140832F90E0880F991F092E35
+:10024200000CAA0B86579F4FAF4FFC015A2FDBD3EE
+:10025200DB01222D332D482D592DF0D3DC01CB01AA
+:10026200072E7EE0B595A795979587957A95D1F754
+:10027200702D8C0D9D1DAE1DBF1D84199509A609FB
+:10028200B7090F5F1F4F422C532C682C792C282E54
+:10029200392E8A2E9B2E09C000E010E0412C512CF1
+:1002A2003201212C312C812C912C0F3F110509F0A8
+:1002B20008F494CFCB5FDE4F4881C550D140042F64
+:1002C20010E0C801880F991F092E000CAA0B86574F
+:1002D2009F4FAF4FFC015A2F96D3DB01222D332DB6
+:1002E200482D592DABD39B01AC01012E1EE0559533
+:1002F2004795379527951A95D1F7102DC85FDE4F90
+:10030200288339834A835B83C850D140222D332D01
+:10031200482D592D622D732D882D992D05D36B01F2
+:100322007C01A3019201C301B201FED2C60ED71E07
+:10033200E81EF91EC85FDE4F688179818A819B8140
+:10034200C850D140F1D2A7019601261B370B480BAA
+:10035200590BDA01C9011AF480E090E0DC01000FC8
+:10036200111F000F111FE1E0F0E0EC0FFD1FE00F85
+:10037200F11F80839183A283B383CB5FDE4F3881E9
+:10038200C550D1403F5FCB5FDE4F3883C550D1406F
+:10039200CB5FDE4F4881C550D140413408F47CCF59
+:1003A20081E030E0932F27C0E82FF0E0EE0FFF1F2F
+:1003B200EE0FFF1F21E030E02C0F3D1FE20FF31F75
+:1003C2000081118122813381E92FF0E0EE0FFF1FBE
+:1003D200EE0FFF1F41E050E04C0F5D1FE40FF51FD1
+:1003E200408151816281738140175107620773070F
+:1003F20008F4982F8F5F8134B8F2392F20E04FEF45
+:1004020038C0822F90E0FC013196632F70E0E6172E
+:10041200F7072CF06F5F7F4F681779074CF54F3F56
+:1004220021F1880F991F880F991FE1E0F0E0EC0F8E
+:10043200FD1FE80FF91FC080D180E280F380E42F16
+:10044200F0E0EE0FFF1FEE0FFF1F81E090E08C0F38
+:100452009D1FE80FF91F80819181A281B3818C15C4
+:100462009D05AE05BF0518F003C0422F01C0422F03
+:100472002F5F213430F2A32FB0E0509620E43FE109
+:10048200D7D2DC01CB0180589F4FAF4FBF4F892F8E
+:100492009A2FAB2FBB27C45FDE4FE881F981CC5086
+:1004A200D1409183808350E0DA015096C1D2DC01C1
+:1004B200CB0180589F4FAF4FBF4F892F9A2FAB2F41
+:1004C200BB27C25FDE4FE881F981CE50D1409183D4
+:1004D2008083C15FDE4F0FB6F894DEBF0FBECDBF83
+:1004E200DF91CF911F910F91FF90EF90DF90CF900E
+:1004F200BF90AF909F908F907F906F905F904F9042
+:060502003F902F900895C8
+:100508000F931F93CF93DF9300D000D00F92CDB7F6
+:10051800DEB7AC01062FE0E011E01E0F9A01ADEC4A
+:10052800BCEC2AD29695879596958795969587954A
+:100538009C01220F331F880F991F880F991F880F5E
+:10054800991F820F931F9A01281B390BC90121E0BB
+:1005580030E02C0F3D1F2E0F311DF901805D808387
+:100568009A010AD2AC0156954795569547955695E6
+:1005780047954115510539F0E12F153068F203C050
+:1005880080E267D201501017D8F309C01150E1E09A
+:10059800F0E0EC0FFD1FE10FF11D80815AD211111F
+:1005A800F5CF0F900F900F900F900F90DF91CF9194
+:0605B8001F910F91089550
+:1005BE00CF93DF9300D000D0CDB7DEB705D2CED02B
+:1005CE0005D1789460E080E027D26CE071E080E0A5
+:1005DE006ED1809104038823E1F3AE014D5F5F4F2E
+:1005EE00BE016F5F7F4F80E091E0A4DD6B817C8167
+:1005FE0089819A817BD0182F882369F060E080E092
+:10060E000BD26AE171E080E052D1812F1FD260E2FD
+:10061E0071E080E04CD160E081E0FED16CE271E0EF
+:10062E0080E045D164E089819A8167DF60E371E003
+:10063E0080E03DD164E08B819C815FDFF894109265
+:10064E0003031092020310920403EEE6F0E08081A1
+:08065E00826080837894BDCF17
+:100666001F920F920FB60F9211242F933F938F93E1
+:100676009F93EF93FF93809100039091010301965E
+:10068600909301038093000380910403811127C096
+:1006960080910203909103032091780030917900B4
+:1006A600FC01EE0FFF1FE050FF4F318320830196C0
+:1006B6008F3F910581F078F080E091E090930303FD
+:1006C6008093020381E080930403EEE6F0E08081EC
+:1006D6008D7F808304C09093030380930203FF9170
+:1006E600EF919F918F913F912F910F900FBE0F9099
+:0406F6001F901895A4
+:1006FA00EF92FF920F931F93CF938C017B01C2D08D
+:10070A00C82FC70184D0CC2314F088232CF4C70146
+:10071A00B9D0C82FC8017BD0CC23CCF08823CCF029
+:10072A00082E000C990B9C01220F331F820F931F76
+:10073A008C0F911DC7FD9A95092E000CAA0B8B5C94
+:10074A009E4FAF4FFC018491A7FD808103C080E0DA
+:10075A0001C080E0CF911F910F91FF90EF90089513
+:10076A002FEF80E792E0215080409040E1F700C0EF
+:10077A00000060E080E30BD18FE19EE40197F1F77E
+:10078A0000C0000060E080E302D187E592E00197B3
+:10079A00F1F700C0000060E080E3F9D087E592E05D
+:1007AA000197F1F700C0000060E080E2F0D087E531
+:1007BA0092E00197F1F700C0000088E2A2D088E039
+:1007CA00A0D081E09ED086E09CD08CE09AD008959B
+:1007DA0087B18E7F87B988B18E7F88B9EEE7F0E05E
+:1007EA0080818160808380E480937C008FE880939D
+:1007FA007A0082E084BD15BC16BC99EF97BD85BB13
+:0E080A00EEE6F0E090819260908385BD089547
+:100818009C012C5932402932310580F02D5531097F
+:100828002932310568F02F5331092932310550F04A
+:1008380086599340899740F483E0089580E00895AD
+:0C08480081E0089582E008958FEF08958C
+:100854001F920F920FB60F9211248F93EF93FF9371
+:1008640080917A0086FD09C080910403811105C03E
+:10087400EAE7F0E0808180648083FF91EF918F91BB
+:0A0884000F900FBE0F901F90189503
+:10088E009C012F5A34402932310558F02D57310929
+:10089E002932310540F0895A9540899730F482E02B
+:0E08AE00089580E0089581E008958FEF089589
+:1008BC00CF92DF92EF926B01E82E05C09FEFC91A21
+:1008CC00D90AE90AC4D0F6018491E7FC8081811130
+:0A08DC00F5CFEF90DF90CF90089564
+:1008E600CF93C82F8460AED085E08A95F1F70000DB
+:1008F6008C2F8B7FA7D087EC90E00197F1F700C093
+:060906000000CF910895EE
+:10090C00CF93C82F60E028D0C150C23030F48FE3B1
+:0E091C009FE10197F1F700C00000CF91089510
+:10092A00DB018F939F9348D0BF91AF91A29F800D17
+:0E093A00911DA39F900DB29F900D1124089562
+:10094800CF93DF93D82FC62F4BD08D2F880F2BD066
+:0C0958008C2F29D04DD0DF91CF91089555
+:10096400CF93DF93C82FD62F807F14D06D2F8C2F79
+:0C0974008295807F0FD0DF91CF91089515
+:10098000A29FB001B39FC001A39F01D0B29F700D81
+:08099000811D1124911D089541
+:10099800CF93807F682BC62FC8608C2F52D08C2FA6
+:0609A8009EDFCF910895CF
+:1009AE008093BB0084E88093BC008091BC008823B8
+:0409BE00E4F70895BD
+:1009C200DEDFA59F900DB49F900DA49F800D911D19
+:0409D200112408954F
+:1009D6001092B90088E48093B80084E08093BC004C
+:0209E600089572
+:1009E80084EA8093BC008091BC008823E4F70895D2
+:1009F80084E98093BC008091BC0084FDFCCF0895FD
+:100A080057FD03C06591759108956191719108959D
+:0E0A1800EC0123D021D0CE0121D0CE0120D080
+:0C0A2600811180E4860F80686EDF089567
+:0C0A3200A6DFB7FF0895821B930B089508
+:0C0A3E00B7FFC0CFBFDF821B930B0895F1
+:0A0A4A00682F686087E27BDF0895E3
+:060A540061E086DF089559
+:040A5A00FCDF089520
+:020A5E00D0CAFC
+:020A60000895F7
+:020A62000895F5
+:020A64000895F3
+:020A66000FDBA4
+:00000001FF
diff --git a/halloween_puff/Debug/halloween_puff.lss b/halloween_puff/Debug/halloween_puff.lss
new file mode 100644 (file)
index 0000000..bd013f5
--- /dev/null
@@ -0,0 +1,2033 @@
+
+halloween_puff.elf:     file format elf32-avr
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .data         00000000  00800100  00800100  00000b1c  2**0
+                  ALLOC, LOAD, DATA
+  1 .text         0000008a  00000000  00000000  000000b4  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  2 .comment      0000002f  00000000  00000000  00000b1c  2**0
+                  CONTENTS, READONLY
+  3 .stack.descriptors.hdr 00000062  00000000  00000000  00000b4b  2**0
+                  CONTENTS, READONLY
+  4 .debug_aranges 000000d8  00000000  00000000  00000bad  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  5 .debug_info   00001650  00000000  00000000  00000c85  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  6 .debug_abbrev 0000087b  00000000  00000000  000022d5  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  7 .debug_line   000008a4  00000000  00000000  00002b50  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  8 .debug_frame  000002c4  00000000  00000000  000033f4  2**2
+                  CONTENTS, READONLY, DEBUGGING
+  9 .debug_str    00000233  00000000  00000000  000036b8  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 10 .debug_loc    00000df0  00000000  00000000  000038eb  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 11 .debug_ranges 00000128  00000000  00000000  000046db  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 12 .text         00000002  00000a5e  00000a5e  00000b12  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 13 .note.gnu.avr.deviceinfo 0000003c  00000000  00000000  00004804  2**2
+                  CONTENTS, READONLY, DEBUGGING
+ 14 .text.i2c_init 00000012  000009d6  000009d6  00000a8a  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 15 .text.i2c_start 00000010  000009e8  000009e8  00000a9c  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 16 .text.i2c_write 00000014  000009ae  000009ae  00000a62  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 17 .text.i2c_stop 00000010  000009f8  000009f8  00000aac  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 18 .text.i2c_write_byte 0000001c  00000948  00000948  000009fc  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 19 .text.lcd_expander_write 0000000a  00000a4a  00000a4a  00000afe  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 20 .text.adc_sampling_init 0000003e  000007da  000007da  0000088e  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 21 .text.analyze_block 000003c6  00000142  00000142  000001f6  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 22 .text.get_column 0000002e  0000088e  0000088e  00000942  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 23 .text.get_row 0000003c  00000818  00000818  000008cc  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 24 .text.decode_key 00000070  000006fa  000006fa  000007ae  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 25 .text.lcd_pulse_enable 00000026  000008e6  000008e6  0000099a  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 26 .text.lcd_write4 00000016  00000998  00000998  00000a4c  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 27 .text.lcd_send 0000001c  00000964  00000964  00000a18  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 28 .text.lcd_data 00000006  00000a54  00000a54  00000b08  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 29 .text.lcd_putc 00000004  00000a5a  00000a5a  00000b0e  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 30 .text.lcd_print 0000002a  000008bc  000008bc  00000970  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 31 .text.lcd_print_uint 000000b6  00000508  00000508  000005bc  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 32 .text.lcd_command 0000001e  0000090c  0000090c  000009c0  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 33 .text.lcd_goto 0000000c  00000a26  00000a26  00000ada  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 34 .text.lcd_init 00000070  0000076a  0000076a  0000081e  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 35 .text.__vector_14 0000003a  00000854  00000854  00000908  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 36 .text.__vector_21 00000094  00000666  00000666  0000071a  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 37 .progmemx.data 00000029  0000010c  0000010c  000001c0  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, PROGMEMX
+ 38 .text.main    000000a8  000005be  000005be  00000672  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 39 .progmemx.data.keypad.2090 0000000c  00000135  00000135  000001e9  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, PROGMEMX
+ 40 .bss.adc_count 00000002  00800300  00800300  00000b1c  2**0
+                  ALLOC
+ 41 .progmemx.data.coeff 00000082  0000008a  0000008a  0000013e  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, PROGMEMX
+ 42 .bss.block_ready 00000001  00800304  00800304  00000b1c  2**0
+                  ALLOC
+ 43 .bss.sample_index 00000002  00800302  00800302  00000b1c  2**0
+                  ALLOC
+ 44 .bss.samples  00000200  00800100  00800100  00000b1c  2**0
+                  ALLOC
+ 45 .text.libgcc.mul 0000001e  0000092a  0000092a  000009de  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 46 .text.libgcc.mul 00000018  00000980  00000980  00000a34  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 47 .text.libgcc.mul 0000000c  00000a32  00000a32  00000ae6  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 48 .text.libgcc.mul 00000014  000009c2  000009c2  00000a76  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 49 .text.libgcc.mul 0000000c  00000a3e  00000a3e  00000af2  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 50 .text.libgcc  00000010  00000a08  00000a08  00000abc  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 51 .text.__dummy_fini 00000002  00000a60  00000a60  00000b14  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 52 .text.__dummy_funcs_on_exit 00000002  00000a62  00000a62  00000b16  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 53 .text.__dummy_simulator_exit 00000002  00000a64  00000a64  00000b18  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 54 .text.exit    0000000e  00000a18  00000a18  00000acc  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 55 .text._Exit   00000002  00000a66  00000a66  00000b1a  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+
+Disassembly of section .text:
+
+00000000 <__vectors>:
+   0:  1c c0           rjmp    .+56            ; 0x3a <__ctors_end>
+   2:  2d c5           rjmp    .+2650          ; 0xa5e <__bad_interrupt>
+   4:  2c c5           rjmp    .+2648          ; 0xa5e <__bad_interrupt>
+   6:  2b c5           rjmp    .+2646          ; 0xa5e <__bad_interrupt>
+   8:  2a c5           rjmp    .+2644          ; 0xa5e <__bad_interrupt>
+   a:  29 c5           rjmp    .+2642          ; 0xa5e <__bad_interrupt>
+   c:  28 c5           rjmp    .+2640          ; 0xa5e <__bad_interrupt>
+   e:  27 c5           rjmp    .+2638          ; 0xa5e <__bad_interrupt>
+  10:  26 c5           rjmp    .+2636          ; 0xa5e <__bad_interrupt>
+  12:  25 c5           rjmp    .+2634          ; 0xa5e <__bad_interrupt>
+  14:  24 c5           rjmp    .+2632          ; 0xa5e <__bad_interrupt>
+  16:  23 c5           rjmp    .+2630          ; 0xa5e <__bad_interrupt>
+  18:  22 c5           rjmp    .+2628          ; 0xa5e <__bad_interrupt>
+  1a:  21 c5           rjmp    .+2626          ; 0xa5e <__bad_interrupt>
+  1c:  1b c4           rjmp    .+2102          ; 0x854 <__vector_14>
+  1e:  1f c5           rjmp    .+2622          ; 0xa5e <__bad_interrupt>
+  20:  1e c5           rjmp    .+2620          ; 0xa5e <__bad_interrupt>
+  22:  1d c5           rjmp    .+2618          ; 0xa5e <__bad_interrupt>
+  24:  1c c5           rjmp    .+2616          ; 0xa5e <__bad_interrupt>
+  26:  1b c5           rjmp    .+2614          ; 0xa5e <__bad_interrupt>
+  28:  1a c5           rjmp    .+2612          ; 0xa5e <__bad_interrupt>
+  2a:  1d c3           rjmp    .+1594          ; 0x666 <__vector_21>
+  2c:  18 c5           rjmp    .+2608          ; 0xa5e <__bad_interrupt>
+  2e:  17 c5           rjmp    .+2606          ; 0xa5e <__bad_interrupt>
+  30:  16 c5           rjmp    .+2604          ; 0xa5e <__bad_interrupt>
+  32:  15 c5           rjmp    .+2602          ; 0xa5e <__bad_interrupt>
+
+00000034 <.dinit>:
+  34:  01 00           .word   0x0001  ; ????
+  36:  03 05           cpc     r16, r3
+  38:  80 00           .word   0x0080  ; ????
+
+0000003a <__ctors_end>:
+  3a:  11 24           eor     r1, r1
+  3c:  1f be           out     0x3f, r1        ; 63
+  3e:  cf ef           ldi     r28, 0xFF       ; 255
+  40:  d4 e0           ldi     r29, 0x04       ; 4
+  42:  de bf           out     0x3e, r29       ; 62
+  44:  cd bf           out     0x3d, r28       ; 61
+
+00000046 <__do_copy_data>:
+  46:  e4 e3           ldi     r30, 0x34       ; 52
+  48:  f0 e0           ldi     r31, 0x00       ; 0
+  4a:  40 e0           ldi     r20, 0x00       ; 0
+  4c:  17 c0           rjmp    .+46            ; 0x7c <__do_clear_bss+0x8>
+  4e:  b5 91           lpm     r27, Z+
+  50:  a5 91           lpm     r26, Z+
+  52:  35 91           lpm     r19, Z+
+  54:  25 91           lpm     r18, Z+
+  56:  05 91           lpm     r16, Z+
+  58:  07 fd           sbrc    r16, 7
+  5a:  0c c0           rjmp    .+24            ; 0x74 <__do_clear_bss>
+  5c:  95 91           lpm     r25, Z+
+  5e:  85 91           lpm     r24, Z+
+  60:  ef 01           movw    r28, r30
+  62:  f9 2f           mov     r31, r25
+  64:  e8 2f           mov     r30, r24
+  66:  05 90           lpm     r0, Z+
+  68:  0d 92           st      X+, r0
+  6a:  a2 17           cp      r26, r18
+  6c:  b3 07           cpc     r27, r19
+  6e:  d9 f7           brne    .-10            ; 0x66 <__do_copy_data+0x20>
+  70:  fe 01           movw    r30, r28
+  72:  04 c0           rjmp    .+8             ; 0x7c <__do_clear_bss+0x8>
+
+00000074 <__do_clear_bss>:
+  74:  1d 92           st      X+, r1
+  76:  a2 17           cp      r26, r18
+  78:  b3 07           cpc     r27, r19
+  7a:  e1 f7           brne    .-8             ; 0x74 <__do_clear_bss>
+  7c:  e9 33           cpi     r30, 0x39       ; 57
+  7e:  f4 07           cpc     r31, r20
+  80:  31 f7           brne    .-52            ; 0x4e <__do_copy_data+0x8>
+  82:  9d d2           rcall   .+1338          ; 0x5be <main>
+  84:  c9 c4           rjmp    .+2450          ; 0xa18 <exit>
+
+00000086 <_exit>:
+  86:  f8 94           cli
+
+00000088 <__stop_program>:
+  88:  ff cf           rjmp    .-2             ; 0x88 <__stop_program>
+
+Disassembly of section .text:
+
+00000a5e <__bad_interrupt>:
+ a5e:  d0 ca           rjmp    .-2656          ; 0x0 <__TEXT_REGION_ORIGIN__>
+
+Disassembly of section .text.i2c_init:
+
+000009d6 <i2c_init>:
+// I2C / TWI driver
+// ============================================================
+
+static void i2c_init(void)
+{
+       TWSR = 0;
+ 9d6:  10 92 b9 00     sts     0x00B9, r1      ; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7fe0b9>
+       TWBR = (uint8_t)((F_CPU / I2C_FREQ - 16) / 2);
+ 9da:  88 e4           ldi     r24, 0x48       ; 72
+ 9dc:  80 93 b8 00     sts     0x00B8, r24     ; 0x8000b8 <__TEXT_REGION_LENGTH__+0x7fe0b8>
+       TWCR = (1 << TWEN);
+ 9e0:  84 e0           ldi     r24, 0x04       ; 4
+ 9e2:  80 93 bc 00     sts     0x00BC, r24     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+ 9e6:  08 95           ret
+
+Disassembly of section .text.i2c_start:
+
+000009e8 <i2c_start>:
+}
+
+static void i2c_start(void)
+{
+       TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
+ 9e8:  84 ea           ldi     r24, 0xA4       ; 164
+ 9ea:  80 93 bc 00     sts     0x00BC, r24     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+
+       while (!(TWCR & (1 << TWINT)))
+ 9ee:  80 91 bc 00     lds     r24, 0x00BC     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+ 9f2:  88 23           and     r24, r24
+ 9f4:  e4 f7           brge    .-8             ; 0x9ee <i2c_start+0x6>
+       ;
+}
+ 9f6:  08 95           ret
+
+Disassembly of section .text.i2c_write:
+
+000009ae <i2c_write>:
+
+static void i2c_write(uint8_t data)
+{
+       TWDR = data;
+ 9ae:  80 93 bb 00     sts     0x00BB, r24     ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7fe0bb>
+       TWCR = (1 << TWINT) | (1 << TWEN);
+ 9b2:  84 e8           ldi     r24, 0x84       ; 132
+ 9b4:  80 93 bc 00     sts     0x00BC, r24     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+
+       while (!(TWCR & (1 << TWINT)))
+ 9b8:  80 91 bc 00     lds     r24, 0x00BC     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+ 9bc:  88 23           and     r24, r24
+ 9be:  e4 f7           brge    .-8             ; 0x9b8 <i2c_write+0xa>
+       ;
+}
+ 9c0:  08 95           ret
+
+Disassembly of section .text.i2c_stop:
+
+000009f8 <i2c_stop>:
+
+static void i2c_stop(void)
+{
+       TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
+ 9f8:  84 e9           ldi     r24, 0x94       ; 148
+ 9fa:  80 93 bc 00     sts     0x00BC, r24     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+
+       while (TWCR & (1 << TWSTO))
+ 9fe:  80 91 bc 00     lds     r24, 0x00BC     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+ a02:  84 fd           sbrc    r24, 4
+ a04:  fc cf           rjmp    .-8             ; 0x9fe <i2c_stop+0x6>
+       ;
+}
+ a06:  08 95           ret
+
+Disassembly of section .text.i2c_write_byte:
+
+00000948 <i2c_write_byte>:
+
+static void i2c_write_byte(uint8_t address, uint8_t data)
+{
+ 948:  cf 93           push    r28
+ 94a:  df 93           push    r29
+ 94c:  d8 2f           mov     r29, r24
+ 94e:  c6 2f           mov     r28, r22
+       i2c_start();
+ 950:  4b d0           rcall   .+150           ; 0x9e8 <i2c_start>
+       i2c_write((address << 1) | 0);
+ 952:  8d 2f           mov     r24, r29
+ 954:  88 0f           add     r24, r24
+ 956:  2b d0           rcall   .+86            ; 0x9ae <i2c_write>
+       i2c_write(data);
+ 958:  8c 2f           mov     r24, r28
+ 95a:  29 d0           rcall   .+82            ; 0x9ae <i2c_write>
+       i2c_stop();
+ 95c:  4d d0           rcall   .+154           ; 0x9f8 <i2c_stop>
+}
+ 95e:  df 91           pop     r29
+ 960:  cf 91           pop     r28
+ 962:  08 95           ret
+
+Disassembly of section .text.lcd_expander_write:
+
+00000a4a <lcd_expander_write>:
+// LCD driver: HD44780 + PCF8574 I2C backpack
+// ============================================================
+
+static void lcd_expander_write(uint8_t data)
+{
+       i2c_write_byte(LCD_ADDR, data | LCD_BACKLIGHT);
+ a4a:  68 2f           mov     r22, r24
+ a4c:  68 60           ori     r22, 0x08       ; 8
+ a4e:  87 e2           ldi     r24, 0x27       ; 39
+ a50:  7b df           rcall   .-266           ; 0x948 <i2c_write_byte>
+ a52:  08 95           ret
+
+Disassembly of section .text.adc_sampling_init:
+
+000007da <adc_sampling_init>:
+// ============================================================
+
+static void adc_sampling_init(void)
+{
+    // ADC0 / PC0 input
+    DDRC &= ~(1 << DDC0);
+ 7da:  87 b1           in      r24, 0x07       ; 7
+ 7dc:  8e 7f           andi    r24, 0xFE       ; 254
+ 7de:  87 b9           out     0x07, r24       ; 7
+    PORTC &= ~(1 << PORTC0);
+ 7e0:  88 b1           in      r24, 0x08       ; 8
+ 7e2:  8e 7f           andi    r24, 0xFE       ; 254
+ 7e4:  88 b9           out     0x08, r24       ; 8
+    DIDR0 |= (1 << ADC0D);
+ 7e6:  ee e7           ldi     r30, 0x7E       ; 126
+ 7e8:  f0 e0           ldi     r31, 0x00       ; 0
+ 7ea:  80 81           ld      r24, Z
+ 7ec:  81 60           ori     r24, 0x01       ; 1
+ 7ee:  80 83           st      Z, r24
+
+    // AVcc reference, ADC0
+    ADMUX = (1 << REFS0);
+ 7f0:  80 e4           ldi     r24, 0x40       ; 64
+ 7f2:  80 93 7c 00     sts     0x007C, r24     ; 0x80007c <__TEXT_REGION_LENGTH__+0x7fe07c>
+
+    // ADC enabled, interrupt enabled, prescaler 128
+    // No auto-trigger: software starts each conversion
+    ADCSRA = (1 << ADEN) |
+ 7f6:  8f e8           ldi     r24, 0x8F       ; 143
+ 7f8:  80 93 7a 00     sts     0x007A, r24     ; 0x80007a <__TEXT_REGION_LENGTH__+0x7fe07a>
+             (1 << ADPS2) |
+             (1 << ADPS1) |
+             (1 << ADPS0);
+
+    // Timer0 CTC: 16 MHz / 8 / (249 + 1) = 8 kHz
+    TCCR0A = (1 << WGM01);
+ 7fc:  82 e0           ldi     r24, 0x02       ; 2
+ 7fe:  84 bd           out     0x24, r24       ; 36
+    TCCR0B = 0;
+ 800:  15 bc           out     0x25, r1        ; 37
+    TCNT0 = 0;
+ 802:  16 bc           out     0x26, r1        ; 38
+    OCR0A = 249;
+ 804:  99 ef           ldi     r25, 0xF9       ; 249
+ 806:  97 bd           out     0x27, r25       ; 39
+
+    // Clear pending Timer0 compare flag
+    TIFR0 = (1 << OCF0A);
+ 808:  85 bb           out     0x15, r24       ; 21
+
+    // Enable Timer0 compare interrupt
+    TIMSK0 |= (1 << OCIE0A);
+ 80a:  ee e6           ldi     r30, 0x6E       ; 110
+ 80c:  f0 e0           ldi     r31, 0x00       ; 0
+ 80e:  90 81           ld      r25, Z
+ 810:  92 60           ori     r25, 0x02       ; 2
+ 812:  90 83           st      Z, r25
+
+    // Start Timer0 with prescaler 8
+    TCCR0B = (1 << CS01);
+ 814:  85 bd           out     0x25, r24       ; 37
+ 816:  08 95           ret
+
+Disassembly of section .text.analyze_block:
+
+00000142 <analyze_block>:
+
+static void analyze_block(
+volatile uint16_t *data,
+uint16_t *freq1,
+uint16_t *freq2)
+{
+ 142:  2f 92           push    r2
+ 144:  3f 92           push    r3
+ 146:  4f 92           push    r4
+ 148:  5f 92           push    r5
+ 14a:  6f 92           push    r6
+ 14c:  7f 92           push    r7
+ 14e:  8f 92           push    r8
+ 150:  9f 92           push    r9
+ 152:  af 92           push    r10
+ 154:  bf 92           push    r11
+ 156:  cf 92           push    r12
+ 158:  df 92           push    r13
+ 15a:  ef 92           push    r14
+ 15c:  ff 92           push    r15
+ 15e:  0f 93           push    r16
+ 160:  1f 93           push    r17
+ 162:  cf 93           push    r28
+ 164:  df 93           push    r29
+ 166:  cd b7           in      r28, 0x3d       ; 61
+ 168:  de b7           in      r29, 0x3e       ; 62
+ 16a:  cf 50           subi    r28, 0x0F       ; 15
+ 16c:  d1 40           sbci    r29, 0x01       ; 1
+ 16e:  0f b6           in      r0, 0x3f        ; 63
+ 170:  f8 94           cli
+ 172:  de bf           out     0x3e, r29       ; 62
+ 174:  0f be           out     0x3f, r0        ; 63
+ 176:  cd bf           out     0x3d, r28       ; 61
+ 178:  5c 01           movw    r10, r24
+ 17a:  c4 5f           subi    r28, 0xF4       ; 244
+ 17c:  de 4f           sbci    r29, 0xFE       ; 254
+ 17e:  79 83           std     Y+1, r23        ; 0x01
+ 180:  68 83           st      Y, r22
+ 182:  cc 50           subi    r28, 0x0C       ; 12
+ 184:  d1 40           sbci    r29, 0x01       ; 1
+ 186:  c2 5f           subi    r28, 0xF2       ; 242
+ 188:  de 4f           sbci    r29, 0xFE       ; 254
+ 18a:  59 83           std     Y+1, r21        ; 0x01
+ 18c:  48 83           st      Y, r20
+ 18e:  ce 50           subi    r28, 0x0E       ; 14
+ 190:  d1 40           sbci    r29, 0x01       ; 1
+       uint32_t sum = 0;
+
+       for (uint16_t i = 0; i < N_SAMPLES; i++)
+ 192:  80 e0           ldi     r24, 0x00       ; 0
+ 194:  90 e0           ldi     r25, 0x00       ; 0
+static void analyze_block(
+volatile uint16_t *data,
+uint16_t *freq1,
+uint16_t *freq2)
+{
+       uint32_t sum = 0;
+ 196:  40 e0           ldi     r20, 0x00       ; 0
+ 198:  50 e0           ldi     r21, 0x00       ; 0
+ 19a:  ba 01           movw    r22, r20
+
+       for (uint16_t i = 0; i < N_SAMPLES; i++)
+ 19c:  0c c0           rjmp    .+24            ; 0x1b6 <analyze_block+0x74>
+       sum += data[i];
+ 19e:  fc 01           movw    r30, r24
+ 1a0:  ee 0f           add     r30, r30
+ 1a2:  ff 1f           adc     r31, r31
+ 1a4:  ea 0d           add     r30, r10
+ 1a6:  fb 1d           adc     r31, r11
+ 1a8:  20 81           ld      r18, Z
+ 1aa:  31 81           ldd     r19, Z+1        ; 0x01
+ 1ac:  42 0f           add     r20, r18
+ 1ae:  53 1f           adc     r21, r19
+ 1b0:  61 1d           adc     r22, r1
+ 1b2:  71 1d           adc     r23, r1
+uint16_t *freq1,
+uint16_t *freq2)
+{
+       uint32_t sum = 0;
+
+       for (uint16_t i = 0; i < N_SAMPLES; i++)
+ 1b4:  01 96           adiw    r24, 0x01       ; 1
+ 1b6:  8f 3f           cpi     r24, 0xFF       ; 255
+ 1b8:  91 05           cpc     r25, r1
+ 1ba:  89 f3           breq    .-30            ; 0x19e <analyze_block+0x5c>
+ 1bc:  80 f3           brcs    .-32            ; 0x19e <analyze_block+0x5c>
+       sum += data[i];
+
+       int16_t mean = (int16_t)(sum / N_SAMPLES);
+ 1be:  45 2f           mov     r20, r21
+ 1c0:  56 2f           mov     r21, r22
+ 1c2:  67 2f           mov     r22, r23
+ 1c4:  77 27           eor     r23, r23
+ 1c6:  ca 5f           subi    r28, 0xFA       ; 250
+ 1c8:  de 4f           sbci    r29, 0xFE       ; 254
+ 1ca:  59 83           std     Y+1, r21        ; 0x01
+ 1cc:  48 83           st      Y, r20
+ 1ce:  c6 50           subi    r28, 0x06       ; 6
+ 1d0:  d1 40           sbci    r29, 0x01       ; 1
+
+       uint32_t power[NUM_BINS];
+
+       for (uint8_t b = 0; b < NUM_BINS; b++) {
+ 1d2:  cb 5f           subi    r28, 0xFB       ; 251
+ 1d4:  de 4f           sbci    r29, 0xFE       ; 254
+ 1d6:  18 82           st      Y, r1
+ 1d8:  c5 50           subi    r28, 0x05       ; 5
+ 1da:  d1 40           sbci    r29, 0x01       ; 1
+ 1dc:  da c0           rjmp    .+436           ; 0x392 <__EEPROM_REGION_LENGTH__+0x192>
+               int32_t q1 = 0;
+               int32_t q2 = 0;
+
+               for (uint16_t i = 0; i < N_SAMPLES; i++) {
+                       int32_t x = ((int32_t)data[i] - mean) / 8;
+ 1de:  f8 01           movw    r30, r16
+ 1e0:  ee 0f           add     r30, r30
+ 1e2:  ff 1f           adc     r31, r31
+ 1e4:  ea 0d           add     r30, r10
+ 1e6:  fb 1d           adc     r31, r11
+ 1e8:  80 81           ld      r24, Z
+ 1ea:  91 81           ldd     r25, Z+1        ; 0x01
+ 1ec:  a0 e0           ldi     r26, 0x00       ; 0
+ 1ee:  b0 e0           ldi     r27, 0x00       ; 0
+ 1f0:  ca 5f           subi    r28, 0xFA       ; 250
+ 1f2:  de 4f           sbci    r29, 0xFE       ; 254
+ 1f4:  28 81           ld      r18, Y
+ 1f6:  39 81           ldd     r19, Y+1        ; 0x01
+ 1f8:  c6 50           subi    r28, 0x06       ; 6
+ 1fa:  d1 40           sbci    r29, 0x01       ; 1
+ 1fc:  a9 01           movw    r20, r18
+ 1fe:  33 0f           add     r19, r19
+ 200:  66 0b           sbc     r22, r22
+ 202:  77 0b           sbc     r23, r23
+ 204:  84 1b           sub     r24, r20
+ 206:  95 0b           sbc     r25, r21
+ 208:  a6 0b           sbc     r26, r22
+ 20a:  b7 0b           sbc     r27, r23
+ 20c:  ac 01           movw    r20, r24
+ 20e:  bd 01           movw    r22, r26
+ 210:  22 f4           brpl    .+8             ; 0x21a <__EEPROM_REGION_LENGTH__+0x1a>
+ 212:  49 5f           subi    r20, 0xF9       ; 249
+ 214:  5f 4f           sbci    r21, 0xFF       ; 255
+ 216:  6f 4f           sbci    r22, 0xFF       ; 255
+ 218:  7f 4f           sbci    r23, 0xFF       ; 255
+ 21a:  6a 01           movw    r12, r20
+ 21c:  7b 01           movw    r14, r22
+ 21e:  68 94           set
+ 220:  12 f8           bld     r1, 2
+ 222:  f5 94           asr     r15
+ 224:  e7 94           ror     r14
+ 226:  d7 94           ror     r13
+ 228:  c7 94           ror     r12
+ 22a:  16 94           lsr     r1
+ 22c:  d1 f7           brne    .-12            ; 0x222 <__EEPROM_REGION_LENGTH__+0x22>
+
+                       int32_t q0 = x
+                       + (((int32_t)coeff[b] * q1) >> 14)
+ 22e:  cb 5f           subi    r28, 0xFB       ; 251
+ 230:  de 4f           sbci    r29, 0xFE       ; 254
+ 232:  38 81           ld      r19, Y
+ 234:  c5 50           subi    r28, 0x05       ; 5
+ 236:  d1 40           sbci    r29, 0x01       ; 1
+ 238:  83 2f           mov     r24, r19
+ 23a:  90 e0           ldi     r25, 0x00       ; 0
+ 23c:  88 0f           add     r24, r24
+ 23e:  99 1f           adc     r25, r25
+ 240:  09 2e           mov     r0, r25
+ 242:  00 0c           add     r0, r0
+ 244:  aa 0b           sbc     r26, r26
+ 246:  86 57           subi    r24, 0x76       ; 118
+ 248:  9f 4f           sbci    r25, 0xFF       ; 255
+ 24a:  af 4f           sbci    r26, 0xFF       ; 255
+ 24c:  fc 01           movw    r30, r24
+ 24e:  5a 2f           mov     r21, r26
+ 250:  db d3           rcall   .+1974          ; 0xa08 <__xload_2>
+ 252:  db 01           movw    r26, r22
+ 254:  22 2d           mov     r18, r2
+ 256:  33 2d           mov     r19, r3
+ 258:  48 2d           mov     r20, r8
+ 25a:  59 2d           mov     r21, r9
+ 25c:  f0 d3           rcall   .+2016          ; 0xa3e <__mulshisi3>
+ 25e:  dc 01           movw    r26, r24
+ 260:  cb 01           movw    r24, r22
+ 262:  07 2e           mov     r0, r23
+ 264:  7e e0           ldi     r23, 0x0E       ; 14
+ 266:  b5 95           asr     r27
+ 268:  a7 95           ror     r26
+ 26a:  97 95           ror     r25
+ 26c:  87 95           ror     r24
+ 26e:  7a 95           dec     r23
+ 270:  d1 f7           brne    .-12            ; 0x266 <__EEPROM_REGION_LENGTH__+0x66>
+ 272:  70 2d           mov     r23, r0
+ 274:  8c 0d           add     r24, r12
+ 276:  9d 1d           adc     r25, r13
+ 278:  ae 1d           adc     r26, r14
+ 27a:  bf 1d           adc     r27, r15
+               int32_t q2 = 0;
+
+               for (uint16_t i = 0; i < N_SAMPLES; i++) {
+                       int32_t x = ((int32_t)data[i] - mean) / 8;
+
+                       int32_t q0 = x
+ 27c:  84 19           sub     r24, r4
+ 27e:  95 09           sbc     r25, r5
+ 280:  a6 09           sbc     r26, r6
+ 282:  b7 09           sbc     r27, r7
+
+       for (uint8_t b = 0; b < NUM_BINS; b++) {
+               int32_t q1 = 0;
+               int32_t q2 = 0;
+
+               for (uint16_t i = 0; i < N_SAMPLES; i++) {
+ 284:  0f 5f           subi    r16, 0xFF       ; 255
+ 286:  1f 4f           sbci    r17, 0xFF       ; 255
+
+                       int32_t q0 = x
+                       + (((int32_t)coeff[b] * q1) >> 14)
+                       - q2;
+
+                       q2 = q1;
+ 288:  42 2c           mov     r4, r2
+ 28a:  53 2c           mov     r5, r3
+ 28c:  68 2c           mov     r6, r8
+ 28e:  79 2c           mov     r7, r9
+                       q1 = q0;
+ 290:  28 2e           mov     r2, r24
+ 292:  39 2e           mov     r3, r25
+ 294:  8a 2e           mov     r8, r26
+ 296:  9b 2e           mov     r9, r27
+ 298:  09 c0           rjmp    .+18            ; 0x2ac <__EEPROM_REGION_LENGTH__+0xac>
+ 29a:  00 e0           ldi     r16, 0x00       ; 0
+ 29c:  10 e0           ldi     r17, 0x00       ; 0
+ 29e:  41 2c           mov     r4, r1
+ 2a0:  51 2c           mov     r5, r1
+ 2a2:  32 01           movw    r6, r4
+ 2a4:  21 2c           mov     r2, r1
+ 2a6:  31 2c           mov     r3, r1
+ 2a8:  81 2c           mov     r8, r1
+ 2aa:  91 2c           mov     r9, r1
+
+       for (uint8_t b = 0; b < NUM_BINS; b++) {
+               int32_t q1 = 0;
+               int32_t q2 = 0;
+
+               for (uint16_t i = 0; i < N_SAMPLES; i++) {
+ 2ac:  0f 3f           cpi     r16, 0xFF       ; 255
+ 2ae:  11 05           cpc     r17, r1
+ 2b0:  09 f0           breq    .+2             ; 0x2b4 <__EEPROM_REGION_LENGTH__+0xb4>
+ 2b2:  08 f4           brcc    .+2             ; 0x2b6 <__EEPROM_REGION_LENGTH__+0xb6>
+ 2b4:  94 cf           rjmp    .-216           ; 0x1de <analyze_block+0x9c>
+
+                       q2 = q1;
+                       q1 = q0;
+               }
+
+               int32_t term = ((int32_t)coeff[b] * q1) >> 14;
+ 2b6:  cb 5f           subi    r28, 0xFB       ; 251
+ 2b8:  de 4f           sbci    r29, 0xFE       ; 254
+ 2ba:  48 81           ld      r20, Y
+ 2bc:  c5 50           subi    r28, 0x05       ; 5
+ 2be:  d1 40           sbci    r29, 0x01       ; 1
+ 2c0:  04 2f           mov     r16, r20
+ 2c2:  10 e0           ldi     r17, 0x00       ; 0
+ 2c4:  c8 01           movw    r24, r16
+ 2c6:  88 0f           add     r24, r24
+ 2c8:  99 1f           adc     r25, r25
+ 2ca:  09 2e           mov     r0, r25
+ 2cc:  00 0c           add     r0, r0
+ 2ce:  aa 0b           sbc     r26, r26
+ 2d0:  86 57           subi    r24, 0x76       ; 118
+ 2d2:  9f 4f           sbci    r25, 0xFF       ; 255
+ 2d4:  af 4f           sbci    r26, 0xFF       ; 255
+ 2d6:  fc 01           movw    r30, r24
+ 2d8:  5a 2f           mov     r21, r26
+ 2da:  96 d3           rcall   .+1836          ; 0xa08 <__xload_2>
+ 2dc:  db 01           movw    r26, r22
+ 2de:  22 2d           mov     r18, r2
+ 2e0:  33 2d           mov     r19, r3
+ 2e2:  48 2d           mov     r20, r8
+ 2e4:  59 2d           mov     r21, r9
+ 2e6:  ab d3           rcall   .+1878          ; 0xa3e <__mulshisi3>
+ 2e8:  9b 01           movw    r18, r22
+ 2ea:  ac 01           movw    r20, r24
+ 2ec:  01 2e           mov     r0, r17
+ 2ee:  1e e0           ldi     r17, 0x0E       ; 14
+ 2f0:  55 95           asr     r21
+ 2f2:  47 95           ror     r20
+ 2f4:  37 95           ror     r19
+ 2f6:  27 95           ror     r18
+ 2f8:  1a 95           dec     r17
+ 2fa:  d1 f7           brne    .-12            ; 0x2f0 <__EEPROM_REGION_LENGTH__+0xf0>
+ 2fc:  10 2d           mov     r17, r0
+ 2fe:  c8 5f           subi    r28, 0xF8       ; 248
+ 300:  de 4f           sbci    r29, 0xFE       ; 254
+ 302:  28 83           st      Y, r18
+ 304:  39 83           std     Y+1, r19        ; 0x01
+ 306:  4a 83           std     Y+2, r20        ; 0x02
+ 308:  5b 83           std     Y+3, r21        ; 0x03
+ 30a:  c8 50           subi    r28, 0x08       ; 8
+ 30c:  d1 40           sbci    r29, 0x01       ; 1
+               int32_t p = q1 * q1 + q2 * q2 - term * q2;
+ 30e:  22 2d           mov     r18, r2
+ 310:  33 2d           mov     r19, r3
+ 312:  48 2d           mov     r20, r8
+ 314:  59 2d           mov     r21, r9
+ 316:  62 2d           mov     r22, r2
+ 318:  73 2d           mov     r23, r3
+ 31a:  88 2d           mov     r24, r8
+ 31c:  99 2d           mov     r25, r9
+ 31e:  05 d3           rcall   .+1546          ; 0x92a <__mulsi3>
+ 320:  6b 01           movw    r12, r22
+ 322:  7c 01           movw    r14, r24
+ 324:  a3 01           movw    r20, r6
+ 326:  92 01           movw    r18, r4
+ 328:  c3 01           movw    r24, r6
+ 32a:  b2 01           movw    r22, r4
+ 32c:  fe d2           rcall   .+1532          ; 0x92a <__mulsi3>
+ 32e:  c6 0e           add     r12, r22
+ 330:  d7 1e           adc     r13, r23
+ 332:  e8 1e           adc     r14, r24
+ 334:  f9 1e           adc     r15, r25
+ 336:  c8 5f           subi    r28, 0xF8       ; 248
+ 338:  de 4f           sbci    r29, 0xFE       ; 254
+ 33a:  68 81           ld      r22, Y
+ 33c:  79 81           ldd     r23, Y+1        ; 0x01
+ 33e:  8a 81           ldd     r24, Y+2        ; 0x02
+ 340:  9b 81           ldd     r25, Y+3        ; 0x03
+ 342:  c8 50           subi    r28, 0x08       ; 8
+ 344:  d1 40           sbci    r29, 0x01       ; 1
+ 346:  f1 d2           rcall   .+1506          ; 0x92a <__mulsi3>
+
+               power[b] = (p > 0) ? (uint32_t)p : 0;
+ 348:  a7 01           movw    r20, r14
+ 34a:  96 01           movw    r18, r12
+ 34c:  26 1b           sub     r18, r22
+ 34e:  37 0b           sbc     r19, r23
+ 350:  48 0b           sbc     r20, r24
+ 352:  59 0b           sbc     r21, r25
+ 354:  da 01           movw    r26, r20
+ 356:  c9 01           movw    r24, r18
+ 358:  1a f4           brpl    .+6             ; 0x360 <__EEPROM_REGION_LENGTH__+0x160>
+ 35a:  80 e0           ldi     r24, 0x00       ; 0
+ 35c:  90 e0           ldi     r25, 0x00       ; 0
+ 35e:  dc 01           movw    r26, r24
+ 360:  00 0f           add     r16, r16
+ 362:  11 1f           adc     r17, r17
+ 364:  00 0f           add     r16, r16
+ 366:  11 1f           adc     r17, r17
+ 368:  e1 e0           ldi     r30, 0x01       ; 1
+ 36a:  f0 e0           ldi     r31, 0x00       ; 0
+ 36c:  ec 0f           add     r30, r28
+ 36e:  fd 1f           adc     r31, r29
+ 370:  e0 0f           add     r30, r16
+ 372:  f1 1f           adc     r31, r17
+ 374:  80 83           st      Z, r24
+ 376:  91 83           std     Z+1, r25        ; 0x01
+ 378:  a2 83           std     Z+2, r26        ; 0x02
+ 37a:  b3 83           std     Z+3, r27        ; 0x03
+
+       int16_t mean = (int16_t)(sum / N_SAMPLES);
+
+       uint32_t power[NUM_BINS];
+
+       for (uint8_t b = 0; b < NUM_BINS; b++) {
+ 37c:  cb 5f           subi    r28, 0xFB       ; 251
+ 37e:  de 4f           sbci    r29, 0xFE       ; 254
+ 380:  38 81           ld      r19, Y
+ 382:  c5 50           subi    r28, 0x05       ; 5
+ 384:  d1 40           sbci    r29, 0x01       ; 1
+ 386:  3f 5f           subi    r19, 0xFF       ; 255
+ 388:  cb 5f           subi    r28, 0xFB       ; 251
+ 38a:  de 4f           sbci    r29, 0xFE       ; 254
+ 38c:  38 83           st      Y, r19
+ 38e:  c5 50           subi    r28, 0x05       ; 5
+ 390:  d1 40           sbci    r29, 0x01       ; 1
+ 392:  cb 5f           subi    r28, 0xFB       ; 251
+ 394:  de 4f           sbci    r29, 0xFE       ; 254
+ 396:  48 81           ld      r20, Y
+ 398:  c5 50           subi    r28, 0x05       ; 5
+ 39a:  d1 40           sbci    r29, 0x01       ; 1
+ 39c:  41 34           cpi     r20, 0x41       ; 65
+ 39e:  08 f4           brcc    .+2             ; 0x3a2 <__EEPROM_REGION_LENGTH__+0x1a2>
+ 3a0:  7c cf           rjmp    .-264           ; 0x29a <__EEPROM_REGION_LENGTH__+0x9a>
+ 3a2:  81 e0           ldi     r24, 0x01       ; 1
+ 3a4:  30 e0           ldi     r19, 0x00       ; 0
+ 3a6:  93 2f           mov     r25, r19
+ 3a8:  27 c0           rjmp    .+78            ; 0x3f8 <__EEPROM_REGION_LENGTH__+0x1f8>
+       }
+
+       uint8_t best1 = 0;
+
+       for (uint8_t b = 1; b < NUM_BINS; b++) {
+               if (power[b] > power[best1])
+ 3aa:  e8 2f           mov     r30, r24
+ 3ac:  f0 e0           ldi     r31, 0x00       ; 0
+ 3ae:  ee 0f           add     r30, r30
+ 3b0:  ff 1f           adc     r31, r31
+ 3b2:  ee 0f           add     r30, r30
+ 3b4:  ff 1f           adc     r31, r31
+ 3b6:  21 e0           ldi     r18, 0x01       ; 1
+ 3b8:  30 e0           ldi     r19, 0x00       ; 0
+ 3ba:  2c 0f           add     r18, r28
+ 3bc:  3d 1f           adc     r19, r29
+ 3be:  e2 0f           add     r30, r18
+ 3c0:  f3 1f           adc     r31, r19
+ 3c2:  00 81           ld      r16, Z
+ 3c4:  11 81           ldd     r17, Z+1        ; 0x01
+ 3c6:  22 81           ldd     r18, Z+2        ; 0x02
+ 3c8:  33 81           ldd     r19, Z+3        ; 0x03
+ 3ca:  e9 2f           mov     r30, r25
+ 3cc:  f0 e0           ldi     r31, 0x00       ; 0
+ 3ce:  ee 0f           add     r30, r30
+ 3d0:  ff 1f           adc     r31, r31
+ 3d2:  ee 0f           add     r30, r30
+ 3d4:  ff 1f           adc     r31, r31
+ 3d6:  41 e0           ldi     r20, 0x01       ; 1
+ 3d8:  50 e0           ldi     r21, 0x00       ; 0
+ 3da:  4c 0f           add     r20, r28
+ 3dc:  5d 1f           adc     r21, r29
+ 3de:  e4 0f           add     r30, r20
+ 3e0:  f5 1f           adc     r31, r21
+ 3e2:  40 81           ld      r20, Z
+ 3e4:  51 81           ldd     r21, Z+1        ; 0x01
+ 3e6:  62 81           ldd     r22, Z+2        ; 0x02
+ 3e8:  73 81           ldd     r23, Z+3        ; 0x03
+ 3ea:  40 17           cp      r20, r16
+ 3ec:  51 07           cpc     r21, r17
+ 3ee:  62 07           cpc     r22, r18
+ 3f0:  73 07           cpc     r23, r19
+ 3f2:  08 f4           brcc    .+2             ; 0x3f6 <__EEPROM_REGION_LENGTH__+0x1f6>
+               best1 = b;
+ 3f4:  98 2f           mov     r25, r24
+               power[b] = (p > 0) ? (uint32_t)p : 0;
+       }
+
+       uint8_t best1 = 0;
+
+       for (uint8_t b = 1; b < NUM_BINS; b++) {
+ 3f6:  8f 5f           subi    r24, 0xFF       ; 255
+ 3f8:  81 34           cpi     r24, 0x41       ; 65
+ 3fa:  b8 f2           brcs    .-82            ; 0x3aa <__EEPROM_REGION_LENGTH__+0x1aa>
+ 3fc:  39 2f           mov     r19, r25
+ 3fe:  20 e0           ldi     r18, 0x00       ; 0
+ 400:  4f ef           ldi     r20, 0xFF       ; 255
+ 402:  38 c0           rjmp    .+112           ; 0x474 <__DATA_REGION_LENGTH__+0x74>
+       }
+
+       uint8_t best2 = 255;
+
+       for (uint8_t b = 0; b < NUM_BINS; b++) {
+               if ((b + 1 >= best1) && (b <= best1 + 1))
+ 404:  82 2f           mov     r24, r18
+ 406:  90 e0           ldi     r25, 0x00       ; 0
+ 408:  fc 01           movw    r30, r24
+ 40a:  31 96           adiw    r30, 0x01       ; 1
+ 40c:  63 2f           mov     r22, r19
+ 40e:  70 e0           ldi     r23, 0x00       ; 0
+ 410:  e6 17           cp      r30, r22
+ 412:  f7 07           cpc     r31, r23
+ 414:  2c f0           brlt    .+10            ; 0x420 <__DATA_REGION_LENGTH__+0x20>
+ 416:  6f 5f           subi    r22, 0xFF       ; 255
+ 418:  7f 4f           sbci    r23, 0xFF       ; 255
+ 41a:  68 17           cp      r22, r24
+ 41c:  79 07           cpc     r23, r25
+ 41e:  4c f5           brge    .+82            ; 0x472 <__DATA_REGION_LENGTH__+0x72>
+               continue;
+
+               if (best2 == 255 || power[b] > power[best2])
+ 420:  4f 3f           cpi     r20, 0xFF       ; 255
+ 422:  21 f1           breq    .+72            ; 0x46c <__DATA_REGION_LENGTH__+0x6c>
+ 424:  88 0f           add     r24, r24
+ 426:  99 1f           adc     r25, r25
+ 428:  88 0f           add     r24, r24
+ 42a:  99 1f           adc     r25, r25
+ 42c:  e1 e0           ldi     r30, 0x01       ; 1
+ 42e:  f0 e0           ldi     r31, 0x00       ; 0
+ 430:  ec 0f           add     r30, r28
+ 432:  fd 1f           adc     r31, r29
+ 434:  e8 0f           add     r30, r24
+ 436:  f9 1f           adc     r31, r25
+ 438:  c0 80           ld      r12, Z
+ 43a:  d1 80           ldd     r13, Z+1        ; 0x01
+ 43c:  e2 80           ldd     r14, Z+2        ; 0x02
+ 43e:  f3 80           ldd     r15, Z+3        ; 0x03
+ 440:  e4 2f           mov     r30, r20
+ 442:  f0 e0           ldi     r31, 0x00       ; 0
+ 444:  ee 0f           add     r30, r30
+ 446:  ff 1f           adc     r31, r31
+ 448:  ee 0f           add     r30, r30
+ 44a:  ff 1f           adc     r31, r31
+ 44c:  81 e0           ldi     r24, 0x01       ; 1
+ 44e:  90 e0           ldi     r25, 0x00       ; 0
+ 450:  8c 0f           add     r24, r28
+ 452:  9d 1f           adc     r25, r29
+ 454:  e8 0f           add     r30, r24
+ 456:  f9 1f           adc     r31, r25
+ 458:  80 81           ld      r24, Z
+ 45a:  91 81           ldd     r25, Z+1        ; 0x01
+ 45c:  a2 81           ldd     r26, Z+2        ; 0x02
+ 45e:  b3 81           ldd     r27, Z+3        ; 0x03
+ 460:  8c 15           cp      r24, r12
+ 462:  9d 05           cpc     r25, r13
+ 464:  ae 05           cpc     r26, r14
+ 466:  bf 05           cpc     r27, r15
+ 468:  18 f0           brcs    .+6             ; 0x470 <__DATA_REGION_LENGTH__+0x70>
+ 46a:  03 c0           rjmp    .+6             ; 0x472 <__DATA_REGION_LENGTH__+0x72>
+               best2 = b;
+ 46c:  42 2f           mov     r20, r18
+ 46e:  01 c0           rjmp    .+2             ; 0x472 <__DATA_REGION_LENGTH__+0x72>
+ 470:  42 2f           mov     r20, r18
+               best1 = b;
+       }
+
+       uint8_t best2 = 255;
+
+       for (uint8_t b = 0; b < NUM_BINS; b++) {
+ 472:  2f 5f           subi    r18, 0xFF       ; 255
+ 474:  21 34           cpi     r18, 0x41       ; 65
+ 476:  30 f2           brcs    .-116           ; 0x404 <__DATA_REGION_LENGTH__+0x4>
+
+               if (best2 == 255 || power[b] > power[best2])
+               best2 = b;
+       }
+
+       *freq1 = ((uint32_t)(best1 + MIN_BIN) * SAMPLE_RATE
+ 478:  a3 2f           mov     r26, r19
+ 47a:  b0 e0           ldi     r27, 0x00       ; 0
+ 47c:  50 96           adiw    r26, 0x10       ; 16
+ 47e:  20 e4           ldi     r18, 0x40       ; 64
+ 480:  3f e1           ldi     r19, 0x1F       ; 31
+ 482:  d7 d2           rcall   .+1454          ; 0xa32 <__usmulhisi3>
+       + N_SAMPLES / 2) / N_SAMPLES;
+ 484:  dc 01           movw    r26, r24
+ 486:  cb 01           movw    r24, r22
+ 488:  80 58           subi    r24, 0x80       ; 128
+ 48a:  9f 4f           sbci    r25, 0xFF       ; 255
+ 48c:  af 4f           sbci    r26, 0xFF       ; 255
+ 48e:  bf 4f           sbci    r27, 0xFF       ; 255
+ 490:  89 2f           mov     r24, r25
+ 492:  9a 2f           mov     r25, r26
+ 494:  ab 2f           mov     r26, r27
+ 496:  bb 27           eor     r27, r27
+
+               if (best2 == 255 || power[b] > power[best2])
+               best2 = b;
+       }
+
+       *freq1 = ((uint32_t)(best1 + MIN_BIN) * SAMPLE_RATE
+ 498:  c4 5f           subi    r28, 0xF4       ; 244
+ 49a:  de 4f           sbci    r29, 0xFE       ; 254
+ 49c:  e8 81           ld      r30, Y
+ 49e:  f9 81           ldd     r31, Y+1        ; 0x01
+ 4a0:  cc 50           subi    r28, 0x0C       ; 12
+ 4a2:  d1 40           sbci    r29, 0x01       ; 1
+ 4a4:  91 83           std     Z+1, r25        ; 0x01
+ 4a6:  80 83           st      Z, r24
+       + N_SAMPLES / 2) / N_SAMPLES;
+
+       *freq2 = ((uint32_t)(best2 + MIN_BIN) * SAMPLE_RATE
+ 4a8:  50 e0           ldi     r21, 0x00       ; 0
+ 4aa:  da 01           movw    r26, r20
+ 4ac:  50 96           adiw    r26, 0x10       ; 16
+ 4ae:  c1 d2           rcall   .+1410          ; 0xa32 <__usmulhisi3>
+       + N_SAMPLES / 2) / N_SAMPLES;
+ 4b0:  dc 01           movw    r26, r24
+ 4b2:  cb 01           movw    r24, r22
+ 4b4:  80 58           subi    r24, 0x80       ; 128
+ 4b6:  9f 4f           sbci    r25, 0xFF       ; 255
+ 4b8:  af 4f           sbci    r26, 0xFF       ; 255
+ 4ba:  bf 4f           sbci    r27, 0xFF       ; 255
+ 4bc:  89 2f           mov     r24, r25
+ 4be:  9a 2f           mov     r25, r26
+ 4c0:  ab 2f           mov     r26, r27
+ 4c2:  bb 27           eor     r27, r27
+       }
+
+       *freq1 = ((uint32_t)(best1 + MIN_BIN) * SAMPLE_RATE
+       + N_SAMPLES / 2) / N_SAMPLES;
+
+       *freq2 = ((uint32_t)(best2 + MIN_BIN) * SAMPLE_RATE
+ 4c4:  c2 5f           subi    r28, 0xF2       ; 242
+ 4c6:  de 4f           sbci    r29, 0xFE       ; 254
+ 4c8:  e8 81           ld      r30, Y
+ 4ca:  f9 81           ldd     r31, Y+1        ; 0x01
+ 4cc:  ce 50           subi    r28, 0x0E       ; 14
+ 4ce:  d1 40           sbci    r29, 0x01       ; 1
+ 4d0:  91 83           std     Z+1, r25        ; 0x01
+ 4d2:  80 83           st      Z, r24
+       + N_SAMPLES / 2) / N_SAMPLES;
+}
+ 4d4:  c1 5f           subi    r28, 0xF1       ; 241
+ 4d6:  de 4f           sbci    r29, 0xFE       ; 254
+ 4d8:  0f b6           in      r0, 0x3f        ; 63
+ 4da:  f8 94           cli
+ 4dc:  de bf           out     0x3e, r29       ; 62
+ 4de:  0f be           out     0x3f, r0        ; 63
+ 4e0:  cd bf           out     0x3d, r28       ; 61
+ 4e2:  df 91           pop     r29
+ 4e4:  cf 91           pop     r28
+ 4e6:  1f 91           pop     r17
+ 4e8:  0f 91           pop     r16
+ 4ea:  ff 90           pop     r15
+ 4ec:  ef 90           pop     r14
+ 4ee:  df 90           pop     r13
+ 4f0:  cf 90           pop     r12
+ 4f2:  bf 90           pop     r11
+ 4f4:  af 90           pop     r10
+ 4f6:  9f 90           pop     r9
+ 4f8:  8f 90           pop     r8
+ 4fa:  7f 90           pop     r7
+ 4fc:  6f 90           pop     r6
+ 4fe:  5f 90           pop     r5
+ 500:  4f 90           pop     r4
+ 502:  3f 90           pop     r3
+ 504:  2f 90           pop     r2
+ 506:  08 95           ret
+
+Disassembly of section .text.get_column:
+
+0000088e <get_column>:
+// Frequency matching tolerance in Hz
+#define FREQ_TOLERANCE 20
+
+static int8_t get_column(uint16_t f)
+{
+       if (f >= 1219 - FREQ_TOLERANCE &&
+ 88e:  9c 01           movw    r18, r24
+ 890:  2f 5a           subi    r18, 0xAF       ; 175
+ 892:  34 40           sbci    r19, 0x04       ; 4
+ 894:  29 32           cpi     r18, 0x29       ; 41
+ 896:  31 05           cpc     r19, r1
+ 898:  58 f0           brcs    .+22            ; 0x8b0 <get_column+0x22>
+       f <= 1219 + FREQ_TOLERANCE)
+       return 0;
+
+       if (f >= 1344 - FREQ_TOLERANCE &&
+ 89a:  2d 57           subi    r18, 0x7D       ; 125
+ 89c:  31 09           sbc     r19, r1
+ 89e:  29 32           cpi     r18, 0x29       ; 41
+ 8a0:  31 05           cpc     r19, r1
+ 8a2:  40 f0           brcs    .+16            ; 0x8b4 <get_column+0x26>
+       f <= 1344 + FREQ_TOLERANCE)
+       return 1;
+
+       if (f >= 1469 - FREQ_TOLERANCE &&
+ 8a4:  89 5a           subi    r24, 0xA9       ; 169
+ 8a6:  95 40           sbci    r25, 0x05       ; 5
+ 8a8:  89 97           sbiw    r24, 0x29       ; 41
+ 8aa:  30 f4           brcc    .+12            ; 0x8b8 <get_column+0x2a>
+       f <= 1469 + FREQ_TOLERANCE)
+       return 2;
+ 8ac:  82 e0           ldi     r24, 0x02       ; 2
+ 8ae:  08 95           ret
+
+static int8_t get_column(uint16_t f)
+{
+       if (f >= 1219 - FREQ_TOLERANCE &&
+       f <= 1219 + FREQ_TOLERANCE)
+       return 0;
+ 8b0:  80 e0           ldi     r24, 0x00       ; 0
+ 8b2:  08 95           ret
+
+       if (f >= 1344 - FREQ_TOLERANCE &&
+       f <= 1344 + FREQ_TOLERANCE)
+       return 1;
+ 8b4:  81 e0           ldi     r24, 0x01       ; 1
+ 8b6:  08 95           ret
+
+       if (f >= 1469 - FREQ_TOLERANCE &&
+       f <= 1469 + FREQ_TOLERANCE)
+       return 2;
+
+       return -1;
+ 8b8:  8f ef           ldi     r24, 0xFF       ; 255
+}
+ 8ba:  08 95           ret
+
+Disassembly of section .text.get_row:
+
+00000818 <get_row>:
+
+static int8_t get_row(uint16_t f)
+{
+       if (f >= 688 - FREQ_TOLERANCE &&
+ 818:  9c 01           movw    r18, r24
+ 81a:  2c 59           subi    r18, 0x9C       ; 156
+ 81c:  32 40           sbci    r19, 0x02       ; 2
+ 81e:  29 32           cpi     r18, 0x29       ; 41
+ 820:  31 05           cpc     r19, r1
+ 822:  80 f0           brcs    .+32            ; 0x844 <get_row+0x2c>
+       f <= 688 + FREQ_TOLERANCE)
+       return 0;
+
+       if (f >= 781 - FREQ_TOLERANCE &&
+ 824:  2d 55           subi    r18, 0x5D       ; 93
+ 826:  31 09           sbc     r19, r1
+ 828:  29 32           cpi     r18, 0x29       ; 41
+ 82a:  31 05           cpc     r19, r1
+ 82c:  68 f0           brcs    .+26            ; 0x848 <get_row+0x30>
+       f <= 781 + FREQ_TOLERANCE)
+       return 1;
+
+       if (f >= 844 - FREQ_TOLERANCE &&
+ 82e:  2f 53           subi    r18, 0x3F       ; 63
+ 830:  31 09           sbc     r19, r1
+ 832:  29 32           cpi     r18, 0x29       ; 41
+ 834:  31 05           cpc     r19, r1
+ 836:  50 f0           brcs    .+20            ; 0x84c <get_row+0x34>
+       f <= 844 + FREQ_TOLERANCE)
+       return 2;
+
+       if (f >= 938 - FREQ_TOLERANCE &&
+ 838:  86 59           subi    r24, 0x96       ; 150
+ 83a:  93 40           sbci    r25, 0x03       ; 3
+ 83c:  89 97           sbiw    r24, 0x29       ; 41
+ 83e:  40 f4           brcc    .+16            ; 0x850 <get_row+0x38>
+       f <= 938 + FREQ_TOLERANCE)
+       return 3;
+ 840:  83 e0           ldi     r24, 0x03       ; 3
+ 842:  08 95           ret
+
+static int8_t get_row(uint16_t f)
+{
+       if (f >= 688 - FREQ_TOLERANCE &&
+       f <= 688 + FREQ_TOLERANCE)
+       return 0;
+ 844:  80 e0           ldi     r24, 0x00       ; 0
+ 846:  08 95           ret
+
+       if (f >= 781 - FREQ_TOLERANCE &&
+       f <= 781 + FREQ_TOLERANCE)
+       return 1;
+ 848:  81 e0           ldi     r24, 0x01       ; 1
+ 84a:  08 95           ret
+
+       if (f >= 844 - FREQ_TOLERANCE &&
+       f <= 844 + FREQ_TOLERANCE)
+       return 2;
+ 84c:  82 e0           ldi     r24, 0x02       ; 2
+ 84e:  08 95           ret
+
+       if (f >= 938 - FREQ_TOLERANCE &&
+       f <= 938 + FREQ_TOLERANCE)
+       return 3;
+
+       return -1;
+ 850:  8f ef           ldi     r24, 0xFF       ; 255
+}
+ 852:  08 95           ret
+
+Disassembly of section .text.decode_key:
+
+000006fa <decode_key>:
+
+static char decode_key(uint16_t f1, uint16_t f2)
+{
+ 6fa:  ef 92           push    r14
+ 6fc:  ff 92           push    r15
+ 6fe:  0f 93           push    r16
+ 700:  1f 93           push    r17
+ 702:  cf 93           push    r28
+ 704:  8c 01           movw    r16, r24
+ 706:  7b 01           movw    r14, r22
+               {'4', '5', '6'},
+               {'7', '8', '9'},
+               {'*', '0', '#'}
+       };
+
+       int8_t col = get_column(f1);
+ 708:  c2 d0           rcall   .+388           ; 0x88e <get_column>
+ 70a:  c8 2f           mov     r28, r24
+       int8_t row = get_row(f2);
+ 70c:  c7 01           movw    r24, r14
+ 70e:  84 d0           rcall   .+264           ; 0x818 <get_row>
+
+       // The two strongest frequencies may appear in either order.
+       if (col < 0 || row < 0) {
+ 710:  cc 23           and     r28, r28
+ 712:  14 f0           brlt    .+4             ; 0x718 <decode_key+0x1e>
+ 714:  88 23           and     r24, r24
+ 716:  2c f4           brge    .+10            ; 0x722 <decode_key+0x28>
+               col = get_column(f2);
+ 718:  c7 01           movw    r24, r14
+ 71a:  b9 d0           rcall   .+370           ; 0x88e <get_column>
+ 71c:  c8 2f           mov     r28, r24
+               row = get_row(f1);
+ 71e:  c8 01           movw    r24, r16
+ 720:  7b d0           rcall   .+246           ; 0x818 <get_row>
+       }
+
+       if (col < 0 || row < 0)
+ 722:  cc 23           and     r28, r28
+ 724:  cc f0           brlt    .+50            ; 0x758 <decode_key+0x5e>
+ 726:  88 23           and     r24, r24
+ 728:  cc f0           brlt    .+50            ; 0x75c <decode_key+0x62>
+       return '\0';
+
+       return keypad[row][col];
+ 72a:  08 2e           mov     r0, r24
+ 72c:  00 0c           add     r0, r0
+ 72e:  99 0b           sbc     r25, r25
+ 730:  9c 01           movw    r18, r24
+ 732:  22 0f           add     r18, r18
+ 734:  33 1f           adc     r19, r19
+ 736:  82 0f           add     r24, r18
+ 738:  93 1f           adc     r25, r19
+ 73a:  8c 0f           add     r24, r28
+ 73c:  91 1d           adc     r25, r1
+ 73e:  c7 fd           sbrc    r28, 7
+ 740:  9a 95           dec     r25
+ 742:  09 2e           mov     r0, r25
+ 744:  00 0c           add     r0, r0
+ 746:  aa 0b           sbc     r26, r26
+ 748:  8b 5c           subi    r24, 0xCB       ; 203
+ 74a:  9e 4f           sbci    r25, 0xFE       ; 254
+ 74c:  af 4f           sbci    r26, 0xFF       ; 255
+ 74e:  fc 01           movw    r30, r24
+ 750:  84 91           lpm     r24, Z
+ 752:  a7 fd           sbrc    r26, 7
+ 754:  80 81           ld      r24, Z
+ 756:  03 c0           rjmp    .+6             ; 0x75e <decode_key+0x64>
+               col = get_column(f2);
+               row = get_row(f1);
+       }
+
+       if (col < 0 || row < 0)
+       return '\0';
+ 758:  80 e0           ldi     r24, 0x00       ; 0
+ 75a:  01 c0           rjmp    .+2             ; 0x75e <decode_key+0x64>
+ 75c:  80 e0           ldi     r24, 0x00       ; 0
+
+       return keypad[row][col];
+}
+ 75e:  cf 91           pop     r28
+ 760:  1f 91           pop     r17
+ 762:  0f 91           pop     r16
+ 764:  ff 90           pop     r15
+ 766:  ef 90           pop     r14
+ 768:  08 95           ret
+
+Disassembly of section .text.lcd_pulse_enable:
+
+000008e6 <lcd_pulse_enable>:
+{
+       i2c_write_byte(LCD_ADDR, data | LCD_BACKLIGHT);
+}
+
+static void lcd_pulse_enable(uint8_t data)
+{
+ 8e6:  cf 93           push    r28
+ 8e8:  c8 2f           mov     r28, r24
+       lcd_expander_write(data | LCD_EN);
+ 8ea:  84 60           ori     r24, 0x04       ; 4
+ 8ec:  ae d0           rcall   .+348           ; 0xa4a <lcd_expander_write>
+       #else
+               //round up by default
+               __ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
+       #endif
+
+       __builtin_avr_delay_cycles(__ticks_dc);
+ 8ee:  85 e0           ldi     r24, 0x05       ; 5
+ 8f0:  8a 95           dec     r24
+ 8f2:  f1 f7           brne    .-4             ; 0x8f0 <lcd_pulse_enable+0xa>
+ 8f4:  00 00           nop
+       _delay_us(1);
+
+       lcd_expander_write(data & ~LCD_EN);
+ 8f6:  8c 2f           mov     r24, r28
+ 8f8:  8b 7f           andi    r24, 0xFB       ; 251
+ 8fa:  a7 d0           rcall   .+334           ; 0xa4a <lcd_expander_write>
+ 8fc:  87 ec           ldi     r24, 0xC7       ; 199
+ 8fe:  90 e0           ldi     r25, 0x00       ; 0
+ 900:  01 97           sbiw    r24, 0x01       ; 1
+ 902:  f1 f7           brne    .-4             ; 0x900 <lcd_pulse_enable+0x1a>
+ 904:  00 c0           rjmp    .+0             ; 0x906 <lcd_pulse_enable+0x20>
+ 906:  00 00           nop
+       _delay_us(50);
+}
+ 908:  cf 91           pop     r28
+ 90a:  08 95           ret
+
+Disassembly of section .text.lcd_write4:
+
+00000998 <lcd_write4>:
+
+static void lcd_write4(uint8_t nibble, uint8_t mode)
+{
+ 998:  cf 93           push    r28
+       uint8_t data = (nibble & 0xF0) | mode | LCD_BACKLIGHT;
+ 99a:  80 7f           andi    r24, 0xF0       ; 240
+ 99c:  68 2b           or      r22, r24
+ 99e:  c6 2f           mov     r28, r22
+ 9a0:  c8 60           ori     r28, 0x08       ; 8
+
+       lcd_expander_write(data);
+ 9a2:  8c 2f           mov     r24, r28
+ 9a4:  52 d0           rcall   .+164           ; 0xa4a <lcd_expander_write>
+       lcd_pulse_enable(data);
+ 9a6:  8c 2f           mov     r24, r28
+ 9a8:  9e df           rcall   .-196           ; 0x8e6 <lcd_pulse_enable>
+}
+ 9aa:  cf 91           pop     r28
+ 9ac:  08 95           ret
+
+Disassembly of section .text.lcd_send:
+
+00000964 <lcd_send>:
+
+static void lcd_send(uint8_t value, uint8_t mode)
+{
+ 964:  cf 93           push    r28
+ 966:  df 93           push    r29
+ 968:  c8 2f           mov     r28, r24
+ 96a:  d6 2f           mov     r29, r22
+       lcd_write4(value & 0xF0, mode);
+ 96c:  80 7f           andi    r24, 0xF0       ; 240
+ 96e:  14 d0           rcall   .+40            ; 0x998 <lcd_write4>
+       lcd_write4((value << 4) & 0xF0, mode);
+ 970:  6d 2f           mov     r22, r29
+ 972:  8c 2f           mov     r24, r28
+ 974:  82 95           swap    r24
+ 976:  80 7f           andi    r24, 0xF0       ; 240
+ 978:  0f d0           rcall   .+30            ; 0x998 <lcd_write4>
+}
+ 97a:  df 91           pop     r29
+ 97c:  cf 91           pop     r28
+ 97e:  08 95           ret
+
+Disassembly of section .text.lcd_data:
+
+00000a54 <lcd_data>:
+       _delay_ms(2);
+}
+
+static void lcd_data(uint8_t data)
+{
+       lcd_send(data, LCD_RS);
+ a54:  61 e0           ldi     r22, 0x01       ; 1
+ a56:  86 df           rcall   .-244           ; 0x964 <lcd_send>
+ a58:  08 95           ret
+
+Disassembly of section .text.lcd_putc:
+
+00000a5a <lcd_putc>:
+}
+
+static void lcd_putc(char c)
+{
+       lcd_data((uint8_t)c);
+ a5a:  fc df           rcall   .-8             ; 0xa54 <lcd_data>
+ a5c:  08 95           ret
+
+Disassembly of section .text.lcd_print:
+
+000008bc <lcd_print>:
+}
+
+static void lcd_print(const char *str)
+{
+ 8bc:  cf 92           push    r12
+ 8be:  df 92           push    r13
+ 8c0:  ef 92           push    r14
+ 8c2:  6b 01           movw    r12, r22
+ 8c4:  e8 2e           mov     r14, r24
+       while (*str)
+ 8c6:  05 c0           rjmp    .+10            ; 0x8d2 <lcd_print+0x16>
+       lcd_putc(*str++);
+ 8c8:  9f ef           ldi     r25, 0xFF       ; 255
+ 8ca:  c9 1a           sub     r12, r25
+ 8cc:  d9 0a           sbc     r13, r25
+ 8ce:  e9 0a           sbc     r14, r25
+ 8d0:  c4 d0           rcall   .+392           ; 0xa5a <lcd_putc>
+       lcd_data((uint8_t)c);
+}
+
+static void lcd_print(const char *str)
+{
+       while (*str)
+ 8d2:  f6 01           movw    r30, r12
+ 8d4:  84 91           lpm     r24, Z
+ 8d6:  e7 fc           sbrc    r14, 7
+ 8d8:  80 81           ld      r24, Z
+ 8da:  81 11           cpse    r24, r1
+ 8dc:  f5 cf           rjmp    .-22            ; 0x8c8 <lcd_print+0xc>
+       lcd_putc(*str++);
+}
+ 8de:  ef 90           pop     r14
+ 8e0:  df 90           pop     r13
+ 8e2:  cf 90           pop     r12
+ 8e4:  08 95           ret
+
+Disassembly of section .text.lcd_print_uint:
+
+00000508 <lcd_print_uint>:
+
+static void lcd_print_uint(uint16_t value, uint8_t width)
+{
+ 508:  0f 93           push    r16
+ 50a:  1f 93           push    r17
+ 50c:  cf 93           push    r28
+ 50e:  df 93           push    r29
+ 510:  00 d0           rcall   .+0             ; 0x512 <lcd_print_uint+0xa>
+ 512:  00 d0           rcall   .+0             ; 0x514 <lcd_print_uint+0xc>
+ 514:  0f 92           push    r0
+ 516:  cd b7           in      r28, 0x3d       ; 61
+ 518:  de b7           in      r29, 0x3e       ; 62
+ 51a:  ac 01           movw    r20, r24
+ 51c:  06 2f           mov     r16, r22
+       char digits[5];
+       uint8_t n = 0;
+ 51e:  e0 e0           ldi     r30, 0x00       ; 0
+
+       do {
+               digits[n++] = '0' + (value % 10);
+ 520:  11 e0           ldi     r17, 0x01       ; 1
+ 522:  1e 0f           add     r17, r30
+ 524:  9a 01           movw    r18, r20
+ 526:  ad ec           ldi     r26, 0xCD       ; 205
+ 528:  bc ec           ldi     r27, 0xCC       ; 204
+ 52a:  2a d2           rcall   .+1108          ; 0x980 <__umulhisi3>
+ 52c:  96 95           lsr     r25
+ 52e:  87 95           ror     r24
+ 530:  96 95           lsr     r25
+ 532:  87 95           ror     r24
+ 534:  96 95           lsr     r25
+ 536:  87 95           ror     r24
+ 538:  9c 01           movw    r18, r24
+ 53a:  22 0f           add     r18, r18
+ 53c:  33 1f           adc     r19, r19
+ 53e:  88 0f           add     r24, r24
+ 540:  99 1f           adc     r25, r25
+ 542:  88 0f           add     r24, r24
+ 544:  99 1f           adc     r25, r25
+ 546:  88 0f           add     r24, r24
+ 548:  99 1f           adc     r25, r25
+ 54a:  82 0f           add     r24, r18
+ 54c:  93 1f           adc     r25, r19
+ 54e:  9a 01           movw    r18, r20
+ 550:  28 1b           sub     r18, r24
+ 552:  39 0b           sbc     r19, r25
+ 554:  c9 01           movw    r24, r18
+ 556:  21 e0           ldi     r18, 0x01       ; 1
+ 558:  30 e0           ldi     r19, 0x00       ; 0
+ 55a:  2c 0f           add     r18, r28
+ 55c:  3d 1f           adc     r19, r29
+ 55e:  2e 0f           add     r18, r30
+ 560:  31 1d           adc     r19, r1
+ 562:  f9 01           movw    r30, r18
+ 564:  80 5d           subi    r24, 0xD0       ; 208
+ 566:  80 83           st      Z, r24
+               value /= 10;
+ 568:  9a 01           movw    r18, r20
+ 56a:  0a d2           rcall   .+1044          ; 0x980 <__umulhisi3>
+ 56c:  ac 01           movw    r20, r24
+ 56e:  56 95           lsr     r21
+ 570:  47 95           ror     r20
+ 572:  56 95           lsr     r21
+ 574:  47 95           ror     r20
+ 576:  56 95           lsr     r21
+ 578:  47 95           ror     r20
+       } while (value && n < 5);
+ 57a:  41 15           cp      r20, r1
+ 57c:  51 05           cpc     r21, r1
+ 57e:  39 f0           breq    .+14            ; 0x58e <lcd_print_uint+0x86>
+{
+       char digits[5];
+       uint8_t n = 0;
+
+       do {
+               digits[n++] = '0' + (value % 10);
+ 580:  e1 2f           mov     r30, r17
+               value /= 10;
+       } while (value && n < 5);
+ 582:  15 30           cpi     r17, 0x05       ; 5
+ 584:  68 f2           brcs    .-102           ; 0x520 <lcd_print_uint+0x18>
+ 586:  03 c0           rjmp    .+6             ; 0x58e <lcd_print_uint+0x86>
+
+       while (n < width) {
+               lcd_putc(' ');
+ 588:  80 e2           ldi     r24, 0x20       ; 32
+ 58a:  67 d2           rcall   .+1230          ; 0xa5a <lcd_putc>
+               width--;
+ 58c:  01 50           subi    r16, 0x01       ; 1
+       do {
+               digits[n++] = '0' + (value % 10);
+               value /= 10;
+       } while (value && n < 5);
+
+       while (n < width) {
+ 58e:  10 17           cp      r17, r16
+ 590:  d8 f3           brcs    .-10            ; 0x588 <lcd_print_uint+0x80>
+ 592:  09 c0           rjmp    .+18            ; 0x5a6 <lcd_print_uint+0x9e>
+               lcd_putc(' ');
+               width--;
+       }
+
+       while (n > 0)
+       lcd_putc(digits[--n]);
+ 594:  11 50           subi    r17, 0x01       ; 1
+ 596:  e1 e0           ldi     r30, 0x01       ; 1
+ 598:  f0 e0           ldi     r31, 0x00       ; 0
+ 59a:  ec 0f           add     r30, r28
+ 59c:  fd 1f           adc     r31, r29
+ 59e:  e1 0f           add     r30, r17
+ 5a0:  f1 1d           adc     r31, r1
+ 5a2:  80 81           ld      r24, Z
+ 5a4:  5a d2           rcall   .+1204          ; 0xa5a <lcd_putc>
+       while (n < width) {
+               lcd_putc(' ');
+               width--;
+       }
+
+       while (n > 0)
+ 5a6:  11 11           cpse    r17, r1
+ 5a8:  f5 cf           rjmp    .-22            ; 0x594 <lcd_print_uint+0x8c>
+       lcd_putc(digits[--n]);
+}
+ 5aa:  0f 90           pop     r0
+ 5ac:  0f 90           pop     r0
+ 5ae:  0f 90           pop     r0
+ 5b0:  0f 90           pop     r0
+ 5b2:  0f 90           pop     r0
+ 5b4:  df 91           pop     r29
+ 5b6:  cf 91           pop     r28
+ 5b8:  1f 91           pop     r17
+ 5ba:  0f 91           pop     r16
+ 5bc:  08 95           ret
+
+Disassembly of section .text.lcd_command:
+
+0000090c <lcd_command>:
+       lcd_write4(value & 0xF0, mode);
+       lcd_write4((value << 4) & 0xF0, mode);
+}
+
+static void lcd_command(uint8_t cmd)
+{
+ 90c:  cf 93           push    r28
+ 90e:  c8 2f           mov     r28, r24
+       lcd_send(cmd, 0);
+ 910:  60 e0           ldi     r22, 0x00       ; 0
+ 912:  28 d0           rcall   .+80            ; 0x964 <lcd_send>
+
+       if (cmd == 0x01 || cmd == 0x02)
+ 914:  c1 50           subi    r28, 0x01       ; 1
+ 916:  c2 30           cpi     r28, 0x02       ; 2
+ 918:  30 f4           brcc    .+12            ; 0x926 <lcd_command+0x1a>
+       #else
+               //round up by default
+               __ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
+       #endif
+
+       __builtin_avr_delay_cycles(__ticks_dc);
+ 91a:  8f e3           ldi     r24, 0x3F       ; 63
+ 91c:  9f e1           ldi     r25, 0x1F       ; 31
+ 91e:  01 97           sbiw    r24, 0x01       ; 1
+ 920:  f1 f7           brne    .-4             ; 0x91e <lcd_command+0x12>
+ 922:  00 c0           rjmp    .+0             ; 0x924 <lcd_command+0x18>
+ 924:  00 00           nop
+       _delay_ms(2);
+}
+ 926:  cf 91           pop     r28
+ 928:  08 95           ret
+
+Disassembly of section .text.lcd_goto:
+
+00000a26 <lcd_goto>:
+       lcd_command(0x01);
+}
+
+static void lcd_goto(uint8_t row, uint8_t col)
+{
+       uint8_t address = (row == 0) ? 0x00 : 0x40;
+ a26:  81 11           cpse    r24, r1
+ a28:  80 e4           ldi     r24, 0x40       ; 64
+       lcd_command(0x80 | (address + col));
+ a2a:  86 0f           add     r24, r22
+ a2c:  80 68           ori     r24, 0x80       ; 128
+ a2e:  6e df           rcall   .-292           ; 0x90c <lcd_command>
+ a30:  08 95           ret
+
+Disassembly of section .text.lcd_init:
+
+0000076a <lcd_init>:
+ 76a:  2f ef           ldi     r18, 0xFF       ; 255
+ 76c:  80 e7           ldi     r24, 0x70       ; 112
+ 76e:  92 e0           ldi     r25, 0x02       ; 2
+ 770:  21 50           subi    r18, 0x01       ; 1
+ 772:  80 40           sbci    r24, 0x00       ; 0
+ 774:  90 40           sbci    r25, 0x00       ; 0
+ 776:  e1 f7           brne    .-8             ; 0x770 <lcd_init+0x6>
+ 778:  00 c0           rjmp    .+0             ; 0x77a <lcd_init+0x10>
+ 77a:  00 00           nop
+static void lcd_init(void)
+{
+       _delay_ms(50);
+
+       // Standard HD44780 startup sequence
+       lcd_write4(0x30, 0);
+ 77c:  60 e0           ldi     r22, 0x00       ; 0
+ 77e:  80 e3           ldi     r24, 0x30       ; 48
+ 780:  0b d1           rcall   .+534           ; 0x998 <lcd_write4>
+ 782:  8f e1           ldi     r24, 0x1F       ; 31
+ 784:  9e e4           ldi     r25, 0x4E       ; 78
+ 786:  01 97           sbiw    r24, 0x01       ; 1
+ 788:  f1 f7           brne    .-4             ; 0x786 <lcd_init+0x1c>
+ 78a:  00 c0           rjmp    .+0             ; 0x78c <lcd_init+0x22>
+ 78c:  00 00           nop
+       _delay_ms(5);
+
+       lcd_write4(0x30, 0);
+ 78e:  60 e0           ldi     r22, 0x00       ; 0
+ 790:  80 e3           ldi     r24, 0x30       ; 48
+ 792:  02 d1           rcall   .+516           ; 0x998 <lcd_write4>
+       #else
+               //round up by default
+               __ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
+       #endif
+
+       __builtin_avr_delay_cycles(__ticks_dc);
+ 794:  87 e5           ldi     r24, 0x57       ; 87
+ 796:  92 e0           ldi     r25, 0x02       ; 2
+ 798:  01 97           sbiw    r24, 0x01       ; 1
+ 79a:  f1 f7           brne    .-4             ; 0x798 <lcd_init+0x2e>
+ 79c:  00 c0           rjmp    .+0             ; 0x79e <lcd_init+0x34>
+ 79e:  00 00           nop
+       _delay_us(150);
+
+       lcd_write4(0x30, 0);
+ 7a0:  60 e0           ldi     r22, 0x00       ; 0
+ 7a2:  80 e3           ldi     r24, 0x30       ; 48
+ 7a4:  f9 d0           rcall   .+498           ; 0x998 <lcd_write4>
+ 7a6:  87 e5           ldi     r24, 0x57       ; 87
+ 7a8:  92 e0           ldi     r25, 0x02       ; 2
+ 7aa:  01 97           sbiw    r24, 0x01       ; 1
+ 7ac:  f1 f7           brne    .-4             ; 0x7aa <lcd_init+0x40>
+ 7ae:  00 c0           rjmp    .+0             ; 0x7b0 <lcd_init+0x46>
+ 7b0:  00 00           nop
+       _delay_us(150);
+
+       lcd_write4(0x20, 0);
+ 7b2:  60 e0           ldi     r22, 0x00       ; 0
+ 7b4:  80 e2           ldi     r24, 0x20       ; 32
+ 7b6:  f0 d0           rcall   .+480           ; 0x998 <lcd_write4>
+ 7b8:  87 e5           ldi     r24, 0x57       ; 87
+ 7ba:  92 e0           ldi     r25, 0x02       ; 2
+ 7bc:  01 97           sbiw    r24, 0x01       ; 1
+ 7be:  f1 f7           brne    .-4             ; 0x7bc <lcd_init+0x52>
+ 7c0:  00 c0           rjmp    .+0             ; 0x7c2 <lcd_init+0x58>
+ 7c2:  00 00           nop
+       _delay_us(150);
+
+       lcd_command(0x28);  // 4-bit mode, 2 lines
+ 7c4:  88 e2           ldi     r24, 0x28       ; 40
+ 7c6:  a2 d0           rcall   .+324           ; 0x90c <lcd_command>
+       lcd_command(0x08);  // Display off
+ 7c8:  88 e0           ldi     r24, 0x08       ; 8
+ 7ca:  a0 d0           rcall   .+320           ; 0x90c <lcd_command>
+       lcd_command(0x01);  // Clear display
+ 7cc:  81 e0           ldi     r24, 0x01       ; 1
+ 7ce:  9e d0           rcall   .+316           ; 0x90c <lcd_command>
+       lcd_command(0x06);  // Increment cursor
+ 7d0:  86 e0           ldi     r24, 0x06       ; 6
+ 7d2:  9c d0           rcall   .+312           ; 0x90c <lcd_command>
+       lcd_command(0x0C);  // Display on, cursor off
+ 7d4:  8c e0           ldi     r24, 0x0C       ; 12
+ 7d6:  9a d0           rcall   .+308           ; 0x90c <lcd_command>
+ 7d8:  08 95           ret
+
+Disassembly of section .text.__vector_14:
+
+00000854 <__vector_14>:
+}
+
+volatile uint16_t adc_count = 0;
+
+ISR(TIMER0_COMPA_vect)
+{
+ 854:  1f 92           push    r1
+ 856:  0f 92           push    r0
+ 858:  0f b6           in      r0, 0x3f        ; 63
+ 85a:  0f 92           push    r0
+ 85c:  11 24           eor     r1, r1
+ 85e:  8f 93           push    r24
+ 860:  ef 93           push    r30
+ 862:  ff 93           push    r31
+    if (!(ADCSRA & (1 << ADSC)) && !block_ready) {
+ 864:  80 91 7a 00     lds     r24, 0x007A     ; 0x80007a <__TEXT_REGION_LENGTH__+0x7fe07a>
+ 868:  86 fd           sbrc    r24, 6
+ 86a:  09 c0           rjmp    .+18            ; 0x87e <__vector_14+0x2a>
+ 86c:  80 91 04 03     lds     r24, 0x0304     ; 0x800304 <block_ready>
+ 870:  81 11           cpse    r24, r1
+ 872:  05 c0           rjmp    .+10            ; 0x87e <__vector_14+0x2a>
+        ADCSRA |= (1 << ADSC);
+ 874:  ea e7           ldi     r30, 0x7A       ; 122
+ 876:  f0 e0           ldi     r31, 0x00       ; 0
+ 878:  80 81           ld      r24, Z
+ 87a:  80 64           ori     r24, 0x40       ; 64
+ 87c:  80 83           st      Z, r24
+    }
+}
+ 87e:  ff 91           pop     r31
+ 880:  ef 91           pop     r30
+ 882:  8f 91           pop     r24
+ 884:  0f 90           pop     r0
+ 886:  0f be           out     0x3f, r0        ; 63
+ 888:  0f 90           pop     r0
+ 88a:  1f 90           pop     r1
+ 88c:  18 95           reti
+
+Disassembly of section .text.__vector_21:
+
+00000666 <__vector_21>:
+
+ISR(ADC_vect)
+{
+ 666:  1f 92           push    r1
+ 668:  0f 92           push    r0
+ 66a:  0f b6           in      r0, 0x3f        ; 63
+ 66c:  0f 92           push    r0
+ 66e:  11 24           eor     r1, r1
+ 670:  2f 93           push    r18
+ 672:  3f 93           push    r19
+ 674:  8f 93           push    r24
+ 676:  9f 93           push    r25
+ 678:  ef 93           push    r30
+ 67a:  ff 93           push    r31
+    adc_count++;
+ 67c:  80 91 00 03     lds     r24, 0x0300     ; 0x800300 <adc_count>
+ 680:  90 91 01 03     lds     r25, 0x0301     ; 0x800301 <adc_count+0x1>
+ 684:  01 96           adiw    r24, 0x01       ; 1
+ 686:  90 93 01 03     sts     0x0301, r25     ; 0x800301 <adc_count+0x1>
+ 68a:  80 93 00 03     sts     0x0300, r24     ; 0x800300 <adc_count>
+
+    if (!block_ready) {
+ 68e:  80 91 04 03     lds     r24, 0x0304     ; 0x800304 <block_ready>
+ 692:  81 11           cpse    r24, r1
+ 694:  27 c0           rjmp    .+78            ; 0x6e4 <__vector_21+0x7e>
+        uint16_t i = sample_index;
+ 696:  80 91 02 03     lds     r24, 0x0302     ; 0x800302 <sample_index>
+ 69a:  90 91 03 03     lds     r25, 0x0303     ; 0x800303 <sample_index+0x1>
+        samples[i] = ADC;
+ 69e:  20 91 78 00     lds     r18, 0x0078     ; 0x800078 <__TEXT_REGION_LENGTH__+0x7fe078>
+ 6a2:  30 91 79 00     lds     r19, 0x0079     ; 0x800079 <__TEXT_REGION_LENGTH__+0x7fe079>
+ 6a6:  fc 01           movw    r30, r24
+ 6a8:  ee 0f           add     r30, r30
+ 6aa:  ff 1f           adc     r31, r31
+ 6ac:  e0 50           subi    r30, 0x00       ; 0
+ 6ae:  ff 4f           sbci    r31, 0xFF       ; 255
+ 6b0:  31 83           std     Z+1, r19        ; 0x01
+ 6b2:  20 83           st      Z, r18
+        i++;
+ 6b4:  01 96           adiw    r24, 0x01       ; 1
+
+        if (i >= N_SAMPLES) {
+ 6b6:  8f 3f           cpi     r24, 0xFF       ; 255
+ 6b8:  91 05           cpc     r25, r1
+ 6ba:  81 f0           breq    .+32            ; 0x6dc <__vector_21+0x76>
+ 6bc:  78 f0           brcs    .+30            ; 0x6dc <__vector_21+0x76>
+            sample_index = N_SAMPLES;
+ 6be:  80 e0           ldi     r24, 0x00       ; 0
+ 6c0:  91 e0           ldi     r25, 0x01       ; 1
+ 6c2:  90 93 03 03     sts     0x0303, r25     ; 0x800303 <sample_index+0x1>
+ 6c6:  80 93 02 03     sts     0x0302, r24     ; 0x800302 <sample_index>
+            block_ready = 1;
+ 6ca:  81 e0           ldi     r24, 0x01       ; 1
+ 6cc:  80 93 04 03     sts     0x0304, r24     ; 0x800304 <block_ready>
+            TIMSK0 &= ~(1 << OCIE0A);
+ 6d0:  ee e6           ldi     r30, 0x6E       ; 110
+ 6d2:  f0 e0           ldi     r31, 0x00       ; 0
+ 6d4:  80 81           ld      r24, Z
+ 6d6:  8d 7f           andi    r24, 0xFD       ; 253
+ 6d8:  80 83           st      Z, r24
+ 6da:  04 c0           rjmp    .+8             ; 0x6e4 <__vector_21+0x7e>
+        } else {
+            sample_index = i;
+ 6dc:  90 93 03 03     sts     0x0303, r25     ; 0x800303 <sample_index+0x1>
+ 6e0:  80 93 02 03     sts     0x0302, r24     ; 0x800302 <sample_index>
+        }
+    }
+}
+ 6e4:  ff 91           pop     r31
+ 6e6:  ef 91           pop     r30
+ 6e8:  9f 91           pop     r25
+ 6ea:  8f 91           pop     r24
+ 6ec:  3f 91           pop     r19
+ 6ee:  2f 91           pop     r18
+ 6f0:  0f 90           pop     r0
+ 6f2:  0f be           out     0x3f, r0        ; 63
+ 6f4:  0f 90           pop     r0
+ 6f6:  1f 90           pop     r1
+ 6f8:  18 95           reti
+
+Disassembly of section .text.main:
+
+000005be <main>:
+// ============================================================
+// Main
+// ============================================================
+
+int main(void)
+{
+ 5be:  cf 93           push    r28
+ 5c0:  df 93           push    r29
+ 5c2:  00 d0           rcall   .+0             ; 0x5c4 <main+0x6>
+ 5c4:  00 d0           rcall   .+0             ; 0x5c6 <main+0x8>
+ 5c6:  cd b7           in      r28, 0x3d       ; 61
+ 5c8:  de b7           in      r29, 0x3e       ; 62
+       uint16_t f1, f2;
+
+       i2c_init();
+ 5ca:  05 d2           rcall   .+1034          ; 0x9d6 <i2c_init>
+       lcd_init();
+ 5cc:  ce d0           rcall   .+412           ; 0x76a <lcd_init>
+       adc_sampling_init();
+ 5ce:  05 d1           rcall   .+522           ; 0x7da <adc_sampling_init>
+
+       sei();
+ 5d0:  78 94           sei
+
+       lcd_goto(0, 0);
+ 5d2:  60 e0           ldi     r22, 0x00       ; 0
+ 5d4:  80 e0           ldi     r24, 0x00       ; 0
+ 5d6:  27 d2           rcall   .+1102          ; 0xa26 <lcd_goto>
+       lcd_print("Finding tones");
+ 5d8:  6c e0           ldi     r22, 0x0C       ; 12
+ 5da:  71 e0           ldi     r23, 0x01       ; 1
+ 5dc:  80 e0           ldi     r24, 0x00       ; 0
+ 5de:  6e d1           rcall   .+732           ; 0x8bc <lcd_print>
+
+       while (1) {
+               if (block_ready) {
+ 5e0:  80 91 04 03     lds     r24, 0x0304     ; 0x800304 <block_ready>
+ 5e4:  88 23           and     r24, r24
+ 5e6:  e1 f3           breq    .-8             ; 0x5e0 <main+0x22>
+                       // Analyze the collected samples
+                       analyze_block(samples, &f1, &f2);
+ 5e8:  ae 01           movw    r20, r28
+ 5ea:  4d 5f           subi    r20, 0xFD       ; 253
+ 5ec:  5f 4f           sbci    r21, 0xFF       ; 255
+ 5ee:  be 01           movw    r22, r28
+ 5f0:  6f 5f           subi    r22, 0xFF       ; 255
+ 5f2:  7f 4f           sbci    r23, 0xFF       ; 255
+ 5f4:  80 e0           ldi     r24, 0x00       ; 0
+ 5f6:  91 e0           ldi     r25, 0x01       ; 1
+ 5f8:  a4 dd           rcall   .-1208          ; 0x142 <analyze_block>
+
+                       // Decode the keypad character
+                       char key = decode_key(f1, f2);
+ 5fa:  6b 81           ldd     r22, Y+3        ; 0x03
+ 5fc:  7c 81           ldd     r23, Y+4        ; 0x04
+ 5fe:  89 81           ldd     r24, Y+1        ; 0x01
+ 600:  9a 81           ldd     r25, Y+2        ; 0x02
+ 602:  7b d0           rcall   .+246           ; 0x6fa <decode_key>
+ 604:  18 2f           mov     r17, r24
+
+                       // Display the detected character when a valid pair is found
+                       if (key != '\0') {
+ 606:  88 23           and     r24, r24
+ 608:  69 f0           breq    .+26            ; 0x624 <main+0x66>
+                               lcd_goto(0, 0);
+ 60a:  60 e0           ldi     r22, 0x00       ; 0
+ 60c:  80 e0           ldi     r24, 0x00       ; 0
+ 60e:  0b d2           rcall   .+1046          ; 0xa26 <lcd_goto>
+                               lcd_print("Key: ");
+ 610:  6a e1           ldi     r22, 0x1A       ; 26
+ 612:  71 e0           ldi     r23, 0x01       ; 1
+ 614:  80 e0           ldi     r24, 0x00       ; 0
+ 616:  52 d1           rcall   .+676           ; 0x8bc <lcd_print>
+                               lcd_putc(key);
+ 618:  81 2f           mov     r24, r17
+ 61a:  1f d2           rcall   .+1086          ; 0xa5a <lcd_putc>
+                               lcd_print("           ");
+ 61c:  60 e2           ldi     r22, 0x20       ; 32
+ 61e:  71 e0           ldi     r23, 0x01       ; 1
+ 620:  80 e0           ldi     r24, 0x00       ; 0
+ 622:  4c d1           rcall   .+664           ; 0x8bc <lcd_print>
+                       }
+
+                       // Show detected frequencies for debugging
+                       lcd_goto(1, 0);
+ 624:  60 e0           ldi     r22, 0x00       ; 0
+ 626:  81 e0           ldi     r24, 0x01       ; 1
+ 628:  fe d1           rcall   .+1020          ; 0xa26 <lcd_goto>
+                       lcd_print("F1:");
+ 62a:  6c e2           ldi     r22, 0x2C       ; 44
+ 62c:  71 e0           ldi     r23, 0x01       ; 1
+ 62e:  80 e0           ldi     r24, 0x00       ; 0
+ 630:  45 d1           rcall   .+650           ; 0x8bc <lcd_print>
+                       lcd_print_uint(f1, 4);
+ 632:  64 e0           ldi     r22, 0x04       ; 4
+ 634:  89 81           ldd     r24, Y+1        ; 0x01
+ 636:  9a 81           ldd     r25, Y+2        ; 0x02
+ 638:  67 df           rcall   .-306           ; 0x508 <lcd_print_uint>
+                       lcd_print(" F2:");
+ 63a:  60 e3           ldi     r22, 0x30       ; 48
+ 63c:  71 e0           ldi     r23, 0x01       ; 1
+ 63e:  80 e0           ldi     r24, 0x00       ; 0
+ 640:  3d d1           rcall   .+634           ; 0x8bc <lcd_print>
+                       lcd_print_uint(f2, 4);
+ 642:  64 e0           ldi     r22, 0x04       ; 4
+ 644:  8b 81           ldd     r24, Y+3        ; 0x03
+ 646:  9c 81           ldd     r25, Y+4        ; 0x04
+ 648:  5f df           rcall   .-322           ; 0x508 <lcd_print_uint>
+
+                       // Restart sampling atomically
+                       cli();
+ 64a:  f8 94           cli
+
+                       sample_index = 0;
+ 64c:  10 92 03 03     sts     0x0303, r1      ; 0x800303 <sample_index+0x1>
+ 650:  10 92 02 03     sts     0x0302, r1      ; 0x800302 <sample_index>
+                       block_ready = 0;
+ 654:  10 92 04 03     sts     0x0304, r1      ; 0x800304 <block_ready>
+                       TIMSK0 |= (1 << OCIE0A);
+ 658:  ee e6           ldi     r30, 0x6E       ; 110
+ 65a:  f0 e0           ldi     r31, 0x00       ; 0
+ 65c:  80 81           ld      r24, Z
+ 65e:  82 60           ori     r24, 0x02       ; 2
+ 660:  80 83           st      Z, r24
+
+                       sei();
+ 662:  78 94           sei
+ 664:  bd cf           rjmp    .-134           ; 0x5e0 <main+0x22>
+
+Disassembly of section .text.libgcc.mul:
+
+0000092a <__mulsi3>:
+ 92a:  db 01           movw    r26, r22
+ 92c:  8f 93           push    r24
+ 92e:  9f 93           push    r25
+ 930:  48 d0           rcall   .+144           ; 0x9c2 <__muluhisi3>
+ 932:  bf 91           pop     r27
+ 934:  af 91           pop     r26
+ 936:  a2 9f           mul     r26, r18
+ 938:  80 0d           add     r24, r0
+ 93a:  91 1d           adc     r25, r1
+ 93c:  a3 9f           mul     r26, r19
+ 93e:  90 0d           add     r25, r0
+ 940:  b2 9f           mul     r27, r18
+ 942:  90 0d           add     r25, r0
+ 944:  11 24           eor     r1, r1
+ 946:  08 95           ret
+
+Disassembly of section .text.libgcc.mul:
+
+00000980 <__umulhisi3>:
+ 980:  a2 9f           mul     r26, r18
+ 982:  b0 01           movw    r22, r0
+ 984:  b3 9f           mul     r27, r19
+ 986:  c0 01           movw    r24, r0
+ 988:  a3 9f           mul     r26, r19
+ 98a:  01 d0           rcall   .+2             ; 0x98e <__umulhisi3+0xe>
+ 98c:  b2 9f           mul     r27, r18
+ 98e:  70 0d           add     r23, r0
+ 990:  81 1d           adc     r24, r1
+ 992:  11 24           eor     r1, r1
+ 994:  91 1d           adc     r25, r1
+ 996:  08 95           ret
+
+Disassembly of section .text.libgcc.mul:
+
+00000a32 <__usmulhisi3>:
+ a32:  a6 df           rcall   .-180           ; 0x980 <__umulhisi3>
+
+00000a34 <__usmulhisi3_tail>:
+ a34:  b7 ff           sbrs    r27, 7
+ a36:  08 95           ret
+ a38:  82 1b           sub     r24, r18
+ a3a:  93 0b           sbc     r25, r19
+ a3c:  08 95           ret
+
+Disassembly of section .text.libgcc.mul:
+
+000009c2 <__muluhisi3>:
+ 9c2:  de df           rcall   .-68            ; 0x980 <__umulhisi3>
+ 9c4:  a5 9f           mul     r26, r21
+ 9c6:  90 0d           add     r25, r0
+ 9c8:  b4 9f           mul     r27, r20
+ 9ca:  90 0d           add     r25, r0
+ 9cc:  a4 9f           mul     r26, r20
+ 9ce:  80 0d           add     r24, r0
+ 9d0:  91 1d           adc     r25, r1
+ 9d2:  11 24           eor     r1, r1
+ 9d4:  08 95           ret
+
+Disassembly of section .text.libgcc.mul:
+
+00000a3e <__mulshisi3>:
+ a3e:  b7 ff           sbrs    r27, 7
+ a40:  c0 cf           rjmp    .-128           ; 0x9c2 <__muluhisi3>
+
+00000a42 <__mulohisi3>:
+ a42:  bf df           rcall   .-130           ; 0x9c2 <__muluhisi3>
+ a44:  82 1b           sub     r24, r18
+ a46:  93 0b           sbc     r25, r19
+ a48:  08 95           ret
+
+Disassembly of section .text.libgcc:
+
+00000a08 <__xload_2>:
+ a08:  57 fd           sbrc    r21, 7
+ a0a:  03 c0           rjmp    .+6             ; 0xa12 <__xload_2+0xa>
+ a0c:  65 91           lpm     r22, Z+
+ a0e:  75 91           lpm     r23, Z+
+ a10:  08 95           ret
+ a12:  61 91           ld      r22, Z+
+ a14:  71 91           ld      r23, Z+
+ a16:  08 95           ret
+
+Disassembly of section .text.__dummy_fini:
+
+00000a60 <_fini>:
+ a60:  08 95           ret
+
+Disassembly of section .text.__dummy_funcs_on_exit:
+
+00000a62 <__funcs_on_exit>:
+ a62:  08 95           ret
+
+Disassembly of section .text.__dummy_simulator_exit:
+
+00000a64 <__simulator_exit>:
+ a64:  08 95           ret
+
+Disassembly of section .text.exit:
+
+00000a18 <exit>:
+ a18:  ec 01           movw    r28, r24
+ a1a:  23 d0           rcall   .+70            ; 0xa62 <__funcs_on_exit>
+ a1c:  21 d0           rcall   .+66            ; 0xa60 <_fini>
+ a1e:  ce 01           movw    r24, r28
+ a20:  21 d0           rcall   .+66            ; 0xa64 <__simulator_exit>
+ a22:  ce 01           movw    r24, r28
+ a24:  20 d0           rcall   .+64            ; 0xa66 <_Exit>
+
+Disassembly of section .text._Exit:
+
+00000a66 <_Exit>:
+ a66:  0f db           rcall   .-2530          ; 0x86 <_exit>
diff --git a/halloween_puff/Debug/halloween_puff.map b/halloween_puff/Debug/halloween_puff.map
new file mode 100644 (file)
index 0000000..c15aa7b
--- /dev/null
@@ -0,0 +1,783 @@
+Archive member included to satisfy reference by file (symbol)
+
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+                              main.o (__mulsi3)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+                              main.o (__do_clear_bss)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+                              main.o (__umulhisi3)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+                              main.o (__usmulhisi3)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+                              c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o) (__muluhisi3)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+                              main.o (__mulshisi3)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+                              main.o (__xload_2)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+                              C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o (exit)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+                              c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o) (_Exit)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+                              c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o) (_exit)
+
+Discarded input sections
+
+ .data          0x0000000000000000        0x0 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ .bss           0x0000000000000000        0x0 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ .text          0x0000000000000000        0x0 main.o
+ .data          0x0000000000000000        0x0 main.o
+ .bss           0x0000000000000000        0x0 main.o
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+ .stack.descriptors
+                0x0000000000000000       0x16 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+ .text.libgcc.div
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+ .text.libgcc   0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+ .text.libgcc.prologue
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+ .text.libgcc.builtins
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+ .text.libgcc.fmul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+ .text.libgcc.fixed
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.mul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.div
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc   0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.prologue
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.builtins
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.fmul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.fixed
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+ .stack.descriptors
+                0x0000000000000000       0x19 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+ .text.libgcc.div
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+ .text.libgcc   0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+ .text.libgcc.prologue
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+ .text.libgcc.builtins
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+ .text.libgcc.fmul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+ .text.libgcc.fixed
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+ .stack.descriptors
+                0x0000000000000000       0x39 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+ .text.libgcc.div
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+ .text.libgcc   0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+ .text.libgcc.prologue
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+ .text.libgcc.builtins
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+ .text.libgcc.fmul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+ .text.libgcc.fixed
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+ .stack.descriptors
+                0x0000000000000000       0x19 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+ .text.libgcc.div
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+ .text.libgcc   0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+ .text.libgcc.prologue
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+ .text.libgcc.builtins
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+ .text.libgcc.fmul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+ .text.libgcc.fixed
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+ .stack.descriptors
+                0x0000000000000000       0x32 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+ .text.libgcc.div
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+ .text.libgcc   0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+ .text.libgcc.prologue
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+ .text.libgcc.builtins
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+ .text.libgcc.fmul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+ .text.libgcc.fixed
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+ .text.libgcc.mul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+ .text.libgcc.div
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+ .text.libgcc.prologue
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+ .stack.descriptors
+                0x0000000000000000       0x17 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+ .text.libgcc.builtins
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+ .text.libgcc.fmul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+ .text.libgcc.fixed
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.mul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.div
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc   0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.prologue
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .stack.descriptors
+                0x0000000000000000       0x13 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.builtins
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.fmul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.fixed
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+
+Memory Configuration
+
+Name             Origin             Length             Attributes
+text             0x0000000000000000 0x0000000000002000 xr
+data             0x0000000000800100 0x0000000000000400 rw !x
+eeprom           0x0000000000810000 0x0000000000000200 rw !x
+fuse             0x0000000000820000 0x0000000000000003 rw !x
+lock             0x0000000000830000 0x0000000000000400 rw !x
+signature        0x0000000000840000 0x0000000000000400 rw !x
+user_signatures  0x0000000000850000 0x0000000000000400 rw !x
+*default*        0x0000000000000000 0xffffffffffffffff
+
+Linker script and memory map
+
+Address of section .data set to 0x800100
+LOAD C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+LOAD main.o
+START GROUP
+LOAD c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libm.a
+END GROUP
+START GROUP
+LOAD c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a
+LOAD c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libm.a
+LOAD c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a
+LOAD C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const\libatmega88p.a
+END GROUP
+                0x0000000000000000                __TEXT_REGION_ORIGIN__ = DEFINED (__TEXT_REGION_ORIGIN__)?__TEXT_REGION_ORIGIN__:0x0
+                [0x0000000000800100]                __DATA_REGION_ORIGIN__ = DEFINED (__DATA_REGION_ORIGIN__)?__DATA_REGION_ORIGIN__:0x800060
+                [0x0000000000002000]                __TEXT_REGION_LENGTH__ = DEFINED (__TEXT_REGION_LENGTH__)?__TEXT_REGION_LENGTH__:0x2000
+                [0x0000000000000400]                __DATA_REGION_LENGTH__ = DEFINED (__DATA_REGION_LENGTH__)?__DATA_REGION_LENGTH__:0xffa0
+                [0x0000000000000200]                __EEPROM_REGION_LENGTH__ = DEFINED (__EEPROM_REGION_LENGTH__)?__EEPROM_REGION_LENGTH__:0x10000
+                [0x0000000000000003]                __FUSE_REGION_LENGTH__ = DEFINED (__FUSE_REGION_LENGTH__)?__FUSE_REGION_LENGTH__:0x400
+                0x0000000000000400                __LOCK_REGION_LENGTH__ = DEFINED (__LOCK_REGION_LENGTH__)?__LOCK_REGION_LENGTH__:0x400
+                0x0000000000000400                __SIGNATURE_REGION_LENGTH__ = DEFINED (__SIGNATURE_REGION_LENGTH__)?__SIGNATURE_REGION_LENGTH__:0x400
+                0x0000000000000400                __USER_SIGNATURE_REGION_LENGTH__ = DEFINED (__USER_SIGNATURE_REGION_LENGTH__)?__USER_SIGNATURE_REGION_LENGTH__:0x400
+
+.hash
+ *(.hash)
+
+.dynsym
+ *(.dynsym)
+
+.dynstr
+ *(.dynstr)
+
+.gnu.version
+ *(.gnu.version)
+
+.gnu.version_d
+ *(.gnu.version_d)
+
+.gnu.version_r
+ *(.gnu.version_r)
+
+.rel.init
+ *(.rel.init)
+
+.rela.init
+ *(.rela.init)
+
+.rel.text
+ *(.rel.text)
+ *(.rel.text.*)
+ *(.rel.gnu.linkonce.t*)
+
+.rela.text
+ *(.rela.text)
+ *(.rela.text.*)
+ *(.rela.gnu.linkonce.t*)
+
+.rel.fini
+ *(.rel.fini)
+
+.rela.fini
+ *(.rela.fini)
+
+.rel.rodata
+ *(.rel.rodata)
+ *(.rel.rodata.*)
+ *(.rel.gnu.linkonce.r*)
+
+.rela.rodata
+ *(.rela.rodata)
+ *(.rela.rodata.*)
+ *(.rela.gnu.linkonce.r*)
+
+.rel.data
+ *(.rel.data)
+ *(.rel.data.*)
+ *(.rel.gnu.linkonce.d*)
+
+.rela.data
+ *(.rela.data)
+ *(.rela.data.*)
+ *(.rela.gnu.linkonce.d*)
+
+.rel.ctors
+ *(.rel.ctors)
+
+.rela.ctors
+ *(.rela.ctors)
+
+.rel.dtors
+ *(.rel.dtors)
+
+.rela.dtors
+ *(.rela.dtors)
+
+.rel.got
+ *(.rel.got)
+
+.rela.got
+ *(.rela.got)
+
+.rel.bss
+ *(.rel.bss)
+
+.rela.bss
+ *(.rela.bss)
+
+.rel.plt
+ *(.rel.plt)
+
+.rela.plt
+ *(.rela.plt)
+
+.text           0x0000000000000000       0x8a
+ *(.vectors)
+ .vectors       0x0000000000000000       0x34 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+                0x0000000000000000                __vector_default
+                0x0000000000000000                __vectors
+ *(.vectors)
+ *(.progmem.gcc*)
+ *(.dinit)
+ .dinit         0x0000000000000034        0x5 data_init
+                0x000000000000003a                . = ALIGN (0x2)
+ *fill*         0x0000000000000039        0x1 
+                0x000000000000003a                __trampolines_start = .
+ *(.trampolines)
+ .trampolines   0x000000000000003a        0x0 linker stubs
+ *(.trampolines*)
+                0x000000000000003a                __trampolines_end = .
+ *libprintf_flt.a:*(.progmem.data)
+ *libc.a:*(.progmem.data)
+                0x000000000000003a                . = ALIGN (0x2)
+ *(.jumptables)
+ *(.jumptables*)
+ *(.lowtext)
+ *(.lowtext*)
+                0x000000000000003a                __ctors_start = .
+ *(.ctors)
+                0x000000000000003a                __ctors_end = .
+                0x000000000000003a                __dtors_start = .
+ *(.dtors)
+                0x000000000000003a                __dtors_end = .
+ SORT(*)(.ctors)
+ SORT(*)(.dtors)
+ *(.init0)
+ .init0         0x000000000000003a        0x0 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+                0x000000000000003a                __init
+ *(.init0)
+ *(.init1)
+ *(.init1)
+ *(.init2)
+ .init2         0x000000000000003a        0xc C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ *(.init2)
+ *(.init3)
+ *(.init3)
+ *(.init4)
+ .init4         0x0000000000000046       0x3c c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+                0x0000000000000046                __do_copy_data
+                0x0000000000000074                __do_clear_bss
+ *(.init4)
+ *(.init5)
+ *(.init5)
+ *(.init6)
+ *(.init6)
+ *(.init7)
+ *(.init7)
+ *(.init8)
+ *(.init8)
+ *(.init9)
+ .init9         0x0000000000000082        0x4 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ *(.init9)
+                0x0000000000000086                . = ALIGN (0x2)
+ *(.fini9)
+ .fini9         0x0000000000000086        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+                0x0000000000000086                _exit
+ *(.fini9)
+ *(.fini8)
+ *(.fini8)
+ *(.fini7)
+ *(.fini7)
+ *(.fini6)
+ *(.fini6)
+ *(.fini5)
+ *(.fini5)
+ *(.fini4)
+ *(.fini4)
+ *(.fini3)
+ *(.fini3)
+ *(.fini2)
+ *(.fini2)
+ *(.fini1)
+ *(.fini1)
+ *(.fini0)
+ .fini0         0x0000000000000086        0x4 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ *(.fini0)
+                0x000000000000008a                _etext = .
+
+.data           0x0000000000800100        0x0 load address 0x000000000000008a
+                [!provide]                        PROVIDE (__data_start, .)
+ *(.gnu.linkonce.d*)
+ *(.gnu.linkonce.r*)
+                0x0000000000800100                . = ALIGN (0x2)
+                0x0000000000800100                _edata = .
+                [!provide]                        PROVIDE (__data_end, .)
+
+.bss            0x0000000000800100        0x0
+                [!provide]                        PROVIDE (__bss_start, .)
+ *(COMMON)
+                [!provide]                        PROVIDE (__bss_end, .)
+                0x000000000000008a                __data_load_start = LOADADDR (.data)
+                0x000000000000008a                __data_load_end = (__data_load_start + SIZEOF (.data))
+
+.noinit         0x0000000000800100        0x0
+                [!provide]                        PROVIDE (__noinit_start, .)
+ *(.noinit*)
+                [!provide]                        PROVIDE (__noinit_end, .)
+                0x0000000000800100                _end = .
+
+.eeprom         0x0000000000810000        0x0
+ *(.eeprom*)
+                0x0000000000810000                __eeprom_end = .
+
+.fuse
+ *(.fuse)
+ *(.lfuse)
+ *(.hfuse)
+ *(.efuse)
+
+.lock
+ *(.lock*)
+
+.signature
+ *(.signature*)
+
+.user_signatures
+ *(.user_signatures*)
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+
+.stab.excl
+ *(.stab.excl)
+
+.stab.exclstr
+ *(.stab.exclstr)
+
+.stab.index
+ *(.stab.index)
+
+.stab.indexstr
+ *(.stab.indexstr)
+
+.comment        0x0000000000000000       0x2f
+ *(.comment)
+ .comment       0x0000000000000000       0x2f main.o
+                                         0x30 (size before relaxing)
+ .comment       0x000000000000002f       0x30 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+ .comment       0x000000000000002f       0x30 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+
+.stack.descriptors.hdr
+                0x0000000000000000       0x62
+ .stack.descriptors.hdr
+                0x0000000000000000        0xe c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+ .stack.descriptors.hdr
+                0x000000000000000e        0xe c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+ .stack.descriptors.hdr
+                0x000000000000001c        0xe c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+ .stack.descriptors.hdr
+                0x000000000000002a        0xe c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+ .stack.descriptors.hdr
+                0x0000000000000038        0xe c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+ .stack.descriptors.hdr
+                0x0000000000000046        0xe c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+ .stack.descriptors.hdr
+                0x0000000000000054        0xe c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+
+.note.GNU-stack
+                0x0000000000000000        0x0
+ .note.GNU-stack
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+ .note.GNU-stack
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+
+.note.gnu.build-id
+ *(.note.gnu.build-id)
+
+.debug
+ *(.debug)
+
+.line
+ *(.line)
+
+.debug_srcinfo
+ *(.debug_srcinfo)
+
+.debug_sfnames
+ *(.debug_sfnames)
+
+.debug_aranges  0x0000000000000000       0xd8
+ *(.debug_aranges)
+ .debug_aranges
+                0x0000000000000000       0xd8 main.o
+
+.debug_pubnames
+ *(.debug_pubnames)
+
+.debug_info     0x0000000000000000     0x1650
+ *(.debug_info .gnu.linkonce.wi.*)
+ .debug_info    0x0000000000000000      0x5f4 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ .debug_info    0x00000000000005f4     0x105c main.o
+
+.debug_abbrev   0x0000000000000000      0x87b
+ *(.debug_abbrev)
+ .debug_abbrev  0x0000000000000000      0x5a2 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ .debug_abbrev  0x00000000000005a2      0x2d9 main.o
+
+.debug_line     0x0000000000000000      0x8a4
+ *(.debug_line .debug_line.* .debug_line_end)
+ .debug_line    0x0000000000000000      0x137 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ .debug_line    0x0000000000000137      0x76d main.o
+
+.debug_frame    0x0000000000000000      0x2c4
+ *(.debug_frame)
+ .debug_frame   0x0000000000000000      0x2c4 main.o
+
+.debug_str      0x0000000000000000      0x233
+ *(.debug_str)
+ .debug_str     0x0000000000000000      0x208 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ .debug_str     0x0000000000000208       0x2b main.o
+
+.debug_loc      0x0000000000000000      0xdf0
+ *(.debug_loc)
+ .debug_loc     0x0000000000000000      0xdf0 main.o
+
+.debug_macinfo
+ *(.debug_macinfo)
+
+.debug_weaknames
+ *(.debug_weaknames)
+
+.debug_funcnames
+ *(.debug_funcnames)
+
+.debug_typenames
+ *(.debug_typenames)
+
+.debug_varnames
+ *(.debug_varnames)
+
+.debug_pubtypes
+ *(.debug_pubtypes)
+
+.debug_ranges   0x0000000000000000      0x128
+ *(.debug_ranges)
+ .debug_ranges  0x0000000000000000      0x128 main.o
+
+.debug_macro
+ *(.debug_macro)
+OUTPUT(halloween_puff.elf elf32-avr)
+LOAD linker stubs
+LOAD data_init
+
+.note.gnu.avr.deviceinfo
+                0x0000000000000000       0x3c
+ .note.gnu.avr.deviceinfo
+                0x0000000000000000       0x3c C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+
+.bss.adc_count  0x0000000000800300        0x2
+ .bss.adc_count
+                0x0000000000800300        0x2 main.o
+                0x0000000000800300                adc_count
+
+.bss.block_ready
+                0x0000000000800304        0x1
+ .bss.block_ready
+                0x0000000000800304        0x1 main.o
+
+.bss.sample_index
+                0x0000000000800302        0x2
+ .bss.sample_index
+                0x0000000000800302        0x2 main.o
+
+.bss.samples    0x0000000000800100      0x200
+ .bss.samples   0x0000000000800100      0x200 main.o
+
+.progmemx.data.coeff
+                0x000000000000008a       0x82
+ .progmemx.data.coeff
+                0x000000000000008a       0x82 main.o
+
+.progmemx.data  0x000000000000010c       0x29
+ .progmemx.data
+                0x000000000000010c       0x29 main.o
+
+.progmemx.data.keypad.2090
+                0x0000000000000135        0xc
+ .progmemx.data.keypad.2090
+                0x0000000000000135        0xc main.o
+
+.text.analyze_block
+                0x0000000000000142      0x3c6
+ .text.analyze_block
+                0x0000000000000142      0x3c6 main.o
+
+.text.lcd_print_uint
+                0x0000000000000508       0xb6
+ .text.lcd_print_uint
+                0x0000000000000508       0xb6 main.o
+
+.text.main      0x00000000000005be       0xa8
+ .text.main     0x00000000000005be       0xa8 main.o
+                0x00000000000005be                main
+
+.text.__vector_21
+                0x0000000000000666       0x94
+ .text.__vector_21
+                0x0000000000000666       0x94 main.o
+                0x0000000000000666                __vector_21
+
+.text.decode_key
+                0x00000000000006fa       0x70
+ .text.decode_key
+                0x00000000000006fa       0x70 main.o
+
+.text.lcd_init  0x000000000000076a       0x70
+ .text.lcd_init
+                0x000000000000076a       0x70 main.o
+
+.text.adc_sampling_init
+                0x00000000000007da       0x3e
+ .text.adc_sampling_init
+                0x00000000000007da       0x3e main.o
+
+.text.get_row   0x0000000000000818       0x3c
+ .text.get_row  0x0000000000000818       0x3c main.o
+
+.text.__vector_14
+                0x0000000000000854       0x3a
+ .text.__vector_14
+                0x0000000000000854       0x3a main.o
+                0x0000000000000854                __vector_14
+
+.text.get_column
+                0x000000000000088e       0x2e
+ .text.get_column
+                0x000000000000088e       0x2e main.o
+
+.text.lcd_print
+                0x00000000000008bc       0x2a
+ .text.lcd_print
+                0x00000000000008bc       0x2a main.o
+
+.text.lcd_pulse_enable
+                0x00000000000008e6       0x26
+ .text.lcd_pulse_enable
+                0x00000000000008e6       0x26 main.o
+
+.text.lcd_command
+                0x000000000000090c       0x1e
+ .text.lcd_command
+                0x000000000000090c       0x1e main.o
+
+.text.libgcc.mul
+                0x000000000000092a       0x1e
+ .text.libgcc.mul
+                0x000000000000092a       0x1e c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulsi3.o)
+                0x000000000000092a                __mulsi3
+
+.text.i2c_write_byte
+                0x0000000000000948       0x1c
+ .text.i2c_write_byte
+                0x0000000000000948       0x1c main.o
+
+.text.lcd_send  0x0000000000000964       0x1c
+ .text.lcd_send
+                0x0000000000000964       0x1c main.o
+
+.text.libgcc.mul
+                0x0000000000000980       0x18
+ .text.libgcc.mul
+                0x0000000000000980       0x18 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_umulhisi3.o)
+                0x0000000000000980                __umulhisi3
+
+.text.lcd_write4
+                0x0000000000000998       0x16
+ .text.lcd_write4
+                0x0000000000000998       0x16 main.o
+
+.text.i2c_write
+                0x00000000000009ae       0x14
+ .text.i2c_write
+                0x00000000000009ae       0x14 main.o
+
+.text.libgcc.mul
+                0x00000000000009c2       0x14
+ .text.libgcc.mul
+                0x00000000000009c2       0x14 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_muluhisi3.o)
+                0x00000000000009c2                __muluhisi3
+
+.text.i2c_init  0x00000000000009d6       0x12
+ .text.i2c_init
+                0x00000000000009d6       0x12 main.o
+
+.text.i2c_start
+                0x00000000000009e8       0x10
+ .text.i2c_start
+                0x00000000000009e8       0x10 main.o
+
+.text.i2c_stop  0x00000000000009f8       0x10
+ .text.i2c_stop
+                0x00000000000009f8       0x10 main.o
+
+.text.libgcc    0x0000000000000a08       0x10
+ .text.libgcc   0x0000000000000a08       0x10 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_xload_2.o)
+                0x0000000000000a08                __xload_2
+
+.text.exit      0x0000000000000a18        0xe
+ .text.exit     0x0000000000000a18        0xe c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+                0x0000000000000a18                exit
+
+.text.lcd_goto  0x0000000000000a26        0xc
+ .text.lcd_goto
+                0x0000000000000a26        0xc main.o
+
+.text.libgcc.mul
+                0x0000000000000a32        0xc
+ .text.libgcc.mul
+                0x0000000000000a32        0xc c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_usmulhisi3.o)
+                0x0000000000000a32                __usmulhisi3
+                0x0000000000000a34                __usmulhisi3_tail
+
+.text.libgcc.mul
+                0x0000000000000a3e        0xc
+ .text.libgcc.mul
+                0x0000000000000a3e        0xc c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_mulshisi3.o)
+                0x0000000000000a3e                __mulshisi3
+                0x0000000000000a42                __mulohisi3
+
+.text.lcd_expander_write
+                0x0000000000000a4a        0xa
+ .text.lcd_expander_write
+                0x0000000000000a4a        0xa main.o
+
+.text.lcd_data  0x0000000000000a54        0x6
+ .text.lcd_data
+                0x0000000000000a54        0x6 main.o
+
+.text.lcd_putc  0x0000000000000a5a        0x4
+ .text.lcd_putc
+                0x0000000000000a5a        0x4 main.o
+
+.text           0x0000000000000a5e        0x2
+ .text          0x0000000000000a5e        0x2 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+                0x0000000000000a5e                __vector_22
+                0x0000000000000a5e                __vector_1
+                0x0000000000000a5e                __vector_24
+                0x0000000000000a5e                __vector_12
+                0x0000000000000a5e                __bad_interrupt
+                0x0000000000000a5e                __vector_6
+                0x0000000000000a5e                __vector_3
+                0x0000000000000a5e                __vector_23
+                0x0000000000000a5e                __vector_25
+                0x0000000000000a5e                __vector_11
+                0x0000000000000a5e                __vector_13
+                0x0000000000000a5e                __vector_17
+                0x0000000000000a5e                __vector_19
+                0x0000000000000a5e                __vector_7
+                0x0000000000000a5e                __vector_5
+                0x0000000000000a5e                __vector_4
+                0x0000000000000a5e                __vector_9
+                0x0000000000000a5e                __vector_2
+                0x0000000000000a5e                __vector_15
+                0x0000000000000a5e                __vector_8
+                0x0000000000000a5e                __vector_10
+                0x0000000000000a5e                __vector_16
+                0x0000000000000a5e                __vector_18
+                0x0000000000000a5e                __vector_20
+
+.text.__dummy_fini
+                0x0000000000000a60        0x2
+ .text.__dummy_fini
+                0x0000000000000a60        0x2 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+                0x0000000000000a60                _fini
+
+.text.__dummy_funcs_on_exit
+                0x0000000000000a62        0x2
+ .text.__dummy_funcs_on_exit
+                0x0000000000000a62        0x2 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+                0x0000000000000a62                __funcs_on_exit
+
+.text.__dummy_simulator_exit
+                0x0000000000000a64        0x2
+ .text.__dummy_simulator_exit
+                0x0000000000000a64        0x2 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+                0x0000000000000a64                __simulator_exit
+
+.text._Exit     0x0000000000000a66        0x2
+ .text._Exit    0x0000000000000a66        0x2 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+                0x0000000000000a66                _Exit
diff --git a/halloween_puff/Debug/main.d b/halloween_puff/Debug/main.d
new file mode 100644 (file)
index 0000000..4b3499b
--- /dev/null
@@ -0,0 +1,52 @@
+main.d main.o: .././main.c \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\io.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\sfr_defs.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\inttypes.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\features.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\lib\gcc\avr\5.4.0\include\stdint.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\stdint.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\bits\alltypes.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\bits\stdint.h \
+ C:/Program\ Files\ (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/include/avr/iom88p.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\portpins.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\common.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\fuse.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\lock.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\interrupt.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\util\delay.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\util\delay_basic.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\math.h
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\io.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\sfr_defs.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\inttypes.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\features.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\lib\gcc\avr\5.4.0\include\stdint.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\stdint.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\bits\alltypes.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\bits\stdint.h:
+
+C:/Program\ Files\ (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/include/avr/iom88p.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\portpins.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\common.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\fuse.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\lock.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\interrupt.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\util\delay.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\util\delay_basic.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\math.h:
diff --git a/halloween_puff/Debug/main.o b/halloween_puff/Debug/main.o
new file mode 100644 (file)
index 0000000..bd2f0d4
Binary files /dev/null and b/halloween_puff/Debug/main.o differ
diff --git a/halloween_puff/Debug/makedep.mk b/halloween_puff/Debug/makedep.mk
new file mode 100644 (file)
index 0000000..6a14fde
--- /dev/null
@@ -0,0 +1,6 @@
+################################################################################
+# Automatically-generated file. Do not edit or delete the file
+################################################################################
+
+main.c
+
diff --git a/halloween_puff/Debug/memoryfile.xml b/halloween_puff/Debug/memoryfile.xml
new file mode 100644 (file)
index 0000000..f40a207
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<project>                                  
+  <executable name="halloween_puff.elf">                 
+    <memory name="program">              
+      <units>bytes</units>                 
+      <length>8192</length>                 
+      <used>2663</used>                     
+      <free>5529</free>                     
+    </memory>                              
+    <memory name="data">                 
+      <units>bytes</units>                 
+      <length>1024</length>                 
+      <used>517</used>                     
+      <free>507</free>                     
+    </memory>                              
+  </executable>                            
+</project>                                 
diff --git a/halloween_puff/Release/Makefile b/halloween_puff/Release/Makefile
new file mode 100644 (file)
index 0000000..c74f7e6
--- /dev/null
@@ -0,0 +1,125 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+SHELL := cmd.exe
+RM := rm -rf
+
+USER_OBJS :=
+
+LIBS := 
+PROJ := 
+
+O_SRCS := 
+C_SRCS := 
+S_SRCS := 
+S_UPPER_SRCS := 
+OBJ_SRCS := 
+ASM_SRCS := 
+PREPROCESSING_SRCS := 
+OBJS := 
+OBJS_AS_ARGS := 
+C_DEPS := 
+C_DEPS_AS_ARGS := 
+EXECUTABLES := 
+OUTPUT_FILE_PATH :=
+OUTPUT_FILE_PATH_AS_ARGS :=
+AVR_APP_PATH :=$$$AVR_APP_PATH$$$
+QUOTE := "
+ADDITIONAL_DEPENDENCIES:=
+OUTPUT_FILE_DEP:=
+LIB_DEP:=
+LINKER_SCRIPT_DEP:=
+
+# Every subdirectory with source files must be described here
+SUBDIRS := 
+
+
+# Add inputs and outputs from these tool invocations to the build variables 
+C_SRCS +=  \
+../main.c
+
+
+PREPROCESSING_SRCS += 
+
+
+ASM_SRCS += 
+
+
+OBJS +=  \
+main.o
+
+OBJS_AS_ARGS +=  \
+main.o
+
+C_DEPS +=  \
+main.d
+
+C_DEPS_AS_ARGS +=  \
+main.d
+
+OUTPUT_FILE_PATH +=halloween_puff.elf
+
+OUTPUT_FILE_PATH_AS_ARGS +=halloween_puff.elf
+
+ADDITIONAL_DEPENDENCIES:=
+
+OUTPUT_FILE_DEP:= ./makedep.mk
+
+LIB_DEP+= 
+
+LINKER_SCRIPT_DEP+= 
+
+
+# AVR32/GNU C Compiler
+./main.o: .././main.c
+       @echo Building file: $<
+       @echo Invoking: XC8 C Compiler : 2.36
+       $(QUOTE)C:\Program Files\Microchip\xc8\v2.36\bin\xc8-cc.exe$(QUOTE)  -mcpu=ATmega88P  -mdfp="C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\xc8"  -c -x c -funsigned-char -funsigned-bitfields -mext=cci -D__ATmega88P__ -DNDEBUG  -Os -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -Wall -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"   -o "$@" "$<" 
+       @echo Finished building: $<
+       
+
+
+
+
+# AVR32/GNU Preprocessing Assembler
+
+
+
+# AVR32/GNU Assembler
+
+
+
+
+ifneq ($(MAKECMDGOALS),clean)
+ifneq ($(strip $(C_DEPS)),)
+-include $(C_DEPS)
+endif
+endif
+
+# Add inputs and outputs from these tool invocations to the build variables 
+
+# All Target
+all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES)
+
+$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP) $(LINKER_SCRIPT_DEP)
+       @echo Building target: $@
+       @echo Invoking:  XC8 C Linker : 2.36
+       $(QUOTE)C:\Program Files\Microchip\xc8\v2.36\bin\xc8-cc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -mcpu=ATmega88P  -mdfp="C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\xc8"  -Wl,-Map="halloween_puff.map" -funsigned-char -funsigned-bitfields -Wl,--start-group -Wl,-lm  -Wl,--end-group -Wl,--gc-sections -Os -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax --memorysummary,memoryfile.xml  
+       @echo Finished building target: $@
+       "C:\Program Files\Microchip\xc8\v2.36\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures  "halloween_puff.elf" "halloween_puff.hex"
+       "C:\Program Files\Microchip\xc8\v2.36\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "halloween_puff.elf" "halloween_puff.eep" || exit 0
+       "C:\Program Files\Microchip\xc8\v2.36\bin\avr-objdump.exe" -h -S "halloween_puff.elf" > "halloween_puff.lss"
+       
+       
+
+
+
+
+
+# Other Targets
+clean:
+       -$(RM) $(OBJS_AS_ARGS) $(EXECUTABLES)  
+       -$(RM) $(C_DEPS_AS_ARGS)   
+       rm -rf "halloween_puff.elf" "halloween_puff.hex" "halloween_puff.eep" "halloween_puff.map" "halloween_puff.usersignatures" "halloween_puff.a"  "halloween_puff.lss"
+       
\ No newline at end of file
diff --git a/halloween_puff/Release/halloween_puff.eep b/halloween_puff/Release/halloween_puff.eep
new file mode 100644 (file)
index 0000000..7c166a1
--- /dev/null
@@ -0,0 +1 @@
+:00000001FF
diff --git a/halloween_puff/Release/halloween_puff.elf b/halloween_puff/Release/halloween_puff.elf
new file mode 100644 (file)
index 0000000..e24e33d
Binary files /dev/null and b/halloween_puff/Release/halloween_puff.elf differ
diff --git a/halloween_puff/Release/halloween_puff.hex b/halloween_puff/Release/halloween_puff.hex
new file mode 100644 (file)
index 0000000..f0010a7
--- /dev/null
@@ -0,0 +1,101 @@
+:100000001FC046C045C044C043C042C041C040C0FC
+:100010003FC03EC03DC03CC03BC03AC039C038C004
+:1000200037C036C035C034C033C032C031C030C034
+:100030002FC02EC00100010C0005A4010C01158089
+:1000400011241FBECFEFD4E0DEBFCDBFE4E3F0E06C
+:1000500040E017C0B591A59135912591059107FD17
+:100060000CC095918591EF01F92FE82F05900D9225
+:10007000A217B307D9F7FE0104C01D92A217B30758
+:10008000E1F7E034F40731F76CD084C2F894FFCF85
+:02009000B7CFE8
+:1000920094EA9093BC009091BC0097FFFCCF880F2C
+:1000A2008093BB0084E88093BC008091BC0087FFF2
+:1000B200FCCF6093BB0084E88093BC008091BC00BD
+:1000C20087FFFCCF84E98093BC008091BC0084FD53
+:0400D200FCCF0895C2
+:1000D600CF93C82F682F6C6087E2D8DF00006C2FA3
+:1000E6006B7F686087E2D2DF80E18A95F1F700C016
+:0400F600CF91089509
+:1000FA001F93CF93DF93C82FD62FD860182F107F66
+:10010A001D2B612F686087E2BFDF812FDFDFC29579
+:10011A00C07FCD2B6C2F686087E2B6DF8C2FDF9112
+:06012A00CF911F91D3CF1D
+:10013000426F6D6220706C616E7465642100436F64
+:10014000756E74646F776E3A200050756666210094
+:1001500057726F6E672050494E210050494E3A2029
+:01016000009E
+:1001610000CF93DF93CDB7DEB763970FB6F894DE78
+:10017100BF0FBECDBF8AB18F718AB98BB1806E8B33
+:10018100B98AB18F608AB987B18B6087B918B81005
+:1001910092B90082E08093B80084E08093BC008330
+:1001A100ED90E30197F1F700C0000068E387E2708A
+:1001B100DF88E390DFA1EEB4E01197F1F700C00012
+:1001C1000068E387E265DF88E385DFB2E3BA95F192
+:1001D100F768E387E25DDF88E37DDFE2E3EA95F13B
+:1001E100F768E287E255DF88E275DFF2E3FA95F11D
+:1001F100F760E088E281DF60E088E07EDF60E08137
+:10020100E07BDF83EF91E00197F1F700C000006030
+:10021100E086E072DF60E08CE06FDF60E081E06C3F
+:10022100DFA3EFB1E01197F1F700C0000060E080BB
+:10023100E863DFACE5CA2EA1E0DA2EA0E0EA2E8069
+:10024100E561E05ADFF6018491E7FC8081BFEFCBE5
+:100251001ADB0AEB0A8111F4CF1D8681E08E8782B9
+:10026100E08F8783E0888B85E0898B86E08A8B87A6
+:10027100E08B8B8CE0E0E0F1E0DE01119601900D66
+:10028100928A95E1F760E001E010E0E8E0FE2EFAE5
+:10029100E09F2EFE013D9640E050E08AB1807F8ACA
+:1002A100B98BB1807F8BB92AB1DF01C801019002FE
+:1002B100C0880F991F0A94E2F7822B8AB99BB198E3
+:1002C100010C9002C0220F331F0A94E2F7822F80A3
+:1002D1009589238BB923E02A95F1F70000DE0151BE
+:1002E1009620E030E089B190E00D9002C0959587AD
+:1002F100950A94E2F780FF0CC02F5F3F4F23303106
+:100301000589F74F5F5F4F4430510539F660E0C111
+:10031100CFCA01880F991F840F951FA1E0B0E0ACEF
+:100321000FBD1F8A0F9B1FDC01A20FB31FBC90BB27
+:100331002041F36B1509F4ADCF80ED8B0D8A3010A0
+:10034100F580910C018730F0F4439AE3EDF0E3314D
+:1003510097F1F700C00000439880910C01E82FF05D
+:10036100E0E35FFE4FB08291E0980F90930C018B18
+:100371005F60E08068C1DE61E08B2DBEDE80910CA4
+:1003810001873011F06B2D85CF109214018FE4930A
+:10039100EC0197F1F700C000002DE031E087E8950E
+:1003A100E0A0E047E306C0FC014491A7FD408101C4
+:1003B10096A11DF90151919F015413BBC08D38F5D0
+:1003C100E09F07F0E0AF0779F760E081E095DEA3F9
+:1003D100EFB1E01197F1F700C0000060E080E88C18
+:1003E100DE82E430E3C32E31E0D32E30E0E32E2F62
+:1003F100EFC21AD20AE20A61E07FDEF6018491E7D8
+:10040100FC80818111F4CF6AE0A62E60E080EC745B
+:10041100DE83E45EE3C52E51E0D52E50E0E52E3FAC
+:10042100EFC31AD30AE30A61E067DEF6018491E7BC
+:10043100FC80818111F4CFFA2D27E6F202E12C1123
+:1004410024E594E594A7FCE39461E080E38E0D54E8
+:10045100DE8A2D3AE0E39E8019112461E0805D4C33
+:10046100DE61E080E249DEF6B881E086B9A7E8B353
+:10047100E11197F1F700C0000086B9BFE9EDEFF295
+:10048100E0B150E040F040E1F700C00000AA94A1C3
+:1004910010BCCF60E081E030DE83EF91E00197F1A5
+:1004A100F700C0000060E080E827DE80E54AE4C490
+:1004B1002E41E0D42E40E0E42E9FEFC91AD90AE97B
+:1004C1000A61E01ADEF6018491E7FC80818111F472
+:1004D100CF18B898B8AAE2B0E5EEEFF0E0A150B0BD
+:1004E10040E040F040D9F7000010920C0110920D4D
+:1004F1000160E081E001DE83EF91E00197F1F70017
+:10050100C0000060E080E8F8DD80E59BE5C92E9140
+:10051100E0D92E90E0E92E9FEFC91AD90AE90A61C4
+:10052100E0EBDDF6018491E7FC80818111F4CF6B72
+:100531002DB0CE60E081E0E0DDE3EFF1E03197F155
+:10054100F700C0000060E080E8D7DD87E520E5C264
+:100551002E21E0D22E20E0E22E2FEFC21AD20AE2A3
+:100561000A61E0CADDF6018491E7FC80818111F422
+:10057100CF3FE342E48FE0315040408040E1F7005B
+:05058100C00000B2CF34
+:080586003733353536303800FB
+:02058E000895CE
+:020590000895CC
+:020592000895CA
+:0E059400EC01FCDFFADFCE01FADFCE0100D071
+:0205A20074DD06
+:0C05A4003132333435363738392A3023F1
+:00000001FF
diff --git a/halloween_puff/Release/halloween_puff.lss b/halloween_puff/Release/halloween_puff.lss
new file mode 100644 (file)
index 0000000..325b508
--- /dev/null
@@ -0,0 +1,785 @@
+
+halloween_puff.elf:     file format elf32-avr
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .data         00000000  00800100  000005b0  00000664  2**0
+                  ALLOC, LOAD, DATA
+  1 .text         00000090  00000000  00000000  000000b4  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  2 .comment      0000002f  00000000  00000000  00000664  2**0
+                  CONTENTS, READONLY
+  3 .stack.descriptors.hdr 0000000e  00000000  00000000  00000693  2**0
+                  CONTENTS, READONLY
+  4 .debug_info   000005f4  00000000  00000000  000006a1  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  5 .debug_abbrev 000005a2  00000000  00000000  00000c95  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  6 .debug_line   00000137  00000000  00000000  00001237  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  7 .debug_str    00000208  00000000  00000000  0000136e  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  8 .text         00000002  00000090  00000090  00000144  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  9 .note.gnu.avr.deviceinfo 0000003c  00000000  00000000  00001578  2**2
+                  CONTENTS, READONLY, DEBUGGING
+ 10 .text.i2c_write_byte 00000044  00000092  00000092  00000146  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 11 .text.lcd_pulse_enable 00000024  000000d6  000000d6  0000018a  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 12 .text.lcd_send 00000036  000000fa  000000fa  000001ae  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 13 .progmemx.data 00000031  00000130  00000130  000001e4  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, PROGMEMX
+ 14 .rodata       0000000c  00800100  000005a4  00000658  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 15 .text.startup.main 00000425  00000161  00000161  00000215  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 16 .progmemx.data.correct_pin 00000008  00000586  00000586  0000063a  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, PROGMEMX
+ 17 .bss.pin_length 00000001  0080010c  0080010c  00000664  2**0
+                  ALLOC
+ 18 .bss.pin      00000008  0080010d  0080010d  00000664  2**0
+                  ALLOC
+ 19 .text.__dummy_fini 00000002  0000058e  0000058e  00000642  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 20 .text.__dummy_funcs_on_exit 00000002  00000590  00000590  00000644  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 21 .text.__dummy_simulator_exit 00000002  00000592  00000592  00000646  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 22 .text.exit    0000000e  00000594  00000594  00000648  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 23 .text._Exit   00000002  000005a2  000005a2  00000656  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+
+Disassembly of section .text:
+
+00000000 <__vectors>:
+   0:  1f c0           rjmp    .+62            ; 0x40 <__ctors_end>
+   2:  46 c0           rjmp    .+140           ; 0x90 <_etext>
+   4:  45 c0           rjmp    .+138           ; 0x90 <_etext>
+   6:  44 c0           rjmp    .+136           ; 0x90 <_etext>
+   8:  43 c0           rjmp    .+134           ; 0x90 <_etext>
+   a:  42 c0           rjmp    .+132           ; 0x90 <_etext>
+   c:  41 c0           rjmp    .+130           ; 0x90 <_etext>
+   e:  40 c0           rjmp    .+128           ; 0x90 <_etext>
+  10:  3f c0           rjmp    .+126           ; 0x90 <_etext>
+  12:  3e c0           rjmp    .+124           ; 0x90 <_etext>
+  14:  3d c0           rjmp    .+122           ; 0x90 <_etext>
+  16:  3c c0           rjmp    .+120           ; 0x90 <_etext>
+  18:  3b c0           rjmp    .+118           ; 0x90 <_etext>
+  1a:  3a c0           rjmp    .+116           ; 0x90 <_etext>
+  1c:  39 c0           rjmp    .+114           ; 0x90 <_etext>
+  1e:  38 c0           rjmp    .+112           ; 0x90 <_etext>
+  20:  37 c0           rjmp    .+110           ; 0x90 <_etext>
+  22:  36 c0           rjmp    .+108           ; 0x90 <_etext>
+  24:  35 c0           rjmp    .+106           ; 0x90 <_etext>
+  26:  34 c0           rjmp    .+104           ; 0x90 <_etext>
+  28:  33 c0           rjmp    .+102           ; 0x90 <_etext>
+  2a:  32 c0           rjmp    .+100           ; 0x90 <_etext>
+  2c:  31 c0           rjmp    .+98            ; 0x90 <_etext>
+  2e:  30 c0           rjmp    .+96            ; 0x90 <_etext>
+  30:  2f c0           rjmp    .+94            ; 0x90 <_etext>
+  32:  2e c0           rjmp    .+92            ; 0x90 <_etext>
+
+00000034 <.dinit>:
+  34:  01 00           .word   0x0001  ; ????
+  36:  01 0c           add     r0, r1
+  38:  00 05           cpc     r16, r0
+  3a:  a4 01           movw    r20, r8
+  3c:  0c 01           movw    r0, r24
+  3e:  15 80           ldd     r1, Z+5 ; 0x05
+
+00000040 <__ctors_end>:
+  40:  11 24           eor     r1, r1
+  42:  1f be           out     0x3f, r1        ; 63
+  44:  cf ef           ldi     r28, 0xFF       ; 255
+  46:  d4 e0           ldi     r29, 0x04       ; 4
+  48:  de bf           out     0x3e, r29       ; 62
+  4a:  cd bf           out     0x3d, r28       ; 61
+
+0000004c <__do_copy_data>:
+  4c:  e4 e3           ldi     r30, 0x34       ; 52
+  4e:  f0 e0           ldi     r31, 0x00       ; 0
+  50:  40 e0           ldi     r20, 0x00       ; 0
+  52:  17 c0           rjmp    .+46            ; 0x82 <__do_clear_bss+0x8>
+  54:  b5 91           lpm     r27, Z+
+  56:  a5 91           lpm     r26, Z+
+  58:  35 91           lpm     r19, Z+
+  5a:  25 91           lpm     r18, Z+
+  5c:  05 91           lpm     r16, Z+
+  5e:  07 fd           sbrc    r16, 7
+  60:  0c c0           rjmp    .+24            ; 0x7a <__do_clear_bss>
+  62:  95 91           lpm     r25, Z+
+  64:  85 91           lpm     r24, Z+
+  66:  ef 01           movw    r28, r30
+  68:  f9 2f           mov     r31, r25
+  6a:  e8 2f           mov     r30, r24
+  6c:  05 90           lpm     r0, Z+
+  6e:  0d 92           st      X+, r0
+  70:  a2 17           cp      r26, r18
+  72:  b3 07           cpc     r27, r19
+  74:  d9 f7           brne    .-10            ; 0x6c <__do_copy_data+0x20>
+  76:  fe 01           movw    r30, r28
+  78:  04 c0           rjmp    .+8             ; 0x82 <__do_clear_bss+0x8>
+
+0000007a <__do_clear_bss>:
+  7a:  1d 92           st      X+, r1
+  7c:  a2 17           cp      r26, r18
+  7e:  b3 07           cpc     r27, r19
+  80:  e1 f7           brne    .-8             ; 0x7a <__do_clear_bss>
+  82:  e0 34           cpi     r30, 0x40       ; 64
+  84:  f4 07           cpc     r31, r20
+  86:  31 f7           brne    .-52            ; 0x54 <__do_copy_data+0x8>
+  88:  6c d0           rcall   .+216           ; 0x162 <main>
+  8a:  84 c2           rjmp    .+1288          ; 0x594 <exit>
+
+0000008c <_exit>:
+  8c:  f8 94           cli
+
+0000008e <__stop_program>:
+  8e:  ff cf           rjmp    .-2             ; 0x8e <__stop_program>
+
+Disassembly of section .text:
+
+00000090 <__bad_interrupt>:
+  90:  b7 cf           rjmp    .-146           ; 0x0 <__TEXT_REGION_ORIGIN__>
+
+Disassembly of section .text.i2c_write_byte:
+
+00000092 <i2c_write_byte>:
+  92:  94 ea           ldi     r25, 0xA4       ; 164
+  94:  90 93 bc 00     sts     0x00BC, r25     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+  98:  90 91 bc 00     lds     r25, 0x00BC     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+  9c:  97 ff           sbrs    r25, 7
+  9e:  fc cf           rjmp    .-8             ; 0x98 <i2c_write_byte+0x6>
+  a0:  88 0f           add     r24, r24
+  a2:  80 93 bb 00     sts     0x00BB, r24     ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7fe0bb>
+  a6:  84 e8           ldi     r24, 0x84       ; 132
+  a8:  80 93 bc 00     sts     0x00BC, r24     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+  ac:  80 91 bc 00     lds     r24, 0x00BC     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+  b0:  87 ff           sbrs    r24, 7
+  b2:  fc cf           rjmp    .-8             ; 0xac <i2c_write_byte+0x1a>
+  b4:  60 93 bb 00     sts     0x00BB, r22     ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7fe0bb>
+  b8:  84 e8           ldi     r24, 0x84       ; 132
+  ba:  80 93 bc 00     sts     0x00BC, r24     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+  be:  80 91 bc 00     lds     r24, 0x00BC     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+  c2:  87 ff           sbrs    r24, 7
+  c4:  fc cf           rjmp    .-8             ; 0xbe <i2c_write_byte+0x2c>
+  c6:  84 e9           ldi     r24, 0x94       ; 148
+  c8:  80 93 bc 00     sts     0x00BC, r24     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+  cc:  80 91 bc 00     lds     r24, 0x00BC     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+  d0:  84 fd           sbrc    r24, 4
+  d2:  fc cf           rjmp    .-8             ; 0xcc <i2c_write_byte+0x3a>
+  d4:  08 95           ret
+
+Disassembly of section .text.lcd_pulse_enable:
+
+000000d6 <lcd_pulse_enable>:
+  d6:  cf 93           push    r28
+  d8:  c8 2f           mov     r28, r24
+  da:  68 2f           mov     r22, r24
+  dc:  6c 60           ori     r22, 0x0C       ; 12
+  de:  87 e2           ldi     r24, 0x27       ; 39
+  e0:  d8 df           rcall   .-80            ; 0x92 <i2c_write_byte>
+  e2:  00 00           nop
+  e4:  6c 2f           mov     r22, r28
+  e6:  6b 7f           andi    r22, 0xFB       ; 251
+  e8:  68 60           ori     r22, 0x08       ; 8
+  ea:  87 e2           ldi     r24, 0x27       ; 39
+  ec:  d2 df           rcall   .-92            ; 0x92 <i2c_write_byte>
+  ee:  80 e1           ldi     r24, 0x10       ; 16
+  f0:  8a 95           dec     r24
+  f2:  f1 f7           brne    .-4             ; 0xf0 <lcd_pulse_enable+0x1a>
+  f4:  00 c0           rjmp    .+0             ; 0xf6 <lcd_pulse_enable+0x20>
+  f6:  cf 91           pop     r28
+  f8:  08 95           ret
+
+Disassembly of section .text.lcd_send:
+
+000000fa <lcd_send>:
+  fa:  1f 93           push    r17
+  fc:  cf 93           push    r28
+  fe:  df 93           push    r29
+ 100:  c8 2f           mov     r28, r24
+ 102:  d6 2f           mov     r29, r22
+ 104:  d8 60           ori     r29, 0x08       ; 8
+ 106:  18 2f           mov     r17, r24
+ 108:  10 7f           andi    r17, 0xF0       ; 240
+ 10a:  1d 2b           or      r17, r29
+ 10c:  61 2f           mov     r22, r17
+ 10e:  68 60           ori     r22, 0x08       ; 8
+ 110:  87 e2           ldi     r24, 0x27       ; 39
+ 112:  bf df           rcall   .-130           ; 0x92 <i2c_write_byte>
+ 114:  81 2f           mov     r24, r17
+ 116:  df df           rcall   .-66            ; 0xd6 <lcd_pulse_enable>
+ 118:  c2 95           swap    r28
+ 11a:  c0 7f           andi    r28, 0xF0       ; 240
+ 11c:  cd 2b           or      r28, r29
+ 11e:  6c 2f           mov     r22, r28
+ 120:  68 60           ori     r22, 0x08       ; 8
+ 122:  87 e2           ldi     r24, 0x27       ; 39
+ 124:  b6 df           rcall   .-148           ; 0x92 <i2c_write_byte>
+ 126:  8c 2f           mov     r24, r28
+ 128:  df 91           pop     r29
+ 12a:  cf 91           pop     r28
+ 12c:  1f 91           pop     r17
+ 12e:  d3 cf           rjmp    .-90            ; 0xd6 <lcd_pulse_enable>
+
+Disassembly of section .text.startup.main:
+
+00000161 <main-0x1>:
+       ...
+
+00000162 <main>:
+ 162:  cf 93           push    r28
+ 164:  df 93           push    r29
+ 166:  cd b7           in      r28, 0x3d       ; 61
+ 168:  de b7           in      r29, 0x3e       ; 62
+ 16a:  63 97           sbiw    r28, 0x13       ; 19
+ 16c:  0f b6           in      r0, 0x3f        ; 63
+ 16e:  f8 94           cli
+ 170:  de bf           out     0x3e, r29       ; 62
+ 172:  0f be           out     0x3f, r0        ; 63
+ 174:  cd bf           out     0x3d, r28       ; 61
+ 176:  8a b1           in      r24, 0x0a       ; 10
+ 178:  8f 71           andi    r24, 0x1F       ; 31
+ 17a:  8a b9           out     0x0a, r24       ; 10
+ 17c:  8b b1           in      r24, 0x0b       ; 11
+ 17e:  80 6e           ori     r24, 0xE0       ; 224
+ 180:  8b b9           out     0x0b, r24       ; 11
+ 182:  8a b1           in      r24, 0x0a       ; 10
+ 184:  8f 60           ori     r24, 0x0F       ; 15
+ 186:  8a b9           out     0x0a, r24       ; 10
+ 188:  87 b1           in      r24, 0x07       ; 7
+ 18a:  8b 60           ori     r24, 0x0B       ; 11
+ 18c:  87 b9           out     0x07, r24       ; 7
+ 18e:  18 b8           out     0x08, r1        ; 8
+ 190:  10 92 b9 00     sts     0x00B9, r1      ; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7fe0b9>
+ 194:  82 e0           ldi     r24, 0x02       ; 2
+ 196:  80 93 b8 00     sts     0x00B8, r24     ; 0x8000b8 <__TEXT_REGION_LENGTH__+0x7fe0b8>
+ 19a:  84 e0           ldi     r24, 0x04       ; 4
+ 19c:  80 93 bc 00     sts     0x00BC, r24     ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+ 1a0:  83 ed           ldi     r24, 0xD3       ; 211
+ 1a2:  90 e3           ldi     r25, 0x30       ; 48
+ 1a4:  01 97           sbiw    r24, 0x01       ; 1
+ 1a6:  f1 f7           brne    .-4             ; 0x1a4 <main+0x42>
+ 1a8:  00 c0           rjmp    .+0             ; 0x1aa <main+0x48>
+ 1aa:  00 00           nop
+ 1ac:  68 e3           ldi     r22, 0x38       ; 56
+ 1ae:  87 e2           ldi     r24, 0x27       ; 39
+ 1b0:  70 df           rcall   .-288           ; 0x92 <i2c_write_byte>
+ 1b2:  88 e3           ldi     r24, 0x38       ; 56
+ 1b4:  90 df           rcall   .-224           ; 0xd6 <lcd_pulse_enable>
+ 1b6:  a1 ee           ldi     r26, 0xE1       ; 225
+ 1b8:  b4 e0           ldi     r27, 0x04       ; 4
+ 1ba:  11 97           sbiw    r26, 0x01       ; 1
+ 1bc:  f1 f7           brne    .-4             ; 0x1ba <main+0x58>
+ 1be:  00 c0           rjmp    .+0             ; 0x1c0 <main+0x5e>
+ 1c0:  00 00           nop
+ 1c2:  68 e3           ldi     r22, 0x38       ; 56
+ 1c4:  87 e2           ldi     r24, 0x27       ; 39
+ 1c6:  65 df           rcall   .-310           ; 0x92 <i2c_write_byte>
+ 1c8:  88 e3           ldi     r24, 0x38       ; 56
+ 1ca:  85 df           rcall   .-246           ; 0xd6 <lcd_pulse_enable>
+ 1cc:  b2 e3           ldi     r27, 0x32       ; 50
+ 1ce:  ba 95           dec     r27
+ 1d0:  f1 f7           brne    .-4             ; 0x1ce <main+0x6c>
+ 1d2:  68 e3           ldi     r22, 0x38       ; 56
+ 1d4:  87 e2           ldi     r24, 0x27       ; 39
+ 1d6:  5d df           rcall   .-326           ; 0x92 <i2c_write_byte>
+ 1d8:  88 e3           ldi     r24, 0x38       ; 56
+ 1da:  7d df           rcall   .-262           ; 0xd6 <lcd_pulse_enable>
+ 1dc:  e2 e3           ldi     r30, 0x32       ; 50
+ 1de:  ea 95           dec     r30
+ 1e0:  f1 f7           brne    .-4             ; 0x1de <main+0x7c>
+ 1e2:  68 e2           ldi     r22, 0x28       ; 40
+ 1e4:  87 e2           ldi     r24, 0x27       ; 39
+ 1e6:  55 df           rcall   .-342           ; 0x92 <i2c_write_byte>
+ 1e8:  88 e2           ldi     r24, 0x28       ; 40
+ 1ea:  75 df           rcall   .-278           ; 0xd6 <lcd_pulse_enable>
+ 1ec:  f2 e3           ldi     r31, 0x32       ; 50
+ 1ee:  fa 95           dec     r31
+ 1f0:  f1 f7           brne    .-4             ; 0x1ee <main+0x8c>
+ 1f2:  60 e0           ldi     r22, 0x00       ; 0
+ 1f4:  88 e2           ldi     r24, 0x28       ; 40
+ 1f6:  81 df           rcall   .-254           ; 0xfa <lcd_send>
+ 1f8:  60 e0           ldi     r22, 0x00       ; 0
+ 1fa:  88 e0           ldi     r24, 0x08       ; 8
+ 1fc:  7e df           rcall   .-260           ; 0xfa <lcd_send>
+ 1fe:  60 e0           ldi     r22, 0x00       ; 0
+ 200:  81 e0           ldi     r24, 0x01       ; 1
+ 202:  7b df           rcall   .-266           ; 0xfa <lcd_send>
+ 204:  83 ef           ldi     r24, 0xF3       ; 243
+ 206:  91 e0           ldi     r25, 0x01       ; 1
+ 208:  01 97           sbiw    r24, 0x01       ; 1
+ 20a:  f1 f7           brne    .-4             ; 0x208 <__EEPROM_REGION_LENGTH__+0x8>
+ 20c:  00 c0           rjmp    .+0             ; 0x20e <__EEPROM_REGION_LENGTH__+0xe>
+ 20e:  00 00           nop
+ 210:  60 e0           ldi     r22, 0x00       ; 0
+ 212:  86 e0           ldi     r24, 0x06       ; 6
+ 214:  72 df           rcall   .-284           ; 0xfa <lcd_send>
+ 216:  60 e0           ldi     r22, 0x00       ; 0
+ 218:  8c e0           ldi     r24, 0x0C       ; 12
+ 21a:  6f df           rcall   .-290           ; 0xfa <lcd_send>
+ 21c:  60 e0           ldi     r22, 0x00       ; 0
+ 21e:  81 e0           ldi     r24, 0x01       ; 1
+ 220:  6c df           rcall   .-296           ; 0xfa <lcd_send>
+ 222:  a3 ef           ldi     r26, 0xF3       ; 243
+ 224:  b1 e0           ldi     r27, 0x01       ; 1
+ 226:  11 97           sbiw    r26, 0x01       ; 1
+ 228:  f1 f7           brne    .-4             ; 0x226 <__EEPROM_REGION_LENGTH__+0x26>
+ 22a:  00 c0           rjmp    .+0             ; 0x22c <__EEPROM_REGION_LENGTH__+0x2c>
+ 22c:  00 00           nop
+ 22e:  60 e0           ldi     r22, 0x00       ; 0
+ 230:  80 e8           ldi     r24, 0x80       ; 128
+ 232:  63 df           rcall   .-314           ; 0xfa <lcd_send>
+ 234:  ac e5           ldi     r26, 0x5C       ; 92
+ 236:  ca 2e           mov     r12, r26
+ 238:  a1 e0           ldi     r26, 0x01       ; 1
+ 23a:  da 2e           mov     r13, r26
+ 23c:  a0 e0           ldi     r26, 0x00       ; 0
+ 23e:  ea 2e           mov     r14, r26
+ 240:  80 e5           ldi     r24, 0x50       ; 80
+ 242:  61 e0           ldi     r22, 0x01       ; 1
+ 244:  5a df           rcall   .-332           ; 0xfa <lcd_send>
+ 246:  f6 01           movw    r30, r12
+ 248:  84 91           lpm     r24, Z
+ 24a:  e7 fc           sbrc    r14, 7
+ 24c:  80 81           ld      r24, Z
+ 24e:  bf ef           ldi     r27, 0xFF       ; 255
+ 250:  cb 1a           sub     r12, r27
+ 252:  db 0a           sbc     r13, r27
+ 254:  eb 0a           sbc     r14, r27
+ 256:  81 11           cpse    r24, r1
+ 258:  f4 cf           rjmp    .-24            ; 0x242 <__EEPROM_REGION_LENGTH__+0x42>
+ 25a:  1d 86           std     Y+13, r1        ; 0x0d
+ 25c:  81 e0           ldi     r24, 0x01       ; 1
+ 25e:  8e 87           std     Y+14, r24       ; 0x0e
+ 260:  82 e0           ldi     r24, 0x02       ; 2
+ 262:  8f 87           std     Y+15, r24       ; 0x0f
+ 264:  83 e0           ldi     r24, 0x03       ; 3
+ 266:  88 8b           std     Y+16, r24       ; 0x10
+ 268:  85 e0           ldi     r24, 0x05       ; 5
+ 26a:  89 8b           std     Y+17, r24       ; 0x11
+ 26c:  86 e0           ldi     r24, 0x06       ; 6
+ 26e:  8a 8b           std     Y+18, r24       ; 0x12
+ 270:  87 e0           ldi     r24, 0x07       ; 7
+ 272:  8b 8b           std     Y+19, r24       ; 0x13
+ 274:  8c e0           ldi     r24, 0x0C       ; 12
+ 276:  e0 e0           ldi     r30, 0x00       ; 0
+ 278:  f1 e0           ldi     r31, 0x01       ; 1
+ 27a:  de 01           movw    r26, r28
+ 27c:  11 96           adiw    r26, 0x01       ; 1
+ 27e:  01 90           ld      r0, Z+
+ 280:  0d 92           st      X+, r0
+ 282:  8a 95           dec     r24
+ 284:  e1 f7           brne    .-8             ; 0x27e <__EEPROM_REGION_LENGTH__+0x7e>
+ 286:  60 e0           ldi     r22, 0x00       ; 0
+ 288:  01 e0           ldi     r16, 0x01       ; 1
+ 28a:  10 e0           ldi     r17, 0x00       ; 0
+ 28c:  e8 e0           ldi     r30, 0x08       ; 8
+ 28e:  fe 2e           mov     r15, r30
+ 290:  fa e0           ldi     r31, 0x0A       ; 10
+ 292:  9f 2e           mov     r9, r31
+ 294:  fe 01           movw    r30, r28
+ 296:  3d 96           adiw    r30, 0x0d       ; 13
+ 298:  40 e0           ldi     r20, 0x00       ; 0
+ 29a:  50 e0           ldi     r21, 0x00       ; 0
+ 29c:  8a b1           in      r24, 0x0a       ; 10
+ 29e:  80 7f           andi    r24, 0xF0       ; 240
+ 2a0:  8a b9           out     0x0a, r24       ; 10
+ 2a2:  8b b1           in      r24, 0x0b       ; 11
+ 2a4:  80 7f           andi    r24, 0xF0       ; 240
+ 2a6:  8b b9           out     0x0b, r24       ; 11
+ 2a8:  2a b1           in      r18, 0x0a       ; 10
+ 2aa:  df 01           movw    r26, r30
+ 2ac:  c8 01           movw    r24, r16
+ 2ae:  01 90           ld      r0, Z+
+ 2b0:  02 c0           rjmp    .+4             ; 0x2b6 <__EEPROM_REGION_LENGTH__+0xb6>
+ 2b2:  88 0f           add     r24, r24
+ 2b4:  99 1f           adc     r25, r25
+ 2b6:  0a 94           dec     r0
+ 2b8:  e2 f7           brpl    .-8             ; 0x2b2 <__EEPROM_REGION_LENGTH__+0xb2>
+ 2ba:  82 2b           or      r24, r18
+ 2bc:  8a b9           out     0x0a, r24       ; 10
+ 2be:  9b b1           in      r25, 0x0b       ; 11
+ 2c0:  98 01           movw    r18, r16
+ 2c2:  0c 90           ld      r0, X
+ 2c4:  02 c0           rjmp    .+4             ; 0x2ca <__EEPROM_REGION_LENGTH__+0xca>
+ 2c6:  22 0f           add     r18, r18
+ 2c8:  33 1f           adc     r19, r19
+ 2ca:  0a 94           dec     r0
+ 2cc:  e2 f7           brpl    .-8             ; 0x2c6 <__EEPROM_REGION_LENGTH__+0xc6>
+ 2ce:  82 2f           mov     r24, r18
+ 2d0:  80 95           com     r24
+ 2d2:  89 23           and     r24, r25
+ 2d4:  8b b9           out     0x0b, r24       ; 11
+ 2d6:  23 e0           ldi     r18, 0x03       ; 3
+ 2d8:  2a 95           dec     r18
+ 2da:  f1 f7           brne    .-4             ; 0x2d8 <__EEPROM_REGION_LENGTH__+0xd8>
+ 2dc:  00 00           nop
+ 2de:  de 01           movw    r26, r28
+ 2e0:  51 96           adiw    r26, 0x11       ; 17
+ 2e2:  20 e0           ldi     r18, 0x00       ; 0
+ 2e4:  30 e0           ldi     r19, 0x00       ; 0
+ 2e6:  89 b1           in      r24, 0x09       ; 9
+ 2e8:  90 e0           ldi     r25, 0x00       ; 0
+ 2ea:  0d 90           ld      r0, X+
+ 2ec:  02 c0           rjmp    .+4             ; 0x2f2 <__EEPROM_REGION_LENGTH__+0xf2>
+ 2ee:  95 95           asr     r25
+ 2f0:  87 95           ror     r24
+ 2f2:  0a 94           dec     r0
+ 2f4:  e2 f7           brpl    .-8             ; 0x2ee <__EEPROM_REGION_LENGTH__+0xee>
+ 2f6:  80 ff           sbrs    r24, 0
+ 2f8:  0c c0           rjmp    .+24            ; 0x312 <__EEPROM_REGION_LENGTH__+0x112>
+ 2fa:  2f 5f           subi    r18, 0xFF       ; 255
+ 2fc:  3f 4f           sbci    r19, 0xFF       ; 255
+ 2fe:  23 30           cpi     r18, 0x03       ; 3
+ 300:  31 05           cpc     r19, r1
+ 302:  89 f7           brne    .-30            ; 0x2e6 <__EEPROM_REGION_LENGTH__+0xe6>
+ 304:  4f 5f           subi    r20, 0xFF       ; 255
+ 306:  5f 4f           sbci    r21, 0xFF       ; 255
+ 308:  44 30           cpi     r20, 0x04       ; 4
+ 30a:  51 05           cpc     r21, r1
+ 30c:  39 f6           brne    .-114           ; 0x29c <__EEPROM_REGION_LENGTH__+0x9c>
+ 30e:  60 e0           ldi     r22, 0x00       ; 0
+ 310:  c1 cf           rjmp    .-126           ; 0x294 <__EEPROM_REGION_LENGTH__+0x94>
+ 312:  ca 01           movw    r24, r20
+ 314:  88 0f           add     r24, r24
+ 316:  99 1f           adc     r25, r25
+ 318:  84 0f           add     r24, r20
+ 31a:  95 1f           adc     r25, r21
+ 31c:  a1 e0           ldi     r26, 0x01       ; 1
+ 31e:  b0 e0           ldi     r27, 0x00       ; 0
+ 320:  ac 0f           add     r26, r28
+ 322:  bd 1f           adc     r27, r29
+ 324:  8a 0f           add     r24, r26
+ 326:  9b 1f           adc     r25, r27
+ 328:  dc 01           movw    r26, r24
+ 32a:  a2 0f           add     r26, r18
+ 32c:  b3 1f           adc     r27, r19
+ 32e:  bc 90           ld      r11, X
+ 330:  bb 20           and     r11, r11
+ 332:  41 f3           breq    .-48            ; 0x304 <__EEPROM_REGION_LENGTH__+0x104>
+ 334:  6b 15           cp      r22, r11
+ 336:  09 f4           brne    .+2             ; 0x33a <__EEPROM_REGION_LENGTH__+0x13a>
+ 338:  ad cf           rjmp    .-166           ; 0x294 <__EEPROM_REGION_LENGTH__+0x94>
+ 33a:  80 ed           ldi     r24, 0xD0       ; 208
+ 33c:  8b 0d           add     r24, r11
+ 33e:  8a 30           cpi     r24, 0x0A       ; 10
+ 340:  10 f5           brcc    .+68            ; 0x386 <__EEPROM_REGION_LENGTH__+0x186>
+ 342:  80 91 0c 01     lds     r24, 0x010C     ; 0x80010c <pin_length>
+ 346:  87 30           cpi     r24, 0x07       ; 7
+ 348:  f0 f4           brcc    .+60            ; 0x386 <__EEPROM_REGION_LENGTH__+0x186>
+ 34a:  43 9a           sbi     0x08, 3 ; 8
+ 34c:  e3 ed           ldi     r30, 0xD3       ; 211
+ 34e:  f0 e3           ldi     r31, 0x30       ; 48
+ 350:  31 97           sbiw    r30, 0x01       ; 1
+ 352:  f1 f7           brne    .-4             ; 0x350 <__EEPROM_REGION_LENGTH__+0x150>
+ 354:  00 c0           rjmp    .+0             ; 0x356 <__EEPROM_REGION_LENGTH__+0x156>
+ 356:  00 00           nop
+ 358:  43 98           cbi     0x08, 3 ; 8
+ 35a:  80 91 0c 01     lds     r24, 0x010C     ; 0x80010c <pin_length>
+ 35e:  e8 2f           mov     r30, r24
+ 360:  f0 e0           ldi     r31, 0x00       ; 0
+ 362:  e3 5f           subi    r30, 0xF3       ; 243
+ 364:  fe 4f           sbci    r31, 0xFE       ; 254
+ 366:  b0 82           st      Z, r11
+ 368:  91 e0           ldi     r25, 0x01       ; 1
+ 36a:  98 0f           add     r25, r24
+ 36c:  90 93 0c 01     sts     0x010C, r25     ; 0x80010c <pin_length>
+ 370:  8b 5f           subi    r24, 0xFB       ; 251
+ 372:  60 e0           ldi     r22, 0x00       ; 0
+ 374:  80 68           ori     r24, 0x80       ; 128
+ 376:  c1 de           rcall   .-638           ; 0xfa <lcd_send>
+ 378:  61 e0           ldi     r22, 0x01       ; 1
+ 37a:  8b 2d           mov     r24, r11
+ 37c:  be de           rcall   .-644           ; 0xfa <lcd_send>
+ 37e:  80 91 0c 01     lds     r24, 0x010C     ; 0x80010c <pin_length>
+ 382:  87 30           cpi     r24, 0x07       ; 7
+ 384:  11 f0           breq    .+4             ; 0x38a <__EEPROM_REGION_LENGTH__+0x18a>
+ 386:  6b 2d           mov     r22, r11
+ 388:  85 cf           rjmp    .-246           ; 0x294 <__EEPROM_REGION_LENGTH__+0x94>
+ 38a:  10 92 14 01     sts     0x0114, r1      ; 0x800114 <pin+0x7>
+ 38e:  8f e4           ldi     r24, 0x4F       ; 79
+ 390:  93 ec           ldi     r25, 0xC3       ; 195
+ 392:  01 97           sbiw    r24, 0x01       ; 1
+ 394:  f1 f7           brne    .-4             ; 0x392 <__EEPROM_REGION_LENGTH__+0x192>
+ 396:  00 c0           rjmp    .+0             ; 0x398 <__EEPROM_REGION_LENGTH__+0x198>
+ 398:  00 00           nop
+ 39a:  2d e0           ldi     r18, 0x0D       ; 13
+ 39c:  31 e0           ldi     r19, 0x01       ; 1
+ 39e:  87 e8           ldi     r24, 0x87       ; 135
+ 3a0:  95 e0           ldi     r25, 0x05       ; 5
+ 3a2:  a0 e0           ldi     r26, 0x00       ; 0
+ 3a4:  47 e3           ldi     r20, 0x37       ; 55
+ 3a6:  06 c0           rjmp    .+12            ; 0x3b4 <__EEPROM_REGION_LENGTH__+0x1b4>
+ 3a8:  fc 01           movw    r30, r24
+ 3aa:  44 91           lpm     r20, Z
+ 3ac:  a7 fd           sbrc    r26, 7
+ 3ae:  40 81           ld      r20, Z
+ 3b0:  01 96           adiw    r24, 0x01       ; 1
+ 3b2:  a1 1d           adc     r26, r1
+ 3b4:  f9 01           movw    r30, r18
+ 3b6:  51 91           ld      r21, Z+
+ 3b8:  9f 01           movw    r18, r30
+ 3ba:  54 13           cpse    r21, r20
+ 3bc:  bb c0           rjmp    .+374           ; 0x534 <__stack+0x35>
+ 3be:  8d 38           cpi     r24, 0x8D       ; 141
+ 3c0:  f5 e0           ldi     r31, 0x05       ; 5
+ 3c2:  9f 07           cpc     r25, r31
+ 3c4:  f0 e0           ldi     r31, 0x00       ; 0
+ 3c6:  af 07           cpc     r26, r31
+ 3c8:  79 f7           brne    .-34            ; 0x3a8 <__EEPROM_REGION_LENGTH__+0x1a8>
+ 3ca:  60 e0           ldi     r22, 0x00       ; 0
+ 3cc:  81 e0           ldi     r24, 0x01       ; 1
+ 3ce:  95 de           rcall   .-726           ; 0xfa <lcd_send>
+ 3d0:  a3 ef           ldi     r26, 0xF3       ; 243
+ 3d2:  b1 e0           ldi     r27, 0x01       ; 1
+ 3d4:  11 97           sbiw    r26, 0x01       ; 1
+ 3d6:  f1 f7           brne    .-4             ; 0x3d4 <__EEPROM_REGION_LENGTH__+0x1d4>
+ 3d8:  00 c0           rjmp    .+0             ; 0x3da <__EEPROM_REGION_LENGTH__+0x1da>
+ 3da:  00 00           nop
+ 3dc:  60 e0           ldi     r22, 0x00       ; 0
+ 3de:  80 e8           ldi     r24, 0x80       ; 128
+ 3e0:  8c de           rcall   .-744           ; 0xfa <lcd_send>
+ 3e2:  82 e4           ldi     r24, 0x42       ; 66
+ 3e4:  30 e3           ldi     r19, 0x30       ; 48
+ 3e6:  c3 2e           mov     r12, r19
+ 3e8:  31 e0           ldi     r19, 0x01       ; 1
+ 3ea:  d3 2e           mov     r13, r19
+ 3ec:  30 e0           ldi     r19, 0x00       ; 0
+ 3ee:  e3 2e           mov     r14, r19
+ 3f0:  2f ef           ldi     r18, 0xFF       ; 255
+ 3f2:  c2 1a           sub     r12, r18
+ 3f4:  d2 0a           sbc     r13, r18
+ 3f6:  e2 0a           sbc     r14, r18
+ 3f8:  61 e0           ldi     r22, 0x01       ; 1
+ 3fa:  7f de           rcall   .-770           ; 0xfa <lcd_send>
+ 3fc:  f6 01           movw    r30, r12
+ 3fe:  84 91           lpm     r24, Z
+ 400:  e7 fc           sbrc    r14, 7
+ 402:  80 81           ld      r24, Z
+ 404:  81 11           cpse    r24, r1
+ 406:  f4 cf           rjmp    .-24            ; 0x3f0 <__EEPROM_REGION_LENGTH__+0x1f0>
+ 408:  6a e0           ldi     r22, 0x0A       ; 10
+ 40a:  a6 2e           mov     r10, r22
+ 40c:  60 e0           ldi     r22, 0x00       ; 0
+ 40e:  80 ec           ldi     r24, 0xC0       ; 192
+ 410:  74 de           rcall   .-792           ; 0xfa <lcd_send>
+ 412:  83 e4           ldi     r24, 0x43       ; 67
+ 414:  5e e3           ldi     r21, 0x3E       ; 62
+ 416:  c5 2e           mov     r12, r21
+ 418:  51 e0           ldi     r21, 0x01       ; 1
+ 41a:  d5 2e           mov     r13, r21
+ 41c:  50 e0           ldi     r21, 0x00       ; 0
+ 41e:  e5 2e           mov     r14, r21
+ 420:  3f ef           ldi     r19, 0xFF       ; 255
+ 422:  c3 1a           sub     r12, r19
+ 424:  d3 0a           sbc     r13, r19
+ 426:  e3 0a           sbc     r14, r19
+ 428:  61 e0           ldi     r22, 0x01       ; 1
+ 42a:  67 de           rcall   .-818           ; 0xfa <lcd_send>
+ 42c:  f6 01           movw    r30, r12
+ 42e:  84 91           lpm     r24, Z
+ 430:  e7 fc           sbrc    r14, 7
+ 432:  80 81           ld      r24, Z
+ 434:  81 11           cpse    r24, r1
+ 436:  f4 cf           rjmp    .-24            ; 0x420 <__DATA_REGION_LENGTH__+0x20>
+ 438:  fa 2d           mov     r31, r10
+ 43a:  27 e6           ldi     r18, 0x67       ; 103
+ 43c:  f2 02           muls    r31, r18
+ 43e:  e1 2c           mov     r14, r1
+ 440:  11 24           eor     r1, r1
+ 442:  e5 94           asr     r14
+ 444:  e5 94           asr     r14
+ 446:  a7 fc           sbrc    r10, 7
+ 448:  e3 94           inc     r14
+ 44a:  61 e0           ldi     r22, 0x01       ; 1
+ 44c:  80 e3           ldi     r24, 0x30       ; 48
+ 44e:  8e 0d           add     r24, r14
+ 450:  54 de           rcall   .-856           ; 0xfa <lcd_send>
+ 452:  8a 2d           mov     r24, r10
+ 454:  3a e0           ldi     r19, 0x0A       ; 10
+ 456:  e3 9e           mul     r14, r19
+ 458:  80 19           sub     r24, r0
+ 45a:  11 24           eor     r1, r1
+ 45c:  61 e0           ldi     r22, 0x01       ; 1
+ 45e:  80 5d           subi    r24, 0xD0       ; 208
+ 460:  4c de           rcall   .-872           ; 0xfa <lcd_send>
+ 462:  61 e0           ldi     r22, 0x01       ; 1
+ 464:  80 e2           ldi     r24, 0x20       ; 32
+ 466:  49 de           rcall   .-878           ; 0xfa <lcd_send>
+ 468:  f6 b8           out     0x06, r15       ; 6
+ 46a:  81 e0           ldi     r24, 0x01       ; 1
+ 46c:  86 b9           out     0x06, r24       ; 6
+ 46e:  a7 e8           ldi     r26, 0x87       ; 135
+ 470:  b3 e1           ldi     r27, 0x13       ; 19
+ 472:  11 97           sbiw    r26, 0x01       ; 1
+ 474:  f1 f7           brne    .-4             ; 0x472 <__DATA_REGION_LENGTH__+0x72>
+ 476:  00 c0           rjmp    .+0             ; 0x478 <__DATA_REGION_LENGTH__+0x78>
+ 478:  00 00           nop
+ 47a:  86 b9           out     0x06, r24       ; 6
+ 47c:  bf e9           ldi     r27, 0x9F       ; 159
+ 47e:  ed ef           ldi     r30, 0xFD       ; 253
+ 480:  f2 e0           ldi     r31, 0x02       ; 2
+ 482:  b1 50           subi    r27, 0x01       ; 1
+ 484:  e0 40           sbci    r30, 0x00       ; 0
+ 486:  f0 40           sbci    r31, 0x00       ; 0
+ 488:  e1 f7           brne    .-8             ; 0x482 <__DATA_REGION_LENGTH__+0x82>
+ 48a:  00 c0           rjmp    .+0             ; 0x48c <__DATA_REGION_LENGTH__+0x8c>
+ 48c:  00 00           nop
+ 48e:  aa 94           dec     r10
+ 490:  a1 10           cpse    r10, r1
+ 492:  bc cf           rjmp    .-136           ; 0x40c <__DATA_REGION_LENGTH__+0xc>
+ 494:  60 e0           ldi     r22, 0x00       ; 0
+ 496:  81 e0           ldi     r24, 0x01       ; 1
+ 498:  30 de           rcall   .-928           ; 0xfa <lcd_send>
+ 49a:  83 ef           ldi     r24, 0xF3       ; 243
+ 49c:  91 e0           ldi     r25, 0x01       ; 1
+ 49e:  01 97           sbiw    r24, 0x01       ; 1
+ 4a0:  f1 f7           brne    .-4             ; 0x49e <__DATA_REGION_LENGTH__+0x9e>
+ 4a2:  00 c0           rjmp    .+0             ; 0x4a4 <__DATA_REGION_LENGTH__+0xa4>
+ 4a4:  00 00           nop
+ 4a6:  60 e0           ldi     r22, 0x00       ; 0
+ 4a8:  80 e8           ldi     r24, 0x80       ; 128
+ 4aa:  27 de           rcall   .-946           ; 0xfa <lcd_send>
+ 4ac:  80 e5           ldi     r24, 0x50       ; 80
+ 4ae:  4a e4           ldi     r20, 0x4A       ; 74
+ 4b0:  c4 2e           mov     r12, r20
+ 4b2:  41 e0           ldi     r20, 0x01       ; 1
+ 4b4:  d4 2e           mov     r13, r20
+ 4b6:  40 e0           ldi     r20, 0x00       ; 0
+ 4b8:  e4 2e           mov     r14, r20
+ 4ba:  9f ef           ldi     r25, 0xFF       ; 255
+ 4bc:  c9 1a           sub     r12, r25
+ 4be:  d9 0a           sbc     r13, r25
+ 4c0:  e9 0a           sbc     r14, r25
+ 4c2:  61 e0           ldi     r22, 0x01       ; 1
+ 4c4:  1a de           rcall   .-972           ; 0xfa <lcd_send>
+ 4c6:  f6 01           movw    r30, r12
+ 4c8:  84 91           lpm     r24, Z
+ 4ca:  e7 fc           sbrc    r14, 7
+ 4cc:  80 81           ld      r24, Z
+ 4ce:  81 11           cpse    r24, r1
+ 4d0:  f4 cf           rjmp    .-24            ; 0x4ba <__DATA_REGION_LENGTH__+0xba>
+ 4d2:  18 b8           out     0x08, r1        ; 8
+ 4d4:  98 b8           out     0x08, r9        ; 8
+ 4d6:  aa e2           ldi     r26, 0x2A       ; 42
+ 4d8:  b0 e5           ldi     r27, 0x50       ; 80
+ 4da:  ee ef           ldi     r30, 0xFE       ; 254
+ 4dc:  f0 e0           ldi     r31, 0x00       ; 0
+ 4de:  a1 50           subi    r26, 0x01       ; 1
+ 4e0:  b0 40           sbci    r27, 0x00       ; 0
+ 4e2:  e0 40           sbci    r30, 0x00       ; 0
+ 4e4:  f0 40           sbci    r31, 0x00       ; 0
+ 4e6:  d9 f7           brne    .-10            ; 0x4de <__DATA_REGION_LENGTH__+0xde>
+ 4e8:  00 00           nop
+ 4ea:  10 92 0c 01     sts     0x010C, r1      ; 0x80010c <pin_length>
+ 4ee:  10 92 0d 01     sts     0x010D, r1      ; 0x80010d <pin>
+ 4f2:  60 e0           ldi     r22, 0x00       ; 0
+ 4f4:  81 e0           ldi     r24, 0x01       ; 1
+ 4f6:  01 de           rcall   .-1022          ; 0xfa <lcd_send>
+ 4f8:  83 ef           ldi     r24, 0xF3       ; 243
+ 4fa:  91 e0           ldi     r25, 0x01       ; 1
+ 4fc:  01 97           sbiw    r24, 0x01       ; 1
+ 4fe:  f1 f7           brne    .-4             ; 0x4fc <__DATA_REGION_LENGTH__+0xfc>
+ 500:  00 c0           rjmp    .+0             ; 0x502 <__stack+0x3>
+ 502:  00 00           nop
+ 504:  60 e0           ldi     r22, 0x00       ; 0
+ 506:  80 e8           ldi     r24, 0x80       ; 128
+ 508:  f8 dd           rcall   .-1040          ; 0xfa <lcd_send>
+ 50a:  80 e5           ldi     r24, 0x50       ; 80
+ 50c:  9b e5           ldi     r25, 0x5B       ; 91
+ 50e:  c9 2e           mov     r12, r25
+ 510:  91 e0           ldi     r25, 0x01       ; 1
+ 512:  d9 2e           mov     r13, r25
+ 514:  90 e0           ldi     r25, 0x00       ; 0
+ 516:  e9 2e           mov     r14, r25
+ 518:  9f ef           ldi     r25, 0xFF       ; 255
+ 51a:  c9 1a           sub     r12, r25
+ 51c:  d9 0a           sbc     r13, r25
+ 51e:  e9 0a           sbc     r14, r25
+ 520:  61 e0           ldi     r22, 0x01       ; 1
+ 522:  eb dd           rcall   .-1066          ; 0xfa <lcd_send>
+ 524:  f6 01           movw    r30, r12
+ 526:  84 91           lpm     r24, Z
+ 528:  e7 fc           sbrc    r14, 7
+ 52a:  80 81           ld      r24, Z
+ 52c:  81 11           cpse    r24, r1
+ 52e:  f4 cf           rjmp    .-24            ; 0x518 <__stack+0x19>
+ 530:  6b 2d           mov     r22, r11
+ 532:  b0 ce           rjmp    .-672           ; 0x294 <__EEPROM_REGION_LENGTH__+0x94>
+ 534:  60 e0           ldi     r22, 0x00       ; 0
+ 536:  81 e0           ldi     r24, 0x01       ; 1
+ 538:  e0 dd           rcall   .-1088          ; 0xfa <lcd_send>
+ 53a:  e3 ef           ldi     r30, 0xF3       ; 243
+ 53c:  f1 e0           ldi     r31, 0x01       ; 1
+ 53e:  31 97           sbiw    r30, 0x01       ; 1
+ 540:  f1 f7           brne    .-4             ; 0x53e <__stack+0x3f>
+ 542:  00 c0           rjmp    .+0             ; 0x544 <__stack+0x45>
+ 544:  00 00           nop
+ 546:  60 e0           ldi     r22, 0x00       ; 0
+ 548:  80 e8           ldi     r24, 0x80       ; 128
+ 54a:  d7 dd           rcall   .-1106          ; 0xfa <lcd_send>
+ 54c:  87 e5           ldi     r24, 0x57       ; 87
+ 54e:  20 e5           ldi     r18, 0x50       ; 80
+ 550:  c2 2e           mov     r12, r18
+ 552:  21 e0           ldi     r18, 0x01       ; 1
+ 554:  d2 2e           mov     r13, r18
+ 556:  20 e0           ldi     r18, 0x00       ; 0
+ 558:  e2 2e           mov     r14, r18
+ 55a:  2f ef           ldi     r18, 0xFF       ; 255
+ 55c:  c2 1a           sub     r12, r18
+ 55e:  d2 0a           sbc     r13, r18
+ 560:  e2 0a           sbc     r14, r18
+ 562:  61 e0           ldi     r22, 0x01       ; 1
+ 564:  ca dd           rcall   .-1132          ; 0xfa <lcd_send>
+ 566:  f6 01           movw    r30, r12
+ 568:  84 91           lpm     r24, Z
+ 56a:  e7 fc           sbrc    r14, 7
+ 56c:  80 81           ld      r24, Z
+ 56e:  81 11           cpse    r24, r1
+ 570:  f4 cf           rjmp    .-24            ; 0x55a <__stack+0x5b>
+ 572:  3f e3           ldi     r19, 0x3F       ; 63
+ 574:  42 e4           ldi     r20, 0x42       ; 66
+ 576:  8f e0           ldi     r24, 0x0F       ; 15
+ 578:  31 50           subi    r19, 0x01       ; 1
+ 57a:  40 40           sbci    r20, 0x00       ; 0
+ 57c:  80 40           sbci    r24, 0x00       ; 0
+ 57e:  e1 f7           brne    .-8             ; 0x578 <__stack+0x79>
+ 580:  00 c0           rjmp    .+0             ; 0x582 <__stack+0x83>
+ 582:  00 00           nop
+ 584:  b2 cf           rjmp    .-156           ; 0x4ea <__DATA_REGION_LENGTH__+0xea>
+
+Disassembly of section .text.__dummy_fini:
+
+0000058e <_fini>:
+ 58e:  08 95           ret
+
+Disassembly of section .text.__dummy_funcs_on_exit:
+
+00000590 <__funcs_on_exit>:
+ 590:  08 95           ret
+
+Disassembly of section .text.__dummy_simulator_exit:
+
+00000592 <__simulator_exit>:
+ 592:  08 95           ret
+
+Disassembly of section .text.exit:
+
+00000594 <exit>:
+ 594:  ec 01           movw    r28, r24
+ 596:  fc df           rcall   .-8             ; 0x590 <__funcs_on_exit>
+ 598:  fa df           rcall   .-12            ; 0x58e <_fini>
+ 59a:  ce 01           movw    r24, r28
+ 59c:  fa df           rcall   .-12            ; 0x592 <__simulator_exit>
+ 59e:  ce 01           movw    r24, r28
+ 5a0:  00 d0           rcall   .+0             ; 0x5a2 <_Exit>
+
+Disassembly of section .text._Exit:
+
+000005a2 <_Exit>:
+ 5a2:  74 dd           rcall   .-1304          ; 0x8c <_exit>
diff --git a/halloween_puff/Release/halloween_puff.map b/halloween_puff/Release/halloween_puff.map
new file mode 100644 (file)
index 0000000..327dc08
--- /dev/null
@@ -0,0 +1,520 @@
+Archive member included to satisfy reference by file (symbol)
+
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+                              main.o (__do_copy_data)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+                              C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o (exit)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+                              c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o) (_Exit)
+c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+                              c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o) (_exit)
+
+Discarded input sections
+
+ .data          0x0000000000000000        0x0 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ .bss           0x0000000000000000        0x0 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ .text          0x0000000000000000        0x0 main.o
+ .data          0x0000000000000000        0x0 main.o
+ .bss           0x0000000000000000        0x0 main.o
+ .bss.last_key  0x0000000000000000        0x1 main.o
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.mul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.div
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc   0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.prologue
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.builtins
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.fmul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text.libgcc.fixed
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+ .text          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .data          0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .bss           0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.mul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.div
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc   0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.prologue
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .stack.descriptors
+                0x0000000000000000       0x13 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.builtins
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.fmul
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ .text.libgcc.fixed
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+
+Memory Configuration
+
+Name             Origin             Length             Attributes
+text             0x0000000000000000 0x0000000000002000 xr
+data             0x0000000000800100 0x0000000000000400 rw !x
+eeprom           0x0000000000810000 0x0000000000000200 rw !x
+fuse             0x0000000000820000 0x0000000000000003 rw !x
+lock             0x0000000000830000 0x0000000000000400 rw !x
+signature        0x0000000000840000 0x0000000000000400 rw !x
+user_signatures  0x0000000000850000 0x0000000000000400 rw !x
+*default*        0x0000000000000000 0xffffffffffffffff
+
+Linker script and memory map
+
+Address of section .data set to 0x800100
+LOAD C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+LOAD main.o
+START GROUP
+LOAD c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libm.a
+END GROUP
+START GROUP
+LOAD c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a
+LOAD c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libm.a
+LOAD c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a
+LOAD C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const\libatmega88p.a
+END GROUP
+                0x0000000000000000                __TEXT_REGION_ORIGIN__ = DEFINED (__TEXT_REGION_ORIGIN__)?__TEXT_REGION_ORIGIN__:0x0
+                [0x0000000000800100]                __DATA_REGION_ORIGIN__ = DEFINED (__DATA_REGION_ORIGIN__)?__DATA_REGION_ORIGIN__:0x800060
+                [0x0000000000002000]                __TEXT_REGION_LENGTH__ = DEFINED (__TEXT_REGION_LENGTH__)?__TEXT_REGION_LENGTH__:0x2000
+                [0x0000000000000400]                __DATA_REGION_LENGTH__ = DEFINED (__DATA_REGION_LENGTH__)?__DATA_REGION_LENGTH__:0xffa0
+                [0x0000000000000200]                __EEPROM_REGION_LENGTH__ = DEFINED (__EEPROM_REGION_LENGTH__)?__EEPROM_REGION_LENGTH__:0x10000
+                [0x0000000000000003]                __FUSE_REGION_LENGTH__ = DEFINED (__FUSE_REGION_LENGTH__)?__FUSE_REGION_LENGTH__:0x400
+                0x0000000000000400                __LOCK_REGION_LENGTH__ = DEFINED (__LOCK_REGION_LENGTH__)?__LOCK_REGION_LENGTH__:0x400
+                0x0000000000000400                __SIGNATURE_REGION_LENGTH__ = DEFINED (__SIGNATURE_REGION_LENGTH__)?__SIGNATURE_REGION_LENGTH__:0x400
+                0x0000000000000400                __USER_SIGNATURE_REGION_LENGTH__ = DEFINED (__USER_SIGNATURE_REGION_LENGTH__)?__USER_SIGNATURE_REGION_LENGTH__:0x400
+
+.hash
+ *(.hash)
+
+.dynsym
+ *(.dynsym)
+
+.dynstr
+ *(.dynstr)
+
+.gnu.version
+ *(.gnu.version)
+
+.gnu.version_d
+ *(.gnu.version_d)
+
+.gnu.version_r
+ *(.gnu.version_r)
+
+.rel.init
+ *(.rel.init)
+
+.rela.init
+ *(.rela.init)
+
+.rel.text
+ *(.rel.text)
+ *(.rel.text.*)
+ *(.rel.gnu.linkonce.t*)
+
+.rela.text
+ *(.rela.text)
+ *(.rela.text.*)
+ *(.rela.gnu.linkonce.t*)
+
+.rel.fini
+ *(.rel.fini)
+
+.rela.fini
+ *(.rela.fini)
+
+.rel.rodata
+ *(.rel.rodata)
+ *(.rel.rodata.*)
+ *(.rel.gnu.linkonce.r*)
+
+.rela.rodata
+ *(.rela.rodata)
+ *(.rela.rodata.*)
+ *(.rela.gnu.linkonce.r*)
+
+.rel.data
+ *(.rel.data)
+ *(.rel.data.*)
+ *(.rel.gnu.linkonce.d*)
+
+.rela.data
+ *(.rela.data)
+ *(.rela.data.*)
+ *(.rela.gnu.linkonce.d*)
+
+.rel.ctors
+ *(.rel.ctors)
+
+.rela.ctors
+ *(.rela.ctors)
+
+.rel.dtors
+ *(.rel.dtors)
+
+.rela.dtors
+ *(.rela.dtors)
+
+.rel.got
+ *(.rel.got)
+
+.rela.got
+ *(.rela.got)
+
+.rel.bss
+ *(.rel.bss)
+
+.rela.bss
+ *(.rela.bss)
+
+.rel.plt
+ *(.rel.plt)
+
+.rela.plt
+ *(.rela.plt)
+
+.text           0x0000000000000000       0x90
+ *(.vectors)
+ .vectors       0x0000000000000000       0x34 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+                0x0000000000000000                __vector_default
+                0x0000000000000000                __vectors
+ *(.vectors)
+ *(.progmem.gcc*)
+ *(.dinit)
+ .dinit         0x0000000000000034        0xc data_init
+                0x0000000000000040                . = ALIGN (0x2)
+ *fill*         0x0000000000000040        0x0 
+                0x0000000000000040                __trampolines_start = .
+ *(.trampolines)
+ .trampolines   0x0000000000000040        0x0 linker stubs
+ *(.trampolines*)
+                0x0000000000000040                __trampolines_end = .
+ *libprintf_flt.a:*(.progmem.data)
+ *libc.a:*(.progmem.data)
+                0x0000000000000040                . = ALIGN (0x2)
+ *(.jumptables)
+ *(.jumptables*)
+ *(.lowtext)
+ *(.lowtext*)
+                0x0000000000000040                __ctors_start = .
+ *(.ctors)
+                0x0000000000000040                __ctors_end = .
+                0x0000000000000040                __dtors_start = .
+ *(.dtors)
+                0x0000000000000040                __dtors_end = .
+ SORT(*)(.ctors)
+ SORT(*)(.dtors)
+ *(.init0)
+ .init0         0x0000000000000040        0x0 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+                0x0000000000000040                __init
+ *(.init0)
+ *(.init1)
+ *(.init1)
+ *(.init2)
+ .init2         0x0000000000000040        0xc C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ *(.init2)
+ *(.init3)
+ *(.init3)
+ *(.init4)
+ .init4         0x000000000000004c       0x3c c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_copy_data.o)
+                0x000000000000004c                __do_copy_data
+                0x000000000000007a                __do_clear_bss
+ *(.init4)
+ *(.init5)
+ *(.init5)
+ *(.init6)
+ *(.init6)
+ *(.init7)
+ *(.init7)
+ *(.init8)
+ *(.init8)
+ *(.init9)
+ .init9         0x0000000000000088        0x4 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+ *(.init9)
+                0x000000000000008c                . = ALIGN (0x2)
+ *(.fini9)
+ .fini9         0x000000000000008c        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+                0x000000000000008c                _exit
+ *(.fini9)
+ *(.fini8)
+ *(.fini8)
+ *(.fini7)
+ *(.fini7)
+ *(.fini6)
+ *(.fini6)
+ *(.fini5)
+ *(.fini5)
+ *(.fini4)
+ *(.fini4)
+ *(.fini3)
+ *(.fini3)
+ *(.fini2)
+ *(.fini2)
+ *(.fini1)
+ *(.fini1)
+ *(.fini0)
+ .fini0         0x000000000000008c        0x4 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+ *(.fini0)
+                0x0000000000000090                _etext = .
+
+.data           0x0000000000800100        0x0 load address 0x0000000000000090
+                [!provide]                        PROVIDE (__data_start, .)
+ *(.gnu.linkonce.d*)
+ *(.gnu.linkonce.r*)
+                0x0000000000800100                . = ALIGN (0x2)
+                0x0000000000800100                _edata = .
+                [!provide]                        PROVIDE (__data_end, .)
+
+.bss            0x0000000000800100        0x0
+                [!provide]                        PROVIDE (__bss_start, .)
+ *(COMMON)
+                [!provide]                        PROVIDE (__bss_end, .)
+                0x0000000000000090                __data_load_start = LOADADDR (.data)
+                0x0000000000000090                __data_load_end = (__data_load_start + SIZEOF (.data))
+
+.noinit         0x0000000000800100        0x0
+                [!provide]                        PROVIDE (__noinit_start, .)
+ *(.noinit*)
+                [!provide]                        PROVIDE (__noinit_end, .)
+                0x0000000000800100                _end = .
+
+.eeprom         0x0000000000810000        0x0
+ *(.eeprom*)
+                0x0000000000810000                __eeprom_end = .
+
+.fuse
+ *(.fuse)
+ *(.lfuse)
+ *(.hfuse)
+ *(.efuse)
+
+.lock
+ *(.lock*)
+
+.signature
+ *(.signature*)
+
+.user_signatures
+ *(.user_signatures*)
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+
+.stab.excl
+ *(.stab.excl)
+
+.stab.exclstr
+ *(.stab.exclstr)
+
+.stab.index
+ *(.stab.index)
+
+.stab.indexstr
+ *(.stab.indexstr)
+
+.comment        0x0000000000000000       0x2f
+ *(.comment)
+ .comment       0x0000000000000000       0x2f main.o
+                                         0x30 (size before relaxing)
+ .comment       0x000000000000002f       0x30 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+ .comment       0x000000000000002f       0x30 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+
+.note.GNU-stack
+                0x0000000000000000        0x0
+ .note.GNU-stack
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+ .note.GNU-stack
+                0x0000000000000000        0x0 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+
+.stack.descriptors.hdr
+                0x0000000000000000        0xe
+ .stack.descriptors.hdr
+                0x0000000000000000        0xe c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/avr4/memx-const\libgcc.a(_exit.o)
+
+.note.gnu.build-id
+ *(.note.gnu.build-id)
+
+.debug
+ *(.debug)
+
+.line
+ *(.line)
+
+.debug_srcinfo
+ *(.debug_srcinfo)
+
+.debug_sfnames
+ *(.debug_sfnames)
+
+.debug_aranges
+ *(.debug_aranges)
+
+.debug_pubnames
+ *(.debug_pubnames)
+
+.debug_info     0x0000000000000000      0x5f4
+ *(.debug_info .gnu.linkonce.wi.*)
+ .debug_info    0x0000000000000000      0x5f4 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+
+.debug_abbrev   0x0000000000000000      0x5a2
+ *(.debug_abbrev)
+ .debug_abbrev  0x0000000000000000      0x5a2 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+
+.debug_line     0x0000000000000000      0x137
+ *(.debug_line .debug_line.* .debug_line_end)
+ .debug_line    0x0000000000000000      0x137 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+
+.debug_frame
+ *(.debug_frame)
+
+.debug_str      0x0000000000000000      0x208
+ *(.debug_str)
+ .debug_str     0x0000000000000000      0x208 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+
+.debug_loc
+ *(.debug_loc)
+
+.debug_macinfo
+ *(.debug_macinfo)
+
+.debug_weaknames
+ *(.debug_weaknames)
+
+.debug_funcnames
+ *(.debug_funcnames)
+
+.debug_typenames
+ *(.debug_typenames)
+
+.debug_varnames
+ *(.debug_varnames)
+
+.debug_pubtypes
+ *(.debug_pubtypes)
+
+.debug_ranges
+ *(.debug_ranges)
+
+.debug_macro
+ *(.debug_macro)
+OUTPUT(halloween_puff.elf elf32-avr)
+LOAD linker stubs
+LOAD data_init
+
+.note.gnu.avr.deviceinfo
+                0x0000000000000000       0x3c
+ .note.gnu.avr.deviceinfo
+                0x0000000000000000       0x3c C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+
+.text           0x0000000000000090        0x2
+ .text          0x0000000000000090        0x2 C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/lib/avr4/memx-const/crtatmega88p.o
+                0x0000000000000090                __vector_22
+                0x0000000000000090                __vector_1
+                0x0000000000000090                __vector_24
+                0x0000000000000090                __vector_12
+                0x0000000000000090                __bad_interrupt
+                0x0000000000000090                __vector_6
+                0x0000000000000090                __vector_3
+                0x0000000000000090                __vector_23
+                0x0000000000000090                __vector_25
+                0x0000000000000090                __vector_11
+                0x0000000000000090                __vector_13
+                0x0000000000000090                __vector_17
+                0x0000000000000090                __vector_19
+                0x0000000000000090                __vector_7
+                0x0000000000000090                __vector_5
+                0x0000000000000090                __vector_4
+                0x0000000000000090                __vector_9
+                0x0000000000000090                __vector_2
+                0x0000000000000090                __vector_21
+                0x0000000000000090                __vector_15
+                0x0000000000000090                __vector_8
+                0x0000000000000090                __vector_14
+                0x0000000000000090                __vector_10
+                0x0000000000000090                __vector_16
+                0x0000000000000090                __vector_18
+                0x0000000000000090                __vector_20
+
+.text.i2c_write_byte
+                0x0000000000000092       0x44
+ .text.i2c_write_byte
+                0x0000000000000092       0x44 main.o
+
+.text.lcd_pulse_enable
+                0x00000000000000d6       0x24
+ .text.lcd_pulse_enable
+                0x00000000000000d6       0x24 main.o
+
+.text.lcd_send  0x00000000000000fa       0x36
+ .text.lcd_send
+                0x00000000000000fa       0x36 main.o
+
+.progmemx.data  0x0000000000000130       0x31
+ .progmemx.data
+                0x0000000000000130       0x31 main.o
+
+.text.startup.main
+                0x0000000000000161      0x425
+ *fill*         0x0000000000000161        0x1 
+ .text.startup.main
+                0x0000000000000162      0x424 main.o
+                0x0000000000000162                main
+
+.progmemx.data.correct_pin
+                0x0000000000000586        0x8
+ .progmemx.data.correct_pin
+                0x0000000000000586        0x8 main.o
+                0x0000000000000586                correct_pin
+
+.text.__dummy_fini
+                0x000000000000058e        0x2
+ .text.__dummy_fini
+                0x000000000000058e        0x2 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+                0x000000000000058e                _fini
+
+.text.__dummy_funcs_on_exit
+                0x0000000000000590        0x2
+ .text.__dummy_funcs_on_exit
+                0x0000000000000590        0x2 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+                0x0000000000000590                __funcs_on_exit
+
+.text.__dummy_simulator_exit
+                0x0000000000000592        0x2
+ .text.__dummy_simulator_exit
+                0x0000000000000592        0x2 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+                0x0000000000000592                __simulator_exit
+
+.text.exit      0x0000000000000594        0xe
+ .text.exit     0x0000000000000594        0xe c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(exit.o)
+                0x0000000000000594                exit
+
+.text._Exit     0x00000000000005a2        0x2
+ .text._Exit    0x00000000000005a2        0x2 c:/program files/microchip/xc8/v2.36/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/memx-const\libc.a(_Exit.o)
+                0x00000000000005a2                _Exit
+
+.rodata         0x0000000000800100        0xc load address 0x00000000000005a4
+ .rodata        0x0000000000800100        0xc main.o
+
+.bss.pin_length
+                0x000000000080010c        0x1
+ .bss.pin_length
+                0x000000000080010c        0x1 main.o
+                0x000000000080010c                pin_length
+
+.bss.pin        0x000000000080010d        0x8
+ .bss.pin       0x000000000080010d        0x8 main.o
+                0x000000000080010d                pin
diff --git a/halloween_puff/Release/main.d b/halloween_puff/Release/main.d
new file mode 100644 (file)
index 0000000..e6bda49
--- /dev/null
@@ -0,0 +1,49 @@
+main.d main.o: .././main.c \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\io.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\sfr_defs.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\inttypes.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\features.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\lib\gcc\avr\5.4.0\include\stdint.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\stdint.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\bits\alltypes.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\bits\stdint.h \
+ C:/Program\ Files\ (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/include/avr/iom88p.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\portpins.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\common.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\fuse.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\lock.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\util\delay.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\util\delay_basic.h \
+ c:\program\ files\microchip\xc8\v2.36\avr\avr\include\math.h
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\io.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\sfr_defs.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\inttypes.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\features.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\lib\gcc\avr\5.4.0\include\stdint.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\stdint.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\bits\alltypes.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\bits\stdint.h:
+
+C:/Program\ Files\ (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/xc8/avr/include/avr/iom88p.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\portpins.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\common.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\fuse.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\avr\lock.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\util\delay.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\util\delay_basic.h:
+
+c:\program\ files\microchip\xc8\v2.36\avr\avr\include\math.h:
diff --git a/halloween_puff/Release/main.o b/halloween_puff/Release/main.o
new file mode 100644 (file)
index 0000000..808de0c
Binary files /dev/null and b/halloween_puff/Release/main.o differ
diff --git a/halloween_puff/Release/makedep.mk b/halloween_puff/Release/makedep.mk
new file mode 100644 (file)
index 0000000..6a14fde
--- /dev/null
@@ -0,0 +1,6 @@
+################################################################################
+# Automatically-generated file. Do not edit or delete the file
+################################################################################
+
+main.c
+
diff --git a/halloween_puff/Release/memoryfile.xml b/halloween_puff/Release/memoryfile.xml
new file mode 100644 (file)
index 0000000..503b1ef
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<project>                                  
+  <executable name="halloween_puff.elf">                 
+    <memory name="program">              
+      <units>bytes</units>                 
+      <length>8192</length>                 
+      <used>1456</used>                     
+      <free>6736</free>                     
+    </memory>                              
+    <memory name="data">                 
+      <units>bytes</units>                 
+      <length>1024</length>                 
+      <used>21</used>                     
+      <free>1003</free>                     
+    </memory>                              
+  </executable>                            
+</project>                                 
diff --git a/halloween_puff/halloween_puff.componentinfo.xml b/halloween_puff/halloween_puff.componentinfo.xml
new file mode 100644 (file)
index 0000000..53b67ea
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Store xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="AtmelPackComponentManagement">
+       <ProjectComponents>
+               <ProjectComponent z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
+                       <CApiVersion></CApiVersion>
+                       <CBundle></CBundle>
+                       <CClass>Device</CClass>
+                       <CGroup>Startup</CGroup>
+                       <CSub></CSub>
+                       <CVariant></CVariant>
+                       <CVendor>Atmel</CVendor>
+                       <CVersion>1.7.0</CVersion>
+                       <DefaultRepoPath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs</DefaultRepoPath>
+                       <DependentComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
+                       <Description></Description>
+                       <Files xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
+                               <d4p1:anyType i:type="FileInfo">
+                                       <AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\xc8\avr\include\avr\iom88p.h</AbsolutePath>
+                                       <Attribute></Attribute>
+                                       <Category>header</Category>
+                                       <Condition>XC</Condition>
+                                       <FileContentHash>8Uo83M1jILDTCAMw0T59TA==</FileContentHash>
+                                       <FileVersion></FileVersion>
+                                       <Name>xc8/avr/include/avr/iom88p.h</Name>
+                                       <SelectString></SelectString>
+                                       <SourcePath></SourcePath>
+                               </d4p1:anyType>
+                       </Files>
+                       <PackName>ATmega_DFP</PackName>
+                       <PackPath>C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/Atmel.ATmega_DFP.pdsc</PackPath>
+                       <PackVersion>1.7.374</PackVersion>
+                       <PresentInProject>true</PresentInProject>
+                       <ReferenceConditionId>ATmega88P</ReferenceConditionId>
+                       <RteComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
+                               <d4p1:string></d4p1:string>
+                       </RteComponents>
+                       <Status>Resolved</Status>
+                       <VersionMode>Fixed</VersionMode>
+                       <IsComponentInAtProject>true</IsComponentInAtProject>
+               </ProjectComponent>
+       </ProjectComponents>
+</Store>
\ No newline at end of file
diff --git a/halloween_puff/halloween_puff.cproj b/halloween_puff/halloween_puff.cproj
new file mode 100644 (file)
index 0000000..5d0b8a1
--- /dev/null
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectVersion>7.0</ProjectVersion>
+    <ToolchainName>com.microchip.xc8</ToolchainName>
+    <ProjectGuid>2285C48D-296E-43FD-A7B6-69885F64CFFD</ProjectGuid>
+    <avrdevice>ATmega88P</avrdevice>
+    <avrdeviceseries>none</avrdeviceseries>
+    <OutputType>Executable</OutputType>
+    <Language>C</Language>
+    <OutputFileName>$(MSBuildProjectName)</OutputFileName>
+    <OutputFileExtension>.elf</OutputFileExtension>
+    <OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>
+    <AssemblyName>halloween_puff</AssemblyName>
+    <Name>halloween_puff</Name>
+    <RootNamespace>halloween_puff</RootNamespace>
+    <ToolchainFlavour>XC8_2.36</ToolchainFlavour>
+    <KeepTimersRunning>true</KeepTimersRunning>
+    <OverrideVtor>false</OverrideVtor>
+    <CacheFlash>true</CacheFlash>
+    <ProgFlashFromRam>true</ProgFlashFromRam>
+    <RamSnippetAddress>0x20000000</RamSnippetAddress>
+    <UncachedRange />
+    <preserveEEPROM>true</preserveEEPROM>
+    <OverrideVtorValue>exception_table</OverrideVtorValue>
+    <BootSegment>2</BootSegment>
+    <ResetRule>0</ResetRule>
+    <eraseonlaunchrule>0</eraseonlaunchrule>
+    <EraseKey />
+    <AsfFrameworkConfig>
+      <framework-data xmlns="">
+        <options />
+        <configurations />
+        <files />
+        <documentation help="" />
+        <offline-documentation help="" />
+        <dependencies>
+          <content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.52.0" />
+        </dependencies>
+      </framework-data>
+    </AsfFrameworkConfig>
+    <avrtool>com.atmel.avrdbg.tool.jtagice3plus</avrtool>
+    <avrtoolserialnumber>J30200019319</avrtoolserialnumber>
+    <avrdeviceexpectedsignature>0x1E930F</avrdeviceexpectedsignature>
+    <com_atmel_avrdbg_tool_jtagice3plus>
+      <ToolOptions>
+        <InterfaceProperties>
+          <IspClock>125000</IspClock>
+        </InterfaceProperties>
+        <InterfaceName>ISP</InterfaceName>
+      </ToolOptions>
+      <ToolType>com.atmel.avrdbg.tool.jtagice3plus</ToolType>
+      <ToolNumber>J30200019319</ToolNumber>
+      <ToolName>JTAGICE3</ToolName>
+    </com_atmel_avrdbg_tool_jtagice3plus>
+    <avrtoolinterface>ISP</avrtoolinterface>
+    <avrtoolinterfaceclock>125000</avrtoolinterfaceclock>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
+    <ToolchainSettings>
+      <com.microchip.xc8>
+        <com.microchip.xc8.common.optimization.RelaxBranches>True</com.microchip.xc8.common.optimization.RelaxBranches>
+        <com.microchip.xc8.compiler.general.ChangeDefaultCharTypeUnsigned>True</com.microchip.xc8.compiler.general.ChangeDefaultCharTypeUnsigned>
+        <com.microchip.xc8.compiler.general.ChangeDefaultBitFieldUnsigned>True</com.microchip.xc8.compiler.general.ChangeDefaultBitFieldUnsigned>
+        <com.microchip.xc8.compiler.symbols.DefSymbols>
+          <ListValues>
+            <Value>(%24DeviceMacro)</Value>
+            <Value>NDEBUG</Value>
+          </ListValues>
+        </com.microchip.xc8.compiler.symbols.DefSymbols>
+        <com.microchip.xc8.compiler.optimization.level>Optimize for size (-Os)</com.microchip.xc8.compiler.optimization.level>
+        <com.microchip.xc8.compiler.optimization.PackStructureMembers>True</com.microchip.xc8.compiler.optimization.PackStructureMembers>
+        <com.microchip.xc8.compiler.optimization.AllocateBytesNeededForEnum>True</com.microchip.xc8.compiler.optimization.AllocateBytesNeededForEnum>
+        <com.microchip.xc8.compiler.warnings.AllWarnings>True</com.microchip.xc8.compiler.warnings.AllWarnings>
+        <com.microchip.xc8.linker.libraries.Libraries>
+          <ListValues>
+            <Value>libm</Value>
+          </ListValues>
+        </com.microchip.xc8.linker.libraries.Libraries>
+      </com.microchip.xc8>
+    </ToolchainSettings>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
+    <ToolchainSettings>
+      <com.microchip.xc8>
+        <com.microchip.xc8.compiler.general.ChangeDefaultCharTypeUnsigned>True</com.microchip.xc8.compiler.general.ChangeDefaultCharTypeUnsigned>
+        <com.microchip.xc8.compiler.general.ChangeDefaultBitFieldUnsigned>True</com.microchip.xc8.compiler.general.ChangeDefaultBitFieldUnsigned>
+        <com.microchip.xc8.compiler.symbols.DefSymbols>
+          <ListValues>
+            <Value>(%24DeviceMacro)</Value>
+            <Value>DEBUG</Value>
+          </ListValues>
+        </com.microchip.xc8.compiler.symbols.DefSymbols>
+        <com.microchip.xc8.compiler.optimization.level>Optimize debugging experience (-Og)</com.microchip.xc8.compiler.optimization.level>
+        <com.microchip.xc8.compiler.optimization.PackStructureMembers>True</com.microchip.xc8.compiler.optimization.PackStructureMembers>
+        <com.microchip.xc8.compiler.optimization.AllocateBytesNeededForEnum>True</com.microchip.xc8.compiler.optimization.AllocateBytesNeededForEnum>
+        <com.microchip.xc8.compiler.optimization.DebugLevel>Default (-g2)</com.microchip.xc8.compiler.optimization.DebugLevel>
+        <com.microchip.xc8.compiler.warnings.AllWarnings>True</com.microchip.xc8.compiler.warnings.AllWarnings>
+        <com.microchip.xc8.linker.libraries.Libraries>
+          <ListValues>
+            <Value>libm</Value>
+          </ListValues>
+        </com.microchip.xc8.linker.libraries.Libraries>
+        <com.microchip.xc8.assembler.debugging.DebugLevel>Default (-Wa,-g)</com.microchip.xc8.assembler.debugging.DebugLevel>
+      </com.microchip.xc8>
+    </ToolchainSettings>
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Include="main.c">
+      <SubType>compile</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\Compiler.targets" />
+</Project>
\ No newline at end of file
diff --git a/halloween_puff/main.c b/halloween_puff/main.c
new file mode 100644 (file)
index 0000000..e57bf71
--- /dev/null
@@ -0,0 +1,334 @@
+#define F_CPU   1000000UL
+#define I2C_FREQ 50000UL
+
+#include <avr/io.h>
+#include <util/delay.h>
+#include <stdint.h>
+
+// ============================================================
+// I2C configuration
+// ============================================================
+
+#define LCD_ADDR       0x27
+
+#define PIN_LENGTH 7
+
+char pin[PIN_LENGTH + 1] = {0};
+uint8_t pin_length = 0;
+char last_key = '\0';
+const char correct_pin[] = "7355608";
+
+// PCF8574 pin mapping for the LCD
+#define LCD_RS         (1 << 0)
+#define LCD_RW         (1 << 1)
+#define LCD_EN         (1 << 2)
+#define LCD_BACKLIGHT  (1 << 3)
+
+// ============================================================
+// I2C / TWI driver
+// ============================================================
+
+static void i2c_init(void)
+{
+       TWSR = 0;
+       TWBR = (uint8_t)((F_CPU / I2C_FREQ - 16) / 2);
+       TWCR = (1 << TWEN);
+}
+
+static void i2c_start(void)
+{
+       TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
+       while (!(TWCR & (1 << TWINT))) {
+       }
+}
+
+static void i2c_write(uint8_t data)
+{
+       TWDR = data;
+       TWCR = (1 << TWINT) | (1 << TWEN);
+       while (!(TWCR & (1 << TWINT))) {
+       }
+}
+
+static void i2c_stop(void)
+{
+       TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
+       while (TWCR & (1 << TWSTO)) {
+       }
+}
+
+static void i2c_write_byte(uint8_t address, uint8_t data)
+{
+       i2c_start();
+       i2c_write((address << 1) | 0);
+       i2c_write(data);
+       i2c_stop();
+}
+
+// ============================================================
+// HD44780 LCD via PCF8574 I2C expander
+// ============================================================
+
+static void lcd_expander_write(uint8_t data)
+{
+       i2c_write_byte(LCD_ADDR, data | LCD_BACKLIGHT);
+}
+
+static void lcd_pulse_enable(uint8_t data)
+{
+       lcd_expander_write(data | LCD_EN);
+       _delay_us(1);
+
+       lcd_expander_write(data & ~LCD_EN);
+       _delay_us(50);
+}
+
+static void lcd_write4(uint8_t nibble, uint8_t mode)
+{
+       uint8_t data = (nibble & 0xF0) | mode | LCD_BACKLIGHT;
+       lcd_expander_write(data);
+       lcd_pulse_enable(data);
+}
+
+static void lcd_send(uint8_t value, uint8_t mode)
+{
+       lcd_write4(value & 0xF0, mode);
+       lcd_write4((value << 4) & 0xF0, mode);
+}
+
+static void lcd_command(uint8_t cmd)
+{
+       lcd_send(cmd, 0);
+
+       if (cmd == 0x01 || cmd == 0x02) {
+               _delay_ms(2);
+       }
+}
+
+static void lcd_data(uint8_t data)
+{
+       lcd_send(data, LCD_RS);
+}
+
+static void lcd_putc(char c)
+{
+       lcd_data((uint8_t)c);
+}
+
+static void lcd_print(const char *str)
+{
+       while (*str) {
+               lcd_putc(*str++);
+       }
+}
+
+static void lcd_clear(void)
+{
+       lcd_command(0x01);
+}
+
+static void lcd_goto(uint8_t row, uint8_t col)
+{
+       uint8_t address = (row == 0) ? 0x00 : 0x40;
+       lcd_command(0x80 | (address + col));
+}
+
+static void lcd_init(void)
+{
+       _delay_ms(50);
+
+       lcd_write4(0x30, 0);
+       _delay_ms(5);
+
+       lcd_write4(0x30, 0);
+       _delay_us(150);
+
+       lcd_write4(0x30, 0);
+       _delay_us(150);
+
+       lcd_write4(0x20, 0);
+       _delay_us(150);
+
+       lcd_command(0x28); // 4-bit mode, 2 lines, 5x8 font
+       lcd_command(0x08); // Display off
+       lcd_command(0x01); // Clear display
+       lcd_command(0x06); // Entry mode: increment cursor
+       lcd_command(0x0C); // Display on, cursor off
+}
+
+// ============================================================
+// Main: initialize I2C and LCD only
+// ============================================================
+
+int main(void)
+{
+       // Configure Port D pins
+       DDRD &= ~((1 << DDD5) | (1 << DDD6) | (1 << DDD7));
+       PORTD |= (1 << PORTD5) | (1 << PORTD6) | (1 << PORTD7);
+
+       DDRD |= (1 << DDD0) | (1 << DDD1) |
+       (1 << DDD2) | (1 << DDD3);
+
+       // Configure PC0 and PC3 as outputs
+       DDRC |= (1 << DDC0) | (1 << DDC1) | (1 << DDC3);
+       PORTC = 0;
+
+       // Initialize I2C and LCD
+       i2c_init();
+       lcd_init();
+
+       lcd_clear();
+       lcd_goto(0, 0);
+       lcd_print("PIN: ");
+
+       // Keypad configuration
+       const uint8_t row_pins[4] = {PD0, PD1, PD2, PD3};
+       const uint8_t col_pins[3] = {PD5, PD6, PD7};
+
+       const char keypad[4][3] = {
+               {'1', '2', '3'},
+               {'4', '5', '6'},
+               {'7', '8', '9'},
+               {'*', '0', '#'}
+       };
+
+       char last_key = '\0';
+       uint16_t elapsed_ms = 0;
+
+       while (1)
+       {
+               char key = '\0';
+
+               // Scan keypad
+               for (uint8_t row = 0; row < 4; row++)
+               {
+                       // Release all row pins
+                       DDRD &= ~((1 << PD0) | (1 << PD1) |
+                       (1 << PD2) | (1 << PD3));
+
+                       PORTD &= ~((1 << PD0) | (1 << PD1) |
+                       (1 << PD2) | (1 << PD3));
+
+                       // Drive selected row LOW
+                       DDRD |= (1 << row_pins[row]);
+                       PORTD &= ~(1 << row_pins[row]);
+
+                       _delay_us(10);
+
+                       for (uint8_t col = 0; col < 3; col++)
+                       {
+                               if (!(PIND & (1 << col_pins[col])))
+                               {
+                                       key = keypad[row][col];
+                                       break;
+                               }
+                       }
+
+                       if (key != '\0')
+                       break;
+               }
+
+               // Handle key presses
+               if (key == '\0')
+               {
+                       last_key = '\0';
+               }
+               else if (key != last_key)
+               {
+                       last_key = key;
+
+                       if (key >= '0' && key <= '9' &&
+                       pin_length < PIN_LENGTH)
+                       {
+                               // Blink LED on PC3 for 50 ms
+                               PORTC |= (1 << PORTC3);
+                               _delay_ms(50);
+                               PORTC &= ~(1 << PORTC3);
+
+                               // Store entered digit
+                               pin[pin_length] = key;
+                               pin_length++;
+
+                               // Display entered digit
+                               lcd_goto(0, 5 + pin_length - 1);
+                               lcd_putc(key);
+
+                               // Check when complete PIN has been entered
+                               if (pin_length == PIN_LENGTH)
+                               {
+                                       pin[pin_length] = '\0';
+
+                                       _delay_ms(200);
+                                       uint8_t match = 1;
+
+                                       for (uint8_t i = 0; i < PIN_LENGTH; i++)
+                                       {
+                                               if (pin[i] != correct_pin[i])
+                                               {
+                                                       match = 0;
+                                                       break;
+                                               }
+                                       }
+                                       
+                                       if (match)
+                                       {
+                                               // Correct PIN
+                                               lcd_clear();
+                                               lcd_goto(0, 0);
+                                               lcd_print("Bomb planted!");
+
+                                               // 10-second countdown
+                                               for (int8_t remaining = 10;
+                                               remaining > 0;
+                                               remaining--)
+                                               {
+                                                       lcd_goto(1, 0);
+                                                       lcd_print("Countdown: ");
+                                                       lcd_putc('0' + remaining / 10);
+                                                       lcd_putc('0' + remaining % 10);
+                                                       lcd_print(" ");
+
+                                                       // Toggle LED and beep once per second
+                                                       PINC = (1 << PINC3);
+                                                       
+                                                       PINC = (1 << PINC0);
+                                                       _delay_ms(20);
+                                                       PINC = (1 << PINC0);
+
+                                                       _delay_ms(1000 - 20);
+                                               }
+
+                                               // Countdown finished
+                                               lcd_clear();
+                                               lcd_goto(0, 0);
+                                               lcd_print("Puff!");
+                                               PORTC = 0; 
+                                               PORTC = (1 << PORTC1) | (1 << PORTC3);
+                                               
+                                               _delay_ms(100000);
+                                       }
+                                       else
+                                       {
+                                               // Incorrect PIN
+                                               lcd_clear();
+                                               lcd_goto(0, 0);
+                                               lcd_print("Wrong PIN!");
+
+                                               _delay_ms(5000);
+                                       }
+
+                                       // Reset PIN input
+                                       pin_length = 0;
+                                       pin[0] = '\0';
+
+                                       lcd_clear();
+                                       lcd_goto(0, 0);
+                                       lcd_print("PIN: ");
+
+                                       last_key = key;
+                               }
+                       }
+               }
+       }
+}
+