diff options
Diffstat (limited to 'avr-test')
| -rw-r--r-- | avr-test/Makefile | 168 | ||||
| -rwxr-xr-x | avr-test/avr-fusedump.bash | 102 | ||||
| -rwxr-xr-x | avr-test/ledcube.bin | bin | 0 -> 4402 bytes | |||
| -rwxr-xr-x | avr-test/ledcube.elf | bin | 0 -> 32968 bytes | |||
| -rw-r--r-- | avr-test/ledcube.hex | 277 | ||||
| -rw-r--r-- | avr-test/ledcube.lst | 3367 | ||||
| -rw-r--r-- | avr-test/ledcube.map | 783 | ||||
| -rwxr-xr-x | avr-test/ledcube.srec | 278 | ||||
| -rwxr-xr-x | avr-test/ledcube_eeprom.bin | 0 | ||||
| -rw-r--r-- | avr-test/ledcube_eeprom.hex | 1 | ||||
| -rwxr-xr-x | avr-test/ledcube_eeprom.srec | 2 | ||||
| l--------- | avr-test/mc | 1 | ||||
| -rw-r--r-- | avr-test/src/cube.h | 32 | ||||
| -rw-r--r-- | avr-test/src/draw.cpp | 559 | ||||
| -rw-r--r-- | avr-test/src/draw.h | 71 | ||||
| -rw-r--r-- | avr-test/src/effect.cpp | 1021 | ||||
| -rw-r--r-- | avr-test/src/effect.h | 54 | ||||
| -rw-r--r-- | avr-test/src/fuses.txt | 6 | ||||
| -rw-r--r-- | avr-test/src/lisence.txt | 5 | ||||
| -rw-r--r-- | avr-test/src/main.c.old | 285 | ||||
| -rw-r--r-- | avr-test/src/main.cpp | 508 | ||||
| -rw-r--r-- | avr-test/src/main.h | 45 | ||||
| -rw-r--r-- | avr-test/tags | 150 | 
23 files changed, 7715 insertions, 0 deletions
| diff --git a/avr-test/Makefile b/avr-test/Makefile new file mode 100644 index 0000000..4e97a43 --- /dev/null +++ b/avr-test/Makefile @@ -0,0 +1,168 @@ +PRG            = ledcube +OBJ            = main.o draw.o effect.o +#MCU_TARGET     = at90s2313 +#MCU_TARGET     = at90s2333 +#MCU_TARGET     = at90s4414 +#MCU_TARGET     = at90s4433 +#MCU_TARGET     = at90s4434 +#MCU_TARGET     = at90s8515 +#MCU_TARGET     = at90s8535 +#MCU_TARGET     = atmega128 +#MCU_TARGET     = atmega1280 +#MCU_TARGET     = atmega1281 +#MCU_TARGET     = atmega1284p +#MCU_TARGET     = atmega16 +#MCU_TARGET     = atmega163 +#MCU_TARGET     = atmega164p +#MCU_TARGET     = atmega165 +#MCU_TARGET     = atmega165p +#MCU_TARGET     = atmega168 +#MCU_TARGET     = atmega169 +#MCU_TARGET     = atmega169p +#MCU_TARGET     = atmega2560 +#MCU_TARGET     = atmega2561 +#MCU_TARGET     = atmega32 +#MCU_TARGET     = atmega324p +#MCU_TARGET     = atmega325 +#MCU_TARGET     = atmega3250 +#MCU_TARGET     = atmega329 +#MCU_TARGET     = atmega3290 +#MCU_TARGET     = atmega48 +#MCU_TARGET     = atmega64 +#MCU_TARGET     = atmega640 +#MCU_TARGET     = atmega644 +#MCU_TARGET     = atmega644p +#MCU_TARGET     = atmega645 +#MCU_TARGET     = atmega6450 +#MCU_TARGET     = atmega649 +#MCU_TARGET     = atmega6490 +MCU_TARGET     = atmega8 +#MCU_TARGET     = atmega8515 +#MCU_TARGET     = atmega8535 +#MCU_TARGET     = atmega88 +#MCU_TARGET     = attiny2313 +#MCU_TARGET     = attiny24 +#MCU_TARGET     = attiny25 +#MCU_TARGET     = attiny26 +#MCU_TARGET     = attiny261 +#MCU_TARGET     = attiny44 +#MCU_TARGET     = attiny45 +#MCU_TARGET     = attiny461 +#MCU_TARGET     = attiny84 +#MCU_TARGET     = attiny85 +#MCU_TARGET     = attiny861 + +#OPTIMIZE       = -O2 +OPTIMIZE       = -Os + +# One must use -ffunction-sections (compiler switch) AND -Wl,-gc-sections +# (linker switch) to have the linker "garbage collect" (or remove) unused +# sections. The -ffunction-sections switch places all functions within their +# own section. You must use both together to make this work. +DEFS           = -ffunction-sections +LIBS           = -Wl,-gc-sections +# You should not have to change anything below here. + +CC             = avr-gcc +CXX            = avr-g++ + +# Override is only needed by avr-lib build system. + +override CFLAGS        = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS) #-fno-exceptions -fno-rtti +override LDFLAGS       = -Wl,-Map,$(PRG).map --relax + +OBJCOPY        = avr-objcopy +OBJDUMP        = avr-objdump + +%.o: src/%.cpp +	$(CXX) $(CFLAGS) -c -o $@ $^ + +all: $(PRG).elf lst text eeprom +	avr-size --mcu=$(MCU_TARGET) -C $(PRG).elf + +$(PRG).elf: $(OBJ) +	$(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) + +# dependency: +#demo.o: demo.c iocompat.h +#%.o: %.c + +clean: +	rm -rf *.o $(PRG).elf *.eps *.png *.pdf *.bak  +	rm -rf *.lst *.map $(EXTRA_CLEAN_FILES) + +lst:  $(PRG).lst + +%.lst: %.elf +	$(OBJDUMP) -h -S $< > $@ + +# Rules for building the .text rom images + +text: hex bin srec + +hex:  $(PRG).hex +bin:  $(PRG).bin +srec: $(PRG).srec + +%.hex: %.elf +	$(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.srec: %.elf +	$(OBJCOPY) -j .text -j .data -O srec $< $@ + +%.bin: %.elf +	$(OBJCOPY) -j .text -j .data -O binary $< $@ + +# Rules for building the .eeprom rom images + +eeprom: ehex ebin esrec + +ehex:  $(PRG)_eeprom.hex +ebin:  $(PRG)_eeprom.bin +esrec: $(PRG)_eeprom.srec + +%_eeprom.hex: %.elf +	$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ \ +	|| { echo empty $@ not generated; exit 0; } + +%_eeprom.srec: %.elf +	$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@ \ +	|| { echo empty $@ not generated; exit 0; } + +%_eeprom.bin: %.elf +	$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O binary $< $@ \ +	|| { echo empty $@ not generated; exit 0; } + +# Every thing below here is used by avr-libc's build system and can be ignored +# by the casual user. + +FIG2DEV                 = fig2dev +EXTRA_CLEAN_FILES       = *.hex *.bin *.srec + +dox: eps png pdf + +eps: $(PRG).eps +png: $(PRG).png +pdf: $(PRG).pdf + +%.eps: %.fig +	$(FIG2DEV) -L eps $< $@ + +%.pdf: %.fig +	$(FIG2DEV) -L pdf $< $@ + +%.png: %.fig +	$(FIG2DEV) -L png $< $@ + +flash: +	# for atmega8 : +	avrdude -p m8 -c stk500v2 -P /dev/ttyUSB0 -e -U flash:w:$(PRG).hex +	# for attiny25 +	#avrdude -p t25 -c stk500v2 -P /dev/ttyUSB0 -e -U flash:w:$(PRG).hex + +a: all flash + +size: +	avr-size --mcu=$(MCU_TARGET) -t -A $(PRG).elf +	avr-size --mcu=$(MCU_TARGET) -C $(PRG).elf +	avr-nm --size-sort $(PRG).elf diff --git a/avr-test/avr-fusedump.bash b/avr-test/avr-fusedump.bash new file mode 100755 index 0000000..d6c6e50 --- /dev/null +++ b/avr-test/avr-fusedump.bash @@ -0,0 +1,102 @@ +#!/bin/bash +############################################################################# +#Bash script to dump the fuse bits for AVR microcontrollers and open  +#the Engbedded Atmel AVR Fuse Calculator with the current fuse settings. +# +#05-Nov-2009 +#Craig Heffner +#http://www.hackingwithgum.com +############################################################################# + +LFUSE=lfuse +HFUSE=hfuse +EFUSE=efuse +URL="http://www.engbedded.com/cgi-bin/fcx.cgi?P=MMCU&V_LOW=$LFUSE&V_HIGH=$HFUSE&V_EXTENDED=$EFUSE&O_HEX=Apply+values" +ADSUCCESS=OK +ADOK=0 +FUSE="" +DATA="" +ADARGS="" + +#Loop through all the arguments to the script and concatenate them into $ADARGS. +#These arguments get passed directly to avrdude. +while [ $# -ne 0 ] +do +	#If this argument is -p, then the next one is the chip name +	if [ "$1" == "-p" ] && [ "$2" != "" ] +	then +		URL=$(echo $URL | sed -e "s/MMCU/$2/") +	fi + +        ADARGS="$ADARGS $1" +        shift +done + +#Does the user need usage help? +if [ "$ADARGS" == "" ] || [ "$ADARGS" == "-h" ] || [ "$ADARGS" == "--help" ] +then +	echo "" +	echo "Usage: $0 -c <programmer> -p <partno>" +	echo "" +	echo -e "\tExample: $0 -c usbtiny -p ATmega8" +	echo "" +	echo -e "Note that the argument supplied to -p is case-sensitive.\nIt should look exactly as it does in the Engbedded Web site's select box.\n" +	exit +fi + +#Dump fuse info with avrdude and loop through the output word by word +for WORD in $(avrdude $ADARGS -q -U lfuse:r:-:i -U hfuse:r:-:i -U efuse:r:-:i 2>&1) +do +	#Check for the success indicator +	if [ "$WORD" == "$ADSUCCESS" ] +	then +		ADOK=1 +	fi + +	#Look for keywords "lfuse", "hfuse", or "efuse". They appear  +	#just before the corresponding fuse values are displayed. +	if [ $(echo $WORD | grep $LFUSE) ] +	then +		FUSE=$LFUSE +	elif [ $(echo $WORD | grep $HFUSE) ] +	then +		FUSE=$HFUSE +	elif [ $(echo $WORD | grep $EFUSE) ] +	then +		FUSE=$EFUSE +	fi + +	#Have we seen one of the fuse keywords? +	if [ "$FUSE" != "" ] +	then +		#Displayed fuse values start with a colon +		DATA=$(echo $WORD | grep -e "^:") + +		if [ "$DATA" != "" ] +		then +			#Pull out the fuse byte; 9th and 10th characters in the displayed value +			DATA=${DATA:9:2} +			 +			#Display the fuse value and update the Engbedded URL with the value +			echo -e "$FUSE\t0x$DATA" +			URL=$(echo $URL | sed -e "s/$FUSE/$DATA/") + +			#Clear these in order to look for the next fuse +			FUSE="" +			DATA="" +		fi +	fi +done + +#If there was an error, let the user know. +#Else, open the Engbedded URL. +if [ $ADOK -ne 1 ] +then +	echo "Avrdude failed! Check your programmer and chip arguments." +else +	#Show the URL +	#echo $URL + +	#Open the URL automatically +	firefox $URL & +fi diff --git a/avr-test/ledcube.bin b/avr-test/ledcube.binBinary files differ new file mode 100755 index 0000000..ed47c62 --- /dev/null +++ b/avr-test/ledcube.bin diff --git a/avr-test/ledcube.elf b/avr-test/ledcube.elfBinary files differ new file mode 100755 index 0000000..7143293 --- /dev/null +++ b/avr-test/ledcube.elf diff --git a/avr-test/ledcube.hex b/avr-test/ledcube.hex new file mode 100644 index 0000000..ac788ca --- /dev/null +++ b/avr-test/ledcube.hex @@ -0,0 +1,277 @@ +:1000000012C02CC02BC070C029C028C027C026C079
 +:1000100025C025C023C022C021C020C01FC01EC0D3
 +:100020001DC01CC01BC011241FBECFE5D4E0DEBF25
 +:10003000CDBF10E0A4E6B0E001C01D92AC3EB10718
 +:10004000E1F710E0A0E6B0E0EEE2F1E102C00590D9
 +:100050000D92A436B107D9F7D9D067C8D1CF1F9276
 +:100060000F920FB60F921124EF92FF920F931F93EE
 +:100070002F933F934F935F938F939F93E090E5006F
 +:10008000F090E6000091E7001091E800A8019701C8
 +:100090002E5F3F4F4F4F5F4F9091EB00892F8A5F4C
 +:1000A0008093EB008D3748F097579093EB00A801B1
 +:1000B00097012D5F3F4F4F4F5F4F2093E5003093E7
 +:1000C000E6004093E7005093E8009F918F915F9185
 +:1000D0004F913F912F911F910F91FF90EF900F90B3
 +:1000E0000FBE0F901F9018951F920F920FB60F9290
 +:1000F00011242F933F934F935F936F938F939F930D
 +:10010000AF93BF93EF93FF9385B3877D85BB6091DA
 +:10011000E90057E0A62FB0E0E52FF0E033E0EE0F66
 +:10012000FF1F3A95E1F7EA0FFB1FEC59FF4F4081A3
 +:10013000AC9888B3942F91708E7F982B98BBAC9A13
 +:10014000AC9838B3842F90E095958795282F21702F
 +:100150003E7F232B28BBAC9AAC9838B395958795F6
 +:10016000282F21703E7F232B28BBAC9AAC9838B344
 +:1001700095958795282F21703E7F232B28BBAC9A1D
 +:10018000AC9838B395958795282F21703E7F232B07
 +:1001900028BBAC9AAC9838B395958795282F2170D9
 +:1001A0003E7F232B28BBAC9AAC9828B395958795B6
 +:1001B00081702E7F822B88BBAC9AAC9888B3441F89
 +:1001C0004427441F8E7F482B48BBAC9A515008F0FF
 +:1001D000A3CF85B3962F9862887F982B95BB962FD7
 +:1001E0009F5F983008F090E09093E900FF91EF91C5
 +:1001F000BF91AF919F918F916F915F914F913F917F
 +:100200002F910F900FBE0F901F901895EF92FF92B5
 +:100210000F931F9312BE83B7836083BF89B781603A
 +:1002200089BF8BE083BD85B5856085BD85B5886058
 +:1002300085BD14BC89B7806889BF12BA18BA15BACF
 +:100240008FEF81BB87BB84BB789420E0EE24E394DE
 +:10025000FF24FA9414C080E090E0422F50E0FC01AB
 +:1002600063E0EE0FFF1F6A95E1F7E40FF51FEC590D
 +:10027000FF4FF08201968830910589F72F5F283073
 +:1002800050F3E092A4002091E5003091E600409107
 +:10029000E7005091E8008091E5009091E600A09180
 +:1002A000E700B091E800821B930BA40BB50B885EAE
 +:1002B0009340A040B04078F31092A40084E190E015
 +:1002C0006CED70E040ED57E05DD584E690E084D2BF
 +:1002D00085E090E061E070E0F7D484E190E068EEC2
 +:1002E00073E047D482E090E06AE770E04FEF5FEFA1
 +:1002F00024E630E008EE13E09CD1B1D510E088E7A9
 +:1003000060E070E046E950E021E030E05ED388E74D
 +:1003100061E070E046E950E021E030E056D389E743
 +:1003200060E070E046E950E021E030E04ED389E73C
 +:1003300061E070E046E950E021E030E046D38AE732
 +:1003400060E070E046E950E021E030E03ED38AE72B
 +:1003500061E070E046E950E021E030E036D31F5F15
 +:100360001A3069F620E077CF75D60895089778F4AB
 +:1003700077FD0DC06830710554F457FD08C090E05A
 +:10038000483051050CF091E081E0982701C090E0E1
 +:10039000892F0895FF920F931F93CF93DF93F82E29
 +:1003A0008B01EA01E3DF8823A9F0FE0193E0EE0F61
 +:1003B000FF1F9A95E1F7E00FF11FEC59FF4F2081E5
 +:1003C00081E090E002C0880F991FFA94E2F78095CF
 +:1003D00082238083DF91CF911F910F91FF90089529
 +:1003E000FF920F931F93CF93DF93F82E8B01EA01B7
 +:1003F000BDDF8823A1F0FE0133E0EE0FFF1F3A9529
 +:10040000E1F7E00FF11FEC59FF4F208181E090E010
 +:1004100002C0880F991FFA94E2F7282B2083DF91FE
 +:10042000CF911F910F91FF900895FF920F931F930B
 +:10043000CF93DF93F82E8B01EA0198DF882389F0B0
 +:1004400043E0CC0FDD1F4A95E1F7C00FD11FCC5917
 +:10045000DF4F888190E002C095958795FA94E2F786
 +:100460008170DF91CF911F910F91FF9008952130FE
 +:10047000310511F4B5DF08958DDF089540E050E0B7
 +:1004800010C0FB01E20FF31FEC59FF4F80832F5F79
 +:100490003F4F28303105A9F74F5F5F4F4830510576
 +:1004A00049F020E030E0BA01E3E0660F771FEA95FB
 +:1004B000E1F7E7CF08950BC020E000000000000046
 +:1004C0000000000000002F5F2A35B9F70197009760
 +:1004D00099F708952F923F924F925F926F927F9279
 +:1004E0009F92AF92BF92CF92DF92EF92FF920F93C3
 +:1004F0001F93CF93DF93982E5B01CC24DD2447E03C
 +:10050000242E312C8FEFA8168FEFB80611F4760148
 +:1005100003C07101EC18FD0800E010E02701089409
 +:100520004108510837010894611C711C36C08FEFD7
 +:10053000A8168FEFB80611F4C30101C0C201AC01C7
 +:100540008AE7981641F4C801BE016FDF282FC80161
 +:10055000BE01A70117C089E7981649F4C801BA017E
 +:10056000AE0163DF282FC801B701AE010BC088E7D9
 +:10057000981651F4CA01BE01A80157DF282FC70100
 +:10058000BE01A80130E073DF2196C830D10579F6AD
 +:100590000F5F1F4F0830110519F0C0E0D0E0C7CF42
 +:1005A0000894C11CD11C88E0C816D10409F0AACF58
 +:1005B0008FEFA8168FEFB80619F0EE24FF2403C0C2
 +:1005C00037E0E32EF12C00E010E01EC08AE7981619
 +:1005D00021F4C801BE01A7010DC089E7981621F4D6
 +:1005E000C801B701AE0106C088E7981621F4C7011B
 +:1005F000BE01A801CFDE2196C830D10539F70F5FC3
 +:100600001F4F0830110519F0C0E0D0E0DFCFDF91B7
 +:10061000CF911F910F91FF90EF90DF90CF90BF90FF
 +:10062000AF909F907F906F905F904F903F902F90F2
 +:1006300008952F923F924F925F926F927F928F9286
 +:100640009F92AF92BF92CF92DF92EF92FF920F9361
 +:100650001F93DF93CF93CDB7DEB72E970FB6F894E5
 +:10066000DEBF0FBECDBF9A8389837C836B835E839D
 +:100670004D8338872F831A8709874F5F5F4F21F497
 +:1006800097E0292E312C02C02224332489E0682EE1
 +:10069000712C89819A81681A790A66DEB30132D495
 +:1006A0006C0162DEB3012ED47C014424552475C054
 +:1006B0005BDE8C0159DE9C01C80163E070E022D44E
 +:1006C00001978C0D9D1D9E878D87181619061CF4A9
 +:1006D0008615970514F0DE86CD86C90163E070E0CB
 +:1006E00011D48C01015010400E0D1F1D1016110663
 +:1006F0001CF4061517050CF087018B816D817E8136
 +:10070000E9DE8D849E84AA24BB2430C0EB81FC8169
 +:10071000EA37F10521F4C401B601A10115C08B81AE
 +:100720009C818937910521F4C401B101A6010CC057
 +:10073000EB81FC81E837F10541F44D855E854E0D76
 +:100740005F1DC1016B857C854BDE0894E11CF11CAB
 +:100750000894C11CD11C89819A81E816F906B4F26B
 +:100760000894A11CB11C0894811C911CE981FA8198
 +:10077000AE16BF064CF46801EE24FF24C501800FBD
 +:10078000911F9C878B87E7CF89859A8594DE089493
 +:10079000411C511CCD84DE847801EF81F8854E1612
 +:1007A0005F060CF485CF2E960FB6F894DEBF0FBE11
 +:1007B000CDBFCF91DF911F910F91FF90EF90DF9010
 +:1007C000CF90BF90AF909F908F907F906F905F90F1
 +:1007D0004F903F902F900895AF92BF92CF92DF92AB
 +:1007E000EF92FF920F931F93CF93DF935C01CC2482
 +:1007F000DD242AC0B9DD64E070E084D3EC01EE248E
 +:10080000FF2415C0B1DD8C01AFDD9C01C80168E09B
 +:1008100070E078D3FC01C90168E070E073D3BC01DB
 +:10082000CF0147E050E0DCDD0894E11CF11CEC1640
 +:10083000FD0644F388EE93E03EDE8AE76FEF7FEF3C
 +:1008400049DE0894C11CD11CCA14DB049CF2DF9160
 +:10085000CF911F910F91FF90EF90DF90CF90BF90BD
 +:10086000AF9008957F928F929F92AF92BF92CF9256
 +:10087000DF92EF92FF920F931F93CF93DF93E82EB7
 +:10088000F62E742E6901C0E0D0E0F7E08F2E912C97
 +:10089000E8E0AE2EB12C87E0781661F484010C1BE1
 +:1008A0001D0BA5014C1B5D0B8E2D90E06F2D70E094
 +:1008B00071DD09C0AE01415050408E2D90E06F2D8A
 +:1008C00070E068DD8E018E2D90E06F2D70E0A80144
 +:1008D00087DDC601F0DD2196C830D105E1F6DF9154
 +:1008E000CF911F910F91FF90EF90DF90CF90BF902D
 +:1008F000AF909F908F907F9008954F925F926F92EC
 +:100900007F929F92AF92BF92CF92DF92EF92FF922F
 +:100910000F931F93CF93DF93982E162F072F3A0133
 +:1009200080E0ACDD212F302FC9016C01C0E0D0E0A8
 +:1009300057E0452E512C34C06114710431F0F5019B
 +:100940008081A201481B510904C0F7018081482F12
 +:1009500050E0FAE79F1619F4CE01B8010DC089E7FF
 +:10096000981621F4CE01BA01A80106C098E799169D
 +:1009700021F4CA01B801AE0133DD0F5F1F4F0894A7
 +:10098000A11CB11C0894E11CF11C08301105A1F652
 +:100990002196E8E0F0E0CE0EDF1EC830D10529F048
 +:1009A0005601760100E010E0C7CFDF91CF911F9193
 +:1009B0000F91FF90EF90DF90CF90BF90AF909F90FE
 +:1009C0007F906F905F904F9008952F923F924F923B
 +:1009D0005F926F927F928F929F92AF92BF92CF92CF
 +:1009E000DF92EF92FF920F931F93DF93CF93CDB7D8
 +:1009F000DEB7C158D0400FB6F894DEBF0FBECDBFF2
 +:100A0000CF57DF4F8883C158D0402B013A014901AD
 +:100A100071E4A72EB12CAC0EBD1EF50161E8C62E07
 +:100A2000D12CCC0EDD1E1192EC15FD05E1F700E096
 +:100A300010E01E010894211C311C81E088169104ED
 +:100A4000B9F412C091DC60E470E05CD2E1E4F0E063
 +:100A5000EC0FFD1FE80FF91F8081882399F70F5FC6
 +:100A60001F4F91E0908316C0003411055CF312C053
 +:100A700082E08816910471F4003411055CF4E1E41D
 +:100A8000F0E0EC0FFD1FE00FF11F80818F5F80838E
 +:100A90000F5F1F4FF501EE24FF249081892F8150B5
 +:100AA000863010F49F5F90838081873019F408941A
 +:100AB000E11CF11C3196EC15FD0579F7D101F5012A
 +:100AC00080814114510419F097E0981B892F8C9371
 +:100AD00031961196EC15FD0599F7C301ECDCCF5763
 +:100AE000DF4F8881C158D040B10140E050E005DFC0
 +:100AF00082B394E0892782BB80E4E816F10409F010
 +:100B00009CCFCF57DF4F0FB6F894DEBF0FBECDBFDF
 +:100B1000CF91DF911F910F91FF90EF90DF90CF90D9
 +:100B2000BF90AF909F908F907F906F905F904F900D
 +:100B30003F902F900895AC01DC01FB0120E030E0F4
 +:100B40009C918081981710F49F5F9C939C91808169
 +:100B5000891710F491509C932F5F3F4F1196319657
 +:100B60002034310569F78AE7BA0140E050E0C5DE7C
 +:100B700008952F923F924F925F926F927F928F9241
 +:100B80009F92AF92BF92CF92DF92EF92FF920F931C
 +:100B90001F93DF93CF93CDB7DEB7C058D0400FB6C9
 +:100BA000F894DEBF0FBECDBF2C017B0100E010E04A
 +:100BB0005E010894A11CB11C24E0922E91E4C92E80
 +:100BC000D12CCC0EDD1EF501E00FF11F9082CCDBA5
 +:100BD000F601E00FF11F68E070E094D180830F5FB1
 +:100BE0001F4F0034110579F700E010E081E4A82ED2
 +:100BF000B12CAC0EBD1E6E010894C11CD11C370176
 +:100C0000C601B5014AE797DFC30155DC0F5F1F4FEF
 +:100C100008301105A9F75701AA0CBB1CAA0CBB1C74
 +:100C2000CC24DD24A1E48A2E912C8C0E9D1E1E0165
 +:100C30000894211C311C2BC000E010E0C101B4015C
 +:100C40004AE779DFC30137DC0F5F1F4F083011051A
 +:100C5000A9F7C50130DCEE24FF2486DB8C0184DBA0
 +:100C60009C01C80160E470E04DD1F401E80FF91F68
 +:100C7000C90168E070E046D180830894E11CF11C52
 +:100C800080E2E816F10449F70894C11CD11CC41491
 +:100C9000D50494F2C058DF4F0FB6F894DEBF0FBEF4
 +:100CA000CDBFCF91DF911F910F91FF90EF90DF901B
 +:100CB000CF90BF90AF909F908F907F906F905F90FC
 +:100CC0004F903F902F9008958F929F92AF92BF9236
 +:100CD000CF92DF92EF92FF920F931F93CF93DF9308
 +:100CE0004C018B016130710511F480E001C08FEF80
 +:100CF000C5DBC0E0D0E038DB68E070E003D1B82E9F
 +:100D0000A92E32DB68E070E0FDD0D82EC92E2CDB96
 +:100D100068E070E0F7D0F82EE92E0115110551F4C6
 +:100D20008B2D9A2D6D2D7C2D4F2D5E2D7EDB8130F0
 +:100D300011F70CC001301105F1F68B2D9A2D6D2D98
 +:100D40007C2D4F2D5E2D71DB8823A9F68B2D9A2DDE
 +:100D50006D2D7C2D4F2D5E2D980189DBC401ABDB01
 +:100D6000219681E0CF3FD80731F6DF91CF911F91D7
 +:100D70000F91FF90EF90DF90CF90BF90AF909F903A
 +:100D80008F9008956F927F928F929F92AF92BF92B1
 +:100D9000DF92EF92FF920F931F93CF93DF933C016B
 +:100DA0005B014A0180E06ADB00E010E01CC0DCDA95
 +:100DB00062E070E0A7D0AC0133E0440F551F3A95D4
 +:100DC000E1F7481B590BC801BE010ADB2196C83068
 +:100DD000D10569F70F5F1F4F0830110521F4DD249D
 +:100DE000EE24FF2429C0C0E0D0E0E1CFBDDAEC0161
 +:100DF000BBDA68E070E086D0082F8E15E1F0CE01F6
 +:100E000068E070E07FD0182F8D15A9F090E0602F7A
 +:100E100070E040E050E009DB882321F0812F602F53
 +:100E200040E003C0812F602F47E095011BDDC40126
 +:100E300042DBD12EE02EF3948F2D90E0861597059E
 +:100E4000ACF2DF91CF911F910F91FF90EF90DF9067
 +:100E5000BF90AF909F908F907F906F900895EF928A
 +:100E6000FF920F931F93CF93DF9380E007DB00E0A7
 +:100E700010E04FEEE42E42E0F42E3AC080E0FEDABD
 +:100E8000CE0119DB8FEFFADA84E690E014DBCE01B5
 +:100E900066EF7FEF37D088EE93E034D06F5070402C
 +:100EA000C60FD71F1C161D064CF388EE93E003DB1C
 +:100EB000CEEED2E080E0E2DAC7018C1B9D0BFBDABC
 +:100EC0008FEFDCDA84E690E0F6DACE0166EF7FEFB2
 +:100ED00019D088EE93E016D06F507040C60FD71F20
 +:100EE0001C161D063CF30F5F1F4F0230110519F051
 +:100EF000CEEED2E0C3CFDF91CF911F910F91FF9043
 +:100F0000EF90089597FB092E07260AD077FD04D0AD
 +:100F10000CD006D000201AF4709561957F4F08958B
 +:100F2000F6F7909581959F4F0895AA1BBB1B51E141
 +:100F300007C0AA1FBB1FA617B70710F0A61BB70B49
 +:100F4000881F991F5A95A9F780959095BC01CD01EE
 +:100F500008952F923F924F925F926F927F928F925D
 +:100F60009F92AF92BF92CF92DF92EF92FF920F9338
 +:100F70001F93CF93DF93CDB7DEB7CA1BDB0B0FB642
 +:100F8000F894DEBF0FBECDBF09942A8839884888FF
 +:100F90005F846E847D848C849B84AA84B984C88495
 +:100FA000DF80EE80FD800C811B81AA81B981CE0F8C
 +:100FB000D11D0FB6F894DEBF0FBECDBFED01089571
 +:100FC000A0E0B0E0E5EEF7E0CCCFEC01A880B9807E
 +:100FD000CA80DB80A114B104C104D10441F484E2CD
 +:100FE000A82E89EDB82E8BE5C82E87E0D82EC60135
 +:100FF000B5012DE133EF41E050E05AD027EA31E46A
 +:1010000040E050E036D07B018C01C601B5012DE1F6
 +:1010100033EF41E050E04CD0CA01B9012CEE34EF7F
 +:101020004FEF5FEF26D06E0D7F1D801F911F97FF42
 +:1010300004C06150704080409048688379838A83FF
 +:101040009B839B013F77C901CDB7DEB7EAE0A5CF0F
 +:10105000B7DF089580E690E0B3DF0895A0E0B0E048
 +:101060008093600090936100A0936200B09363004E
 +:101070000895629FD001739FF001829FE00DF11DE2
 +:10108000649FE00DF11D929FF00D839FF00D749F02
 +:10109000F00D659FF00D9927729FB00DE11DF91FAE
 +:1010A000639FB00DE11DF91FBD01CF01112408950B
 +:1010B00097FB092E05260ED057FD04D014D00AD078
 +:1010C000001C38F450954095309521953F4F4F4F77
 +:1010D0005F4F0895F6F790958095709561957F4FD5
 +:1010E0008F4F9F4F0895A1E21A2EAA1BBB1BFD0133
 +:1010F0000DC0AA1FBB1FEE1FFF1FA217B307E407F7
 +:10110000F50720F0A21BB30BE40BF50B661F771F4E
 +:10111000881F991F1A9469F760957095809590952E
 +:0E1120009B01AC01BD01CF010895F894FFCFF3
 +:04112E0001000000BC
 +:00000001FF
 diff --git a/avr-test/ledcube.lst b/avr-test/ledcube.lst new file mode 100644 index 0000000..6fde88b --- /dev/null +++ b/avr-test/ledcube.lst @@ -0,0 +1,3367 @@ + +ledcube.elf:     file format elf32-avr + +Sections: +Idx Name          Size      VMA       LMA       File off  Algn +  0 .text         0000112e  00000000  00000000  00000094  2**1 +                  CONTENTS, ALLOC, LOAD, READONLY, CODE +  1 .data         00000004  00800060  0000112e  000011c2  2**0 +                  CONTENTS, ALLOC, LOAD, DATA +  2 .bss          00000088  00800064  00800064  000011c6  2**0 +                  ALLOC +  3 .stab         00004284  00000000  00000000  000011c8  2**2 +                  CONTENTS, READONLY, DEBUGGING +  4 .stabstr      00001cbd  00000000  00000000  0000544c  2**0 +                  CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00000000 <__vectors>: +       0:	12 c0       	rjmp	.+36     	; 0x26 <__ctors_end> +       2:	2c c0       	rjmp	.+88     	; 0x5c <__bad_interrupt> +       4:	2b c0       	rjmp	.+86     	; 0x5c <__bad_interrupt> +       6:	70 c0       	rjmp	.+224    	; 0xe8 <__vector_3> +       8:	29 c0       	rjmp	.+82     	; 0x5c <__bad_interrupt> +       a:	28 c0       	rjmp	.+80     	; 0x5c <__bad_interrupt> +       c:	27 c0       	rjmp	.+78     	; 0x5c <__bad_interrupt> +       e:	26 c0       	rjmp	.+76     	; 0x5c <__bad_interrupt> +      10:	25 c0       	rjmp	.+74     	; 0x5c <__bad_interrupt> +      12:	25 c0       	rjmp	.+74     	; 0x5e <__vector_9> +      14:	23 c0       	rjmp	.+70     	; 0x5c <__bad_interrupt> +      16:	22 c0       	rjmp	.+68     	; 0x5c <__bad_interrupt> +      18:	21 c0       	rjmp	.+66     	; 0x5c <__bad_interrupt> +      1a:	20 c0       	rjmp	.+64     	; 0x5c <__bad_interrupt> +      1c:	1f c0       	rjmp	.+62     	; 0x5c <__bad_interrupt> +      1e:	1e c0       	rjmp	.+60     	; 0x5c <__bad_interrupt> +      20:	1d c0       	rjmp	.+58     	; 0x5c <__bad_interrupt> +      22:	1c c0       	rjmp	.+56     	; 0x5c <__bad_interrupt> +      24:	1b c0       	rjmp	.+54     	; 0x5c <__bad_interrupt> + +00000026 <__ctors_end>: +      26:	11 24       	eor	r1, r1 +      28:	1f be       	out	0x3f, r1	; 63 +      2a:	cf e5       	ldi	r28, 0x5F	; 95 +      2c:	d4 e0       	ldi	r29, 0x04	; 4 +      2e:	de bf       	out	0x3e, r29	; 62 +      30:	cd bf       	out	0x3d, r28	; 61 + +00000032 <__do_clear_bss>: +      32:	10 e0       	ldi	r17, 0x00	; 0 +      34:	a4 e6       	ldi	r26, 0x64	; 100 +      36:	b0 e0       	ldi	r27, 0x00	; 0 +      38:	01 c0       	rjmp	.+2      	; 0x3c <.do_clear_bss_start> + +0000003a <.do_clear_bss_loop>: +      3a:	1d 92       	st	X+, r1 + +0000003c <.do_clear_bss_start>: +      3c:	ac 3e       	cpi	r26, 0xEC	; 236 +      3e:	b1 07       	cpc	r27, r17 +      40:	e1 f7       	brne	.-8      	; 0x3a <.do_clear_bss_loop> + +00000042 <__do_copy_data>: +      42:	10 e0       	ldi	r17, 0x00	; 0 +      44:	a0 e6       	ldi	r26, 0x60	; 96 +      46:	b0 e0       	ldi	r27, 0x00	; 0 +      48:	ee e2       	ldi	r30, 0x2E	; 46 +      4a:	f1 e1       	ldi	r31, 0x11	; 17 +      4c:	02 c0       	rjmp	.+4      	; 0x52 <.do_copy_data_start> + +0000004e <.do_copy_data_loop>: +      4e:	05 90       	lpm	r0, Z+ +      50:	0d 92       	st	X+, r0 + +00000052 <.do_copy_data_start>: +      52:	a4 36       	cpi	r26, 0x64	; 100 +      54:	b1 07       	cpc	r27, r17 +      56:	d9 f7       	brne	.-10     	; 0x4e <.do_copy_data_loop> +      58:	d9 d0       	rcall	.+434    	; 0x20c <main> +      5a:	67 c8       	rjmp	.-3890   	; 0xfffff12a <__eeprom_end+0xff7ef12a> + +0000005c <__bad_interrupt>: +      5c:	d1 cf       	rjmp	.-94     	; 0x0 <__vectors> + +0000005e <__vector_9>: +//volatile uint32_t timer0_overflow_count = 0; +volatile uint32_t timer0_millis = 0; +//static uint8_t timer0_fract = 0; + + +ISR(TIMER0_OVF_vect) +      5e:	1f 92       	push	r1 +      60:	0f 92       	push	r0 +      62:	0f b6       	in	r0, 0x3f	; 63 +      64:	0f 92       	push	r0 +      66:	11 24       	eor	r1, r1 +      68:	ef 92       	push	r14 +      6a:	ff 92       	push	r15 +      6c:	0f 93       	push	r16 +      6e:	1f 93       	push	r17 +      70:	2f 93       	push	r18 +      72:	3f 93       	push	r19 +      74:	4f 93       	push	r20 +      76:	5f 93       	push	r21 +      78:	8f 93       	push	r24 +      7a:	9f 93       	push	r25 +{ +        // copy these to local variables so they can be stored in registers +        // (volatile variables must be read from memory on every access) +        uint32_t m = timer0_millis; +      7c:	e0 90 e5 00 	lds	r14, 0x00E5 +      80:	f0 90 e6 00 	lds	r15, 0x00E6 +      84:	00 91 e7 00 	lds	r16, 0x00E7 +      88:	10 91 e8 00 	lds	r17, 0x00E8 +        //uint8_t f = timer0_fract; +        static uint8_t timer0_fract = 0; + +        m += MILLIS_INC; +      8c:	a8 01       	movw	r20, r16 +      8e:	97 01       	movw	r18, r14 +      90:	2e 5f       	subi	r18, 0xFE	; 254 +      92:	3f 4f       	sbci	r19, 0xFF	; 255 +      94:	4f 4f       	sbci	r20, 0xFF	; 255 +      96:	5f 4f       	sbci	r21, 0xFF	; 255 +        //f += FRACT_INC; +        timer0_fract += FRACT_INC; +      98:	90 91 eb 00 	lds	r25, 0x00EB +      9c:	89 2f       	mov	r24, r25 +      9e:	8a 5f       	subi	r24, 0xFA	; 250 +      a0:	80 93 eb 00 	sts	0x00EB, r24 +        //if (f >= FRACT_MAX) { +        if (timer0_fract >= FRACT_MAX) { +      a4:	8d 37       	cpi	r24, 0x7D	; 125 +      a6:	48 f0       	brcs	.+18     	; 0xba <__vector_9+0x5c> +                //f -= FRACT_MAX; +                timer0_fract -= FRACT_MAX; +      a8:	97 57       	subi	r25, 0x77	; 119 +      aa:	90 93 eb 00 	sts	0x00EB, r25 +                ++m; +      ae:	a8 01       	movw	r20, r16 +      b0:	97 01       	movw	r18, r14 +      b2:	2d 5f       	subi	r18, 0xFD	; 253 +      b4:	3f 4f       	sbci	r19, 0xFF	; 255 +      b6:	4f 4f       	sbci	r20, 0xFF	; 255 +      b8:	5f 4f       	sbci	r21, 0xFF	; 255 +        } + +        //timer0_fract = f; +        timer0_millis = m; +      ba:	20 93 e5 00 	sts	0x00E5, r18 +      be:	30 93 e6 00 	sts	0x00E6, r19 +      c2:	40 93 e7 00 	sts	0x00E7, r20 +      c6:	50 93 e8 00 	sts	0x00E8, r21 +        //if (timer0_overflow_count & 0x1) +        //if (m - last_time >= 5) { +        //debounce_keys(); // called nearly each 2ms (0,002048s) +            //last_time = m; +        //} +} +      ca:	9f 91       	pop	r25 +      cc:	8f 91       	pop	r24 +      ce:	5f 91       	pop	r21 +      d0:	4f 91       	pop	r20 +      d2:	3f 91       	pop	r19 +      d4:	2f 91       	pop	r18 +      d6:	1f 91       	pop	r17 +      d8:	0f 91       	pop	r16 +      da:	ff 90       	pop	r15 +      dc:	ef 90       	pop	r14 +      de:	0f 90       	pop	r0 +      e0:	0f be       	out	0x3f, r0	; 63 +      e2:	0f 90       	pop	r0 +      e4:	1f 90       	pop	r1 +      e6:	18 95       	reti + +000000e8 <__vector_3>: +//    current_layer = current_layer_ & 0x07; +// +//    PORTC |= 0x28; // layer and latch high +//} + +ISR(TIMER2_COMP_vect) +      e8:	1f 92       	push	r1 +      ea:	0f 92       	push	r0 +      ec:	0f b6       	in	r0, 0x3f	; 63 +      ee:	0f 92       	push	r0 +      f0:	11 24       	eor	r1, r1 +      f2:	2f 93       	push	r18 +      f4:	3f 93       	push	r19 +      f6:	4f 93       	push	r20 +      f8:	5f 93       	push	r21 +      fa:	6f 93       	push	r22 +      fc:	8f 93       	push	r24 +      fe:	9f 93       	push	r25 +     100:	af 93       	push	r26 +     102:	bf 93       	push	r27 +     104:	ef 93       	push	r30 +     106:	ff 93       	push	r31 +{ +    //if (!in_wait) return; +    PORTC &= ~0x28; // layer and latch low +     108:	85 b3       	in	r24, 0x15	; 21 +     10a:	87 7d       	andi	r24, 0xD7	; 215 +     10c:	85 bb       	out	0x15, r24	; 21 +    unsigned char current_layer_ = current_layer; +     10e:	60 91 e9 00 	lds	r22, 0x00E9 +     112:	57 e0       	ldi	r21, 0x07	; 7 + +    for (unsigned char j = 7; j < 255; --j) { +    //for (char j = 0; j < 4; ++j) { +        unsigned char val = cube[j][current_layer_]; +     114:	a6 2f       	mov	r26, r22 +     116:	b0 e0       	ldi	r27, 0x00	; 0 +     118:	e5 2f       	mov	r30, r21 +     11a:	f0 e0       	ldi	r31, 0x00	; 0 +     11c:	33 e0       	ldi	r19, 0x03	; 3 +     11e:	ee 0f       	add	r30, r30 +     120:	ff 1f       	adc	r31, r31 +     122:	3a 95       	dec	r19 +     124:	e1 f7       	brne	.-8      	; 0x11e <__vector_3+0x36> +     126:	ea 0f       	add	r30, r26 +     128:	fb 1f       	adc	r31, r27 +     12a:	ec 59       	subi	r30, 0x9C	; 156 +     12c:	ff 4f       	sbci	r31, 0xFF	; 255 +     12e:	40 81       	ld	r20, Z +        PORTC &= ~0x10; +     130:	ac 98       	cbi	0x15, 4	; 21 +        PORTB = (PORTB & ~0x01) | ((val     ) & 0x01); +     132:	88 b3       	in	r24, 0x18	; 24 +     134:	94 2f       	mov	r25, r20 +     136:	91 70       	andi	r25, 0x01	; 1 +     138:	8e 7f       	andi	r24, 0xFE	; 254 +     13a:	98 2b       	or	r25, r24 +     13c:	98 bb       	out	0x18, r25	; 24 +        PORTC |= 0x10; +     13e:	ac 9a       	sbi	0x15, 4	; 21 +        PORTC &= ~0x10; +     140:	ac 98       	cbi	0x15, 4	; 21 +        PORTB = (PORTB & ~0x01) | ((val >> 1) & 0x01); +     142:	38 b3       	in	r19, 0x18	; 24 +     144:	84 2f       	mov	r24, r20 +     146:	90 e0       	ldi	r25, 0x00	; 0 +     148:	95 95       	asr	r25 +     14a:	87 95       	ror	r24 +     14c:	28 2f       	mov	r18, r24 +     14e:	21 70       	andi	r18, 0x01	; 1 +     150:	3e 7f       	andi	r19, 0xFE	; 254 +     152:	23 2b       	or	r18, r19 +     154:	28 bb       	out	0x18, r18	; 24 +        PORTC |= 0x10; +     156:	ac 9a       	sbi	0x15, 4	; 21 +        PORTC &= ~0x10; +     158:	ac 98       	cbi	0x15, 4	; 21 +        PORTB = (PORTB & ~0x01) | ((val >> 2) & 0x01); +     15a:	38 b3       	in	r19, 0x18	; 24 +     15c:	95 95       	asr	r25 +     15e:	87 95       	ror	r24 +     160:	28 2f       	mov	r18, r24 +     162:	21 70       	andi	r18, 0x01	; 1 +     164:	3e 7f       	andi	r19, 0xFE	; 254 +     166:	23 2b       	or	r18, r19 +     168:	28 bb       	out	0x18, r18	; 24 +        PORTC |= 0x10; +     16a:	ac 9a       	sbi	0x15, 4	; 21 +        PORTC &= ~0x10; +     16c:	ac 98       	cbi	0x15, 4	; 21 +        PORTB = (PORTB & ~0x01) | ((val >> 3) & 0x01); +     16e:	38 b3       	in	r19, 0x18	; 24 +     170:	95 95       	asr	r25 +     172:	87 95       	ror	r24 +     174:	28 2f       	mov	r18, r24 +     176:	21 70       	andi	r18, 0x01	; 1 +     178:	3e 7f       	andi	r19, 0xFE	; 254 +     17a:	23 2b       	or	r18, r19 +     17c:	28 bb       	out	0x18, r18	; 24 +        PORTC |= 0x10; +     17e:	ac 9a       	sbi	0x15, 4	; 21 +        PORTC &= ~0x10; +     180:	ac 98       	cbi	0x15, 4	; 21 +        PORTB = (PORTB & ~0x01) | ((val >> 4) & 0x01); +     182:	38 b3       	in	r19, 0x18	; 24 +     184:	95 95       	asr	r25 +     186:	87 95       	ror	r24 +     188:	28 2f       	mov	r18, r24 +     18a:	21 70       	andi	r18, 0x01	; 1 +     18c:	3e 7f       	andi	r19, 0xFE	; 254 +     18e:	23 2b       	or	r18, r19 +     190:	28 bb       	out	0x18, r18	; 24 +        PORTC |= 0x10; +     192:	ac 9a       	sbi	0x15, 4	; 21 +        PORTC &= ~0x10; +     194:	ac 98       	cbi	0x15, 4	; 21 +        PORTB = (PORTB & ~0x01) | ((val >> 5) & 0x01); +     196:	38 b3       	in	r19, 0x18	; 24 +     198:	95 95       	asr	r25 +     19a:	87 95       	ror	r24 +     19c:	28 2f       	mov	r18, r24 +     19e:	21 70       	andi	r18, 0x01	; 1 +     1a0:	3e 7f       	andi	r19, 0xFE	; 254 +     1a2:	23 2b       	or	r18, r19 +     1a4:	28 bb       	out	0x18, r18	; 24 +        PORTC |= 0x10; +     1a6:	ac 9a       	sbi	0x15, 4	; 21 +        PORTC &= ~0x10; +     1a8:	ac 98       	cbi	0x15, 4	; 21 +        PORTB = (PORTB & ~0x01) | ((val >> 6) & 0x01); +     1aa:	28 b3       	in	r18, 0x18	; 24 +     1ac:	95 95       	asr	r25 +     1ae:	87 95       	ror	r24 +     1b0:	81 70       	andi	r24, 0x01	; 1 +     1b2:	2e 7f       	andi	r18, 0xFE	; 254 +     1b4:	82 2b       	or	r24, r18 +     1b6:	88 bb       	out	0x18, r24	; 24 +        PORTC |= 0x10; +     1b8:	ac 9a       	sbi	0x15, 4	; 21 +        PORTC &= ~0x10; +     1ba:	ac 98       	cbi	0x15, 4	; 21 +        PORTB = (PORTB & ~0x01) | ((val >> 7) & 0x01); +     1bc:	88 b3       	in	r24, 0x18	; 24 +     1be:	44 1f       	adc	r20, r20 +     1c0:	44 27       	eor	r20, r20 +     1c2:	44 1f       	adc	r20, r20 +     1c4:	8e 7f       	andi	r24, 0xFE	; 254 +     1c6:	48 2b       	or	r20, r24 +     1c8:	48 bb       	out	0x18, r20	; 24 +        //PORTD = val; +        PORTC |= 0x10; +     1ca:	ac 9a       	sbi	0x15, 4	; 21 +{ +    //if (!in_wait) return; +    PORTC &= ~0x28; // layer and latch low +    unsigned char current_layer_ = current_layer; + +    for (unsigned char j = 7; j < 255; --j) { +     1cc:	51 50       	subi	r21, 0x01	; 1 +     1ce:	08 f0       	brcs	.+2      	; 0x1d2 <__vector_3+0xea> +     1d0:	a3 cf       	rjmp	.-186    	; 0x118 <__vector_3+0x30> +        PORTB = (PORTB & ~0x01) | ((val >> 7) & 0x01); +        //PORTD = val; +        PORTC |= 0x10; +    } + +    PORTC = (PORTC & ~0x07) | current_layer_ | 0x28; +     1d2:	85 b3       	in	r24, 0x15	; 21 +     1d4:	96 2f       	mov	r25, r22 +     1d6:	98 62       	ori	r25, 0x28	; 40 +     1d8:	88 7f       	andi	r24, 0xF8	; 248 +     1da:	98 2b       	or	r25, r24 +     1dc:	95 bb       	out	0x15, r25	; 21 +    ++current_layer_; +     1de:	96 2f       	mov	r25, r22 +     1e0:	9f 5f       	subi	r25, 0xFF	; 255 +    if (current_layer_ > 7) current_layer_ = 0; +     1e2:	98 30       	cpi	r25, 0x08	; 8 +     1e4:	08 f0       	brcs	.+2      	; 0x1e8 <__vector_3+0x100> +     1e6:	90 e0       	ldi	r25, 0x00	; 0 +    //current_layer = current_layer_ & 0x07; +    current_layer = current_layer_; +     1e8:	90 93 e9 00 	sts	0x00E9, r25 + +    //PORTC |= 0x28; // layer and latch high +} +     1ec:	ff 91       	pop	r31 +     1ee:	ef 91       	pop	r30 +     1f0:	bf 91       	pop	r27 +     1f2:	af 91       	pop	r26 +     1f4:	9f 91       	pop	r25 +     1f6:	8f 91       	pop	r24 +     1f8:	6f 91       	pop	r22 +     1fa:	5f 91       	pop	r21 +     1fc:	4f 91       	pop	r20 +     1fe:	3f 91       	pop	r19 +     200:	2f 91       	pop	r18 +     202:	0f 90       	pop	r0 +     204:	0f be       	out	0x3f, r0	; 63 +     206:	0f 90       	pop	r0 +     208:	1f 90       	pop	r1 +     20a:	18 95       	reti + +0000020c <main>: + *****************************************************************************/ +#include "main.h" +#include "effect.h" +#include "draw.h" + +int main() +     20c:	ef 92       	push	r14 +     20e:	ff 92       	push	r15 +     210:	0f 93       	push	r16 +     212:	1f 93       	push	r17 +     * Initialisation +     * ======================================================================= +     */ + +    //*** init time management +    TCNT0 = 0; // init timer count to 0 +     214:	12 be       	out	0x32, r1	; 50 +    TCCR0 |= 0x03; // prescaler: 64 +     216:	83 b7       	in	r24, 0x33	; 51 +     218:	83 60       	ori	r24, 0x03	; 3 +     21a:	83 bf       	out	0x33, r24	; 51 +    TIMSK |= 0x01; // enable timer 0 overflow interrupt +     21c:	89 b7       	in	r24, 0x39	; 57 +     21e:	81 60       	ori	r24, 0x01	; 1 +     220:	89 bf       	out	0x39, r24	; 57 + +    // Timer 2 +    // Frame buffer interrupt +    // 14745600/128/11 = 10472.72 interrupts per second +    // 10472.72/8 = 1309 frames per second +    OCR2 = 11;  // interrupt at counter = 10 +     222:	8b e0       	ldi	r24, 0x0B	; 11 +     224:	83 bd       	out	0x23, r24	; 35 +    TCCR2 |= (1 << CS20) | (0 << CS21) | (1 << CS22); // Prescaler = 128. +     226:	85 b5       	in	r24, 0x25	; 37 +     228:	85 60       	ori	r24, 0x05	; 5 +     22a:	85 bd       	out	0x25, r24	; 37 +    TCCR2 |= (1 << WGM21); // CTC mode. Reset counter when OCR2 is reached. +     22c:	85 b5       	in	r24, 0x25	; 37 +     22e:	88 60       	ori	r24, 0x08	; 8 +     230:	85 bd       	out	0x25, r24	; 37 +    TCNT2 = 0x00;   // initial counter value = 0; +     232:	14 bc       	out	0x24, r1	; 36 +    TIMSK |= (1 << OCIE2); // Enable CTC interrupt +     234:	89 b7       	in	r24, 0x39	; 57 +     236:	80 68       	ori	r24, 0x80	; 128 +     238:	89 bf       	out	0x39, r24	; 57 + +    PORTD = 0; +     23a:	12 ba       	out	0x12, r1	; 18 +    PORTB = 0; +     23c:	18 ba       	out	0x18, r1	; 24 +    PORTC = 0; +     23e:	15 ba       	out	0x15, r1	; 21 +    DDRD = 0xff; +     240:	8f ef       	ldi	r24, 0xFF	; 255 +     242:	81 bb       	out	0x11, r24	; 17 +    DDRB = 0xff; +     244:	87 bb       	out	0x17, r24	; 23 +    DDRC = 0xff; +     246:	84 bb       	out	0x14, r24	; 20 + +    //*** set interupts +    sei(); +     248:	78 94       	sei +     24a:	20 e0       	ldi	r18, 0x00	; 0 +    return timer0_millis; +} + +void delay(uint32_t ms) +{ +    in_wait = true; +     24c:	ee 24       	eor	r14, r14 +     24e:	e3 94       	inc	r14 + +        //clear_led(); +        //delay_ms(1000); +        for (unsigned char z = 0; z < 8; ++z) { +            for (unsigned char y = 0; y < 8; ++y) { +                cube[y][z] = 0xFF; +     250:	ff 24       	eor	r15, r15 +     252:	fa 94       	dec	r15 +     254:	14 c0       	rjmp	.+40     	; 0x27e <main+0x72> +    DDRD = 0xff; +    DDRB = 0xff; +    DDRC = 0xff; + +    //*** set interupts +    sei(); +     256:	80 e0       	ldi	r24, 0x00	; 0 +     258:	90 e0       	ldi	r25, 0x00	; 0 + +        //clear_led(); +        //delay_ms(1000); +        for (unsigned char z = 0; z < 8; ++z) { +            for (unsigned char y = 0; y < 8; ++y) { +                cube[y][z] = 0xFF; +     25a:	42 2f       	mov	r20, r18 +     25c:	50 e0       	ldi	r21, 0x00	; 0 +     25e:	fc 01       	movw	r30, r24 +     260:	63 e0       	ldi	r22, 0x03	; 3 +     262:	ee 0f       	add	r30, r30 +     264:	ff 1f       	adc	r31, r31 +     266:	6a 95       	dec	r22 +     268:	e1 f7       	brne	.-8      	; 0x262 <main+0x56> +     26a:	e4 0f       	add	r30, r20 +     26c:	f5 1f       	adc	r31, r21 +     26e:	ec 59       	subi	r30, 0x9C	; 156 +     270:	ff 4f       	sbci	r31, 0xFF	; 255 +     272:	f0 82       	st	Z, r15 +     274:	01 96       	adiw	r24, 0x01	; 1 +    for (;;) { + +        //clear_led(); +        //delay_ms(1000); +        for (unsigned char z = 0; z < 8; ++z) { +            for (unsigned char y = 0; y < 8; ++y) { +     276:	88 30       	cpi	r24, 0x08	; 8 +     278:	91 05       	cpc	r25, r1 +     27a:	89 f7       	brne	.-30     	; 0x25e <main+0x52> + +    for (;;) { + +        //clear_led(); +        //delay_ms(1000); +        for (unsigned char z = 0; z < 8; ++z) { +     27c:	2f 5f       	subi	r18, 0xFF	; 255 +     27e:	28 30       	cpi	r18, 0x08	; 8 +     280:	50 f3       	brcs	.-44     	; 0x256 <main+0x4a> +    return timer0_millis; +} + +void delay(uint32_t ms) +{ +    in_wait = true; +     282:	e0 92 a4 00 	sts	0x00A4, r14 +} +*/ + +inline uint32_t millis() +{ +    return timer0_millis; +     286:	20 91 e5 00 	lds	r18, 0x00E5 +     28a:	30 91 e6 00 	lds	r19, 0x00E6 +     28e:	40 91 e7 00 	lds	r20, 0x00E7 +     292:	50 91 e8 00 	lds	r21, 0x00E8 +     296:	80 91 e5 00 	lds	r24, 0x00E5 +     29a:	90 91 e6 00 	lds	r25, 0x00E6 +     29e:	a0 91 e7 00 	lds	r26, 0x00E7 +     2a2:	b0 91 e8 00 	lds	r27, 0x00E8 + +void delay(uint32_t ms) +{ +    in_wait = true; +    uint32_t time1 = millis(); +    while ((millis()) - time1 < ms); +     2a6:	82 1b       	sub	r24, r18 +     2a8:	93 0b       	sbc	r25, r19 +     2aa:	a4 0b       	sbc	r26, r20 +     2ac:	b5 0b       	sbc	r27, r21 +     2ae:	88 5e       	subi	r24, 0xE8	; 232 +     2b0:	93 40       	sbci	r25, 0x03	; 3 +     2b2:	a0 40       	sbci	r26, 0x00	; 0 +     2b4:	b0 40       	sbci	r27, 0x00	; 0 +     2b6:	78 f3       	brcs	.-34     	; 0x296 <main+0x8a> +    in_wait = false; +     2b8:	10 92 a4 00 	sts	0x00A4, r1 +        delay(1000); + +		// Show the effects in a predefined order +		//for (char i=0; i<EFFECTS_TOTAL; i++) +			//launch_effect(i); +			sendvoxels_rand_z(20,220,2000); +     2bc:	84 e1       	ldi	r24, 0x14	; 20 +     2be:	90 e0       	ldi	r25, 0x00	; 0 +     2c0:	6c ed       	ldi	r22, 0xDC	; 220 +     2c2:	70 e0       	ldi	r23, 0x00	; 0 +     2c4:	40 ed       	ldi	r20, 0xD0	; 208 +     2c6:	57 e0       	ldi	r21, 0x07	; 7 +     2c8:	5d d5       	rcall	.+2746   	; 0xd84 <_Z17sendvoxels_rand_ziii> +			effect_rain(100); +     2ca:	84 e6       	ldi	r24, 0x64	; 100 +     2cc:	90 e0       	ldi	r25, 0x00	; 0 +     2ce:	84 d2       	rcall	.+1288   	; 0x7d8 <_Z11effect_raini> +			effect_random_filler(5,1); +     2d0:	85 e0       	ldi	r24, 0x05	; 5 +     2d2:	90 e0       	ldi	r25, 0x00	; 0 +     2d4:	61 e0       	ldi	r22, 0x01	; 1 +     2d6:	70 e0       	ldi	r23, 0x00	; 0 +     2d8:	f7 d4       	rcall	.+2542   	; 0xcc8 <_Z20effect_random_fillerii> +			effect_z_updown(20,1000); +     2da:	84 e1       	ldi	r24, 0x14	; 20 +     2dc:	90 e0       	ldi	r25, 0x00	; 0 +     2de:	68 ee       	ldi	r22, 0xE8	; 232 +     2e0:	73 e0       	ldi	r23, 0x03	; 3 +     2e2:	47 d4       	rcall	.+2190   	; 0xb72 <_Z15effect_z_updownii> +			effect_wormsqueeze (2, AXIS_Z, -1, 100, 1000); +     2e4:	82 e0       	ldi	r24, 0x02	; 2 +     2e6:	90 e0       	ldi	r25, 0x00	; 0 +     2e8:	6a e7       	ldi	r22, 0x7A	; 122 +     2ea:	70 e0       	ldi	r23, 0x00	; 0 +     2ec:	4f ef       	ldi	r20, 0xFF	; 255 +     2ee:	5f ef       	ldi	r21, 0xFF	; 255 +     2f0:	24 e6       	ldi	r18, 0x64	; 100 +     2f2:	30 e0       	ldi	r19, 0x00	; 0 +     2f4:	08 ee       	ldi	r16, 0xE8	; 232 +     2f6:	13 e0       	ldi	r17, 0x03	; 3 +     2f8:	9c d1       	rcall	.+824    	; 0x632 <_Z18effect_wormsqueezeiiiii> +			effect_blinky2(); +     2fa:	b1 d5       	rcall	.+2914   	; 0xe5e <_Z14effect_blinky2v> +     2fc:	10 e0       	ldi	r17, 0x00	; 0 +		// Comment the two lines above and uncomment this +		// if you want the effects in a random order. +		//launch_effect(rand()%EFFECTS_TOTAL); + +        for (char i = 0; i < 10; ++i) { +            effect_boxside_randsend_parallel (AXIS_X, 0, 150, 1); +     2fe:	88 e7       	ldi	r24, 0x78	; 120 +     300:	60 e0       	ldi	r22, 0x00	; 0 +     302:	70 e0       	ldi	r23, 0x00	; 0 +     304:	46 e9       	ldi	r20, 0x96	; 150 +     306:	50 e0       	ldi	r21, 0x00	; 0 +     308:	21 e0       	ldi	r18, 0x01	; 1 +     30a:	30 e0       	ldi	r19, 0x00	; 0 +     30c:	5e d3       	rcall	.+1724   	; 0x9ca <_Z32effect_boxside_randsend_parallelciii> +            effect_boxside_randsend_parallel (AXIS_X, 1, 150, 1); +     30e:	88 e7       	ldi	r24, 0x78	; 120 +     310:	61 e0       	ldi	r22, 0x01	; 1 +     312:	70 e0       	ldi	r23, 0x00	; 0 +     314:	46 e9       	ldi	r20, 0x96	; 150 +     316:	50 e0       	ldi	r21, 0x00	; 0 +     318:	21 e0       	ldi	r18, 0x01	; 1 +     31a:	30 e0       	ldi	r19, 0x00	; 0 +     31c:	56 d3       	rcall	.+1708   	; 0x9ca <_Z32effect_boxside_randsend_parallelciii> +            effect_boxside_randsend_parallel (AXIS_Y, 0, 150, 1); +     31e:	89 e7       	ldi	r24, 0x79	; 121 +     320:	60 e0       	ldi	r22, 0x00	; 0 +     322:	70 e0       	ldi	r23, 0x00	; 0 +     324:	46 e9       	ldi	r20, 0x96	; 150 +     326:	50 e0       	ldi	r21, 0x00	; 0 +     328:	21 e0       	ldi	r18, 0x01	; 1 +     32a:	30 e0       	ldi	r19, 0x00	; 0 +     32c:	4e d3       	rcall	.+1692   	; 0x9ca <_Z32effect_boxside_randsend_parallelciii> +            effect_boxside_randsend_parallel (AXIS_Y, 1, 150, 1); +     32e:	89 e7       	ldi	r24, 0x79	; 121 +     330:	61 e0       	ldi	r22, 0x01	; 1 +     332:	70 e0       	ldi	r23, 0x00	; 0 +     334:	46 e9       	ldi	r20, 0x96	; 150 +     336:	50 e0       	ldi	r21, 0x00	; 0 +     338:	21 e0       	ldi	r18, 0x01	; 1 +     33a:	30 e0       	ldi	r19, 0x00	; 0 +     33c:	46 d3       	rcall	.+1676   	; 0x9ca <_Z32effect_boxside_randsend_parallelciii> +            effect_boxside_randsend_parallel (AXIS_Z, 0, 150, 1); +     33e:	8a e7       	ldi	r24, 0x7A	; 122 +     340:	60 e0       	ldi	r22, 0x00	; 0 +     342:	70 e0       	ldi	r23, 0x00	; 0 +     344:	46 e9       	ldi	r20, 0x96	; 150 +     346:	50 e0       	ldi	r21, 0x00	; 0 +     348:	21 e0       	ldi	r18, 0x01	; 1 +     34a:	30 e0       	ldi	r19, 0x00	; 0 +     34c:	3e d3       	rcall	.+1660   	; 0x9ca <_Z32effect_boxside_randsend_parallelciii> +            effect_boxside_randsend_parallel (AXIS_Z, 1, 150, 1); +     34e:	8a e7       	ldi	r24, 0x7A	; 122 +     350:	61 e0       	ldi	r22, 0x01	; 1 +     352:	70 e0       	ldi	r23, 0x00	; 0 +     354:	46 e9       	ldi	r20, 0x96	; 150 +     356:	50 e0       	ldi	r21, 0x00	; 0 +     358:	21 e0       	ldi	r18, 0x01	; 1 +     35a:	30 e0       	ldi	r19, 0x00	; 0 +     35c:	36 d3       	rcall	.+1644   	; 0x9ca <_Z32effect_boxside_randsend_parallelciii> +		// Show the effects in a random order. +		// Comment the two lines above and uncomment this +		// if you want the effects in a random order. +		//launch_effect(rand()%EFFECTS_TOTAL); + +        for (char i = 0; i < 10; ++i) { +     35e:	1f 5f       	subi	r17, 0xFF	; 255 +     360:	1a 30       	cpi	r17, 0x0A	; 10 +     362:	69 f6       	brne	.-102    	; 0x2fe <main+0xf2> +     364:	20 e0       	ldi	r18, 0x00	; 0 +     366:	77 cf       	rjmp	.-274    	; 0x256 <main+0x4a> + +00000368 <_Z6myrandv>: +//    static short rand = 0; +//    rand=(rand*109+89)%251; +//    return rand; +//} + +int myrand() { return rand(); } +     368:	75 d6       	rcall	.+3306   	; 0x1054 <rand> +     36a:	08 95       	ret + +0000036c <_Z7inrangeiii>: +} + +// This function validates that we are drawing inside the cube. +unsigned char inrange(int x, int y, int z) +{ +	if (x >= 0 && x < CUBE_SIZE && y >= 0 && y < CUBE_SIZE && z >= 0 && z < CUBE_SIZE) +     36c:	08 97       	sbiw	r24, 0x08	; 8 +     36e:	78 f4       	brcc	.+30     	; 0x38e <_Z7inrangeiii+0x22> +     370:	77 fd       	sbrc	r23, 7 +     372:	0d c0       	rjmp	.+26     	; 0x38e <_Z7inrangeiii+0x22> +     374:	68 30       	cpi	r22, 0x08	; 8 +     376:	71 05       	cpc	r23, r1 +     378:	54 f4       	brge	.+20     	; 0x38e <_Z7inrangeiii+0x22> +     37a:	57 fd       	sbrc	r21, 7 +     37c:	08 c0       	rjmp	.+16     	; 0x38e <_Z7inrangeiii+0x22> +     37e:	90 e0       	ldi	r25, 0x00	; 0 +     380:	48 30       	cpi	r20, 0x08	; 8 +     382:	51 05       	cpc	r21, r1 +     384:	0c f0       	brlt	.+2      	; 0x388 <_Z7inrangeiii+0x1c> +     386:	91 e0       	ldi	r25, 0x01	; 1 +     388:	81 e0       	ldi	r24, 0x01	; 1 +     38a:	98 27       	eor	r25, r24 +     38c:	01 c0       	rjmp	.+2      	; 0x390 <_Z7inrangeiii+0x24> +     38e:	90 e0       	ldi	r25, 0x00	; 0 +	} else +	{ +		// One of the coordinates was outside the cube. +		return 0; +	} +} +     390:	89 2f       	mov	r24, r25 +     392:	08 95       	ret + +00000394 <_Z8clrvoxeliii>: +	if (inrange(x,y,z)) +		fb[z][y] |= (1 << x); +} + +// Set a single voxel to OFF +void clrvoxel(int x, int y, int z) +     394:	ff 92       	push	r15 +     396:	0f 93       	push	r16 +     398:	1f 93       	push	r17 +     39a:	cf 93       	push	r28 +     39c:	df 93       	push	r29 +     39e:	f8 2e       	mov	r15, r24 +     3a0:	8b 01       	movw	r16, r22 +     3a2:	ea 01       	movw	r28, r20 +{ +	if (inrange(x,y,z)) +     3a4:	e3 df       	rcall	.-58     	; 0x36c <_Z7inrangeiii> +     3a6:	88 23       	and	r24, r24 +     3a8:	a9 f0       	breq	.+42     	; 0x3d4 <_Z8clrvoxeliii+0x40> +		cube[z][y] &= ~(1 << x); +     3aa:	fe 01       	movw	r30, r28 +     3ac:	93 e0       	ldi	r25, 0x03	; 3 +     3ae:	ee 0f       	add	r30, r30 +     3b0:	ff 1f       	adc	r31, r31 +     3b2:	9a 95       	dec	r25 +     3b4:	e1 f7       	brne	.-8      	; 0x3ae <_Z8clrvoxeliii+0x1a> +     3b6:	e0 0f       	add	r30, r16 +     3b8:	f1 1f       	adc	r31, r17 +     3ba:	ec 59       	subi	r30, 0x9C	; 156 +     3bc:	ff 4f       	sbci	r31, 0xFF	; 255 +     3be:	20 81       	ld	r18, Z +     3c0:	81 e0       	ldi	r24, 0x01	; 1 +     3c2:	90 e0       	ldi	r25, 0x00	; 0 +     3c4:	02 c0       	rjmp	.+4      	; 0x3ca <_Z8clrvoxeliii+0x36> +     3c6:	88 0f       	add	r24, r24 +     3c8:	99 1f       	adc	r25, r25 +     3ca:	fa 94       	dec	r15 +     3cc:	e2 f7       	brpl	.-8      	; 0x3c6 <_Z8clrvoxeliii+0x32> +     3ce:	80 95       	com	r24 +     3d0:	82 23       	and	r24, r18 +     3d2:	80 83       	st	Z, r24 +} +     3d4:	df 91       	pop	r29 +     3d6:	cf 91       	pop	r28 +     3d8:	1f 91       	pop	r17 +     3da:	0f 91       	pop	r16 +     3dc:	ff 90       	pop	r15 +     3de:	08 95       	ret + +000003e0 <_Z8setvoxeliii>: +#include "draw.h" +#include "string.h" + +// Set a single voxel to ON +void setvoxel(int x, int y, int z) +     3e0:	ff 92       	push	r15 +     3e2:	0f 93       	push	r16 +     3e4:	1f 93       	push	r17 +     3e6:	cf 93       	push	r28 +     3e8:	df 93       	push	r29 +     3ea:	f8 2e       	mov	r15, r24 +     3ec:	8b 01       	movw	r16, r22 +     3ee:	ea 01       	movw	r28, r20 +{ +	if (inrange(x,y,z)) +     3f0:	bd df       	rcall	.-134    	; 0x36c <_Z7inrangeiii> +     3f2:	88 23       	and	r24, r24 +     3f4:	a1 f0       	breq	.+40     	; 0x41e <_Z8setvoxeliii+0x3e> +		cube[z][y] |= (1 << x); +     3f6:	fe 01       	movw	r30, r28 +     3f8:	33 e0       	ldi	r19, 0x03	; 3 +     3fa:	ee 0f       	add	r30, r30 +     3fc:	ff 1f       	adc	r31, r31 +     3fe:	3a 95       	dec	r19 +     400:	e1 f7       	brne	.-8      	; 0x3fa <_Z8setvoxeliii+0x1a> +     402:	e0 0f       	add	r30, r16 +     404:	f1 1f       	adc	r31, r17 +     406:	ec 59       	subi	r30, 0x9C	; 156 +     408:	ff 4f       	sbci	r31, 0xFF	; 255 +     40a:	20 81       	ld	r18, Z +     40c:	81 e0       	ldi	r24, 0x01	; 1 +     40e:	90 e0       	ldi	r25, 0x00	; 0 +     410:	02 c0       	rjmp	.+4      	; 0x416 <_Z8setvoxeliii+0x36> +     412:	88 0f       	add	r24, r24 +     414:	99 1f       	adc	r25, r25 +     416:	fa 94       	dec	r15 +     418:	e2 f7       	brpl	.-8      	; 0x412 <_Z8setvoxeliii+0x32> +     41a:	28 2b       	or	r18, r24 +     41c:	20 83       	st	Z, r18 +} +     41e:	df 91       	pop	r29 +     420:	cf 91       	pop	r28 +     422:	1f 91       	pop	r17 +     424:	0f 91       	pop	r16 +     426:	ff 90       	pop	r15 +     428:	08 95       	ret + +0000042a <_Z8getvoxeliii>: +		return 0; +	} +} + +// Get the current status of a voxel +unsigned char getvoxel(int x, int y, int z) +     42a:	ff 92       	push	r15 +     42c:	0f 93       	push	r16 +     42e:	1f 93       	push	r17 +     430:	cf 93       	push	r28 +     432:	df 93       	push	r29 +     434:	f8 2e       	mov	r15, r24 +     436:	8b 01       	movw	r16, r22 +     438:	ea 01       	movw	r28, r20 +{ +	if (inrange(x,y,z)) +     43a:	98 df       	rcall	.-208    	; 0x36c <_Z7inrangeiii> +     43c:	88 23       	and	r24, r24 +     43e:	89 f0       	breq	.+34     	; 0x462 <__stack+0x3> +	{ +		if (cube[z][y] & (1 << x)) +     440:	43 e0       	ldi	r20, 0x03	; 3 +     442:	cc 0f       	add	r28, r28 +     444:	dd 1f       	adc	r29, r29 +     446:	4a 95       	dec	r20 +     448:	e1 f7       	brne	.-8      	; 0x442 <_Z8getvoxeliii+0x18> +     44a:	c0 0f       	add	r28, r16 +     44c:	d1 1f       	adc	r29, r17 +     44e:	cc 59       	subi	r28, 0x9C	; 156 +     450:	df 4f       	sbci	r29, 0xFF	; 255 +     452:	88 81       	ld	r24, Y +     454:	90 e0       	ldi	r25, 0x00	; 0 +     456:	02 c0       	rjmp	.+4      	; 0x45c <_Z8getvoxeliii+0x32> +     458:	95 95       	asr	r25 +     45a:	87 95       	ror	r24 +     45c:	fa 94       	dec	r15 +     45e:	e2 f7       	brpl	.-8      	; 0x458 <_Z8getvoxeliii+0x2e> +     460:	81 70       	andi	r24, 0x01	; 1 +		} +	} else +	{ +		return 0; +	} +} +     462:	df 91       	pop	r29 +     464:	cf 91       	pop	r28 +     466:	1f 91       	pop	r17 +     468:	0f 91       	pop	r16 +     46a:	ff 90       	pop	r15 +     46c:	08 95       	ret + +0000046e <_Z10altervoxeliiii>: + +// In some effect we want to just take bool and write it to a voxel +// this function calls the apropriate voxel manipulation function. +void altervoxel(int x, int y, int z, int state) +{ +	if (state == 1) +     46e:	21 30       	cpi	r18, 0x01	; 1 +     470:	31 05       	cpc	r19, r1 +     472:	11 f4       	brne	.+4      	; 0x478 <_Z10altervoxeliiii+0xa> +	{ +		setvoxel(x,y,z); +     474:	b5 df       	rcall	.-150    	; 0x3e0 <_Z8setvoxeliii> +     476:	08 95       	ret +	} else +	{ +		clrvoxel(x,y,z); +     478:	8d df       	rcall	.-230    	; 0x394 <_Z8clrvoxeliii> +     47a:	08 95       	ret + +0000047c <_Z4fillh>: +} + +// Fill a value into all 64 byts of the cube buffer +// Mostly used for clearing. fill(0x00) +// or setting all on. fill(0xff) +void fill (unsigned char pattern) +     47c:	40 e0       	ldi	r20, 0x00	; 0 +     47e:	50 e0       	ldi	r21, 0x00	; 0 +     480:	10 c0       	rjmp	.+32     	; 0x4a2 <_Z4fillh+0x26> +	int y; +	for (z=0;z<CUBE_SIZE;z++) +	{ +		for (y=0;y<CUBE_SIZE;y++) +		{ +			cube[z][y] = pattern; +     482:	fb 01       	movw	r30, r22 +     484:	e2 0f       	add	r30, r18 +     486:	f3 1f       	adc	r31, r19 +     488:	ec 59       	subi	r30, 0x9C	; 156 +     48a:	ff 4f       	sbci	r31, 0xFF	; 255 +     48c:	80 83       	st	Z, r24 +{ +	int z; +	int y; +	for (z=0;z<CUBE_SIZE;z++) +	{ +		for (y=0;y<CUBE_SIZE;y++) +     48e:	2f 5f       	subi	r18, 0xFF	; 255 +     490:	3f 4f       	sbci	r19, 0xFF	; 255 +     492:	28 30       	cpi	r18, 0x08	; 8 +     494:	31 05       	cpc	r19, r1 +     496:	a9 f7       	brne	.-22     	; 0x482 <_Z4fillh+0x6> +// or setting all on. fill(0xff) +void fill (unsigned char pattern) +{ +	int z; +	int y; +	for (z=0;z<CUBE_SIZE;z++) +     498:	4f 5f       	subi	r20, 0xFF	; 255 +     49a:	5f 4f       	sbci	r21, 0xFF	; 255 +     49c:	48 30       	cpi	r20, 0x08	; 8 +     49e:	51 05       	cpc	r21, r1 +     4a0:	49 f0       	breq	.+18     	; 0x4b4 <_Z4fillh+0x38> +     4a2:	20 e0       	ldi	r18, 0x00	; 0 +     4a4:	30 e0       	ldi	r19, 0x00	; 0 +	{ +		for (y=0;y<CUBE_SIZE;y++) +		{ +			cube[z][y] = pattern; +     4a6:	ba 01       	movw	r22, r20 +     4a8:	e3 e0       	ldi	r30, 0x03	; 3 +     4aa:	66 0f       	add	r22, r22 +     4ac:	77 1f       	adc	r23, r23 +     4ae:	ea 95       	dec	r30 +     4b0:	e1 f7       	brne	.-8      	; 0x4aa <_Z4fillh+0x2e> +     4b2:	e7 cf       	rjmp	.-50     	; 0x482 <_Z4fillh+0x6> +     4b4:	08 95       	ret + +000004b6 <_Z8delay_msj>: +// Delay loop. +// This is not calibrated to milliseconds, +// but we had allready made to many effects using this +// calibration when we figured it might be a good idea +// to calibrate it. +void delay_ms(uint16_t x) +     4b6:	0b c0       	rjmp	.+22     	; 0x4ce <_Z8delay_msj+0x18> +{ +  uint8_t y, z; +  for ( ; x > 0 ; x--){ +     4b8:	20 e0       	ldi	r18, 0x00	; 0 +	... +    for ( y = 0 ; y < 90 ; y++){ +     4c6:	2f 5f       	subi	r18, 0xFF	; 255 +     4c8:	2a 35       	cpi	r18, 0x5A	; 90 +     4ca:	b9 f7       	brne	.-18     	; 0x4ba <_Z8delay_msj+0x4> +// calibration when we figured it might be a good idea +// to calibrate it. +void delay_ms(uint16_t x) +{ +  uint8_t y, z; +  for ( ; x > 0 ; x--){ +     4cc:	01 97       	sbiw	r24, 0x01	; 1 +     4ce:	00 97       	sbiw	r24, 0x00	; 0 +     4d0:	99 f7       	brne	.-26     	; 0x4b8 <_Z8delay_msj+0x2> +      for ( z = 0 ; z < 6 ; z++){ +        asm volatile ("nop"); +      } +    } +  } +} +     4d2:	08 95       	ret + +000004d4 <_Z5shiftci>: + +// Shift the entire contents of the cube along an axis +// This is great for effects where you want to draw something +// on one side of the cube and have it flow towards the other +// side. Like rain flowing down the Z axiz. +void shift (char axis, int direction) +     4d4:	2f 92       	push	r2 +     4d6:	3f 92       	push	r3 +     4d8:	4f 92       	push	r4 +     4da:	5f 92       	push	r5 +     4dc:	6f 92       	push	r6 +     4de:	7f 92       	push	r7 +     4e0:	9f 92       	push	r9 +     4e2:	af 92       	push	r10 +     4e4:	bf 92       	push	r11 +     4e6:	cf 92       	push	r12 +     4e8:	df 92       	push	r13 +     4ea:	ef 92       	push	r14 +     4ec:	ff 92       	push	r15 +     4ee:	0f 93       	push	r16 +     4f0:	1f 93       	push	r17 +     4f2:	cf 93       	push	r28 +     4f4:	df 93       	push	r29 +     4f6:	98 2e       	mov	r9, r24 +     4f8:	5b 01       	movw	r10, r22 +     4fa:	cc 24       	eor	r12, r12 +     4fc:	dd 24       	eor	r13, r13 +	int ii, iii; +	int state; + +	for (i = 0; i < CUBE_SIZE; i++) +	{ +		if (direction == -1) +     4fe:	47 e0       	ldi	r20, 0x07	; 7 +     500:	24 2e       	mov	r2, r20 +     502:	31 2c       	mov	r3, r1 +     504:	8f ef       	ldi	r24, 0xFF	; 255 +     506:	a8 16       	cp	r10, r24 +     508:	8f ef       	ldi	r24, 0xFF	; 255 +     50a:	b8 06       	cpc	r11, r24 +     50c:	11 f4       	brne	.+4      	; 0x512 <_Z5shiftci+0x3e> +     50e:	76 01       	movw	r14, r12 +     510:	03 c0       	rjmp	.+6      	; 0x518 <_Z5shiftci+0x44> +     512:	71 01       	movw	r14, r2 +     514:	ec 18       	sub	r14, r12 +     516:	fd 08       	sbc	r15, r13 +     518:	00 e0       	ldi	r16, 0x00	; 0 +     51a:	10 e0       	ldi	r17, 0x00	; 0 +				if (direction == -1) +				{ +					iii = ii+1; +				} else +				{ +					iii = ii-1; +     51c:	27 01       	movw	r4, r14 +     51e:	08 94       	sec +     520:	41 08       	sbc	r4, r1 +     522:	51 08       	sbc	r5, r1 +		{ +			for (y = 0; y < CUBE_SIZE; y++) +			{ +				if (direction == -1) +				{ +					iii = ii+1; +     524:	37 01       	movw	r6, r14 +     526:	08 94       	sec +     528:	61 1c       	adc	r6, r1 +     52a:	71 1c       	adc	r7, r1 +     52c:	36 c0       	rjmp	.+108    	; 0x59a <_Z5shiftci+0xc6> + +		for (x = 0; x < CUBE_SIZE; x++) +		{ +			for (y = 0; y < CUBE_SIZE; y++) +			{ +				if (direction == -1) +     52e:	8f ef       	ldi	r24, 0xFF	; 255 +     530:	a8 16       	cp	r10, r24 +     532:	8f ef       	ldi	r24, 0xFF	; 255 +     534:	b8 06       	cpc	r11, r24 +     536:	11 f4       	brne	.+4      	; 0x53c <_Z5shiftci+0x68> +				{ +					iii = ii+1; +     538:	c3 01       	movw	r24, r6 +     53a:	01 c0       	rjmp	.+2      	; 0x53e <_Z5shiftci+0x6a> +				} else +				{ +					iii = ii-1; +     53c:	c2 01       	movw	r24, r4 +     53e:	ac 01       	movw	r20, r24 +				} + +				if (axis == AXIS_Z) +     540:	8a e7       	ldi	r24, 0x7A	; 122 +     542:	98 16       	cp	r9, r24 +     544:	41 f4       	brne	.+16     	; 0x556 <_Z5shiftci+0x82> +				{ +					state = getvoxel(x,y,iii); +     546:	c8 01       	movw	r24, r16 +     548:	be 01       	movw	r22, r28 +     54a:	6f df       	rcall	.-290    	; 0x42a <_Z8getvoxeliii> +     54c:	28 2f       	mov	r18, r24 +					altervoxel(x,y,ii,state); +     54e:	c8 01       	movw	r24, r16 +     550:	be 01       	movw	r22, r28 +     552:	a7 01       	movw	r20, r14 +     554:	17 c0       	rjmp	.+46     	; 0x584 <_Z5shiftci+0xb0> +				} + +				if (axis == AXIS_Y) +     556:	89 e7       	ldi	r24, 0x79	; 121 +     558:	98 16       	cp	r9, r24 +     55a:	49 f4       	brne	.+18     	; 0x56e <_Z5shiftci+0x9a> +				{ +					state = getvoxel(x,iii,y); +     55c:	c8 01       	movw	r24, r16 +     55e:	ba 01       	movw	r22, r20 +     560:	ae 01       	movw	r20, r28 +     562:	63 df       	rcall	.-314    	; 0x42a <_Z8getvoxeliii> +     564:	28 2f       	mov	r18, r24 +					altervoxel(x,ii,y,state); +     566:	c8 01       	movw	r24, r16 +     568:	b7 01       	movw	r22, r14 +     56a:	ae 01       	movw	r20, r28 +     56c:	0b c0       	rjmp	.+22     	; 0x584 <_Z5shiftci+0xb0> +				} + +				if (axis == AXIS_X) +     56e:	88 e7       	ldi	r24, 0x78	; 120 +     570:	98 16       	cp	r9, r24 +     572:	51 f4       	brne	.+20     	; 0x588 <_Z5shiftci+0xb4> +				{ +					state = getvoxel(iii,y,x); +     574:	ca 01       	movw	r24, r20 +     576:	be 01       	movw	r22, r28 +     578:	a8 01       	movw	r20, r16 +     57a:	57 df       	rcall	.-338    	; 0x42a <_Z8getvoxeliii> +     57c:	28 2f       	mov	r18, r24 +					altervoxel(ii,y,x,state); +     57e:	c7 01       	movw	r24, r14 +     580:	be 01       	movw	r22, r28 +     582:	a8 01       	movw	r20, r16 +     584:	30 e0       	ldi	r19, 0x00	; 0 +     586:	73 df       	rcall	.-282    	; 0x46e <_Z10altervoxeliiii> +		} + + +		for (x = 0; x < CUBE_SIZE; x++) +		{ +			for (y = 0; y < CUBE_SIZE; y++) +     588:	21 96       	adiw	r28, 0x01	; 1 +     58a:	c8 30       	cpi	r28, 0x08	; 8 +     58c:	d1 05       	cpc	r29, r1 +     58e:	79 f6       	brne	.-98     	; 0x52e <_Z5shiftci+0x5a> +		{ +			ii = (7-i); +		} + + +		for (x = 0; x < CUBE_SIZE; x++) +     590:	0f 5f       	subi	r16, 0xFF	; 255 +     592:	1f 4f       	sbci	r17, 0xFF	; 255 +     594:	08 30       	cpi	r16, 0x08	; 8 +     596:	11 05       	cpc	r17, r1 +     598:	19 f0       	breq	.+6      	; 0x5a0 <_Z5shiftci+0xcc> +     59a:	c0 e0       	ldi	r28, 0x00	; 0 +     59c:	d0 e0       	ldi	r29, 0x00	; 0 +     59e:	c7 cf       	rjmp	.-114    	; 0x52e <_Z5shiftci+0x5a> +{ +	int i, x ,y; +	int ii, iii; +	int state; + +	for (i = 0; i < CUBE_SIZE; i++) +     5a0:	08 94       	sec +     5a2:	c1 1c       	adc	r12, r1 +     5a4:	d1 1c       	adc	r13, r1 +     5a6:	88 e0       	ldi	r24, 0x08	; 8 +     5a8:	c8 16       	cp	r12, r24 +     5aa:	d1 04       	cpc	r13, r1 +     5ac:	09 f0       	breq	.+2      	; 0x5b0 <_Z5shiftci+0xdc> +     5ae:	aa cf       	rjmp	.-172    	; 0x504 <_Z5shiftci+0x30> +				} +			} +		} +	} + +	if (direction == -1) +     5b0:	8f ef       	ldi	r24, 0xFF	; 255 +     5b2:	a8 16       	cp	r10, r24 +     5b4:	8f ef       	ldi	r24, 0xFF	; 255 +     5b6:	b8 06       	cpc	r11, r24 +     5b8:	19 f0       	breq	.+6      	; 0x5c0 <_Z5shiftci+0xec> +     5ba:	ee 24       	eor	r14, r14 +     5bc:	ff 24       	eor	r15, r15 +     5be:	03 c0       	rjmp	.+6      	; 0x5c6 <_Z5shiftci+0xf2> +     5c0:	37 e0       	ldi	r19, 0x07	; 7 +     5c2:	e3 2e       	mov	r14, r19 +     5c4:	f1 2c       	mov	r15, r1 +     5c6:	00 e0       	ldi	r16, 0x00	; 0 +     5c8:	10 e0       	ldi	r17, 0x00	; 0 +     5ca:	1e c0       	rjmp	.+60     	; 0x608 <_Z5shiftci+0x134> + +	for (x = 0; x < CUBE_SIZE; x++) +	{ +		for (y = 0; y < CUBE_SIZE; y++) +		{ +			if (axis == AXIS_Z) +     5cc:	8a e7       	ldi	r24, 0x7A	; 122 +     5ce:	98 16       	cp	r9, r24 +     5d0:	21 f4       	brne	.+8      	; 0x5da <_Z5shiftci+0x106> +				clrvoxel(x,y,i); +     5d2:	c8 01       	movw	r24, r16 +     5d4:	be 01       	movw	r22, r28 +     5d6:	a7 01       	movw	r20, r14 +     5d8:	0d c0       	rjmp	.+26     	; 0x5f4 <_Z5shiftci+0x120> + +			if (axis == AXIS_Y) +     5da:	89 e7       	ldi	r24, 0x79	; 121 +     5dc:	98 16       	cp	r9, r24 +     5de:	21 f4       	brne	.+8      	; 0x5e8 <_Z5shiftci+0x114> +				clrvoxel(x,i,y); +     5e0:	c8 01       	movw	r24, r16 +     5e2:	b7 01       	movw	r22, r14 +     5e4:	ae 01       	movw	r20, r28 +     5e6:	06 c0       	rjmp	.+12     	; 0x5f4 <_Z5shiftci+0x120> + +			if (axis == AXIS_X) +     5e8:	88 e7       	ldi	r24, 0x78	; 120 +     5ea:	98 16       	cp	r9, r24 +     5ec:	21 f4       	brne	.+8      	; 0x5f6 <_Z5shiftci+0x122> +				clrvoxel(i,y,x); +     5ee:	c7 01       	movw	r24, r14 +     5f0:	be 01       	movw	r22, r28 +     5f2:	a8 01       	movw	r20, r16 +     5f4:	cf de       	rcall	.-610    	; 0x394 <_Z8clrvoxeliii> +		i = 0; +	} + +	for (x = 0; x < CUBE_SIZE; x++) +	{ +		for (y = 0; y < CUBE_SIZE; y++) +     5f6:	21 96       	adiw	r28, 0x01	; 1 +     5f8:	c8 30       	cpi	r28, 0x08	; 8 +     5fa:	d1 05       	cpc	r29, r1 +     5fc:	39 f7       	brne	.-50     	; 0x5cc <_Z5shiftci+0xf8> +	} else +	{ +		i = 0; +	} + +	for (x = 0; x < CUBE_SIZE; x++) +     5fe:	0f 5f       	subi	r16, 0xFF	; 255 +     600:	1f 4f       	sbci	r17, 0xFF	; 255 +     602:	08 30       	cpi	r16, 0x08	; 8 +     604:	11 05       	cpc	r17, r1 +     606:	19 f0       	breq	.+6      	; 0x60e <_Z5shiftci+0x13a> +     608:	c0 e0       	ldi	r28, 0x00	; 0 +     60a:	d0 e0       	ldi	r29, 0x00	; 0 +     60c:	df cf       	rjmp	.-66     	; 0x5cc <_Z5shiftci+0xf8> + +			if (axis == AXIS_X) +				clrvoxel(i,y,x); +		} +	} +} +     60e:	df 91       	pop	r29 +     610:	cf 91       	pop	r28 +     612:	1f 91       	pop	r17 +     614:	0f 91       	pop	r16 +     616:	ff 90       	pop	r15 +     618:	ef 90       	pop	r14 +     61a:	df 90       	pop	r13 +     61c:	cf 90       	pop	r12 +     61e:	bf 90       	pop	r11 +     620:	af 90       	pop	r10 +     622:	9f 90       	pop	r9 +     624:	7f 90       	pop	r7 +     626:	6f 90       	pop	r6 +     628:	5f 90       	pop	r5 +     62a:	4f 90       	pop	r4 +     62c:	3f 90       	pop	r3 +     62e:	2f 90       	pop	r2 +     630:	08 95       	ret + +00000632 <_Z18effect_wormsqueezeiiiii>: +			x = effect_telcstairs_do(x,val,delay); +		} +	} +} + +void effect_wormsqueeze (int size, int axis, int direction, int iterations, int delay) +     632:	2f 92       	push	r2 +     634:	3f 92       	push	r3 +     636:	4f 92       	push	r4 +     638:	5f 92       	push	r5 +     63a:	6f 92       	push	r6 +     63c:	7f 92       	push	r7 +     63e:	8f 92       	push	r8 +     640:	9f 92       	push	r9 +     642:	af 92       	push	r10 +     644:	bf 92       	push	r11 +     646:	cf 92       	push	r12 +     648:	df 92       	push	r13 +     64a:	ef 92       	push	r14 +     64c:	ff 92       	push	r15 +     64e:	0f 93       	push	r16 +     650:	1f 93       	push	r17 +     652:	df 93       	push	r29 +     654:	cf 93       	push	r28 +     656:	cd b7       	in	r28, 0x3d	; 61 +     658:	de b7       	in	r29, 0x3e	; 62 +     65a:	2e 97       	sbiw	r28, 0x0e	; 14 +     65c:	0f b6       	in	r0, 0x3f	; 63 +     65e:	f8 94       	cli +     660:	de bf       	out	0x3e, r29	; 62 +     662:	0f be       	out	0x3f, r0	; 63 +     664:	cd bf       	out	0x3d, r28	; 61 +     666:	9a 83       	std	Y+2, r25	; 0x02 +     668:	89 83       	std	Y+1, r24	; 0x01 +     66a:	7c 83       	std	Y+4, r23	; 0x04 +     66c:	6b 83       	std	Y+3, r22	; 0x03 +     66e:	5e 83       	std	Y+6, r21	; 0x06 +     670:	4d 83       	std	Y+5, r20	; 0x05 +     672:	38 87       	std	Y+8, r19	; 0x08 +     674:	2f 83       	std	Y+7, r18	; 0x07 +     676:	1a 87       	std	Y+10, r17	; 0x0a +     678:	09 87       	std	Y+9, r16	; 0x09 +{ +	int x, y, i,j,k, dx, dy; +	int cube_size; +	int origin = 0; + +	if (direction == -1) +     67a:	4f 5f       	subi	r20, 0xFF	; 255 +     67c:	5f 4f       	sbci	r21, 0xFF	; 255 +     67e:	21 f4       	brne	.+8      	; 0x688 <_Z18effect_wormsqueezeiiiii+0x56> +     680:	97 e0       	ldi	r25, 0x07	; 7 +     682:	29 2e       	mov	r2, r25 +     684:	31 2c       	mov	r3, r1 +     686:	02 c0       	rjmp	.+4      	; 0x68c <_Z18effect_wormsqueezeiiiii+0x5a> +     688:	22 24       	eor	r2, r2 +     68a:	33 24       	eor	r3, r3 +		origin = 7; + +	cube_size = 8-(size-1); +     68c:	89 e0       	ldi	r24, 0x09	; 9 +     68e:	68 2e       	mov	r6, r24 +     690:	71 2c       	mov	r7, r1 +     692:	89 81       	ldd	r24, Y+1	; 0x01 +     694:	9a 81       	ldd	r25, Y+2	; 0x02 +     696:	68 1a       	sub	r6, r24 +     698:	79 0a       	sbc	r7, r25 + +	x = myrand()%cube_size; +     69a:	66 de       	rcall	.-820    	; 0x368 <_Z6myrandv> +     69c:	b3 01       	movw	r22, r6 +     69e:	32 d4       	rcall	.+2148   	; 0xf04 <__divmodhi4> +     6a0:	6c 01       	movw	r12, r24 +	y = myrand()%cube_size; +     6a2:	62 de       	rcall	.-828    	; 0x368 <_Z6myrandv> +     6a4:	b3 01       	movw	r22, r6 +     6a6:	2e d4       	rcall	.+2140   	; 0xf04 <__divmodhi4> +     6a8:	7c 01       	movw	r14, r24 +     6aa:	44 24       	eor	r4, r4 +     6ac:	55 24       	eor	r5, r5 +     6ae:	75 c0       	rjmp	.+234    	; 0x79a <_Z18effect_wormsqueezeiiiii+0x168> + +	for (i=0; i<iterations; i++) +	{ +		dx = ((myrand()%3)-1); +     6b0:	5b de       	rcall	.-842    	; 0x368 <_Z6myrandv> +     6b2:	8c 01       	movw	r16, r24 +		dy = ((myrand()%3)-1); +     6b4:	59 de       	rcall	.-846    	; 0x368 <_Z6myrandv> +     6b6:	9c 01       	movw	r18, r24 + +		if ((x+dx) > 0 && (x+dx) < cube_size) +     6b8:	c8 01       	movw	r24, r16 +     6ba:	63 e0       	ldi	r22, 0x03	; 3 +     6bc:	70 e0       	ldi	r23, 0x00	; 0 +     6be:	22 d4       	rcall	.+2116   	; 0xf04 <__divmodhi4> +     6c0:	01 97       	sbiw	r24, 0x01	; 1 +     6c2:	8c 0d       	add	r24, r12 +     6c4:	9d 1d       	adc	r25, r13 +     6c6:	9e 87       	std	Y+14, r25	; 0x0e +     6c8:	8d 87       	std	Y+13, r24	; 0x0d +     6ca:	18 16       	cp	r1, r24 +     6cc:	19 06       	cpc	r1, r25 +     6ce:	1c f4       	brge	.+6      	; 0x6d6 <_Z18effect_wormsqueezeiiiii+0xa4> +     6d0:	86 15       	cp	r24, r6 +     6d2:	97 05       	cpc	r25, r7 +     6d4:	14 f0       	brlt	.+4      	; 0x6da <_Z18effect_wormsqueezeiiiii+0xa8> +     6d6:	de 86       	std	Y+14, r13	; 0x0e +     6d8:	cd 86       	std	Y+13, r12	; 0x0d +			x += dx; + +		if ((y+dy) > 0 && (y+dy) < cube_size) +     6da:	c9 01       	movw	r24, r18 +     6dc:	63 e0       	ldi	r22, 0x03	; 3 +     6de:	70 e0       	ldi	r23, 0x00	; 0 +     6e0:	11 d4       	rcall	.+2082   	; 0xf04 <__divmodhi4> +     6e2:	8c 01       	movw	r16, r24 +     6e4:	01 50       	subi	r16, 0x01	; 1 +     6e6:	10 40       	sbci	r17, 0x00	; 0 +     6e8:	0e 0d       	add	r16, r14 +     6ea:	1f 1d       	adc	r17, r15 +     6ec:	10 16       	cp	r1, r16 +     6ee:	11 06       	cpc	r1, r17 +     6f0:	1c f4       	brge	.+6      	; 0x6f8 <_Z18effect_wormsqueezeiiiii+0xc6> +     6f2:	06 15       	cp	r16, r6 +     6f4:	17 05       	cpc	r17, r7 +     6f6:	0c f0       	brlt	.+2      	; 0x6fa <_Z18effect_wormsqueezeiiiii+0xc8> +     6f8:	87 01       	movw	r16, r14 +			y += dy; + +		shift(axis, direction); +     6fa:	8b 81       	ldd	r24, Y+3	; 0x03 +     6fc:	6d 81       	ldd	r22, Y+5	; 0x05 +     6fe:	7e 81       	ldd	r23, Y+6	; 0x06 +     700:	e9 de       	rcall	.-558    	; 0x4d4 <_Z5shiftci> +     702:	8d 84       	ldd	r8, Y+13	; 0x0d +     704:	9e 84       	ldd	r9, Y+14	; 0x0e +     706:	aa 24       	eor	r10, r10 +     708:	bb 24       	eor	r11, r11 +     70a:	30 c0       	rjmp	.+96     	; 0x76c <_Z18effect_wormsqueezeiiiii+0x13a> + +		for (j=0; j<size;j++) +		{ +			for (k=0; k<size;k++) +			{ +				if (axis == AXIS_Z) +     70c:	eb 81       	ldd	r30, Y+3	; 0x03 +     70e:	fc 81       	ldd	r31, Y+4	; 0x04 +     710:	ea 37       	cpi	r30, 0x7A	; 122 +     712:	f1 05       	cpc	r31, r1 +     714:	21 f4       	brne	.+8      	; 0x71e <_Z18effect_wormsqueezeiiiii+0xec> +					setvoxel(x+j,y+k,origin); +     716:	c4 01       	movw	r24, r8 +     718:	b6 01       	movw	r22, r12 +     71a:	a1 01       	movw	r20, r2 +     71c:	15 c0       	rjmp	.+42     	; 0x748 <_Z18effect_wormsqueezeiiiii+0x116> + +				if (axis == AXIS_Y) +     71e:	8b 81       	ldd	r24, Y+3	; 0x03 +     720:	9c 81       	ldd	r25, Y+4	; 0x04 +     722:	89 37       	cpi	r24, 0x79	; 121 +     724:	91 05       	cpc	r25, r1 +     726:	21 f4       	brne	.+8      	; 0x730 <_Z18effect_wormsqueezeiiiii+0xfe> +					setvoxel(x+j,origin,y+k); +     728:	c4 01       	movw	r24, r8 +     72a:	b1 01       	movw	r22, r2 +     72c:	a6 01       	movw	r20, r12 +     72e:	0c c0       	rjmp	.+24     	; 0x748 <_Z18effect_wormsqueezeiiiii+0x116> + +				if (axis == AXIS_X) +     730:	eb 81       	ldd	r30, Y+3	; 0x03 +     732:	fc 81       	ldd	r31, Y+4	; 0x04 +     734:	e8 37       	cpi	r30, 0x78	; 120 +     736:	f1 05       	cpc	r31, r1 +     738:	41 f4       	brne	.+16     	; 0x74a <_Z18effect_wormsqueezeiiiii+0x118> +					setvoxel(origin,y+j,x+k); +     73a:	4d 85       	ldd	r20, Y+13	; 0x0d +     73c:	5e 85       	ldd	r21, Y+14	; 0x0e +     73e:	4e 0d       	add	r20, r14 +     740:	5f 1d       	adc	r21, r15 +     742:	c1 01       	movw	r24, r2 +     744:	6b 85       	ldd	r22, Y+11	; 0x0b +     746:	7c 85       	ldd	r23, Y+12	; 0x0c +     748:	4b de       	rcall	.-874    	; 0x3e0 <_Z8setvoxeliii> +		shift(axis, direction); + + +		for (j=0; j<size;j++) +		{ +			for (k=0; k<size;k++) +     74a:	08 94       	sec +     74c:	e1 1c       	adc	r14, r1 +     74e:	f1 1c       	adc	r15, r1 +     750:	08 94       	sec +     752:	c1 1c       	adc	r12, r1 +     754:	d1 1c       	adc	r13, r1 +     756:	89 81       	ldd	r24, Y+1	; 0x01 +     758:	9a 81       	ldd	r25, Y+2	; 0x02 +     75a:	e8 16       	cp	r14, r24 +     75c:	f9 06       	cpc	r15, r25 +     75e:	b4 f2       	brlt	.-84     	; 0x70c <_Z18effect_wormsqueezeiiiii+0xda> +			y += dy; + +		shift(axis, direction); + + +		for (j=0; j<size;j++) +     760:	08 94       	sec +     762:	a1 1c       	adc	r10, r1 +     764:	b1 1c       	adc	r11, r1 +     766:	08 94       	sec +     768:	81 1c       	adc	r8, r1 +     76a:	91 1c       	adc	r9, r1 +     76c:	e9 81       	ldd	r30, Y+1	; 0x01 +     76e:	fa 81       	ldd	r31, Y+2	; 0x02 +     770:	ae 16       	cp	r10, r30 +     772:	bf 06       	cpc	r11, r31 +     774:	4c f4       	brge	.+18     	; 0x788 <_Z18effect_wormsqueezeiiiii+0x156> +     776:	68 01       	movw	r12, r16 +     778:	ee 24       	eor	r14, r14 +     77a:	ff 24       	eor	r15, r15 + +				if (axis == AXIS_Y) +					setvoxel(x+j,origin,y+k); + +				if (axis == AXIS_X) +					setvoxel(origin,y+j,x+k); +     77c:	c5 01       	movw	r24, r10 +     77e:	80 0f       	add	r24, r16 +     780:	91 1f       	adc	r25, r17 +     782:	9c 87       	std	Y+12, r25	; 0x0c +     784:	8b 87       	std	Y+11, r24	; 0x0b +     786:	e7 cf       	rjmp	.-50     	; 0x756 <_Z18effect_wormsqueezeiiiii+0x124> +			} +		} + +		delay_ms(delay); +     788:	89 85       	ldd	r24, Y+9	; 0x09 +     78a:	9a 85       	ldd	r25, Y+10	; 0x0a +     78c:	94 de       	rcall	.-728    	; 0x4b6 <_Z8delay_msj> +	cube_size = 8-(size-1); + +	x = myrand()%cube_size; +	y = myrand()%cube_size; + +	for (i=0; i<iterations; i++) +     78e:	08 94       	sec +     790:	41 1c       	adc	r4, r1 +     792:	51 1c       	adc	r5, r1 +     794:	cd 84       	ldd	r12, Y+13	; 0x0d +     796:	de 84       	ldd	r13, Y+14	; 0x0e +     798:	78 01       	movw	r14, r16 +     79a:	ef 81       	ldd	r30, Y+7	; 0x07 +     79c:	f8 85       	ldd	r31, Y+8	; 0x08 +     79e:	4e 16       	cp	r4, r30 +     7a0:	5f 06       	cpc	r5, r31 +     7a2:	0c f4       	brge	.+2      	; 0x7a6 <_Z18effect_wormsqueezeiiiii+0x174> +     7a4:	85 cf       	rjmp	.-246    	; 0x6b0 <_Z18effect_wormsqueezeiiiii+0x7e> +			} +		} + +		delay_ms(delay); +	} +} +     7a6:	2e 96       	adiw	r28, 0x0e	; 14 +     7a8:	0f b6       	in	r0, 0x3f	; 63 +     7aa:	f8 94       	cli +     7ac:	de bf       	out	0x3e, r29	; 62 +     7ae:	0f be       	out	0x3f, r0	; 63 +     7b0:	cd bf       	out	0x3d, r28	; 61 +     7b2:	cf 91       	pop	r28 +     7b4:	df 91       	pop	r29 +     7b6:	1f 91       	pop	r17 +     7b8:	0f 91       	pop	r16 +     7ba:	ff 90       	pop	r15 +     7bc:	ef 90       	pop	r14 +     7be:	df 90       	pop	r13 +     7c0:	cf 90       	pop	r12 +     7c2:	bf 90       	pop	r11 +     7c4:	af 90       	pop	r10 +     7c6:	9f 90       	pop	r9 +     7c8:	8f 90       	pop	r8 +     7ca:	7f 90       	pop	r7 +     7cc:	6f 90       	pop	r6 +     7ce:	5f 90       	pop	r5 +     7d0:	4f 90       	pop	r4 +     7d2:	3f 90       	pop	r3 +     7d4:	2f 90       	pop	r2 +     7d6:	08 95       	ret + +000007d8 <_Z11effect_raini>: +		} +	} +} + + +void effect_rain (int iterations) +     7d8:	af 92       	push	r10 +     7da:	bf 92       	push	r11 +     7dc:	cf 92       	push	r12 +     7de:	df 92       	push	r13 +     7e0:	ef 92       	push	r14 +     7e2:	ff 92       	push	r15 +     7e4:	0f 93       	push	r16 +     7e6:	1f 93       	push	r17 +     7e8:	cf 93       	push	r28 +     7ea:	df 93       	push	r29 +     7ec:	5c 01       	movw	r10, r24 +     7ee:	cc 24       	eor	r12, r12 +     7f0:	dd 24       	eor	r13, r13 +     7f2:	2a c0       	rjmp	.+84     	; 0x848 <_Z11effect_raini+0x70> +	int rnd_y; +	int rnd_num; + +	for (ii=0;ii<iterations;ii++) +	{ +		rnd_num = myrand()%4; +     7f4:	b9 dd       	rcall	.-1166   	; 0x368 <_Z6myrandv> +     7f6:	64 e0       	ldi	r22, 0x04	; 4 +     7f8:	70 e0       	ldi	r23, 0x00	; 0 +     7fa:	84 d3       	rcall	.+1800   	; 0xf04 <__divmodhi4> +     7fc:	ec 01       	movw	r28, r24 +     7fe:	ee 24       	eor	r14, r14 +     800:	ff 24       	eor	r15, r15 +     802:	15 c0       	rjmp	.+42     	; 0x82e <_Z11effect_raini+0x56> + +		for (i=0; i < rnd_num;i++) +		{ +			rnd_x = myrand()%8; +     804:	b1 dd       	rcall	.-1182   	; 0x368 <_Z6myrandv> +     806:	8c 01       	movw	r16, r24 +			rnd_y = myrand()%8; +     808:	af dd       	rcall	.-1186   	; 0x368 <_Z6myrandv> +     80a:	9c 01       	movw	r18, r24 +			setvoxel(rnd_x,rnd_y,7); +     80c:	c8 01       	movw	r24, r16 +     80e:	68 e0       	ldi	r22, 0x08	; 8 +     810:	70 e0       	ldi	r23, 0x00	; 0 +     812:	78 d3       	rcall	.+1776   	; 0xf04 <__divmodhi4> +     814:	fc 01       	movw	r30, r24 +     816:	c9 01       	movw	r24, r18 +     818:	68 e0       	ldi	r22, 0x08	; 8 +     81a:	70 e0       	ldi	r23, 0x00	; 0 +     81c:	73 d3       	rcall	.+1766   	; 0xf04 <__divmodhi4> +     81e:	bc 01       	movw	r22, r24 +     820:	cf 01       	movw	r24, r30 +     822:	47 e0       	ldi	r20, 0x07	; 7 +     824:	50 e0       	ldi	r21, 0x00	; 0 +     826:	dc dd       	rcall	.-1096   	; 0x3e0 <_Z8setvoxeliii> + +	for (ii=0;ii<iterations;ii++) +	{ +		rnd_num = myrand()%4; + +		for (i=0; i < rnd_num;i++) +     828:	08 94       	sec +     82a:	e1 1c       	adc	r14, r1 +     82c:	f1 1c       	adc	r15, r1 +     82e:	ec 16       	cp	r14, r28 +     830:	fd 06       	cpc	r15, r29 +     832:	44 f3       	brlt	.-48     	; 0x804 <_Z11effect_raini+0x2c> +			rnd_x = myrand()%8; +			rnd_y = myrand()%8; +			setvoxel(rnd_x,rnd_y,7); +		} + +		delay_ms(1000); +     834:	88 ee       	ldi	r24, 0xE8	; 232 +     836:	93 e0       	ldi	r25, 0x03	; 3 +     838:	3e de       	rcall	.-900    	; 0x4b6 <_Z8delay_msj> +		shift(AXIS_Z,-1); +     83a:	8a e7       	ldi	r24, 0x7A	; 122 +     83c:	6f ef       	ldi	r22, 0xFF	; 255 +     83e:	7f ef       	ldi	r23, 0xFF	; 255 +     840:	49 de       	rcall	.-878    	; 0x4d4 <_Z5shiftci> +	int i, ii; +	int rnd_x; +	int rnd_y; +	int rnd_num; + +	for (ii=0;ii<iterations;ii++) +     842:	08 94       	sec +     844:	c1 1c       	adc	r12, r1 +     846:	d1 1c       	adc	r13, r1 +     848:	ca 14       	cp	r12, r10 +     84a:	db 04       	cpc	r13, r11 +     84c:	9c f2       	brlt	.-90     	; 0x7f4 <_Z11effect_raini+0x1c> +		} + +		delay_ms(1000); +		shift(AXIS_Z,-1); +	} +} +     84e:	df 91       	pop	r29 +     850:	cf 91       	pop	r28 +     852:	1f 91       	pop	r17 +     854:	0f 91       	pop	r16 +     856:	ff 90       	pop	r15 +     858:	ef 90       	pop	r14 +     85a:	df 90       	pop	r13 +     85c:	cf 90       	pop	r12 +     85e:	bf 90       	pop	r11 +     860:	af 90       	pop	r10 +     862:	08 95       	ret + +00000864 <_Z11sendvoxel_zhhhi>: +} + + +// Send a voxel flying from one side of the cube to the other +// If its at the bottom, send it to the top.. +void sendvoxel_z (unsigned char x, unsigned char y, unsigned char z, int delay) +     864:	7f 92       	push	r7 +     866:	8f 92       	push	r8 +     868:	9f 92       	push	r9 +     86a:	af 92       	push	r10 +     86c:	bf 92       	push	r11 +     86e:	cf 92       	push	r12 +     870:	df 92       	push	r13 +     872:	ef 92       	push	r14 +     874:	ff 92       	push	r15 +     876:	0f 93       	push	r16 +     878:	1f 93       	push	r17 +     87a:	cf 93       	push	r28 +     87c:	df 93       	push	r29 +     87e:	e8 2e       	mov	r14, r24 +     880:	f6 2e       	mov	r15, r22 +     882:	74 2e       	mov	r7, r20 +     884:	69 01       	movw	r12, r18 +     886:	c0 e0       	ldi	r28, 0x00	; 0 +     888:	d0 e0       	ldi	r29, 0x00	; 0 +     88a:	f7 e0       	ldi	r31, 0x07	; 7 +     88c:	8f 2e       	mov	r8, r31 +     88e:	91 2c       	mov	r9, r1 +	for (i=0; i<8; i++) +	{ +		if (z == 7) +		{ +			ii = 7-i; +			clrvoxel(x,y,ii+1); +     890:	e8 e0       	ldi	r30, 0x08	; 8 +     892:	ae 2e       	mov	r10, r30 +     894:	b1 2c       	mov	r11, r1 +void sendvoxel_z (unsigned char x, unsigned char y, unsigned char z, int delay) +{ +	int i, ii; +	for (i=0; i<8; i++) +	{ +		if (z == 7) +     896:	87 e0       	ldi	r24, 0x07	; 7 +     898:	78 16       	cp	r7, r24 +     89a:	61 f4       	brne	.+24     	; 0x8b4 <_Z11sendvoxel_zhhhi+0x50> +} + + +// Send a voxel flying from one side of the cube to the other +// If its at the bottom, send it to the top.. +void sendvoxel_z (unsigned char x, unsigned char y, unsigned char z, int delay) +     89c:	84 01       	movw	r16, r8 +     89e:	0c 1b       	sub	r16, r28 +     8a0:	1d 0b       	sbc	r17, r29 +	for (i=0; i<8; i++) +	{ +		if (z == 7) +		{ +			ii = 7-i; +			clrvoxel(x,y,ii+1); +     8a2:	a5 01       	movw	r20, r10 +     8a4:	4c 1b       	sub	r20, r28 +     8a6:	5d 0b       	sbc	r21, r29 +     8a8:	8e 2d       	mov	r24, r14 +     8aa:	90 e0       	ldi	r25, 0x00	; 0 +     8ac:	6f 2d       	mov	r22, r15 +     8ae:	70 e0       	ldi	r23, 0x00	; 0 +     8b0:	71 dd       	rcall	.-1310   	; 0x394 <_Z8clrvoxeliii> +     8b2:	09 c0       	rjmp	.+18     	; 0x8c6 <_Z11sendvoxel_zhhhi+0x62> +		} else +		{ +			ii = i; +			clrvoxel(x,y,ii-1); +     8b4:	ae 01       	movw	r20, r28 +     8b6:	41 50       	subi	r20, 0x01	; 1 +     8b8:	50 40       	sbci	r21, 0x00	; 0 +     8ba:	8e 2d       	mov	r24, r14 +     8bc:	90 e0       	ldi	r25, 0x00	; 0 +     8be:	6f 2d       	mov	r22, r15 +     8c0:	70 e0       	ldi	r23, 0x00	; 0 +     8c2:	68 dd       	rcall	.-1328   	; 0x394 <_Z8clrvoxeliii> +     8c4:	8e 01       	movw	r16, r28 +		} +		setvoxel(x,y,ii); +     8c6:	8e 2d       	mov	r24, r14 +     8c8:	90 e0       	ldi	r25, 0x00	; 0 +     8ca:	6f 2d       	mov	r22, r15 +     8cc:	70 e0       	ldi	r23, 0x00	; 0 +     8ce:	a8 01       	movw	r20, r16 +     8d0:	87 dd       	rcall	.-1266   	; 0x3e0 <_Z8setvoxeliii> +		delay_ms(delay); +     8d2:	c6 01       	movw	r24, r12 +     8d4:	f0 dd       	rcall	.-1056   	; 0x4b6 <_Z8delay_msj> +// Send a voxel flying from one side of the cube to the other +// If its at the bottom, send it to the top.. +void sendvoxel_z (unsigned char x, unsigned char y, unsigned char z, int delay) +{ +	int i, ii; +	for (i=0; i<8; i++) +     8d6:	21 96       	adiw	r28, 0x01	; 1 +     8d8:	c8 30       	cpi	r28, 0x08	; 8 +     8da:	d1 05       	cpc	r29, r1 +     8dc:	e1 f6       	brne	.-72     	; 0x896 <_Z11sendvoxel_zhhhi+0x32> +			clrvoxel(x,y,ii-1); +		} +		setvoxel(x,y,ii); +		delay_ms(delay); +	} +} +     8de:	df 91       	pop	r29 +     8e0:	cf 91       	pop	r28 +     8e2:	1f 91       	pop	r17 +     8e4:	0f 91       	pop	r16 +     8e6:	ff 90       	pop	r15 +     8e8:	ef 90       	pop	r14 +     8ea:	df 90       	pop	r13 +     8ec:	cf 90       	pop	r12 +     8ee:	bf 90       	pop	r11 +     8f0:	af 90       	pop	r10 +     8f2:	9f 90       	pop	r9 +     8f4:	8f 90       	pop	r8 +     8f6:	7f 90       	pop	r7 +     8f8:	08 95       	ret + +000008fa <_Z19draw_positions_axiscPhi>: +		draw_positions_axis (axis, positions,invert); +		delay_ms(delay); +	} +} + +void draw_positions_axis (char axis, unsigned char positions[64], int invert) +     8fa:	4f 92       	push	r4 +     8fc:	5f 92       	push	r5 +     8fe:	6f 92       	push	r6 +     900:	7f 92       	push	r7 +     902:	9f 92       	push	r9 +     904:	af 92       	push	r10 +     906:	bf 92       	push	r11 +     908:	cf 92       	push	r12 +     90a:	df 92       	push	r13 +     90c:	ef 92       	push	r14 +     90e:	ff 92       	push	r15 +     910:	0f 93       	push	r16 +     912:	1f 93       	push	r17 +     914:	cf 93       	push	r28 +     916:	df 93       	push	r29 +     918:	98 2e       	mov	r9, r24 +     91a:	16 2f       	mov	r17, r22 +     91c:	07 2f       	mov	r16, r23 +     91e:	3a 01       	movw	r6, r20 +{ +	int x, y, p; + +	fill(0x00); +     920:	80 e0       	ldi	r24, 0x00	; 0 +     922:	ac dd       	rcall	.-1192   	; 0x47c <_Z4fillh> +     924:	21 2f       	mov	r18, r17 +     926:	30 2f       	mov	r19, r16 +     928:	c9 01       	movw	r24, r18 +     92a:	6c 01       	movw	r12, r24 +     92c:	c0 e0       	ldi	r28, 0x00	; 0 +     92e:	d0 e0       	ldi	r29, 0x00	; 0 +	{ +		for (y=0; y<8; y++) +		{ +			if (invert) +			{ +				p = (7-positions[(x*8)+y]); +     930:	57 e0       	ldi	r21, 0x07	; 7 +     932:	45 2e       	mov	r4, r21 +     934:	51 2c       	mov	r5, r1 +     936:	34 c0       	rjmp	.+104    	; 0x9a0 <_Z19draw_positions_axiscPhi+0xa6> + +	for (x=0; x<8; x++) +	{ +		for (y=0; y<8; y++) +		{ +			if (invert) +     938:	61 14       	cp	r6, r1 +     93a:	71 04       	cpc	r7, r1 +     93c:	31 f0       	breq	.+12     	; 0x94a <_Z19draw_positions_axiscPhi+0x50> +			{ +				p = (7-positions[(x*8)+y]); +     93e:	f5 01       	movw	r30, r10 +     940:	80 81       	ld	r24, Z +     942:	a2 01       	movw	r20, r4 +     944:	48 1b       	sub	r20, r24 +     946:	51 09       	sbc	r21, r1 +     948:	04 c0       	rjmp	.+8      	; 0x952 <_Z19draw_positions_axiscPhi+0x58> +			} else +			{ +				p = positions[(x*8)+y]; +     94a:	f7 01       	movw	r30, r14 +     94c:	80 81       	ld	r24, Z +     94e:	48 2f       	mov	r20, r24 +     950:	50 e0       	ldi	r21, 0x00	; 0 +			} + +			if (axis == AXIS_Z) +     952:	fa e7       	ldi	r31, 0x7A	; 122 +     954:	9f 16       	cp	r9, r31 +     956:	19 f4       	brne	.+6      	; 0x95e <_Z19draw_positions_axiscPhi+0x64> +				setvoxel(x,y,p); +     958:	ce 01       	movw	r24, r28 +     95a:	b8 01       	movw	r22, r16 +     95c:	0d c0       	rjmp	.+26     	; 0x978 <_Z19draw_positions_axiscPhi+0x7e> + +			if (axis == AXIS_Y) +     95e:	89 e7       	ldi	r24, 0x79	; 121 +     960:	98 16       	cp	r9, r24 +     962:	21 f4       	brne	.+8      	; 0x96c <_Z19draw_positions_axiscPhi+0x72> +				setvoxel(x,p,y); +     964:	ce 01       	movw	r24, r28 +     966:	ba 01       	movw	r22, r20 +     968:	a8 01       	movw	r20, r16 +     96a:	06 c0       	rjmp	.+12     	; 0x978 <_Z19draw_positions_axiscPhi+0x7e> + +			if (axis == AXIS_X) +     96c:	98 e7       	ldi	r25, 0x78	; 120 +     96e:	99 16       	cp	r9, r25 +     970:	21 f4       	brne	.+8      	; 0x97a <_Z19draw_positions_axiscPhi+0x80> +				setvoxel(p,y,x); +     972:	ca 01       	movw	r24, r20 +     974:	b8 01       	movw	r22, r16 +     976:	ae 01       	movw	r20, r28 +     978:	33 dd       	rcall	.-1434   	; 0x3e0 <_Z8setvoxeliii> + +	fill(0x00); + +	for (x=0; x<8; x++) +	{ +		for (y=0; y<8; y++) +     97a:	0f 5f       	subi	r16, 0xFF	; 255 +     97c:	1f 4f       	sbci	r17, 0xFF	; 255 +     97e:	08 94       	sec +     980:	a1 1c       	adc	r10, r1 +     982:	b1 1c       	adc	r11, r1 +     984:	08 94       	sec +     986:	e1 1c       	adc	r14, r1 +     988:	f1 1c       	adc	r15, r1 +     98a:	08 30       	cpi	r16, 0x08	; 8 +     98c:	11 05       	cpc	r17, r1 +     98e:	a1 f6       	brne	.-88     	; 0x938 <_Z19draw_positions_axiscPhi+0x3e> +{ +	int x, y, p; + +	fill(0x00); + +	for (x=0; x<8; x++) +     990:	21 96       	adiw	r28, 0x01	; 1 +     992:	e8 e0       	ldi	r30, 0x08	; 8 +     994:	f0 e0       	ldi	r31, 0x00	; 0 +     996:	ce 0e       	add	r12, r30 +     998:	df 1e       	adc	r13, r31 +     99a:	c8 30       	cpi	r28, 0x08	; 8 +     99c:	d1 05       	cpc	r29, r1 +     99e:	29 f0       	breq	.+10     	; 0x9aa <_Z19draw_positions_axiscPhi+0xb0> +     9a0:	56 01       	movw	r10, r12 +     9a2:	76 01       	movw	r14, r12 +     9a4:	00 e0       	ldi	r16, 0x00	; 0 +     9a6:	10 e0       	ldi	r17, 0x00	; 0 +     9a8:	c7 cf       	rjmp	.-114    	; 0x938 <_Z19draw_positions_axiscPhi+0x3e> +			if (axis == AXIS_X) +				setvoxel(p,y,x); +		} +	} + +} +     9aa:	df 91       	pop	r29 +     9ac:	cf 91       	pop	r28 +     9ae:	1f 91       	pop	r17 +     9b0:	0f 91       	pop	r16 +     9b2:	ff 90       	pop	r15 +     9b4:	ef 90       	pop	r14 +     9b6:	df 90       	pop	r13 +     9b8:	cf 90       	pop	r12 +     9ba:	bf 90       	pop	r11 +     9bc:	af 90       	pop	r10 +     9be:	9f 90       	pop	r9 +     9c0:	7f 90       	pop	r7 +     9c2:	6f 90       	pop	r6 +     9c4:	5f 90       	pop	r5 +     9c6:	4f 90       	pop	r4 +     9c8:	08 95       	ret + +000009ca <_Z32effect_boxside_randsend_parallelciii>: + + +void effect_boxside_randsend_parallel (char axis, int origin, int delay, int mode) +     9ca:	2f 92       	push	r2 +     9cc:	3f 92       	push	r3 +     9ce:	4f 92       	push	r4 +     9d0:	5f 92       	push	r5 +     9d2:	6f 92       	push	r6 +     9d4:	7f 92       	push	r7 +     9d6:	8f 92       	push	r8 +     9d8:	9f 92       	push	r9 +     9da:	af 92       	push	r10 +     9dc:	bf 92       	push	r11 +     9de:	cf 92       	push	r12 +     9e0:	df 92       	push	r13 +     9e2:	ef 92       	push	r14 +     9e4:	ff 92       	push	r15 +     9e6:	0f 93       	push	r16 +     9e8:	1f 93       	push	r17 +     9ea:	df 93       	push	r29 +     9ec:	cf 93       	push	r28 +     9ee:	cd b7       	in	r28, 0x3d	; 61 +     9f0:	de b7       	in	r29, 0x3e	; 62 +     9f2:	c1 58       	subi	r28, 0x81	; 129 +     9f4:	d0 40       	sbci	r29, 0x00	; 0 +     9f6:	0f b6       	in	r0, 0x3f	; 63 +     9f8:	f8 94       	cli +     9fa:	de bf       	out	0x3e, r29	; 62 +     9fc:	0f be       	out	0x3f, r0	; 63 +     9fe:	cd bf       	out	0x3d, r28	; 61 +     a00:	cf 57       	subi	r28, 0x7F	; 127 +     a02:	df 4f       	sbci	r29, 0xFF	; 255 +     a04:	88 83       	st	Y, r24 +     a06:	c1 58       	subi	r28, 0x81	; 129 +     a08:	d0 40       	sbci	r29, 0x00	; 0 +     a0a:	2b 01       	movw	r4, r22 +     a0c:	3a 01       	movw	r6, r20 +     a0e:	49 01       	movw	r8, r18 +     a10:	71 e4       	ldi	r23, 0x41	; 65 +     a12:	a7 2e       	mov	r10, r23 +     a14:	b1 2c       	mov	r11, r1 +     a16:	ac 0e       	add	r10, r28 +     a18:	bd 1e       	adc	r11, r29 +     a1a:	f5 01       	movw	r30, r10 +     a1c:	61 e8       	ldi	r22, 0x81	; 129 +     a1e:	c6 2e       	mov	r12, r22 +     a20:	d1 2c       	mov	r13, r1 +     a22:	cc 0e       	add	r12, r28 +     a24:	dd 1e       	adc	r13, r29 +	int notdone2 = 1; +	int sent = 0; + +	for (i=0;i<64;i++) +	{ +		pos[i] = 0; +     a26:	11 92       	st	Z+, r1 +	unsigned char pos[64]; +	int notdone = 1; +	int notdone2 = 1; +	int sent = 0; + +	for (i=0;i<64;i++) +     a28:	ec 15       	cp	r30, r12 +     a2a:	fd 05       	cpc	r31, r13 +     a2c:	e1 f7       	brne	.-8      	; 0xa26 <_Z32effect_boxside_randsend_parallelciii+0x5c> +     a2e:	00 e0       	ldi	r16, 0x00	; 0 +     a30:	10 e0       	ldi	r17, 0x00	; 0 +				sent++; +			} +		} + +		done = 0; +		for (i=0;i<64;i++) +     a32:	1e 01       	movw	r2, r28 +     a34:	08 94       	sec +     a36:	21 1c       	adc	r2, r1 +     a38:	31 1c       	adc	r3, r1 +		pos[i] = 0; +	} + +	while (notdone) +	{ +		if (mode == 1) +     a3a:	81 e0       	ldi	r24, 0x01	; 1 +     a3c:	88 16       	cp	r8, r24 +     a3e:	91 04       	cpc	r9, r1 +     a40:	b9 f4       	brne	.+46     	; 0xa70 <_Z32effect_boxside_randsend_parallelciii+0xa6> +     a42:	12 c0       	rjmp	.+36     	; 0xa68 <_Z32effect_boxside_randsend_parallelciii+0x9e> +		{ +			notdone2 = 1; +			while (notdone2 && sent<64) +			{ +				i = myrand()%64; +     a44:	91 dc       	rcall	.-1758   	; 0x368 <_Z6myrandv> +     a46:	60 e4       	ldi	r22, 0x40	; 64 +     a48:	70 e0       	ldi	r23, 0x00	; 0 +     a4a:	5c d2       	rcall	.+1208   	; 0xf04 <__divmodhi4> +				if (pos[i] == 0) +     a4c:	e1 e4       	ldi	r30, 0x41	; 65 +     a4e:	f0 e0       	ldi	r31, 0x00	; 0 +     a50:	ec 0f       	add	r30, r28 +     a52:	fd 1f       	adc	r31, r29 +     a54:	e8 0f       	add	r30, r24 +     a56:	f9 1f       	adc	r31, r25 +     a58:	80 81       	ld	r24, Z +     a5a:	88 23       	and	r24, r24 +     a5c:	99 f7       	brne	.-26     	; 0xa44 <_Z32effect_boxside_randsend_parallelciii+0x7a> +				{ +					sent++; +     a5e:	0f 5f       	subi	r16, 0xFF	; 255 +     a60:	1f 4f       	sbci	r17, 0xFF	; 255 +					pos[i] += 1; +     a62:	91 e0       	ldi	r25, 0x01	; 1 +     a64:	90 83       	st	Z, r25 +     a66:	16 c0       	rjmp	.+44     	; 0xa94 <_Z32effect_boxside_randsend_parallelciii+0xca> +	while (notdone) +	{ +		if (mode == 1) +		{ +			notdone2 = 1; +			while (notdone2 && sent<64) +     a68:	00 34       	cpi	r16, 0x40	; 64 +     a6a:	11 05       	cpc	r17, r1 +     a6c:	5c f3       	brlt	.-42     	; 0xa44 <_Z32effect_boxside_randsend_parallelciii+0x7a> +     a6e:	12 c0       	rjmp	.+36     	; 0xa94 <_Z32effect_boxside_randsend_parallelciii+0xca> +					sent++; +					pos[i] += 1; +					notdone2 = 0; +				} +			} +		} else if (mode == 2) +     a70:	82 e0       	ldi	r24, 0x02	; 2 +     a72:	88 16       	cp	r8, r24 +     a74:	91 04       	cpc	r9, r1 +     a76:	71 f4       	brne	.+28     	; 0xa94 <_Z32effect_boxside_randsend_parallelciii+0xca> +		{ +			if (sent<64) +     a78:	00 34       	cpi	r16, 0x40	; 64 +     a7a:	11 05       	cpc	r17, r1 +     a7c:	5c f4       	brge	.+22     	; 0xa94 <_Z32effect_boxside_randsend_parallelciii+0xca> +			{ +				pos[sent] += 1; +     a7e:	e1 e4       	ldi	r30, 0x41	; 65 +     a80:	f0 e0       	ldi	r31, 0x00	; 0 +     a82:	ec 0f       	add	r30, r28 +     a84:	fd 1f       	adc	r31, r29 +     a86:	e0 0f       	add	r30, r16 +     a88:	f1 1f       	adc	r31, r17 +     a8a:	80 81       	ld	r24, Z +     a8c:	8f 5f       	subi	r24, 0xFF	; 255 +     a8e:	80 83       	st	Z, r24 +				sent++; +     a90:	0f 5f       	subi	r16, 0xFF	; 255 +     a92:	1f 4f       	sbci	r17, 0xFF	; 255 +     a94:	f5 01       	movw	r30, r10 +     a96:	ee 24       	eor	r14, r14 +     a98:	ff 24       	eor	r15, r15 +		} + +		done = 0; +		for (i=0;i<64;i++) +		{ +			if (pos[i] > 0 && pos[i] <7) +     a9a:	90 81       	ld	r25, Z +     a9c:	89 2f       	mov	r24, r25 +     a9e:	81 50       	subi	r24, 0x01	; 1 +     aa0:	86 30       	cpi	r24, 0x06	; 6 +     aa2:	10 f4       	brcc	.+4      	; 0xaa8 <_Z32effect_boxside_randsend_parallelciii+0xde> +			{ +				pos[i] += 1; +     aa4:	9f 5f       	subi	r25, 0xFF	; 255 +     aa6:	90 83       	st	Z, r25 +			} + +			if (pos[i] == 7) +     aa8:	80 81       	ld	r24, Z +     aaa:	87 30       	cpi	r24, 0x07	; 7 +     aac:	19 f4       	brne	.+6      	; 0xab4 <_Z32effect_boxside_randsend_parallelciii+0xea> +				done++; +     aae:	08 94       	sec +     ab0:	e1 1c       	adc	r14, r1 +     ab2:	f1 1c       	adc	r15, r1 +     ab4:	31 96       	adiw	r30, 0x01	; 1 +				sent++; +			} +		} + +		done = 0; +		for (i=0;i<64;i++) +     ab6:	ec 15       	cp	r30, r12 +     ab8:	fd 05       	cpc	r31, r13 +     aba:	79 f7       	brne	.-34     	; 0xa9a <_Z32effect_boxside_randsend_parallelciii+0xd0> +     abc:	d1 01       	movw	r26, r2 +     abe:	f5 01       	movw	r30, r10 +     ac0:	80 81       	ld	r24, Z +		if (done == 64) +			notdone = 0; + +		for (i=0;i<64;i++) +		{ +			if (origin == 0) +     ac2:	41 14       	cp	r4, r1 +     ac4:	51 04       	cpc	r5, r1 +     ac6:	19 f0       	breq	.+6      	; 0xace <_Z32effect_boxside_randsend_parallelciii+0x104> +			{ +				cubepos[i] = pos[i]; +			} else +			{ +				cubepos[i] = (7-pos[i]); +     ac8:	97 e0       	ldi	r25, 0x07	; 7 +     aca:	98 1b       	sub	r25, r24 +     acc:	89 2f       	mov	r24, r25 +     ace:	8c 93       	st	X, r24 +     ad0:	31 96       	adiw	r30, 0x01	; 1 +     ad2:	11 96       	adiw	r26, 0x01	; 1 +		} + +		if (done == 64) +			notdone = 0; + +		for (i=0;i<64;i++) +     ad4:	ec 15       	cp	r30, r12 +     ad6:	fd 05       	cpc	r31, r13 +     ad8:	99 f7       	brne	.-26     	; 0xac0 <_Z32effect_boxside_randsend_parallelciii+0xf6> +				cubepos[i] = (7-pos[i]); +			} +		} + + +		delay_ms(delay); +     ada:	c3 01       	movw	r24, r6 +     adc:	ec dc       	rcall	.-1576   	; 0x4b6 <_Z8delay_msj> +		draw_positions_axis(axis,cubepos,0); +     ade:	cf 57       	subi	r28, 0x7F	; 127 +     ae0:	df 4f       	sbci	r29, 0xFF	; 255 +     ae2:	88 81       	ld	r24, Y +     ae4:	c1 58       	subi	r28, 0x81	; 129 +     ae6:	d0 40       	sbci	r29, 0x00	; 0 +     ae8:	b1 01       	movw	r22, r2 +     aea:	40 e0       	ldi	r20, 0x00	; 0 +     aec:	50 e0       	ldi	r21, 0x00	; 0 +     aee:	05 df       	rcall	.-502    	; 0x8fa <_Z19draw_positions_axiscPhi> +		LED_PORT ^= LED_RED; +     af0:	82 b3       	in	r24, 0x12	; 18 +     af2:	94 e0       	ldi	r25, 0x04	; 4 +     af4:	89 27       	eor	r24, r25 +     af6:	82 bb       	out	0x12, r24	; 18 +	for (i=0;i<64;i++) +	{ +		pos[i] = 0; +	} + +	while (notdone) +     af8:	80 e4       	ldi	r24, 0x40	; 64 +     afa:	e8 16       	cp	r14, r24 +     afc:	f1 04       	cpc	r15, r1 +     afe:	09 f0       	breq	.+2      	; 0xb02 <_Z32effect_boxside_randsend_parallelciii+0x138> +     b00:	9c cf       	rjmp	.-200    	; 0xa3a <_Z32effect_boxside_randsend_parallelciii+0x70> +		delay_ms(delay); +		draw_positions_axis(axis,cubepos,0); +		LED_PORT ^= LED_RED; +	} + +} +     b02:	cf 57       	subi	r28, 0x7F	; 127 +     b04:	df 4f       	sbci	r29, 0xFF	; 255 +     b06:	0f b6       	in	r0, 0x3f	; 63 +     b08:	f8 94       	cli +     b0a:	de bf       	out	0x3e, r29	; 62 +     b0c:	0f be       	out	0x3f, r0	; 63 +     b0e:	cd bf       	out	0x3d, r28	; 61 +     b10:	cf 91       	pop	r28 +     b12:	df 91       	pop	r29 +     b14:	1f 91       	pop	r17 +     b16:	0f 91       	pop	r16 +     b18:	ff 90       	pop	r15 +     b1a:	ef 90       	pop	r14 +     b1c:	df 90       	pop	r13 +     b1e:	cf 90       	pop	r12 +     b20:	bf 90       	pop	r11 +     b22:	af 90       	pop	r10 +     b24:	9f 90       	pop	r9 +     b26:	8f 90       	pop	r8 +     b28:	7f 90       	pop	r7 +     b2a:	6f 90       	pop	r6 +     b2c:	5f 90       	pop	r5 +     b2e:	4f 90       	pop	r4 +     b30:	3f 90       	pop	r3 +     b32:	2f 90       	pop	r2 +     b34:	08 95       	ret + +00000b36 <_Z20effect_z_updown_movePhS_c>: + +	} + +} + +void effect_z_updown_move (unsigned char positions[64], unsigned char destinations[64], char axis) +     b36:	ac 01       	movw	r20, r24 +     b38:	dc 01       	movw	r26, r24 +     b3a:	fb 01       	movw	r30, r22 +     b3c:	20 e0       	ldi	r18, 0x00	; 0 +     b3e:	30 e0       	ldi	r19, 0x00	; 0 +{ +	int px; +	for (px=0; px<64; px++) +	{ +		if (positions[px]<destinations[px]) +     b40:	9c 91       	ld	r25, X +     b42:	80 81       	ld	r24, Z +     b44:	98 17       	cp	r25, r24 +     b46:	10 f4       	brcc	.+4      	; 0xb4c <_Z20effect_z_updown_movePhS_c+0x16> +		{ +			positions[px]++; +     b48:	9f 5f       	subi	r25, 0xFF	; 255 +     b4a:	9c 93       	st	X, r25 +		} +		if (positions[px]>destinations[px]) +     b4c:	9c 91       	ld	r25, X +     b4e:	80 81       	ld	r24, Z +     b50:	89 17       	cp	r24, r25 +     b52:	10 f4       	brcc	.+4      	; 0xb58 <_Z20effect_z_updown_movePhS_c+0x22> +		{ +			positions[px]--; +     b54:	91 50       	subi	r25, 0x01	; 1 +     b56:	9c 93       	st	X, r25 +} + +void effect_z_updown_move (unsigned char positions[64], unsigned char destinations[64], char axis) +{ +	int px; +	for (px=0; px<64; px++) +     b58:	2f 5f       	subi	r18, 0xFF	; 255 +     b5a:	3f 4f       	sbci	r19, 0xFF	; 255 +     b5c:	11 96       	adiw	r26, 0x01	; 1 +     b5e:	31 96       	adiw	r30, 0x01	; 1 +     b60:	20 34       	cpi	r18, 0x40	; 64 +     b62:	31 05       	cpc	r19, r1 +     b64:	69 f7       	brne	.-38     	; 0xb40 <_Z20effect_z_updown_movePhS_c+0xa> +		{ +			positions[px]--; +		} +	} + +	draw_positions_axis (AXIS_Z, positions,0); +     b66:	8a e7       	ldi	r24, 0x7A	; 122 +     b68:	ba 01       	movw	r22, r20 +     b6a:	40 e0       	ldi	r20, 0x00	; 0 +     b6c:	50 e0       	ldi	r21, 0x00	; 0 +     b6e:	c5 de       	rcall	.-630    	; 0x8fa <_Z19draw_positions_axiscPhi> +} +     b70:	08 95       	ret + +00000b72 <_Z15effect_z_updownii>: +		delay_ms(1000); +		shift(AXIS_Z,-1); +	} +} + +void effect_z_updown (int iterations, int delay) +     b72:	2f 92       	push	r2 +     b74:	3f 92       	push	r3 +     b76:	4f 92       	push	r4 +     b78:	5f 92       	push	r5 +     b7a:	6f 92       	push	r6 +     b7c:	7f 92       	push	r7 +     b7e:	8f 92       	push	r8 +     b80:	9f 92       	push	r9 +     b82:	af 92       	push	r10 +     b84:	bf 92       	push	r11 +     b86:	cf 92       	push	r12 +     b88:	df 92       	push	r13 +     b8a:	ef 92       	push	r14 +     b8c:	ff 92       	push	r15 +     b8e:	0f 93       	push	r16 +     b90:	1f 93       	push	r17 +     b92:	df 93       	push	r29 +     b94:	cf 93       	push	r28 +     b96:	cd b7       	in	r28, 0x3d	; 61 +     b98:	de b7       	in	r29, 0x3e	; 62 +     b9a:	c0 58       	subi	r28, 0x80	; 128 +     b9c:	d0 40       	sbci	r29, 0x00	; 0 +     b9e:	0f b6       	in	r0, 0x3f	; 63 +     ba0:	f8 94       	cli +     ba2:	de bf       	out	0x3e, r29	; 62 +     ba4:	0f be       	out	0x3f, r0	; 63 +     ba6:	cd bf       	out	0x3d, r28	; 61 +     ba8:	2c 01       	movw	r4, r24 +     baa:	7b 01       	movw	r14, r22 +     bac:	00 e0       	ldi	r16, 0x00	; 0 +     bae:	10 e0       	ldi	r17, 0x00	; 0 + +	int i,y,move; + +	for (i=0; i<64; i++) +	{ +		positions[i] = 4; +     bb0:	5e 01       	movw	r10, r28 +     bb2:	08 94       	sec +     bb4:	a1 1c       	adc	r10, r1 +     bb6:	b1 1c       	adc	r11, r1 +     bb8:	24 e0       	ldi	r18, 0x04	; 4 +     bba:	92 2e       	mov	r9, r18 +		destinations[i] = myrand()%8; +     bbc:	91 e4       	ldi	r25, 0x41	; 65 +     bbe:	c9 2e       	mov	r12, r25 +     bc0:	d1 2c       	mov	r13, r1 +     bc2:	cc 0e       	add	r12, r28 +     bc4:	dd 1e       	adc	r13, r29 + +	int i,y,move; + +	for (i=0; i<64; i++) +	{ +		positions[i] = 4; +     bc6:	f5 01       	movw	r30, r10 +     bc8:	e0 0f       	add	r30, r16 +     bca:	f1 1f       	adc	r31, r17 +     bcc:	90 82       	st	Z, r9 +		destinations[i] = myrand()%8; +     bce:	cc db       	rcall	.-2152   	; 0x368 <_Z6myrandv> +     bd0:	f6 01       	movw	r30, r12 +     bd2:	e0 0f       	add	r30, r16 +     bd4:	f1 1f       	adc	r31, r17 +     bd6:	68 e0       	ldi	r22, 0x08	; 8 +     bd8:	70 e0       	ldi	r23, 0x00	; 0 +     bda:	94 d1       	rcall	.+808    	; 0xf04 <__divmodhi4> +     bdc:	80 83       	st	Z, r24 +	unsigned char positions[64]; +	unsigned char destinations[64]; + +	int i,y,move; + +	for (i=0; i<64; i++) +     bde:	0f 5f       	subi	r16, 0xFF	; 255 +     be0:	1f 4f       	sbci	r17, 0xFF	; 255 +     be2:	00 34       	cpi	r16, 0x40	; 64 +     be4:	11 05       	cpc	r17, r1 +     be6:	79 f7       	brne	.-34     	; 0xbc6 <_Z15effect_z_updownii+0x54> +     be8:	00 e0       	ldi	r16, 0x00	; 0 +     bea:	10 e0       	ldi	r17, 0x00	; 0 +		destinations[i] = myrand()%8; +	} + +	for (i=0; i<8; i++) +	{ +		effect_z_updown_move(positions, destinations, AXIS_Z); +     bec:	81 e4       	ldi	r24, 0x41	; 65 +     bee:	a8 2e       	mov	r10, r24 +     bf0:	b1 2c       	mov	r11, r1 +     bf2:	ac 0e       	add	r10, r28 +     bf4:	bd 1e       	adc	r11, r29 +     bf6:	6e 01       	movw	r12, r28 +     bf8:	08 94       	sec +     bfa:	c1 1c       	adc	r12, r1 +     bfc:	d1 1c       	adc	r13, r1 +		delay_ms(delay); +     bfe:	37 01       	movw	r6, r14 +		destinations[i] = myrand()%8; +	} + +	for (i=0; i<8; i++) +	{ +		effect_z_updown_move(positions, destinations, AXIS_Z); +     c00:	c6 01       	movw	r24, r12 +     c02:	b5 01       	movw	r22, r10 +     c04:	4a e7       	ldi	r20, 0x7A	; 122 +     c06:	97 df       	rcall	.-210    	; 0xb36 <_Z20effect_z_updown_movePhS_c> +		delay_ms(delay); +     c08:	c3 01       	movw	r24, r6 +     c0a:	55 dc       	rcall	.-1878   	; 0x4b6 <_Z8delay_msj> +	{ +		positions[i] = 4; +		destinations[i] = myrand()%8; +	} + +	for (i=0; i<8; i++) +     c0c:	0f 5f       	subi	r16, 0xFF	; 255 +     c0e:	1f 4f       	sbci	r17, 0xFF	; 255 +     c10:	08 30       	cpi	r16, 0x08	; 8 +     c12:	11 05       	cpc	r17, r1 +     c14:	a9 f7       	brne	.-22     	; 0xc00 <_Z15effect_z_updownii+0x8e> +		{ +			effect_z_updown_move(positions, destinations, AXIS_Z); +			delay_ms(delay); +		} + +		delay_ms(delay*4); +     c16:	57 01       	movw	r10, r14 +     c18:	aa 0c       	add	r10, r10 +     c1a:	bb 1c       	adc	r11, r11 +     c1c:	aa 0c       	add	r10, r10 +     c1e:	bb 1c       	adc	r11, r11 +     c20:	cc 24       	eor	r12, r12 +     c22:	dd 24       	eor	r13, r13 + +	for (i=0;i<iterations;i++) +	{ +		for (move=0;move<8;move++) +		{ +			effect_z_updown_move(positions, destinations, AXIS_Z); +     c24:	a1 e4       	ldi	r26, 0x41	; 65 +     c26:	8a 2e       	mov	r8, r26 +     c28:	91 2c       	mov	r9, r1 +     c2a:	8c 0e       	add	r8, r28 +     c2c:	9d 1e       	adc	r9, r29 +     c2e:	1e 01       	movw	r2, r28 +     c30:	08 94       	sec +     c32:	21 1c       	adc	r2, r1 +     c34:	31 1c       	adc	r3, r1 +     c36:	2b c0       	rjmp	.+86     	; 0xc8e <_Z15effect_z_updownii+0x11c> +			delay_ms(delay); +		} + +		delay_ms(delay*4); +     c38:	00 e0       	ldi	r16, 0x00	; 0 +     c3a:	10 e0       	ldi	r17, 0x00	; 0 + +	for (i=0;i<iterations;i++) +	{ +		for (move=0;move<8;move++) +		{ +			effect_z_updown_move(positions, destinations, AXIS_Z); +     c3c:	c1 01       	movw	r24, r2 +     c3e:	b4 01       	movw	r22, r8 +     c40:	4a e7       	ldi	r20, 0x7A	; 122 +     c42:	79 df       	rcall	.-270    	; 0xb36 <_Z20effect_z_updown_movePhS_c> +			delay_ms(delay); +     c44:	c3 01       	movw	r24, r6 +     c46:	37 dc       	rcall	.-1938   	; 0x4b6 <_Z8delay_msj> +		delay_ms(delay); +	} + +	for (i=0;i<iterations;i++) +	{ +		for (move=0;move<8;move++) +     c48:	0f 5f       	subi	r16, 0xFF	; 255 +     c4a:	1f 4f       	sbci	r17, 0xFF	; 255 +     c4c:	08 30       	cpi	r16, 0x08	; 8 +     c4e:	11 05       	cpc	r17, r1 +     c50:	a9 f7       	brne	.-22     	; 0xc3c <_Z15effect_z_updownii+0xca> +		{ +			effect_z_updown_move(positions, destinations, AXIS_Z); +			delay_ms(delay); +		} + +		delay_ms(delay*4); +     c52:	c5 01       	movw	r24, r10 +     c54:	30 dc       	rcall	.-1952   	; 0x4b6 <_Z8delay_msj> +     c56:	ee 24       	eor	r14, r14 +     c58:	ff 24       	eor	r15, r15 + + +		for (y=0;y<32;y++) +		{ +				destinations[myrand()%64] = myrand()%8; +     c5a:	86 db       	rcall	.-2292   	; 0x368 <_Z6myrandv> +     c5c:	8c 01       	movw	r16, r24 +     c5e:	84 db       	rcall	.-2296   	; 0x368 <_Z6myrandv> +     c60:	9c 01       	movw	r18, r24 +     c62:	c8 01       	movw	r24, r16 +     c64:	60 e4       	ldi	r22, 0x40	; 64 +     c66:	70 e0       	ldi	r23, 0x00	; 0 +     c68:	4d d1       	rcall	.+666    	; 0xf04 <__divmodhi4> +     c6a:	f4 01       	movw	r30, r8 +     c6c:	e8 0f       	add	r30, r24 +     c6e:	f9 1f       	adc	r31, r25 +     c70:	c9 01       	movw	r24, r18 +     c72:	68 e0       	ldi	r22, 0x08	; 8 +     c74:	70 e0       	ldi	r23, 0x00	; 0 +     c76:	46 d1       	rcall	.+652    	; 0xf04 <__divmodhi4> +     c78:	80 83       	st	Z, r24 +		} + +		delay_ms(delay*4); + + +		for (y=0;y<32;y++) +     c7a:	08 94       	sec +     c7c:	e1 1c       	adc	r14, r1 +     c7e:	f1 1c       	adc	r15, r1 +     c80:	80 e2       	ldi	r24, 0x20	; 32 +     c82:	e8 16       	cp	r14, r24 +     c84:	f1 04       	cpc	r15, r1 +     c86:	49 f7       	brne	.-46     	; 0xc5a <_Z15effect_z_updownii+0xe8> +	{ +		effect_z_updown_move(positions, destinations, AXIS_Z); +		delay_ms(delay); +	} + +	for (i=0;i<iterations;i++) +     c88:	08 94       	sec +     c8a:	c1 1c       	adc	r12, r1 +     c8c:	d1 1c       	adc	r13, r1 +     c8e:	c4 14       	cp	r12, r4 +     c90:	d5 04       	cpc	r13, r5 +     c92:	94 f2       	brlt	.-92     	; 0xc38 <_Z15effect_z_updownii+0xc6> +				destinations[myrand()%64] = myrand()%8; +		} + +	} + +} +     c94:	c0 58       	subi	r28, 0x80	; 128 +     c96:	df 4f       	sbci	r29, 0xFF	; 255 +     c98:	0f b6       	in	r0, 0x3f	; 63 +     c9a:	f8 94       	cli +     c9c:	de bf       	out	0x3e, r29	; 62 +     c9e:	0f be       	out	0x3f, r0	; 63 +     ca0:	cd bf       	out	0x3d, r28	; 61 +     ca2:	cf 91       	pop	r28 +     ca4:	df 91       	pop	r29 +     ca6:	1f 91       	pop	r17 +     ca8:	0f 91       	pop	r16 +     caa:	ff 90       	pop	r15 +     cac:	ef 90       	pop	r14 +     cae:	df 90       	pop	r13 +     cb0:	cf 90       	pop	r12 +     cb2:	bf 90       	pop	r11 +     cb4:	af 90       	pop	r10 +     cb6:	9f 90       	pop	r9 +     cb8:	8f 90       	pop	r8 +     cba:	7f 90       	pop	r7 +     cbc:	6f 90       	pop	r6 +     cbe:	5f 90       	pop	r5 +     cc0:	4f 90       	pop	r4 +     cc2:	3f 90       	pop	r3 +     cc4:	2f 90       	pop	r2 +     cc6:	08 95       	ret + +00000cc8 <_Z20effect_random_fillerii>: +		iterations--; +	} +} + +// Set or clear exactly 512 voxels in a random order. +void effect_random_filler (int delay, int state) +     cc8:	8f 92       	push	r8 +     cca:	9f 92       	push	r9 +     ccc:	af 92       	push	r10 +     cce:	bf 92       	push	r11 +     cd0:	cf 92       	push	r12 +     cd2:	df 92       	push	r13 +     cd4:	ef 92       	push	r14 +     cd6:	ff 92       	push	r15 +     cd8:	0f 93       	push	r16 +     cda:	1f 93       	push	r17 +     cdc:	cf 93       	push	r28 +     cde:	df 93       	push	r29 +     ce0:	4c 01       	movw	r8, r24 +     ce2:	8b 01       	movw	r16, r22 +{ +	int x,y,z; +	int loop = 0; + + +	if (state == 1) +     ce4:	61 30       	cpi	r22, 0x01	; 1 +     ce6:	71 05       	cpc	r23, r1 +     ce8:	11 f4       	brne	.+4      	; 0xcee <_Z20effect_random_fillerii+0x26> +	{ +		fill(0x00); +     cea:	80 e0       	ldi	r24, 0x00	; 0 +     cec:	01 c0       	rjmp	.+2      	; 0xcf0 <_Z20effect_random_fillerii+0x28> +	} else +	{ +		fill(0xff); +     cee:	8f ef       	ldi	r24, 0xFF	; 255 +     cf0:	c5 db       	rcall	.-2166   	; 0x47c <_Z4fillh> +     cf2:	c0 e0       	ldi	r28, 0x00	; 0 +     cf4:	d0 e0       	ldi	r29, 0x00	; 0 +	} + +	while (loop<511) +	{ +		x = myrand()%8; +     cf6:	38 db       	rcall	.-2448   	; 0x368 <_Z6myrandv> +     cf8:	68 e0       	ldi	r22, 0x08	; 8 +     cfa:	70 e0       	ldi	r23, 0x00	; 0 +     cfc:	03 d1       	rcall	.+518    	; 0xf04 <__divmodhi4> +     cfe:	b8 2e       	mov	r11, r24 +     d00:	a9 2e       	mov	r10, r25 +		y = myrand()%8; +     d02:	32 db       	rcall	.-2460   	; 0x368 <_Z6myrandv> +     d04:	68 e0       	ldi	r22, 0x08	; 8 +     d06:	70 e0       	ldi	r23, 0x00	; 0 +     d08:	fd d0       	rcall	.+506    	; 0xf04 <__divmodhi4> +     d0a:	d8 2e       	mov	r13, r24 +     d0c:	c9 2e       	mov	r12, r25 +		z = myrand()%8; +     d0e:	2c db       	rcall	.-2472   	; 0x368 <_Z6myrandv> +     d10:	68 e0       	ldi	r22, 0x08	; 8 +     d12:	70 e0       	ldi	r23, 0x00	; 0 +     d14:	f7 d0       	rcall	.+494    	; 0xf04 <__divmodhi4> +     d16:	f8 2e       	mov	r15, r24 +     d18:	e9 2e       	mov	r14, r25 + +		if ((state == 0 && getvoxel(x,y,z) == 0x01) || (state == 1 && getvoxel(x,y,z) == 0x00)) +     d1a:	01 15       	cp	r16, r1 +     d1c:	11 05       	cpc	r17, r1 +     d1e:	51 f4       	brne	.+20     	; 0xd34 <_Z20effect_random_fillerii+0x6c> +     d20:	8b 2d       	mov	r24, r11 +     d22:	9a 2d       	mov	r25, r10 +     d24:	6d 2d       	mov	r22, r13 +     d26:	7c 2d       	mov	r23, r12 +     d28:	4f 2d       	mov	r20, r15 +     d2a:	5e 2d       	mov	r21, r14 +     d2c:	7e db       	rcall	.-2308   	; 0x42a <_Z8getvoxeliii> +     d2e:	81 30       	cpi	r24, 0x01	; 1 +     d30:	11 f7       	brne	.-60     	; 0xcf6 <_Z20effect_random_fillerii+0x2e> +     d32:	0c c0       	rjmp	.+24     	; 0xd4c <_Z20effect_random_fillerii+0x84> +     d34:	01 30       	cpi	r16, 0x01	; 1 +     d36:	11 05       	cpc	r17, r1 +     d38:	f1 f6       	brne	.-68     	; 0xcf6 <_Z20effect_random_fillerii+0x2e> +     d3a:	8b 2d       	mov	r24, r11 +     d3c:	9a 2d       	mov	r25, r10 +     d3e:	6d 2d       	mov	r22, r13 +     d40:	7c 2d       	mov	r23, r12 +     d42:	4f 2d       	mov	r20, r15 +     d44:	5e 2d       	mov	r21, r14 +     d46:	71 db       	rcall	.-2334   	; 0x42a <_Z8getvoxeliii> +     d48:	88 23       	and	r24, r24 +     d4a:	a9 f6       	brne	.-86     	; 0xcf6 <_Z20effect_random_fillerii+0x2e> +		{ +			altervoxel(x,y,z,state); +     d4c:	8b 2d       	mov	r24, r11 +     d4e:	9a 2d       	mov	r25, r10 +     d50:	6d 2d       	mov	r22, r13 +     d52:	7c 2d       	mov	r23, r12 +     d54:	4f 2d       	mov	r20, r15 +     d56:	5e 2d       	mov	r21, r14 +     d58:	98 01       	movw	r18, r16 +     d5a:	89 db       	rcall	.-2286   	; 0x46e <_Z10altervoxeliiii> +			delay_ms(delay); +     d5c:	c4 01       	movw	r24, r8 +     d5e:	ab db       	rcall	.-2218   	; 0x4b6 <_Z8delay_msj> +			loop++; +     d60:	21 96       	adiw	r28, 0x01	; 1 +	} else +	{ +		fill(0xff); +	} + +	while (loop<511) +     d62:	81 e0       	ldi	r24, 0x01	; 1 +     d64:	cf 3f       	cpi	r28, 0xFF	; 255 +     d66:	d8 07       	cpc	r29, r24 +     d68:	31 f6       	brne	.-116    	; 0xcf6 <_Z20effect_random_fillerii+0x2e> +			altervoxel(x,y,z,state); +			delay_ms(delay); +			loop++; +		} +	} +} +     d6a:	df 91       	pop	r29 +     d6c:	cf 91       	pop	r28 +     d6e:	1f 91       	pop	r17 +     d70:	0f 91       	pop	r16 +     d72:	ff 90       	pop	r15 +     d74:	ef 90       	pop	r14 +     d76:	df 90       	pop	r13 +     d78:	cf 90       	pop	r12 +     d7a:	bf 90       	pop	r11 +     d7c:	af 90       	pop	r10 +     d7e:	9f 90       	pop	r9 +     d80:	8f 90       	pop	r8 +     d82:	08 95       	ret + +00000d84 <_Z17sendvoxels_rand_ziii>: +	} +} + +// For each coordinate along X and Y, a voxel is set either at level 0 or at level 7 +// for n iterations, a random voxel is sent to the opposite side of where it was. +void sendvoxels_rand_z (int iterations, int delay, int wait) +     d84:	6f 92       	push	r6 +     d86:	7f 92       	push	r7 +     d88:	8f 92       	push	r8 +     d8a:	9f 92       	push	r9 +     d8c:	af 92       	push	r10 +     d8e:	bf 92       	push	r11 +     d90:	df 92       	push	r13 +     d92:	ef 92       	push	r14 +     d94:	ff 92       	push	r15 +     d96:	0f 93       	push	r16 +     d98:	1f 93       	push	r17 +     d9a:	cf 93       	push	r28 +     d9c:	df 93       	push	r29 +     d9e:	3c 01       	movw	r6, r24 +     da0:	5b 01       	movw	r10, r22 +     da2:	4a 01       	movw	r8, r20 +{ +	unsigned char x, y, last_x = 0, last_y = 0, i; + +	fill(0x00); +     da4:	80 e0       	ldi	r24, 0x00	; 0 +     da6:	6a db       	rcall	.-2348   	; 0x47c <_Z4fillh> +     da8:	00 e0       	ldi	r16, 0x00	; 0 +     daa:	10 e0       	ldi	r17, 0x00	; 0 +     dac:	1c c0       	rjmp	.+56     	; 0xde6 <_Z17sendvoxels_rand_ziii+0x62> +	{ +		for (y=0;y<8;y++) +		{ +			// Then set a voxel either at the top or at the bottom +            // myrand()%2 returns either 0 or 1. multiplying by 7 gives either 0 or 7. +            setvoxel(x,y,((myrand()%2)*7)); +     dae:	dc da       	rcall	.-2632   	; 0x368 <_Z6myrandv> +     db0:	62 e0       	ldi	r22, 0x02	; 2 +     db2:	70 e0       	ldi	r23, 0x00	; 0 +     db4:	a7 d0       	rcall	.+334    	; 0xf04 <__divmodhi4> +     db6:	ac 01       	movw	r20, r24 +     db8:	33 e0       	ldi	r19, 0x03	; 3 +     dba:	44 0f       	add	r20, r20 +     dbc:	55 1f       	adc	r21, r21 +     dbe:	3a 95       	dec	r19 +     dc0:	e1 f7       	brne	.-8      	; 0xdba <_Z17sendvoxels_rand_ziii+0x36> +     dc2:	48 1b       	sub	r20, r24 +     dc4:	59 0b       	sbc	r21, r25 +     dc6:	c8 01       	movw	r24, r16 +     dc8:	be 01       	movw	r22, r28 +     dca:	0a db       	rcall	.-2540   	; 0x3e0 <_Z8setvoxeliii> +     dcc:	21 96       	adiw	r28, 0x01	; 1 +	fill(0x00); + +	// Loop through all the X and Y coordinates +	for (x=0;x<8;x++) +	{ +		for (y=0;y<8;y++) +     dce:	c8 30       	cpi	r28, 0x08	; 8 +     dd0:	d1 05       	cpc	r29, r1 +     dd2:	69 f7       	brne	.-38     	; 0xdae <_Z17sendvoxels_rand_ziii+0x2a> +     dd4:	0f 5f       	subi	r16, 0xFF	; 255 +     dd6:	1f 4f       	sbci	r17, 0xFF	; 255 +	unsigned char x, y, last_x = 0, last_y = 0, i; + +	fill(0x00); + +	// Loop through all the X and Y coordinates +	for (x=0;x<8;x++) +     dd8:	08 30       	cpi	r16, 0x08	; 8 +     dda:	11 05       	cpc	r17, r1 +     ddc:	21 f4       	brne	.+8      	; 0xde6 <_Z17sendvoxels_rand_ziii+0x62> +     dde:	dd 24       	eor	r13, r13 +     de0:	ee 24       	eor	r14, r14 +     de2:	ff 24       	eor	r15, r15 +     de4:	29 c0       	rjmp	.+82     	; 0xe38 <_Z17sendvoxels_rand_ziii+0xb4> +     de6:	c0 e0       	ldi	r28, 0x00	; 0 +     de8:	d0 e0       	ldi	r29, 0x00	; 0 +     dea:	e1 cf       	rjmp	.-62     	; 0xdae <_Z17sendvoxels_rand_ziii+0x2a> +	} + +	for (i=0;i<iterations;i++) +	{ +		// Pick a random x,y position +		x = myrand()%8; +     dec:	bd da       	rcall	.-2694   	; 0x368 <_Z6myrandv> +     dee:	ec 01       	movw	r28, r24 +		y = myrand()%8; +     df0:	bb da       	rcall	.-2698   	; 0x368 <_Z6myrandv> +     df2:	68 e0       	ldi	r22, 0x08	; 8 +     df4:	70 e0       	ldi	r23, 0x00	; 0 +     df6:	86 d0       	rcall	.+268    	; 0xf04 <__divmodhi4> +     df8:	08 2f       	mov	r16, r24 +		// but not the sameone twice in a row +		if (y != last_y && x != last_x) +     dfa:	8e 15       	cp	r24, r14 +     dfc:	e1 f0       	breq	.+56     	; 0xe36 <_Z17sendvoxels_rand_ziii+0xb2> +	} + +	for (i=0;i<iterations;i++) +	{ +		// Pick a random x,y position +		x = myrand()%8; +     dfe:	ce 01       	movw	r24, r28 +     e00:	68 e0       	ldi	r22, 0x08	; 8 +     e02:	70 e0       	ldi	r23, 0x00	; 0 +     e04:	7f d0       	rcall	.+254    	; 0xf04 <__divmodhi4> +     e06:	18 2f       	mov	r17, r24 +		y = myrand()%8; +		// but not the sameone twice in a row +		if (y != last_y && x != last_x) +     e08:	8d 15       	cp	r24, r13 +     e0a:	a9 f0       	breq	.+42     	; 0xe36 <_Z17sendvoxels_rand_ziii+0xb2> +		{ +			// If the voxel at this x,y is at the bottom +			if (getvoxel(x,y,0)) +     e0c:	90 e0       	ldi	r25, 0x00	; 0 +     e0e:	60 2f       	mov	r22, r16 +     e10:	70 e0       	ldi	r23, 0x00	; 0 +     e12:	40 e0       	ldi	r20, 0x00	; 0 +     e14:	50 e0       	ldi	r21, 0x00	; 0 +     e16:	09 db       	rcall	.-2542   	; 0x42a <_Z8getvoxeliii> +     e18:	88 23       	and	r24, r24 +     e1a:	21 f0       	breq	.+8      	; 0xe24 <_Z17sendvoxels_rand_ziii+0xa0> +			{ +				// send it to the top +				sendvoxel_z(x,y,0,delay); +     e1c:	81 2f       	mov	r24, r17 +     e1e:	60 2f       	mov	r22, r16 +     e20:	40 e0       	ldi	r20, 0x00	; 0 +     e22:	03 c0       	rjmp	.+6      	; 0xe2a <_Z17sendvoxels_rand_ziii+0xa6> +			} else +			{ +				// if its at the top, send it to the bottom +				sendvoxel_z(x,y,7,delay); +     e24:	81 2f       	mov	r24, r17 +     e26:	60 2f       	mov	r22, r16 +     e28:	47 e0       	ldi	r20, 0x07	; 7 +     e2a:	95 01       	movw	r18, r10 +     e2c:	1b dd       	rcall	.-1482   	; 0x864 <_Z11sendvoxel_zhhhi> +			} +			delay_ms(wait); +     e2e:	c4 01       	movw	r24, r8 +     e30:	42 db       	rcall	.-2428   	; 0x4b6 <_Z8delay_msj> +     e32:	d1 2e       	mov	r13, r17 +     e34:	e0 2e       	mov	r14, r16 +            // myrand()%2 returns either 0 or 1. multiplying by 7 gives either 0 or 7. +            setvoxel(x,y,((myrand()%2)*7)); +		} +	} + +	for (i=0;i<iterations;i++) +     e36:	f3 94       	inc	r15 +     e38:	8f 2d       	mov	r24, r15 +     e3a:	90 e0       	ldi	r25, 0x00	; 0 +     e3c:	86 15       	cp	r24, r6 +     e3e:	97 05       	cpc	r25, r7 +     e40:	ac f2       	brlt	.-86     	; 0xdec <_Z17sendvoxels_rand_ziii+0x68> +			last_y = y; +			last_x = x; +		} +	} + +} +     e42:	df 91       	pop	r29 +     e44:	cf 91       	pop	r28 +     e46:	1f 91       	pop	r17 +     e48:	0f 91       	pop	r16 +     e4a:	ff 90       	pop	r15 +     e4c:	ef 90       	pop	r14 +     e4e:	df 90       	pop	r13 +     e50:	bf 90       	pop	r11 +     e52:	af 90       	pop	r10 +     e54:	9f 90       	pop	r9 +     e56:	8f 90       	pop	r8 +     e58:	7f 90       	pop	r7 +     e5a:	6f 90       	pop	r6 +     e5c:	08 95       	ret + +00000e5e <_Z14effect_blinky2v>: +        setplane(plane,i); +		delay_ms(speed); +	} +} + +void effect_blinky2() +     e5e:	ef 92       	push	r14 +     e60:	ff 92       	push	r15 +     e62:	0f 93       	push	r16 +     e64:	1f 93       	push	r17 +     e66:	cf 93       	push	r28 +     e68:	df 93       	push	r29 +{ +	int i,r; +	fill(0x00); +     e6a:	80 e0       	ldi	r24, 0x00	; 0 +     e6c:	07 db       	rcall	.-2546   	; 0x47c <_Z4fillh> +     e6e:	00 e0       	ldi	r16, 0x00	; 0 +     e70:	10 e0       	ldi	r17, 0x00	; 0 + +		i = 750; +		while (i>0) +		{ +			fill(0x00); +			delay_ms(751-i); +     e72:	4f ee       	ldi	r20, 0xEF	; 239 +     e74:	e4 2e       	mov	r14, r20 +     e76:	42 e0       	ldi	r20, 0x02	; 2 +     e78:	f4 2e       	mov	r15, r20 +     e7a:	3a c0       	rjmp	.+116    	; 0xef0 <_Z14effect_blinky2v+0x92> +	for (r=0;r<2;r++) +	{ +		i = 750; +		while (i>0) +		{ +			fill(0x00); +     e7c:	80 e0       	ldi	r24, 0x00	; 0 +     e7e:	fe da       	rcall	.-2564   	; 0x47c <_Z4fillh> +			delay_ms(i); +     e80:	ce 01       	movw	r24, r28 +     e82:	19 db       	rcall	.-2510   	; 0x4b6 <_Z8delay_msj> + +			fill(0xff); +     e84:	8f ef       	ldi	r24, 0xFF	; 255 +     e86:	fa da       	rcall	.-2572   	; 0x47c <_Z4fillh> +			delay_ms(100); +     e88:	84 e6       	ldi	r24, 0x64	; 100 +     e8a:	90 e0       	ldi	r25, 0x00	; 0 +     e8c:	14 db       	rcall	.-2520   	; 0x4b6 <_Z8delay_msj> + +			i = i - (15+(1000/(i/10))); +     e8e:	ce 01       	movw	r24, r28 +     e90:	66 ef       	ldi	r22, 0xF6	; 246 +     e92:	7f ef       	ldi	r23, 0xFF	; 255 +     e94:	37 d0       	rcall	.+110    	; 0xf04 <__divmodhi4> +     e96:	88 ee       	ldi	r24, 0xE8	; 232 +     e98:	93 e0       	ldi	r25, 0x03	; 3 +     e9a:	34 d0       	rcall	.+104    	; 0xf04 <__divmodhi4> +     e9c:	6f 50       	subi	r22, 0x0F	; 15 +     e9e:	70 40       	sbci	r23, 0x00	; 0 +     ea0:	c6 0f       	add	r28, r22 +     ea2:	d7 1f       	adc	r29, r23 +	fill(0x00); + +	for (r=0;r<2;r++) +	{ +		i = 750; +		while (i>0) +     ea4:	1c 16       	cp	r1, r28 +     ea6:	1d 06       	cpc	r1, r29 +     ea8:	4c f3       	brlt	.-46     	; 0xe7c <_Z14effect_blinky2v+0x1e> +			delay_ms(100); + +			i = i - (15+(1000/(i/10))); +		} + +		delay_ms(1000); +     eaa:	88 ee       	ldi	r24, 0xE8	; 232 +     eac:	93 e0       	ldi	r25, 0x03	; 3 +     eae:	03 db       	rcall	.-2554   	; 0x4b6 <_Z8delay_msj> +     eb0:	ce ee       	ldi	r28, 0xEE	; 238 +     eb2:	d2 e0       	ldi	r29, 0x02	; 2 + +		i = 750; +		while (i>0) +		{ +			fill(0x00); +     eb4:	80 e0       	ldi	r24, 0x00	; 0 +     eb6:	e2 da       	rcall	.-2620   	; 0x47c <_Z4fillh> +			delay_ms(751-i); +     eb8:	c7 01       	movw	r24, r14 +     eba:	8c 1b       	sub	r24, r28 +     ebc:	9d 0b       	sbc	r25, r29 +     ebe:	fb da       	rcall	.-2570   	; 0x4b6 <_Z8delay_msj> + +			fill(0xff); +     ec0:	8f ef       	ldi	r24, 0xFF	; 255 +     ec2:	dc da       	rcall	.-2632   	; 0x47c <_Z4fillh> +			delay_ms(100); +     ec4:	84 e6       	ldi	r24, 0x64	; 100 +     ec6:	90 e0       	ldi	r25, 0x00	; 0 +     ec8:	f6 da       	rcall	.-2580   	; 0x4b6 <_Z8delay_msj> + +			i = i - (15+(1000/(i/10))); +     eca:	ce 01       	movw	r24, r28 +     ecc:	66 ef       	ldi	r22, 0xF6	; 246 +     ece:	7f ef       	ldi	r23, 0xFF	; 255 +     ed0:	19 d0       	rcall	.+50     	; 0xf04 <__divmodhi4> +     ed2:	88 ee       	ldi	r24, 0xE8	; 232 +     ed4:	93 e0       	ldi	r25, 0x03	; 3 +     ed6:	16 d0       	rcall	.+44     	; 0xf04 <__divmodhi4> +     ed8:	6f 50       	subi	r22, 0x0F	; 15 +     eda:	70 40       	sbci	r23, 0x00	; 0 +     edc:	c6 0f       	add	r28, r22 +     ede:	d7 1f       	adc	r29, r23 +		} + +		delay_ms(1000); + +		i = 750; +		while (i>0) +     ee0:	1c 16       	cp	r1, r28 +     ee2:	1d 06       	cpc	r1, r29 +     ee4:	3c f3       	brlt	.-50     	; 0xeb4 <_Z14effect_blinky2v+0x56> +void effect_blinky2() +{ +	int i,r; +	fill(0x00); + +	for (r=0;r<2;r++) +     ee6:	0f 5f       	subi	r16, 0xFF	; 255 +     ee8:	1f 4f       	sbci	r17, 0xFF	; 255 +     eea:	02 30       	cpi	r16, 0x02	; 2 +     eec:	11 05       	cpc	r17, r1 +     eee:	19 f0       	breq	.+6      	; 0xef6 <_Z14effect_blinky2v+0x98> +     ef0:	ce ee       	ldi	r28, 0xEE	; 238 +     ef2:	d2 e0       	ldi	r29, 0x02	; 2 +     ef4:	c3 cf       	rjmp	.-122    	; 0xe7c <_Z14effect_blinky2v+0x1e> + +			i = i - (15+(1000/(i/10))); +		} +	} + +} +     ef6:	df 91       	pop	r29 +     ef8:	cf 91       	pop	r28 +     efa:	1f 91       	pop	r17 +     efc:	0f 91       	pop	r16 +     efe:	ff 90       	pop	r15 +     f00:	ef 90       	pop	r14 +     f02:	08 95       	ret + +00000f04 <__divmodhi4>: +     f04:	97 fb       	bst	r25, 7 +     f06:	09 2e       	mov	r0, r25 +     f08:	07 26       	eor	r0, r23 +     f0a:	0a d0       	rcall	.+20     	; 0xf20 <__divmodhi4_neg1> +     f0c:	77 fd       	sbrc	r23, 7 +     f0e:	04 d0       	rcall	.+8      	; 0xf18 <__divmodhi4_neg2> +     f10:	0c d0       	rcall	.+24     	; 0xf2a <__udivmodhi4> +     f12:	06 d0       	rcall	.+12     	; 0xf20 <__divmodhi4_neg1> +     f14:	00 20       	and	r0, r0 +     f16:	1a f4       	brpl	.+6      	; 0xf1e <__divmodhi4_exit> + +00000f18 <__divmodhi4_neg2>: +     f18:	70 95       	com	r23 +     f1a:	61 95       	neg	r22 +     f1c:	7f 4f       	sbci	r23, 0xFF	; 255 + +00000f1e <__divmodhi4_exit>: +     f1e:	08 95       	ret + +00000f20 <__divmodhi4_neg1>: +     f20:	f6 f7       	brtc	.-4      	; 0xf1e <__divmodhi4_exit> +     f22:	90 95       	com	r25 +     f24:	81 95       	neg	r24 +     f26:	9f 4f       	sbci	r25, 0xFF	; 255 +     f28:	08 95       	ret + +00000f2a <__udivmodhi4>: +     f2a:	aa 1b       	sub	r26, r26 +     f2c:	bb 1b       	sub	r27, r27 +     f2e:	51 e1       	ldi	r21, 0x11	; 17 +     f30:	07 c0       	rjmp	.+14     	; 0xf40 <__udivmodhi4_ep> + +00000f32 <__udivmodhi4_loop>: +     f32:	aa 1f       	adc	r26, r26 +     f34:	bb 1f       	adc	r27, r27 +     f36:	a6 17       	cp	r26, r22 +     f38:	b7 07       	cpc	r27, r23 +     f3a:	10 f0       	brcs	.+4      	; 0xf40 <__udivmodhi4_ep> +     f3c:	a6 1b       	sub	r26, r22 +     f3e:	b7 0b       	sbc	r27, r23 + +00000f40 <__udivmodhi4_ep>: +     f40:	88 1f       	adc	r24, r24 +     f42:	99 1f       	adc	r25, r25 +     f44:	5a 95       	dec	r21 +     f46:	a9 f7       	brne	.-22     	; 0xf32 <__udivmodhi4_loop> +     f48:	80 95       	com	r24 +     f4a:	90 95       	com	r25 +     f4c:	bc 01       	movw	r22, r24 +     f4e:	cd 01       	movw	r24, r26 +     f50:	08 95       	ret + +00000f52 <__prologue_saves__>: +     f52:	2f 92       	push	r2 +     f54:	3f 92       	push	r3 +     f56:	4f 92       	push	r4 +     f58:	5f 92       	push	r5 +     f5a:	6f 92       	push	r6 +     f5c:	7f 92       	push	r7 +     f5e:	8f 92       	push	r8 +     f60:	9f 92       	push	r9 +     f62:	af 92       	push	r10 +     f64:	bf 92       	push	r11 +     f66:	cf 92       	push	r12 +     f68:	df 92       	push	r13 +     f6a:	ef 92       	push	r14 +     f6c:	ff 92       	push	r15 +     f6e:	0f 93       	push	r16 +     f70:	1f 93       	push	r17 +     f72:	cf 93       	push	r28 +     f74:	df 93       	push	r29 +     f76:	cd b7       	in	r28, 0x3d	; 61 +     f78:	de b7       	in	r29, 0x3e	; 62 +     f7a:	ca 1b       	sub	r28, r26 +     f7c:	db 0b       	sbc	r29, r27 +     f7e:	0f b6       	in	r0, 0x3f	; 63 +     f80:	f8 94       	cli +     f82:	de bf       	out	0x3e, r29	; 62 +     f84:	0f be       	out	0x3f, r0	; 63 +     f86:	cd bf       	out	0x3d, r28	; 61 +     f88:	09 94       	ijmp + +00000f8a <__epilogue_restores__>: +     f8a:	2a 88       	ldd	r2, Y+18	; 0x12 +     f8c:	39 88       	ldd	r3, Y+17	; 0x11 +     f8e:	48 88       	ldd	r4, Y+16	; 0x10 +     f90:	5f 84       	ldd	r5, Y+15	; 0x0f +     f92:	6e 84       	ldd	r6, Y+14	; 0x0e +     f94:	7d 84       	ldd	r7, Y+13	; 0x0d +     f96:	8c 84       	ldd	r8, Y+12	; 0x0c +     f98:	9b 84       	ldd	r9, Y+11	; 0x0b +     f9a:	aa 84       	ldd	r10, Y+10	; 0x0a +     f9c:	b9 84       	ldd	r11, Y+9	; 0x09 +     f9e:	c8 84       	ldd	r12, Y+8	; 0x08 +     fa0:	df 80       	ldd	r13, Y+7	; 0x07 +     fa2:	ee 80       	ldd	r14, Y+6	; 0x06 +     fa4:	fd 80       	ldd	r15, Y+5	; 0x05 +     fa6:	0c 81       	ldd	r16, Y+4	; 0x04 +     fa8:	1b 81       	ldd	r17, Y+3	; 0x03 +     faa:	aa 81       	ldd	r26, Y+2	; 0x02 +     fac:	b9 81       	ldd	r27, Y+1	; 0x01 +     fae:	ce 0f       	add	r28, r30 +     fb0:	d1 1d       	adc	r29, r1 +     fb2:	0f b6       	in	r0, 0x3f	; 63 +     fb4:	f8 94       	cli +     fb6:	de bf       	out	0x3e, r29	; 62 +     fb8:	0f be       	out	0x3f, r0	; 63 +     fba:	cd bf       	out	0x3d, r28	; 61 +     fbc:	ed 01       	movw	r28, r26 +     fbe:	08 95       	ret + +00000fc0 <do_rand>: +     fc0:	a0 e0       	ldi	r26, 0x00	; 0 +     fc2:	b0 e0       	ldi	r27, 0x00	; 0 +     fc4:	e5 ee       	ldi	r30, 0xE5	; 229 +     fc6:	f7 e0       	ldi	r31, 0x07	; 7 +     fc8:	cc cf       	rjmp	.-104    	; 0xf62 <__prologue_saves__+0x10> +     fca:	ec 01       	movw	r28, r24 +     fcc:	a8 80       	ld	r10, Y +     fce:	b9 80       	ldd	r11, Y+1	; 0x01 +     fd0:	ca 80       	ldd	r12, Y+2	; 0x02 +     fd2:	db 80       	ldd	r13, Y+3	; 0x03 +     fd4:	a1 14       	cp	r10, r1 +     fd6:	b1 04       	cpc	r11, r1 +     fd8:	c1 04       	cpc	r12, r1 +     fda:	d1 04       	cpc	r13, r1 +     fdc:	41 f4       	brne	.+16     	; 0xfee <do_rand+0x2e> +     fde:	84 e2       	ldi	r24, 0x24	; 36 +     fe0:	a8 2e       	mov	r10, r24 +     fe2:	89 ed       	ldi	r24, 0xD9	; 217 +     fe4:	b8 2e       	mov	r11, r24 +     fe6:	8b e5       	ldi	r24, 0x5B	; 91 +     fe8:	c8 2e       	mov	r12, r24 +     fea:	87 e0       	ldi	r24, 0x07	; 7 +     fec:	d8 2e       	mov	r13, r24 +     fee:	c6 01       	movw	r24, r12 +     ff0:	b5 01       	movw	r22, r10 +     ff2:	2d e1       	ldi	r18, 0x1D	; 29 +     ff4:	33 ef       	ldi	r19, 0xF3	; 243 +     ff6:	41 e0       	ldi	r20, 0x01	; 1 +     ff8:	50 e0       	ldi	r21, 0x00	; 0 +     ffa:	5a d0       	rcall	.+180    	; 0x10b0 <__divmodsi4> +     ffc:	27 ea       	ldi	r18, 0xA7	; 167 +     ffe:	31 e4       	ldi	r19, 0x41	; 65 +    1000:	40 e0       	ldi	r20, 0x00	; 0 +    1002:	50 e0       	ldi	r21, 0x00	; 0 +    1004:	36 d0       	rcall	.+108    	; 0x1072 <__mulsi3> +    1006:	7b 01       	movw	r14, r22 +    1008:	8c 01       	movw	r16, r24 +    100a:	c6 01       	movw	r24, r12 +    100c:	b5 01       	movw	r22, r10 +    100e:	2d e1       	ldi	r18, 0x1D	; 29 +    1010:	33 ef       	ldi	r19, 0xF3	; 243 +    1012:	41 e0       	ldi	r20, 0x01	; 1 +    1014:	50 e0       	ldi	r21, 0x00	; 0 +    1016:	4c d0       	rcall	.+152    	; 0x10b0 <__divmodsi4> +    1018:	ca 01       	movw	r24, r20 +    101a:	b9 01       	movw	r22, r18 +    101c:	2c ee       	ldi	r18, 0xEC	; 236 +    101e:	34 ef       	ldi	r19, 0xF4	; 244 +    1020:	4f ef       	ldi	r20, 0xFF	; 255 +    1022:	5f ef       	ldi	r21, 0xFF	; 255 +    1024:	26 d0       	rcall	.+76     	; 0x1072 <__mulsi3> +    1026:	6e 0d       	add	r22, r14 +    1028:	7f 1d       	adc	r23, r15 +    102a:	80 1f       	adc	r24, r16 +    102c:	91 1f       	adc	r25, r17 +    102e:	97 ff       	sbrs	r25, 7 +    1030:	04 c0       	rjmp	.+8      	; 0x103a <do_rand+0x7a> +    1032:	61 50       	subi	r22, 0x01	; 1 +    1034:	70 40       	sbci	r23, 0x00	; 0 +    1036:	80 40       	sbci	r24, 0x00	; 0 +    1038:	90 48       	sbci	r25, 0x80	; 128 +    103a:	68 83       	st	Y, r22 +    103c:	79 83       	std	Y+1, r23	; 0x01 +    103e:	8a 83       	std	Y+2, r24	; 0x02 +    1040:	9b 83       	std	Y+3, r25	; 0x03 +    1042:	9b 01       	movw	r18, r22 +    1044:	3f 77       	andi	r19, 0x7F	; 127 +    1046:	c9 01       	movw	r24, r18 +    1048:	cd b7       	in	r28, 0x3d	; 61 +    104a:	de b7       	in	r29, 0x3e	; 62 +    104c:	ea e0       	ldi	r30, 0x0A	; 10 +    104e:	a5 cf       	rjmp	.-182    	; 0xf9a <__epilogue_restores__+0x10> + +00001050 <rand_r>: +    1050:	b7 df       	rcall	.-146    	; 0xfc0 <do_rand> +    1052:	08 95       	ret + +00001054 <rand>: +    1054:	80 e6       	ldi	r24, 0x60	; 96 +    1056:	90 e0       	ldi	r25, 0x00	; 0 +    1058:	b3 df       	rcall	.-154    	; 0xfc0 <do_rand> +    105a:	08 95       	ret + +0000105c <srand>: +    105c:	a0 e0       	ldi	r26, 0x00	; 0 +    105e:	b0 e0       	ldi	r27, 0x00	; 0 +    1060:	80 93 60 00 	sts	0x0060, r24 +    1064:	90 93 61 00 	sts	0x0061, r25 +    1068:	a0 93 62 00 	sts	0x0062, r26 +    106c:	b0 93 63 00 	sts	0x0063, r27 +    1070:	08 95       	ret + +00001072 <__mulsi3>: +    1072:	62 9f       	mul	r22, r18 +    1074:	d0 01       	movw	r26, r0 +    1076:	73 9f       	mul	r23, r19 +    1078:	f0 01       	movw	r30, r0 +    107a:	82 9f       	mul	r24, r18 +    107c:	e0 0d       	add	r30, r0 +    107e:	f1 1d       	adc	r31, r1 +    1080:	64 9f       	mul	r22, r20 +    1082:	e0 0d       	add	r30, r0 +    1084:	f1 1d       	adc	r31, r1 +    1086:	92 9f       	mul	r25, r18 +    1088:	f0 0d       	add	r31, r0 +    108a:	83 9f       	mul	r24, r19 +    108c:	f0 0d       	add	r31, r0 +    108e:	74 9f       	mul	r23, r20 +    1090:	f0 0d       	add	r31, r0 +    1092:	65 9f       	mul	r22, r21 +    1094:	f0 0d       	add	r31, r0 +    1096:	99 27       	eor	r25, r25 +    1098:	72 9f       	mul	r23, r18 +    109a:	b0 0d       	add	r27, r0 +    109c:	e1 1d       	adc	r30, r1 +    109e:	f9 1f       	adc	r31, r25 +    10a0:	63 9f       	mul	r22, r19 +    10a2:	b0 0d       	add	r27, r0 +    10a4:	e1 1d       	adc	r30, r1 +    10a6:	f9 1f       	adc	r31, r25 +    10a8:	bd 01       	movw	r22, r26 +    10aa:	cf 01       	movw	r24, r30 +    10ac:	11 24       	eor	r1, r1 +    10ae:	08 95       	ret + +000010b0 <__divmodsi4>: +    10b0:	97 fb       	bst	r25, 7 +    10b2:	09 2e       	mov	r0, r25 +    10b4:	05 26       	eor	r0, r21 +    10b6:	0e d0       	rcall	.+28     	; 0x10d4 <__divmodsi4_neg1> +    10b8:	57 fd       	sbrc	r21, 7 +    10ba:	04 d0       	rcall	.+8      	; 0x10c4 <__divmodsi4_neg2> +    10bc:	14 d0       	rcall	.+40     	; 0x10e6 <__udivmodsi4> +    10be:	0a d0       	rcall	.+20     	; 0x10d4 <__divmodsi4_neg1> +    10c0:	00 1c       	adc	r0, r0 +    10c2:	38 f4       	brcc	.+14     	; 0x10d2 <__divmodsi4_exit> + +000010c4 <__divmodsi4_neg2>: +    10c4:	50 95       	com	r21 +    10c6:	40 95       	com	r20 +    10c8:	30 95       	com	r19 +    10ca:	21 95       	neg	r18 +    10cc:	3f 4f       	sbci	r19, 0xFF	; 255 +    10ce:	4f 4f       	sbci	r20, 0xFF	; 255 +    10d0:	5f 4f       	sbci	r21, 0xFF	; 255 + +000010d2 <__divmodsi4_exit>: +    10d2:	08 95       	ret + +000010d4 <__divmodsi4_neg1>: +    10d4:	f6 f7       	brtc	.-4      	; 0x10d2 <__divmodsi4_exit> +    10d6:	90 95       	com	r25 +    10d8:	80 95       	com	r24 +    10da:	70 95       	com	r23 +    10dc:	61 95       	neg	r22 +    10de:	7f 4f       	sbci	r23, 0xFF	; 255 +    10e0:	8f 4f       	sbci	r24, 0xFF	; 255 +    10e2:	9f 4f       	sbci	r25, 0xFF	; 255 +    10e4:	08 95       	ret + +000010e6 <__udivmodsi4>: +    10e6:	a1 e2       	ldi	r26, 0x21	; 33 +    10e8:	1a 2e       	mov	r1, r26 +    10ea:	aa 1b       	sub	r26, r26 +    10ec:	bb 1b       	sub	r27, r27 +    10ee:	fd 01       	movw	r30, r26 +    10f0:	0d c0       	rjmp	.+26     	; 0x110c <__udivmodsi4_ep> + +000010f2 <__udivmodsi4_loop>: +    10f2:	aa 1f       	adc	r26, r26 +    10f4:	bb 1f       	adc	r27, r27 +    10f6:	ee 1f       	adc	r30, r30 +    10f8:	ff 1f       	adc	r31, r31 +    10fa:	a2 17       	cp	r26, r18 +    10fc:	b3 07       	cpc	r27, r19 +    10fe:	e4 07       	cpc	r30, r20 +    1100:	f5 07       	cpc	r31, r21 +    1102:	20 f0       	brcs	.+8      	; 0x110c <__udivmodsi4_ep> +    1104:	a2 1b       	sub	r26, r18 +    1106:	b3 0b       	sbc	r27, r19 +    1108:	e4 0b       	sbc	r30, r20 +    110a:	f5 0b       	sbc	r31, r21 + +0000110c <__udivmodsi4_ep>: +    110c:	66 1f       	adc	r22, r22 +    110e:	77 1f       	adc	r23, r23 +    1110:	88 1f       	adc	r24, r24 +    1112:	99 1f       	adc	r25, r25 +    1114:	1a 94       	dec	r1 +    1116:	69 f7       	brne	.-38     	; 0x10f2 <__udivmodsi4_loop> +    1118:	60 95       	com	r22 +    111a:	70 95       	com	r23 +    111c:	80 95       	com	r24 +    111e:	90 95       	com	r25 +    1120:	9b 01       	movw	r18, r22 +    1122:	ac 01       	movw	r20, r24 +    1124:	bd 01       	movw	r22, r26 +    1126:	cf 01       	movw	r24, r30 +    1128:	08 95       	ret + +0000112a <_exit>: +    112a:	f8 94       	cli + +0000112c <__stop_program>: +    112c:	ff cf       	rjmp	.-2      	; 0x112c <__stop_program> diff --git a/avr-test/ledcube.map b/avr-test/ledcube.map new file mode 100644 index 0000000..eaa732b --- /dev/null +++ b/avr-test/ledcube.map @@ -0,0 +1,783 @@ +Archive member included because of file (symbol) + +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodhi4.o) +                              effect.o (__divmodhi4) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_exit.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/crtm8.o (exit) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clear_bss.o) +                              main.o (__do_clear_bss) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_fixunssfsi.o) +                              draw.o (__fixunssfsi) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_addsub_sf.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_fixunssfsi.o) (__subsf3) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_mul_sf.o) +                              draw.o (__mulsf3) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_div_sf.o) +                              draw.o (__divsf3) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_ge_sf.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_fixunssfsi.o) (__gesf2) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_si_to_sf.o) +                              draw.o (__floatsisf) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_sf_to_si.o) +                              effect.o (__fixsfsi) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_thenan_sf.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_addsub_sf.o) (__thenan_sf) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_udivmodhi4.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodhi4.o) (__udivmodhi4) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_prologue.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_addsub_sf.o) (__prologue_saves__) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_epilogue.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_addsub_sf.o) (__epilogue_restores__) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_copy_data.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_thenan_sf.o) (__do_copy_data) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clzsi2.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_si_to_sf.o) (__clzsi2) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_pack_sf.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_addsub_sf.o) (__pack_f) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_unpack_sf.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_addsub_sf.o) (__unpack_f) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_fpcmp_parts_sf.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_ge_sf.o) (__fpcmp_parts_f) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clz.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clzsi2.o) (__clz_tab) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(cos.o) +                              effect.o (cos) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_rempio2.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(cos.o) (__fp_rempio2) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_sinus.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(cos.o) (__fp_sinus) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_split3.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_rempio2.o) (__fp_splitA) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(sin.o) +                              effect.o (sin) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(addsf3x.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_sinus.o) (__addsf3x) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_inf.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(addsf3x.o) (__fp_inf) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_mpack.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_rempio2.o) (__fp_mpack_finite) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_nan.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_rempio2.o) (__fp_nan) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powsodd.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_sinus.o) (__fp_powsodd) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscA.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(addsf3x.o) (__fp_pscA) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscB.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(addsf3x.o) (__fp_pscB) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_round.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_sinus.o) (__fp_round) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_zero.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(addsf3x.o) (__fp_zero) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powser.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powsodd.o) (__fp_powser) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(mulsf3x.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powser.o) (__mulsf3x) +/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libc.a(rand.o) +                              main.o (rand) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_mulsi3.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libc.a(rand.o) (__mulsi3) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodsi4.o) +                              /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libc.a(rand.o) (__divmodsi4) +/usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_udivmodsi4.o) +                              /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodsi4.o) (__udivmodsi4) + +Discarded input sections + + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/crtm8.o + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/crtm8.o + .text          0x00000000        0x0 main.o + .data          0x00000000        0x0 main.o + .text._Z5delaym +                0x00000000       0x52 main.o + .text._Z9clear_ledv +                0x00000000       0x36 main.o + .text          0x00000000        0x0 draw.o + .data          0x00000000        0x0 draw.o + .bss           0x00000000        0x0 draw.o + .text._Z11tmpclrvoxeliii +                0x00000000       0x4c draw.o + .text._Z11tmpsetvoxeliii +                0x00000000       0x4a draw.o + .text._Z8flpvoxeliii +                0x00000000       0x4a draw.o + .text._Z8argorderiiPiS_ +                0x00000000       0x24 draw.o + .text._Z10setplane_zi +                0x00000000       0x2e draw.o + .text._Z10clrplane_zi +                0x00000000       0x2c draw.o + .text._Z10setplane_xi +                0x00000000       0x56 draw.o + .text._Z10clrplane_xi +                0x00000000       0x58 draw.o + .text._Z10setplane_yi +                0x00000000       0x2e draw.o + .text._Z10clrplane_yi +                0x00000000       0x2c draw.o + .text._Z8setplanech +                0x00000000       0x74 draw.o + .text._Z8clrplanech +                0x00000000       0x70 draw.o + .text._Z7tmpfillh +                0x00000000       0x3a draw.o + .text._Z10box_fillediiiiii +                0x00000000       0x96 draw.o + .text._Z9box_wallsiiiiii +                0x00000000       0xe8 draw.o + .text._Z13box_wireframeiiiiii +                0x00000000      0x12e draw.o + .text._Z8bytelineii +                0x00000000       0x28 draw.o + .text._Z8flipbytec +                0x00000000       0x70 draw.o + .text._Z4lineiiiiii +                0x00000000      0x1da draw.o + .text._Z8mirror_zv +                0x00000000       0x84 draw.o + .text._Z8mirror_xv +                0x00000000       0xba draw.o + .text._Z8mirror_yv +                0x00000000       0xde draw.o + .text._Z8tmp2cubev +                0x00000000       0x14 draw.o + .text          0x00000000        0x0 effect.o + .data          0x00000000        0x0 effect.o + .bss           0x00000000        0x0 effect.o + .text._Z15effect_pathmovePhi +                0x00000000       0xa6 effect.o + .text._Z20effect_telcstairs_doiii +                0x00000000       0x48 effect.o + .text._Z17effect_telcstairsiii +                0x00000000       0x3e effect.o + .text._Z27effect_random_sparkle_flashiii +                0x00000000       0x98 effect.o + .text._Z21effect_random_sparklev +                0x00000000       0x32 effect.o + .text._Z14effect_loadbari +                0x00000000       0xa6 effect.o + .text._Z30effect_axis_updown_randsuspendciii +                0x00000000      0x15c effect.o + .text._Z10boingboingjihh +                0x00000000      0x538 effect.o + .text._Z16sendplane_rand_zhii +                0x00000000       0x6c effect.o + .text._Z19effect_box_woopwoopii +                0x00000000       0x7a effect.o + .text._Z22effect_box_shrink_growiiij +                0x00000000      0x100 effect.o + .text._Z16effect_planboingii +                0x00000000       0x46 effect.o + .text._Z11effect_testv +                0x00000000       0xa4 effect.o + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodhi4.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodhi4.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodhi4.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_exit.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_exit.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_exit.o) + .text.libgcc   0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_exit.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clear_bss.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clear_bss.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clear_bss.o) + .text.libgcc   0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clear_bss.o) + .text          0x00000000       0x50 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_fixunssfsi.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_fixunssfsi.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_fixunssfsi.o) + .text          0x00000000      0x338 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_addsub_sf.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_addsub_sf.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_addsub_sf.o) + .text          0x00000000      0x1ea /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_mul_sf.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_mul_sf.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_mul_sf.o) + .text          0x00000000      0x14e /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_div_sf.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_div_sf.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_div_sf.o) + .text          0x00000000       0x56 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_ge_sf.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_ge_sf.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_ge_sf.o) + .text          0x00000000       0xb4 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_si_to_sf.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_si_to_sf.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_si_to_sf.o) + .text          0x00000000       0xa2 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_sf_to_si.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_sf_to_si.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_sf_to_si.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_thenan_sf.o) + .data          0x00000000        0x8 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_thenan_sf.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_thenan_sf.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_udivmodhi4.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_udivmodhi4.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_udivmodhi4.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_prologue.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_prologue.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_prologue.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_epilogue.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_epilogue.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_epilogue.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_copy_data.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_copy_data.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_copy_data.o) + .text.libgcc   0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_copy_data.o) + .text          0x00000000       0x9e /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clzsi2.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clzsi2.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clzsi2.o) + .text          0x00000000      0x1aa /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_pack_sf.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_pack_sf.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_pack_sf.o) + .text          0x00000000       0xf0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_unpack_sf.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_unpack_sf.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_unpack_sf.o) + .text          0x00000000       0xb2 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_fpcmp_parts_sf.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_fpcmp_parts_sf.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_fpcmp_parts_sf.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clz.o) + .data          0x00000000      0x100 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clz.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clz.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(cos.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(cos.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(cos.o) + .text.avr-libc.fplib +                0x00000000        0x6 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(cos.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_rempio2.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_rempio2.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_rempio2.o) + .text.avr-libc.fplib +                0x00000000       0x50 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_rempio2.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_sinus.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_sinus.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_sinus.o) + .text.avr-libc.fplib +                0x00000000       0x22 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_sinus.o) + .progmem.gcc_fplib +                0x00000000       0x1e /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_sinus.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_split3.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_split3.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_split3.o) + .text.avr-libc.fplib +                0x00000000       0x44 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_split3.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(sin.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(sin.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(sin.o) + .text.avr-libc.fplib +                0x00000000        0xc /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(sin.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(addsf3x.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(addsf3x.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(addsf3x.o) + .text.avr-libc.fplib +                0x00000000       0xc0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(addsf3x.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_inf.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_inf.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_inf.o) + .text.avr-libc.fplib +                0x00000000        0xc /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_inf.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_mpack.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_mpack.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_mpack.o) + .text.avr-libc.fplib +                0x00000000       0x1c /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_mpack.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_nan.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_nan.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_nan.o) + .text.avr-libc.fplib +                0x00000000        0x6 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_nan.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powsodd.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powsodd.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powsodd.o) + .text.avr-libc.fplib +                0x00000000       0x22 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powsodd.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscA.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscA.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscA.o) + .text.avr-libc.fplib +                0x00000000        0xe /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscA.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscB.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscB.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscB.o) + .text.avr-libc.fplib +                0x00000000        0xe /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscB.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_round.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_round.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_round.o) + .text.avr-libc.fplib +                0x00000000       0x22 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_round.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_zero.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_zero.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_zero.o) + .text.avr-libc.fplib +                0x00000000        0xe /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_zero.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powser.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powser.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powser.o) + .text.avr-libc.fplib +                0x00000000       0x4a /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powser.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(mulsf3x.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(mulsf3x.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(mulsf3x.o) + .text.avr-libc.fplib +                0x00000000       0xc2 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(mulsf3x.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libc.a(rand.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libc.a(rand.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_mulsi3.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_mulsi3.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_mulsi3.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodsi4.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodsi4.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodsi4.o) + .text          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_udivmodsi4.o) + .data          0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_udivmodsi4.o) + .bss           0x00000000        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_udivmodsi4.o) + +Memory Configuration + +Name             Origin             Length             Attributes +text             0x00000000         0x00002000         xr +data             0x00800060         0x0000ffa0         rw !x +eeprom           0x00810000         0x00010000         rw !x +fuse             0x00820000         0x00000400         rw !x +lock             0x00830000         0x00000400         rw !x +signature        0x00840000         0x00000400         rw !x +*default*        0x00000000         0xffffffff + +Linker script and memory map + +LOAD /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/crtm8.o +LOAD main.o +LOAD draw.o +LOAD effect.o +LOAD /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a +LOAD /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a +LOAD /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a +LOAD /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libc.a +LOAD /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a + +.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           0x00000000     0x112e + *(.vectors) + .vectors       0x00000000       0x26 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/crtm8.o +                0x00000000                __vectors +                0x00000000                __vector_default + *(.vectors) + *(.progmem.gcc*) + *(.progmem*) +                0x00000026                . = ALIGN (0x2) +                0x00000026                __trampolines_start = . + *(.trampolines) + .trampolines   0x00000026        0x0 linker stubs + *(.trampolines*) +                0x00000026                __trampolines_end = . + *(.jumptables) + *(.jumptables*) + *(.lowtext) + *(.lowtext*) +                0x00000026                __ctors_start = . + *(.ctors) +                0x00000026                __ctors_end = . +                0x00000026                __dtors_start = . + *(.dtors) +                0x00000026                __dtors_end = . + SORT(*)(.ctors) + SORT(*)(.dtors) + *(.init0) + .init0         0x00000026        0x0 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/crtm8.o +                0x00000026                __init + *(.init0) + *(.init1) + *(.init1) + *(.init2) + .init2         0x00000026        0xc /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/crtm8.o + *(.init2) + *(.init3) + *(.init3) + *(.init4) + .init4         0x00000032       0x10 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_clear_bss.o) +                0x00000032                __do_clear_bss + .init4         0x00000042       0x16 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_copy_data.o) +                0x00000042                __do_copy_data + *(.init4) + *(.init5) + *(.init5) + *(.init6) + *(.init6) + *(.init7) + *(.init7) + *(.init8) + *(.init8) + *(.init9) + .init9         0x00000058        0x4 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/crtm8.o + *(.init9) + *(.text) + .text          0x0000005c        0x2 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/crtm8.o +                0x0000005c                __vector_1 +                0x0000005c                __vector_12 +                0x0000005c                __bad_interrupt +                0x0000005c                __vector_6 +                0x0000005c                __vector_11 +                0x0000005c                __vector_13 +                0x0000005c                __vector_17 +                0x0000005c                __vector_7 +                0x0000005c                __vector_5 +                0x0000005c                __vector_4 +                0x0000005c                __vector_2 +                0x0000005c                __vector_15 +                0x0000005c                __vector_8 +                0x0000005c                __vector_14 +                0x0000005c                __vector_10 +                0x0000005c                __vector_16 +                0x0000005c                __vector_18 +                0x0000005e                . = ALIGN (0x2) + *(.text.*) + .text.__vector_9 +                0x0000005e       0x8a main.o +                0x0000005e                __vector_9 + .text.__vector_3 +                0x000000e8      0x124 main.o +                0x000000e8                __vector_3 + .text.main     0x0000020c      0x15c main.o +                0x0000020c                main + .text._Z6myrandv +                0x00000368        0x4 main.o +                0x00000368                myrand() + .text._Z7inrangeiii +                0x0000036c       0x28 draw.o +                0x0000036c                inrange(int, int, int) + .text._Z8clrvoxeliii +                0x00000394       0x4c draw.o +                0x00000394                clrvoxel(int, int, int) + .text._Z8setvoxeliii +                0x000003e0       0x4a draw.o +                0x000003e0                setvoxel(int, int, int) + .text._Z8getvoxeliii +                0x0000042a       0x44 draw.o +                0x0000042a                getvoxel(int, int, int) + .text._Z10altervoxeliiii +                0x0000046e        0xe draw.o +                0x0000046e                altervoxel(int, int, int, int) + .text._Z4fillh +                0x0000047c       0x3a draw.o +                0x0000047c                fill(unsigned char) + .text._Z8delay_msj +                0x000004b6       0x1e draw.o +                0x000004b6                delay_ms(unsigned int) + .text._Z5shiftci +                0x000004d4      0x15e draw.o +                0x000004d4                shift(char, int) + .text._Z18effect_wormsqueezeiiiii +                0x00000632      0x1a6 effect.o +                0x00000632                effect_wormsqueeze(int, int, int, int, int) + .text._Z11effect_raini +                0x000007d8       0x8c effect.o +                0x000007d8                effect_rain(int) + .text._Z11sendvoxel_zhhhi +                0x00000864       0x96 effect.o +                0x00000864                sendvoxel_z(unsigned char, unsigned char, unsigned char, int) + .text._Z19draw_positions_axiscPhi +                0x000008fa       0xd0 effect.o +                0x000008fa                draw_positions_axis(char, unsigned char*, int) + .text._Z32effect_boxside_randsend_parallelciii +                0x000009ca      0x16c effect.o +                0x000009ca                effect_boxside_randsend_parallel(char, int, int, int) + .text._Z20effect_z_updown_movePhS_c +                0x00000b36       0x3c effect.o +                0x00000b36                effect_z_updown_move(unsigned char*, unsigned char*, char) + .text._Z15effect_z_updownii +                0x00000b72      0x156 effect.o +                0x00000b72                effect_z_updown(int, int) + .text._Z20effect_random_fillerii +                0x00000cc8       0xbc effect.o +                0x00000cc8                effect_random_filler(int, int) + .text._Z17sendvoxels_rand_ziii +                0x00000d84       0xda effect.o +                0x00000d84                sendvoxels_rand_z(int, int, int) + .text._Z14effect_blinky2v +                0x00000e5e       0xa6 effect.o +                0x00000e5e                effect_blinky2() + .text.libgcc   0x00000f04       0x26 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodhi4.o) +                0x00000f04                __divmodhi4 +                0x00000f04                _div + .text.libgcc   0x00000f2a       0x28 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_udivmodhi4.o) +                0x00000f2a                __udivmodhi4 + .text.libgcc   0x00000f52       0x38 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_prologue.o) +                0x00000f52                __prologue_saves__ + .text.libgcc   0x00000f8a       0x36 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_epilogue.o) +                0x00000f8a                __epilogue_restores__ + .text.avr-libc +                0x00000fc0       0xb2 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libc.a(rand.o) +                0x00001050                rand_r +                0x00001054                rand +                0x0000105c                srand + .text.libgcc   0x00001072       0x3e /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_mulsi3.o) +                0x00001072                __mulsi3 + .text.libgcc   0x000010b0       0x36 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_divmodsi4.o) +                0x000010b0                __divmodsi4 + .text.libgcc   0x000010e6       0x44 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_udivmodsi4.o) +                0x000010e6                __udivmodsi4 +                0x0000112a                . = ALIGN (0x2) + *(.fini9) + .fini9         0x0000112a        0x0 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_exit.o) +                0x0000112a                exit +                0x0000112a                _exit + *(.fini9) + *(.fini8) + *(.fini8) + *(.fini7) + *(.fini7) + *(.fini6) + *(.fini6) + *(.fini5) + *(.fini5) + *(.fini4) + *(.fini4) + *(.fini3) + *(.fini3) + *(.fini2) + *(.fini2) + *(.fini1) + *(.fini1) + *(.fini0) + .fini0         0x0000112a        0x4 /usr/lib/gcc/avr/4.3.5/avr4/libgcc.a(_exit.o) + *(.fini0) +                0x0000112e                _etext = . + +.data           0x00800060        0x4 load address 0x0000112e +                0x00800060                PROVIDE (__data_start, .) + *(.data) + .data          0x00800060        0x4 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libc.a(rand.o) + *(.data*) + *(.rodata) + *(.rodata*) + *(.gnu.linkonce.d*) +                0x00800064                . = ALIGN (0x2) +                0x00800064                _edata = . +                0x00800064                PROVIDE (__data_end, .) + +.bss            0x00800064       0x88 +                0x00800064                PROVIDE (__bss_start, .) + *(.bss) + .bss           0x00800064       0x88 main.o +                0x00800064                cube +                0x008000a4                in_wait +                0x008000a5                fb +                0x008000e5                timer0_millis +                0x008000e9                current_layer +                0x008000ea                pgm_mode + *(.bss*) + *(COMMON) +                0x008000ec                PROVIDE (__bss_end, .) +                0x0000112e                __data_load_start = LOADADDR (.data) +                0x00001132                __data_load_end = (__data_load_start + SIZEOF (.data)) + +.noinit         0x008000ec        0x0 +                0x008000ec                PROVIDE (__noinit_start, .) + *(.noinit*) +                0x008000ec                PROVIDE (__noinit_end, .) +                0x008000ec                _end = . +                0x008000ec                PROVIDE (__heap_start, .) + +.eeprom         0x00810000        0x0 + *(.eeprom*) +                0x00810000                __eeprom_end = . + +.fuse + *(.fuse) + *(.lfuse) + *(.hfuse) + *(.efuse) + +.lock + *(.lock*) + +.signature + *(.signature*) + +.stab           0x00000000     0x4284 + *(.stab) + .stab          0x00000000      0x6b4 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/crtm8.o + .stab          0x000006b4      0x948 main.o +                                0xa2c (size before relaxing) + .stab          0x00000ffc      0x9c0 draw.o +                               0x16ec (size before relaxing) + .stab          0x000019bc      0xf24 effect.o +                               0x1d64 (size before relaxing) + .stab          0x000028e0       0x54 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(cos.o) +                                 0x60 (size before relaxing) + .stab          0x00002934      0x21c /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_rempio2.o) +                                0x228 (size before relaxing) + .stab          0x00002b50       0xfc /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_sinus.o) +                                0x108 (size before relaxing) + .stab          0x00002c4c      0x1d4 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_split3.o) +                                0x1e0 (size before relaxing) + .stab          0x00002e20       0x78 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(sin.o) +                                 0x84 (size before relaxing) + .stab          0x00002e98      0x4bc /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(addsf3x.o) +                                0x4c8 (size before relaxing) + .stab          0x00003354       0x78 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_inf.o) +                                 0x84 (size before relaxing) + .stab          0x000033cc       0xe4 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_mpack.o) +                                 0xf0 (size before relaxing) + .stab          0x000034b0       0x54 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_nan.o) +                                 0x60 (size before relaxing) + .stab          0x00003504       0xfc /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powsodd.o) +                                0x108 (size before relaxing) + .stab          0x00003600       0x84 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscA.o) +                                 0x90 (size before relaxing) + .stab          0x00003684       0x84 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_pscB.o) +                                 0x90 (size before relaxing) + .stab          0x00003708       0xfc /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_round.o) +                                0x108 (size before relaxing) + .stab          0x00003804       0x90 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_zero.o) +                                 0x9c (size before relaxing) + .stab          0x00003894      0x1ec /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(fp_powser.o) +                                0x1f8 (size before relaxing) + .stab          0x00003a80      0x4d4 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libm.a(mulsf3x.o) +                                0x4e0 (size before relaxing) + .stab          0x00003f54      0x330 /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/libc.a(rand.o) +                                0x33c (size before relaxing) + +.stabstr        0x00000000     0x1cbd + *(.stabstr) + .stabstr       0x00000000     0x1cbd /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr4/crtm8.o + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment + *(.comment) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges + *(.debug_aranges) + +.debug_pubnames + *(.debug_pubnames) + +.debug_info + *(.debug_info) + *(.gnu.linkonce.wi.*) + +.debug_abbrev + *(.debug_abbrev) + +.debug_line + *(.debug_line) + +.debug_frame + *(.debug_frame) + +.debug_str + *(.debug_str) + +.debug_loc + *(.debug_loc) + +.debug_macinfo + *(.debug_macinfo) +OUTPUT(ledcube.elf elf32-avr) +LOAD linker stubs diff --git a/avr-test/ledcube.srec b/avr-test/ledcube.srec new file mode 100755 index 0000000..5e86a2f --- /dev/null +++ b/avr-test/ledcube.srec @@ -0,0 +1,278 @@ +S00F00006C6564637562652E7372656341
 +S113000012C02CC02BC070C029C028C027C026C075
 +S113001025C025C023C022C021C020C01FC01EC0CF
 +S11300201DC01CC01BC011241FBECFE5D4E0DEBF21
 +S1130030CDBF10E0A4E6B0E001C01D92AC3EB10714
 +S1130040E1F710E0A0E6B0E0EEE2F1E102C00590D5
 +S11300500D92A436B107D9F7D9D067C8D1CF1F9272
 +S11300600F920FB60F921124EF92FF920F931F93EA
 +S11300702F933F934F935F938F939F93E090E5006B
 +S1130080F090E6000091E7001091E800A8019701C4
 +S11300902E5F3F4F4F4F5F4F9091EB00892F8A5F48
 +S11300A08093EB008D3748F097579093EB00A801AD
 +S11300B097012D5F3F4F4F4F5F4F2093E5003093E3
 +S11300C0E6004093E7005093E8009F918F915F9181
 +S11300D04F913F912F911F910F91FF90EF900F90AF
 +S11300E00FBE0F901F9018951F920F920FB60F928C
 +S11300F011242F933F934F935F936F938F939F9309
 +S1130100AF93BF93EF93FF9385B3877D85BB6091D6
 +S1130110E90057E0A62FB0E0E52FF0E033E0EE0F62
 +S1130120FF1F3A95E1F7EA0FFB1FEC59FF4F40819F
 +S1130130AC9888B3942F91708E7F982B98BBAC9A0F
 +S1130140AC9838B3842F90E095958795282F21702B
 +S11301503E7F232B28BBAC9AAC9838B395958795F2
 +S1130160282F21703E7F232B28BBAC9AAC9838B340
 +S113017095958795282F21703E7F232B28BBAC9A19
 +S1130180AC9838B395958795282F21703E7F232B03
 +S113019028BBAC9AAC9838B395958795282F2170D5
 +S11301A03E7F232B28BBAC9AAC9828B395958795B2
 +S11301B081702E7F822B88BBAC9AAC9888B3441F85
 +S11301C04427441F8E7F482B48BBAC9A515008F0FB
 +S11301D0A3CF85B3962F9862887F982B95BB962FD3
 +S11301E09F5F983008F090E09093E900FF91EF91C1
 +S11301F0BF91AF919F918F916F915F914F913F917B
 +S11302002F910F900FBE0F901F901895EF92FF92B1
 +S11302100F931F9312BE83B7836083BF89B7816036
 +S113022089BF8BE083BD85B5856085BD85B5886054
 +S113023085BD14BC89B7806889BF12BA18BA15BACB
 +S11302408FEF81BB87BB84BB789420E0EE24E394DA
 +S1130250FF24FA9414C080E090E0422F50E0FC01A7
 +S113026063E0EE0FFF1F6A95E1F7E40FF51FEC5909
 +S1130270FF4FF08201968830910589F72F5F28306F
 +S113028050F3E092A4002091E5003091E600409103
 +S1130290E7005091E8008091E5009091E600A0917C
 +S11302A0E700B091E800821B930BA40BB50B885EAA
 +S11302B09340A040B04078F31092A40084E190E011
 +S11302C06CED70E040ED57E05DD584E690E084D2BB
 +S11302D085E090E061E070E0F7D484E190E068EEBE
 +S11302E073E047D482E090E06AE770E04FEF5FEF9D
 +S11302F024E630E008EE13E09CD1B1D510E088E7A5
 +S113030060E070E046E950E021E030E05ED388E749
 +S113031061E070E046E950E021E030E056D389E73F
 +S113032060E070E046E950E021E030E04ED389E738
 +S113033061E070E046E950E021E030E046D38AE72E
 +S113034060E070E046E950E021E030E03ED38AE727
 +S113035061E070E046E950E021E030E036D31F5F11
 +S11303601A3069F620E077CF75D60895089778F4A7
 +S113037077FD0DC06830710554F457FD08C090E056
 +S1130380483051050CF091E081E0982701C090E0DD
 +S1130390892F0895FF920F931F93CF93DF93F82E25
 +S11303A08B01EA01E3DF8823A9F0FE0193E0EE0F5D
 +S11303B0FF1F9A95E1F7E00FF11FEC59FF4F2081E1
 +S11303C081E090E002C0880F991FFA94E2F78095CB
 +S11303D082238083DF91CF911F910F91FF90089525
 +S11303E0FF920F931F93CF93DF93F82E8B01EA01B3
 +S11303F0BDDF8823A1F0FE0133E0EE0FFF1F3A9525
 +S1130400E1F7E00FF11FEC59FF4F208181E090E00C
 +S113041002C0880F991FFA94E2F7282B2083DF91FA
 +S1130420CF911F910F91FF900895FF920F931F9307
 +S1130430CF93DF93F82E8B01EA0198DF882389F0AC
 +S113044043E0CC0FDD1F4A95E1F7C00FD11FCC5913
 +S1130450DF4F888190E002C095958795FA94E2F782
 +S11304608170DF91CF911F910F91FF9008952130FA
 +S1130470310511F4B5DF08958DDF089540E050E0B3
 +S113048010C0FB01E20FF31FEC59FF4F80832F5F75
 +S11304903F4F28303105A9F74F5F5F4F4830510572
 +S11304A049F020E030E0BA01E3E0660F771FEA95F7
 +S11304B0E1F7E7CF08950BC020E000000000000042
 +S11304C00000000000002F5F2A35B9F7019700975C
 +S11304D099F708952F923F924F925F926F927F9275
 +S11304E09F92AF92BF92CF92DF92EF92FF920F93BF
 +S11304F01F93CF93DF93982E5B01CC24DD2447E038
 +S1130500242E312C8FEFA8168FEFB80611F4760144
 +S113051003C07101EC18FD0800E010E02701089405
 +S11305204108510837010894611C711C36C08FEFD3
 +S1130530A8168FEFB80611F4C30101C0C201AC01C3
 +S11305408AE7981641F4C801BE016FDF282FC8015D
 +S1130550BE01A70117C089E7981649F4C801BA017A
 +S1130560AE0163DF282FC801B701AE010BC088E7D5
 +S1130570981651F4CA01BE01A80157DF282FC701FC
 +S1130580BE01A80130E073DF2196C830D10579F6A9
 +S11305900F5F1F4F0830110519F0C0E0D0E0C7CF3E
 +S11305A00894C11CD11C88E0C816D10409F0AACF54
 +S11305B08FEFA8168FEFB80619F0EE24FF2403C0BE
 +S11305C037E0E32EF12C00E010E01EC08AE7981615
 +S11305D021F4C801BE01A7010DC089E7981621F4D2
 +S11305E0C801B701AE0106C088E7981621F4C70117
 +S11305F0BE01A801CFDE2196C830D10539F70F5FBF
 +S11306001F4F0830110519F0C0E0D0E0DFCFDF91B3
 +S1130610CF911F910F91FF90EF90DF90CF90BF90FB
 +S1130620AF909F907F906F905F904F903F902F90EE
 +S113063008952F923F924F925F926F927F928F9282
 +S11306409F92AF92BF92CF92DF92EF92FF920F935D
 +S11306501F93DF93CF93CDB7DEB72E970FB6F894E1
 +S1130660DEBF0FBECDBF9A8389837C836B835E8399
 +S11306704D8338872F831A8709874F5F5F4F21F493
 +S113068097E0292E312C02C02224332489E0682EDD
 +S1130690712C89819A81681A790A66DEB30132D491
 +S11306A06C0162DEB3012ED47C014424552475C050
 +S11306B05BDE8C0159DE9C01C80163E070E022D44A
 +S11306C001978C0D9D1D9E878D87181619061CF4A5
 +S11306D08615970514F0DE86CD86C90163E070E0C7
 +S11306E011D48C01015010400E0D1F1D101611065F
 +S11306F01CF4061517050CF087018B816D817E8132
 +S1130700E9DE8D849E84AA24BB2430C0EB81FC8165
 +S1130710EA37F10521F4C401B601A10115C08B81AA
 +S11307209C818937910521F4C401B101A6010CC053
 +S1130730EB81FC81E837F10541F44D855E854E0D72
 +S11307405F1DC1016B857C854BDE0894E11CF11CA7
 +S11307500894C11CD11C89819A81E816F906B4F267
 +S11307600894A11CB11C0894811C911CE981FA8194
 +S1130770AE16BF064CF46801EE24FF24C501800FB9
 +S1130780911F9C878B87E7CF89859A8594DE08948F
 +S1130790411C511CCD84DE847801EF81F8854E160E
 +S11307A05F060CF485CF2E960FB6F894DEBF0FBE0D
 +S11307B0CDBFCF91DF911F910F91FF90EF90DF900C
 +S11307C0CF90BF90AF909F908F907F906F905F90ED
 +S11307D04F903F902F900895AF92BF92CF92DF92A7
 +S11307E0EF92FF920F931F93CF93DF935C01CC247E
 +S11307F0DD242AC0B9DD64E070E084D3EC01EE248A
 +S1130800FF2415C0B1DD8C01AFDD9C01C80168E097
 +S113081070E078D3FC01C90168E070E073D3BC01D7
 +S1130820CF0147E050E0DCDD0894E11CF11CEC163C
 +S1130830FD0644F388EE93E03EDE8AE76FEF7FEF38
 +S113084049DE0894C11CD11CCA14DB049CF2DF915C
 +S1130850CF911F910F91FF90EF90DF90CF90BF90B9
 +S1130860AF9008957F928F929F92AF92BF92CF9252
 +S1130870DF92EF92FF920F931F93CF93DF93E82EB3
 +S1130880F62E742E6901C0E0D0E0F7E08F2E912C93
 +S1130890E8E0AE2EB12C87E0781661F484010C1BDD
 +S11308A01D0BA5014C1B5D0B8E2D90E06F2D70E090
 +S11308B071DD09C0AE01415050408E2D90E06F2D86
 +S11308C070E068DD8E018E2D90E06F2D70E0A80140
 +S11308D087DDC601F0DD2196C830D105E1F6DF9150
 +S11308E0CF911F910F91FF90EF90DF90CF90BF9029
 +S11308F0AF909F908F907F9008954F925F926F92E8
 +S11309007F929F92AF92BF92CF92DF92EF92FF922B
 +S11309100F931F93CF93DF93982E162F072F3A012F
 +S113092080E0ACDD212F302FC9016C01C0E0D0E0A4
 +S113093057E0452E512C34C06114710431F0F50197
 +S11309408081A201481B510904C0F7018081482F0E
 +S113095050E0FAE79F1619F4CE01B8010DC089E7FB
 +S1130960981621F4CE01BA01A80106C098E7991699
 +S113097021F4CA01B801AE0133DD0F5F1F4F0894A3
 +S1130980A11CB11C0894E11CF11C08301105A1F64E
 +S11309902196E8E0F0E0CE0EDF1EC830D10529F044
 +S11309A05601760100E010E0C7CFDF91CF911F918F
 +S11309B00F91FF90EF90DF90CF90BF90AF909F90FA
 +S11309C07F906F905F904F9008952F923F924F9237
 +S11309D05F926F927F928F929F92AF92BF92CF92CB
 +S11309E0DF92EF92FF920F931F93DF93CF93CDB7D4
 +S11309F0DEB7C158D0400FB6F894DEBF0FBECDBFEE
 +S1130A00CF57DF4F8883C158D0402B013A014901A9
 +S1130A1071E4A72EB12CAC0EBD1EF50161E8C62E03
 +S1130A20D12CCC0EDD1E1192EC15FD05E1F700E092
 +S1130A3010E01E010894211C311C81E088169104E9
 +S1130A40B9F412C091DC60E470E05CD2E1E4F0E05F
 +S1130A50EC0FFD1FE80FF91F8081882399F70F5FC2
 +S1130A601F4F91E0908316C0003411055CF312C04F
 +S1130A7082E08816910471F4003411055CF4E1E419
 +S1130A80F0E0EC0FFD1FE00FF11F80818F5F80838A
 +S1130A900F5F1F4FF501EE24FF249081892F8150B1
 +S1130AA0863010F49F5F90838081873019F4089416
 +S1130AB0E11CF11C3196EC15FD0579F7D101F50126
 +S1130AC080814114510419F097E0981B892F8C936D
 +S1130AD031961196EC15FD0599F7C301ECDCCF575F
 +S1130AE0DF4F8881C158D040B10140E050E005DFBC
 +S1130AF082B394E0892782BB80E4E816F10409F00C
 +S1130B009CCFCF57DF4F0FB6F894DEBF0FBECDBFDB
 +S1130B10CF91DF911F910F91FF90EF90DF90CF90D5
 +S1130B20BF90AF909F908F907F906F905F904F9009
 +S1130B303F902F900895AC01DC01FB0120E030E0F0
 +S1130B409C918081981710F49F5F9C939C91808165
 +S1130B50891710F491509C932F5F3F4F1196319653
 +S1130B602034310569F78AE7BA0140E050E0C5DE78
 +S1130B7008952F923F924F925F926F927F928F923D
 +S1130B809F92AF92BF92CF92DF92EF92FF920F9318
 +S1130B901F93DF93CF93CDB7DEB7C058D0400FB6C5
 +S1130BA0F894DEBF0FBECDBF2C017B0100E010E046
 +S1130BB05E010894A11CB11C24E0922E91E4C92E7C
 +S1130BC0D12CCC0EDD1EF501E00FF11F9082CCDBA1
 +S1130BD0F601E00FF11F68E070E094D180830F5FAD
 +S1130BE01F4F0034110579F700E010E081E4A82ECE
 +S1130BF0B12CAC0EBD1E6E010894C11CD11C370172
 +S1130C00C601B5014AE797DFC30155DC0F5F1F4FEB
 +S1130C1008301105A9F75701AA0CBB1CAA0CBB1C70
 +S1130C20CC24DD24A1E48A2E912C8C0E9D1E1E0161
 +S1130C300894211C311C2BC000E010E0C101B40158
 +S1130C404AE779DFC30137DC0F5F1F4F0830110516
 +S1130C50A9F7C50130DCEE24FF2486DB8C0184DB9C
 +S1130C609C01C80160E470E04DD1F401E80FF91F64
 +S1130C70C90168E070E046D180830894E11CF11C4E
 +S1130C8080E2E816F10449F70894C11CD11CC4148D
 +S1130C90D50494F2C058DF4F0FB6F894DEBF0FBEF0
 +S1130CA0CDBFCF91DF911F910F91FF90EF90DF9017
 +S1130CB0CF90BF90AF909F908F907F906F905F90F8
 +S1130CC04F903F902F9008958F929F92AF92BF9232
 +S1130CD0CF92DF92EF92FF920F931F93CF93DF9304
 +S1130CE04C018B016130710511F480E001C08FEF7C
 +S1130CF0C5DBC0E0D0E038DB68E070E003D1B82E9B
 +S1130D00A92E32DB68E070E0FDD0D82EC92E2CDB92
 +S1130D1068E070E0F7D0F82EE92E0115110551F4C2
 +S1130D208B2D9A2D6D2D7C2D4F2D5E2D7EDB8130EC
 +S1130D3011F70CC001301105F1F68B2D9A2D6D2D94
 +S1130D407C2D4F2D5E2D71DB8823A9F68B2D9A2DDA
 +S1130D506D2D7C2D4F2D5E2D980189DBC401ABDBFD
 +S1130D60219681E0CF3FD80731F6DF91CF911F91D3
 +S1130D700F91FF90EF90DF90CF90BF90AF909F9036
 +S1130D808F9008956F927F928F929F92AF92BF92AD
 +S1130D90DF92EF92FF920F931F93CF93DF933C0167
 +S1130DA05B014A0180E06ADB00E010E01CC0DCDA91
 +S1130DB062E070E0A7D0AC0133E0440F551F3A95D0
 +S1130DC0E1F7481B590BC801BE010ADB2196C83064
 +S1130DD0D10569F70F5F1F4F0830110521F4DD2499
 +S1130DE0EE24FF2429C0C0E0D0E0E1CFBDDAEC015D
 +S1130DF0BBDA68E070E086D0082F8E15E1F0CE01F2
 +S1130E0068E070E07FD0182F8D15A9F090E0602F76
 +S1130E1070E040E050E009DB882321F0812F602F4F
 +S1130E2040E003C0812F602F47E095011BDDC40122
 +S1130E3042DBD12EE02EF3948F2D90E0861597059A
 +S1130E40ACF2DF91CF911F910F91FF90EF90DF9063
 +S1130E50BF90AF909F908F907F906F900895EF9286
 +S1130E60FF920F931F93CF93DF9380E007DB00E0A3
 +S1130E7010E04FEEE42E42E0F42E3AC080E0FEDAB9
 +S1130E80CE0119DB8FEFFADA84E690E014DBCE01B1
 +S1130E9066EF7FEF37D088EE93E034D06F50704028
 +S1130EA0C60FD71F1C161D064CF388EE93E003DB18
 +S1130EB0CEEED2E080E0E2DAC7018C1B9D0BFBDAB8
 +S1130EC08FEFDCDA84E690E0F6DACE0166EF7FEFAE
 +S1130ED019D088EE93E016D06F507040C60FD71F1C
 +S1130EE01C161D063CF30F5F1F4F0230110519F04D
 +S1130EF0CEEED2E0C3CFDF91CF911F910F91FF903F
 +S1130F00EF90089597FB092E07260AD077FD04D0A9
 +S1130F100CD006D000201AF4709561957F4F089587
 +S1130F20F6F7909581959F4F0895AA1BBB1B51E13D
 +S1130F3007C0AA1FBB1FA617B70710F0A61BB70B45
 +S1130F40881F991F5A95A9F780959095BC01CD01EA
 +S1130F5008952F923F924F925F926F927F928F9259
 +S1130F609F92AF92BF92CF92DF92EF92FF920F9334
 +S1130F701F93CF93DF93CDB7DEB7CA1BDB0B0FB63E
 +S1130F80F894DEBF0FBECDBF09942A8839884888FB
 +S1130F905F846E847D848C849B84AA84B984C88491
 +S1130FA0DF80EE80FD800C811B81AA81B981CE0F88
 +S1130FB0D11D0FB6F894DEBF0FBECDBFED0108956D
 +S1130FC0A0E0B0E0E5EEF7E0CCCFEC01A880B9807A
 +S1130FD0CA80DB80A114B104C104D10441F484E2C9
 +S1130FE0A82E89EDB82E8BE5C82E87E0D82EC60131
 +S1130FF0B5012DE133EF41E050E05AD027EA31E466
 +S113100040E050E036D07B018C01C601B5012DE1F2
 +S113101033EF41E050E04CD0CA01B9012CEE34EF7B
 +S11310204FEF5FEF26D06E0D7F1D801F911F97FF3E
 +S113103004C06150704080409048688379838A83FB
 +S11310409B839B013F77C901CDB7DEB7EAE0A5CF0B
 +S1131050B7DF089580E690E0B3DF0895A0E0B0E044
 +S11310608093600090936100A0936200B09363004A
 +S11310700895629FD001739FF001829FE00DF11DDE
 +S1131080649FE00DF11D929FF00D839FF00D749FFE
 +S1131090F00D659FF00D9927729FB00DE11DF91FAA
 +S11310A0639FB00DE11DF91FBD01CF011124089507
 +S11310B097FB092E05260ED057FD04D014D00AD074
 +S11310C0001C38F450954095309521953F4F4F4F73
 +S11310D05F4F0895F6F790958095709561957F4FD1
 +S11310E08F4F9F4F0895A1E21A2EAA1BBB1BFD012F
 +S11310F00DC0AA1FBB1FEE1FFF1FA217B307E407F3
 +S1131100F50720F0A21BB30BE40BF50B661F771F4A
 +S1131110881F991F1A9469F760957095809590952A
 +S11111209B01AC01BD01CF010895F894FFCFEF
 +S107112E01000000B8
 +S9030000FC
 diff --git a/avr-test/ledcube_eeprom.bin b/avr-test/ledcube_eeprom.bin new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/avr-test/ledcube_eeprom.bin diff --git a/avr-test/ledcube_eeprom.hex b/avr-test/ledcube_eeprom.hex new file mode 100644 index 0000000..1996e8f --- /dev/null +++ b/avr-test/ledcube_eeprom.hex @@ -0,0 +1 @@ +:00000001FF
 diff --git a/avr-test/ledcube_eeprom.srec b/avr-test/ledcube_eeprom.srec new file mode 100755 index 0000000..e2abc36 --- /dev/null +++ b/avr-test/ledcube_eeprom.srec @@ -0,0 +1,2 @@ +S01600006C6564637562655F656570726F6D2E7372656353
 +S9030000FC
 diff --git a/avr-test/mc b/avr-test/mc new file mode 120000 index 0000000..a573d03 --- /dev/null +++ b/avr-test/mc @@ -0,0 +1 @@ +/home/calendros/downloads/shelve/datasheet/2011/mc
\ No newline at end of file diff --git a/avr-test/src/cube.h b/avr-test/src/cube.h new file mode 100644 index 0000000..01f19da --- /dev/null +++ b/avr-test/src/cube.h @@ -0,0 +1,32 @@ +#ifndef CUBE_H +#define CUBE_H + +// Some of the functions are created to be portable +// These functions will work on cubes of different sizes by +// changing this constant +#define CUBE_SIZE 8 +#define CUBE_BYTES 64 + +// If you change this to anything greather than 8, you also have +// change how the cube buffer works and probably all the functions +// in draw.c + +// Cube buffer +// Data from this array is loaded onto the cube for each duty cycle +extern volatile unsigned char cube[CUBE_SIZE][CUBE_SIZE]; + +// Framebuffer +// Animations that take a lot of time to compute are temporarily +// stored to this array, then loaded into cube[8][8] when the image +// is ready to be displayed +extern volatile unsigned char fb[CUBE_SIZE][CUBE_SIZE]; + +// Some effects can render on different axis +// for example send pixels along an axis +// for better readability, we use the following predefined constants +#define AXIS_X 0x78 +#define AXIS_Y 0x79 +#define AXIS_Z 0x7a + +#endif + diff --git a/avr-test/src/draw.cpp b/avr-test/src/draw.cpp new file mode 100644 index 0000000..faaa346 --- /dev/null +++ b/avr-test/src/draw.cpp @@ -0,0 +1,559 @@ +#include "draw.h" +#include "string.h" + +// Set a single voxel to ON +void setvoxel(int x, int y, int z) +{ +	if (inrange(x,y,z)) +		cube[z][y] |= (1 << x); +} + +// Set a single voxel in the temporary cube buffer to ON +void tmpsetvoxel(int x, int y, int z) +{ +	if (inrange(x,y,z)) +		fb[z][y] |= (1 << x); +} + +// Set a single voxel to OFF +void clrvoxel(int x, int y, int z) +{ +	if (inrange(x,y,z)) +		cube[z][y] &= ~(1 << x); +} + +// Set a single voxel to OFF +void tmpclrvoxel(int x, int y, int z) +{ +	if (inrange(x,y,z)) +		fb[z][y] &= ~(1 << x); +} + +// This function validates that we are drawing inside the cube. +unsigned char inrange(int x, int y, int z) +{ +	if (x >= 0 && x < CUBE_SIZE && y >= 0 && y < CUBE_SIZE && z >= 0 && z < CUBE_SIZE) +	{ +		return 1; +	} else +	{ +		// One of the coordinates was outside the cube. +		return 0; +	} +} + +// Get the current status of a voxel +unsigned char getvoxel(int x, int y, int z) +{ +	if (inrange(x,y,z)) +	{ +		if (cube[z][y] & (1 << x)) +		{ +			return 1; +		} else +		{ +			return 0; +		} +	} else +	{ +		return 0; +	} +} + +// In some effect we want to just take bool and write it to a voxel +// this function calls the apropriate voxel manipulation function. +void altervoxel(int x, int y, int z, int state) +{ +	if (state == 1) +	{ +		setvoxel(x,y,z); +	} else +	{ +		clrvoxel(x,y,z); +	} +} + +// Flip the state of a voxel. +// If the voxel is 1, its turned into a 0, and vice versa. +void flpvoxel(int x, int y, int z) +{ +	if (inrange(x, y, z)) +		cube[z][y] ^= (1 << x); +} + +// Makes sure x1 is alwas smaller than x2 +// This is usefull for functions that uses for loops, +// to avoid infinite loops +void argorder(int ix1, int ix2, int *ox1, int *ox2) +{ +	if (ix1>ix2) +	{ +		int tmp; +		tmp = ix1; +		ix1= ix2; +		ix2 = tmp; +	} +	*ox1 = ix1; +	*ox2 = ix2; +} + +// Sets all voxels along a X/Y plane at a given point +// on axis Z +void setplane_z (int z) +{ +	int i; +	if (z>=0 && z<CUBE_SIZE) +	{ +		for (i=0;i<CUBE_SIZE;i++) +			cube[z][i] = 0xff; +	} +} + +// Clears voxels in the same manner as above +void clrplane_z (int z) +{ +	int i; +	if (z>=0 && z<CUBE_SIZE) +	{ +		for (i=0;i<CUBE_SIZE;i++) +			cube[z][i] = 0x00; +	} +} + +void setplane_x (int x) +{ +	int z; +	int y; +	if (x>=0 && x<CUBE_SIZE) +	{ +		for (z=0;z<CUBE_SIZE;z++) +		{ +			for (y=0;y<CUBE_SIZE;y++) +			{ +				cube[z][y] |= (1 << x); +			} +		} +	} +} + +void clrplane_x (int x) +{ +	int z; +	int y; +	if (x>=0 && x<CUBE_SIZE) +	{ +		for (z=0;z<CUBE_SIZE;z++) +		{ +			for (y=0;y<CUBE_SIZE;y++) +			{ +				cube[z][y] &= ~(1 << x); +			} +		} +	} +} + +void setplane_y (int y) +{ +	int z; +	if (y>=0 && y<CUBE_SIZE) +	{ +		for (z=0;z<CUBE_SIZE;z++) +			cube[z][y] = 0xff; +	} +} + +void clrplane_y (int y) +{ +	int z; +	if (y>=0 && y<CUBE_SIZE) +	{ +		for (z=0;z<CUBE_SIZE;z++) +			cube[z][y] = 0x00; +	} +} + +void setplane (char axis, unsigned char i) +{ +    switch (axis) +    { +        case AXIS_X: +            setplane_x(i); +            break; + +       case AXIS_Y: +            setplane_y(i); +            break; + +       case AXIS_Z: +            setplane_z(i); +            break; +    } +} + +void clrplane (char axis, unsigned char i) +{ +    switch (axis) +    { +        case AXIS_X: +            clrplane_x(i); +            break; + +       case AXIS_Y: +            clrplane_y(i); +            break; + +       case AXIS_Z: +            clrplane_z(i); +            break; +    } +} + +// Fill a value into all 64 byts of the cube buffer +// Mostly used for clearing. fill(0x00) +// or setting all on. fill(0xff) +void fill (unsigned char pattern) +{ +	int z; +	int y; +	for (z=0;z<CUBE_SIZE;z++) +	{ +		for (y=0;y<CUBE_SIZE;y++) +		{ +			cube[z][y] = pattern; +		} +	} +} + +void tmpfill (unsigned char pattern) +{ +	int z; +	int y; +	for (z=0;z<CUBE_SIZE;z++) +	{ +		for (y=0;y<CUBE_SIZE;y++) +		{ +			fb[z][y] = pattern; +		} +	} +} + +// Draw a box with all walls drawn and all voxels inside set +void box_filled(int x1, int y1, int z1, int x2, int y2, int z2) +{ +	int iy; +	int iz; + +	argorder(x1, x2, &x1, &x2); +	argorder(y1, y2, &y1, &y2); +	argorder(z1, z2, &z1, &z2); + +	for (iz=z1;iz<=z2;iz++) +	{ +		for (iy=y1;iy<=y2;iy++) +		{ +			cube[iz][iy] |= byteline(x1,x2); +		} +	} + +} + +// Darw a hollow box with side walls. +void box_walls(int x1, int y1, int z1, int x2, int y2, int z2) +{ +	int iy; +	int iz; + +	argorder(x1, x2, &x1, &x2); +	argorder(y1, y2, &y1, &y2); +	argorder(z1, z2, &z1, &z2); + +	for (iz=z1;iz<=z2;iz++) +	{ +		for (iy=y1;iy<=y2;iy++) +		{ +			if (iy == y1 || iy == y2 || iz == z1 || iz == z2) +			{ +				cube[iz][iy] = byteline(x1,x2); +			} else +			{ +				cube[iz][iy] |= ((0x01 << x1) | (0x01 << x2)); +			} +		} +	} + +} + +// Draw a wireframe box. This only draws the corners and edges, +// no walls. +void box_wireframe(int x1, int y1, int z1, int x2, int y2, int z2) +{ +	int iy; +	int iz; + +	argorder(x1, x2, &x1, &x2); +	argorder(y1, y2, &y1, &y2); +	argorder(z1, z2, &z1, &z2); + +	// Lines along X axis +	cube[z1][y1] = byteline(x1,x2); +	cube[z1][y2] = byteline(x1,x2); +	cube[z2][y1] = byteline(x1,x2); +	cube[z2][y2] = byteline(x1,x2); + +	// Lines along Y axis +	for (iy=y1;iy<=y2;iy++) +	{ +		setvoxel(x1,iy,z1); +		setvoxel(x1,iy,z2); +		setvoxel(x2,iy,z1); +		setvoxel(x2,iy,z2); +	} + +	// Lines along Z axis +	for (iz=z1;iz<=z2;iz++) +	{ +		setvoxel(x1,y1,iz); +		setvoxel(x1,y2,iz); +		setvoxel(x2,y1,iz); +		setvoxel(x2,y2,iz); +	} + +} + +// Returns a byte with a row of 1's drawn in it. +// byteline(2,5) gives 0b00111100 +char byteline (int start, int end) +{ +	return ((0xff<<start) & ~(0xff<<(end+1))); +} + +// Flips a byte 180 degrees. +// MSB becomes LSB, LSB becomes MSB. +char flipbyte (char byte) +{ +	char flop = 0x00; + +	flop = (flop & 0b11111110) | (0b00000001 & (byte >> 7)); +	flop = (flop & 0b11111101) | (0b00000010 & (byte >> 5)); +	flop = (flop & 0b11111011) | (0b00000100 & (byte >> 3)); +	flop = (flop & 0b11110111) | (0b00001000 & (byte >> 1)); +	flop = (flop & 0b11101111) | (0b00010000 & (byte << 1)); +	flop = (flop & 0b11011111) | (0b00100000 & (byte << 3)); +	flop = (flop & 0b10111111) | (0b01000000 & (byte << 5)); +	flop = (flop & 0b01111111) | (0b10000000 & (byte << 7)); +	return flop; +} + +// Draw a line between any coordinates in 3d space. +// Uses integer values for input, so dont expect smooth animations. +void line(int x1, int y1, int z1, int x2, int y2, int z2) +{ +	float xy;	// how many voxels do we move on the y axis for each step on the x axis +	float xz;	// how many voxels do we move on the y axis for each step on the x axis +	unsigned char x,y,z; +	unsigned char lasty,lastz; + +	// We always want to draw the line from x=0 to x=7. +	// If x1 is bigget than x2, we need to flip all the values. +	if (x1>x2) +	{ +		int tmp; +		tmp = x2; x2 = x1; x1 = tmp; +		tmp = y2; y2 = y1; y1 = tmp; +		tmp = z2; z2 = z1; z1 = tmp; +	} + + +	if (y1>y2) +	{ +		xy = (float)(y1-y2)/(float)(x2-x1); +		lasty = y2; +	} else +	{ +		xy = (float)(y2-y1)/(float)(x2-x1); +		lasty = y1; +	} + +	if (z1>z2) +	{ +		xz = (float)(z1-z2)/(float)(x2-x1); +		lastz = z2; +	} else +	{ +		xz = (float)(z2-z1)/(float)(x2-x1); +		lastz = z1; +	} + + + +	// For each step of x, y increments by: +	for (x = x1; x<=x2;x++) +	{ +		y = (xy*(x-x1))+y1; +		z = (xz*(x-x1))+z1; +		setvoxel(x,y,z); +	} + +} + +// Delay loop. +// This is not calibrated to milliseconds, +// but we had allready made to many effects using this +// calibration when we figured it might be a good idea +// to calibrate it. +void delay_ms(uint16_t x) +{ +  uint8_t y, z; +  for ( ; x > 0 ; x--){ +    for ( y = 0 ; y < 90 ; y++){ +      for ( z = 0 ; z < 6 ; z++){ +        asm volatile ("nop"); +      } +    } +  } +} + +// Copies the contents of fb (temp cube buffer) into the rendering buffer +void tmp2cube (void) +{ +    memcpy((void*)cube, (const void*)fb, 64); // copy the current cube into a buffer. +} + +// Shift the entire contents of the cube along an axis +// This is great for effects where you want to draw something +// on one side of the cube and have it flow towards the other +// side. Like rain flowing down the Z axiz. +void shift (char axis, int direction) +{ +	int i, x ,y; +	int ii, iii; +	int state; + +	for (i = 0; i < CUBE_SIZE; i++) +	{ +		if (direction == -1) +		{ +			ii = i; +		} else +		{ +			ii = (7-i); +		} + + +		for (x = 0; x < CUBE_SIZE; x++) +		{ +			for (y = 0; y < CUBE_SIZE; y++) +			{ +				if (direction == -1) +				{ +					iii = ii+1; +				} else +				{ +					iii = ii-1; +				} + +				if (axis == AXIS_Z) +				{ +					state = getvoxel(x,y,iii); +					altervoxel(x,y,ii,state); +				} + +				if (axis == AXIS_Y) +				{ +					state = getvoxel(x,iii,y); +					altervoxel(x,ii,y,state); +				} + +				if (axis == AXIS_X) +				{ +					state = getvoxel(iii,y,x); +					altervoxel(ii,y,x,state); +				} +			} +		} +	} + +	if (direction == -1) +	{ +		i = 7; +	} else +	{ +		i = 0; +	} + +	for (x = 0; x < CUBE_SIZE; x++) +	{ +		for (y = 0; y < CUBE_SIZE; y++) +		{ +			if (axis == AXIS_Z) +				clrvoxel(x,y,i); + +			if (axis == AXIS_Y) +				clrvoxel(x,i,y); + +			if (axis == AXIS_X) +				clrvoxel(i,y,x); +		} +	} +} + +// Flip the cube 180 degrees along the y axis. +void mirror_y (void) +{ +    unsigned char buffer[CUBE_SIZE][CUBE_SIZE]; +    unsigned char x,y,z; + +    memcpy(buffer, (const void*)cube, CUBE_BYTES); // copy the current cube into a buffer. + +    fill(0x00); +    for (z=0; z<CUBE_SIZE; z++) +    { +        for (y=0; y<CUBE_SIZE; y++) +        { +            for (x=0; x<CUBE_SIZE; x++) +            { +                if (buffer[z][y] & (0x01 << x)) +                    setvoxel(x,CUBE_SIZE-1-y,z); +            } +        } +    } + +} + +// Flip the cube 180 degrees along the x axis +void mirror_x (void) +{ +    unsigned char buffer[CUBE_SIZE][CUBE_SIZE]; +    unsigned char y,z; + +    memcpy(buffer, (const void*)cube, CUBE_BYTES); // copy the current cube into a buffer. + +    fill(0x00); + +    for (z=0; z<CUBE_SIZE; z++) +    { +        for (y=0; y<CUBE_SIZE; y++) +        { +            // This will break with different buffer sizes.. +            cube[z][y] = flipbyte(buffer[z][y]); +        } +    } +} + +// flip the cube 180 degrees along the z axis +void mirror_z (void) +{ +    unsigned char buffer[CUBE_SIZE][CUBE_SIZE]; +    unsigned char z, y; + +    memcpy(buffer, (const void*)cube, CUBE_BYTES); // copy the current cube into a buffer. + +    for (y=0; y<CUBE_SIZE; y++) +    { +        for (z=0; z<CUBE_SIZE; z++) +        { +            cube[CUBE_SIZE-1-z][y] = buffer[z][y]; +        } +    } +} + diff --git a/avr-test/src/draw.h b/avr-test/src/draw.h new file mode 100644 index 0000000..abe93d2 --- /dev/null +++ b/avr-test/src/draw.h @@ -0,0 +1,71 @@ +#ifndef DRAW_H +#define DRAW_H + +#include <avr/io.h> +#include <avr/pgmspace.h> + +#include "cube.h" + +extern const unsigned char font[480]; + +// Red led on D2 +#define LED_RED 0x04 +// Green led D3 +#define LED_GREEN 0x08 +// Program led on D4 +#define LED_PGM 0x10; +// Leds connected to port D +#define LED_PORT PORTD +// Programming button on D5 +#define PGM_BTN 0x20 + +void delay_ms (uint16_t x); + + +void setvoxel(int x, int y, int z); +void clrvoxel(int x, int y, int z); +void tmpsetvoxel(int x, int y, int z); +void tmpclrvoxel(int x, int y, int z); + +unsigned char inrange(int x, int y, int z); +unsigned char getvoxel(int x, int y, int z); +void flpvoxel(int x, int y, int z); + +void altervoxel(int x, int y, int z, int state); +void setplane_z(int z); +void clrplane_z(int z); +void setplane_x(int x); +void clrplane_x(int x); +void setplane_y(int y); +void clrplane_y(int y); + +void setplane (char axis, unsigned char i); +void clrplane (char axis, unsigned char i); + +void setline_z(int x, int y, int z1, int z2); +void setline_x(int z, int y, int x1, int x2); +void setline_y(int z, int x, int y1, int y2); +void clrline_z(int x, int y, int z1, int z2); +void clrline_x(int z, int y, int x1, int x2); +void clrline_y(int z, int x, int y1, int y2); +void fill(unsigned char pattern); +void tmpfill(unsigned char pattern); +void line(int x1, int y1, int z1, int x2, int y2, int z2); +void drawchar(char chr, int offset, int layer); +char flipbyte(char byte); +void charfly (char chr, int direction, char axis, int mode, uint16_t delay); +void strfly (char * str, int direction, char axis, int mode, uint16_t delay, uint16_t pause); +void box_filled(int x1, int y1, int z1, int x2, int y2, int z2); +void box_walls(int x1, int y1, int z1, int x2, int y2, int z2); +void box_wireframe(int x1, int y1, int z1, int x2, int y2, int z2); +char byteline (int start, int end); + +void tmp2cube (void); +void shift (char axis, int direction); + +void mirror_x(void); +void mirror_y(void); +void mirror_z(void); + +#endif + diff --git a/avr-test/src/effect.cpp b/avr-test/src/effect.cpp new file mode 100644 index 0000000..1f47155 --- /dev/null +++ b/avr-test/src/effect.cpp @@ -0,0 +1,1021 @@ +#include "effect.h" +#include "draw.h" +#include <math.h> +#include <avr/interrupt.h> + +//char myrand(); +int myrand(); + +void effect_test (void) +{ + +	int x,y,i; + +	for (i=0;i<1000;i++) +	{ +		x = sin(i/8)*2+3.5; +		y = cos(i/8)*2+3.5; + +		setvoxel(x,y,1); +		setvoxel(x,y,1); +		delay_ms(1000); +		fill(0x00); +	} + +} + + +// Draw a plane on one axis and send it back and forth once. +void effect_planboing (int plane, int speed) +{ +	int i; +	for (i=0;i<8;i++) +	{ +		fill(0x00); +        setplane(plane, i); +		delay_ms(speed); +	} + +	for (i=7;i>=0;i--) +	{ +		fill(0x00); +        setplane(plane,i); +		delay_ms(speed); +	} +} + +void effect_blinky2() +{ +	int i,r; +	fill(0x00); + +	for (r=0;r<2;r++) +	{ +		i = 750; +		while (i>0) +		{ +			fill(0x00); +			delay_ms(i); + +			fill(0xff); +			delay_ms(100); + +			i = i - (15+(1000/(i/10))); +		} + +		delay_ms(1000); + +		i = 750; +		while (i>0) +		{ +			fill(0x00); +			delay_ms(751-i); + +			fill(0xff); +			delay_ms(100); + +			i = i - (15+(1000/(i/10))); +		} +	} + +} + +void effect_box_shrink_grow (int iterations, int rot, int flip, uint16_t delay) +{ +	int x, i, xyz; +	for (x=0;x<iterations;x++) +	{ +		for (i=0;i<16;i++) +		{ +            xyz = 7-i; // This reverses counter i between 0 and 7. +            if (i > 7) +                xyz = i-8; // at i > 7, i 8-15 becomes xyz 0-7. + +            fill(0x00); delay_ms(1); +            cli(); // disable interrupts while the cube is being rotated +			box_wireframe(0,0,0,xyz,xyz,xyz); + +            if (flip > 0) // upside-down +                mirror_z(); + +            if (rot == 1 || rot == 3) +                mirror_y(); + +            if (rot == 2 || rot == 3) +                mirror_x(); + +            sei(); // enable interrupts +			delay_ms(delay); +	        fill(0x00); +        } +    } +} + +// Creates a wireframe box that shrinks or grows out from the center of the cube. +void effect_box_woopwoop (int delay, int grow) +{ +	int i,ii; + +	fill(0x00); +	for (i=0;i<4;i++) +	{ +        ii = i; +        if (grow > 0) +            ii = 3-i; + +		box_wireframe(4+ii,4+ii,4+ii,3-ii,3-ii,3-ii); +		delay_ms(delay); +		fill(0x00); +	} +} + + +// Send a voxel flying from one side of the cube to the other +// If its at the bottom, send it to the top.. +void sendvoxel_z (unsigned char x, unsigned char y, unsigned char z, int delay) +{ +	int i, ii; +	for (i=0; i<8; i++) +	{ +		if (z == 7) +		{ +			ii = 7-i; +			clrvoxel(x,y,ii+1); +		} else +		{ +			ii = i; +			clrvoxel(x,y,ii-1); +		} +		setvoxel(x,y,ii); +		delay_ms(delay); +	} +} + +// Send all the voxels from one side of the cube to the other +// Start at z and send to the opposite side. +// Sends in random order. +void sendplane_rand_z (unsigned char z, int delay, int wait) +{ +	unsigned char loop = 16; +	unsigned char x, y; + +	fill(0x00); + +	setplane_z(z); + +	// Send voxels at random untill all 16 have crossed the cube. +	while(loop) +	{ +		x = myrand()%4; +		y = myrand()%4; +		if (getvoxel(x,y,z)) +		{ +			// Send the voxel flying +			sendvoxel_z(x,y,z,delay); +			delay_ms(wait); +			loop--; // one down, loop-- to go. when this hits 0, the loop exits. +		} +	} +} + +// For each coordinate along X and Y, a voxel is set either at level 0 or at level 7 +// for n iterations, a random voxel is sent to the opposite side of where it was. +void sendvoxels_rand_z (int iterations, int delay, int wait) +{ +	unsigned char x, y, last_x = 0, last_y = 0, i; + +	fill(0x00); + +	// Loop through all the X and Y coordinates +	for (x=0;x<8;x++) +	{ +		for (y=0;y<8;y++) +		{ +			// Then set a voxel either at the top or at the bottom +            // myrand()%2 returns either 0 or 1. multiplying by 7 gives either 0 or 7. +            setvoxel(x,y,((myrand()%2)*7)); +		} +	} + +	for (i=0;i<iterations;i++) +	{ +		// Pick a random x,y position +		x = myrand()%8; +		y = myrand()%8; +		// but not the sameone twice in a row +		if (y != last_y && x != last_x) +		{ +			// If the voxel at this x,y is at the bottom +			if (getvoxel(x,y,0)) +			{ +				// send it to the top +				sendvoxel_z(x,y,0,delay); +			} else +			{ +				// if its at the top, send it to the bottom +				sendvoxel_z(x,y,7,delay); +			} +			delay_ms(wait); + +			// Remember the last move +			last_y = y; +			last_x = x; +		} +	} + +} + + +// Big ugly function :p but it looks pretty +void boingboing(uint16_t iterations, int delay, unsigned char mode, unsigned char drawmode) +{ +	fill(0x00);		// Blank the cube + +	int x, y, z;		// Current coordinates for the point +	int dx, dy, dz;	// Direction of movement +	int lol, i;		// lol? +	unsigned char crash_x, crash_y, crash_z; + +	y = myrand()%8; +	x = myrand()%8; +	z = myrand()%8; + +	// Coordinate array for the snake. +	int snake[8][3]; +	for (i=0;i<8;i++) +	{ +		snake[i][0] = x; +		snake[i][1] = y; +		snake[i][2] = z; +	} + + +	dx = 1; +	dy = 1; +	dz = 1; + +	while(iterations) +	{ +		crash_x = 0; +		crash_y = 0; +		crash_z = 0; + + +		// Let's mix things up a little: +		if (myrand()%3 == 0) +		{ +			// Pick a random axis, and set the speed to a random number. +			lol = myrand()%3; +			if (lol == 0) +				dx = myrand()%3 - 1; + +			if (lol == 1) +				dy = myrand()%3 - 1; + +			if (lol == 2) +				dz = myrand()%3 - 1; +		} + +	    // The point has reached 0 on the x-axis and is trying to go to -1 +        // aka a crash +		if (dx == -1 && x == 0) +		{ +			crash_x = 0x01; +			if (myrand()%3 == 1) +			{ +				dx = 1; +			} else +			{ +				dx = 0; +			} +		} + +        // y axis 0 crash +		if (dy == -1 && y == 0) +		{ +			crash_y = 0x01; +			if (myrand()%3 == 1) +			{ +				dy = 1; +			} else +			{ +				dy = 0; +			} +		} + +        // z axis 0 crash +		if (dz == -1 && z == 0) +		{ +			crash_z = 0x01; +			if (myrand()%3 == 1) +			{ +				dz = 1; +			} else +			{ +				dz = 0; +			} +		} + +        // x axis 7 crash +		if (dx == 1 && x == 7) +		{ +			crash_x = 0x01; +			if (myrand()%3 == 1) +			{ +				dx = -1; +			} else +			{ +				dx = 0; +			} +		} + +        // y axis 7 crash +		if (dy == 1 && y == 7) +		{ +			crash_y = 0x01; +			if (myrand()%3 == 1) +			{ +				dy = -1; +			} else +			{ +				dy = 0; +			} +		} + +        // z azis 7 crash +		if (dz == 1 && z == 7) +		{ +			crash_z = 0x01; +			if (myrand()%3 == 1) +			{ +				dz = -1; +			} else +			{ +				dz = 0; +			} +		} + +		// mode bit 0 sets crash action enable +		if (mode | 0x01) +		{ +			if (crash_x) +			{ +				if (dy == 0) +				{ +					if (y == 7) +					{ +						dy = -1; +					} else if (y == 0) +					{ +						dy = +1; +					} else +					{ +						if (myrand()%2 == 0) +						{ +							dy = -1; +						} else +						{ +							dy = 1; +						} +					} +				} +				if (dz == 0) +				{ +					if (z == 7) +					{ +						dz = -1; +					} else if (z == 0) +					{ +						dz = 1; +					} else +					{ +						if (myrand()%2 == 0) +						{ +							dz = -1; +						} else +						{ +							dz = 1; +						} +					} +				} +			} + +			if (crash_y) +			{ +				if (dx == 0) +				{ +					if (x == 7) +					{ +						dx = -1; +					} else if (x == 0) +					{ +						dx = 1; +					} else +					{ +						if (myrand()%2 == 0) +						{ +							dx = -1; +						} else +						{ +							dx = 1; +						} +					} +				} +				if (dz == 0) +				{ +					if (z == 3) +					{ +						dz = -1; +					} else if (z == 0) +					{ +						dz = 1; +					} else +					{ +						if (myrand()%2 == 0) +						{ +							dz = -1; +						} else +						{ +							dz = 1; +						} +					} +				} +			} + +			if (crash_z) +			{ +				if (dy == 0) +				{ +					if (y == 7) +					{ +						dy = -1; +					} else if (y == 0) +					{ +						dy = 1; +					} else +					{ +						if (myrand()%2 == 0) +						{ +							dy = -1; +						} else +						{ +							dy = 1; +						} +					} +				} +				if (dx == 0) +				{ +					if (x == 7) +					{ +						dx = -1; +					} else if (x == 0) +					{ +						dx = 1; +					} else +					{ +						if (myrand()%2 == 0) +						{ +							dx = -1; +						} else +						{ +							dx = 1; +						} +					} +				} +			} +		} + +		// mode bit 1 sets corner avoid enable +		if (mode | 0x02) +		{ +			if (	// We are in one of 8 corner positions +				(x == 0 && y == 0 && z == 0) || +				(x == 0 && y == 0 && z == 7) || +				(x == 0 && y == 7 && z == 0) || +				(x == 0 && y == 7 && z == 7) || +				(x == 7 && y == 0 && z == 0) || +				(x == 7 && y == 0 && z == 7) || +				(x == 7 && y == 7 && z == 0) || +				(x == 7 && y == 7 && z == 7) +			) +			{ +				// At this point, the voxel would bounce +				// back and forth between this corner, +				// and the exact opposite corner +				// We don't want that! + +				// So we alter the trajectory a bit, +				// to avoid corner stickyness +				lol = myrand()%3; +				if (lol == 0) +					dx = 0; + +				if (lol == 1) +					dy = 0; + +				if (lol == 2) +					dz = 0; +			} +		} + +        // one last sanity check +        if (x == 0 && dx == -1) +            dx = 1; + +        if (y == 0 && dy == -1) +            dy = 1; + +        if (z == 0 && dz == -1) +            dz = 1; + +        if (x == 7 && dx == 1) +            dx = -1; + +        if (y == 7 && dy == 1) +            dy = -1; + +        if (z == 7 && dz == 1) +            dz = -1; + + +		// Finally, move the voxel. +		x = x + dx; +		y = y + dy; +		z = z + dz; + +		if (drawmode == 0x01) // show one voxel at time +		{ +			setvoxel(x,y,z); +			delay_ms(delay); +			clrvoxel(x,y,z); +		} else if (drawmode == 0x02) // flip the voxel in question +		{ +			flpvoxel(x,y,z); +			delay_ms(delay); +		} if (drawmode == 0x03) // draw a snake +		{ +			for (i=7;i>=0;i--) +			{ +				snake[i][0] = snake[i-1][0]; +				snake[i][1] = snake[i-1][1]; +				snake[i][2] = snake[i-1][2]; +			} +			snake[0][0] = x; +			snake[0][1] = y; +			snake[0][2] = z; + +			for (i=0;i<8;i++) +			{ +				setvoxel(snake[i][0],snake[i][1],snake[i][2]); +			} +			delay_ms(delay); +			for (i=0;i<8;i++) +			{ +				clrvoxel(snake[i][0],snake[i][1],snake[i][2]); +			} +		} + + +		iterations--; +	} +} + +// Set or clear exactly 512 voxels in a random order. +void effect_random_filler (int delay, int state) +{ +	int x,y,z; +	int loop = 0; + + +	if (state == 1) +	{ +		fill(0x00); +	} else +	{ +		fill(0xff); +	} + +	while (loop<511) +	{ +		x = myrand()%8; +		y = myrand()%8; +		z = myrand()%8; + +		if ((state == 0 && getvoxel(x,y,z) == 0x01) || (state == 1 && getvoxel(x,y,z) == 0x00)) +		{ +			altervoxel(x,y,z,state); +			delay_ms(delay); +			loop++; +		} +	} +} + + +void effect_rain (int iterations) +{ +	int i, ii; +	int rnd_x; +	int rnd_y; +	int rnd_num; + +	for (ii=0;ii<iterations;ii++) +	{ +		rnd_num = myrand()%4; + +		for (i=0; i < rnd_num;i++) +		{ +			rnd_x = myrand()%8; +			rnd_y = myrand()%8; +			setvoxel(rnd_x,rnd_y,7); +		} + +		delay_ms(1000); +		shift(AXIS_Z,-1); +	} +} + +void effect_z_updown (int iterations, int delay) +{ +	unsigned char positions[64]; +	unsigned char destinations[64]; + +	int i,y,move; + +	for (i=0; i<64; i++) +	{ +		positions[i] = 4; +		destinations[i] = myrand()%8; +	} + +	for (i=0; i<8; i++) +	{ +		effect_z_updown_move(positions, destinations, AXIS_Z); +		delay_ms(delay); +	} + +	for (i=0;i<iterations;i++) +	{ +		for (move=0;move<8;move++) +		{ +			effect_z_updown_move(positions, destinations, AXIS_Z); +			delay_ms(delay); +		} + +		delay_ms(delay*4); + + +		for (y=0;y<32;y++) +		{ +				destinations[myrand()%64] = myrand()%8; +		} + +	} + +} + +void effect_z_updown_move (unsigned char positions[64], unsigned char destinations[64], char axis) +{ +	int px; +	for (px=0; px<64; px++) +	{ +		if (positions[px]<destinations[px]) +		{ +			positions[px]++; +		} +		if (positions[px]>destinations[px]) +		{ +			positions[px]--; +		} +	} + +	draw_positions_axis (AXIS_Z, positions,0); +} + +void effect_axis_updown_randsuspend (char axis, int delay, int sleep, int invert) +{ +	unsigned char positions[64]; +	unsigned char destinations[64]; + +	int i,px; + +    // Set 64 random positions +	for (i=0; i<64; i++) +	{ +		positions[i] = 0; // Set all starting positions to 0 +		destinations[i] = myrand()%8; +	} + +    // Loop 8 times to allow destination 7 to reach all the way +	for (i=0; i<8; i++) +	{ +        // For every iteration, move all position one step closer to their destination +		for (px=0; px<64; px++) +		{ +			if (positions[px]<destinations[px]) +			{ +				positions[px]++; +			} +		} +        // Draw the positions and take a nap +		draw_positions_axis (axis, positions,invert); +		delay_ms(delay); +	} + +    // Set all destinations to 7 (opposite from the side they started out) +	for (i=0; i<64; i++) +	{ +		destinations[i] = 7; +	} + +    // Suspend the positions in mid-air for a while +	delay_ms(sleep); + +    // Then do the same thing one more time +	for (i=0; i<8; i++) +	{ +		for (px=0; px<64; px++) +		{ +			if (positions[px]<destinations[px]) +			{ +				positions[px]++; +			} +			if (positions[px]>destinations[px]) +			{ +				positions[px]--; +			} +		} +		draw_positions_axis (axis, positions,invert); +		delay_ms(delay); +	} +} + +void draw_positions_axis (char axis, unsigned char positions[64], int invert) +{ +	int x, y, p; + +	fill(0x00); + +	for (x=0; x<8; x++) +	{ +		for (y=0; y<8; y++) +		{ +			if (invert) +			{ +				p = (7-positions[(x*8)+y]); +			} else +			{ +				p = positions[(x*8)+y]; +			} + +			if (axis == AXIS_Z) +				setvoxel(x,y,p); + +			if (axis == AXIS_Y) +				setvoxel(x,p,y); + +			if (axis == AXIS_X) +				setvoxel(p,y,x); +		} +	} + +} + + +void effect_boxside_randsend_parallel (char axis, int origin, int delay, int mode) +{ +	int i; +	int done; +	unsigned char cubepos[64]; +	unsigned char pos[64]; +	int notdone = 1; +	int notdone2 = 1; +	int sent = 0; + +	for (i=0;i<64;i++) +	{ +		pos[i] = 0; +	} + +	while (notdone) +	{ +		if (mode == 1) +		{ +			notdone2 = 1; +			while (notdone2 && sent<64) +			{ +				i = myrand()%64; +				if (pos[i] == 0) +				{ +					sent++; +					pos[i] += 1; +					notdone2 = 0; +				} +			} +		} else if (mode == 2) +		{ +			if (sent<64) +			{ +				pos[sent] += 1; +				sent++; +			} +		} + +		done = 0; +		for (i=0;i<64;i++) +		{ +			if (pos[i] > 0 && pos[i] <7) +			{ +				pos[i] += 1; +			} + +			if (pos[i] == 7) +				done++; +		} + +		if (done == 64) +			notdone = 0; + +		for (i=0;i<64;i++) +		{ +			if (origin == 0) +			{ +				cubepos[i] = pos[i]; +			} else +			{ +				cubepos[i] = (7-pos[i]); +			} +		} + + +		delay_ms(delay); +		draw_positions_axis(axis,cubepos,0); +		LED_PORT ^= LED_RED; +	} + +} + + + + +// Light all leds layer by layer, +// then unset layer by layer +void effect_loadbar(int delay) +{ +	fill(0x00); + +	int z,y; + +	for (z=0;z<8;z++) +	{ +		for (y=0;y<8;y++) +			cube[z][y] = 0xff; + +		delay_ms(delay); +	} + +	delay_ms(delay*3); + +	for (z=0;z<8;z++) +	{ +		for (y=0;y<8;y++) +			cube[z][y] = 0x00; + +		delay_ms(delay); +	} +} + + +// Set n number of voxels at random positions +void effect_random_sparkle_flash (int iterations, int voxels, int delay) +{ +	int i; +	int v; +	for (i = 0; i < iterations; i++) +	{ +		for (v=0;v<=voxels;v++) +			setvoxel(myrand()%8,myrand()%8,myrand()%8); + +		delay_ms(delay); +		fill(0x00); +	} +} + +// blink 1 random voxel, blink 2 random voxels..... blink 20 random voxels +// and back to 1 again. +void effect_random_sparkle (void) +{ +	int i; + +	for (i=1;i<20;i++) +	{ +		effect_random_sparkle_flash(5,i,200); +	} + +	for (i=20;i>=1;i--) +	{ +		effect_random_sparkle_flash(5,i,200); +	} + +} + +int effect_telcstairs_do(int x, int val, int delay) +{ +	int y,z; + +	for(y = 0, z = x; y <= z; y++, x--) +	{ +		if(x < CUBE_SIZE && y < CUBE_SIZE) +		{ +			cube[x][y] = val; +		} +	} +	delay_ms(delay); +	return z; +} + +void effect_telcstairs (int invert, int delay, int val) +{ +	int x; + +	if(invert) +	{ +		for(x = CUBE_SIZE*2; x >= 0; x--) +		{ +			x = effect_telcstairs_do(x,val,delay); +		} +	} +	else +	{ +		for(x = 0; x < CUBE_SIZE*2; x++) +		{ +			x = effect_telcstairs_do(x,val,delay); +		} +	} +} + +void effect_wormsqueeze (int size, int axis, int direction, int iterations, int delay) +{ +	int x, y, i,j,k, dx, dy; +	int cube_size; +	int origin = 0; + +	if (direction == -1) +		origin = 7; + +	cube_size = 8-(size-1); + +	x = myrand()%cube_size; +	y = myrand()%cube_size; + +	for (i=0; i<iterations; i++) +	{ +		dx = ((myrand()%3)-1); +		dy = ((myrand()%3)-1); + +		if ((x+dx) > 0 && (x+dx) < cube_size) +			x += dx; + +		if ((y+dy) > 0 && (y+dy) < cube_size) +			y += dy; + +		shift(axis, direction); + + +		for (j=0; j<size;j++) +		{ +			for (k=0; k<size;k++) +			{ +				if (axis == AXIS_Z) +					setvoxel(x+j,y+k,origin); + +				if (axis == AXIS_Y) +					setvoxel(x+j,origin,y+k); + +				if (axis == AXIS_X) +					setvoxel(origin,y+j,x+k); +			} +		} + +		delay_ms(delay); +	} +} + +void effect_pathmove (unsigned char *path, int length) +{ +	int i,z; +	unsigned char state; + +	for (i=(length-1);i>=1;i--) +	{ +		for (z=0;z<8;z++) +		{ + +			state = getvoxel(((path[(i-1)]>>4) & 0x0f), (path[(i-1)] & 0x0f), z); +			altervoxel(((path[i]>>4) & 0x0f), (path[i] & 0x0f), z, state); +		} +	} +	for (i=0;i<8;i++) +		clrvoxel(((path[0]>>4) & 0x0f), (path[0] & 0x0f),i); +} + + diff --git a/avr-test/src/effect.h b/avr-test/src/effect.h new file mode 100644 index 0000000..3398082 --- /dev/null +++ b/avr-test/src/effect.h @@ -0,0 +1,54 @@ +#ifndef EFFECT_H +#define EFFECT_H + +#include <avr/io.h> +#include <avr/pgmspace.h> +#include <stdlib.h> + +#include "cube.h" + +void effect_box_shrink_grow (int iterations, int rot, int flip, uint16_t delay); + +void effect_hollow_1 (int iterations, uint16_t delay); +void effect_hollow_2 (int iterations, int corner, uint16_t delay); + +void sendvoxel_z (unsigned char x, unsigned char y, unsigned char z, int delay); +void sendplane_rand_z (unsigned char z, int delay, int wait); +void sendvoxels_rand_z (int iterations, int delay, int wait); +void boingboing(uint16_t iterations, int delay, unsigned char mode, unsigned char drawmode); + +void effect_planboing (int plane, int speed); + +void effect_random_filler (int delay, int state); + +void effect_z_updown (int iterations, int delay); +void effect_rain(int iterations); +void effect_stringfly2(char * str); +void effect_blinky2(void); +void draw_positions_axis (char axis, unsigned char positions[64], int invert); +void effect_axis_updown_randsuspend (char axis, int delay, int sleep, int invert); + +void effect_random_sparkle_flash (int iterations, int voxels, int delay); +void effect_random_sparkle (void); + +void effect_box_woopwoop (int delay, int grow); +void effect_telcstairs (int invert, int delay, int val); +void effect_loadbar(int delay); + +void effect_boxside_randsend_parallel (char axis, int origin, int delay, int mode); +void effect_smileyspin (int count, int delay, char bitmap); +void effect_pathmove (unsigned char *path, int length); +void effect_rand_patharound (int iterations, int delay); +void effect_pathspiral (int iterations, int delay); +void effect_path_text (int delay, char *str); +void effect_path_bitmap (int delay, char bitmap, int iterations); +void effect_wormsqueeze (int size, int axis, int direction, int iterations, int delay); + +void effect_z_updown (int iterations, int delay); +void effect_z_updown_move (unsigned char positions[64], unsigned char destinations[64], char axis); + + + + +#endif + diff --git a/avr-test/src/fuses.txt b/avr-test/src/fuses.txt new file mode 100644 index 0000000..f24e5f5 --- /dev/null +++ b/avr-test/src/fuses.txt @@ -0,0 +1,6 @@ + +lfuse: 0b11101111 +hfuse: 0b11001001 + + + diff --git a/avr-test/src/lisence.txt b/avr-test/src/lisence.txt new file mode 100644 index 0000000..812dab5 --- /dev/null +++ b/avr-test/src/lisence.txt @@ -0,0 +1,5 @@ +Created by Christian Moen (christian@lynet.no) and Ståle Kristoffersen (staalekb@ifi.uio.no) 2011. + +Lisence:  http://creativecommons.org/licenses/by-nc-sa/3.0/ + +Happy hacking!! :D diff --git a/avr-test/src/main.c.old b/avr-test/src/main.c.old new file mode 100644 index 0000000..be31861 --- /dev/null +++ b/avr-test/src/main.c.old @@ -0,0 +1,285 @@ +/* + * Code to controll an 8x8x8 ledcube using avr + * http://www.instructables.com/id/Led-Cube-8x8x8/ + * See lisence.txt for lisence. + */ +#include "main.h" +#include "effect.h" +#include "launch_effect.h" +#include "draw.h" + +// Main loop +// the AVR enters this function at boot time +int main (void) +{ + +	// This function initiates IO ports, timers, interrupts and +    // serial communications +	ioinit(); +	 +    // This variable specifies which layer is currently being drawn by the +	// cube interrupt routine. We assign a value to it to make sure it's not >7. +	current_layer = 1;	 + +	int i; +	 +	// Boot wait +	// This function serves 3 purposes +	// 1) We delay starting up any interrupts, as drawing the cube causes a lot +	//    noise that can confuse the ISP programmer. +	// 2) Listen for button press. One button means go into rs232 mode, +	//    The other means go into autonomous mode and start doing stuff. +	// 3) Random seed. The bootwait function counts forever from 0 to 255. +	//    Whenever you press the button, this counter stops, and the number it +	//    stopped at is used as a random seed. This ensures true randomness at +	//    every boot. Without this (or some similar process) the cube would +	//    produce the same "random" sequence every time +	i = bootwait(); + +	// Enable interrupts +	// This starts the routine that draws the cube content +	sei(); + +	// Result for bootwait() is 2: +	// Go to rs232 mode. this function loops forever. +	if (i == 2) +	{ +		rs232(); +	} + +	// Result of bootwait() is something other than 2: +	// Do awesome effects. Loop forever. +	while (1) +	{ +		// Show the effects in a predefined order +		for (i=0; i<EFFECTS_TOTAL; i++) +			launch_effect(i); +		 +		// Show the effects in a random order. +		// Comment the two lines above and uncomment this +		// if you want the effects in a random order. +		//launch_effect(rand()%EFFECTS_TOTAL); +	} + +} + +/* + * Multiplexer/framebuffer routine + * This function is called by an interrupt generated by timer 2. + * Every time it runs, it does the following: + * 1) Disable the output for the multiplexer array. + * 2) Turn of all layers. + * 3) Load the current layer from the cube buffer onto the + *    multiplexer array. + * 4) Enable output from the multiplexer array. + * 5) Turn on the current layer. + * 6) Increment the current_layer variable, so the next layer is + *    drawn the next time this function runs. +*/ + +ISR(TIMER2_COMP_vect) +{ +	int i; + +	LAYER_SELECT = 0x00; // Turn all cathode layers off. (all transistors off) +	OE_PORT |= OE_MASK; // Set OE high, disabling all outputs on latch array + +	// Loop through all 8 bytes of data in the current layer +	// and latch it onto the cube. +	for (i = 0; i < 8; i++) +	{ +		// Set the data on the data-bus of the latch array. +		PORTA = cube[current_layer][i]; +		// Increment the latch address chip, 74HC138, to create +		// a rising edge (LOW to HIGH) on the current latch. +		LATCH_ADDR = (LATCH_ADDR & LATCH_MASK_INV) | (LATCH_MASK & (i+1)); +	} + +	OE_PORT &= ~OE_MASK; // Set OE low, enabling outputs on the latch array +	LAYER_SELECT = (0x01 << current_layer); // Transistor ON for current layer + +	// Increment the curren_layer counter so that the next layer is +	// drawn the next time this function runs. +	current_layer++; +	// We want to count from 0-7, so set it to 0 when it reaches 8. +	if (current_layer == 8) +		current_layer = 0; +} + + +void ioinit (void) +{ +	DDRA = 0xff;	// DATA bus output +	DDRB = 0xef;	// Button on B4 +	DDRC = 0xff;	// Layer select output +	DDRD = 0xdf;	// Button on D5 +	 +	 +	PORTA = 0x00; // Set data bus off +	PORTC = 0x00; // Set layer select off +	PORTB = 0x10; // Enable pull up on button. +	PORTD = 0x20; // Enable pull up on button. + + +	// Timer 2 +	// Frame buffer interrupt +	// 14745600/128/11 = 10472.72 interrupts per second +	// 10472.72/8 = 1309 frames per second +	OCR2 = 10; 	// interrupt at counter = 10 +    TCCR2 |= (1 << CS20) | (1 << CS22); // Prescaler = 128. +	TCCR2 |= (1 << WGM21); // CTC mode. Reset counter when OCR2 is reached. +	TCNT2 = 0x00;	// initial counter value = 0; +	TIMSK |= (1 << OCIE2); // Enable CTC interrupt + + + +    // Initiate RS232 +    // USART Baud rate is defined in MYUBRR +    UBRRH = MYUBRR >> 8; +    UBRRL = MYUBRR; +    // UCSRC - USART control register +    // bit 7-6      sync/ascyn 00 = async,  01 = sync +    // bit 5-4      parity 00 = disabled +    // bit 3        stop bits 0 = 1 bit  1 = 2 bits +    // bit 2-1      frame length 11 = 8 +    // bit 0        clock polarity = 0 +    UCSRC  = 0b10000110; +    // Enable RS232, tx and rx +    UCSRB = (1<<RXEN)|(1<<TXEN); +    UDR = 0x00; // send an empty byte to indicate powerup. + + +} + +// Boot wait function +// This function does 3 things: +// 1) Delay startup of interrupt. I've had some problems with in circuit +//    serial programming when the cube was running. I guess switching all +//    those LEDs on and off generates some noise. +// 2) Set a random random seed based on the delay between boot time and +//    the time you press a button. +// 3) Select mode of operation, autonomous or rs232 controlled. +unsigned int bootwait (void) +{ +	// All the LED_PORT... code blinks the red and green status LEDs. + +	unsigned int x = 0; +	LED_PORT |= LED_GREEN; +	while (1) +	{ +        x++; // increment x by one. +		srand(x); // use counter x as random seed +		 +		delay_ms(1000); +		LED_PORT &= ~LED_GREEN; // green off, red on +		LED_PORT |= LED_RED; +		 +		// Listen for button presses and return with the +		// apropriate number. +		if (!(PIND & RS232_BTN)) +			return 2; + +		if (!(PINB & MAIN_BTN)) +			return 1; +		 +		delay_ms(1000); +		LED_PORT &= ~LED_RED; // red off, green on +		LED_PORT |= LED_GREEN; +		 +		// Same as above. I do it twise because there are two delays +		// in this loop, used for the red and green led blinking.. +		if (!(PIND & RS232_BTN)) +			return 2; + +		if (!(PINB & MAIN_BTN)) +			return 1; +	} +} + +// Take input from a computer and load it onto the cube buffer +void rs232(void) +{ +	int tempval; +	int x = 0; +	int y = 0; +    int escape = 0; +	 +	while (1) +	{ +		// Switch state on red LED for debugging +		// Should switch state every time the code +		// is waiting for a byte to be received. +		LED_PORT ^= LED_RED; + +		// Wait until a byte has been received +		while ( !(UCSRA & (1<<RXC)) ); + +		// Load the received byte from rs232 into a buffer. +		tempval = UDR; + +		// Uncommet this to echo data back to the computer +		// for debugging purposes. +		//UDR = tempval; + +		// Every time the cube receives a 0xff byte, +		// it goes into sync escape mode. +		// if a 0x00 byte is then received, the x and y counters +		// are reset to 0. This way the x and y counters are +		// always the same on the computer and in the cube. +		// To send an 0xff byte, you have to send it twice! + +		// Go into sync escape mode +		if (tempval == 0xff) +		{ +			// Wait for the next byte +			 while ( !(UCSRA & (1<<RXC)) ); +			 // Get the next byte +			 tempval = UDR; + +			 // Sync signal is received. +			 // Reset x and y counters to 0. +			 if (tempval == 0x00) +			 { +				x = 0; +				y = 0; +                escape = 1; +			 } +			 // if no 0x00 byte is received, proceed with +			 // the byte we just received. +		} + +        if (escape == 0) +        { +		// Load data into the current position in the buffer +		fb[x][y] = tempval; + +    		// Check if we have reached the limits of the buffer array. +    		if (y == 7) +    		{ +    			if (x == 7) +    			{ +    				// All data is loaded. Reset both counters +    				y = 0; +    				x = 0; +                    // Copy the data onto the cube. +    				tmp2cube(); +    			} else +    			{ +    				// A layer is loaded, reset y and increment x. +    				x++; +    				y = 0; +    			} +    		} else +    		{ +    			// We are in the middle of loading a layer. increment y. +    			y++; +    		} +	 +	    } else +        { +            escape = 0; +        } +    } +} + + diff --git a/avr-test/src/main.cpp b/avr-test/src/main.cpp new file mode 100644 index 0000000..6f3d6ba --- /dev/null +++ b/avr-test/src/main.cpp @@ -0,0 +1,508 @@ +/* (c) copyright N.C. 2011 */ + +// ATMEL ATMEGA8 +// +//                        +-\/-+ +//          (RESET) PC6  1|    |28  PC5 (ADC5/SCL) +//            (RXD) PD0  2|    |27  PC4 (ADC4/SDA) +//            (TXD) PD1  3|    |26  PC3 (ADC3) +//           (INT0) PD2  4|    |25  PC2 (ADC2) +//           (INT1) PD3  5|    |24  PC1 (ADC1) +//         (XCK/T0) PD4  6|    |23  PC0 (ADC0) +//                  VCC  7|    |22  GND +//                  GND  8|    |21  AREF +//    (XTAL1/TOSC1) PB6  9|    |20  AVCC +//    (XTAL2/TOSC2) PB7 10|    |19  PB5 (SCK) +//             (T1) PD5 11|    |18  PB4 (MISO) +//           (AIN0) PD6 12|    |17  PB3 (MOSI/OC2) +//           (AIN1) PD7 13|    |16  PB2 (SS/OC1B) +//           (ICP1) PB0 14|    |15  PB1 (OC1A) +//                        +----+ + +extern "C" { +#include <avr/io.h> +#include <avr/interrupt.h> + +#include <stdlib.h> // rand +} + +//char myrand() +//{ +//    static short rand = 0; +//    rand=(rand*109+89)%251; +//    return rand; +//} + +int myrand() { return rand(); } + +#define CUBE_SIZE 8 + +//#define AXIS_X 1 +//#define AXIS_Y 2 +//#define AXIS_Z 3 + +volatile unsigned char cube[8][8]; +//volatile unsigned char current_layer = 0; +extern volatile unsigned char current_layer; +volatile bool in_wait = false; + +volatile unsigned char fb[CUBE_SIZE][CUBE_SIZE]; +/***************************************************************************** + * TIME MANAGEMENT + *****************************************************************************/ + +#define F_CPU 8000000UL + +#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) +#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() ) +#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() ) + +// the prescaler is set so that timer0 ticks every 64 clock cycles, and the +// the overflow handler is called every 256 ticks. +#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) + +// the whole number of milliseconds per timer0 overflow +#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) + +// the fractional number of milliseconds per timer0 overflow. we shift right +// by three to fit these numbers into a byte. (for the clock speeds we care +// about - 8 and 16 MHz - this doesn't lose precision.) +#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) +#define FRACT_MAX (1000 >> 3) + +//volatile uint32_t timer0_overflow_count = 0; +volatile uint32_t timer0_millis = 0; +//static uint8_t timer0_fract = 0; + + +ISR(TIMER0_OVF_vect) +{ +        // copy these to local variables so they can be stored in registers +        // (volatile variables must be read from memory on every access) +        uint32_t m = timer0_millis; +        //uint8_t f = timer0_fract; +        static uint8_t timer0_fract = 0; + +        m += MILLIS_INC; +        //f += FRACT_INC; +        timer0_fract += FRACT_INC; +        //if (f >= FRACT_MAX) { +        if (timer0_fract >= FRACT_MAX) { +                //f -= FRACT_MAX; +                timer0_fract -= FRACT_MAX; +                ++m; +        } + +        //timer0_fract = f; +        timer0_millis = m; +        //timer0_overflow_count++; + +//static uint32_t last_time = 0; +        //if (timer0_overflow_count & 0x1) +        //if (m - last_time >= 5) { +        //debounce_keys(); // called nearly each 2ms (0,002048s) +            //last_time = m; +        //} +} + +/* +inline uint32_t millis() +{ +        uint32_t m; +        uint8_t oldSREG = SREG; + +        // disable interrupts while we read timer0_millis or we might get an +        // inconsistent value (e.g. in the middle of a write to timer0_millis) +        cli(); +        m = timer0_millis; +        SREG = oldSREG; + +        return m; +} +*/ + +inline uint32_t millis() +{ +    return timer0_millis; +} + +void delay(uint32_t ms) +{ +    in_wait = true; +    uint32_t time1 = millis(); +    while ((millis()) - time1 < ms); +    in_wait = false; +} +//void delay_ms(uint16_t x) +//{ +//    in_wait = true; +//  uint8_t y, z; +//  for ( ; x > 0 ; x--){ +//    for ( y = 0 ; y < 90 ; y++){ +//      for ( z = 0 ; z < 6 ; z++){ +//        asm volatile ("nop"); +//      } +//    } +//  } +//    in_wait = false; +//} + + +/***************************************************************************** + * ACCESSORS + *****************************************************************************/ + +//unsigned char inrange(int x, int y, int z) +//{ +//    if (x >= 0 && x < CUBE_SIZE && y >= 0 && y < CUBE_SIZE && z >= 0 && z < CUBE_SIZE) +//    { +//        return 1; +//    } else +//    { +//        // One of the coordinates was outside the cube. +//        return 0; +//    } +//} + +//bool get_led(unsigned char x, unsigned char y, unsigned char z) +//{ +//    /* +//    assert(x >= 0 && x <= 7); +//    assert(y >= 0 && y <= 7); +//    assert(z >= 0 && z <= 7); +//    */ +// +//    if (inrange(x, y, z)) { +//        return cube[y][z] & (1 << x); +//    } +// +//    return false; +//} + +//void set_led(unsigned char x, unsigned char y, unsigned char z, bool on) +//{ +// +//    if (!inrange(x, y, z)) { +//        return; +//    } +// +//    /* +//    assert(x >= 0 && x <= 7); +//    assert(y >= 0 && y <= 7); +//    assert(z >= 0 && z <= 7); +//    */ +// +//    if (on) { +//        cube[y][z] |= ((unsigned char)1) << x; +//    } +//    else { +//        cube[y][z] &= ~(((unsigned char)1) << x); +//    } +//} + +void clear_led() +{ +    for (unsigned char z = 0; z < 8; ++z) { +        for (unsigned char y = 0; y < 8; ++y) { +            cube[y][z] = 0; +        } +    } +} + +/***************************************************************************** + * RENDER + *****************************************************************************/ + +//ISR(TIMER2_COMP_vect) +//{ +//    //if (!in_wait) return; +//    PORTC &= ~0x28; // layer and latch low +//    unsigned char current_layer_ = current_layer; +// +//    for (char j = 0; j < 8; ++j) { +//    //for (char j = 0; j < 4; ++j) { +//        unsigned char val = cube[7-j][current_layer_]; +//        //unsigned char val2 = cube[3-j][current_layer_]; +//        for (char i = 0; i < 8; ++i/*, val >>= 1*/) { +//            PORTC &= ~0x10; +//            //PORTD = (PORTD & ~0x80) | ((val2 << (7-i)) & 0x80); +//            PORTB = (PORTB & ~0x01) | ((val >> i) & 0x01); +//            //PORTB |= 0x01; +// +//            //PORTD |= 0x80; +//            //PORTD = (PORTD & ~0x40) | (((val << (7-i)) & 0x80) >> 1); +//            PORTC |= 0x10; +//        } +//    } +// +//    PORTC = (PORTC & ~0x07) | current_layer_; +//    ++current_layer_; +//    current_layer = current_layer_ & 0x07; +// +//    PORTC |= 0x28; // layer and latch high +//} + +ISR(TIMER2_COMP_vect) +{ +    //if (!in_wait) return; +    PORTC &= ~0x28; // layer and latch low +    unsigned char current_layer_ = current_layer; + +    for (unsigned char j = 7; j < 255; --j) { +    //for (char j = 0; j < 4; ++j) { +        unsigned char val = cube[j][current_layer_]; +        PORTC &= ~0x10; +        PORTB = (PORTB & ~0x01) | ((val     ) & 0x01); +        PORTC |= 0x10; +        PORTC &= ~0x10; +        PORTB = (PORTB & ~0x01) | ((val >> 1) & 0x01); +        PORTC |= 0x10; +        PORTC &= ~0x10; +        PORTB = (PORTB & ~0x01) | ((val >> 2) & 0x01); +        PORTC |= 0x10; +        PORTC &= ~0x10; +        PORTB = (PORTB & ~0x01) | ((val >> 3) & 0x01); +        PORTC |= 0x10; +        PORTC &= ~0x10; +        PORTB = (PORTB & ~0x01) | ((val >> 4) & 0x01); +        PORTC |= 0x10; +        PORTC &= ~0x10; +        PORTB = (PORTB & ~0x01) | ((val >> 5) & 0x01); +        PORTC |= 0x10; +        PORTC &= ~0x10; +        PORTB = (PORTB & ~0x01) | ((val >> 6) & 0x01); +        PORTC |= 0x10; +        PORTC &= ~0x10; +        PORTB = (PORTB & ~0x01) | ((val >> 7) & 0x01); +        //PORTD = val; +        PORTC |= 0x10; +    } + +    PORTC = (PORTC & ~0x07) | current_layer_ | 0x28; +    ++current_layer_; +    if (current_layer_ > 7) current_layer_ = 0; +    //current_layer = current_layer_ & 0x07; +    current_layer = current_layer_; + +    //PORTC |= 0x28; // layer and latch high +} + + + +//void draw_positions_axis (char axis, unsigned char positions[64], int invert) +//{ +//	int x, y, p; +// +//	//fill(0x00); +//    clear_led(); +// +//	for (x=0; x<8; x++) +//	{ +//		for (y=0; y<8; y++) +//		{ +//			if (invert) +//			{ +//				p = (7-positions[(x*8)+y]); +//			} else +//			{ +//				p = positions[(x*8)+y]; +//			} +// +//			if (axis == AXIS_Z) +//				//setvoxel(x,y,p); +//                set_led(x, y, p, true); +// +//			if (axis == AXIS_Y) +//				//setvoxel(x,p,y); +//				set_led(x,p,y, true); +// +//			if (axis == AXIS_X) +//				set_led(p,y,x, true); +//		} +//	} +// +//} + + + + +//void effect_boxside_randsend_parallel (char axis, int origin, int delay, int mode) +//{ +//	int i; +//	int done; +//	unsigned char cubepos[64]; +//	unsigned char pos[64]; +//	int notdone = 1; +//	int notdone2 = 1; +//	int sent = 0; +// +//	for (i=0;i<64;i++) +//	{ +//		pos[i] = 0; +//	} +// +//	while (notdone) +//	{ +//		if (mode == 1) +//		{ +//			notdone2 = 1; +//			while (notdone2 && sent<64) +//			{ +//				i = myrand()%64; +//				if (pos[i] == 0) +//				{ +//					sent++; +//					pos[i] += 1; +//					notdone2 = 0; +//				} +//			} +//		} else if (mode == 2) +//		{ +//			if (sent<64) +//			{ +//				pos[sent] += 1; +//				sent++; +//			} +//		} +// +//		done = 0; +//		for (i=0;i<64;i++) +//		{ +//			if (pos[i] > 0 && pos[i] <7) +//			{ +//				pos[i] += 1; +//			} +// +//			if (pos[i] == 7) +//				done++; +//		} +// +//		if (done == 64) +//			notdone = 0; +// +//		for (i=0;i<64;i++) +//		{ +//			if (origin == 0) +//			{ +//				cubepos[i] = pos[i]; +//			} else +//			{ +//				cubepos[i] = (7-pos[i]); +//			} +//		} +// +// +//		delay_ms(delay); +//		draw_positions_axis(axis,cubepos,0); +// +//	} +// +//} + + + +/***************************************************************************** + * MAIN + *****************************************************************************/ +#include "main.h" +#include "effect.h" +#include "draw.h" + +int main() +{ +    /* +     * ======================================================================= +     * Initialisation +     * ======================================================================= +     */ + +    //*** init time management +    TCNT0 = 0; // init timer count to 0 +    TCCR0 |= 0x03; // prescaler: 64 +    TIMSK |= 0x01; // enable timer 0 overflow interrupt + +    // Timer 2 +    // Frame buffer interrupt +    // 14745600/128/11 = 10472.72 interrupts per second +    // 10472.72/8 = 1309 frames per second +    OCR2 = 11;  // interrupt at counter = 10 +    TCCR2 |= (1 << CS20) | (0 << CS21) | (1 << CS22); // Prescaler = 128. +    TCCR2 |= (1 << WGM21); // CTC mode. Reset counter when OCR2 is reached. +    TCNT2 = 0x00;   // initial counter value = 0; +    TIMSK |= (1 << OCIE2); // Enable CTC interrupt + +    PORTD = 0; +    PORTB = 0; +    PORTC = 0; +    DDRD = 0xff; +    DDRB = 0xff; +    DDRC = 0xff; + +    //*** set interupts +    sei(); + +    /* +     * ======================================================================= +     * MAIN LOOP +     * ======================================================================= +     */ + +    for (;;) { + +        //clear_led(); +        //delay_ms(1000); +        for (unsigned char z = 0; z < 8; ++z) { +            for (unsigned char y = 0; y < 8; ++y) { +                cube[y][z] = 0xFF; +            } +        } +        //continue; +        delay(1000); + +		// Show the effects in a predefined order +		//for (char i=0; i<EFFECTS_TOTAL; i++) +			//launch_effect(i); +			sendvoxels_rand_z(20,220,2000); +			effect_rain(100); +			effect_random_filler(5,1); +			effect_z_updown(20,1000); +			effect_wormsqueeze (2, AXIS_Z, -1, 100, 1000); +			effect_blinky2(); + + +		// Show the effects in a random order. +		// Comment the two lines above and uncomment this +		// if you want the effects in a random order. +		//launch_effect(rand()%EFFECTS_TOTAL); + +        for (char i = 0; i < 10; ++i) { +            effect_boxside_randsend_parallel (AXIS_X, 0, 150, 1); +            effect_boxside_randsend_parallel (AXIS_X, 1, 150, 1); +            effect_boxside_randsend_parallel (AXIS_Y, 0, 150, 1); +            effect_boxside_randsend_parallel (AXIS_Y, 1, 150, 1); +            effect_boxside_randsend_parallel (AXIS_Z, 0, 150, 1); +            effect_boxside_randsend_parallel (AXIS_Z, 1, 150, 1); +        } + +        continue; + +        //return; +        for (char z = 0; z < 8; ++z) { +            for (char y = 0; y < 8; ++y) { +                for (char x = 0; x < 8; ++x) { +                    //set_led(x, y, z, true); +                    delay(5); +                    delay(100); +                    //delay(500); +                    //delay(1000); +                    //delay_ms(1000); +                } +            } +        } + +        //delay(1000); +        //PORTB ^= 0x01; +    } + +    return 0; // normally never return, just to be complient with c99 standard +} diff --git a/avr-test/src/main.h b/avr-test/src/main.h new file mode 100644 index 0000000..0a755f7 --- /dev/null +++ b/avr-test/src/main.h @@ -0,0 +1,45 @@ +#ifndef MAIN_H +#define MAIN_H + +#include <avr/io.h> +#include <avr/pgmspace.h> +#include <avr/interrupt.h> +#include <stdlib.h> + +#include "cube.h" + +// Define USART stuff +#define FOSC 14745600 +#define BAUD 38400 +#define MYUBRR (((((FOSC * 10) / (16L * BAUD)) + 5) / 10) - 1) + +#define DATA_BUS PORTA +#define LAYER_SELECT PORTC +#define LATCH_ADDR PORTB +#define LATCH_MASK 0x07 +#define LATCH_MASK_INV 0xf8 +#define OE_PORT PORTB +#define OE_MASK 0x08 + +// Red led on D2 +#define LED_RED 0x04 +// Green led D3 +#define LED_GREEN 0x08 +// Program led on D4 +#define LED_PGM 0x10; +// Leds connected to port D +#define LED_PORT PORTD +// Rs232 button on D5 +#define RS232_BTN 0x20 +// Main button on B4 +#define MAIN_BTN 0x10  + +void ioinit (void); +void bootmsg (void); + +volatile unsigned char current_layer; +volatile unsigned char pgm_mode; +void rs232(void); +unsigned int bootwait (void); +#endif + diff --git a/avr-test/tags b/avr-test/tags new file mode 100644 index 0000000..94663e7 --- /dev/null +++ b/avr-test/tags @@ -0,0 +1,150 @@ +!_TAG_FILE_FORMAT	2	/extended format; --format=1 will not append ;" to lines/ +!_TAG_FILE_SORTED	1	/0=unsorted, 1=sorted, 2=foldcase/ +!_TAG_PROGRAM_AUTHOR	Darren Hiebert	/dhiebert@users.sourceforge.net/ +!_TAG_PROGRAM_NAME	Exuberant Ctags	// +!_TAG_PROGRAM_URL	http://ctags.sourceforge.net	/official site/ +!_TAG_PROGRAM_VERSION	5.9~svn20110310	// +-mcu	Makefile	/^	avr-size --mcu=$(MCU_TARGET) -C $(PRG).elf$/;"	m +AXIS_X	src/cube.h	27;"	d +AXIS_Y	src/cube.h	28;"	d +AXIS_Z	src/cube.h	29;"	d +BAUD	src/main.h	13;"	d +CC	Makefile	/^CC             = avr-gcc$/;"	m +CUBE_BYTES	src/cube.h	8;"	d +CUBE_H	src/cube.h	2;"	d +CUBE_SIZE	src/cube.h	7;"	d +CUBE_SIZE	src/main.cpp	30;"	d	file: +CXX	Makefile	/^CXX            = avr-g++$/;"	m +DATA_BUS	src/main.h	16;"	d +DEFS	Makefile	/^DEFS           =$/;"	m +DFLAGS	Makefile	/^override LDFLAGS       = -Wl,-Map,$(PRG).map --relax$/;"	m +EEMEM	src/font.cpp	/^volatile const unsigned char bitmaps[6][8] EEMEM = {$/;"	v +EEMEM	src/font.cpp	/^volatile const unsigned char font[455] EEMEM = {$/;"	v +EXTRA_CLEAN_FILES	Makefile	/^EXTRA_CLEAN_FILES       = *.hex *.bin *.srec$/;"	m +FIG2DEV	Makefile	/^FIG2DEV                 = fig2dev$/;"	m +FLAGS	Makefile	/^override CFLAGS        = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS) #-fno-exceptions -fno-rtti$/;"	m +FOSC	src/main.h	12;"	d +FRACT_INC	src/main.cpp	62;"	d	file: +FRACT_MAX	src/main.cpp	63;"	d	file: +F_CPU	src/main.cpp	46;"	d	file: +GOL_CREATE_MAX	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	9;"	d	file: +GOL_CREATE_MIN	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	8;"	d	file: +GOL_TERMINATE_CROWDED	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	12;"	d	file: +GOL_TERMINATE_LONELY	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	11;"	d	file: +GOL_WRAP	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	18;"	d	file: +GOL_X	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	14;"	d	file: +GOL_Y	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	15;"	d	file: +GOL_Z	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	16;"	d	file: +ISR	src/main.cpp	/^ISR(TIMER0_OVF_vect)$/;"	f	signature:(TIMER0_OVF_vect) +ISR	src/main.cpp	/^ISR(TIMER2_COMP_vect)$/;"	f	signature:(TIMER2_COMP_vect) +LATCH_ADDR	src/main.h	18;"	d +LATCH_MASK	src/main.h	19;"	d +LATCH_MASK_INV	src/main.h	20;"	d +LAYER_SELECT	src/main.h	17;"	d +LED_GREEN	src/main.h	27;"	d +LED_PGM	src/main.h	29;"	d +LED_PORT	src/main.h	31;"	d +LED_RED	src/main.h	25;"	d +LIBS	Makefile	/^LIBS           =$/;"	m +MAIN_BTN	src/main.h	35;"	d +MAIN_H	src/main.h	2;"	d +MCU_TARGET	Makefile	/^MCU_TARGET     = atmega8$/;"	m +MICROSECONDS_PER_TIMER0_OVERFLOW	src/main.cpp	54;"	d	file: +MILLIS_INC	src/main.cpp	57;"	d	file: +MYUBRR	src/main.h	14;"	d +OBJ	Makefile	/^OBJ            = main.o draw.o effect.o font.o launch_effect.o$/;"	m +OBJCOPY	Makefile	/^OBJCOPY        = avr-objcopy$/;"	m +OBJDUMP	Makefile	/^OBJDUMP        = avr-objdump$/;"	m +OE_MASK	src/main.h	22;"	d +OE_PORT	src/main.h	21;"	d +OPTIMIZE	Makefile	/^OPTIMIZE       = -Os$/;"	m +PRG	Makefile	/^PRG            = ledcube$/;"	m +PROGMEM	src/font.cpp	/^const unsigned char paths[44] PROGMEM = {0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x67,0x57,0x47,0x37,0x27,0x17,$/;"	v +RS232_BTN	src/main.h	33;"	d +altervoxel	src/draw.cpp	/^void altervoxel(int x, int y, int z, int state)$/;"	f	signature:(int x, int y, int z, int state) +argorder	src/draw.cpp	/^void argorder(int ix1, int ix2, int *ox1, int *ox2)$/;"	f	signature:(int ix1, int ix2, int *ox1, int *ox2) +boingboing	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void boingboing(uint16_t iterations, int delay, unsigned char mode, unsigned char drawmode)$/;"	f	signature:(uint16_t iterations, int delay, unsigned char mode, unsigned char drawmode) +bootmsg	src/main.h	/^void bootmsg (void);$/;"	p	signature:(void) +bootwait	src/main.h	/^unsigned int bootwait (void);$/;"	p	signature:(void) +box_filled	src/draw.cpp	/^void box_filled(int x1, int y1, int z1, int x2, int y2, int z2)$/;"	f	signature:(int x1, int y1, int z1, int x2, int y2, int z2) +box_walls	src/draw.cpp	/^void box_walls(int x1, int y1, int z1, int x2, int y2, int z2)$/;"	f	signature:(int x1, int y1, int z1, int x2, int y2, int z2) +box_wireframe	src/draw.cpp	/^void box_wireframe(int x1, int y1, int z1, int x2, int y2, int z2)$/;"	f	signature:(int x1, int y1, int z1, int x2, int y2, int z2) +byteline	src/draw.cpp	/^char byteline (int start, int end)$/;"	f	signature:(int start, int end) +clear_led	src/main.cpp	/^void clear_led()$/;"	f	signature:() +clockCyclesPerMicrosecond	src/main.cpp	48;"	d	file: +clockCyclesToMicroseconds	src/main.cpp	49;"	d	file: +clrplane	src/draw.cpp	/^void clrplane (char axis, unsigned char i)$/;"	f	signature:(char axis, unsigned char i) +clrplane_x	src/draw.cpp	/^void clrplane_x (int x)$/;"	f	signature:(int x) +clrplane_y	src/draw.cpp	/^void clrplane_y (int y)$/;"	f	signature:(int y) +clrplane_z	src/draw.cpp	/^void clrplane_z (int z)$/;"	f	signature:(int z) +clrvoxel	src/draw.cpp	/^void clrvoxel(int x, int y, int z)$/;"	f	signature:(int x, int y, int z) +cube	src/cube.h	/^volatile unsigned char cube[CUBE_SIZE][CUBE_SIZE];$/;"	v +current_layer	src/main.h	/^volatile unsigned char current_layer;$/;"	v +delay	src/main.cpp	/^void delay(uint32_t ms)$/;"	f	signature:(uint32_t ms) +delay_ms	src/draw.cpp	/^void delay_ms(uint16_t x)$/;"	f	signature:(uint16_t x) +draw_positions_axis	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void draw_positions_axis (char axis, unsigned char positions[64], int invert)$/;"	f	signature:(char axis, unsigned char positions[64], int invert) +effect_axis_updown_randsuspend	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_axis_updown_randsuspend (char axis, int delay, int sleep, int invert)$/;"	f	signature:(char axis, int delay, int sleep, int invert) +effect_blinky2	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_blinky2()$/;"	f	signature:() +effect_box_shrink_grow	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_box_shrink_grow (int iterations, int rot, int flip, uint16_t delay)$/;"	f	signature:(int iterations, int rot, int flip, uint16_t delay) +effect_box_woopwoop	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_box_woopwoop (int delay, int grow)$/;"	f	signature:(int delay, int grow) +effect_boxside_randsend_parallel	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_boxside_randsend_parallel (char axis, int origin, int delay, int mode)$/;"	f	signature:(char axis, int origin, int delay, int mode) +effect_loadbar	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_loadbar(int delay)$/;"	f	signature:(int delay) +effect_path_bitmap	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_path_bitmap (int delay, char bitmap, int iterations)$/;"	f	signature:(int delay, char bitmap, int iterations) +effect_path_text	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_path_text (int delay, char *str)$/;"	f	signature:(int delay, char *str) +effect_pathmove	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_pathmove (unsigned char *path, int length)$/;"	f	signature:(unsigned char *path, int length) +effect_pathspiral	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_pathspiral (int iterations, int delay)$/;"	f	signature:(int iterations, int delay) +effect_planboing	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_planboing (int plane, int speed)$/;"	f	signature:(int plane, int speed) +effect_rain	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_rain (int iterations)$/;"	f	signature:(int iterations) +effect_rand_patharound	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_rand_patharound (int iterations, int delay)$/;"	f	signature:(int iterations, int delay) +effect_random_filler	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_random_filler (int delay, int state)$/;"	f	signature:(int delay, int state) +effect_random_sparkle	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_random_sparkle (void)$/;"	f	signature:(void) +effect_random_sparkle_flash	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_random_sparkle_flash (int iterations, int voxels, int delay)$/;"	f	signature:(int iterations, int voxels, int delay) +effect_smileyspin	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_smileyspin (int count, int delay, char bitmap)$/;"	f	signature:(int count, int delay, char bitmap) +effect_stringfly2	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_stringfly2(char * str)$/;"	f	signature:(char * str) +effect_telcstairs	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_telcstairs (int invert, int delay, int val)$/;"	f	signature:(int invert, int delay, int val) +effect_telcstairs_do	/home/calendros/work/ledcube/avr/src/effect.cpp	/^int effect_telcstairs_do(int x, int val, int delay)$/;"	f	signature:(int x, int val, int delay) +effect_test	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_test (void)$/;"	f	signature:(void) +effect_wormsqueeze	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_wormsqueeze (int size, int axis, int direction, int iterations, int delay)$/;"	f	signature:(int size, int axis, int direction, int iterations, int delay) +effect_z_updown	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_z_updown (int iterations, int delay)$/;"	f	signature:(int iterations, int delay) +effect_z_updown_move	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void effect_z_updown_move (unsigned char positions[64], unsigned char destinations[64], char axis)$/;"	f	signature:(unsigned char positions[64], unsigned char destinations[64], char axis) +fb	src/cube.h	/^volatile unsigned char fb[CUBE_SIZE][CUBE_SIZE];$/;"	v +fill	src/draw.cpp	/^void fill (unsigned char pattern)$/;"	f	signature:(unsigned char pattern) +flipbyte	src/draw.cpp	/^char flipbyte (char byte)$/;"	f	signature:(char byte) +flpvoxel	src/draw.cpp	/^void flpvoxel(int x, int y, int z)$/;"	f	signature:(int x, int y, int z) +font_getbitmap	src/font.cpp	/^void font_getbitmap (char bitmap, unsigned char dst[8])$/;"	f	signature:(char bitmap, unsigned char dst[8]) +font_getbitmappixel	src/font.cpp	/^unsigned char font_getbitmappixel ( char bitmap, char x, char y)$/;"	f	signature:( char bitmap, char x, char y) +font_getchar	src/font.cpp	/^void font_getchar (char chr, unsigned char dst[5])$/;"	f	signature:(char chr, unsigned char dst[5]) +font_getpath	src/font.cpp	/^void font_getpath (unsigned char path, unsigned char *destination, int length)$/;"	f	signature:(unsigned char path, unsigned char *destination, int length) +getvoxel	src/draw.cpp	/^unsigned char getvoxel(int x, int y, int z)$/;"	f	signature:(int x, int y, int z) +gol_count_changes	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	/^int gol_count_changes (void)$/;"	f	signature:(void) +gol_count_neighbors	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	/^unsigned char gol_count_neighbors (int x, int y, int z)$/;"	f	signature:(int x, int y, int z) +gol_nextgen	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	/^void gol_nextgen (void)$/;"	f	signature:(void) +gol_play	/home/calendros/work/ledcube/avr/src/gameoflife.cpp	/^void gol_play (int iterations, uint16_t delay)$/;"	f	signature:(int iterations, uint16_t delay) +in_wait	src/main.cpp	/^volatile bool in_wait = false;$/;"	v +inrange	src/draw.cpp	/^unsigned char inrange(int x, int y, int z)$/;"	f	signature:(int x, int y, int z) +ioinit	src/main.h	/^void ioinit (void);$/;"	p	signature:(void) +launch_effect	src/launch_effect.cpp	/^void launch_effect (int effect)$/;"	f	signature:(int effect) +line	src/draw.cpp	/^void line(int x1, int y1, int z1, int x2, int y2, int z2)$/;"	f	signature:(int x1, int y1, int z1, int x2, int y2, int z2) +main	src/main.cpp	/^int main()$/;"	f	signature:() +microsecondsToClockCycles	src/main.cpp	50;"	d	file: +millis	src/main.cpp	/^inline uint32_t millis()$/;"	f	signature:() +mirror_x	src/draw.cpp	/^void mirror_x (void)$/;"	f	signature:(void) +mirror_y	src/draw.cpp	/^void mirror_y (void)$/;"	f	signature:(void) +mirror_z	src/draw.cpp	/^void mirror_z (void)$/;"	f	signature:(void) +pgm_mode	src/main.h	/^volatile unsigned char pgm_mode;$/;"	v +rand	src/main.cpp	/^int rand(void);$/;"	p	file:	signature:(void) +rs232	src/main.h	/^void rs232(void);$/;"	p	signature:(void) +sendplane_rand_z	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void sendplane_rand_z (unsigned char z, int delay, int wait)$/;"	f	signature:(unsigned char z, int delay, int wait) +sendvoxel_z	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void sendvoxel_z (unsigned char x, unsigned char y, unsigned char z, int delay)$/;"	f	signature:(unsigned char x, unsigned char y, unsigned char z, int delay) +sendvoxels_rand_z	/home/calendros/work/ledcube/avr/src/effect.cpp	/^void sendvoxels_rand_z (int iterations, int delay, int wait)$/;"	f	signature:(int iterations, int delay, int wait) +setplane	src/draw.cpp	/^void setplane (char axis, unsigned char i)$/;"	f	signature:(char axis, unsigned char i) +setplane_x	src/draw.cpp	/^void setplane_x (int x)$/;"	f	signature:(int x) +setplane_y	src/draw.cpp	/^void setplane_y (int y)$/;"	f	signature:(int y) +setplane_z	src/draw.cpp	/^void setplane_z (int z)$/;"	f	signature:(int z) +setvoxel	src/draw.cpp	/^void setvoxel(int x, int y, int z)$/;"	f	signature:(int x, int y, int z) +shift	src/draw.cpp	/^void shift (char axis, int direction)$/;"	f	signature:(char axis, int direction) +timer0_millis	src/main.cpp	/^volatile uint32_t timer0_millis = 0;$/;"	v +tmp2cube	src/draw.cpp	/^void tmp2cube (void)$/;"	f	signature:(void) +tmpclrvoxel	src/draw.cpp	/^void tmpclrvoxel(int x, int y, int z)$/;"	f	signature:(int x, int y, int z) +tmpfill	src/draw.cpp	/^void tmpfill (unsigned char pattern)$/;"	f	signature:(unsigned char pattern) +tmpsetvoxel	src/draw.cpp	/^void tmpsetvoxel(int x, int y, int z)$/;"	f	signature:(int x, int y, int z) | 
