aboutsummaryrefslogtreecommitdiffstats
path: root/instructables
diff options
context:
space:
mode:
authorvg <vgm+dev@devys.org>2020-07-07 16:24:01 +0200
committervg <vgm+dev@devys.org>2020-07-07 16:24:01 +0200
commit66dcf910bd4744d8ced56cb9586aa937a1a2d4c5 (patch)
treedf4dca1ae4af1e5df0be0d1f4f2cd0d54751f8e8 /instructables
downloadhic-66dcf910bd4744d8ced56cb9586aa937a1a2d4c5.tar.gz
hic-66dcf910bd4744d8ced56cb9586aa937a1a2d4c5.tar.bz2
hic-66dcf910bd4744d8ced56cb9586aa937a1a2d4c5.zip
first commitHEADmaster
Diffstat (limited to 'instructables')
-rw-r--r--instructables/arduinocube/arduinocube.pde790
-rw-r--r--instructables/cube8/Makefile514
-rw-r--r--instructables/cube8/cube.h32
-rw-r--r--instructables/cube8/draw.c559
-rw-r--r--instructables/cube8/draw.h71
-rw-r--r--instructables/cube8/effect.c1331
-rw-r--r--instructables/cube8/effect.h54
-rw-r--r--instructables/cube8/font.c104
-rw-r--r--instructables/cube8/font.h13
-rw-r--r--instructables/cube8/fuses.txt6
-rw-r--r--instructables/cube8/gameoflife.c135
-rw-r--r--instructables/cube8/gameoflife.h9
-rw-r--r--instructables/cube8/launch_effect.c182
-rw-r--r--instructables/cube8/launch_effect.h15
-rw-r--r--instructables/cube8/lisence.txt5
-rw-r--r--instructables/cube8/main.c285
-rw-r--r--instructables/cube8/main.h45
-rw-r--r--instructables/cube_pc/3d.c344
-rw-r--r--instructables/cube_pc/3d.h16
-rw-r--r--instructables/cube_pc/Makefile4
-rwxr-xr-xinstructables/cube_pc/cubebin0 -> 44142 bytes
-rw-r--r--instructables/cube_pc/cube.c83
-rw-r--r--instructables/cube_pc/cube.h25
-rw-r--r--instructables/cube_pc/draw.c682
-rw-r--r--instructables/cube_pc/draw.h52
-rw-r--r--instructables/cube_pc/draw.lst2472
-rw-r--r--instructables/cube_pc/draw_3d.c96
-rw-r--r--instructables/cube_pc/draw_3d.h26
-rw-r--r--instructables/cube_pc/effect.c1478
-rw-r--r--instructables/cube_pc/effect.h57
-rw-r--r--instructables/cube_pc/effect.lst5902
-rw-r--r--instructables/cube_pc/font.c158
-rw-r--r--instructables/cube_pc/font.h13
-rw-r--r--instructables/cube_pc/gameoflife.c148
-rw-r--r--instructables/cube_pc/gameoflife.h9
-rw-r--r--instructables/cube_pc/launch_effect.c182
-rw-r--r--instructables/cube_pc/launch_effect.h15
-rw-r--r--instructables/cube_pc/lisence.txt5
-rw-r--r--instructables/cube_pc/main.c81
-rw-r--r--instructables/cube_pc/main.h4
-rw-r--r--instructables/pricelist.xlsbin0 -> 12288 bytes
41 files changed, 16002 insertions, 0 deletions
diff --git a/instructables/arduinocube/arduinocube.pde b/instructables/arduinocube/arduinocube.pde
new file mode 100644
index 0000000..87ce566
--- /dev/null
+++ b/instructables/arduinocube/arduinocube.pde
@@ -0,0 +1,790 @@
+#include <avr/interrupt.h>
+#include <string.h>
+#define AXIS_X 1
+#define AXIS_Y 2
+#define AXIS_Z 3
+
+volatile unsigned char cube[8][8];
+volatile int current_layer = 0;
+
+void setup()
+{
+ int i;
+
+ for(i=0; i<14; i++)
+ pinMode(i, OUTPUT);
+
+ // pinMode(A0, OUTPUT) as specified in the arduino reference didn't work. So I accessed the registers directly.
+ DDRC = 0xff;
+ PORTC = 0x00;
+
+ // Reset any PWM configuration that the arduino may have set up automagically!
+ TCCR2A = 0x00;
+ TCCR2B = 0x00;
+
+ TCCR2A |= (0x01 << WGM21); // CTC mode. clear counter on TCNT2 == OCR2A
+ OCR2A = 10; // Interrupt every 25600th cpu cycle (256*100)
+ TCNT2 = 0x00; // start counting at 0
+ TCCR2B |= (0x01 << CS22) | (0x01 << CS21); // Start the clock with a 256 prescaler
+
+ TIMSK2 |= (0x01 << OCIE2A);
+}
+
+ISR (TIMER2_COMPA_vect)
+{
+ int i;
+
+ // all layer selects off
+ PORTC = 0x00;
+ PORTB &= 0x0f;
+
+ PORTB |= 0x08; // output enable off.
+
+ for (i=0; i<8; i++)
+ {
+ PORTD = cube[current_layer][i];
+ PORTB = (PORTB & 0xF8) | (0x07 & (i+1));
+ }
+
+ PORTB &= 0b00110111; // Output enable on.
+
+ if (current_layer < 6)
+ {
+ PORTC = (0x01 << current_layer);
+ } else if (current_layer == 6)
+ {
+ digitalWrite(12, HIGH);
+ } else
+ {
+ digitalWrite(13, HIGH);
+ }
+
+ current_layer++;
+
+ if (current_layer == 8)
+ current_layer = 0;
+}
+
+void loop()
+{
+ int i,x,y,z;
+
+ while (true)
+ {
+
+ effect_planboing(AXIS_Z, 400);
+ effect_planboing(AXIS_Y, 400);
+ effect_planboing(AXIS_X, 400);
+
+ effect_blinky2();
+
+ effect_random_filler(75,1);
+ effect_random_filler(75,0);
+
+ effect_rain(100);
+
+ 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);
+
+ }
+}
+
+
+// ==========================================================================================
+// Effect functions
+// ==========================================================================================
+
+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 = rand()%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);
+
+ }
+
+}
+
+
+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 = rand()%4;
+
+ for (i=0; i < rnd_num;i++)
+ {
+ rnd_x = rand()%8;
+ rnd_y = rand()%8;
+ setvoxel(rnd_x,rnd_y,7);
+ }
+
+ delay_ms(1000);
+ shift(AXIS_Z,-1);
+ }
+}
+
+// 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 = rand()%8;
+ y = rand()%8;
+ z = rand()%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_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)));
+ }
+ }
+
+}
+
+// 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);
+ }
+}
+
+// ==========================================================================================
+// Draw functions
+// ==========================================================================================
+
+
+// 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 to ON
+void clrvoxel(int x, int y, int z)
+{
+ if (inrange(x,y,z))
+ cube[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 < 8 && y >= 0 && y < 8 && z >= 0 && z < 8)
+ {
+ return 0x01;
+ } else
+ {
+ // One of the coordinates was outside the cube.
+ return 0x00;
+ }
+}
+
+// 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 0x01;
+ } else
+ {
+ return 0x00;
+ }
+ } else
+ {
+ return 0x00;
+ }
+}
+
+// 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<8)
+ {
+ for (i=0;i<8;i++)
+ cube[z][i] = 0xff;
+ }
+}
+
+// Clears voxels in the same manner as above
+void clrplane_z (int z)
+{
+ int i;
+ if (z>=0 && z<8)
+ {
+ for (i=0;i<8;i++)
+ cube[z][i] = 0x00;
+ }
+}
+
+void setplane_x (int x)
+{
+ int z;
+ int y;
+ if (x>=0 && x<8)
+ {
+ for (z=0;z<8;z++)
+ {
+ for (y=0;y<8;y++)
+ {
+ cube[z][y] |= (1 << x);
+ }
+ }
+ }
+}
+
+void clrplane_x (int x)
+{
+ int z;
+ int y;
+ if (x>=0 && x<8)
+ {
+ for (z=0;z<8;z++)
+ {
+ for (y=0;y<8;y++)
+ {
+ cube[z][y] &= ~(1 << x);
+ }
+ }
+ }
+}
+
+void setplane_y (int y)
+{
+ int z;
+ if (y>=0 && y<8)
+ {
+ for (z=0;z<8;z++)
+ cube[z][y] = 0xff;
+ }
+}
+
+void clrplane_y (int y)
+{
+ int z;
+ if (y>=0 && y<8)
+ {
+ for (z=0;z<8;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<8;z++)
+ {
+ for (y=0;y<8;y++)
+ {
+ cube[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");
+ }
+ }
+ }
+}
+
+
+
+// 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 < 8; i++)
+ {
+ if (direction == -1)
+ {
+ ii = i;
+ } else
+ {
+ ii = (7-i);
+ }
+
+
+ for (x = 0; x < 8; x++)
+ {
+ for (y = 0; y < 8; 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 < 8; x++)
+ {
+ for (y = 0; y < 8; 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);
+ }
+ }
+}
+
diff --git a/instructables/cube8/Makefile b/instructables/cube8/Makefile
new file mode 100644
index 0000000..e9b81d7
--- /dev/null
+++ b/instructables/cube8/Makefile
@@ -0,0 +1,514 @@
+# Hey Emacs, this is a -*- makefile -*-
+#----------------------------------------------------------------------------
+# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al.
+#
+# Released to the Public Domain
+#
+# Additional material for this makefile was written by:
+# Peter Fleury
+# Tim Henigan
+# Colin O'Flynn
+# Reiner Patommel
+# Markus Pfaff
+# Sander Pool
+# Frederik Rouleau
+#
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device, using avrdude.
+# Please customize the avrdude settings below first!
+#
+# make debug = Start either simulavr or avarice as specified for debugging,
+# with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+# bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+
+# MCU name
+MCU = atmega32
+#MCU = attiny13
+
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#F_CPU = 8000000
+#1.8432*8*1000000
+F_CPU = 14745600
+
+# Output format. (can be srec, ihex, binary)
+FORMAT = ihex
+
+
+# Target file name (without extension).
+TARGET = main
+
+
+# List C source files here. (C dependencies are automatically generated.)
+SRC = $(TARGET).c draw.c effect.c font.c launch_effect.c gameoflife.c
+
+
+# List Assembler source files here.
+# Make them always end in a capital .S. Files ending in a lowercase .s
+# will not be considered source files but generated files (assembler
+# output from the compiler), and will be deleted upon "make clean"!
+# Even though the DOS/Win* filesystem matches both .s and .S the same,
+# it will preserve the spelling of the filenames, and gcc itself does
+# care about how the name is spelled on its command-line.
+ASRC =
+
+
+# Optimization level, can be [0, 1, 2, 3, s].
+# 0 = turn off optimization. s = optimize for size.
+# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
+OPT = s
+
+
+# Debugging format.
+# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
+# AVR Studio 4.10 requires dwarf-2.
+# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
+DEBUG = dwarf-2
+
+
+# List any extra directories to look for include files here.
+# Each directory must be seperated by a space.
+# Use forward slashes for directory separators.
+# For a directory that has spaces, enclose it in quotes.
+EXTRAINCDIRS =
+
+
+# Compiler flag to set the C Standard level.
+# c89 = "ANSI" C
+# gnu89 = c89 plus GCC extensions
+# c99 = ISO C99 standard (not yet fully implemented)
+# gnu99 = c99 plus GCC extensions
+CSTANDARD = -std=gnu99
+
+
+# Place -D or -U options here
+CDEFS = -DF_CPU=$(F_CPU)UL
+
+
+# Place -I options here
+CINCS =
+
+
+
+#---------------- Compiler Options ----------------
+# -g*: generate debugging information
+# -O*: optimization level
+# -f...: tuning, see GCC manual and avr-libc documentation
+# -Wall...: warning level
+# -Wa,...: tell GCC to pass this to the assembler.
+# -adhlns...: create assembler listing
+CFLAGS = -g$(DEBUG)
+CFLAGS += $(CDEFS) $(CINCS)
+CFLAGS += -O$(OPT)
+CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
+CFLAGS += -Wall -Wstrict-prototypes
+CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
+CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
+CFLAGS += $(CSTANDARD)
+
+
+#---------------- Assembler Options ----------------
+# -Wa,...: tell GCC to pass this to the assembler.
+# -ahlms: create listing
+# -gstabs: have the assembler create line number information; note that
+# for use in COFF files, additional information about filenames
+# and function names needs to be present in the assembler source
+# files -- see avr-libc docs [FIXME: not yet described there]
+ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
+
+
+#---------------- Library Options ----------------
+# Minimalistic printf version
+PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
+
+# Floating point printf version (requires MATH_LIB = -lm below)
+PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
+
+# If this is left blank, then it will use the Standard printf version.
+PRINTF_LIB =
+#PRINTF_LIB = $(PRINTF_LIB_MIN)
+#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
+
+
+# Minimalistic scanf version
+SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
+
+# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
+SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
+
+# If this is left blank, then it will use the Standard scanf version.
+SCANF_LIB =
+#SCANF_LIB = $(SCANF_LIB_MIN)
+#SCANF_LIB = $(SCANF_LIB_FLOAT)
+
+
+MATH_LIB = -lm
+
+
+
+#---------------- External Memory Options ----------------
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# used for variables (.data/.bss) and heap (malloc()).
+#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# only used for heap (malloc()).
+#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
+
+EXTMEMOPTS =
+
+
+
+#---------------- Linker Options ----------------
+# -Wl,...: tell GCC to pass this to linker.
+# -Map: create map file
+# --cref: add cross reference to map file
+LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
+LDFLAGS += $(EXTMEMOPTS)
+LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
+
+
+
+#---------------- Programming Options (avrdude) ----------------
+
+# Programming hardware: alf avr910 avrisp bascom bsd
+# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
+#
+# Type: avrdude -c ?
+# to get a full listing.
+AVRDUDE_PROGRAMMER = usbtiny
+#AVRDUDE_PROGRAMMER = ponyser
+
+# com1 = serial port. Use lpt1 to connect to parallel port.
+#AVRDUDE_PORT = lpt1
+#AVRDUDE_PORT = COM1
+
+AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
+#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
+
+
+# Uncomment the following if you want avrdude's erase cycle counter.
+# Note that this counter needs to be initialized first using -Yn,
+# see avrdude manual.
+#AVRDUDE_ERASE_COUNTER = -y
+
+# Uncomment the following if you do /not/ wish a verification to be
+# performed after programming the device.
+#AVRDUDE_NO_VERIFY = -V
+
+# Increase verbosity level. Please use this when submitting bug
+# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
+# to submit bug reports.
+#AVRDUDE_VERBOSE = -v -v
+
+AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
+AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
+AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
+AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
+
+
+
+#---------------- Debugging Options ----------------
+
+# For simulavr only - target MCU frequency.
+DEBUG_MFREQ = $(F_CPU)
+
+# Set the DEBUG_UI to either gdb or insight.
+# DEBUG_UI = gdb
+DEBUG_UI = insight
+
+# Set the debugging back-end to either avarice, simulavr.
+DEBUG_BACKEND = avarice
+#DEBUG_BACKEND = simulavr
+
+# GDB Init Filename.
+GDBINIT_FILE = __avr_gdbinit
+
+# When using avarice settings for the JTAG
+JTAG_DEV = /dev/com1
+
+# Debugging port used to communicate between GDB / avarice / simulavr.
+DEBUG_PORT = 4242
+
+# Debugging host used to communicate between GDB / avarice / simulavr, normally
+# just set to localhost unless doing some sort of crazy debugging when
+# avarice is running on a different computer.
+DEBUG_HOST = localhost
+
+
+
+#============================================================================
+
+
+# Define programs and commands.
+SHELL = sh
+CC = avr-gcc
+OBJCOPY = avr-objcopy
+OBJDUMP = avr-objdump
+SIZE = avr-size
+NM = avr-nm
+AVRDUDE = avrdude
+REMOVE = rm -f
+COPY = cp
+WINSHELL = cmd
+
+
+# Define Messages
+# English
+MSG_ERRORS_NONE = Errors: none
+MSG_BEGIN = -------- begin --------
+MSG_END = -------- end --------
+MSG_SIZE_BEFORE = Size before:
+MSG_SIZE_AFTER = Size after:
+MSG_COFF = Converting to AVR COFF:
+MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
+MSG_FLASH = Creating load file for Flash:
+MSG_EEPROM = Creating load file for EEPROM:
+MSG_EXTENDED_LISTING = Creating Extended Listing:
+MSG_SYMBOL_TABLE = Creating Symbol Table:
+MSG_LINKING = Linking:
+MSG_COMPILING = Compiling:
+MSG_ASSEMBLING = Assembling:
+MSG_CLEANING = Cleaning project:
+
+
+
+
+# Define all object files.
+OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
+
+# Define all listing files.
+LST = $(SRC:.c=.lst) $(ASRC:.S=.lst)
+
+
+# Compiler flags to generate dependency files.
+GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
+
+
+# Combine all necessary flags and optional flags.
+# Add target processor to flags.
+ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
+ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
+
+
+
+
+
+# Default target.
+all: begin gccversion sizebefore build sizeafter end
+
+build: elf hex eep lss sym
+
+elf: $(TARGET).elf
+hex: $(TARGET).hex
+eep: $(TARGET).eep
+lss: $(TARGET).lss
+sym: $(TARGET).sym
+
+
+
+# Eye candy.
+# AVR Studio 3.x does not check make's exit code but relies on
+# the following magic strings to be generated by the compile job.
+begin:
+ @echo
+ @echo $(MSG_BEGIN)
+
+end:
+ @echo $(MSG_END)
+ @echo
+
+
+# Display size of file.
+HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
+ELFSIZE = $(SIZE) -A $(TARGET).elf
+AVRMEM = avr-mem.sh $(TARGET).elf $(MCU)
+
+sizebefore:
+ @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
+ $(AVRMEM) 2>/dev/null; echo; fi
+
+sizeafter:
+ @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
+ $(AVRMEM) 2>/dev/null; echo; fi
+
+
+
+# Display compiler version information.
+gccversion :
+ @$(CC) --version
+
+
+
+# Program the device.
+program: $(TARGET).hex $(TARGET).eep
+ $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
+
+
+# Generate avr-gdb config/init file which does the following:
+# define the reset signal, load the target file, connect to target, and set
+# a breakpoint at main().
+gdb-config:
+ @$(REMOVE) $(GDBINIT_FILE)
+ @echo define reset >> $(GDBINIT_FILE)
+ @echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
+ @echo end >> $(GDBINIT_FILE)
+ @echo file $(TARGET).elf >> $(GDBINIT_FILE)
+ @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
+ifeq ($(DEBUG_BACKEND),simulavr)
+ @echo load >> $(GDBINIT_FILE)
+endif
+ @echo break main >> $(GDBINIT_FILE)
+
+debug: gdb-config $(TARGET).elf
+ifeq ($(DEBUG_BACKEND), avarice)
+ @echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
+ @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
+ $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
+ @$(WINSHELL) /c pause
+
+else
+ @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
+ $(DEBUG_MFREQ) --port $(DEBUG_PORT)
+endif
+ @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
+
+
+
+
+# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
+COFFCONVERT=$(OBJCOPY) --debugging \
+--change-section-address .data-0x800000 \
+--change-section-address .bss-0x800000 \
+--change-section-address .noinit-0x800000 \
+--change-section-address .eeprom-0x810000
+
+
+coff: $(TARGET).elf
+ @echo
+ @echo $(MSG_COFF) $(TARGET).cof
+ $(COFFCONVERT) -O coff-avr $< $(TARGET).cof
+
+
+extcoff: $(TARGET).elf
+ @echo
+ @echo $(MSG_EXTENDED_COFF) $(TARGET).cof
+ $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
+
+
+
+# Create final output files (.hex, .eep) from ELF output file.
+%.hex: %.elf
+ @echo
+ @echo $(MSG_FLASH) $@
+ $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
+
+%.eep: %.elf
+ @echo
+ @echo $(MSG_EEPROM) $@
+ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
+ --change-section-lma .eeprom=0 -O $(FORMAT) $< $@
+
+# Create extended listing file from ELF output file.
+%.lss: %.elf
+ @echo
+ @echo $(MSG_EXTENDED_LISTING) $@
+ $(OBJDUMP) -h -S $< > $@
+
+# Create a symbol table from ELF output file.
+%.sym: %.elf
+ @echo
+ @echo $(MSG_SYMBOL_TABLE) $@
+ $(NM) -n $< > $@
+
+
+
+# Link: create ELF output file from object files.
+.SECONDARY : $(TARGET).elf
+.PRECIOUS : $(OBJ)
+%.elf: $(OBJ)
+ @echo
+ @echo $(MSG_LINKING) $@
+ $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
+
+
+# Compile: create object files from C source files.
+%.o : %.c
+ @echo
+ @echo $(MSG_COMPILING) $<
+ $(CC) -c $(ALL_CFLAGS) $< -o $@
+
+
+# Compile: create assembler files from C source files.
+%.s : %.c
+ $(CC) -S $(ALL_CFLAGS) $< -o $@
+
+
+# Assemble: create object files from assembler source files.
+%.o : %.S
+ @echo
+ @echo $(MSG_ASSEMBLING) $<
+ $(CC) -c $(ALL_ASFLAGS) $< -o $@
+
+# Create preprocessed source for use in sending a bug report.
+%.i : %.c
+ $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
+
+
+# Target: clean project.
+clean: begin clean_list end
+
+clean_list :
+ @echo
+ @echo $(MSG_CLEANING)
+ $(REMOVE) $(TARGET).hex
+ $(REMOVE) $(TARGET).eep
+ $(REMOVE) $(TARGET).cof
+ $(REMOVE) $(TARGET).elf
+ $(REMOVE) $(TARGET).map
+ $(REMOVE) $(TARGET).sym
+ $(REMOVE) $(TARGET).lss
+ $(REMOVE) $(OBJ)
+ $(REMOVE) $(LST)
+ $(REMOVE) $(SRC:.c=.s)
+ $(REMOVE) $(SRC:.c=.d)
+ $(REMOVE) .dep/*
+
+
+
+# Include the dependency files.
+-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
+
+
+# Listing of phony targets.
+.PHONY : all begin finish end sizebefore sizeafter gccversion \
+build elf hex eep lss sym coff extcoff \
+clean clean_list program debug gdb-config
+
+install:
+ avrdude -c usbtiny -p m32 -B 1 -U flash:w:main.hex
+ avrdude -c usbtiny -p m32 -B 1 -U eeprom:w:main.eep
+
diff --git a/instructables/cube8/cube.h b/instructables/cube8/cube.h
new file mode 100644
index 0000000..6eb4a2d
--- /dev/null
+++ b/instructables/cube8/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
+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
+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/instructables/cube8/draw.c b/instructables/cube8/draw.c
new file mode 100644
index 0000000..3cb30e0
--- /dev/null
+++ b/instructables/cube8/draw.c
@@ -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(cube, 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, 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, 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, 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/instructables/cube8/draw.h b/instructables/cube8/draw.h
new file mode 100644
index 0000000..abe93d2
--- /dev/null
+++ b/instructables/cube8/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/instructables/cube8/effect.c b/instructables/cube8/effect.c
new file mode 100644
index 0000000..9e76d79
--- /dev/null
+++ b/instructables/cube8/effect.c
@@ -0,0 +1,1331 @@
+#include "effect.h"
+#include "draw.h"
+#include "font.h"
+#include <math.h>
+#include <avr/interrupt.h>
+
+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);
+ }
+
+}
+
+
+void effect_stringfly2(char * str)
+{
+ int x,y,i;
+ unsigned char chr[5];
+
+ while (*str)
+ {
+ font_getchar(*str++, chr);
+
+ // Put a character on the back of the cube
+ for (x = 0; x < 5; x++)
+ {
+ for (y = 0; y < 8; y++)
+ {
+ if ((chr[x] & (0x80>>y)))
+ {
+ setvoxel(7,x+2,y);
+ }
+ }
+ }
+
+ // Shift the entire contents of the cube forward by 6 steps
+ // before placing the next character
+ for (i = 0; i<6; i++)
+ {
+ delay_ms(1000);
+ shift(AXIS_X,-1);
+ }
+ }
+ // Shift the last character out of the cube.
+ for (i = 0; i<8; i++)
+ {
+ delay_ms(1000);
+ shift(AXIS_X,-1);
+ }
+
+}
+
+// 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 = rand()%4;
+ y = rand()%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
+ // rand()%2 returns either 0 or 1. multiplying by 7 gives either 0 or 7.
+ setvoxel(x,y,((rand()%2)*7));
+ }
+ }
+
+ for (i=0;i<iterations;i++)
+ {
+ // Pick a random x,y position
+ x = rand()%8;
+ y = rand()%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 = rand()%8;
+ x = rand()%8;
+ z = rand()%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 (rand()%3 == 0)
+ {
+ // Pick a random axis, and set the speed to a random number.
+ lol = rand()%3;
+ if (lol == 0)
+ dx = rand()%3 - 1;
+
+ if (lol == 1)
+ dy = rand()%3 - 1;
+
+ if (lol == 2)
+ dz = rand()%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 (rand()%3 == 1)
+ {
+ dx = 1;
+ } else
+ {
+ dx = 0;
+ }
+ }
+
+ // y axis 0 crash
+ if (dy == -1 && y == 0)
+ {
+ crash_y = 0x01;
+ if (rand()%3 == 1)
+ {
+ dy = 1;
+ } else
+ {
+ dy = 0;
+ }
+ }
+
+ // z axis 0 crash
+ if (dz == -1 && z == 0)
+ {
+ crash_z = 0x01;
+ if (rand()%3 == 1)
+ {
+ dz = 1;
+ } else
+ {
+ dz = 0;
+ }
+ }
+
+ // x axis 7 crash
+ if (dx == 1 && x == 7)
+ {
+ crash_x = 0x01;
+ if (rand()%3 == 1)
+ {
+ dx = -1;
+ } else
+ {
+ dx = 0;
+ }
+ }
+
+ // y axis 7 crash
+ if (dy == 1 && y == 7)
+ {
+ crash_y = 0x01;
+ if (rand()%3 == 1)
+ {
+ dy = -1;
+ } else
+ {
+ dy = 0;
+ }
+ }
+
+ // z azis 7 crash
+ if (dz == 1 && z == 7)
+ {
+ crash_z = 0x01;
+ if (rand()%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 (rand()%2 == 0)
+ {
+ dy = -1;
+ } else
+ {
+ dy = 1;
+ }
+ }
+ }
+ if (dz == 0)
+ {
+ if (z == 7)
+ {
+ dz = -1;
+ } else if (z == 0)
+ {
+ dz = 1;
+ } else
+ {
+ if (rand()%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 (rand()%2 == 0)
+ {
+ dx = -1;
+ } else
+ {
+ dx = 1;
+ }
+ }
+ }
+ if (dz == 0)
+ {
+ if (z == 3)
+ {
+ dz = -1;
+ } else if (z == 0)
+ {
+ dz = 1;
+ } else
+ {
+ if (rand()%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 (rand()%2 == 0)
+ {
+ dy = -1;
+ } else
+ {
+ dy = 1;
+ }
+ }
+ }
+ if (dx == 0)
+ {
+ if (x == 7)
+ {
+ dx = -1;
+ } else if (x == 0)
+ {
+ dx = 1;
+ } else
+ {
+ if (rand()%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 = rand()%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 = rand()%8;
+ y = rand()%8;
+ z = rand()%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 = rand()%4;
+
+ for (i=0; i < rnd_num;i++)
+ {
+ rnd_x = rand()%8;
+ rnd_y = rand()%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] = rand()%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[rand()%64] = rand()%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] = rand()%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 = rand()%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(rand()%8,rand()%8,rand()%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 = rand()%cube_size;
+ y = rand()%cube_size;
+
+ for (i=0; i<iterations; i++)
+ {
+ dx = ((rand()%3)-1);
+ dy = ((rand()%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_smileyspin (int count, int delay, char bitmap)
+{
+ unsigned char dybde[] = {0,1,2,3,4,5,6,7,1,1,2,3,4,5,6,6,2,2,3,3,4,4,5,5,3,3,3,3,4,4,4,4};
+ int d = 0;
+ int flip = 0;
+ int x, y, off;
+ for(int i = 0; i<count; i++)
+ {
+ flip = 0;
+ d = 0;
+ off = 0;
+ // front:
+ for (int s=0;s<7;s++){
+ if(!flip){
+ off++;
+ if (off == 4){
+ flip = 1;
+ off = 0;
+ }
+ } else {
+ off++;
+ }
+ for (x=0; x<8; x++)
+ {
+ d = 0;
+ for (y=0; y<8; y++)
+ {
+ if (font_getbitmappixel ( bitmap, 7-x, y)){
+ if (!flip)
+ setvoxel(y,dybde[8 * off + d++],x);
+ else
+ setvoxel(y,dybde[31 - 8 * off - d++],x);
+ } else {
+ d++;
+ }
+ }
+ }
+ delay_ms(delay);
+ fill(0x00);
+ }
+
+ // side:
+ off = 0;
+ flip = 0;
+ d = 0;
+ for (int s=0;s<7;s++){
+ if(!flip){
+ off++;
+ if (off == 4){
+ flip = 1;
+ off = 0;
+ }
+ } else {
+ off++;
+ }
+ for (x=0; x<8; x++)
+ {
+ d = 0;
+ for (y=0; y<8; y++)
+ {
+ if (font_getbitmappixel ( bitmap, 7-x, y)){
+ if (!flip)
+ setvoxel(dybde[8 * off + d++], 7 - y,x);
+ else
+ setvoxel(dybde[31 - 8 * off - d++],7 - y,x);
+ } else {
+ d++;
+ }
+ }
+ }
+ delay_ms(delay);
+ fill(0x00);
+ }
+
+
+ flip = 0;
+ d = 0;
+ off = 0;
+ // back:
+ for (int s=0;s<7;s++){
+ if(!flip){
+ off++;
+ if (off == 4){
+ flip = 1;
+ off = 0;
+ }
+ } else {
+ off++;
+ }
+ for (x=0; x<8; x++)
+ {
+ d = 0;
+ for (y=0; y<8; y++)
+ {
+ if (font_getbitmappixel ( bitmap, 7-x, 7-y)){
+ if (!flip)
+ setvoxel(y,dybde[8 * off + d++],x);
+ else
+ setvoxel(y,dybde[31 - 8 * off - d++],x);
+ } else {
+ d++;
+ }
+ }
+ }
+ delay_ms(delay);
+ fill(0x00);
+ }
+
+ // other side:
+ off = 0;
+ flip = 0;
+ d = 0;
+ for (int s=0;s<7;s++){
+ if(!flip){
+ off++;
+ if (off == 4){
+ flip = 1;
+ off = 0;
+ }
+ } else {
+ off++;
+ }
+ for (x=0; x<8; x++)
+ {
+ d = 0;
+ for (y=0; y<8; y++)
+ {
+ if (font_getbitmappixel ( bitmap, 7-x, 7-y)){
+ if (!flip)
+ setvoxel(dybde[8 * off + d++], 7 - y,x);
+ else
+ setvoxel(dybde[31 - 8 * off - d++],7 - y,x);
+ } else {
+ d++;
+ }
+ }
+ }
+ delay_ms(delay);
+ fill(0x00);
+ }
+
+ }
+}
+
+
+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);
+}
+
+void effect_rand_patharound (int iterations, int delay)
+{
+ int z, dz, i;
+ z = 4;
+ unsigned char path[28];
+
+ font_getpath(0,path,28);
+
+ for (i = 0; i < iterations; i++)
+ {
+ dz = ((rand()%3)-1);
+ z += dz;
+
+ if (z>7)
+ z = 7;
+
+ if (z<0)
+ z = 0;
+
+ effect_pathmove(path, 28);
+ setvoxel(0,7,z);
+ delay_ms(delay);
+ }
+}
+
+void effect_pathspiral (int iterations, int delay)
+{
+ int z, i;
+ z = 4;
+ unsigned char path[16];
+
+ font_getpath(1,path,16);
+
+ for (i = 0; i < iterations; i++)
+ {
+ setvoxel(4,0,i%8);
+ delay_ms(delay);
+ effect_pathmove(path, 28);
+
+ }
+}
+
+void effect_path_text (int delay, char *str)
+{
+ int z, i,ii;
+ z = 4;
+ unsigned char path[28];
+ font_getpath(0,path,28);
+
+ unsigned char chr[5];
+ unsigned char stripe;
+
+ while (*str)
+ {
+ //charfly(*str++, direction, axis, mode, delay);
+
+
+ font_getchar(*str++, chr);
+
+ for (ii=0;ii<5;ii++)
+ {
+ //stripe = pgm_read_byte(&font[(chr*5)+ii]);
+ stripe = chr[ii];
+
+ for (z=0;z<8;z++)
+ {
+ if ((stripe>>(7-z)) & 0x01)
+ {
+ setvoxel(0,7,z);
+ } else
+ {
+ clrvoxel(0,7,z);
+ }
+
+ }
+ effect_pathmove(path, 28);
+ delay_ms(delay);
+ }
+
+ effect_pathmove(path, 28);
+ delay_ms(delay);
+ }
+ for (i=0;i<28;i++)
+ {
+ effect_pathmove(path, 28);
+ delay_ms(delay);
+ }
+}
+
+void effect_path_bitmap (int delay, char bitmap, int iterations)
+{
+ int z, i, ii;
+ z = 4;
+ unsigned char path[28];
+ font_getpath(0,path,28);
+
+ for (i=0; i < iterations; i++)
+ {
+ for (ii=0;ii<8;ii++)
+ {
+ for (z=0;z<8;z++)
+ {
+ if (font_getbitmappixel(bitmap,(7-z),ii))
+ {
+ setvoxel(0,7,z);
+ } else
+ {
+ clrvoxel(0,7,z);
+ }
+
+ }
+ delay_ms(delay);
+ effect_pathmove(path, 28);
+ }
+
+ for (ii=0;ii<20;ii++)
+ {
+ delay_ms(delay);
+ effect_pathmove(path, 28);
+ }
+ }
+ for (ii=0;ii<10;ii++)
+ {
+ delay_ms(delay);
+ effect_pathmove(path, 28);
+ }
+}
+
+
+
diff --git a/instructables/cube8/effect.h b/instructables/cube8/effect.h
new file mode 100644
index 0000000..3398082
--- /dev/null
+++ b/instructables/cube8/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/instructables/cube8/font.c b/instructables/cube8/font.c
new file mode 100644
index 0000000..c67b098
--- /dev/null
+++ b/instructables/cube8/font.c
@@ -0,0 +1,104 @@
+#include "font.h"
+#include <avr/eeprom.h>
+
+volatile const unsigned char font[455] EEMEM = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x5f,0x00,0x00, // !
+ 0x00,0x03,0x00,0x03,0x00,0x14,0x7f,0x14,0x7f,0x14, // "#
+ 0x24,0x2a,0x7f,0x2a,0x12,0x23,0x13,0x08,0x64,0x62, // $%
+ 0x36,0x49,0x55,0x22,0x50,0x00,0x05,0x03,0x00,0x00, // &'
+ 0x00,0x1c,0x22,0x41,0x00,0x00,0x41,0x22,0x1c,0x00, // ()
+ 0x14,0x08,0x3e,0x08,0x14,0x08,0x08,0x3e,0x08,0x08, // *+
+ 0x00,0x50,0x30,0x00,0x00,0x08,0x08,0x08,0x08,0x08, // ,-
+ 0x00,0x60,0x60,0x00,0x00,0x20,0x10,0x08,0x04,0x02, // ./
+ 0x3e,0x51,0x49,0x45,0x3e,0x00,0x42,0x7f,0x40,0x00, // 01
+ 0x42,0x61,0x51,0x49,0x46,0x21,0x41,0x45,0x4b,0x31, // 23
+ 0x18,0x14,0x12,0x7f,0x10,0x27,0x45,0x45,0x45,0x39, // 45
+ 0x3c,0x4a,0x49,0x49,0x30,0x01,0x71,0x09,0x05,0x03, // 67
+ 0x36,0x49,0x49,0x49,0x36,0x06,0x49,0x49,0x29,0x1e, // 89
+ 0x00,0x36,0x36,0x00,0x00,0x00,0x56,0x36,0x00,0x00, // :;
+ 0x08,0x14,0x22,0x41,0x00,0x14,0x14,0x14,0x14,0x14, // <=
+ 0x00,0x41,0x22,0x14,0x08,0x02,0x01,0x51,0x09,0x06, // >?
+ 0x32,0x49,0x79,0x41,0x3e,0x7e,0x11,0x11,0x11,0x7e, // @A
+ 0x7f,0x49,0x49,0x49,0x36,0x3e,0x41,0x41,0x41,0x22, // BC
+ 0x7f,0x41,0x41,0x22,0x1c,0x7f,0x49,0x49,0x49,0x41, // DE
+ 0x7f,0x09,0x09,0x09,0x01,0x3e,0x41,0x49,0x49,0x7a, // FG
+ 0x7f,0x08,0x08,0x08,0x7f,0x00,0x41,0x7f,0x41,0x00, // HI
+ 0x20,0x40,0x41,0x3f,0x01,0x7f,0x08,0x14,0x22,0x41, // JK
+ 0x7f,0x40,0x40,0x40,0x40,0x7f,0x02,0x0c,0x02,0x7f, // LM
+ 0x7f,0x04,0x08,0x10,0x7f,0x3e,0x41,0x41,0x41,0x3e, // NO
+ 0x7f,0x09,0x09,0x09,0x06,0x3e,0x41,0x51,0x21,0x5e, // PQ
+ 0x7f,0x09,0x19,0x29,0x46,0x46,0x49,0x49,0x49,0x31, // RS
+ 0x01,0x01,0x7f,0x01,0x01,0x3f,0x40,0x40,0x40,0x3f, // TU
+ 0x1f,0x20,0x40,0x20,0x1f,0x3f,0x40,0x38,0x40,0x3f, // VW
+ 0x63,0x14,0x08,0x14,0x63,0x07,0x08,0x70,0x08,0x07, // XY
+ 0x61,0x51,0x49,0x45,0x43,0x00,0x7f,0x41,0x41,0x00, // Z[
+ 0x02,0x04,0x08,0x10,0x20,0x00,0x41,0x41,0x7f,0x00, // \]
+ 0x04,0x02,0x01,0x02,0x04,0x40,0x40,0x40,0x40,0x40, // ^_
+ 0x00,0x01,0x02,0x04,0x00,0x20,0x54,0x54,0x54,0x78, // `a
+ 0x7f,0x48,0x44,0x44,0x38,0x38,0x44,0x44,0x44,0x20, // bc
+ 0x38,0x44,0x44,0x48,0x7f,0x38,0x54,0x54,0x54,0x18, // de
+ 0x08,0x7e,0x09,0x01,0x02,0x0c,0x52,0x52,0x52,0x3e, // fg
+ 0x7f,0x08,0x04,0x04,0x78,0x00,0x44,0x7d,0x40,0x00, // hi
+ 0x20,0x40,0x44,0x3d,0x00,0x7f,0x10,0x28,0x44,0x00, // jk
+ 0x00,0x41,0x7f,0x40,0x00,0x7c,0x04,0x18,0x04,0x78, // lm
+ 0x7c,0x08,0x04,0x04,0x78,0x38,0x44,0x44,0x44,0x38, // no
+ 0x7c,0x14,0x14,0x14,0x08,0x08,0x14,0x14,0x18,0x7c, // pq
+ 0x7c,0x08,0x04,0x04,0x08,0x48,0x54,0x54,0x54,0x20, // rs
+ 0x04,0x3f,0x44,0x40,0x20,0x3c,0x40,0x40,0x20,0x7c, // tu
+ 0x1c,0x20,0x40,0x20,0x1c,0x3c,0x40,0x30,0x40,0x3c, // vw
+ 0x44,0x28,0x10,0x28,0x44,0x0c,0x50,0x50,0x50,0x3c, // xy
+ 0x44,0x64,0x54,0x4c,0x44 // z
+};
+
+
+volatile const unsigned char bitmaps[6][8] EEMEM = {
+ {0xc3,0xc3,0x00,0x18,0x18,0x81,0xff,0x7e}, // smiley 3 small
+ {0x3c,0x42,0x81,0x81,0xc3,0x24,0xa5,0xe7}, // Omega
+ {0x00,0x04,0x06,0xff,0xff,0x06,0x04,0x00}, // Arrow
+ {0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81}, // X
+ {0xBD,0xA1,0xA1,0xB9,0xA1,0xA1,0xA1,0x00}, // ifi
+ {0xEF,0x48,0x4B,0x49,0x4F,0x00,0x00,0x00} // TG
+};
+
+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,
+0x04,0x03,0x12,0x21,0x30,0x40,0x51,0x62,0x73,0x74,0x65,0x56,0x47,0x37,0x26,0x15}; // circle, len 16, offset 28
+
+void font_getpath (unsigned char path, unsigned char *destination, int length)
+{
+ int i;
+ int offset = 0;
+
+ if (path == 1)
+ offset=28;
+
+ for (i = 0; i < length; i++)
+ destination[i] = pgm_read_byte(&paths[i+offset]);
+}
+
+void font_getchar (char chr, unsigned char dst[5])
+{
+ uint8_t i;
+ chr -= 32; // our bitmap font starts at ascii char 32.
+
+ for (i = 0; i < 5; i++)
+ dst[i] = (unsigned char)eeprom_read_byte((uint8_t*)&font[(chr*5)+i]);
+}
+
+void font_getbitmap (char bitmap, unsigned char dst[8])
+{
+ int i;
+
+ for (i = 0; i < 8; i++)
+ dst[i] = (unsigned char)eeprom_read_byte((uint8_t*)&bitmaps[(uint8_t)bitmap][(uint8_t)i]);
+
+}
+
+unsigned char font_getbitmappixel ( char bitmap, char x, char y)
+{
+ uint8_t tmp = eeprom_read_byte((uint8_t*)&bitmaps[(uint8_t)bitmap][(uint8_t)x]);
+ return (tmp >> y) & 0x01;
+}
+
+
+
+
diff --git a/instructables/cube8/font.h b/instructables/cube8/font.h
new file mode 100644
index 0000000..006414b
--- /dev/null
+++ b/instructables/cube8/font.h
@@ -0,0 +1,13 @@
+#ifndef FONT_H
+#define FONT_H
+
+#include <avr/pgmspace.h>
+
+void font_getchar (char chr, unsigned char dst[5]);
+void font_getpath (unsigned char path, unsigned char *destination, int length);
+void font_getbitmap (char bitmap, unsigned char dst[8]);
+unsigned char font_getbitmappixel ( char bitmap, char x, char y);
+
+
+
+#endif
diff --git a/instructables/cube8/fuses.txt b/instructables/cube8/fuses.txt
new file mode 100644
index 0000000..f24e5f5
--- /dev/null
+++ b/instructables/cube8/fuses.txt
@@ -0,0 +1,6 @@
+
+lfuse: 0b11101111
+hfuse: 0b11001001
+
+
+
diff --git a/instructables/cube8/gameoflife.c b/instructables/cube8/gameoflife.c
new file mode 100644
index 0000000..0a3683a
--- /dev/null
+++ b/instructables/cube8/gameoflife.c
@@ -0,0 +1,135 @@
+#include <avr/io.h>
+#include "gameoflife.h"
+#include "cube.h"
+#include "draw.h"
+
+// Game of Life for the 4x4x4 and 8x8x8 led cube
+
+#define GOL_CREATE_MIN 3
+#define GOL_CREATE_MAX 3
+
+#define GOL_TERMINATE_LONELY 1
+#define GOL_TERMINATE_CROWDED 4
+
+#define GOL_X 8
+#define GOL_Y 8
+#define GOL_Z 8
+
+#define GOL_WRAP 0x01
+
+
+
+void gol_play (int iterations, uint16_t delay)
+{
+ int i;
+
+ for (i = 0; i < iterations; i++)
+ {
+ LED_PORT ^= LED_GREEN;
+
+ gol_nextgen();
+
+ if (gol_count_changes() == 0)
+ return;
+
+ tmp2cube();
+
+ delay_ms(delay);
+
+ //led_red(1);
+ }
+}
+
+void gol_nextgen (void)
+{
+ int x,y,z;
+ unsigned char neigh;
+
+ tmpfill(0x00);
+
+ for (x = 0; x < GOL_X; x++)
+ {
+ for (y = 0; y < GOL_Y; y++)
+ {
+ for (z = 0; z < GOL_Z; z++)
+ {
+ neigh = gol_count_neighbors(x, y, z);
+
+ // Current voxel is alive.
+ if (getvoxel(x,y,z) == 0x01)
+ {
+ if (neigh <= GOL_TERMINATE_LONELY)
+ {
+ tmpclrvoxel(x,y,z);
+ } else if(neigh >= GOL_TERMINATE_CROWDED)
+ {
+ tmpclrvoxel(x,y,z);
+ } else
+ {
+ tmpsetvoxel(x,y,z);
+ }
+ // Current voxel is dead.
+ } else
+ {
+ if (neigh >= GOL_CREATE_MIN && neigh <= GOL_CREATE_MAX)
+ tmpsetvoxel(x,y,z);
+ }
+ }
+ }
+ }
+}
+
+unsigned char gol_count_neighbors (int x, int y, int z)
+{
+ int ix, iy, iz; // offset 1 in each direction in each dimension
+ int nx, ny, nz; // neighbours address.
+
+ unsigned char neigh = 0; // number of alive neighbours.
+
+ for (ix = -1; ix < 2; ix++)
+ {
+ for (iy = -1; iy < 2; iy++)
+ {
+ for (iz = -1; iz < 2; iz++)
+ {
+ // Your not your own neighbour, exclude 0,0,0, offset.
+ if ( !(ix == 0 && iy == 0 && iz == 0) )
+ {
+ if (GOL_WRAP == 0x01)
+ {
+ nx = (x+ix)%GOL_X;
+ ny = (y+iy)%GOL_Y;
+ nz = (z+iz)%GOL_Z;
+ } else
+ {
+ nx = x+ix;
+ ny = y+iy;
+ nz = z+iz;
+ }
+
+ if ( getvoxel(nx, ny, nz) )
+ neigh++;
+ }
+ }
+ }
+ }
+ return neigh;
+}
+
+int gol_count_changes (void)
+{
+ int x,y;
+ int i = 0;
+
+ for (x = 0; x < GOL_X; x++)
+ {
+ for (y = 0; y < GOL_Y; y++)
+ {
+ if (fb[x][y] != cube[x][y])
+ i++;
+ }
+ }
+
+ return i;
+}
+
diff --git a/instructables/cube8/gameoflife.h b/instructables/cube8/gameoflife.h
new file mode 100644
index 0000000..e53b900
--- /dev/null
+++ b/instructables/cube8/gameoflife.h
@@ -0,0 +1,9 @@
+#ifndef GOL_H
+#define GOL_H
+
+void gol_play (int iterations, uint16_t delay);
+unsigned char gol_count_neighbors (int x, int y, int z);
+void gol_nextgen (void);
+int gol_count_changes (void);
+
+#endif
diff --git a/instructables/cube8/launch_effect.c b/instructables/cube8/launch_effect.c
new file mode 100644
index 0000000..01b56c6
--- /dev/null
+++ b/instructables/cube8/launch_effect.c
@@ -0,0 +1,182 @@
+#include "launch_effect.h"
+#include "effect.h"
+#include "draw.h"
+#include "gameoflife.h"
+
+void launch_effect (int effect)
+{
+ int i;
+ unsigned char ii;
+
+ fill(0x00);
+
+ switch (effect)
+ {
+ case 0x00:
+ effect_rain(100);
+ break;
+
+
+ case 1:
+ sendvoxels_rand_z(20,220,2000);
+ break;
+
+ case 2:
+ effect_random_filler(5,1);
+ effect_random_filler(5,0);
+ effect_random_filler(5,1);
+ effect_random_filler(5,0);
+ break;
+
+ case 3:
+ effect_z_updown(20,1000);
+ break;
+
+ case 4:
+ effect_wormsqueeze (2, AXIS_Z, -1, 100, 1000);
+ break;
+
+ case 5:
+ effect_blinky2();
+ break;
+
+ case 6:
+ for (ii=0;ii<8;ii++)
+ {
+ effect_box_shrink_grow (1, ii%4, ii & 0x04, 450);
+ }
+
+ effect_box_woopwoop(800,0);
+ effect_box_woopwoop(800,1);
+ effect_box_woopwoop(800,0);
+ effect_box_woopwoop(800,1);
+ break;
+
+ case 7:
+ effect_planboing (AXIS_Z, 400);
+ effect_planboing (AXIS_X, 400);
+ effect_planboing (AXIS_Y, 400);
+ effect_planboing (AXIS_Z, 400);
+ effect_planboing (AXIS_X, 400);
+ effect_planboing (AXIS_Y, 400);
+ fill(0x00);
+ break;
+
+ case 8:
+ fill(0x00);
+ effect_telcstairs(0,800,0xff);
+ effect_telcstairs(0,800,0x00);
+ effect_telcstairs(1,800,0xff);
+ effect_telcstairs(1,800,0xff);
+ break;
+
+ case 9:
+ effect_axis_updown_randsuspend(AXIS_Z, 550,5000,0);
+ effect_axis_updown_randsuspend(AXIS_Z, 550,5000,1);
+ effect_axis_updown_randsuspend(AXIS_Z, 550,5000,0);
+ effect_axis_updown_randsuspend(AXIS_Z, 550,5000,1);
+ effect_axis_updown_randsuspend(AXIS_X, 550,5000,0);
+ effect_axis_updown_randsuspend(AXIS_X, 550,5000,1);
+ effect_axis_updown_randsuspend(AXIS_Y, 550,5000,0);
+ effect_axis_updown_randsuspend(AXIS_Y, 550,5000,1);
+ break;
+
+ case 10:
+ effect_loadbar(700);
+ break;
+
+ case 11:
+ effect_wormsqueeze (1, AXIS_Z, 1, 100, 1000);
+ break;
+
+
+ case 12:
+ effect_stringfly2("INSTRUCTABLES");
+ break;
+
+ case 13:
+ fill(0x00);
+ // Create a random starting point for the Game of Life effect.
+ for (i = 0; i < 20;i++)
+ {
+ setvoxel(rand()%4,rand()%4,rand()%4);
+ }
+
+ gol_play(20, 400);
+ break;
+
+ case 14:
+ effect_boxside_randsend_parallel (AXIS_Z, 0 , 200,1);
+ delay_ms(1500);
+ effect_boxside_randsend_parallel (AXIS_Z, 1 , 200,1);
+ delay_ms(1500);
+
+ effect_boxside_randsend_parallel (AXIS_Z, 0 , 200,2);
+ delay_ms(1500);
+ effect_boxside_randsend_parallel (AXIS_Z, 1 , 200,2);
+ delay_ms(1500);
+
+ effect_boxside_randsend_parallel (AXIS_Y, 0 , 200,1);
+ delay_ms(1500);
+ effect_boxside_randsend_parallel (AXIS_Y, 1 , 200,1);
+ delay_ms(1500);
+ break;
+
+ case 15:
+ boingboing(250, 600, 0x01, 0x02);
+ break;
+
+ case 16:
+ effect_smileyspin(2,1000,0);
+ break;
+
+ case 17:
+ effect_pathspiral(100,500);
+ break;
+
+ case 18:
+ effect_path_bitmap(700,2,3);
+ break;
+
+ case 19:
+ effect_smileyspin(2,1000,1);
+ break;
+
+ case 20:
+ effect_path_text(1000,"TG");
+ break;
+
+ case 21:
+ effect_rand_patharound(200,500);
+ break;
+
+ case 22:
+ effect_wormsqueeze (1, AXIS_Z, -1, 100, 1000);
+ break;
+
+ case 23:
+ effect_smileyspin(2,1000,2);
+ break;
+
+ case 24:
+ effect_random_sparkle();
+ break;
+
+ case 25:
+ effect_wormsqueeze (1, AXIS_Z, -1, 100, 1000);
+ break;
+
+ case 26:
+ boingboing(250, 600, 0x01, 0x03);
+ break;
+
+ // In case the effect number is out of range:
+ default:
+ effect_stringfly2("FAIL");
+ break;
+
+
+
+ }
+}
+
diff --git a/instructables/cube8/launch_effect.h b/instructables/cube8/launch_effect.h
new file mode 100644
index 0000000..072822a
--- /dev/null
+++ b/instructables/cube8/launch_effect.h
@@ -0,0 +1,15 @@
+#ifndef LAUNCH_H
+#define LAUNCH_H
+
+#include "cube.h"
+
+// Total number of effects
+// Used in the main loop to loop through all the effects one by bone.
+// Set this number one higher than the highest number inside switch()
+// in launch_effect() in launch_effect.c
+#define EFFECTS_TOTAL 27
+
+void launch_effect (int effect);
+
+#endif
+
diff --git a/instructables/cube8/lisence.txt b/instructables/cube8/lisence.txt
new file mode 100644
index 0000000..812dab5
--- /dev/null
+++ b/instructables/cube8/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/instructables/cube8/main.c b/instructables/cube8/main.c
new file mode 100644
index 0000000..be31861
--- /dev/null
+++ b/instructables/cube8/main.c
@@ -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/instructables/cube8/main.h b/instructables/cube8/main.h
new file mode 100644
index 0000000..0a755f7
--- /dev/null
+++ b/instructables/cube8/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/instructables/cube_pc/3d.c b/instructables/cube_pc/3d.c
new file mode 100644
index 0000000..e1ddeaf
--- /dev/null
+++ b/instructables/cube_pc/3d.c
@@ -0,0 +1,344 @@
+#include "draw.h"
+#include "draw_3d.h"
+#include "3d.h"
+#include <math.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+void linespin (int iterations, int delay)
+{
+ float top_x, top_y, top_z, bot_x, bot_y, bot_z, sin_base;
+ float center_x, center_y;
+
+ center_x = 4;
+ center_y = 4;
+
+ int i, z;
+ for (i=0;i<iterations;i++)
+ {
+
+ //printf("Sin base %f \n",sin_base);
+
+ for (z = 0; z < 8; z++)
+ {
+
+ sin_base = (float)i/50 + (float)z/(10+(7*sin((float)i/200)));
+
+ top_x = center_x + sin(sin_base)*5;
+ top_y = center_x + cos(sin_base)*5;
+ //top_z = center_x + cos(sin_base/100)*2.5;
+
+ bot_x = center_x + sin(sin_base+3.14)*10;
+ bot_y = center_x + cos(sin_base+3.14)*10;
+ //bot_z = 7-top_z;
+
+ bot_z = z;
+ top_z = z;
+
+ //setvoxel((int) top_x, (int) top_y, 7);
+ //setvoxel((int) bot_x, (int) bot_y, 0);
+
+ //printf("P1: %i %i %i P2: %i %i %i \n", (int) top_x, (int) top_y, 7, (int) bot_x, (int) bot_y, 0);
+
+ //line_3d((int) top_x, (int) top_y, (int) top_z, (int) bot_x, (int) bot_y, (int) bot_z);
+ line_3d((int) top_z, (int) top_x, (int) top_y, (int) bot_z, (int) bot_x, (int) bot_y);
+ }
+
+ delay_ms(120);
+ fill(0x00);
+ }
+
+}
+
+void sinelines (int iterations, int delay)
+{
+ int i,x;
+
+ float left, right, sine_base, x_dividor,ripple_height;
+
+ for (i=0; i<iterations; i++)
+ {
+ for (x=0; x<8 ;x++)
+ {
+ x_dividor = 2 + sin((float)i/100)+1;
+ ripple_height = 3 + (sin((float)i/200)+1)*6;
+
+ sine_base = (float) i/40 + (float) x/x_dividor;
+
+ left = 4 + sin(sine_base)*ripple_height;
+ right = 4 + cos(sine_base)*ripple_height;
+ right = 7-left;
+
+ //printf("%i %i \n", (int) left, (int) right);
+
+ line_3d(0-3, x, (int) left, 7+3, x, (int) right);
+ //line_3d((int) right, 7, x);
+ }
+
+ delay_ms(delay);
+ fill(0x00);
+ }
+}
+
+// Display a sine wave running out from the center of the cube.
+void ripples (int iterations, int delay)
+{
+ float origin_x, origin_y, distance, height, ripple_interval;
+ int x,y,i;
+
+ fill(0x00);
+
+ for (i=0;i<iterations;i++)
+ {
+ for (x=0;x<8;x++)
+ {
+ for (y=0;y<8;y++)
+ {
+ distance = distance2d(3.5,3.5,x,y)/9.899495*8;
+ //distance = distance2d(3.5,3.5,x,y);
+ ripple_interval =1.3;
+ height = 4+sin(distance/ripple_interval+(float) i/50)*4;
+
+ setvoxel(x,y,(int) height);
+ }
+ }
+ delay_ms(delay);
+ fill(0x00);
+ }
+}
+
+void sidewaves (int iterations, int delay)
+{
+ float origin_x, origin_y, distance, height, ripple_interval;
+ int x,y,i;
+
+ fill(0x00);
+
+ for (i=0;i<iterations;i++)
+ {
+
+ origin_x = 3.5+sin((float)i/500)*4;
+ origin_y = 3.5+cos((float)i/500)*4;
+
+ for (x=0;x<8;x++)
+ {
+ for (y=0;y<8;y++)
+ {
+ distance = distance2d(origin_x,origin_y,x,y)/9.899495*8;
+ ripple_interval =2;
+ height = 4+sin(distance/ripple_interval+(float) i/50)*3.6;
+
+ setvoxel(x,y,(int) height);
+ setvoxel(x,y,(int) height);
+
+ }
+ }
+
+ delay_ms(delay);
+ fill(0x00);
+ }
+}
+
+void spheremove (int iterations, int delay)
+{
+
+ fill(0x00);
+
+ float origin_x, origin_y, origin_z, distance, diameter;
+
+ origin_x = 0;
+ origin_y = 3.5;
+ origin_z = 3.5;
+
+ diameter = 3;
+
+ int x, y, z, i;
+
+ for (i=0; i<iterations; i++)
+ {
+ origin_x = 3.5+sin((float)i/50)*2.5;
+ origin_y = 3.5+cos((float)i/50)*2.5;
+ origin_z = 3.5+cos((float)i/30)*2;
+
+ diameter = 2+sin((float)i/150);
+
+ for (x=0; x<8; x++)
+ {
+ for (y=0; y<8; y++)
+ {
+ for (z=0; z<8; z++)
+ {
+ distance = distance3d(x,y,z, origin_x, origin_y, origin_z);
+ //printf("Distance: %f \n", distance);
+
+ if (distance>diameter && distance<diameter+1)
+ {
+ setvoxel(x,y,z);
+ }
+ }
+ }
+ }
+
+ delay_ms(delay);
+ fill(0x00);
+ }
+
+}
+
+void fireworks (int iterations, int n, int delay)
+{
+ fill(0x00);
+
+ int i,f,e;
+
+ float origin_x = 3;
+ float origin_y = 3;
+ float origin_z = 3;
+
+ int rand_y, rand_x, rand_z;
+
+ float slowrate, gravity;
+
+ // Particles and their position, x,y,z and their movement, dx, dy, dz
+ float particles[n][6];
+
+ for (i=0; i<iterations; i++)
+ {
+
+ origin_x = rand()%4;
+ origin_y = rand()%4;
+ origin_z = rand()%2;
+ origin_z +=5;
+ origin_x +=2;
+ origin_y +=2;
+
+ // shoot a particle up in the air
+ for (e=0;e<origin_z;e++)
+ {
+ setvoxel(origin_x,origin_y,e);
+ delay_ms(600+500*e);
+ fill(0x00);
+ }
+
+ // Fill particle array
+ for (f=0; f<n; f++)
+ {
+ // Position
+ particles[f][0] = origin_x;
+ particles[f][1] = origin_y;
+ particles[f][2] = origin_z;
+
+ rand_x = rand()%200;
+ rand_y = rand()%200;
+ rand_z = rand()%200;
+
+ // Movement
+ particles[f][3] = 1-(float)rand_x/100; // dx
+ particles[f][4] = 1-(float)rand_y/100; // dy
+ particles[f][5] = 1-(float)rand_z/100; // dz
+ }
+
+ // explode
+ for (e=0; e<25; e++)
+ {
+ slowrate = 1+tan((e+0.1)/20)*10;
+
+ gravity = tan((e+0.1)/20)/2;
+
+ for (f=0; f<n; f++)
+ {
+ particles[f][0] += particles[f][3]/slowrate;
+ particles[f][1] += particles[f][4]/slowrate;
+ particles[f][2] += particles[f][5]/slowrate;
+ particles[f][2] -= gravity;
+
+ setvoxel(particles[f][0],particles[f][1],particles[f][2]);
+
+
+ }
+
+ delay_ms(delay);
+ fill(0x00);
+ }
+
+ }
+
+}
+
+void effect_rotate_random_pixels (int iterations, int delay, int pixels)
+{
+ vertex points[pixels];
+ vertex rotated[pixels];
+
+ float fy, fx, fz;
+ int x,y,z;
+ int i,p;
+
+ float rot_x = 0;
+ float rot_y = 0;
+ float rot_z = 0;
+ vertex cube_center = {3.5, 3.5, 3.5};
+
+ for (i=0; i<pixels; i++)
+ {
+ x = rand()%1200-200;
+ y = rand()%1200-200;
+ z = rand()%1200-200;
+ fx = (float)x/100;
+ fy = (float)y/100;
+ fz = (float)z/100;
+
+ points[i].x = fx;
+ points[i].y = fy;
+ points[i].z = fz;
+
+ setvoxel((int)points[i].x, (int)points[i].y, (int)points[i].z);
+ delay_ms(100);
+ }
+ delay_ms(10000);
+
+ for (i=0; i<iterations; i++)
+ {
+ rot_x = (float)i/75;
+ rot_y = (float)i/150;
+ rot_z = (float)i/200;
+
+ for (p=0; p<pixels; p++)
+ {
+ rotated[p] = point_rotate_around_point (points[p], cube_center, rot_x, rot_y, rot_z);
+ }
+
+ fill(0x00);
+ for (p=0; p<pixels; p++)
+ {
+ setvoxel((int)rotated[p].x, (int)rotated[p].y, (int)rotated[p].z);
+ }
+
+ delay_ms(delay);
+ }
+
+ fill(0x00);
+}
+
+
+float distance2d (float x1, float y1, float x2, float y2)
+{
+ float dist;
+ dist = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
+
+ return dist;
+}
+
+float distance3d (float x1, float y1, float z1, float x2, float y2, float z2)
+{
+ float dist;
+ dist = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2));
+
+ return dist;
+}
+
+
+
+
diff --git a/instructables/cube_pc/3d.h b/instructables/cube_pc/3d.h
new file mode 100644
index 0000000..61beaca
--- /dev/null
+++ b/instructables/cube_pc/3d.h
@@ -0,0 +1,16 @@
+#ifndef EFFECT3D_H
+#define EFFECT3D_H
+
+
+void effect_rotate_random_pixels (int iterations, int delay, int pixels);
+
+void linespin (int iterations, int delay);
+
+void ripples (int iterations, int delay);
+float distance2d (float x1, float y1, float x2, float y2);
+float distance3d (float x1, float y1, float z1, float x2, float y2, float z2);
+
+
+//typedef struct {float x; float y; float z;} vertex;
+
+#endif
diff --git a/instructables/cube_pc/Makefile b/instructables/cube_pc/Makefile
new file mode 100644
index 0000000..7063fee
--- /dev/null
+++ b/instructables/cube_pc/Makefile
@@ -0,0 +1,4 @@
+
+cube: main.c cube.c draw.c effect.c font.c 3d.c draw_3d.c gameoflife.c launch_effect.c
+ gcc -lpthread -lm -o cube main.c cube.c draw.c effect.c font.c 3d.c draw_3d.c gameoflife.c launch_effect.c
+
diff --git a/instructables/cube_pc/cube b/instructables/cube_pc/cube
new file mode 100755
index 0000000..0439329
--- /dev/null
+++ b/instructables/cube_pc/cube
Binary files differ
diff --git a/instructables/cube_pc/cube.c b/instructables/cube_pc/cube.c
new file mode 100644
index 0000000..e0066e4
--- /dev/null
+++ b/instructables/cube_pc/cube.c
@@ -0,0 +1,83 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "cube.h"
+#include <termios.h>
+#include <fcntl.h>
+#include <strings.h>
+
+void cube_push (unsigned char data[8][8])
+{
+ int x,y,i;
+
+ i= 0;
+
+ unsigned char buffer[200];
+
+ buffer[i++] = 0xff; // escape
+ buffer[i++] = 0x00; // reset to 0,0
+
+ for (x=0;x<8;x++)
+ {
+ for (y=0;y<8;y++)
+ {
+ buffer[i++] = data[x][y];
+ if (data[x][y] == 0xff)
+ {
+ buffer[i++] = data[x][y];
+ }
+ }
+ }
+
+ write(tty,&buffer,i);
+}
+
+int cube_init (const char* tty_path)
+{
+
+ //FILE *ftty;
+
+ //ftty = fopen("/dev/ttyUSB0","a");
+
+
+ struct termios io;
+
+ //char *tty_path = "/dev/ttyUSB0";
+ //char *tty_path = "/dev/ttyUSB1";
+
+ //tty = open(tty_path, O_RDWR | O_NOCTTY | O_NDELAY); // <- ORIGINAL
+ tty = open(tty_path, O_RDWR);
+
+
+ if (tty <0) {perror(tty_path); exit(-1); }
+
+ bzero(&io, sizeof(io));
+ //io.c_cflag = B2400 | CRTSCTS | CS8 | CLOCAL | CREAD;
+ //io.c_cflag = B2400 | CRTSCTS | PARENB | CS8 | CLOCAL | CREAD;
+ io.c_cflag = B38400 | PARENB | CS8 | CLOCAL | CREAD;
+ //io.c_cflag = B19200 | PARENB | CS8 | CLOCAL | CREAD;
+ io.c_iflag = IGNPAR;
+ io.c_oflag = 0;
+
+ // set input mode (non-canonical, no echo,...)
+ io.c_lflag &= ~OPOST;
+ //io.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
+
+ io.c_cc[VTIME] = 0; // inter-character timer unused
+ io.c_cc[VMIN] = 0; // blocking read until 5 chars received
+
+ // Flush buffer
+ tcflush(tty, TCIFLUSH);
+
+ //cfsetospeed(&io, B1000000);
+ //cfsetispeed(&io, B1000000);
+
+ // write config to tty
+ tcsetattr(tty,TCSANOW,&io);
+
+
+ //fcntl(tty, F_SETFL, 0);
+
+
+
+ return 1;
+}
diff --git a/instructables/cube_pc/cube.h b/instructables/cube_pc/cube.h
new file mode 100644
index 0000000..bac730e
--- /dev/null
+++ b/instructables/cube_pc/cube.h
@@ -0,0 +1,25 @@
+
+#define AXIS_X 0x78
+#define AXIS_Y 0x79
+#define AXIS_Z 0x7a
+
+#define CUBE_SIZE 8
+
+int LED_PORT;
+int LED_RED;
+int LED_GREEN;
+
+volatile unsigned char cube[8][8];
+volatile unsigned char rs232_cube[8][8];
+unsigned char fb[8][8];
+
+int tty;
+
+// FILE *ftty;
+
+// func dsfs
+void cube_putchar (unsigned char data);
+int cube_init (const char* tty_path);
+void cube_push (unsigned char data[8][8]);
+
+
diff --git a/instructables/cube_pc/draw.c b/instructables/cube_pc/draw.c
new file mode 100644
index 0000000..549d109
--- /dev/null
+++ b/instructables/cube_pc/draw.c
@@ -0,0 +1,682 @@
+#include "draw.h"
+#include "draw_3d.h"
+#include <string.h>
+
+
+void setvoxel(int x, int y, int z)
+{
+ if (inrange(x,y,z))
+ cube[y][z] |= (1 << x);
+
+}
+
+void tmpsetvoxel(int x, int y, int z)
+{
+ if (inrange(x,y,z))
+ fb[y][z] |= (1 << x);
+}
+
+void clrvoxel(int x, int y, int z)
+{
+ if (inrange(x,y,z))
+ cube[y][z] &= ~(1 << x);
+}
+
+void tmpclrvoxel(int x, int y, int z)
+{
+ if (inrange(x,y,z))
+ fb[y][z] &= ~(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 < 8 && y >= 0 && y < 8 && z >= 0 && z < 8)
+ {
+ return 0x01;
+ } else
+ {
+ // One of the coordinates was outside the cube.
+ return 0x00;
+ }
+}
+
+// Get the current status of a voxel
+unsigned char getvoxel(int x, int y, int z)
+{
+ if (inrange(x,y,z))
+ {
+ if (cube[y][z] & (1 << x))
+ {
+ return 0x01;
+ } else
+ {
+ return 0x00;
+ }
+ } else
+ {
+ return 0x00;
+ }
+}
+
+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[y][z] ^= (1 << x);
+}
+
+// Makes sure x1 is alwas smaller than x2
+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;
+}
+
+void setplane_z (int z)
+{
+ int i;
+ if (z>=0 && z<8)
+ {
+ for (i=0;i<8;i++)
+ cube[i][z] = 0xff;
+ }
+}
+
+
+void clrplane_z (int z)
+{
+ int i;
+ if (z>=0 && z<8)
+ {
+ for (i=0;i<8;i++)
+ cube[i][z] = 0x00;
+ }
+}
+
+void setplane_x (int x)
+{
+ int z;
+ int y;
+ if (x>=0 && x<8)
+ {
+ for (z=0;z<8;z++)
+ {
+ for (y=0;y<8;y++)
+ {
+ cube[y][z] |= (1 << x);
+ }
+ }
+ }
+}
+
+void clrplane_x (int x)
+{
+ int z;
+ int y;
+ if (x>=0 && x<8)
+ {
+ for (z=0;z<8;z++)
+ {
+ for (y=0;y<8;y++)
+ {
+ cube[y][z] &= ~(1 << x);
+ }
+ }
+ }
+}
+
+void setplane_y (int y)
+{
+ int z;
+ if (y>=0 && y<8)
+ {
+ for (z=0;z<8;z++)
+ cube[y][z] = 0xff;
+ }
+}
+
+void clrplane_y (int y)
+{
+ int z;
+ if (y>=0 && y<8)
+ {
+ for (z=0;z<8;z++)
+ cube[y][z] = 0x00;
+ }
+}
+
+
+void fill (unsigned char pattern)
+{
+ int z;
+ int y;
+ for (z=0;z<8;z++)
+ {
+ for (y=0;y<8;y++)
+ {
+ cube[y][z] = pattern;
+ }
+ }
+}
+
+void tmpfill (unsigned char pattern)
+{
+ int z;
+ int y;
+ for (z=0;z<8;z++)
+ {
+ for (y=0;y<8;y++)
+ {
+ fb[z][y] = pattern;
+ }
+ }
+}
+
+
+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[iy][iz] |= byteline(x1,x2);
+ }
+ }
+
+}
+
+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[iy][iz] = byteline(x1,x2);
+ } else
+ {
+ cube[iy][iz] |= ((0x01 << x1) | (0x01 << x2));
+ }
+ }
+ }
+
+}
+
+
+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[y1][z1] = byteline(x1,x2);
+ cube[y1][z2] = byteline(x1,x2);
+ cube[y2][z1] = byteline(x1,x2);
+ cube[y2][z2] = 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)));
+}
+
+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;
+}
+
+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 (x = x1; x<=x2;x++)
+ {
+ y = (xy*(x-x1))+y1;
+ z = (xz*(x-x1))+z1;
+ setvoxel(x,y,z);
+ }
+
+}
+
+void delay_ms(int x)
+{
+ memcpy(rs232_cube, cube, 64);
+ usleep(x*80);
+}
+
+// Copies the contents of fb (temp cube buffer) into the rendering buffer
+void tmp2cube (void)
+{
+ int y, z;
+ for (z=0;z<8;z++)
+ {
+ for (y=0;y<8;y++)
+ {
+ cube[y][z] = fb[y][z];
+ }
+ }
+}
+
+void shift (char axis, int direction)
+{
+ int i, x ,y;
+ int ii, iii;
+ int state;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (direction == -1)
+ {
+ ii = i;
+ } else
+ {
+ ii = (7-i);
+ }
+
+
+ for (x = 0; x < 8; x++)
+ {
+ for (y = 0; y < 8; 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,x,y,state);
+ }
+ }
+ }
+ }
+
+ if (direction == -1)
+ {
+ i = 7;
+ } else
+ {
+ i = 0;
+ }
+
+ for (x = 0; x < 8; x++)
+ {
+ for (y = 0; y < 8; 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);
+ }
+ }
+}
+
+
+
+void line_3d (int x1, int y1, int z1, int x2, int y2, int z2)
+{
+ int i, dx, dy, dz, l, m, n, x_inc, y_inc, z_inc,
+ err_1, err_2, dx2, dy2, dz2;
+ int pixel[3];
+ pixel[0] = x1;
+ pixel[1] = y1;
+ pixel[2] = z1;
+ dx = x2 - x1;
+ dy = y2 - y1;
+ dz = z2 - z1;
+ x_inc = (dx < 0) ? -1 : 1;
+ l = abs(dx);
+ y_inc = (dy < 0) ? -1 : 1;
+ m = abs(dy);
+ z_inc = (dz < 0) ? -1 : 1;
+ n = abs(dz);
+ dx2 = l << 1;
+ dy2 = m << 1;
+ dz2 = n << 1;
+ if ((l >= m) && (l >= n)) {
+ err_1 = dy2 - l;
+ err_2 = dz2 - l;
+ for (i = 0; i < l; i++) {
+ //PUT_PIXEL(pixel);
+ setvoxel(pixel[0],pixel[1],pixel[2]);
+ //printf("Setting %i %i %i \n", pixel[0],pixel[1],pixel[2]);
+ if (err_1 > 0) {
+ pixel[1] += y_inc;
+ err_1 -= dx2;
+ }
+ if (err_2 > 0) {
+ pixel[2] += z_inc;
+ err_2 -= dx2;
+ }
+ err_1 += dy2;
+ err_2 += dz2;
+ pixel[0] += x_inc;
+ }
+ } else if ((m >= l) && (m >= n)) {
+ err_1 = dx2 - m;
+ err_2 = dz2 - m;
+ for (i = 0; i < m; i++) {
+ //PUT_PIXEL(pixel);
+ setvoxel(pixel[0],pixel[1],pixel[2]);
+ //printf("Setting %i %i %i \n", pixel[0],pixel[1],pixel[2]);
+ if (err_1 > 0) {
+ pixel[0] += x_inc;
+ err_1 -= dy2;
+ }
+ if (err_2 > 0) {
+ pixel[2] += z_inc;
+ err_2 -= dy2;
+ }
+ err_1 += dx2;
+ err_2 += dz2;
+ pixel[1] += y_inc;
+ }
+ } else {
+ err_1 = dy2 - n;
+ err_2 = dx2 - n;
+ for (i = 0; i < n; i++) {
+ setvoxel(pixel[0],pixel[1],pixel[2]);
+ //printf("Setting %i %i %i \n", pixel[0],pixel[1],pixel[2]);
+ //PUT_PIXEL(pixel);
+ if (err_1 > 0) {
+ pixel[1] += y_inc;
+ err_1 -= dz2;
+ }
+ if (err_2 > 0) {
+ pixel[0] += x_inc;
+ err_2 -= dz2;
+ }
+ err_1 += dy2;
+ err_2 += dx2;
+ pixel[2] += z_inc;
+ }
+ }
+ setvoxel(pixel[0],pixel[1],pixel[2]);
+ //printf("Setting %i %i %i \n", pixel[0],pixel[1],pixel[2]);
+ //PUT_PIXEL(pixel);
+}
+
+
+void line_3d_float (vertex point1, vertex point2)
+{
+ float x1, y1, z1, x2, y2, z2;
+
+ x1 = point1.x;
+ y1 = point1.y;
+ z1 = point1.z;
+ x2 = point2.x;
+ y2 = point2.y;
+ z2 = point2.z;
+
+
+ float i;
+ float dx, dy, dz, l, m, n, x_inc, y_inc, z_inc,
+ err_1, err_2, dx2, dy2, dz2;
+ float pixel[3];
+ pixel[0] = x1;
+ pixel[1] = y1;
+ pixel[2] = z1;
+ dx = x2 - x1;
+ dy = y2 - y1;
+ dz = z2 - z1;
+ x_inc = (dx < 0) ? -1 : 1;
+ l = abs(dx);
+ y_inc = (dy < 0) ? -1 : 1;
+ m = abs(dy);
+ z_inc = (dz < 0) ? -1 : 1;
+ n = abs(dz);
+ dx2 = l*l;
+ dy2 = m*m;
+ dz2 = n*n;
+ if ((l >= m) && (l >= n)) {
+ err_1 = dy2 - l;
+ err_2 = dz2 - l;
+ for (i = 0; i < l; i++) {
+ //PUT_PIXEL(pixel);
+ setvoxel((int)pixel[0],(int)pixel[1],(int)pixel[2]);
+ //printf("Setting %i %i %i \n", pixel[0],pixel[1],pixel[2]);
+ if (err_1 > 0) {
+ pixel[1] += y_inc;
+ err_1 -= dx2;
+ }
+ if (err_2 > 0) {
+ pixel[2] += z_inc;
+ err_2 -= dx2;
+ }
+ err_1 += dy2;
+ err_2 += dz2;
+ pixel[0] += x_inc;
+ }
+ } else if ((m >= l) && (m >= n)) {
+ err_1 = dx2 - m;
+ err_2 = dz2 - m;
+ for (i = 0; i < m; i++) {
+ //PUT_PIXEL(pixel);
+ //setvoxel(pixel[0]/scale,pixel[1]/scale,pixel[2]/scale);
+ setvoxel((int)pixel[0],(int)pixel[1],(int)pixel[2]);
+ //printf("Setting %i %i %i \n", pixel[0],pixel[1],pixel[2]);
+ if (err_1 > 0) {
+ pixel[0] += x_inc;
+ err_1 -= dy2;
+ }
+ if (err_2 > 0) {
+ pixel[2] += z_inc;
+ err_2 -= dy2;
+ }
+ err_1 += dx2;
+ err_2 += dz2;
+ pixel[1] += y_inc;
+ }
+ } else {
+ err_1 = dy2 - n;
+ err_2 = dx2 - n;
+ for (i = 0; i < n; i++) {
+ //setvoxel(pixel[0]/scale,pixel[1]/scale,pixel[2]/scale);
+ setvoxel((int)pixel[0],(int)pixel[1],(int)pixel[2]);
+ //printf("Setting %i %i %i \n", pixel[0],pixel[1],pixel[2]);
+ //PUT_PIXEL(pixel);
+ if (err_1 > 0) {
+ pixel[1] += y_inc;
+ err_1 -= dz2;
+ }
+ if (err_2 > 0) {
+ pixel[0] += x_inc;
+ err_2 -= dz2;
+ }
+ err_1 += dy2;
+ err_2 += dx2;
+ pixel[2] += z_inc;
+ }
+ }
+ //setvoxel(pixel[0]/scale,pixel[1]/scale,pixel[2]/scale);
+ setvoxel((int)pixel[0],(int)pixel[1],(int)pixel[2]);
+ //printf("Setting %i %i %i \n", pixel[0],pixel[1],pixel[2]);
+ //PUT_PIXEL(pixel);
+}
+
+// Flip the cube 180 degrees along the x axis
+void mirror_x (void)
+{
+ unsigned char buffer[8][8];
+ unsigned char y,z;
+
+ memcpy(buffer, cube, 64); // copy the current cube into a buffer.
+
+ fill(0x00);
+
+ for (z=0; z<8; z++)
+ {
+ for (y=0; y<8; y++)
+ {
+ cube[y][z] = flipbyte(buffer[y][z]);
+ }
+ }
+}
+// Flip the cube 180 degrees along the y axis.
+void mirror_y (void)
+{
+ unsigned char buffer[8][8];
+ unsigned char x,y,z;
+
+ memcpy(buffer, cube, 64); // copy the current cube into a buffer.
+
+ fill(0x00);
+ for (z=0; z<8; z++)
+ {
+ for (y=0; y<8; y++)
+ {
+ for (x=0; x<8; x++)
+ {
+ if (buffer[y][z] & (0x01 << x))
+ setvoxel(x,7-y,z);
+ }
+ }
+ }
+
+}
+// flip the cube 180 degrees along the z axis
+void mirror_z (void)
+{
+ unsigned char buffer[8][8];
+ unsigned char z, y;
+
+ memcpy(buffer, cube, 64); // copy the current cube into a buffer.
+
+ for (y=0; y<8; y++)
+ {
+ for (z=0; z<8; z++)
+ {
+ cube[7-z][y] = buffer[y][z];
+ }
+ }
+}
+
+
+
+
diff --git a/instructables/cube_pc/draw.h b/instructables/cube_pc/draw.h
new file mode 100644
index 0000000..a1c7e85
--- /dev/null
+++ b/instructables/cube_pc/draw.h
@@ -0,0 +1,52 @@
+#ifndef DRAW_H
+#define DRAW_H
+
+
+#include "cube.h"
+
+extern const unsigned char font[480];
+
+
+
+void delay_ms (int 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 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, int delay);
+void strfly (char * str, int direction, char axis, int mode, int delay, int 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);
+
+#endif
+
diff --git a/instructables/cube_pc/draw.lst b/instructables/cube_pc/draw.lst
new file mode 100644
index 0000000..8881094
--- /dev/null
+++ b/instructables/cube_pc/draw.lst
@@ -0,0 +1,2472 @@
+ 1 .file "draw.c"
+ 2 __SREG__ = 0x3f
+ 3 __SP_H__ = 0x3e
+ 4 __SP_L__ = 0x3d
+ 5 __CCP__ = 0x34
+ 6 __tmp_reg__ = 0
+ 7 __zero_reg__ = 1
+ 8 .global __do_copy_data
+ 9 .global __do_clear_bss
+ 17 .Ltext0:
+ 18 .global setvoxel
+ 20 setvoxel:
+ 21 .LFB2:
+ 22 .LM1:
+ 23 .LVL0:
+ 24 /* prologue: function */
+ 25 /* frame size = 0 */
+ 26 0000 DC01 movw r26,r24
+ 27 .LBB94:
+ 28 .LBB95:
+ 29 .LM2:
+ 30 0002 8830 cpi r24,8
+ 31 0004 9105 cpc r25,__zero_reg__
+ 32 0006 00F4 brsh .L3
+ 33 0008 77FD sbrc r23,7
+ 34 000a 00C0 rjmp .L3
+ 35 000c 6830 cpi r22,8
+ 36 000e 7105 cpc r23,__zero_reg__
+ 37 0010 04F4 brge .L3
+ 38 0012 57FD sbrc r21,7
+ 39 0014 00C0 rjmp .L3
+ 40 0016 4830 cpi r20,8
+ 41 0018 5105 cpc r21,__zero_reg__
+ 42 001a 04F4 brge .L3
+ 43 .LBE95:
+ 44 .LBE94:
+ 45 .LM3:
+ 46 001c FA01 movw r30,r20
+ 47 001e 83E0 ldi r24,3
+ 48 0020 EE0F 1: lsl r30
+ 49 0022 FF1F rol r31
+ 50 0024 8A95 dec r24
+ 51 0026 01F4 brne 1b
+ 52 .LVL1:
+ 53 0028 E60F add r30,r22
+ 54 002a F71F adc r31,r23
+ 55 002c E050 subi r30,lo8(-(cube))
+ 56 002e F040 sbci r31,hi8(-(cube))
+ 57 0030 2081 ld r18,Z
+ 58 0032 81E0 ldi r24,lo8(1)
+ 59 0034 90E0 ldi r25,hi8(1)
+ 60 0036 00C0 rjmp 2f
+ 61 0038 880F 1: lsl r24
+ 62 003a 991F rol r25
+ 63 003c AA95 2: dec r26
+ 64 003e 02F4 brpl 1b
+ 65 0040 282B or r18,r24
+ 66 0042 2083 st Z,r18
+ 67 .LVL2:
+ 68 .L3:
+ 69 0044 0895 ret
+ 70 .LFE2:
+ 72 .global tmpsetvoxel
+ 74 tmpsetvoxel:
+ 75 .LFB3:
+ 76 .LM4:
+ 77 .LVL3:
+ 78 /* prologue: function */
+ 79 /* frame size = 0 */
+ 80 0046 DC01 movw r26,r24
+ 81 .LBB96:
+ 82 .LBB97:
+ 83 .LM5:
+ 84 0048 8830 cpi r24,8
+ 85 004a 9105 cpc r25,__zero_reg__
+ 86 004c 00F4 brsh .L6
+ 87 004e 77FD sbrc r23,7
+ 88 0050 00C0 rjmp .L6
+ 89 0052 6830 cpi r22,8
+ 90 0054 7105 cpc r23,__zero_reg__
+ 91 0056 04F4 brge .L6
+ 92 0058 57FD sbrc r21,7
+ 93 005a 00C0 rjmp .L6
+ 94 005c 4830 cpi r20,8
+ 95 005e 5105 cpc r21,__zero_reg__
+ 96 0060 04F4 brge .L6
+ 97 .LBE97:
+ 98 .LBE96:
+ 99 .LM6:
+ 100 0062 FA01 movw r30,r20
+ 101 0064 93E0 ldi r25,3
+ 102 0066 EE0F 1: lsl r30
+ 103 0068 FF1F rol r31
+ 104 006a 9A95 dec r25
+ 105 006c 01F4 brne 1b
+ 106 006e E60F add r30,r22
+ 107 0070 F71F adc r31,r23
+ 108 0072 E050 subi r30,lo8(-(fb))
+ 109 0074 F040 sbci r31,hi8(-(fb))
+ 110 0076 2081 ld r18,Z
+ 111 0078 81E0 ldi r24,lo8(1)
+ 112 007a 90E0 ldi r25,hi8(1)
+ 113 .LVL4:
+ 114 007c 00C0 rjmp 2f
+ 115 007e 880F 1: lsl r24
+ 116 0080 991F rol r25
+ 117 0082 AA95 2: dec r26
+ 118 0084 02F4 brpl 1b
+ 119 0086 282B or r18,r24
+ 120 0088 2083 st Z,r18
+ 121 .LVL5:
+ 122 .L6:
+ 123 008a 0895 ret
+ 124 .LFE3:
+ 126 .global clrvoxel
+ 128 clrvoxel:
+ 129 .LFB4:
+ 130 .LM7:
+ 131 .LVL6:
+ 132 /* prologue: function */
+ 133 /* frame size = 0 */
+ 134 008c DC01 movw r26,r24
+ 135 .LBB98:
+ 136 .LBB99:
+ 137 .LM8:
+ 138 008e 8830 cpi r24,8
+ 139 0090 9105 cpc r25,__zero_reg__
+ 140 0092 00F4 brsh .L9
+ 141 0094 77FD sbrc r23,7
+ 142 0096 00C0 rjmp .L9
+ 143 0098 6830 cpi r22,8
+ 144 009a 7105 cpc r23,__zero_reg__
+ 145 009c 04F4 brge .L9
+ 146 009e 57FD sbrc r21,7
+ 147 00a0 00C0 rjmp .L9
+ 148 00a2 4830 cpi r20,8
+ 149 00a4 5105 cpc r21,__zero_reg__
+ 150 00a6 04F4 brge .L9
+ 151 .LBE99:
+ 152 .LBE98:
+ 153 .LM9:
+ 154 00a8 FA01 movw r30,r20
+ 155 00aa 23E0 ldi r18,3
+ 156 00ac EE0F 1: lsl r30
+ 157 00ae FF1F rol r31
+ 158 00b0 2A95 dec r18
+ 159 00b2 01F4 brne 1b
+ 160 00b4 E60F add r30,r22
+ 161 00b6 F71F adc r31,r23
+ 162 00b8 E050 subi r30,lo8(-(cube))
+ 163 00ba F040 sbci r31,hi8(-(cube))
+ 164 00bc 2081 ld r18,Z
+ 165 00be 81E0 ldi r24,lo8(1)
+ 166 00c0 90E0 ldi r25,hi8(1)
+ 167 .LVL7:
+ 168 00c2 00C0 rjmp 2f
+ 169 00c4 880F 1: lsl r24
+ 170 00c6 991F rol r25
+ 171 00c8 AA95 2: dec r26
+ 172 00ca 02F4 brpl 1b
+ 173 00cc 8095 com r24
+ 174 00ce 8223 and r24,r18
+ 175 00d0 8083 st Z,r24
+ 176 .LVL8:
+ 177 .L9:
+ 178 00d2 0895 ret
+ 179 .LFE4:
+ 181 .global tmpclrvoxel
+ 183 tmpclrvoxel:
+ 184 .LFB5:
+ 185 .LM10:
+ 186 .LVL9:
+ 187 /* prologue: function */
+ 188 /* frame size = 0 */
+ 189 00d4 DC01 movw r26,r24
+ 190 .LBB100:
+ 191 .LBB101:
+ 192 .LM11:
+ 193 00d6 8830 cpi r24,8
+ 194 00d8 9105 cpc r25,__zero_reg__
+ 195 00da 00F4 brsh .L12
+ 196 00dc 77FD sbrc r23,7
+ 197 00de 00C0 rjmp .L12
+ 198 00e0 6830 cpi r22,8
+ 199 00e2 7105 cpc r23,__zero_reg__
+ 200 00e4 04F4 brge .L12
+ 201 00e6 57FD sbrc r21,7
+ 202 00e8 00C0 rjmp .L12
+ 203 00ea 4830 cpi r20,8
+ 204 00ec 5105 cpc r21,__zero_reg__
+ 205 00ee 04F4 brge .L12
+ 206 .LBE101:
+ 207 .LBE100:
+ 208 .LM12:
+ 209 00f0 FA01 movw r30,r20
+ 210 00f2 33E0 ldi r19,3
+ 211 00f4 EE0F 1: lsl r30
+ 212 00f6 FF1F rol r31
+ 213 00f8 3A95 dec r19
+ 214 00fa 01F4 brne 1b
+ 215 00fc E60F add r30,r22
+ 216 00fe F71F adc r31,r23
+ 217 0100 E050 subi r30,lo8(-(fb))
+ 218 0102 F040 sbci r31,hi8(-(fb))
+ 219 0104 2081 ld r18,Z
+ 220 0106 81E0 ldi r24,lo8(1)
+ 221 0108 90E0 ldi r25,hi8(1)
+ 222 .LVL10:
+ 223 010a 00C0 rjmp 2f
+ 224 010c 880F 1: lsl r24
+ 225 010e 991F rol r25
+ 226 0110 AA95 2: dec r26
+ 227 0112 02F4 brpl 1b
+ 228 0114 8095 com r24
+ 229 0116 8223 and r24,r18
+ 230 0118 8083 st Z,r24
+ 231 .LVL11:
+ 232 .L12:
+ 233 011a 0895 ret
+ 234 .LFE5:
+ 236 .global inrange
+ 238 inrange:
+ 239 .LFB6:
+ 240 .LM13:
+ 241 .LVL12:
+ 242 /* prologue: function */
+ 243 /* frame size = 0 */
+ 244 .LM14:
+ 245 011c 0897 sbiw r24,8
+ 246 011e 00F4 brsh .L14
+ 247 0120 77FD sbrc r23,7
+ 248 0122 00C0 rjmp .L14
+ 249 0124 6830 cpi r22,8
+ 250 0126 7105 cpc r23,__zero_reg__
+ 251 0128 04F4 brge .L14
+ 252 012a 57FD sbrc r21,7
+ 253 012c 00C0 rjmp .L14
+ 254 012e 90E0 ldi r25,lo8(0)
+ 255 0130 4830 cpi r20,8
+ 256 0132 5105 cpc r21,__zero_reg__
+ 257 0134 04F0 brlt .L15
+ 258 0136 91E0 ldi r25,lo8(1)
+ 259 .L15:
+ 260 0138 81E0 ldi r24,lo8(1)
+ 261 .LVL13:
+ 262 013a 9827 eor r25,r24
+ 263 013c 00C0 rjmp .L16
+ 264 .LVL14:
+ 265 .L14:
+ 266 013e 90E0 ldi r25,lo8(0)
+ 267 .L16:
+ 268 .LM15:
+ 269 0140 892F mov r24,r25
+ 270 .LVL15:
+ 271 /* epilogue start */
+ 272 0142 0895 ret
+ 273 .LFE6:
+ 275 .global getvoxel
+ 277 getvoxel:
+ 278 .LFB7:
+ 279 .LM16:
+ 280 .LVL16:
+ 281 /* prologue: function */
+ 282 /* frame size = 0 */
+ 283 0144 9C01 movw r18,r24
+ 284 0146 FA01 movw r30,r20
+ 285 .LBB102:
+ 286 .LBB103:
+ 287 .LM17:
+ 288 0148 8830 cpi r24,8
+ 289 014a 9105 cpc r25,__zero_reg__
+ 290 014c 00F4 brsh .L19
+ 291 .LVL17:
+ 292 014e 77FD sbrc r23,7
+ 293 0150 00C0 rjmp .L19
+ 294 0152 6830 cpi r22,8
+ 295 0154 7105 cpc r23,__zero_reg__
+ 296 0156 04F4 brge .L19
+ 297 0158 57FD sbrc r21,7
+ 298 015a 00C0 rjmp .L19
+ 299 .LVL18:
+ 300 015c 4830 cpi r20,8
+ 301 015e 5105 cpc r21,__zero_reg__
+ 302 0160 04F4 brge .L19
+ 303 .LBE103:
+ 304 .LBE102:
+ 305 .LM18:
+ 306 0162 43E0 ldi r20,3
+ 307 0164 EE0F 1: lsl r30
+ 308 0166 FF1F rol r31
+ 309 0168 4A95 dec r20
+ 310 016a 01F4 brne 1b
+ 311 .LVL19:
+ 312 016c E60F add r30,r22
+ 313 016e F71F adc r31,r23
+ 314 0170 E050 subi r30,lo8(-(cube))
+ 315 0172 F040 sbci r31,hi8(-(cube))
+ 316 0174 8081 ld r24,Z
+ 317 .LVL20:
+ 318 0176 90E0 ldi r25,lo8(0)
+ 319 0178 00C0 rjmp 2f
+ 320 017a 9595 1: asr r25
+ 321 017c 8795 ror r24
+ 322 017e 2A95 2: dec r18
+ 323 0180 02F4 brpl 1b
+ 324 0182 8170 andi r24,lo8(1)
+ 325 0184 0895 ret
+ 326 .LVL21:
+ 327 .L19:
+ 328 0186 80E0 ldi r24,lo8(0)
+ 329 .LVL22:
+ 330 .LM19:
+ 331 0188 0895 ret
+ 332 .LFE7:
+ 334 .global altervoxel
+ 336 altervoxel:
+ 337 .LFB8:
+ 338 .LM20:
+ 339 .LVL23:
+ 340 /* prologue: function */
+ 341 /* frame size = 0 */
+ 342 018a DC01 movw r26,r24
+ 343 .LM21:
+ 344 018c 2130 cpi r18,1
+ 345 018e 3105 cpc r19,__zero_reg__
+ 346 0190 01F4 brne .L23
+ 347 .LVL24:
+ 348 .LBB104:
+ 349 .LBB105:
+ 350 .LBB106:
+ 351 .LBB107:
+ 352 .LM22:
+ 353 0192 8830 cpi r24,8
+ 354 0194 9105 cpc r25,__zero_reg__
+ 355 0196 00F4 brsh .L25
+ 356 .LVL25:
+ 357 0198 77FD sbrc r23,7
+ 358 019a 00C0 rjmp .L25
+ 359 019c 6830 cpi r22,8
+ 360 019e 7105 cpc r23,__zero_reg__
+ 361 01a0 04F4 brge .L25
+ 362 01a2 57FD sbrc r21,7
+ 363 01a4 00C0 rjmp .L25
+ 364 01a6 4830 cpi r20,8
+ 365 01a8 5105 cpc r21,__zero_reg__
+ 366 01aa 04F4 brge .L25
+ 367 .LBE107:
+ 368 .LBE106:
+ 369 .LM23:
+ 370 01ac FA01 movw r30,r20
+ 371 01ae 53E0 ldi r21,3
+ 372 01b0 EE0F 1: lsl r30
+ 373 01b2 FF1F rol r31
+ 374 01b4 5A95 dec r21
+ 375 01b6 01F4 brne 1b
+ 376 01b8 E60F add r30,r22
+ 377 01ba F71F adc r31,r23
+ 378 01bc E050 subi r30,lo8(-(cube))
+ 379 01be F040 sbci r31,hi8(-(cube))
+ 380 01c0 8081 ld r24,Z
+ 381 .LVL26:
+ 382 01c2 00C0 rjmp 2f
+ 383 01c4 220F 1: lsl r18
+ 384 01c6 331F rol r19
+ 385 01c8 AA95 2: dec r26
+ 386 01ca 02F4 brpl 1b
+ 387 .LVL27:
+ 388 01cc 822B or r24,r18
+ 389 01ce 8083 st Z,r24
+ 390 01d0 0895 ret
+ 391 .LVL28:
+ 392 .L23:
+ 393 .LBE105:
+ 394 .LBE104:
+ 395 .LM24:
+ 396 01d2 0E94 0000 call clrvoxel
+ 397 .LVL29:
+ 398 .L25:
+ 399 01d6 0895 ret
+ 400 .LFE8:
+ 402 .global flpvoxel
+ 404 flpvoxel:
+ 405 .LFB9:
+ 406 .LM25:
+ 407 .LVL30:
+ 408 /* prologue: function */
+ 409 /* frame size = 0 */
+ 410 01d8 DC01 movw r26,r24
+ 411 .LBB108:
+ 412 .LBB109:
+ 413 .LM26:
+ 414 01da 8830 cpi r24,8
+ 415 01dc 9105 cpc r25,__zero_reg__
+ 416 01de 00F4 brsh .L28
+ 417 01e0 77FD sbrc r23,7
+ 418 01e2 00C0 rjmp .L28
+ 419 01e4 6830 cpi r22,8
+ 420 01e6 7105 cpc r23,__zero_reg__
+ 421 01e8 04F4 brge .L28
+ 422 01ea 57FD sbrc r21,7
+ 423 01ec 00C0 rjmp .L28
+ 424 01ee 4830 cpi r20,8
+ 425 01f0 5105 cpc r21,__zero_reg__
+ 426 01f2 04F4 brge .L28
+ 427 .LBE109:
+ 428 .LBE108:
+ 429 .LM27:
+ 430 01f4 FA01 movw r30,r20
+ 431 01f6 B3E0 ldi r27,3
+ 432 01f8 EE0F 1: lsl r30
+ 433 01fa FF1F rol r31
+ 434 01fc BA95 dec r27
+ 435 01fe 01F4 brne 1b
+ 436 0200 E60F add r30,r22
+ 437 0202 F71F adc r31,r23
+ 438 0204 E050 subi r30,lo8(-(cube))
+ 439 0206 F040 sbci r31,hi8(-(cube))
+ 440 0208 2081 ld r18,Z
+ 441 020a 81E0 ldi r24,lo8(1)
+ 442 020c 90E0 ldi r25,hi8(1)
+ 443 .LVL31:
+ 444 020e 00C0 rjmp 2f
+ 445 0210 880F 1: lsl r24
+ 446 0212 991F rol r25
+ 447 0214 AA95 2: dec r26
+ 448 0216 02F4 brpl 1b
+ 449 0218 2827 eor r18,r24
+ 450 021a 2083 st Z,r18
+ 451 .LVL32:
+ 452 .L28:
+ 453 021c 0895 ret
+ 454 .LFE9:
+ 456 .global argorder
+ 458 argorder:
+ 459 .LFB10:
+ 460 .LM28:
+ 461 .LVL33:
+ 462 021e CF93 push r28
+ 463 0220 DF93 push r29
+ 464 /* prologue: function */
+ 465 /* frame size = 0 */
+ 466 0222 FC01 movw r30,r24
+ 467 0224 DA01 movw r26,r20
+ 468 0226 E901 movw r28,r18
+ 469 .LM29:
+ 470 0228 6817 cp r22,r24
+ 471 022a 7907 cpc r23,r25
+ 472 022c 04F4 brge .L30
+ 473 .LVL34:
+ 474 022e CB01 movw r24,r22
+ 475 .LVL35:
+ 476 0230 BF01 movw r22,r30
+ 477 .LVL36:
+ 478 0232 FC01 movw r30,r24
+ 479 .LVL37:
+ 480 .L30:
+ 481 .LM30:
+ 482 0234 ED93 st X+,r30
+ 483 0236 FC93 st X,r31
+ 484 .LM31:
+ 485 0238 7983 std Y+1,r23
+ 486 023a 6883 st Y,r22
+ 487 /* epilogue start */
+ 488 .LM32:
+ 489 023c DF91 pop r29
+ 490 023e CF91 pop r28
+ 491 .LVL38:
+ 492 0240 0895 ret
+ 493 .LFE10:
+ 495 .global setplane_z
+ 497 setplane_z:
+ 498 .LFB11:
+ 499 .LM33:
+ 500 .LVL39:
+ 501 /* prologue: function */
+ 502 /* frame size = 0 */
+ 503 .LM34:
+ 504 0242 8830 cpi r24,8
+ 505 0244 9105 cpc r25,__zero_reg__
+ 506 0246 00F4 brsh .L35
+ 507 0248 20E0 ldi r18,lo8(0)
+ 508 024a 30E0 ldi r19,hi8(0)
+ 509 .LVL40:
+ 510 .LM35:
+ 511 024c 43E0 ldi r20,3
+ 512 024e 880F 1: lsl r24
+ 513 0250 991F rol r25
+ 514 0252 4A95 dec r20
+ 515 0254 01F4 brne 1b
+ 516 .LVL41:
+ 517 0256 4FEF ldi r20,lo8(-1)
+ 518 .L34:
+ 519 0258 FC01 movw r30,r24
+ 520 025a E20F add r30,r18
+ 521 025c F31F adc r31,r19
+ 522 025e E050 subi r30,lo8(-(cube))
+ 523 0260 F040 sbci r31,hi8(-(cube))
+ 524 0262 4083 st Z,r20
+ 525 .LM36:
+ 526 0264 2F5F subi r18,lo8(-(1))
+ 527 0266 3F4F sbci r19,hi8(-(1))
+ 528 0268 2830 cpi r18,8
+ 529 026a 3105 cpc r19,__zero_reg__
+ 530 026c 01F4 brne .L34
+ 531 .LVL42:
+ 532 .L35:
+ 533 026e 0895 ret
+ 534 .LFE11:
+ 536 .global clrplane_z
+ 538 clrplane_z:
+ 539 .LFB12:
+ 540 .LM37:
+ 541 .LVL43:
+ 542 /* prologue: function */
+ 543 /* frame size = 0 */
+ 544 .LM38:
+ 545 0270 8830 cpi r24,8
+ 546 0272 9105 cpc r25,__zero_reg__
+ 547 0274 00F4 brsh .L40
+ 548 0276 20E0 ldi r18,lo8(0)
+ 549 0278 30E0 ldi r19,hi8(0)
+ 550 .LVL44:
+ 551 .LM39:
+ 552 027a 53E0 ldi r21,3
+ 553 027c 880F 1: lsl r24
+ 554 027e 991F rol r25
+ 555 0280 5A95 dec r21
+ 556 0282 01F4 brne 1b
+ 557 .LVL45:
+ 558 .L39:
+ 559 0284 FC01 movw r30,r24
+ 560 0286 E20F add r30,r18
+ 561 0288 F31F adc r31,r19
+ 562 028a E050 subi r30,lo8(-(cube))
+ 563 028c F040 sbci r31,hi8(-(cube))
+ 564 028e 1082 st Z,__zero_reg__
+ 565 .LM40:
+ 566 0290 2F5F subi r18,lo8(-(1))
+ 567 0292 3F4F sbci r19,hi8(-(1))
+ 568 0294 2830 cpi r18,8
+ 569 0296 3105 cpc r19,__zero_reg__
+ 570 0298 01F4 brne .L39
+ 571 .LVL46:
+ 572 .L40:
+ 573 029a 0895 ret
+ 574 .LFE12:
+ 576 .global setplane_x
+ 578 setplane_x:
+ 579 .LFB13:
+ 580 .LM41:
+ 581 .LVL47:
+ 582 /* prologue: function */
+ 583 /* frame size = 0 */
+ 584 029c 9C01 movw r18,r24
+ 585 .LM42:
+ 586 029e 8830 cpi r24,8
+ 587 02a0 9105 cpc r25,__zero_reg__
+ 588 02a2 00F4 brsh .L46
+ 589 .LM43:
+ 590 02a4 81E0 ldi r24,lo8(1)
+ 591 02a6 90E0 ldi r25,hi8(1)
+ 592 .LVL48:
+ 593 02a8 00C0 rjmp 2f
+ 594 02aa 880F 1: lsl r24
+ 595 02ac 991F rol r25
+ 596 02ae 2A95 2: dec r18
+ 597 02b0 02F4 brpl 1b
+ 598 02b2 982F mov r25,r24
+ 599 02b4 40E0 ldi r20,lo8(0)
+ 600 02b6 50E0 ldi r21,hi8(0)
+ 601 .LVL49:
+ 602 02b8 00C0 rjmp .L44
+ 603 .LVL50:
+ 604 .L45:
+ 605 02ba FB01 movw r30,r22
+ 606 02bc E20F add r30,r18
+ 607 02be F31F adc r31,r19
+ 608 02c0 E050 subi r30,lo8(-(cube))
+ 609 02c2 F040 sbci r31,hi8(-(cube))
+ 610 02c4 8081 ld r24,Z
+ 611 02c6 892B or r24,r25
+ 612 02c8 8083 st Z,r24
+ 613 .LM44:
+ 614 02ca 2F5F subi r18,lo8(-(1))
+ 615 02cc 3F4F sbci r19,hi8(-(1))
+ 616 02ce 2830 cpi r18,8
+ 617 02d0 3105 cpc r19,__zero_reg__
+ 618 02d2 01F4 brne .L45
+ 619 .LM45:
+ 620 02d4 4F5F subi r20,lo8(-(1))
+ 621 02d6 5F4F sbci r21,hi8(-(1))
+ 622 02d8 4830 cpi r20,8
+ 623 02da 5105 cpc r21,__zero_reg__
+ 624 02dc 01F0 breq .L46
+ 625 .LVL51:
+ 626 .L44:
+ 627 02de 20E0 ldi r18,lo8(0)
+ 628 02e0 30E0 ldi r19,hi8(0)
+ 629 .LVL52:
+ 630 .LM46:
+ 631 02e2 BA01 movw r22,r20
+ 632 02e4 E3E0 ldi r30,3
+ 633 02e6 660F 1: lsl r22
+ 634 02e8 771F rol r23
+ 635 02ea EA95 dec r30
+ 636 02ec 01F4 brne 1b
+ 637 02ee 00C0 rjmp .L45
+ 638 .LVL53:
+ 639 .L46:
+ 640 02f0 0895 ret
+ 641 .LFE13:
+ 643 .global clrplane_x
+ 645 clrplane_x:
+ 646 .LFB14:
+ 647 .LM47:
+ 648 .LVL54:
+ 649 /* prologue: function */
+ 650 /* frame size = 0 */
+ 651 02f2 9C01 movw r18,r24
+ 652 .LM48:
+ 653 02f4 8830 cpi r24,8
+ 654 02f6 9105 cpc r25,__zero_reg__
+ 655 02f8 00F4 brsh .L52
+ 656 .LM49:
+ 657 02fa 81E0 ldi r24,lo8(1)
+ 658 02fc 90E0 ldi r25,hi8(1)
+ 659 .LVL55:
+ 660 02fe 00C0 rjmp 2f
+ 661 0300 880F 1: lsl r24
+ 662 0302 991F rol r25
+ 663 0304 2A95 2: dec r18
+ 664 0306 02F4 brpl 1b
+ 665 0308 982F mov r25,r24
+ 666 030a 9095 com r25
+ 667 030c 40E0 ldi r20,lo8(0)
+ 668 030e 50E0 ldi r21,hi8(0)
+ 669 .LVL56:
+ 670 0310 00C0 rjmp .L50
+ 671 .LVL57:
+ 672 .L51:
+ 673 0312 FB01 movw r30,r22
+ 674 0314 E20F add r30,r18
+ 675 0316 F31F adc r31,r19
+ 676 0318 E050 subi r30,lo8(-(cube))
+ 677 031a F040 sbci r31,hi8(-(cube))
+ 678 031c 8081 ld r24,Z
+ 679 031e 8923 and r24,r25
+ 680 0320 8083 st Z,r24
+ 681 .LM50:
+ 682 0322 2F5F subi r18,lo8(-(1))
+ 683 0324 3F4F sbci r19,hi8(-(1))
+ 684 0326 2830 cpi r18,8
+ 685 0328 3105 cpc r19,__zero_reg__
+ 686 032a 01F4 brne .L51
+ 687 .LM51:
+ 688 032c 4F5F subi r20,lo8(-(1))
+ 689 032e 5F4F sbci r21,hi8(-(1))
+ 690 0330 4830 cpi r20,8
+ 691 0332 5105 cpc r21,__zero_reg__
+ 692 0334 01F0 breq .L52
+ 693 .LVL58:
+ 694 .L50:
+ 695 0336 20E0 ldi r18,lo8(0)
+ 696 0338 30E0 ldi r19,hi8(0)
+ 697 .LVL59:
+ 698 .LM52:
+ 699 033a BA01 movw r22,r20
+ 700 033c F3E0 ldi r31,3
+ 701 033e 660F 1: lsl r22
+ 702 0340 771F rol r23
+ 703 0342 FA95 dec r31
+ 704 0344 01F4 brne 1b
+ 705 0346 00C0 rjmp .L51
+ 706 .LVL60:
+ 707 .L52:
+ 708 0348 0895 ret
+ 709 .LFE14:
+ 711 .global setplane_y
+ 713 setplane_y:
+ 714 .LFB15:
+ 715 .LM53:
+ 716 .LVL61:
+ 717 /* prologue: function */
+ 718 /* frame size = 0 */
+ 719 .LM54:
+ 720 034a 8830 cpi r24,8
+ 721 034c 9105 cpc r25,__zero_reg__
+ 722 034e 00F4 brsh .L57
+ 723 0350 20E0 ldi r18,lo8(0)
+ 724 0352 30E0 ldi r19,hi8(0)
+ 725 .LVL62:
+ 726 .LM55:
+ 727 0354 4FEF ldi r20,lo8(-1)
+ 728 .L56:
+ 729 0356 F901 movw r30,r18
+ 730 0358 A3E0 ldi r26,3
+ 731 035a EE0F 1: lsl r30
+ 732 035c FF1F rol r31
+ 733 035e AA95 dec r26
+ 734 0360 01F4 brne 1b
+ 735 0362 E80F add r30,r24
+ 736 0364 F91F adc r31,r25
+ 737 0366 E050 subi r30,lo8(-(cube))
+ 738 0368 F040 sbci r31,hi8(-(cube))
+ 739 036a 4083 st Z,r20
+ 740 .LM56:
+ 741 036c 2F5F subi r18,lo8(-(1))
+ 742 036e 3F4F sbci r19,hi8(-(1))
+ 743 0370 2830 cpi r18,8
+ 744 0372 3105 cpc r19,__zero_reg__
+ 745 0374 01F4 brne .L56
+ 746 .L57:
+ 747 0376 0895 ret
+ 748 .LFE15:
+ 750 .global clrplane_y
+ 752 clrplane_y:
+ 753 .LFB16:
+ 754 .LM57:
+ 755 .LVL63:
+ 756 /* prologue: function */
+ 757 /* frame size = 0 */
+ 758 .LM58:
+ 759 0378 8830 cpi r24,8
+ 760 037a 9105 cpc r25,__zero_reg__
+ 761 037c 00F4 brsh .L62
+ 762 037e 20E0 ldi r18,lo8(0)
+ 763 0380 30E0 ldi r19,hi8(0)
+ 764 .LVL64:
+ 765 .L61:
+ 766 .LM59:
+ 767 0382 F901 movw r30,r18
+ 768 0384 B3E0 ldi r27,3
+ 769 0386 EE0F 1: lsl r30
+ 770 0388 FF1F rol r31
+ 771 038a BA95 dec r27
+ 772 038c 01F4 brne 1b
+ 773 038e E80F add r30,r24
+ 774 0390 F91F adc r31,r25
+ 775 0392 E050 subi r30,lo8(-(cube))
+ 776 0394 F040 sbci r31,hi8(-(cube))
+ 777 0396 1082 st Z,__zero_reg__
+ 778 .LM60:
+ 779 0398 2F5F subi r18,lo8(-(1))
+ 780 039a 3F4F sbci r19,hi8(-(1))
+ 781 039c 2830 cpi r18,8
+ 782 039e 3105 cpc r19,__zero_reg__
+ 783 03a0 01F4 brne .L61
+ 784 .L62:
+ 785 03a2 0895 ret
+ 786 .LFE16:
+ 788 .global fill
+ 790 fill:
+ 791 .LFB17:
+ 792 .LM61:
+ 793 .LVL65:
+ 794 /* prologue: function */
+ 795 /* frame size = 0 */
+ 796 .LM62:
+ 797 03a4 40E0 ldi r20,lo8(0)
+ 798 03a6 50E0 ldi r21,hi8(0)
+ 799 .LVL66:
+ 800 03a8 00C0 rjmp .L65
+ 801 .LVL67:
+ 802 .L66:
+ 803 .LM63:
+ 804 03aa FB01 movw r30,r22
+ 805 03ac E20F add r30,r18
+ 806 03ae F31F adc r31,r19
+ 807 03b0 E050 subi r30,lo8(-(cube))
+ 808 03b2 F040 sbci r31,hi8(-(cube))
+ 809 03b4 8083 st Z,r24
+ 810 .LM64:
+ 811 03b6 2F5F subi r18,lo8(-(1))
+ 812 03b8 3F4F sbci r19,hi8(-(1))
+ 813 03ba 2830 cpi r18,8
+ 814 03bc 3105 cpc r19,__zero_reg__
+ 815 03be 01F4 brne .L66
+ 816 .LM65:
+ 817 03c0 4F5F subi r20,lo8(-(1))
+ 818 03c2 5F4F sbci r21,hi8(-(1))
+ 819 03c4 4830 cpi r20,8
+ 820 03c6 5105 cpc r21,__zero_reg__
+ 821 03c8 01F0 breq .L68
+ 822 .L65:
+ 823 03ca 20E0 ldi r18,lo8(0)
+ 824 03cc 30E0 ldi r19,hi8(0)
+ 825 .LM66:
+ 826 03ce BA01 movw r22,r20
+ 827 03d0 93E0 ldi r25,3
+ 828 03d2 660F 1: lsl r22
+ 829 03d4 771F rol r23
+ 830 03d6 9A95 dec r25
+ 831 03d8 01F4 brne 1b
+ 832 03da 00C0 rjmp .L66
+ 833 .L68:
+ 834 03dc 0895 ret
+ 835 .LFE17:
+ 837 .global tmpfill
+ 839 tmpfill:
+ 840 .LFB18:
+ 841 .LM67:
+ 842 .LVL68:
+ 843 /* prologue: function */
+ 844 /* frame size = 0 */
+ 845 .LM68:
+ 846 03de 40E0 ldi r20,lo8(0)
+ 847 03e0 50E0 ldi r21,hi8(0)
+ 848 .LVL69:
+ 849 03e2 00C0 rjmp .L71
+ 850 .LVL70:
+ 851 .L72:
+ 852 .LM69:
+ 853 03e4 FB01 movw r30,r22
+ 854 03e6 E20F add r30,r18
+ 855 03e8 F31F adc r31,r19
+ 856 03ea E050 subi r30,lo8(-(fb))
+ 857 03ec F040 sbci r31,hi8(-(fb))
+ 858 03ee 8083 st Z,r24
+ 859 .LM70:
+ 860 03f0 2F5F subi r18,lo8(-(1))
+ 861 03f2 3F4F sbci r19,hi8(-(1))
+ 862 03f4 2830 cpi r18,8
+ 863 03f6 3105 cpc r19,__zero_reg__
+ 864 03f8 01F4 brne .L72
+ 865 .LM71:
+ 866 03fa 4F5F subi r20,lo8(-(1))
+ 867 03fc 5F4F sbci r21,hi8(-(1))
+ 868 03fe 4830 cpi r20,8
+ 869 0400 5105 cpc r21,__zero_reg__
+ 870 0402 01F0 breq .L74
+ 871 .L71:
+ 872 0404 20E0 ldi r18,lo8(0)
+ 873 0406 30E0 ldi r19,hi8(0)
+ 874 .LM72:
+ 875 0408 BA01 movw r22,r20
+ 876 040a E3E0 ldi r30,3
+ 877 040c 660F 1: lsl r22
+ 878 040e 771F rol r23
+ 879 0410 EA95 dec r30
+ 880 0412 01F4 brne 1b
+ 881 0414 00C0 rjmp .L72
+ 882 .L74:
+ 883 0416 0895 ret
+ 884 .LFE18:
+ 886 .global box_filled
+ 888 box_filled:
+ 889 .LFB19:
+ 890 .LM73:
+ 891 .LVL71:
+ 892 0418 EF92 push r14
+ 893 .LVL72:
+ 894 041a FF92 push r15
+ 895 041c 0F93 push r16
+ 896 .LVL73:
+ 897 041e 1F93 push r17
+ 898 0420 CF93 push r28
+ 899 0422 DF93 push r29
+ 900 /* prologue: function */
+ 901 /* frame size = 0 */
+ 902 0424 DC01 movw r26,r24
+ 903 0426 EB01 movw r28,r22
+ 904 0428 F901 movw r30,r18
+ 905 .LBB110:
+ 906 .LBB111:
+ 907 .LM74:
+ 908 042a 2817 cp r18,r24
+ 909 042c 3907 cpc r19,r25
+ 910 042e 04F4 brge .L77
+ 911 .LVL74:
+ 912 0430 D901 movw r26,r18
+ 913 .LVL75:
+ 914 0432 FC01 movw r30,r24
+ 915 .LVL76:
+ 916 .L77:
+ 917 .LBE111:
+ 918 .LBE110:
+ 919 .LBB112:
+ 920 .LBB113:
+ 921 0434 0C17 cp r16,r28
+ 922 0436 1D07 cpc r17,r29
+ 923 .LVL77:
+ 924 0438 04F4 brge .L78
+ 925 043a CE01 movw r24,r28
+ 926 .LVL78:
+ 927 043c E801 movw r28,r16
+ 928 .LVL79:
+ 929 043e 8C01 movw r16,r24
+ 930 .LVL80:
+ 931 .L78:
+ 932 .LBE113:
+ 933 .LBE112:
+ 934 .LBB114:
+ 935 .LBB115:
+ 936 0440 E416 cp r14,r20
+ 937 0442 F506 cpc r15,r21
+ 938 .LVL81:
+ 939 0444 04F4 brge .L79
+ 940 0446 CA01 movw r24,r20
+ 941 .LVL82:
+ 942 0448 A701 movw r20,r14
+ 943 .LVL83:
+ 944 044a 7C01 movw r14,r24
+ 945 .LVL84:
+ 946 .L79:
+ 947 .LBE115:
+ 948 .LBE114:
+ 949 .LBB116:
+ 950 .LBB117:
+ 951 .LM75:
+ 952 044c 3196 adiw r30,1
+ 953 044e 8FEF ldi r24,lo8(255)
+ 954 0450 90E0 ldi r25,hi8(255)
+ 955 0452 9C01 movw r18,r24
+ 956 0454 00C0 rjmp 2f
+ 957 0456 220F 1: lsl r18
+ 958 0458 331F rol r19
+ 959 045a EA95 2: dec r30
+ 960 045c 02F4 brpl 1b
+ 961 045e 2095 com r18
+ 962 0460 00C0 rjmp 2f
+ 963 0462 880F 1: lsl r24
+ 964 0464 991F rol r25
+ 965 0466 AA95 2: dec r26
+ 966 0468 02F4 brpl 1b
+ 967 046a 2823 and r18,r24
+ 968 046c 00C0 rjmp .L80
+ 969 .LVL85:
+ 970 .L81:
+ 971 .LBE117:
+ 972 .LBE116:
+ 973 .LM76:
+ 974 046e FB01 movw r30,r22
+ 975 .LVL86:
+ 976 0470 EA0F add r30,r26
+ 977 0472 FB1F adc r31,r27
+ 978 0474 E050 subi r30,lo8(-(cube))
+ 979 0476 F040 sbci r31,hi8(-(cube))
+ 980 0478 8081 ld r24,Z
+ 981 047a 822B or r24,r18
+ 982 047c 8083 st Z,r24
+ 983 .LM77:
+ 984 047e 1196 adiw r26,1
+ 985 .LVL87:
+ 986 .L83:
+ 987 0480 0A17 cp r16,r26
+ 988 0482 1B07 cpc r17,r27
+ 989 0484 04F4 brge .L81
+ 990 .LM78:
+ 991 0486 4F5F subi r20,lo8(-(1))
+ 992 0488 5F4F sbci r21,hi8(-(1))
+ 993 .LVL88:
+ 994 .L80:
+ 995 048a E416 cp r14,r20
+ 996 048c F506 cpc r15,r21
+ 997 048e 04F0 brlt .L84
+ 998 0490 DE01 movw r26,r28
+ 999 .LVL89:
+ 1000 .LM79:
+ 1001 0492 BA01 movw r22,r20
+ 1002 0494 F3E0 ldi r31,3
+ 1003 0496 660F 1: lsl r22
+ 1004 0498 771F rol r23
+ 1005 049a FA95 dec r31
+ 1006 049c 01F4 brne 1b
+ 1007 049e 00C0 rjmp .L83
+ 1008 .LVL90:
+ 1009 .L84:
+ 1010 /* epilogue start */
+ 1011 .LM80:
+ 1012 04a0 DF91 pop r29
+ 1013 04a2 CF91 pop r28
+ 1014 .LVL91:
+ 1015 04a4 1F91 pop r17
+ 1016 04a6 0F91 pop r16
+ 1017 .LVL92:
+ 1018 04a8 FF90 pop r15
+ 1019 04aa EF90 pop r14
+ 1020 .LVL93:
+ 1021 04ac 0895 ret
+ 1022 .LFE19:
+ 1024 .global box_walls
+ 1026 box_walls:
+ 1027 .LFB20:
+ 1028 .LM81:
+ 1029 .LVL94:
+ 1030 04ae CF92 push r12
+ 1031 04b0 DF92 push r13
+ 1032 04b2 EF92 push r14
+ 1033 .LVL95:
+ 1034 04b4 FF92 push r15
+ 1035 04b6 0F93 push r16
+ 1036 .LVL96:
+ 1037 04b8 1F93 push r17
+ 1038 04ba CF93 push r28
+ 1039 04bc DF93 push r29
+ 1040 /* prologue: function */
+ 1041 /* frame size = 0 */
+ 1042 04be DC01 movw r26,r24
+ 1043 04c0 F901 movw r30,r18
+ 1044 .LBB118:
+ 1045 .LBB119:
+ 1046 .LM82:
+ 1047 04c2 2817 cp r18,r24
+ 1048 04c4 3907 cpc r19,r25
+ 1049 04c6 04F4 brge .L86
+ 1050 04c8 D901 movw r26,r18
+ 1051 .LVL97:
+ 1052 04ca FC01 movw r30,r24
+ 1053 .LVL98:
+ 1054 .L86:
+ 1055 .LBE119:
+ 1056 .LBE118:
+ 1057 .LBB120:
+ 1058 .LBB121:
+ 1059 04cc 0617 cp r16,r22
+ 1060 04ce 1707 cpc r17,r23
+ 1061 .LVL99:
+ 1062 04d0 04F4 brge .L87
+ 1063 04d2 CB01 movw r24,r22
+ 1064 .LVL100:
+ 1065 04d4 B801 movw r22,r16
+ 1066 .LVL101:
+ 1067 04d6 8C01 movw r16,r24
+ 1068 .LVL102:
+ 1069 .L87:
+ 1070 .LBE121:
+ 1071 .LBE120:
+ 1072 .LBB122:
+ 1073 .LBB123:
+ 1074 04d8 E416 cp r14,r20
+ 1075 04da F506 cpc r15,r21
+ 1076 .LVL103:
+ 1077 04dc 04F4 brge .L88
+ 1078 04de CA01 movw r24,r20
+ 1079 .LVL104:
+ 1080 04e0 A701 movw r20,r14
+ 1081 .LVL105:
+ 1082 04e2 7C01 movw r14,r24
+ 1083 .LVL106:
+ 1084 .L88:
+ 1085 .LBE123:
+ 1086 .LBE122:
+ 1087 .LM83:
+ 1088 04e4 81E0 ldi r24,lo8(1)
+ 1089 04e6 90E0 ldi r25,hi8(1)
+ 1090 04e8 9C01 movw r18,r24
+ 1091 04ea 0E2E mov r0,r30
+ 1092 04ec 00C0 rjmp 2f
+ 1093 04ee 220F 1: lsl r18
+ 1094 04f0 331F rol r19
+ 1095 04f2 0A94 2: dec r0
+ 1096 04f4 02F4 brpl 1b
+ 1097 04f6 0A2E mov r0,r26
+ 1098 04f8 00C0 rjmp 2f
+ 1099 04fa 880F 1: lsl r24
+ 1100 04fc 991F rol r25
+ 1101 04fe 0A94 2: dec r0
+ 1102 0500 02F4 brpl 1b
+ 1103 0502 C22E mov r12,r18
+ 1104 0504 C82A or r12,r24
+ 1105 .LBB124:
+ 1106 .LBB125:
+ 1107 .LM84:
+ 1108 0506 3196 adiw r30,1
+ 1109 0508 8FEF ldi r24,lo8(255)
+ 1110 050a 90E0 ldi r25,hi8(255)
+ 1111 050c 9C01 movw r18,r24
+ 1112 050e 00C0 rjmp 2f
+ 1113 0510 220F 1: lsl r18
+ 1114 0512 331F rol r19
+ 1115 0514 EA95 2: dec r30
+ 1116 0516 02F4 brpl 1b
+ 1117 0518 D22E mov r13,r18
+ 1118 051a D094 com r13
+ 1119 051c 00C0 rjmp 2f
+ 1120 051e 880F 1: lsl r24
+ 1121 0520 991F rol r25
+ 1122 0522 AA95 2: dec r26
+ 1123 0524 02F4 brpl 1b
+ 1124 0526 D822 and r13,r24
+ 1125 0528 9A01 movw r18,r20
+ 1126 .LVL107:
+ 1127 052a 00C0 rjmp .L89
+ 1128 .LVL108:
+ 1129 .L93:
+ 1130 .LBE125:
+ 1131 .LBE124:
+ 1132 .LM85:
+ 1133 052c A617 cp r26,r22
+ 1134 052e B707 cpc r27,r23
+ 1135 0530 01F0 breq .L90
+ 1136 0532 A017 cp r26,r16
+ 1137 0534 B107 cpc r27,r17
+ 1138 0536 01F0 breq .L90
+ 1139 0538 2417 cp r18,r20
+ 1140 053a 3507 cpc r19,r21
+ 1141 053c 01F0 breq .L90
+ 1142 053e 2E15 cp r18,r14
+ 1143 0540 3F05 cpc r19,r15
+ 1144 0542 01F4 brne .L91
+ 1145 .L90:
+ 1146 .LM86:
+ 1147 0544 FE01 movw r30,r28
+ 1148 .LVL109:
+ 1149 0546 EA0F add r30,r26
+ 1150 0548 FB1F adc r31,r27
+ 1151 054a E050 subi r30,lo8(-(cube))
+ 1152 054c F040 sbci r31,hi8(-(cube))
+ 1153 054e D082 st Z,r13
+ 1154 0550 00C0 rjmp .L92
+ 1155 .LVL110:
+ 1156 .L91:
+ 1157 .LM87:
+ 1158 0552 FE01 movw r30,r28
+ 1159 .LVL111:
+ 1160 0554 EA0F add r30,r26
+ 1161 0556 FB1F adc r31,r27
+ 1162 0558 E050 subi r30,lo8(-(cube))
+ 1163 055a F040 sbci r31,hi8(-(cube))
+ 1164 055c 8081 ld r24,Z
+ 1165 055e 8C29 or r24,r12
+ 1166 0560 8083 st Z,r24
+ 1167 .L92:
+ 1168 .LM88:
+ 1169 0562 1196 adiw r26,1
+ 1170 .LVL112:
+ 1171 .L95:
+ 1172 0564 0A17 cp r16,r26
+ 1173 0566 1B07 cpc r17,r27
+ 1174 0568 04F4 brge .L93
+ 1175 .LM89:
+ 1176 056a 2F5F subi r18,lo8(-(1))
+ 1177 056c 3F4F sbci r19,hi8(-(1))
+ 1178 .LVL113:
+ 1179 .L89:
+ 1180 056e E216 cp r14,r18
+ 1181 0570 F306 cpc r15,r19
+ 1182 0572 04F0 brlt .L96
+ 1183 0574 DB01 movw r26,r22
+ 1184 .LVL114:
+ 1185 .LM90:
+ 1186 0576 E901 movw r28,r18
+ 1187 0578 83E0 ldi r24,3
+ 1188 057a CC0F 1: lsl r28
+ 1189 057c DD1F rol r29
+ 1190 057e 8A95 dec r24
+ 1191 0580 01F4 brne 1b
+ 1192 0582 00C0 rjmp .L95
+ 1193 .LVL115:
+ 1194 .L96:
+ 1195 /* epilogue start */
+ 1196 .LM91:
+ 1197 0584 DF91 pop r29
+ 1198 0586 CF91 pop r28
+ 1199 0588 1F91 pop r17
+ 1200 058a 0F91 pop r16
+ 1201 .LVL116:
+ 1202 058c FF90 pop r15
+ 1203 058e EF90 pop r14
+ 1204 .LVL117:
+ 1205 0590 DF90 pop r13
+ 1206 0592 CF90 pop r12
+ 1207 0594 0895 ret
+ 1208 .LFE20:
+ 1210 .global box_wireframe
+ 1212 box_wireframe:
+ 1213 .LFB21:
+ 1214 .LM92:
+ 1215 .LVL118:
+ 1216 0596 8F92 push r8
+ 1217 0598 9F92 push r9
+ 1218 059a AF92 push r10
+ 1219 059c BF92 push r11
+ 1220 059e CF92 push r12
+ 1221 05a0 DF92 push r13
+ 1222 05a2 EF92 push r14
+ 1223 .LVL119:
+ 1224 05a4 FF92 push r15
+ 1225 05a6 0F93 push r16
+ 1226 .LVL120:
+ 1227 05a8 1F93 push r17
+ 1228 05aa CF93 push r28
+ 1229 05ac DF93 push r29
+ 1230 /* prologue: function */
+ 1231 /* frame size = 0 */
+ 1232 05ae 4C01 movw r8,r24
+ 1233 05b0 6B01 movw r12,r22
+ 1234 05b2 EA01 movw r28,r20
+ 1235 05b4 5901 movw r10,r18
+ 1236 .LBB126:
+ 1237 .LBB127:
+ 1238 .LM93:
+ 1239 05b6 2817 cp r18,r24
+ 1240 05b8 3907 cpc r19,r25
+ 1241 05ba 04F4 brge .L98
+ 1242 .LVL121:
+ 1243 05bc 4901 movw r8,r18
+ 1244 .LVL122:
+ 1245 05be 5C01 movw r10,r24
+ 1246 .LVL123:
+ 1247 .L98:
+ 1248 .LBE127:
+ 1249 .LBE126:
+ 1250 .LBB128:
+ 1251 .LBB129:
+ 1252 05c0 0C15 cp r16,r12
+ 1253 05c2 1D05 cpc r17,r13
+ 1254 .LVL124:
+ 1255 05c4 04F4 brge .L99
+ 1256 05c6 C601 movw r24,r12
+ 1257 .LVL125:
+ 1258 05c8 6801 movw r12,r16
+ 1259 .LVL126:
+ 1260 05ca 8C01 movw r16,r24
+ 1261 .LVL127:
+ 1262 .L99:
+ 1263 .LBE129:
+ 1264 .LBE128:
+ 1265 .LBB130:
+ 1266 .LBB131:
+ 1267 05cc EC16 cp r14,r28
+ 1268 05ce FD06 cpc r15,r29
+ 1269 .LVL128:
+ 1270 05d0 04F4 brge .L100
+ 1271 05d2 CE01 movw r24,r28
+ 1272 .LVL129:
+ 1273 05d4 E701 movw r28,r14
+ 1274 .LVL130:
+ 1275 05d6 7C01 movw r14,r24
+ 1276 .LVL131:
+ 1277 .L100:
+ 1278 .LBE131:
+ 1279 .LBE130:
+ 1280 .LBB132:
+ 1281 .LBB133:
+ 1282 .LM94:
+ 1283 05d8 0894 sec
+ 1284 05da A11C adc r10,__zero_reg__
+ 1285 05dc B11C adc r11,__zero_reg__
+ 1286 05de 8FEF ldi r24,lo8(255)
+ 1287 05e0 90E0 ldi r25,hi8(255)
+ 1288 05e2 9C01 movw r18,r24
+ 1289 05e4 0A2C mov r0,r10
+ 1290 05e6 00C0 rjmp 2f
+ 1291 05e8 220F 1: lsl r18
+ 1292 05ea 331F rol r19
+ 1293 05ec 0A94 2: dec r0
+ 1294 05ee 02F4 brpl 1b
+ 1295 05f0 0894 sec
+ 1296 05f2 A108 sbc r10,__zero_reg__
+ 1297 05f4 B108 sbc r11,__zero_reg__
+ 1298 05f6 2095 com r18
+ 1299 05f8 082C mov r0,r8
+ 1300 05fa 00C0 rjmp 2f
+ 1301 05fc 880F 1: lsl r24
+ 1302 05fe 991F rol r25
+ 1303 0600 0A94 2: dec r0
+ 1304 0602 02F4 brpl 1b
+ 1305 0604 2823 and r18,r24
+ 1306 .LBE133:
+ 1307 .LBE132:
+ 1308 .LM95:
+ 1309 0606 BE01 movw r22,r28
+ 1310 0608 83E0 ldi r24,3
+ 1311 060a 660F 1: lsl r22
+ 1312 060c 771F rol r23
+ 1313 060e 8A95 dec r24
+ 1314 0610 01F4 brne 1b
+ 1315 0612 FB01 movw r30,r22
+ 1316 0614 EC0D add r30,r12
+ 1317 0616 FD1D adc r31,r13
+ 1318 0618 E050 subi r30,lo8(-(cube))
+ 1319 061a F040 sbci r31,hi8(-(cube))
+ 1320 061c 2083 st Z,r18
+ 1321 .LM96:
+ 1322 061e FB01 movw r30,r22
+ 1323 0620 E00F add r30,r16
+ 1324 0622 F11F adc r31,r17
+ 1325 0624 E050 subi r30,lo8(-(cube))
+ 1326 0626 F040 sbci r31,hi8(-(cube))
+ 1327 0628 2083 st Z,r18
+ 1328 .LM97:
+ 1329 062a A701 movw r20,r14
+ 1330 062c B3E0 ldi r27,3
+ 1331 062e 440F 1: lsl r20
+ 1332 0630 551F rol r21
+ 1333 0632 BA95 dec r27
+ 1334 0634 01F4 brne 1b
+ 1335 0636 FA01 movw r30,r20
+ 1336 0638 EC0D add r30,r12
+ 1337 063a FD1D adc r31,r13
+ 1338 063c E050 subi r30,lo8(-(cube))
+ 1339 063e F040 sbci r31,hi8(-(cube))
+ 1340 0640 2083 st Z,r18
+ 1341 .LM98:
+ 1342 0642 FA01 movw r30,r20
+ 1343 0644 E00F add r30,r16
+ 1344 0646 F11F adc r31,r17
+ 1345 0648 E050 subi r30,lo8(-(cube))
+ 1346 064a F040 sbci r31,hi8(-(cube))
+ 1347 064c 2083 st Z,r18
+ 1348 .LBB134:
+ 1349 .LBB135:
+ 1350 .LM99:
+ 1351 064e 81E0 ldi r24,lo8(1)
+ 1352 0650 90E0 ldi r25,hi8(1)
+ 1353 0652 9C01 movw r18,r24
+ 1354 0654 082C mov r0,r8
+ 1355 0656 00C0 rjmp 2f
+ 1356 0658 220F 1: lsl r18
+ 1357 065a 331F rol r19
+ 1358 065c 0A94 2: dec r0
+ 1359 065e 02F4 brpl 1b
+ 1360 .LBE135:
+ 1361 .LBE134:
+ 1362 .LBB139:
+ 1363 .LBB140:
+ 1364 0660 0A2C mov r0,r10
+ 1365 0662 00C0 rjmp 2f
+ 1366 0664 880F 1: lsl r24
+ 1367 0666 991F rol r25
+ 1368 0668 0A94 2: dec r0
+ 1369 066a 02F4 brpl 1b
+ 1370 066c 982F mov r25,r24
+ 1371 066e D601 movw r26,r12
+ 1372 .LVL132:
+ 1373 0670 00C0 rjmp .L101
+ 1374 .L106:
+ 1375 .LBE140:
+ 1376 .LBE139:
+ 1377 .LBB144:
+ 1378 .LBB138:
+ 1379 .LBB136:
+ 1380 .LBB137:
+ 1381 .LM100:
+ 1382 0672 88E0 ldi r24,lo8(8)
+ 1383 0674 8816 cp r8,r24
+ 1384 0676 9104 cpc r9,__zero_reg__
+ 1385 0678 00F4 brsh .L102
+ 1386 067a B7FD sbrc r27,7
+ 1387 067c 00C0 rjmp .L102
+ 1388 067e A830 cpi r26,8
+ 1389 0680 B105 cpc r27,__zero_reg__
+ 1390 0682 04F4 brge .L102
+ 1391 0684 D7FD sbrc r29,7
+ 1392 0686 00C0 rjmp .L103
+ 1393 0688 C830 cpi r28,8
+ 1394 068a D105 cpc r29,__zero_reg__
+ 1395 068c 04F4 brge .L103
+ 1396 .LBE137:
+ 1397 .LBE136:
+ 1398 .LM101:
+ 1399 068e FB01 movw r30,r22
+ 1400 0690 EA0F add r30,r26
+ 1401 0692 FB1F adc r31,r27
+ 1402 0694 E050 subi r30,lo8(-(cube))
+ 1403 0696 F040 sbci r31,hi8(-(cube))
+ 1404 0698 8081 ld r24,Z
+ 1405 069a 822B or r24,r18
+ 1406 069c 8083 st Z,r24
+ 1407 .L103:
+ 1408 .LBE138:
+ 1409 .LBE144:
+ 1410 .LBB145:
+ 1411 .LBB146:
+ 1412 .LBB147:
+ 1413 .LBB148:
+ 1414 .LM102:
+ 1415 069e F7FC sbrc r15,7
+ 1416 06a0 00C0 rjmp .L102
+ 1417 06a2 88E0 ldi r24,lo8(8)
+ 1418 06a4 E816 cp r14,r24
+ 1419 06a6 F104 cpc r15,__zero_reg__
+ 1420 06a8 04F4 brge .L102
+ 1421 .LBE148:
+ 1422 .LBE147:
+ 1423 .LM103:
+ 1424 06aa FA01 movw r30,r20
+ 1425 06ac EA0F add r30,r26
+ 1426 06ae FB1F adc r31,r27
+ 1427 06b0 E050 subi r30,lo8(-(cube))
+ 1428 06b2 F040 sbci r31,hi8(-(cube))
+ 1429 06b4 8081 ld r24,Z
+ 1430 06b6 822B or r24,r18
+ 1431 06b8 8083 st Z,r24
+ 1432 .L102:
+ 1433 .LBE146:
+ 1434 .LBE145:
+ 1435 .LBB149:
+ 1436 .LBB143:
+ 1437 .LBB141:
+ 1438 .LBB142:
+ 1439 .LM104:
+ 1440 06ba 88E0 ldi r24,lo8(8)
+ 1441 06bc A816 cp r10,r24
+ 1442 06be B104 cpc r11,__zero_reg__
+ 1443 06c0 00F4 brsh .L104
+ 1444 06c2 B7FD sbrc r27,7
+ 1445 06c4 00C0 rjmp .L104
+ 1446 06c6 A830 cpi r26,8
+ 1447 06c8 B105 cpc r27,__zero_reg__
+ 1448 06ca 04F4 brge .L104
+ 1449 06cc D7FD sbrc r29,7
+ 1450 06ce 00C0 rjmp .L105
+ 1451 06d0 C830 cpi r28,8
+ 1452 06d2 D105 cpc r29,__zero_reg__
+ 1453 06d4 04F4 brge .L105
+ 1454 .LBE142:
+ 1455 .LBE141:
+ 1456 .LM105:
+ 1457 06d6 FB01 movw r30,r22
+ 1458 06d8 EA0F add r30,r26
+ 1459 06da FB1F adc r31,r27
+ 1460 06dc E050 subi r30,lo8(-(cube))
+ 1461 06de F040 sbci r31,hi8(-(cube))
+ 1462 06e0 8081 ld r24,Z
+ 1463 06e2 892B or r24,r25
+ 1464 06e4 8083 st Z,r24
+ 1465 .L105:
+ 1466 .LBE143:
+ 1467 .LBE149:
+ 1468 .LBB150:
+ 1469 .LBB151:
+ 1470 .LBB152:
+ 1471 .LBB153:
+ 1472 .LM106:
+ 1473 06e6 F7FC sbrc r15,7
+ 1474 06e8 00C0 rjmp .L104
+ 1475 06ea 88E0 ldi r24,lo8(8)
+ 1476 06ec E816 cp r14,r24
+ 1477 06ee F104 cpc r15,__zero_reg__
+ 1478 06f0 04F4 brge .L104
+ 1479 .LBE153:
+ 1480 .LBE152:
+ 1481 .LM107:
+ 1482 06f2 FA01 movw r30,r20
+ 1483 06f4 EA0F add r30,r26
+ 1484 06f6 FB1F adc r31,r27
+ 1485 06f8 E050 subi r30,lo8(-(cube))
+ 1486 06fa F040 sbci r31,hi8(-(cube))
+ 1487 06fc 8081 ld r24,Z
+ 1488 06fe 892B or r24,r25
+ 1489 0700 8083 st Z,r24
+ 1490 .L104:
+ 1491 .LBE151:
+ 1492 .LBE150:
+ 1493 .LM108:
+ 1494 0702 1196 adiw r26,1
+ 1495 .L101:
+ 1496 0704 0A17 cp r16,r26
+ 1497 0706 1B07 cpc r17,r27
+ 1498 0708 04F0 brlt .+2
+ 1499 070a 00C0 rjmp .L106
+ 1500 070c AE01 movw r20,r28
+ 1501 .LVL133:
+ 1502 070e 00C0 rjmp .L107
+ 1503 .L112:
+ 1504 .LBB154:
+ 1505 .LBB155:
+ 1506 .LBB156:
+ 1507 .LBB157:
+ 1508 .LM109:
+ 1509 0710 88E0 ldi r24,lo8(8)
+ 1510 0712 8816 cp r8,r24
+ 1511 0714 9104 cpc r9,__zero_reg__
+ 1512 0716 00F4 brsh .L108
+ 1513 0718 D7FC sbrc r13,7
+ 1514 071a 00C0 rjmp .L109
+ 1515 071c 88E0 ldi r24,lo8(8)
+ 1516 071e C816 cp r12,r24
+ 1517 0720 D104 cpc r13,__zero_reg__
+ 1518 0722 04F4 brge .L109
+ 1519 0724 57FD sbrc r21,7
+ 1520 0726 00C0 rjmp .L109
+ 1521 0728 4830 cpi r20,8
+ 1522 072a 5105 cpc r21,__zero_reg__
+ 1523 072c 04F4 brge .L109
+ 1524 .LBE157:
+ 1525 .LBE156:
+ 1526 .LM110:
+ 1527 072e FA01 movw r30,r20
+ 1528 0730 A3E0 ldi r26,3
+ 1529 0732 EE0F 1: lsl r30
+ 1530 0734 FF1F rol r31
+ 1531 0736 AA95 dec r26
+ 1532 0738 01F4 brne 1b
+ 1533 .LVL134:
+ 1534 073a EC0D add r30,r12
+ 1535 073c FD1D adc r31,r13
+ 1536 073e E050 subi r30,lo8(-(cube))
+ 1537 0740 F040 sbci r31,hi8(-(cube))
+ 1538 0742 8081 ld r24,Z
+ 1539 0744 822B or r24,r18
+ 1540 0746 8083 st Z,r24
+ 1541 .LVL135:
+ 1542 .L109:
+ 1543 .LBE155:
+ 1544 .LBE154:
+ 1545 .LBB158:
+ 1546 .LBB159:
+ 1547 .LBB160:
+ 1548 .LBB161:
+ 1549 .LM111:
+ 1550 0748 17FD sbrc r17,7
+ 1551 074a 00C0 rjmp .L108
+ 1552 074c 0830 cpi r16,8
+ 1553 074e 1105 cpc r17,__zero_reg__
+ 1554 0750 04F4 brge .L108
+ 1555 0752 57FD sbrc r21,7
+ 1556 0754 00C0 rjmp .L108
+ 1557 0756 4830 cpi r20,8
+ 1558 0758 5105 cpc r21,__zero_reg__
+ 1559 075a 04F4 brge .L108
+ 1560 .LBE161:
+ 1561 .LBE160:
+ 1562 .LM112:
+ 1563 075c FA01 movw r30,r20
+ 1564 075e 73E0 ldi r23,3
+ 1565 0760 EE0F 1: lsl r30
+ 1566 0762 FF1F rol r31
+ 1567 0764 7A95 dec r23
+ 1568 0766 01F4 brne 1b
+ 1569 0768 E00F add r30,r16
+ 1570 076a F11F adc r31,r17
+ 1571 076c E050 subi r30,lo8(-(cube))
+ 1572 076e F040 sbci r31,hi8(-(cube))
+ 1573 0770 8081 ld r24,Z
+ 1574 0772 822B or r24,r18
+ 1575 0774 8083 st Z,r24
+ 1576 .L108:
+ 1577 .LBE159:
+ 1578 .LBE158:
+ 1579 .LBB162:
+ 1580 .LBB163:
+ 1581 .LBB164:
+ 1582 .LBB165:
+ 1583 .LM113:
+ 1584 0776 88E0 ldi r24,lo8(8)
+ 1585 0778 A816 cp r10,r24
+ 1586 077a B104 cpc r11,__zero_reg__
+ 1587 077c 00F4 brsh .L110
+ 1588 077e D7FC sbrc r13,7
+ 1589 0780 00C0 rjmp .L111
+ 1590 0782 88E0 ldi r24,lo8(8)
+ 1591 0784 C816 cp r12,r24
+ 1592 0786 D104 cpc r13,__zero_reg__
+ 1593 0788 04F4 brge .L111
+ 1594 078a 57FD sbrc r21,7
+ 1595 078c 00C0 rjmp .L111
+ 1596 078e 4830 cpi r20,8
+ 1597 0790 5105 cpc r21,__zero_reg__
+ 1598 0792 04F4 brge .L111
+ 1599 .LBE165:
+ 1600 .LBE164:
+ 1601 .LM114:
+ 1602 0794 FA01 movw r30,r20
+ 1603 0796 63E0 ldi r22,3
+ 1604 0798 EE0F 1: lsl r30
+ 1605 079a FF1F rol r31
+ 1606 079c 6A95 dec r22
+ 1607 079e 01F4 brne 1b
+ 1608 07a0 EC0D add r30,r12
+ 1609 07a2 FD1D adc r31,r13
+ 1610 07a4 E050 subi r30,lo8(-(cube))
+ 1611 07a6 F040 sbci r31,hi8(-(cube))
+ 1612 07a8 8081 ld r24,Z
+ 1613 07aa 892B or r24,r25
+ 1614 07ac 8083 st Z,r24
+ 1615 .L111:
+ 1616 .LBE163:
+ 1617 .LBE162:
+ 1618 .LBB166:
+ 1619 .LBB167:
+ 1620 .LBB168:
+ 1621 .LBB169:
+ 1622 .LM115:
+ 1623 07ae 17FD sbrc r17,7
+ 1624 07b0 00C0 rjmp .L110
+ 1625 07b2 0830 cpi r16,8
+ 1626 07b4 1105 cpc r17,__zero_reg__
+ 1627 07b6 04F4 brge .L110
+ 1628 07b8 57FD sbrc r21,7
+ 1629 07ba 00C0 rjmp .L110
+ 1630 07bc 4830 cpi r20,8
+ 1631 07be 5105 cpc r21,__zero_reg__
+ 1632 07c0 04F4 brge .L110
+ 1633 .LBE169:
+ 1634 .LBE168:
+ 1635 .LM116:
+ 1636 07c2 FA01 movw r30,r20
+ 1637 07c4 33E0 ldi r19,3
+ 1638 07c6 EE0F 1: lsl r30
+ 1639 07c8 FF1F rol r31
+ 1640 07ca 3A95 dec r19
+ 1641 07cc 01F4 brne 1b
+ 1642 07ce E00F add r30,r16
+ 1643 07d0 F11F adc r31,r17
+ 1644 07d2 E050 subi r30,lo8(-(cube))
+ 1645 07d4 F040 sbci r31,hi8(-(cube))
+ 1646 07d6 8081 ld r24,Z
+ 1647 07d8 892B or r24,r25
+ 1648 07da 8083 st Z,r24
+ 1649 .L110:
+ 1650 .LBE167:
+ 1651 .LBE166:
+ 1652 .LM117:
+ 1653 07dc 4F5F subi r20,lo8(-(1))
+ 1654 07de 5F4F sbci r21,hi8(-(1))
+ 1655 .L107:
+ 1656 07e0 E416 cp r14,r20
+ 1657 07e2 F506 cpc r15,r21
+ 1658 07e4 04F0 brlt .+2
+ 1659 07e6 00C0 rjmp .L112
+ 1660 /* epilogue start */
+ 1661 .LM118:
+ 1662 07e8 DF91 pop r29
+ 1663 07ea CF91 pop r28
+ 1664 .LVL136:
+ 1665 07ec 1F91 pop r17
+ 1666 07ee 0F91 pop r16
+ 1667 .LVL137:
+ 1668 07f0 FF90 pop r15
+ 1669 07f2 EF90 pop r14
+ 1670 .LVL138:
+ 1671 07f4 DF90 pop r13
+ 1672 07f6 CF90 pop r12
+ 1673 .LVL139:
+ 1674 07f8 BF90 pop r11
+ 1675 07fa AF90 pop r10
+ 1676 .LVL140:
+ 1677 07fc 9F90 pop r9
+ 1678 07fe 8F90 pop r8
+ 1679 .LVL141:
+ 1680 0800 0895 ret
+ 1681 .LFE21:
+ 1683 .global byteline
+ 1685 byteline:
+ 1686 .LFB22:
+ 1687 .LM119:
+ 1688 .LVL142:
+ 1689 /* prologue: function */
+ 1690 /* frame size = 0 */
+ 1691 .LM120:
+ 1692 0802 6F5F subi r22,lo8(-(1))
+ 1693 0804 7F4F sbci r23,hi8(-(1))
+ 1694 .LVL143:
+ 1695 0806 2FEF ldi r18,lo8(255)
+ 1696 0808 30E0 ldi r19,hi8(255)
+ 1697 080a A901 movw r20,r18
+ 1698 080c 00C0 rjmp 2f
+ 1699 080e 440F 1: lsl r20
+ 1700 0810 551F rol r21
+ 1701 0812 6A95 2: dec r22
+ 1702 0814 02F4 brpl 1b
+ 1703 0816 BA01 movw r22,r20
+ 1704 .LVL144:
+ 1705 0818 6095 com r22
+ 1706 081a 00C0 rjmp 2f
+ 1707 081c 220F 1: lsl r18
+ 1708 081e 331F rol r19
+ 1709 0820 8A95 2: dec r24
+ 1710 0822 02F4 brpl 1b
+ 1711 .LM121:
+ 1712 0824 862F mov r24,r22
+ 1713 .LVL145:
+ 1714 0826 8223 and r24,r18
+ 1715 /* epilogue start */
+ 1716 0828 0895 ret
+ 1717 .LFE22:
+ 1719 .global flipbyte
+ 1721 flipbyte:
+ 1722 .LFB23:
+ 1723 .LM122:
+ 1724 .LVL146:
+ 1725 /* prologue: function */
+ 1726 /* frame size = 0 */
+ 1727 082a 482F mov r20,r24
+ 1728 .LM123:
+ 1729 082c 282F mov r18,r24
+ 1730 082e 30E0 ldi r19,lo8(0)
+ 1731 0830 8295 swap r24
+ 1732 .LVL147:
+ 1733 0832 8695 lsr r24
+ 1734 0834 8270 andi r24,lo8(2)
+ 1735 0836 942F mov r25,r20
+ 1736 0838 991F rol r25
+ 1737 083a 9927 clr r25
+ 1738 083c 991F rol r25
+ 1739 083e 892B or r24,r25
+ 1740 0840 942F mov r25,r20
+ 1741 0842 9695 lsr r25
+ 1742 0844 9695 lsr r25
+ 1743 0846 9695 lsr r25
+ 1744 0848 9470 andi r25,lo8(4)
+ 1745 084a 892B or r24,r25
+ 1746 084c 4695 lsr r20
+ 1747 084e 4870 andi r20,lo8(8)
+ 1748 0850 842B or r24,r20
+ 1749 0852 220F lsl r18
+ 1750 0854 331F rol r19
+ 1751 0856 922F mov r25,r18
+ 1752 0858 9071 andi r25,lo8(16)
+ 1753 085a 892B or r24,r25
+ 1754 085c 220F lsl r18
+ 1755 085e 331F rol r19
+ 1756 0860 220F lsl r18
+ 1757 0862 331F rol r19
+ 1758 0864 922F mov r25,r18
+ 1759 0866 9072 andi r25,lo8(32)
+ 1760 0868 892B or r24,r25
+ 1761 086a 220F lsl r18
+ 1762 086c 331F rol r19
+ 1763 086e 220F lsl r18
+ 1764 0870 331F rol r19
+ 1765 .LVL148:
+ 1766 0872 922F mov r25,r18
+ 1767 0874 9074 andi r25,lo8(64)
+ 1768 0876 892B or r24,r25
+ 1769 0878 220F lsl r18
+ 1770 087a 331F rol r19
+ 1771 087c 220F lsl r18
+ 1772 087e 331F rol r19
+ 1773 .LM124:
+ 1774 0880 822B or r24,r18
+ 1775 /* epilogue start */
+ 1776 0882 0895 ret
+ 1777 .LFE23:
+ 1779 .global line
+ 1781 line:
+ 1782 .LFB24:
+ 1783 .LM125:
+ 1784 .LVL149:
+ 1785 0884 2F92 push r2
+ 1786 0886 3F92 push r3
+ 1787 0888 4F92 push r4
+ 1788 088a 5F92 push r5
+ 1789 088c 6F92 push r6
+ 1790 088e 7F92 push r7
+ 1791 0890 8F92 push r8
+ 1792 0892 9F92 push r9
+ 1793 0894 AF92 push r10
+ 1794 0896 BF92 push r11
+ 1795 0898 CF92 push r12
+ 1796 089a DF92 push r13
+ 1797 089c EF92 push r14
+ 1798 .LVL150:
+ 1799 089e FF92 push r15
+ 1800 08a0 0F93 push r16
+ 1801 .LVL151:
+ 1802 08a2 1F93 push r17
+ 1803 08a4 DF93 push r29
+ 1804 08a6 CF93 push r28
+ 1805 08a8 CDB7 in r28,__SP_L__
+ 1806 08aa DEB7 in r29,__SP_H__
+ 1807 08ac 6297 sbiw r28,18
+ 1808 08ae 0FB6 in __tmp_reg__,__SREG__
+ 1809 08b0 F894 cli
+ 1810 08b2 DEBF out __SP_H__,r29
+ 1811 08b4 0FBE out __SREG__,__tmp_reg__
+ 1812 08b6 CDBF out __SP_L__,r28
+ 1813 /* prologue: function */
+ 1814 /* frame size = 18 */
+ 1815 08b8 4C01 movw r8,r24
+ 1816 08ba 5B01 movw r10,r22
+ 1817 08bc 2A01 movw r4,r20
+ 1818 08be 3901 movw r6,r18
+ 1819 08c0 6701 movw r12,r14
+ 1820 .LVL152:
+ 1821 .LM126:
+ 1822 08c2 2817 cp r18,r24
+ 1823 08c4 3907 cpc r19,r25
+ 1824 08c6 04F4 brge .L119
+ 1825 .LVL153:
+ 1826 08c8 3401 movw r6,r8
+ 1827 .LVL154:
+ 1828 08ca 4901 movw r8,r18
+ 1829 08cc C801 movw r24,r16
+ 1830 .LVL155:
+ 1831 08ce 8B01 movw r16,r22
+ 1832 .LVL156:
+ 1833 08d0 5C01 movw r10,r24
+ 1834 08d2 6A01 movw r12,r20
+ 1835 08d4 2701 movw r4,r14
+ 1836 .LVL157:
+ 1837 .L119:
+ 1838 08d6 1301 movw r2,r6
+ 1839 08d8 2818 sub r2,r8
+ 1840 08da 3908 sbc r3,r9
+ 1841 .LM127:
+ 1842 08dc 0A15 cp r16,r10
+ 1843 08de 1B05 cpc r17,r11
+ 1844 08e0 04F4 brge .L120
+ 1845 .LM128:
+ 1846 08e2 B501 movw r22,r10
+ 1847 08e4 601B sub r22,r16
+ 1848 08e6 710B sbc r23,r17
+ 1849 08e8 8827 clr r24
+ 1850 08ea 77FD sbrc r23,7
+ 1851 08ec 8095 com r24
+ 1852 08ee 982F mov r25,r24
+ 1853 08f0 00C0 rjmp .L128
+ 1854 .LVL158:
+ 1855 .L120:
+ 1856 .LM129:
+ 1857 08f2 0A19 sub r16,r10
+ 1858 08f4 1B09 sbc r17,r11
+ 1859 08f6 B801 movw r22,r16
+ 1860 08f8 8827 clr r24
+ 1861 08fa 77FD sbrc r23,7
+ 1862 08fc 8095 com r24
+ 1863 08fe 982F mov r25,r24
+ 1864 .L128:
+ 1865 0900 0E94 0000 call __floatsisf
+ 1866 0904 7B01 movw r14,r22
+ 1867 0906 8C01 movw r16,r24
+ 1868 0908 B101 movw r22,r2
+ 1869 090a 8827 clr r24
+ 1870 090c 77FD sbrc r23,7
+ 1871 090e 8095 com r24
+ 1872 0910 982F mov r25,r24
+ 1873 0912 0E94 0000 call __floatsisf
+ 1874 0916 9B01 movw r18,r22
+ 1875 0918 AC01 movw r20,r24
+ 1876 091a C801 movw r24,r16
+ 1877 091c B701 movw r22,r14
+ 1878 091e 0E94 0000 call __divsf3
+ 1879 0922 6D83 std Y+5,r22
+ 1880 0924 7E83 std Y+6,r23
+ 1881 0926 8F83 std Y+7,r24
+ 1882 0928 9887 std Y+8,r25
+ 1883 .LVL159:
+ 1884 092a 1301 movw r2,r6
+ 1885 092c 2818 sub r2,r8
+ 1886 092e 3908 sbc r3,r9
+ 1887 .LM130:
+ 1888 0930 C414 cp r12,r4
+ 1889 0932 D504 cpc r13,r5
+ 1890 0934 04F4 brge .L122
+ 1891 .LM131:
+ 1892 0936 B201 movw r22,r4
+ 1893 0938 6C19 sub r22,r12
+ 1894 093a 7D09 sbc r23,r13
+ 1895 093c 8827 clr r24
+ 1896 093e 77FD sbrc r23,7
+ 1897 0940 8095 com r24
+ 1898 0942 982F mov r25,r24
+ 1899 0944 00C0 rjmp .L129
+ 1900 .L122:
+ 1901 .LM132:
+ 1902 0946 C418 sub r12,r4
+ 1903 0948 D508 sbc r13,r5
+ 1904 094a B601 movw r22,r12
+ 1905 094c 8827 clr r24
+ 1906 094e 77FD sbrc r23,7
+ 1907 0950 8095 com r24
+ 1908 0952 982F mov r25,r24
+ 1909 .L129:
+ 1910 0954 0E94 0000 call __floatsisf
+ 1911 0958 7B01 movw r14,r22
+ 1912 095a 8C01 movw r16,r24
+ 1913 095c B101 movw r22,r2
+ 1914 095e 8827 clr r24
+ 1915 0960 77FD sbrc r23,7
+ 1916 0962 8095 com r24
+ 1917 0964 982F mov r25,r24
+ 1918 0966 0E94 0000 call __floatsisf
+ 1919 096a 9B01 movw r18,r22
+ 1920 096c AC01 movw r20,r24
+ 1921 096e C801 movw r24,r16
+ 1922 0970 B701 movw r22,r14
+ 1923 0972 0E94 0000 call __divsf3
+ 1924 0976 6983 std Y+1,r22
+ 1925 0978 7A83 std Y+2,r23
+ 1926 097a 8B83 std Y+3,r24
+ 1927 097c 9C83 std Y+4,r25
+ 1928 .LVL160:
+ 1929 .LM133:
+ 1930 097e 382C mov r3,r8
+ 1931 .LVL161:
+ 1932 .LM134:
+ 1933 0980 C501 movw r24,r10
+ 1934 0982 AA27 clr r26
+ 1935 0984 97FD sbrc r25,7
+ 1936 0986 A095 com r26
+ 1937 0988 BA2F mov r27,r26
+ 1938 098a 8987 std Y+9,r24
+ 1939 098c 9A87 std Y+10,r25
+ 1940 098e AB87 std Y+11,r26
+ 1941 0990 BC87 std Y+12,r27
+ 1942 0992 C201 movw r24,r4
+ 1943 0994 AA27 clr r26
+ 1944 0996 97FD sbrc r25,7
+ 1945 0998 A095 com r26
+ 1946 099a BA2F mov r27,r26
+ 1947 099c 8D87 std Y+13,r24
+ 1948 099e 9E87 std Y+14,r25
+ 1949 09a0 AF87 std Y+15,r26
+ 1950 09a2 B88B std Y+16,r27
+ 1951 09a4 00C0 rjmp .L124
+ 1952 .L126:
+ 1953 .LBB170:
+ 1954 .LBB172:
+ 1955 .LBB174:
+ 1956 .LBB176:
+ 1957 .LM135:
+ 1958 09a6 A989 ldd r26,Y+17
+ 1959 09a8 BA89 ldd r27,Y+18
+ 1960 09aa A830 cpi r26,8
+ 1961 09ac B105 cpc r27,__zero_reg__
+ 1962 09ae 00F0 brlo .+2
+ 1963 09b0 00C0 rjmp .L125
+ 1964 .LBE176:
+ 1965 .LBE174:
+ 1966 .LBE172:
+ 1967 .LBE170:
+ 1968 .LM136:
+ 1969 09b2 BD01 movw r22,r26
+ 1970 09b4 6819 sub r22,r8
+ 1971 09b6 7909 sbc r23,r9
+ 1972 09b8 8827 clr r24
+ 1973 09ba 77FD sbrc r23,7
+ 1974 09bc 8095 com r24
+ 1975 09be 982F mov r25,r24
+ 1976 09c0 0E94 0000 call __floatsisf
+ 1977 09c4 5B01 movw r10,r22
+ 1978 09c6 6C01 movw r12,r24
+ 1979 .LVL162:
+ 1980 .LM137:
+ 1981 09c8 6D81 ldd r22,Y+5
+ 1982 09ca 7E81 ldd r23,Y+6
+ 1983 09cc 8F81 ldd r24,Y+7
+ 1984 09ce 9885 ldd r25,Y+8
+ 1985 09d0 A601 movw r20,r12
+ 1986 09d2 9501 movw r18,r10
+ 1987 09d4 0E94 0000 call __mulsf3
+ 1988 09d8 7B01 movw r14,r22
+ 1989 09da 8C01 movw r16,r24
+ 1990 09dc 6985 ldd r22,Y+9
+ 1991 09de 7A85 ldd r23,Y+10
+ 1992 09e0 8B85 ldd r24,Y+11
+ 1993 09e2 9C85 ldd r25,Y+12
+ 1994 09e4 0E94 0000 call __floatsisf
+ 1995 09e8 9B01 movw r18,r22
+ 1996 09ea AC01 movw r20,r24
+ 1997 09ec C801 movw r24,r16
+ 1998 09ee B701 movw r22,r14
+ 1999 09f0 0E94 0000 call __addsf3
+ 2000 09f4 0E94 0000 call __fixunssfsi
+ 2001 09f8 462E mov r4,r22
+ 2002 .LVL163:
+ 2003 09fa 5524 clr r5
+ 2004 .LBB180:
+ 2005 .LBB171:
+ 2006 .LBB173:
+ 2007 .LBB175:
+ 2008 .LM138:
+ 2009 09fc B8E0 ldi r27,lo8(8)
+ 2010 09fe 4B16 cp r4,r27
+ 2011 0a00 5104 cpc r5,__zero_reg__
+ 2012 0a02 04F4 brge .L125
+ 2013 .LBE175:
+ 2014 .LBE173:
+ 2015 .LBE171:
+ 2016 .LBE180:
+ 2017 .LM139:
+ 2018 0a04 6981 ldd r22,Y+1
+ 2019 0a06 7A81 ldd r23,Y+2
+ 2020 0a08 8B81 ldd r24,Y+3
+ 2021 0a0a 9C81 ldd r25,Y+4
+ 2022 0a0c A601 movw r20,r12
+ 2023 0a0e 9501 movw r18,r10
+ 2024 0a10 0E94 0000 call __mulsf3
+ 2025 0a14 7B01 movw r14,r22
+ 2026 0a16 8C01 movw r16,r24
+ 2027 0a18 6D85 ldd r22,Y+13
+ 2028 0a1a 7E85 ldd r23,Y+14
+ 2029 0a1c 8F85 ldd r24,Y+15
+ 2030 0a1e 9889 ldd r25,Y+16
+ 2031 0a20 0E94 0000 call __floatsisf
+ 2032 0a24 9B01 movw r18,r22
+ 2033 0a26 AC01 movw r20,r24
+ 2034 0a28 C801 movw r24,r16
+ 2035 0a2a B701 movw r22,r14
+ 2036 0a2c 0E94 0000 call __addsf3
+ 2037 0a30 0E94 0000 call __fixunssfsi
+ 2038 0a34 70E0 ldi r23,lo8(0)
+ 2039 .LBB181:
+ 2040 .LBB179:
+ 2041 .LBB178:
+ 2042 .LBB177:
+ 2043 .LM140:
+ 2044 0a36 6830 cpi r22,8
+ 2045 0a38 7105 cpc r23,__zero_reg__
+ 2046 0a3a 04F4 brge .L125
+ 2047 .LBE177:
+ 2048 .LBE178:
+ 2049 .LM141:
+ 2050 0a3c FB01 movw r30,r22
+ 2051 0a3e 73E0 ldi r23,3
+ 2052 0a40 EE0F 1: lsl r30
+ 2053 0a42 FF1F rol r31
+ 2054 0a44 7A95 dec r23
+ 2055 0a46 01F4 brne 1b
+ 2056 0a48 E40D add r30,r4
+ 2057 0a4a F51D adc r31,r5
+ 2058 0a4c E050 subi r30,lo8(-(cube))
+ 2059 0a4e F040 sbci r31,hi8(-(cube))
+ 2060 0a50 2081 ld r18,Z
+ 2061 0a52 81E0 ldi r24,lo8(1)
+ 2062 0a54 90E0 ldi r25,hi8(1)
+ 2063 0a56 0988 ldd r0,Y+17
+ 2064 0a58 00C0 rjmp 2f
+ 2065 0a5a 880F 1: lsl r24
+ 2066 0a5c 991F rol r25
+ 2067 0a5e 0A94 2: dec r0
+ 2068 0a60 02F4 brpl 1b
+ 2069 0a62 282B or r18,r24
+ 2070 0a64 2083 st Z,r18
+ 2071 .LVL164:
+ 2072 .L125:
+ 2073 .LBE179:
+ 2074 .LBE181:
+ 2075 .LM142:
+ 2076 0a66 3394 inc r3
+ 2077 .L124:
+ 2078 0a68 E32D mov r30,r3
+ 2079 0a6a F0E0 ldi r31,lo8(0)
+ 2080 0a6c FA8B std Y+18,r31
+ 2081 0a6e E98B std Y+17,r30
+ 2082 0a70 6E16 cp r6,r30
+ 2083 0a72 7F06 cpc r7,r31
+ 2084 0a74 04F0 brlt .+2
+ 2085 0a76 00C0 rjmp .L126
+ 2086 /* epilogue start */
+ 2087 .LM143:
+ 2088 0a78 6296 adiw r28,18
+ 2089 0a7a 0FB6 in __tmp_reg__,__SREG__
+ 2090 0a7c F894 cli
+ 2091 0a7e DEBF out __SP_H__,r29
+ 2092 0a80 0FBE out __SREG__,__tmp_reg__
+ 2093 0a82 CDBF out __SP_L__,r28
+ 2094 0a84 CF91 pop r28
+ 2095 0a86 DF91 pop r29
+ 2096 0a88 1F91 pop r17
+ 2097 0a8a 0F91 pop r16
+ 2098 .LVL165:
+ 2099 0a8c FF90 pop r15
+ 2100 0a8e EF90 pop r14
+ 2101 0a90 DF90 pop r13
+ 2102 0a92 CF90 pop r12
+ 2103 .LVL166:
+ 2104 0a94 BF90 pop r11
+ 2105 0a96 AF90 pop r10
+ 2106 .LVL167:
+ 2107 0a98 9F90 pop r9
+ 2108 0a9a 8F90 pop r8
+ 2109 .LVL168:
+ 2110 0a9c 7F90 pop r7
+ 2111 0a9e 6F90 pop r6
+ 2112 .LVL169:
+ 2113 0aa0 5F90 pop r5
+ 2114 0aa2 4F90 pop r4
+ 2115 .LVL170:
+ 2116 0aa4 3F90 pop r3
+ 2117 .LVL171:
+ 2118 0aa6 2F90 pop r2
+ 2119 0aa8 0895 ret
+ 2120 .LFE24:
+ 2122 .global delay_ms
+ 2124 delay_ms:
+ 2125 .LFB25:
+ 2126 .LM144:
+ 2127 .LVL172:
+ 2128 /* prologue: function */
+ 2129 /* frame size = 0 */
+ 2130 0aaa 00C0 rjmp .L131
+ 2131 .LVL173:
+ 2132 .L133:
+ 2133 .LM145:
+ 2134 0aac 20E0 ldi r18,lo8(0)
+ 2135 .L132:
+ 2136 .LM146:
+ 2137 /* #APP */
+ 2138 ; 350 "draw.c" 1
+ 2139 0aae 0000 nop
+ 2140 ; 0 "" 2
+ 2141 ; 350 "draw.c" 1
+ 2142 0ab0 0000 nop
+ 2143 ; 0 "" 2
+ 2144 ; 350 "draw.c" 1
+ 2145 0ab2 0000 nop
+ 2146 ; 0 "" 2
+ 2147 ; 350 "draw.c" 1
+ 2148 0ab4 0000 nop
+ 2149 ; 0 "" 2
+ 2150 ; 350 "draw.c" 1
+ 2151 0ab6 0000 nop
+ 2152 ; 0 "" 2
+ 2153 ; 350 "draw.c" 1
+ 2154 0ab8 0000 nop
+ 2155 ; 0 "" 2
+ 2156 .LM147:
+ 2157 /* #NOAPP */
+ 2158 0aba 2F5F subi r18,lo8(-(1))
+ 2159 0abc 2A35 cpi r18,lo8(90)
+ 2160 0abe 01F4 brne .L132
+ 2161 .LM148:
+ 2162 0ac0 0197 sbiw r24,1
+ 2163 .LVL174:
+ 2164 .L131:
+ 2165 0ac2 0097 sbiw r24,0
+ 2166 0ac4 01F4 brne .L133
+ 2167 /* epilogue start */
+ 2168 .LM149:
+ 2169 0ac6 0895 ret
+ 2170 .LFE25:
+ 2172 .global tmp2cube
+ 2174 tmp2cube:
+ 2175 .LFB26:
+ 2176 .LM150:
+ 2177 /* prologue: function */
+ 2178 /* frame size = 0 */
+ 2179 .LM151:
+ 2180 0ac8 40E0 ldi r20,lo8(0)
+ 2181 0aca 50E0 ldi r21,hi8(0)
+ 2182 .LVL175:
+ 2183 0acc 00C0 rjmp .L137
+ 2184 .LVL176:
+ 2185 .L138:
+ 2186 .LM152:
+ 2187 0ace FB01 movw r30,r22
+ 2188 0ad0 E20F add r30,r18
+ 2189 0ad2 F31F adc r31,r19
+ 2190 0ad4 DF01 movw r26,r30
+ 2191 0ad6 A050 subi r26,lo8(-(fb))
+ 2192 0ad8 B040 sbci r27,hi8(-(fb))
+ 2193 0ada 8C91 ld r24,X
+ 2194 0adc E050 subi r30,lo8(-(cube))
+ 2195 0ade F040 sbci r31,hi8(-(cube))
+ 2196 0ae0 8083 st Z,r24
+ 2197 .LM153:
+ 2198 0ae2 2F5F subi r18,lo8(-(1))
+ 2199 0ae4 3F4F sbci r19,hi8(-(1))
+ 2200 0ae6 2830 cpi r18,8
+ 2201 0ae8 3105 cpc r19,__zero_reg__
+ 2202 0aea 01F4 brne .L138
+ 2203 .LM154:
+ 2204 0aec 4F5F subi r20,lo8(-(1))
+ 2205 0aee 5F4F sbci r21,hi8(-(1))
+ 2206 0af0 4830 cpi r20,8
+ 2207 0af2 5105 cpc r21,__zero_reg__
+ 2208 0af4 01F0 breq .L140
+ 2209 .L137:
+ 2210 0af6 20E0 ldi r18,lo8(0)
+ 2211 0af8 30E0 ldi r19,hi8(0)
+ 2212 .LM155:
+ 2213 0afa BA01 movw r22,r20
+ 2214 0afc E3E0 ldi r30,3
+ 2215 0afe 660F 1: lsl r22
+ 2216 0b00 771F rol r23
+ 2217 0b02 EA95 dec r30
+ 2218 0b04 01F4 brne 1b
+ 2219 0b06 00C0 rjmp .L138
+ 2220 .L140:
+ 2221 0b08 0895 ret
+ 2222 .LFE26:
+ 2224 .global shift
+ 2226 shift:
+ 2227 .LFB27:
+ 2228 .LM156:
+ 2229 .LVL177:
+ 2230 0b0a 2F92 push r2
+ 2231 0b0c 3F92 push r3
+ 2232 0b0e 4F92 push r4
+ 2233 0b10 5F92 push r5
+ 2234 0b12 6F92 push r6
+ 2235 0b14 7F92 push r7
+ 2236 0b16 9F92 push r9
+ 2237 0b18 AF92 push r10
+ 2238 0b1a BF92 push r11
+ 2239 0b1c CF92 push r12
+ 2240 0b1e DF92 push r13
+ 2241 0b20 EF92 push r14
+ 2242 0b22 FF92 push r15
+ 2243 0b24 0F93 push r16
+ 2244 0b26 1F93 push r17
+ 2245 0b28 CF93 push r28
+ 2246 0b2a DF93 push r29
+ 2247 /* prologue: function */
+ 2248 /* frame size = 0 */
+ 2249 0b2c 982E mov r9,r24
+ 2250 0b2e 5B01 movw r10,r22
+ 2251 .LM157:
+ 2252 0b30 CC24 clr r12
+ 2253 0b32 DD24 clr r13
+ 2254 .LVL178:
+ 2255 .LM158:
+ 2256 0b34 A7E0 ldi r26,lo8(7)
+ 2257 0b36 2A2E mov r2,r26
+ 2258 0b38 312C mov r3,__zero_reg__
+ 2259 .LVL179:
+ 2260 .L153:
+ 2261 0b3a 8FEF ldi r24,lo8(-1)
+ 2262 0b3c A816 cp r10,r24
+ 2263 0b3e 8FEF ldi r24,hi8(-1)
+ 2264 0b40 B806 cpc r11,r24
+ 2265 0b42 01F4 brne .L143
+ 2266 0b44 7601 movw r14,r12
+ 2267 0b46 00C0 rjmp .L144
+ 2268 .L143:
+ 2269 0b48 7101 movw r14,r2
+ 2270 0b4a EC18 sub r14,r12
+ 2271 0b4c FD08 sbc r15,r13
+ 2272 .L144:
+ 2273 0b4e 00E0 ldi r16,lo8(0)
+ 2274 0b50 10E0 ldi r17,hi8(0)
+ 2275 .LM159:
+ 2276 0b52 2701 movw r4,r14
+ 2277 .LVL180:
+ 2278 0b54 0894 sec
+ 2279 0b56 4108 sbc r4,__zero_reg__
+ 2280 0b58 5108 sbc r5,__zero_reg__
+ 2281 .LM160:
+ 2282 0b5a 3701 movw r6,r14
+ 2283 .LVL181:
+ 2284 0b5c 0894 sec
+ 2285 0b5e 611C adc r6,__zero_reg__
+ 2286 0b60 711C adc r7,__zero_reg__
+ 2287 0b62 00C0 rjmp .L145
+ 2288 .LVL182:
+ 2289 .L151:
+ 2290 .LM161:
+ 2291 0b64 8FEF ldi r24,lo8(-1)
+ 2292 0b66 A816 cp r10,r24
+ 2293 0b68 8FEF ldi r24,hi8(-1)
+ 2294 0b6a B806 cpc r11,r24
+ 2295 0b6c 01F4 brne .L146
+ 2296 .LM162:
+ 2297 0b6e C301 movw r24,r6
+ 2298 0b70 00C0 rjmp .L166
+ 2299 .L146:
+ 2300 .LM163:
+ 2301 0b72 C201 movw r24,r4
+ 2302 .LVL183:
+ 2303 .L166:
+ 2304 0b74 AC01 movw r20,r24
+ 2305 .LM164:
+ 2306 0b76 8AE7 ldi r24,lo8(122)
+ 2307 0b78 9816 cp r9,r24
+ 2308 0b7a 01F4 brne .L148
+ 2309 .LVL184:
+ 2310 .LM165:
+ 2311 0b7c C801 movw r24,r16
+ 2312 0b7e BE01 movw r22,r28
+ 2313 0b80 0E94 0000 call getvoxel
+ 2314 0b84 282F mov r18,r24
+ 2315 .LM166:
+ 2316 0b86 C801 movw r24,r16
+ 2317 0b88 BE01 movw r22,r28
+ 2318 0b8a A701 movw r20,r14
+ 2319 0b8c 00C0 rjmp .L167
+ 2320 .LVL185:
+ 2321 .L148:
+ 2322 .LM167:
+ 2323 0b8e 89E7 ldi r24,lo8(121)
+ 2324 0b90 9816 cp r9,r24
+ 2325 0b92 01F4 brne .L150
+ 2326 .LM168:
+ 2327 0b94 C801 movw r24,r16
+ 2328 0b96 BA01 movw r22,r20
+ 2329 0b98 AE01 movw r20,r28
+ 2330 0b9a 0E94 0000 call getvoxel
+ 2331 0b9e 282F mov r18,r24
+ 2332 .LM169:
+ 2333 0ba0 C801 movw r24,r16
+ 2334 0ba2 B701 movw r22,r14
+ 2335 0ba4 00C0 rjmp .L169
+ 2336 .LVL186:
+ 2337 .L150:
+ 2338 .LM170:
+ 2339 0ba6 88E7 ldi r24,lo8(120)
+ 2340 0ba8 9816 cp r9,r24
+ 2341 0baa 01F4 brne .L149
+ 2342 .LM171:
+ 2343 0bac CA01 movw r24,r20
+ 2344 0bae BE01 movw r22,r28
+ 2345 0bb0 A801 movw r20,r16
+ 2346 0bb2 0E94 0000 call getvoxel
+ 2347 0bb6 282F mov r18,r24
+ 2348 .LM172:
+ 2349 0bb8 C701 movw r24,r14
+ 2350 0bba B801 movw r22,r16
+ 2351 .L169:
+ 2352 0bbc AE01 movw r20,r28
+ 2353 .L167:
+ 2354 0bbe 30E0 ldi r19,lo8(0)
+ 2355 0bc0 0E94 0000 call altervoxel
+ 2356 .LVL187:
+ 2357 .L149:
+ 2358 .LM173:
+ 2359 0bc4 2196 adiw r28,1
+ 2360 0bc6 C830 cpi r28,8
+ 2361 0bc8 D105 cpc r29,__zero_reg__
+ 2362 0bca 01F4 brne .L151
+ 2363 .LM174:
+ 2364 0bcc 0F5F subi r16,lo8(-(1))
+ 2365 0bce 1F4F sbci r17,hi8(-(1))
+ 2366 0bd0 0830 cpi r16,8
+ 2367 0bd2 1105 cpc r17,__zero_reg__
+ 2368 0bd4 01F0 breq .L152
+ 2369 .L145:
+ 2370 0bd6 C0E0 ldi r28,lo8(0)
+ 2371 0bd8 D0E0 ldi r29,hi8(0)
+ 2372 0bda 00C0 rjmp .L151
+ 2373 .L152:
+ 2374 .LM175:
+ 2375 0bdc 0894 sec
+ 2376 0bde C11C adc r12,__zero_reg__
+ 2377 0be0 D11C adc r13,__zero_reg__
+ 2378 0be2 88E0 ldi r24,lo8(8)
+ 2379 0be4 C816 cp r12,r24
+ 2380 0be6 D104 cpc r13,__zero_reg__
+ 2381 0be8 01F0 breq .+2
+ 2382 0bea 00C0 rjmp .L153
+ 2383 .LM176:
+ 2384 0bec 8FEF ldi r24,lo8(-1)
+ 2385 0bee A816 cp r10,r24
+ 2386 0bf0 8FEF ldi r24,hi8(-1)
+ 2387 0bf2 B806 cpc r11,r24
+ 2388 0bf4 01F0 breq .L154
+ 2389 0bf6 EE24 clr r14
+ 2390 0bf8 FF24 clr r15
+ 2391 .LVL188:
+ 2392 0bfa 00C0 rjmp .L155
+ 2393 .LVL189:
+ 2394 .L154:
+ 2395 0bfc F7E0 ldi r31,lo8(7)
+ 2396 0bfe EF2E mov r14,r31
+ 2397 0c00 F12C mov r15,__zero_reg__
+ 2398 .LVL190:
+ 2399 .L155:
+ 2400 0c02 00E0 ldi r16,lo8(0)
+ 2401 0c04 10E0 ldi r17,hi8(0)
+ 2402 .LVL191:
+ 2403 0c06 00C0 rjmp .L156
+ 2404 .L160:
+ 2405 .LM177:
+ 2406 0c08 8AE7 ldi r24,lo8(122)
+ 2407 0c0a 9816 cp r9,r24
+ 2408 0c0c 01F4 brne .L157
+ 2409 .LM178:
+ 2410 0c0e C801 movw r24,r16
+ 2411 0c10 BE01 movw r22,r28
+ 2412 0c12 A701 movw r20,r14
+ 2413 0c14 00C0 rjmp .L168
+ 2414 .LVL192:
+ 2415 .L157:
+ 2416 .LM179:
+ 2417 0c16 89E7 ldi r24,lo8(121)
+ 2418 0c18 9816 cp r9,r24
+ 2419 0c1a 01F4 brne .L159
+ 2420 .LM180:
+ 2421 0c1c C801 movw r24,r16
+ 2422 0c1e B701 movw r22,r14
+ 2423 0c20 AE01 movw r20,r28
+ 2424 0c22 00C0 rjmp .L168
+ 2425 .LVL193:
+ 2426 .L159:
+ 2427 .LM181:
+ 2428 0c24 88E7 ldi r24,lo8(120)
+ 2429 0c26 9816 cp r9,r24
+ 2430 0c28 01F4 brne .L158
+ 2431 .LM182:
+ 2432 0c2a C701 movw r24,r14
+ 2433 0c2c BE01 movw r22,r28
+ 2434 0c2e A801 movw r20,r16
+ 2435 .L168:
+ 2436 0c30 0E94 0000 call clrvoxel
+ 2437 .LVL194:
+ 2438 .L158:
+ 2439 .LM183:
+ 2440 0c34 2196 adiw r28,1
+ 2441 0c36 C830 cpi r28,8
+ 2442 0c38 D105 cpc r29,__zero_reg__
+ 2443 0c3a 01F4 brne .L160
+ 2444 .LM184:
+ 2445 0c3c 0F5F subi r16,lo8(-(1))
+ 2446 0c3e 1F4F sbci r17,hi8(-(1))
+ 2447 0c40 0830 cpi r16,8
+ 2448 0c42 1105 cpc r17,__zero_reg__
+ 2449 0c44 01F0 breq .L162
+ 2450 .L156:
+ 2451 0c46 C0E0 ldi r28,lo8(0)
+ 2452 0c48 D0E0 ldi r29,hi8(0)
+ 2453 0c4a 00C0 rjmp .L160
+ 2454 .L162:
+ 2455 /* epilogue start */
+ 2456 .LM185:
+ 2457 0c4c DF91 pop r29
+ 2458 0c4e CF91 pop r28
+ 2459 .LVL195:
+ 2460 0c50 1F91 pop r17
+ 2461 0c52 0F91 pop r16
+ 2462 .LVL196:
+ 2463 0c54 FF90 pop r15
+ 2464 0c56 EF90 pop r14
+ 2465 .LVL197:
+ 2466 0c58 DF90 pop r13
+ 2467 0c5a CF90 pop r12
+ 2468 0c5c BF90 pop r11
+ 2469 0c5e AF90 pop r10
+ 2470 .LVL198:
+ 2471 0c60 9F90 pop r9
+ 2472 .LVL199:
+ 2473 0c62 7F90 pop r7
+ 2474 0c64 6F90 pop r6
+ 2475 .LVL200:
+ 2476 0c66 5F90 pop r5
+ 2477 0c68 4F90 pop r4
+ 2478 .LVL201:
+ 2479 0c6a 3F90 pop r3
+ 2480 0c6c 2F90 pop r2
+ 2481 0c6e 0895 ret
+ 2482 .LFE27:
+ 2484 .comm cube,64,1
+ 2485 .comm fb,64,1
+ 2710 .Letext0:
+DEFINED SYMBOLS
+ *ABS*:0000000000000000 draw.c
+ /tmp/ccqCtm9Q.s:2 *ABS*:000000000000003f __SREG__
+ /tmp/ccqCtm9Q.s:3 *ABS*:000000000000003e __SP_H__
+ /tmp/ccqCtm9Q.s:4 *ABS*:000000000000003d __SP_L__
+ /tmp/ccqCtm9Q.s:5 *ABS*:0000000000000034 __CCP__
+ /tmp/ccqCtm9Q.s:6 *ABS*:0000000000000000 __tmp_reg__
+ /tmp/ccqCtm9Q.s:7 *ABS*:0000000000000001 __zero_reg__
+ /tmp/ccqCtm9Q.s:20 .text:0000000000000000 setvoxel
+ *COM*:0000000000000040 cube
+ /tmp/ccqCtm9Q.s:74 .text:0000000000000046 tmpsetvoxel
+ *COM*:0000000000000040 fb
+ /tmp/ccqCtm9Q.s:128 .text:000000000000008c clrvoxel
+ /tmp/ccqCtm9Q.s:183 .text:00000000000000d4 tmpclrvoxel
+ /tmp/ccqCtm9Q.s:238 .text:000000000000011c inrange
+ /tmp/ccqCtm9Q.s:277 .text:0000000000000144 getvoxel
+ /tmp/ccqCtm9Q.s:336 .text:000000000000018a altervoxel
+ /tmp/ccqCtm9Q.s:404 .text:00000000000001d8 flpvoxel
+ /tmp/ccqCtm9Q.s:458 .text:000000000000021e argorder
+ /tmp/ccqCtm9Q.s:497 .text:0000000000000242 setplane_z
+ /tmp/ccqCtm9Q.s:538 .text:0000000000000270 clrplane_z
+ /tmp/ccqCtm9Q.s:578 .text:000000000000029c setplane_x
+ /tmp/ccqCtm9Q.s:645 .text:00000000000002f2 clrplane_x
+ /tmp/ccqCtm9Q.s:713 .text:000000000000034a setplane_y
+ /tmp/ccqCtm9Q.s:752 .text:0000000000000378 clrplane_y
+ /tmp/ccqCtm9Q.s:790 .text:00000000000003a4 fill
+ /tmp/ccqCtm9Q.s:839 .text:00000000000003de tmpfill
+ /tmp/ccqCtm9Q.s:888 .text:0000000000000418 box_filled
+ /tmp/ccqCtm9Q.s:1026 .text:00000000000004ae box_walls
+ /tmp/ccqCtm9Q.s:1212 .text:0000000000000596 box_wireframe
+ /tmp/ccqCtm9Q.s:1685 .text:0000000000000802 byteline
+ /tmp/ccqCtm9Q.s:1721 .text:000000000000082a flipbyte
+ /tmp/ccqCtm9Q.s:1781 .text:0000000000000884 line
+ /tmp/ccqCtm9Q.s:2124 .text:0000000000000aaa delay_ms
+ /tmp/ccqCtm9Q.s:2174 .text:0000000000000ac8 tmp2cube
+ /tmp/ccqCtm9Q.s:2226 .text:0000000000000b0a shift
+
+UNDEFINED SYMBOLS
+__do_copy_data
+__do_clear_bss
+__floatsisf
+__divsf3
+__mulsf3
+__addsf3
+__fixunssfsi
diff --git a/instructables/cube_pc/draw_3d.c b/instructables/cube_pc/draw_3d.c
new file mode 100644
index 0000000..c3201d9
--- /dev/null
+++ b/instructables/cube_pc/draw_3d.c
@@ -0,0 +1,96 @@
+#include "draw_3d.h"
+#include <math.h>
+
+
+vertex point_rotate_around_point (vertex point, vertex center, float rotation_x, float rotation_y, float rotation_z)
+{
+ float x, y, z;
+ float sx,cx, sy,cy, sz,cz;
+ float xy,xz, yx,yz, zx,zy;
+ vertex newpoint;
+
+ // Center all the points around 0,0,0
+ x = point.x - center.x;
+ y = point.y - center.y;
+ z = point.z - center.z;
+
+ // Precalculate sinus and cosinus for each axis rotation
+ sx = sin(rotation_x);
+ cx = cos(rotation_x);
+
+ sy = sin(rotation_y);
+ cy = cos(rotation_y);
+
+ sz = sin(rotation_z);
+ cz = cos(rotation_z);
+
+
+ // Rotation around x
+ xy = cx*y - sx*z;
+ xz = sx*y + cx*z;
+
+ // Rotation around y
+ yz = cy*xz - sy*x;
+ yx = sy*xz + cy*x;
+
+ // Rotation around z
+ zx = cz*yx - sz*xy;
+ zy = sz*yx + cz*xy;
+
+ newpoint.x = zx + center.x;
+ newpoint.y = zy + center.y;
+ newpoint.z = yz + center.z;
+
+
+ return newpoint;
+}
+
+
+// Calculate all 8 corners of a cube.
+void calculate_cube_corners (vertex pnt[8], vertex center, float size)
+{
+
+ // Distance from center on any axis.
+ float dist = size/2;
+
+ // Points
+ // X Y Z
+
+ pnt[0].x = center.x+dist; pnt[0].y = center.y+dist; pnt[0].z = center.z+dist; // 0 right, front, upper
+ pnt[1].x = center.x-dist; pnt[1].y = center.y+dist; pnt[1].z = center.z+dist; // 1 left, front, upper
+ pnt[2].x = center.x+dist; pnt[2].y = center.y-dist; pnt[2].z = center.z+dist; // 2 right, back, upper
+ pnt[3].x = center.x-dist; pnt[3].y = center.y-dist; pnt[3].z = center.z+dist; // 3 left, back, uppper
+ pnt[4].x = center.x+dist; pnt[4].y = center.y+dist; pnt[4].z = center.z-dist; // 4 right, front, lower
+ pnt[5].x = center.x-dist; pnt[5].y = center.y+dist; pnt[5].z = center.z-dist; // 5 left, front, lower
+ pnt[6].x = center.x+dist; pnt[6].y = center.y-dist; pnt[6].z = center.z-dist; // 6 right, back, lower
+ pnt[7].x = center.x-dist; pnt[7].y = center.y-dist; pnt[7].z = center.z-dist; // 7 left, bakc, lower
+
+
+}
+
+void draw_cube_wireframe (vertex pnt[8])
+{
+ int i;
+
+ // upper "lid"
+ line_3d ((int)pnt[0].x,(int)pnt[0].y,(int)pnt[0].z,(int)pnt[1].x,(int)pnt[1].y,(int)pnt[1].z);
+ line_3d ((int)pnt[2].x,(int)pnt[2].y,(int)pnt[2].z,(int)pnt[3].x,(int)pnt[3].y,(int)pnt[3].z);
+ line_3d ((int)pnt[1].x,(int)pnt[1].y,(int)pnt[1].z,(int)pnt[3].x,(int)pnt[3].y,(int)pnt[3].z);
+ line_3d ((int)pnt[2].x,(int)pnt[2].y,(int)pnt[2].z,(int)pnt[0].x,(int)pnt[0].y,(int)pnt[0].z);
+
+ // lower "lid"
+ line_3d ((int)pnt[4].x,(int)pnt[4].y,(int)pnt[4].z,(int)pnt[5].x,(int)pnt[5].y,(int)pnt[5].z);
+ line_3d ((int)pnt[6].x,(int)pnt[6].y,(int)pnt[6].z,(int)pnt[7].x,(int)pnt[7].y,(int)pnt[7].z);
+ line_3d ((int)pnt[5].x,(int)pnt[5].y,(int)pnt[5].z,(int)pnt[7].x,(int)pnt[7].y,(int)pnt[7].z);
+ line_3d ((int)pnt[6].x,(int)pnt[6].y,(int)pnt[6].z,(int)pnt[4].x,(int)pnt[4].y,(int)pnt[4].z);
+
+ // side walls
+ line_3d ((int)pnt[0].x,(int)pnt[0].y,(int)pnt[0].z,(int)pnt[4].x,(int)pnt[4].y,(int)pnt[4].z);
+ line_3d ((int)pnt[1].x,(int)pnt[1].y,(int)pnt[1].z,(int)pnt[5].x,(int)pnt[5].y,(int)pnt[5].z);
+ line_3d ((int)pnt[2].x,(int)pnt[2].y,(int)pnt[2].z,(int)pnt[6].x,(int)pnt[6].y,(int)pnt[6].z);
+ line_3d ((int)pnt[3].x,(int)pnt[3].y,(int)pnt[3].z,(int)pnt[7].x,(int)pnt[7].y,(int)pnt[7].z);
+
+}
+
+
+
diff --git a/instructables/cube_pc/draw_3d.h b/instructables/cube_pc/draw_3d.h
new file mode 100644
index 0000000..0f56033
--- /dev/null
+++ b/instructables/cube_pc/draw_3d.h
@@ -0,0 +1,26 @@
+#include <stdlib.h>
+
+#ifndef DRAW3D_H
+#define DRAW3D_H
+
+
+typedef struct {
+ float x;
+ float y;
+ float z;
+} vertex;
+
+typedef struct {
+ int x;
+ int y;
+ int z;
+} intvertex;
+
+vertex point_rotate_around_point (vertex point, vertex center, float rotation_x, float rotation_y, float rotation_z);
+
+void rotate_cube_contents(float rx, float ry, float rz);
+
+void calculate_cube_corners (vertex points[8], vertex center, float size);
+
+
+#endif
diff --git a/instructables/cube_pc/effect.c b/instructables/cube_pc/effect.c
new file mode 100644
index 0000000..e6ed54a
--- /dev/null
+++ b/instructables/cube_pc/effect.c
@@ -0,0 +1,1478 @@
+#include "effect.h"
+#include "draw.h"
+#include "font.h"
+#include <math.h>
+
+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);
+ }
+
+}
+
+
+//void effext_stringfly2 (char *str, char axis, char mirror, char direction, int delay, int space)
+void effect_stringfly2(char * str)
+{
+ int x,y,i,ii;
+ int state;
+
+ unsigned char chr[5];
+
+ while (*str)
+ {
+ font_getchar(*str++, chr);
+
+ for (x = 0; x < 5; x++)
+ {
+ for (y = 0; y < 8; y++)
+ {
+ if ((chr[x] & (0x80>>y)))
+ {
+ setvoxel(7,x+2,y);
+ }
+ }
+ }
+
+ for (ii = 0; ii<6; ii++)
+ {
+ delay_ms(1500);
+ for (i = 0; i < 7; i++)
+ {
+ for (x = 0; x < 8; x++)
+ {
+ for (y = 0; y < 8; y++)
+ {
+ state = getvoxel(i+1,x,y);
+ altervoxel(i,x,y,state);
+ }
+ }
+ }
+ for (x = 0; x < 8; x++)
+ {
+ for (y = 0; y < 8; y++)
+ {
+ clrvoxel(7,x,y);
+ }
+ }
+ }
+ }
+ for (ii = 0; ii<8; ii++)
+ {
+ delay_ms(1500);
+ for (i = 0; i < 7; i++)
+ {
+ for (x = 0; x < 8; x++)
+ {
+ for (y = 0; y < 8; y++)
+ {
+ state = getvoxel(i+1,x,y);
+ altervoxel(i,x,y,state);
+ }
+ }
+ }
+ for (x = 0; x < 8; x++)
+ {
+ for (y = 0; y < 8; y++)
+ {
+ clrvoxel(7,x,y);
+ }
+ }
+ }
+
+}
+
+void effect_planboing (int plane, int speed)
+{
+ int i;
+ for (i=0;i<8;i++)
+ {
+ fill(0x00);
+ if (plane == AXIS_Z)
+ setplane_z(i);
+
+ if (plane == AXIS_X)
+ setplane_x(i);
+
+ if (plane == AXIS_Y)
+ setplane_y(i);
+
+ delay_ms(speed);
+ }
+
+ for (i=7;i>=0;i--)
+ {
+ fill(0x00);
+ if (plane == AXIS_Z)
+ setplane_z(i);
+
+ if (plane == AXIS_X)
+ setplane_x(i);
+
+ if (plane == AXIS_Y)
+ setplane_y(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 mode, int direction, uint16_t delay)
+{
+ int x;
+ int i;
+
+ int x1 = 0;
+ int y1 = 0;
+ int z1 = 0;
+ int x2 = 0;
+ int y2 = 0;
+ int z2 = 0;
+
+
+ for (x=0;x<iterations;x++)
+ {
+ for (i=7;i>=0;i--)
+ {
+ if(direction == 0)
+ {
+ // Dette funker også..
+ // memcpy(test, (int[]){1, 2, 3, 4, 5, 6}, 6 * sizeof(int));
+ x1=0; y1=0; z1=0; x2=i; y2=i; z2=i;
+ }
+
+ if(direction == 1) // fail
+ {
+ x1=0; y1=0; z1=7-i; x2=i; y2=i; z2=7;
+ }
+
+ if(direction == 2)
+ {
+ x1=0; y1=7; z1=0; x2=i; y2=7-i; z2=i;
+ }
+
+ if(direction == 3) //fail
+ {
+ x1=0; y1=7; z1=7; x2=i; y2=7-i; z2=7-i;
+ }
+
+ if(direction == 4) //fail
+ {
+ x1=7; y1=0; z1=0; x2=7-i; y2=i; z2=i;
+ }
+
+ if(direction == 5)
+ {
+ x1=7; y1=0; z1=7; x2=7-i; y2=i; z2=7-i;
+ }
+
+ if(direction == 6) //fail
+ {
+ x1=7; y1=7; z1=0; x2=7-i; y2=7-i; z2=i;
+ }
+
+ if(direction == 7)
+ {
+ x1=7; y1=7; z1=7; x2=7-i; y2=7-i; z2=7-i;
+ }
+
+ if (mode == 3)
+ {
+ box_filled(x1,y1,z1,x2,y2,z2);
+ }
+ else if (mode == 2)
+ {
+ box_walls(x1,y1,z1,x2,y2,z2);
+ }
+ else
+ {
+ box_wireframe(x1,y1,z1,x2,y2,z2);
+ }
+
+ delay_ms(delay);
+ fill(0x00);
+ }
+ for (i=0;i<8;i++)
+ {
+ if(direction == 0)
+ {
+ x1=0; y1=0; z1=0; x2=i; y2=i; z2=i;
+ }
+
+ if(direction == 1) // fail
+ {
+ x1=0; y1=0; z1=7-i; x2=i; y2=i; z2=7;
+ }
+
+ if(direction == 2)
+ {
+ x1=0; y1=7; z1=0; x2=i; y2=7-i; z2=i;
+ }
+
+ if(direction == 3) //fail
+ {
+ x1=0; y1=7; z1=7; x2=i; y2=7-i; z2=7-i;
+ }
+
+ if(direction == 4) //fail
+ {
+ x1=7; y1=0; z1=0; x2=7-i; y2=i; z2=i;
+ }
+
+ if(direction == 5)
+ {
+ x1=7; y1=0; z1=7; x2=7-i; y2=i; z2=7-i;
+ }
+
+ if(direction == 6) //fail
+ {
+ x1=7; y1=7; z1=0; x2=7-i; y2=7-i; z2=i;
+ }
+
+ if(direction == 7)
+ {
+ x1=7; y1=7; z1=7; x2=7-i; y2=7-i; z2=7-i;
+ }
+
+ if (mode == 3)
+ {
+ box_filled(x1,y1,z1,x2,y2,z2);
+ }
+ else if (mode == 2)
+ {
+ box_walls(x1,y1,z1,x2,y2,z2);
+ }
+ else
+ {
+ box_wireframe(x1,y1,z1,x2,y2,z2);
+ }
+
+ delay_ms(delay);
+ fill(0x00);
+ }
+ }
+}
+
+
+void effect_box_woopwoop (int delay, int grow)
+{
+ int i;
+
+ fill(0x00);
+ if (grow == 1)
+ {
+ for (i=0;i<4;i++)
+ {
+ box_wireframe(4+i,4+i,4+i,3-i,3-i,3-i);
+ delay_ms(delay);
+ fill(0x00);
+ }
+ } else
+ {
+ for (i=3;i>=0;i--)
+ {
+ box_wireframe(4+i,4+i,4+i,3-i,3-i,3-i);
+ delay_ms(delay);
+ fill(0x00);
+ }
+ }
+}
+
+
+// Send a voxel flying from one side of the cube to the other
+// It 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 = rand()%4;
+ y = rand()%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, last_y, i;
+
+ last_x = 0;
+ last_y = 0;
+
+ fill(0x00);
+
+ //srand(123);
+
+ // 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
+ if (rand()%2 == 0)
+ {
+
+ setvoxel(x,y,0);
+ } else
+ {
+ setvoxel(x,y,7);
+ }
+
+
+ }
+ }
+
+ for (i=0;i<iterations;i++)
+ {
+ // Pick a random x,y position
+ x = rand()%8;
+ y = rand()%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;
+
+ // Coordinate array for the snake.
+ int snake[8][3];
+ for (i=0;i<8;i++)
+ {
+ snake[i][0] = 4;
+ snake[i][1] = 4;
+ snake[i][2] = 4;
+ }
+
+ y = rand()%8;
+ x = rand()%8;
+ z = rand()%8;
+
+ 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 (rand()%3 == 0)
+ {
+ // Pick a random axis, and set the speed to a random number.
+ lol = rand()%3;
+ if (lol == 0)
+ dx = rand()%3 - 1;
+
+ if (lol == 1)
+ dy = rand()%3 - 1;
+
+ if (lol == 2)
+ dz = rand()%3 - 1;
+ }
+
+
+ if (dx == -1 && x == 0)
+ {
+ crash_x = 0x01;
+ if (rand()%3 == 1)
+ {
+ dx = 1;
+ } else
+ {
+ dx = 0;
+ }
+ }
+
+ if (dy == -1 && y == 0)
+ {
+ crash_y = 0x01;
+ if (rand()%3 == 1)
+ {
+ dy = 1;
+ } else
+ {
+ dy = 0;
+ }
+ }
+
+ if (dz == -1 && z == 0)
+ {
+ crash_z = 0x01;
+ if (rand()%3 == 1)
+ {
+ dz = 1;
+ } else
+ {
+ dz = 0;
+ }
+ }
+
+ if (dx == 1 && x == 7)
+ {
+ crash_x = 0x01;
+ if (rand()%3 == 1)
+ {
+ dx = -1;
+ } else
+ {
+ dx = 0;
+ }
+ }
+
+ if (dy == 1 && y == 7)
+ {
+ crash_y = 0x01;
+ if (rand()%3 == 1)
+ {
+ dy = -1;
+ } else
+ {
+ dy = 0;
+ }
+ }
+
+ if (dz == 1 && z == 7)
+ {
+ crash_z = 0x01;
+ if (rand()%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 (rand()%2 == 0)
+ {
+ dy = -1;
+ } else
+ {
+ dy = 1;
+ }
+ }
+ }
+ if (dz == 0)
+ {
+ if (z == 7)
+ {
+ dz = -1;
+ } else if (z == 0)
+ {
+ dz = 1;
+ } else
+ {
+ if (rand()%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 (rand()%2 == 0)
+ {
+ dx = -1;
+ } else
+ {
+ dx = 1;
+ }
+ }
+ }
+ if (dz == 0)
+ {
+ if (z == 3)
+ {
+ dz = -1;
+ } else if (z == 0)
+ {
+ dz = 1;
+ } else
+ {
+ if (rand()%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 (rand()%2 == 0)
+ {
+ dy = -1;
+ } else
+ {
+ dy = 1;
+ }
+ }
+ }
+ if (dx == 0)
+ {
+ if (x == 7)
+ {
+ dx = -1;
+ } else if (x == 0)
+ {
+ dx = 1;
+ } else
+ {
+ if (rand()%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 = rand()%3;
+ if (lol == 0)
+ dx = 0;
+
+ if (lol == 1)
+ dy = 0;
+
+ if (lol == 2)
+ dz = 0;
+ }
+ }
+
+ // 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)
+ {
+ 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 = rand()%8;
+ y = rand()%8;
+ z = rand()%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 = rand()%4;
+
+ for (i=0; i < rnd_num;i++)
+ {
+ rnd_x = rand()%8;
+ rnd_y = rand()%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,px;
+
+ for (i=0; i<64; i++)
+ {
+ positions[i] = 4;
+ destinations[i] = rand()%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<10;y++)
+ {
+ destinations[rand()%64] = rand()%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;
+
+ for (i=0; i<64; i++)
+ {
+ positions[i] = 0;
+ destinations[i] = rand()%8;
+ }
+
+ 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);
+ }
+
+ for (i=0; i<64; i++)
+ {
+ destinations[i] = 7;
+ }
+
+ delay_ms(sleep);
+
+ 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 = rand()%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(rand()%8,rand()%8,rand()%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 = rand()%cube_size;
+ y = rand()%cube_size;
+
+ for (i=0; i<iterations; i++)
+ {
+ dx = ((rand()%3)-1);
+ dy = ((rand()%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_smileyspin (int count, int delay, char bitmap)
+{
+ unsigned char dybde[] = {0,1,2,3,4,5,6,7,1,1,2,3,4,5,6,6,2,2,3,3,4,4,5,5,3,3,3,3,4,4,4,4};
+ int d = 0;
+ int flip = 0;
+ int x, y, off;
+ int i, s;
+ for (i = 0; i<count; i++)
+ {
+ flip = 0;
+ d = 0;
+ off = 0;
+ // front:
+ for (s=0;s<7;s++){
+ if(!flip){
+ off++;
+ if (off == 4){
+ flip = 1;
+ off = 0;
+ }
+ } else {
+ off++;
+ }
+ for (x=0; x<8; x++)
+ {
+ d = 0;
+ for (y=0; y<8; y++)
+ {
+ if (font_getbitmappixel ( bitmap, 7-x, y)){
+ if (!flip)
+ setvoxel(y,dybde[8 * off + d++],x);
+ else
+ setvoxel(y,dybde[31 - 8 * off - d++],x);
+ } else {
+ d++;
+ }
+ }
+ }
+ delay_ms(delay);
+ fill(0x00);
+ }
+
+ // side:
+ off = 0;
+ flip = 0;
+ d = 0;
+ int s;
+ for (s=0;s<7;s++){
+ if(!flip){
+ off++;
+ if (off == 4){
+ flip = 1;
+ off = 0;
+ }
+ } else {
+ off++;
+ }
+ for (x=0; x<8; x++)
+ {
+ d = 0;
+ for (y=0; y<8; y++)
+ {
+ if (font_getbitmappixel ( bitmap, 7-x, y)){
+ if (!flip)
+ setvoxel(dybde[8 * off + d++], 7 - y,x);
+ else
+ setvoxel(dybde[31 - 8 * off - d++],7 - y,x);
+ } else {
+ d++;
+ }
+ }
+ }
+ delay_ms(delay);
+ fill(0x00);
+ }
+
+
+ flip = 0;
+ d = 0;
+ off = 0;
+ // back:
+ for (s=0;s<7;s++){
+ if(!flip){
+ off++;
+ if (off == 4){
+ flip = 1;
+ off = 0;
+ }
+ } else {
+ off++;
+ }
+ for (x=0; x<8; x++)
+ {
+ d = 0;
+ for (y=0; y<8; y++)
+ {
+ if (font_getbitmappixel ( bitmap, 7-x, 7-y)){
+ if (!flip)
+ setvoxel(y,dybde[8 * off + d++],x);
+ else
+ setvoxel(y,dybde[31 - 8 * off - d++],x);
+ } else {
+ d++;
+ }
+ }
+ }
+ delay_ms(delay);
+ fill(0x00);
+ }
+
+ // other side:
+ off = 0;
+ flip = 0;
+ d = 0;
+ for (s=0;s<7;s++){
+ if(!flip){
+ off++;
+ if (off == 4){
+ flip = 1;
+ off = 0;
+ }
+ } else {
+ off++;
+ }
+ for (x=0; x<8; x++)
+ {
+ d = 0;
+ for (y=0; y<8; y++)
+ {
+ if (font_getbitmappixel ( bitmap, 7-x, 7-y)){
+ if (!flip)
+ setvoxel(dybde[8 * off + d++], 7 - y,x);
+ else
+ setvoxel(dybde[31 - 8 * off - d++],7 - y,x);
+ } else {
+ d++;
+ }
+ }
+ }
+ delay_ms(delay);
+ fill(0x00);
+ }
+
+ }
+}
+
+
+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);
+}
+
+void effect_rand_patharound (int iterations, int delay)
+{
+ int z, dz, i;
+ z = 4;
+ unsigned char path[28];
+
+ font_getpath(0,path,28);
+
+ for (i = 0; i < iterations; i++)
+ {
+ dz = ((rand()%3)-1);
+ z += dz;
+
+ if (z>7)
+ z = 7;
+
+ if (z<0)
+ z = 0;
+
+ effect_pathmove(path, 28);
+ setvoxel(0,7,z);
+ delay_ms(delay);
+ }
+}
+
+void effect_pathspiral (int iterations, int delay)
+{
+ int z, i;
+ z = 4;
+ unsigned char path[16];
+
+ font_getpath(1,path,16);
+
+ for (i = 0; i < iterations; i++)
+ {
+ setvoxel(4,0,i%8);
+ delay_ms(delay);
+ effect_pathmove(path, 28);
+
+ }
+}
+
+void effect_path_text (int delay, char *str)
+{
+ int z, i,ii;
+ z = 4;
+ unsigned char path[28];
+ font_getpath(0,path,28);
+
+ unsigned char chr[5];
+ unsigned char stripe;
+
+ while (*str)
+ {
+ //charfly(*str++, direction, axis, mode, delay);
+
+
+ font_getchar(*str++, chr);
+
+ for (ii=0;ii<5;ii++)
+ {
+ //stripe = pgm_read_byte(&font[(chr*5)+ii]);
+ stripe = chr[ii];
+
+ for (z=0;z<8;z++)
+ {
+ if ((stripe>>(7-z)) & 0x01)
+ {
+ setvoxel(0,7,z);
+ } else
+ {
+ clrvoxel(0,7,z);
+ }
+
+ }
+ effect_pathmove(path, 28);
+ delay_ms(delay);
+ }
+
+ effect_pathmove(path, 28);
+ delay_ms(delay);
+ }
+ for (i=0;i<28;i++)
+ {
+ effect_pathmove(path, 28);
+ delay_ms(delay);
+ }
+}
+
+void effect_path_bitmap (int delay, char bitmap, int iterations)
+{
+ int z, i, ii;
+ z = 4;
+ unsigned char path[28];
+ font_getpath(0,path,28);
+
+ for (i=0; i < iterations; i++)
+ {
+ for (ii=0;ii<8;ii++)
+ {
+ for (z=0;z<8;z++)
+ {
+ if (font_getbitmappixel(bitmap,(7-z),ii))
+ {
+ setvoxel(0,7,z);
+ } else
+ {
+ clrvoxel(0,7,z);
+ }
+
+ }
+ delay_ms(delay);
+ effect_pathmove(path, 28);
+ }
+
+ for (ii=0;ii<20;ii++)
+ {
+ delay_ms(delay);
+ effect_pathmove(path, 28);
+ }
+ }
+ for (ii=0;ii<10;ii++)
+ {
+ delay_ms(delay);
+ effect_pathmove(path, 28);
+ }
+}
+
+
+
diff --git a/instructables/cube_pc/effect.h b/instructables/cube_pc/effect.h
new file mode 100644
index 0000000..edaac18
--- /dev/null
+++ b/instructables/cube_pc/effect.h
@@ -0,0 +1,57 @@
+#ifndef EFFECT_H
+#define EFFECT_H
+
+//#include <avr/io.h>
+//#include <avr/pgmspace.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include "cube.h"
+
+
+
+void effect_box_shrink_grow (int iterations, int mode, int direction, 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/instructables/cube_pc/effect.lst b/instructables/cube_pc/effect.lst
new file mode 100644
index 0000000..7a08f0a
--- /dev/null
+++ b/instructables/cube_pc/effect.lst
@@ -0,0 +1,5902 @@
+ 1 .file "effect.c"
+ 2 __SREG__ = 0x3f
+ 3 __SP_H__ = 0x3e
+ 4 __SP_L__ = 0x3d
+ 5 __CCP__ = 0x34
+ 6 __tmp_reg__ = 0
+ 7 __zero_reg__ = 1
+ 8 .global __do_copy_data
+ 9 .global __do_clear_bss
+ 17 .Ltext0:
+ 18 .global effect_telcstairs_do
+ 20 effect_telcstairs_do:
+ 21 .LFB24:
+ 22 .LM1:
+ 23 .LVL0:
+ 24 0000 CF93 push r28
+ 25 0002 DF93 push r29
+ 26 /* prologue: function */
+ 27 /* frame size = 0 */
+ 28 0004 EC01 movw r28,r24
+ 29 .LM2:
+ 30 0006 DC01 movw r26,r24
+ 31 0008 20E0 ldi r18,lo8(0)
+ 32 000a 30E0 ldi r19,hi8(0)
+ 33 .LVL1:
+ 34 000c 00C0 rjmp .L2
+ 35 .LVL2:
+ 36 .L4:
+ 37 .LM3:
+ 38 000e A830 cpi r26,8
+ 39 0010 B105 cpc r27,__zero_reg__
+ 40 0012 04F4 brge .L3
+ 41 .LVL3:
+ 42 0014 2830 cpi r18,8
+ 43 0016 3105 cpc r19,__zero_reg__
+ 44 0018 04F4 brge .L3
+ 45 .LM4:
+ 46 001a FD01 movw r30,r26
+ 47 001c 83E0 ldi r24,3
+ 48 001e EE0F 1: lsl r30
+ 49 0020 FF1F rol r31
+ 50 0022 8A95 dec r24
+ 51 0024 01F4 brne 1b
+ 52 0026 E20F add r30,r18
+ 53 0028 F31F adc r31,r19
+ 54 002a E050 subi r30,lo8(-(cube))
+ 55 002c F040 sbci r31,hi8(-(cube))
+ 56 002e 6083 st Z,r22
+ 57 .LVL4:
+ 58 .L3:
+ 59 .LM5:
+ 60 0030 2F5F subi r18,lo8(-(1))
+ 61 0032 3F4F sbci r19,hi8(-(1))
+ 62 0034 1197 sbiw r26,1
+ 63 .LVL5:
+ 64 .L2:
+ 65 0036 C217 cp r28,r18
+ 66 0038 D307 cpc r29,r19
+ 67 003a 04F4 brge .L4
+ 68 .LVL6:
+ 69 .LM6:
+ 70 003c CA01 movw r24,r20
+ 71 003e 0E94 0000 call delay_ms
+ 72 .LVL7:
+ 73 .LM7:
+ 74 0042 CE01 movw r24,r28
+ 75 .LVL8:
+ 76 /* epilogue start */
+ 77 0044 DF91 pop r29
+ 78 0046 CF91 pop r28
+ 79 0048 0895 ret
+ 80 .LFE24:
+ 82 .global effect_telcstairs
+ 84 effect_telcstairs:
+ 85 .LFB25:
+ 86 .LM8:
+ 87 .LVL9:
+ 88 004a 0F93 push r16
+ 89 004c 1F93 push r17
+ 90 004e CF93 push r28
+ 91 0050 DF93 push r29
+ 92 /* prologue: function */
+ 93 /* frame size = 0 */
+ 94 0052 8B01 movw r16,r22
+ 95 0054 EA01 movw r28,r20
+ 96 .LM9:
+ 97 0056 892B or r24,r25
+ 98 0058 01F0 breq .L7
+ 99 .LVL10:
+ 100 005a 80E1 ldi r24,lo8(16)
+ 101 005c 90E0 ldi r25,hi8(16)
+ 102 .LVL11:
+ 103 .L8:
+ 104 .LM10:
+ 105 005e BE01 movw r22,r28
+ 106 0060 A801 movw r20,r16
+ 107 0062 0E94 0000 call effect_telcstairs_do
+ 108 .LVL12:
+ 109 .LM11:
+ 110 0066 0197 sbiw r24,1
+ 111 .LVL13:
+ 112 0068 97FF sbrs r25,7
+ 113 006a 00C0 rjmp .L8
+ 114 006c 00C0 rjmp .L11
+ 115 .LVL14:
+ 116 .L7:
+ 117 006e 80E0 ldi r24,lo8(0)
+ 118 0070 90E0 ldi r25,hi8(0)
+ 119 .LVL15:
+ 120 .L10:
+ 121 .LM12:
+ 122 0072 BE01 movw r22,r28
+ 123 0074 A801 movw r20,r16
+ 124 0076 0E94 0000 call effect_telcstairs_do
+ 125 .LVL16:
+ 126 .LM13:
+ 127 007a 0196 adiw r24,1
+ 128 .LVL17:
+ 129 007c 8031 cpi r24,16
+ 130 007e 9105 cpc r25,__zero_reg__
+ 131 0080 04F0 brlt .L10
+ 132 .L11:
+ 133 /* epilogue start */
+ 134 .LM14:
+ 135 0082 DF91 pop r29
+ 136 0084 CF91 pop r28
+ 137 .LVL18:
+ 138 0086 1F91 pop r17
+ 139 0088 0F91 pop r16
+ 140 .LVL19:
+ 141 008a 0895 ret
+ 142 .LFE25:
+ 144 .global sendvoxel_z
+ 146 sendvoxel_z:
+ 147 .LFB10:
+ 148 .LM15:
+ 149 .LVL20:
+ 150 008c 7F92 push r7
+ 151 008e 8F92 push r8
+ 152 0090 9F92 push r9
+ 153 0092 AF92 push r10
+ 154 0094 BF92 push r11
+ 155 0096 CF92 push r12
+ 156 0098 DF92 push r13
+ 157 009a EF92 push r14
+ 158 009c FF92 push r15
+ 159 009e 0F93 push r16
+ 160 00a0 1F93 push r17
+ 161 00a2 CF93 push r28
+ 162 00a4 DF93 push r29
+ 163 /* prologue: function */
+ 164 /* frame size = 0 */
+ 165 00a6 E82E mov r14,r24
+ 166 00a8 F62E mov r15,r22
+ 167 00aa 742E mov r7,r20
+ 168 00ac 6901 movw r12,r18
+ 169 .LM16:
+ 170 00ae C0E0 ldi r28,lo8(0)
+ 171 00b0 D0E0 ldi r29,hi8(0)
+ 172 .LVL21:
+ 173 00b2 27E0 ldi r18,lo8(7)
+ 174 00b4 822E mov r8,r18
+ 175 00b6 912C mov r9,__zero_reg__
+ 176 .LVL22:
+ 177 .LM17:
+ 178 00b8 98E0 ldi r25,lo8(8)
+ 179 00ba A92E mov r10,r25
+ 180 00bc B12C mov r11,__zero_reg__
+ 181 .LVL23:
+ 182 .L17:
+ 183 .LM18:
+ 184 00be 87E0 ldi r24,lo8(7)
+ 185 00c0 7816 cp r7,r24
+ 186 00c2 01F4 brne .L15
+ 187 .LM19:
+ 188 00c4 8401 movw r16,r8
+ 189 00c6 0C1B sub r16,r28
+ 190 00c8 1D0B sbc r17,r29
+ 191 .LM20:
+ 192 00ca A501 movw r20,r10
+ 193 00cc 4C1B sub r20,r28
+ 194 00ce 5D0B sbc r21,r29
+ 195 00d0 8E2D mov r24,r14
+ 196 00d2 90E0 ldi r25,lo8(0)
+ 197 00d4 6F2D mov r22,r15
+ 198 00d6 70E0 ldi r23,lo8(0)
+ 199 00d8 0E94 0000 call clrvoxel
+ 200 00dc 00C0 rjmp .L16
+ 201 .LVL24:
+ 202 .L15:
+ 203 .LM21:
+ 204 00de AE01 movw r20,r28
+ 205 00e0 4150 subi r20,lo8(-(-1))
+ 206 00e2 5040 sbci r21,hi8(-(-1))
+ 207 00e4 8E2D mov r24,r14
+ 208 00e6 90E0 ldi r25,lo8(0)
+ 209 00e8 6F2D mov r22,r15
+ 210 00ea 70E0 ldi r23,lo8(0)
+ 211 00ec 0E94 0000 call clrvoxel
+ 212 00f0 8E01 movw r16,r28
+ 213 .L16:
+ 214 .LM22:
+ 215 00f2 8E2D mov r24,r14
+ 216 00f4 90E0 ldi r25,lo8(0)
+ 217 00f6 6F2D mov r22,r15
+ 218 00f8 70E0 ldi r23,lo8(0)
+ 219 00fa A801 movw r20,r16
+ 220 00fc 0E94 0000 call setvoxel
+ 221 .LM23:
+ 222 0100 C601 movw r24,r12
+ 223 0102 0E94 0000 call delay_ms
+ 224 .LM24:
+ 225 0106 2196 adiw r28,1
+ 226 0108 C830 cpi r28,8
+ 227 010a D105 cpc r29,__zero_reg__
+ 228 010c 01F4 brne .L17
+ 229 /* epilogue start */
+ 230 .LM25:
+ 231 010e DF91 pop r29
+ 232 0110 CF91 pop r28
+ 233 .LVL25:
+ 234 0112 1F91 pop r17
+ 235 0114 0F91 pop r16
+ 236 .LVL26:
+ 237 0116 FF90 pop r15
+ 238 .LVL27:
+ 239 0118 EF90 pop r14
+ 240 .LVL28:
+ 241 011a DF90 pop r13
+ 242 011c CF90 pop r12
+ 243 .LVL29:
+ 244 011e BF90 pop r11
+ 245 0120 AF90 pop r10
+ 246 0122 9F90 pop r9
+ 247 0124 8F90 pop r8
+ 248 0126 7F90 pop r7
+ 249 .LVL30:
+ 250 0128 0895 ret
+ 251 .LFE10:
+ 253 .global effect_pathmove
+ 255 effect_pathmove:
+ 256 .LFB28:
+ 257 .LM26:
+ 258 .LVL31:
+ 259 012a CF92 push r12
+ 260 012c DF92 push r13
+ 261 012e EF92 push r14
+ 262 0130 FF92 push r15
+ 263 0132 0F93 push r16
+ 264 0134 1F93 push r17
+ 265 0136 CF93 push r28
+ 266 0138 DF93 push r29
+ 267 /* prologue: function */
+ 268 /* frame size = 0 */
+ 269 013a 6C01 movw r12,r24
+ 270 .LM27:
+ 271 013c 7B01 movw r14,r22
+ 272 .LVL32:
+ 273 013e 0894 sec
+ 274 0140 E108 sbc r14,__zero_reg__
+ 275 0142 F108 sbc r15,__zero_reg__
+ 276 0144 8B01 movw r16,r22
+ 277 0146 0250 subi r16,lo8(-(-2))
+ 278 0148 1040 sbci r17,hi8(-(-2))
+ 279 014a 080F add r16,r24
+ 280 014c 191F adc r17,r25
+ 281 014e 00C0 rjmp .L21
+ 282 .LVL33:
+ 283 .L23:
+ 284 0150 C0E0 ldi r28,lo8(0)
+ 285 0152 D0E0 ldi r29,hi8(0)
+ 286 .LVL34:
+ 287 .L22:
+ 288 .LM28:
+ 289 0154 F801 movw r30,r16
+ 290 0156 8081 ld r24,Z
+ 291 .LVL35:
+ 292 0158 682F mov r22,r24
+ 293 .LVL36:
+ 294 015a 70E0 ldi r23,lo8(0)
+ 295 015c 6F70 andi r22,lo8(15)
+ 296 015e 7070 andi r23,hi8(15)
+ 297 0160 8295 swap r24
+ 298 0162 8F70 andi r24,lo8(15)
+ 299 0164 90E0 ldi r25,lo8(0)
+ 300 0166 AE01 movw r20,r28
+ 301 0168 0E94 0000 call getvoxel
+ 302 016c 282F mov r18,r24
+ 303 .LVL37:
+ 304 .LM29:
+ 305 016e F801 movw r30,r16
+ 306 0170 8181 ldd r24,Z+1
+ 307 0172 682F mov r22,r24
+ 308 0174 70E0 ldi r23,lo8(0)
+ 309 0176 6F70 andi r22,lo8(15)
+ 310 0178 7070 andi r23,hi8(15)
+ 311 017a 8295 swap r24
+ 312 017c 8F70 andi r24,lo8(15)
+ 313 017e 90E0 ldi r25,lo8(0)
+ 314 0180 AE01 movw r20,r28
+ 315 0182 30E0 ldi r19,lo8(0)
+ 316 0184 0E94 0000 call altervoxel
+ 317 .LVL38:
+ 318 .LM30:
+ 319 0188 2196 adiw r28,1
+ 320 018a C830 cpi r28,8
+ 321 018c D105 cpc r29,__zero_reg__
+ 322 018e 01F4 brne .L22
+ 323 .LM31:
+ 324 0190 0894 sec
+ 325 0192 E108 sbc r14,__zero_reg__
+ 326 0194 F108 sbc r15,__zero_reg__
+ 327 0196 0150 subi r16,lo8(-(-1))
+ 328 0198 1040 sbci r17,hi8(-(-1))
+ 329 .LVL39:
+ 330 .L21:
+ 331 019a 1E14 cp __zero_reg__,r14
+ 332 019c 1F04 cpc __zero_reg__,r15
+ 333 019e 04F0 brlt .L23
+ 334 01a0 C0E0 ldi r28,lo8(0)
+ 335 01a2 D0E0 ldi r29,hi8(0)
+ 336 .LVL40:
+ 337 .L24:
+ 338 .LM32:
+ 339 01a4 F601 movw r30,r12
+ 340 01a6 8081 ld r24,Z
+ 341 .LVL41:
+ 342 01a8 682F mov r22,r24
+ 343 .LVL42:
+ 344 01aa 70E0 ldi r23,lo8(0)
+ 345 01ac 6F70 andi r22,lo8(15)
+ 346 01ae 7070 andi r23,hi8(15)
+ 347 01b0 8295 swap r24
+ 348 01b2 8F70 andi r24,lo8(15)
+ 349 01b4 90E0 ldi r25,lo8(0)
+ 350 01b6 AE01 movw r20,r28
+ 351 01b8 0E94 0000 call clrvoxel
+ 352 .LM33:
+ 353 01bc 2196 adiw r28,1
+ 354 01be C830 cpi r28,8
+ 355 01c0 D105 cpc r29,__zero_reg__
+ 356 01c2 01F4 brne .L24
+ 357 /* epilogue start */
+ 358 .LM34:
+ 359 01c4 DF91 pop r29
+ 360 01c6 CF91 pop r28
+ 361 .LVL43:
+ 362 01c8 1F91 pop r17
+ 363 01ca 0F91 pop r16
+ 364 01cc FF90 pop r15
+ 365 01ce EF90 pop r14
+ 366 01d0 DF90 pop r13
+ 367 01d2 CF90 pop r12
+ 368 .LVL44:
+ 369 01d4 0895 ret
+ 370 .LFE28:
+ 372 .global effect_path_bitmap
+ 374 effect_path_bitmap:
+ 375 .LFB32:
+ 376 .LM35:
+ 377 .LVL45:
+ 378 01d6 5F92 push r5
+ 379 01d8 6F92 push r6
+ 380 01da 7F92 push r7
+ 381 01dc 8F92 push r8
+ 382 01de 9F92 push r9
+ 383 01e0 AF92 push r10
+ 384 01e2 BF92 push r11
+ 385 01e4 CF92 push r12
+ 386 01e6 DF92 push r13
+ 387 01e8 EF92 push r14
+ 388 01ea FF92 push r15
+ 389 01ec 0F93 push r16
+ 390 01ee 1F93 push r17
+ 391 01f0 DF93 push r29
+ 392 01f2 CF93 push r28
+ 393 01f4 CDB7 in r28,__SP_L__
+ 394 01f6 DEB7 in r29,__SP_H__
+ 395 01f8 6C97 sbiw r28,28
+ 396 01fa 0FB6 in __tmp_reg__,__SREG__
+ 397 01fc F894 cli
+ 398 01fe DEBF out __SP_H__,r29
+ 399 0200 0FBE out __SREG__,__tmp_reg__
+ 400 0202 CDBF out __SP_L__,r28
+ 401 /* prologue: function */
+ 402 /* frame size = 28 */
+ 403 0204 4C01 movw r8,r24
+ 404 .LVL46:
+ 405 0206 562E mov r5,r22
+ 406 0208 3A01 movw r6,r20
+ 407 .LM36:
+ 408 020a 80E0 ldi r24,lo8(0)
+ 409 020c 5E01 movw r10,r28
+ 410 020e 0894 sec
+ 411 0210 A11C adc r10,__zero_reg__
+ 412 0212 B11C adc r11,__zero_reg__
+ 413 0214 B501 movw r22,r10
+ 414 .LVL47:
+ 415 0216 4CE1 ldi r20,lo8(28)
+ 416 0218 50E0 ldi r21,hi8(28)
+ 417 .LVL48:
+ 418 021a 0E94 0000 call font_getpath
+ 419 021e CC24 clr r12
+ 420 0220 DD24 clr r13
+ 421 .LVL49:
+ 422 0222 00C0 rjmp .L29
+ 423 .LVL50:
+ 424 .L32:
+ 425 .LM37:
+ 426 0224 852D mov r24,r5
+ 427 0226 6F2D mov r22,r15
+ 428 0228 4E2D mov r20,r14
+ 429 022a 0E94 0000 call font_getbitmappixel
+ 430 022e 8823 tst r24
+ 431 0230 01F0 breq .L30
+ 432 .LM38:
+ 433 0232 80E0 ldi r24,lo8(0)
+ 434 0234 90E0 ldi r25,hi8(0)
+ 435 0236 67E0 ldi r22,lo8(7)
+ 436 0238 70E0 ldi r23,hi8(7)
+ 437 023a A801 movw r20,r16
+ 438 023c 0E94 0000 call setvoxel
+ 439 0240 00C0 rjmp .L31
+ 440 .L30:
+ 441 .LM39:
+ 442 0242 80E0 ldi r24,lo8(0)
+ 443 0244 90E0 ldi r25,hi8(0)
+ 444 0246 67E0 ldi r22,lo8(7)
+ 445 0248 70E0 ldi r23,hi8(7)
+ 446 024a A801 movw r20,r16
+ 447 024c 0E94 0000 call clrvoxel
+ 448 .L31:
+ 449 .LM40:
+ 450 0250 0F5F subi r16,lo8(-(1))
+ 451 0252 1F4F sbci r17,hi8(-(1))
+ 452 0254 FA94 dec r15
+ 453 0256 8FEF ldi r24,lo8(-1)
+ 454 0258 F816 cp r15,r24
+ 455 025a 01F4 brne .L32
+ 456 .LM41:
+ 457 025c C401 movw r24,r8
+ 458 025e 0E94 0000 call delay_ms
+ 459 .LM42:
+ 460 0262 C501 movw r24,r10
+ 461 0264 6CE1 ldi r22,lo8(28)
+ 462 0266 70E0 ldi r23,hi8(28)
+ 463 0268 0E94 0000 call effect_pathmove
+ 464 026c E394 inc r14
+ 465 .LM43:
+ 466 026e 88E0 ldi r24,lo8(8)
+ 467 0270 E816 cp r14,r24
+ 468 0272 01F0 breq .L33
+ 469 .LVL51:
+ 470 .L36:
+ 471 0274 00E0 ldi r16,lo8(0)
+ 472 0276 10E0 ldi r17,hi8(0)
+ 473 .LVL52:
+ 474 0278 37E0 ldi r19,lo8(7)
+ 475 027a F32E mov r15,r19
+ 476 027c 00C0 rjmp .L32
+ 477 .L33:
+ 478 027e 00E0 ldi r16,lo8(0)
+ 479 0280 10E0 ldi r17,hi8(0)
+ 480 .LVL53:
+ 481 .L34:
+ 482 .LM44:
+ 483 0282 C401 movw r24,r8
+ 484 0284 0E94 0000 call delay_ms
+ 485 .LM45:
+ 486 0288 C501 movw r24,r10
+ 487 028a 6CE1 ldi r22,lo8(28)
+ 488 028c 70E0 ldi r23,hi8(28)
+ 489 028e 0E94 0000 call effect_pathmove
+ 490 .LM46:
+ 491 0292 0F5F subi r16,lo8(-(1))
+ 492 0294 1F4F sbci r17,hi8(-(1))
+ 493 0296 0431 cpi r16,20
+ 494 0298 1105 cpc r17,__zero_reg__
+ 495 029a 01F4 brne .L34
+ 496 .LM47:
+ 497 029c 0894 sec
+ 498 029e C11C adc r12,__zero_reg__
+ 499 02a0 D11C adc r13,__zero_reg__
+ 500 .L29:
+ 501 02a2 C614 cp r12,r6
+ 502 02a4 D704 cpc r13,r7
+ 503 02a6 04F4 brge .L35
+ 504 02a8 EE24 clr r14
+ 505 02aa 00C0 rjmp .L36
+ 506 .L35:
+ 507 02ac 00E0 ldi r16,lo8(0)
+ 508 02ae 10E0 ldi r17,hi8(0)
+ 509 .LVL54:
+ 510 .LM48:
+ 511 02b0 7E01 movw r14,r28
+ 512 02b2 0894 sec
+ 513 02b4 E11C adc r14,__zero_reg__
+ 514 02b6 F11C adc r15,__zero_reg__
+ 515 .L37:
+ 516 .LM49:
+ 517 02b8 C401 movw r24,r8
+ 518 02ba 0E94 0000 call delay_ms
+ 519 .LM50:
+ 520 02be C701 movw r24,r14
+ 521 02c0 6CE1 ldi r22,lo8(28)
+ 522 02c2 70E0 ldi r23,hi8(28)
+ 523 02c4 0E94 0000 call effect_pathmove
+ 524 .LM51:
+ 525 02c8 0F5F subi r16,lo8(-(1))
+ 526 02ca 1F4F sbci r17,hi8(-(1))
+ 527 02cc 0A30 cpi r16,10
+ 528 02ce 1105 cpc r17,__zero_reg__
+ 529 02d0 01F4 brne .L37
+ 530 /* epilogue start */
+ 531 .LM52:
+ 532 02d2 6C96 adiw r28,28
+ 533 02d4 0FB6 in __tmp_reg__,__SREG__
+ 534 02d6 F894 cli
+ 535 02d8 DEBF out __SP_H__,r29
+ 536 02da 0FBE out __SREG__,__tmp_reg__
+ 537 02dc CDBF out __SP_L__,r28
+ 538 02de CF91 pop r28
+ 539 02e0 DF91 pop r29
+ 540 02e2 1F91 pop r17
+ 541 02e4 0F91 pop r16
+ 542 .LVL55:
+ 543 02e6 FF90 pop r15
+ 544 02e8 EF90 pop r14
+ 545 02ea DF90 pop r13
+ 546 02ec CF90 pop r12
+ 547 .LVL56:
+ 548 02ee BF90 pop r11
+ 549 02f0 AF90 pop r10
+ 550 02f2 9F90 pop r9
+ 551 02f4 8F90 pop r8
+ 552 02f6 7F90 pop r7
+ 553 02f8 6F90 pop r6
+ 554 .LVL57:
+ 555 02fa 5F90 pop r5
+ 556 .LVL58:
+ 557 02fc 0895 ret
+ 558 .LFE32:
+ 560 .global effect_path_text
+ 562 effect_path_text:
+ 563 .LFB31:
+ 564 .LM53:
+ 565 .LVL59:
+ 566 02fe 2F92 push r2
+ 567 0300 3F92 push r3
+ 568 0302 4F92 push r4
+ 569 0304 5F92 push r5
+ 570 0306 6F92 push r6
+ 571 0308 7F92 push r7
+ 572 030a 8F92 push r8
+ 573 030c 9F92 push r9
+ 574 030e AF92 push r10
+ 575 0310 BF92 push r11
+ 576 0312 CF92 push r12
+ 577 0314 DF92 push r13
+ 578 0316 EF92 push r14
+ 579 0318 FF92 push r15
+ 580 031a 0F93 push r16
+ 581 031c 1F93 push r17
+ 582 031e DF93 push r29
+ 583 0320 CF93 push r28
+ 584 0322 CDB7 in r28,__SP_L__
+ 585 0324 DEB7 in r29,__SP_H__
+ 586 0326 A197 sbiw r28,33
+ 587 0328 0FB6 in __tmp_reg__,__SREG__
+ 588 032a F894 cli
+ 589 032c DEBF out __SP_H__,r29
+ 590 032e 0FBE out __SREG__,__tmp_reg__
+ 591 0330 CDBF out __SP_L__,r28
+ 592 /* prologue: function */
+ 593 /* frame size = 33 */
+ 594 0332 3C01 movw r6,r24
+ 595 .LVL60:
+ 596 0334 6B01 movw r12,r22
+ 597 .LM54:
+ 598 0336 56E0 ldi r21,lo8(6)
+ 599 0338 852E mov r8,r21
+ 600 033a 912C mov r9,__zero_reg__
+ 601 033c 8C0E add r8,r28
+ 602 033e 9D1E adc r9,r29
+ 603 0340 80E0 ldi r24,lo8(0)
+ 604 0342 B401 movw r22,r8
+ 605 .LVL61:
+ 606 0344 4CE1 ldi r20,lo8(28)
+ 607 0346 50E0 ldi r21,hi8(28)
+ 608 0348 0E94 0000 call font_getpath
+ 609 .LM55:
+ 610 034c 1E01 movw r2,r28
+ 611 034e 0894 sec
+ 612 0350 211C adc r2,__zero_reg__
+ 613 0352 311C adc r3,__zero_reg__
+ 614 .LM56:
+ 615 0354 2401 movw r4,r8
+ 616 0356 00C0 rjmp .L43
+ 617 .LVL62:
+ 618 .L48:
+ 619 .LM57:
+ 620 0358 B101 movw r22,r2
+ 621 035a 0E94 0000 call font_getchar
+ 622 035e 7101 movw r14,r2
+ 623 .L47:
+ 624 .LM58:
+ 625 0360 F701 movw r30,r14
+ 626 0362 8081 ld r24,Z
+ 627 .LVL63:
+ 628 0364 00E0 ldi r16,lo8(0)
+ 629 0366 10E0 ldi r17,hi8(0)
+ 630 .LM59:
+ 631 0368 A82E mov r10,r24
+ 632 036a BB24 clr r11
+ 633 .LVL64:
+ 634 .L46:
+ 635 036c 87E0 ldi r24,lo8(7)
+ 636 036e 90E0 ldi r25,hi8(7)
+ 637 0370 801B sub r24,r16
+ 638 0372 910B sbc r25,r17
+ 639 0374 9501 movw r18,r10
+ 640 0376 00C0 rjmp 2f
+ 641 0378 3595 1: asr r19
+ 642 037a 2795 ror r18
+ 643 037c 8A95 2: dec r24
+ 644 037e 02F4 brpl 1b
+ 645 0380 20FF sbrs r18,0
+ 646 0382 00C0 rjmp .L44
+ 647 .LM60:
+ 648 0384 80E0 ldi r24,lo8(0)
+ 649 0386 90E0 ldi r25,hi8(0)
+ 650 0388 67E0 ldi r22,lo8(7)
+ 651 038a 70E0 ldi r23,hi8(7)
+ 652 038c A801 movw r20,r16
+ 653 038e 0E94 0000 call setvoxel
+ 654 0392 00C0 rjmp .L45
+ 655 .L44:
+ 656 .LM61:
+ 657 0394 80E0 ldi r24,lo8(0)
+ 658 0396 90E0 ldi r25,hi8(0)
+ 659 0398 67E0 ldi r22,lo8(7)
+ 660 039a 70E0 ldi r23,hi8(7)
+ 661 039c A801 movw r20,r16
+ 662 039e 0E94 0000 call clrvoxel
+ 663 .L45:
+ 664 .LM62:
+ 665 03a2 0F5F subi r16,lo8(-(1))
+ 666 03a4 1F4F sbci r17,hi8(-(1))
+ 667 03a6 0830 cpi r16,8
+ 668 03a8 1105 cpc r17,__zero_reg__
+ 669 03aa 01F4 brne .L46
+ 670 .LM63:
+ 671 03ac C401 movw r24,r8
+ 672 03ae 6CE1 ldi r22,lo8(28)
+ 673 03b0 70E0 ldi r23,hi8(28)
+ 674 03b2 0E94 0000 call effect_pathmove
+ 675 .LM64:
+ 676 03b6 C301 movw r24,r6
+ 677 03b8 0E94 0000 call delay_ms
+ 678 03bc 0894 sec
+ 679 03be E11C adc r14,__zero_reg__
+ 680 03c0 F11C adc r15,__zero_reg__
+ 681 .LM65:
+ 682 03c2 E414 cp r14,r4
+ 683 03c4 F504 cpc r15,r5
+ 684 03c6 01F4 brne .L47
+ 685 .LM66:
+ 686 03c8 0894 sec
+ 687 03ca C11C adc r12,__zero_reg__
+ 688 03cc D11C adc r13,__zero_reg__
+ 689 .LM67:
+ 690 03ce C201 movw r24,r4
+ 691 03d0 6CE1 ldi r22,lo8(28)
+ 692 03d2 70E0 ldi r23,hi8(28)
+ 693 03d4 0E94 0000 call effect_pathmove
+ 694 .LM68:
+ 695 03d8 C301 movw r24,r6
+ 696 03da 0E94 0000 call delay_ms
+ 697 .L43:
+ 698 .LM69:
+ 699 03de F601 movw r30,r12
+ 700 03e0 8081 ld r24,Z
+ 701 03e2 8823 tst r24
+ 702 03e4 01F0 breq .+2
+ 703 03e6 00C0 rjmp .L48
+ 704 03e8 00E0 ldi r16,lo8(0)
+ 705 03ea 10E0 ldi r17,hi8(0)
+ 706 .LVL65:
+ 707 .LM70:
+ 708 03ec 46E0 ldi r20,lo8(6)
+ 709 03ee E42E mov r14,r20
+ 710 03f0 F12C mov r15,__zero_reg__
+ 711 03f2 EC0E add r14,r28
+ 712 03f4 FD1E adc r15,r29
+ 713 .L49:
+ 714 03f6 C701 movw r24,r14
+ 715 03f8 6CE1 ldi r22,lo8(28)
+ 716 03fa 70E0 ldi r23,hi8(28)
+ 717 03fc 0E94 0000 call effect_pathmove
+ 718 .LM71:
+ 719 0400 C301 movw r24,r6
+ 720 0402 0E94 0000 call delay_ms
+ 721 .LM72:
+ 722 0406 0F5F subi r16,lo8(-(1))
+ 723 0408 1F4F sbci r17,hi8(-(1))
+ 724 040a 0C31 cpi r16,28
+ 725 040c 1105 cpc r17,__zero_reg__
+ 726 040e 01F4 brne .L49
+ 727 /* epilogue start */
+ 728 .LM73:
+ 729 0410 A196 adiw r28,33
+ 730 0412 0FB6 in __tmp_reg__,__SREG__
+ 731 0414 F894 cli
+ 732 0416 DEBF out __SP_H__,r29
+ 733 0418 0FBE out __SREG__,__tmp_reg__
+ 734 041a CDBF out __SP_L__,r28
+ 735 041c CF91 pop r28
+ 736 041e DF91 pop r29
+ 737 0420 1F91 pop r17
+ 738 0422 0F91 pop r16
+ 739 .LVL66:
+ 740 0424 FF90 pop r15
+ 741 0426 EF90 pop r14
+ 742 0428 DF90 pop r13
+ 743 042a CF90 pop r12
+ 744 .LVL67:
+ 745 042c BF90 pop r11
+ 746 .LVL68:
+ 747 042e AF90 pop r10
+ 748 .LVL69:
+ 749 0430 9F90 pop r9
+ 750 0432 8F90 pop r8
+ 751 0434 7F90 pop r7
+ 752 0436 6F90 pop r6
+ 753 0438 5F90 pop r5
+ 754 043a 4F90 pop r4
+ 755 043c 3F90 pop r3
+ 756 043e 2F90 pop r2
+ 757 0440 0895 ret
+ 758 .LFE31:
+ 760 .global effect_pathspiral
+ 762 effect_pathspiral:
+ 763 .LFB30:
+ 764 .LM74:
+ 765 .LVL70:
+ 766 0442 9F92 push r9
+ 767 0444 AF92 push r10
+ 768 0446 BF92 push r11
+ 769 0448 CF92 push r12
+ 770 044a DF92 push r13
+ 771 044c EF92 push r14
+ 772 044e FF92 push r15
+ 773 0450 0F93 push r16
+ 774 0452 1F93 push r17
+ 775 0454 DF93 push r29
+ 776 0456 CF93 push r28
+ 777 0458 CDB7 in r28,__SP_L__
+ 778 045a DEB7 in r29,__SP_H__
+ 779 045c 6097 sbiw r28,16
+ 780 045e 0FB6 in __tmp_reg__,__SREG__
+ 781 0460 F894 cli
+ 782 0462 DEBF out __SP_H__,r29
+ 783 0464 0FBE out __SREG__,__tmp_reg__
+ 784 0466 CDBF out __SP_L__,r28
+ 785 /* prologue: function */
+ 786 /* frame size = 16 */
+ 787 0468 5C01 movw r10,r24
+ 788 046a 6B01 movw r12,r22
+ 789 .LM75:
+ 790 046c 81E0 ldi r24,lo8(1)
+ 791 .LVL71:
+ 792 046e 8E01 movw r16,r28
+ 793 0470 0F5F subi r16,lo8(-(1))
+ 794 0472 1F4F sbci r17,hi8(-(1))
+ 795 0474 B801 movw r22,r16
+ 796 .LVL72:
+ 797 0476 40E1 ldi r20,lo8(16)
+ 798 0478 50E0 ldi r21,hi8(16)
+ 799 047a 0E94 0000 call font_getpath
+ 800 047e EE24 clr r14
+ 801 0480 FF24 clr r15
+ 802 .LVL73:
+ 803 .LM76:
+ 804 0482 902E mov r9,r16
+ 805 0484 012F mov r16,r17
+ 806 0486 00C0 rjmp .L55
+ 807 .L56:
+ 808 .LM77:
+ 809 0488 A701 movw r20,r14
+ 810 048a 4770 andi r20,lo8(7)
+ 811 048c 5070 andi r21,hi8(7)
+ 812 048e 84E0 ldi r24,lo8(4)
+ 813 0490 90E0 ldi r25,hi8(4)
+ 814 0492 60E0 ldi r22,lo8(0)
+ 815 0494 70E0 ldi r23,hi8(0)
+ 816 0496 0E94 0000 call setvoxel
+ 817 .LM78:
+ 818 049a C601 movw r24,r12
+ 819 049c 0E94 0000 call delay_ms
+ 820 .LM79:
+ 821 04a0 892D mov r24,r9
+ 822 04a2 902F mov r25,r16
+ 823 04a4 6CE1 ldi r22,lo8(28)
+ 824 04a6 70E0 ldi r23,hi8(28)
+ 825 04a8 0E94 0000 call effect_pathmove
+ 826 .LM80:
+ 827 04ac 0894 sec
+ 828 04ae E11C adc r14,__zero_reg__
+ 829 04b0 F11C adc r15,__zero_reg__
+ 830 .L55:
+ 831 04b2 EA14 cp r14,r10
+ 832 04b4 FB04 cpc r15,r11
+ 833 04b6 04F0 brlt .L56
+ 834 /* epilogue start */
+ 835 .LM81:
+ 836 04b8 6096 adiw r28,16
+ 837 04ba 0FB6 in __tmp_reg__,__SREG__
+ 838 04bc F894 cli
+ 839 04be DEBF out __SP_H__,r29
+ 840 04c0 0FBE out __SREG__,__tmp_reg__
+ 841 04c2 CDBF out __SP_L__,r28
+ 842 04c4 CF91 pop r28
+ 843 04c6 DF91 pop r29
+ 844 04c8 1F91 pop r17
+ 845 04ca 0F91 pop r16
+ 846 04cc FF90 pop r15
+ 847 04ce EF90 pop r14
+ 848 .LVL74:
+ 849 04d0 DF90 pop r13
+ 850 04d2 CF90 pop r12
+ 851 .LVL75:
+ 852 04d4 BF90 pop r11
+ 853 04d6 AF90 pop r10
+ 854 .LVL76:
+ 855 04d8 9F90 pop r9
+ 856 04da 0895 ret
+ 857 .LFE30:
+ 859 .global effect_rand_patharound
+ 861 effect_rand_patharound:
+ 862 .LFB29:
+ 863 .LM82:
+ 864 .LVL77:
+ 865 04dc 7F92 push r7
+ 866 04de 8F92 push r8
+ 867 04e0 9F92 push r9
+ 868 04e2 AF92 push r10
+ 869 04e4 BF92 push r11
+ 870 04e6 CF92 push r12
+ 871 04e8 DF92 push r13
+ 872 04ea EF92 push r14
+ 873 04ec FF92 push r15
+ 874 04ee 0F93 push r16
+ 875 04f0 1F93 push r17
+ 876 04f2 DF93 push r29
+ 877 04f4 CF93 push r28
+ 878 04f6 CDB7 in r28,__SP_L__
+ 879 04f8 DEB7 in r29,__SP_H__
+ 880 04fa 6C97 sbiw r28,28
+ 881 04fc 0FB6 in __tmp_reg__,__SREG__
+ 882 04fe F894 cli
+ 883 0500 DEBF out __SP_H__,r29
+ 884 0502 0FBE out __SREG__,__tmp_reg__
+ 885 0504 CDBF out __SP_L__,r28
+ 886 /* prologue: function */
+ 887 /* frame size = 28 */
+ 888 0506 4C01 movw r8,r24
+ 889 0508 5B01 movw r10,r22
+ 890 .LM83:
+ 891 050a 80E0 ldi r24,lo8(0)
+ 892 .LVL78:
+ 893 050c 8E01 movw r16,r28
+ 894 050e 0F5F subi r16,lo8(-(1))
+ 895 0510 1F4F sbci r17,hi8(-(1))
+ 896 0512 B801 movw r22,r16
+ 897 .LVL79:
+ 898 0514 4CE1 ldi r20,lo8(28)
+ 899 0516 50E0 ldi r21,hi8(28)
+ 900 0518 0E94 0000 call font_getpath
+ 901 051c 74E0 ldi r23,lo8(4)
+ 902 051e E72E mov r14,r23
+ 903 0520 F12C mov r15,__zero_reg__
+ 904 .LVL80:
+ 905 0522 CC24 clr r12
+ 906 0524 DD24 clr r13
+ 907 .LVL81:
+ 908 .LM84:
+ 909 0526 702E mov r7,r16
+ 910 0528 012F mov r16,r17
+ 911 052a 00C0 rjmp .L59
+ 912 .L62:
+ 913 .LM85:
+ 914 052c 0E94 0000 call rand
+ 915 0530 0894 sec
+ 916 0532 E108 sbc r14,__zero_reg__
+ 917 0534 F108 sbc r15,__zero_reg__
+ 918 .LM86:
+ 919 0536 63E0 ldi r22,lo8(3)
+ 920 0538 70E0 ldi r23,hi8(3)
+ 921 053a 0E94 0000 call __divmodhi4
+ 922 053e E80E add r14,r24
+ 923 0540 F91E adc r15,r25
+ 924 .LM87:
+ 925 0542 88E0 ldi r24,lo8(8)
+ 926 0544 E816 cp r14,r24
+ 927 0546 F104 cpc r15,__zero_reg__
+ 928 0548 04F0 brlt .L60
+ 929 054a 67E0 ldi r22,lo8(7)
+ 930 054c E62E mov r14,r22
+ 931 054e F12C mov r15,__zero_reg__
+ 932 0550 00C0 rjmp .L61
+ 933 .L60:
+ 934 .LM88:
+ 935 0552 F7FE sbrs r15,7
+ 936 0554 00C0 rjmp .L61
+ 937 0556 EE24 clr r14
+ 938 0558 FF24 clr r15
+ 939 .L61:
+ 940 .LM89:
+ 941 055a 872D mov r24,r7
+ 942 055c 902F mov r25,r16
+ 943 055e 6CE1 ldi r22,lo8(28)
+ 944 0560 70E0 ldi r23,hi8(28)
+ 945 0562 0E94 0000 call effect_pathmove
+ 946 .LM90:
+ 947 0566 80E0 ldi r24,lo8(0)
+ 948 0568 90E0 ldi r25,hi8(0)
+ 949 056a 67E0 ldi r22,lo8(7)
+ 950 056c 70E0 ldi r23,hi8(7)
+ 951 056e A701 movw r20,r14
+ 952 0570 0E94 0000 call setvoxel
+ 953 .LM91:
+ 954 0574 C501 movw r24,r10
+ 955 0576 0E94 0000 call delay_ms
+ 956 .LM92:
+ 957 057a 0894 sec
+ 958 057c C11C adc r12,__zero_reg__
+ 959 057e D11C adc r13,__zero_reg__
+ 960 .L59:
+ 961 0580 C814 cp r12,r8
+ 962 0582 D904 cpc r13,r9
+ 963 0584 04F0 brlt .L62
+ 964 /* epilogue start */
+ 965 .LM93:
+ 966 0586 6C96 adiw r28,28
+ 967 0588 0FB6 in __tmp_reg__,__SREG__
+ 968 058a F894 cli
+ 969 058c DEBF out __SP_H__,r29
+ 970 058e 0FBE out __SREG__,__tmp_reg__
+ 971 0590 CDBF out __SP_L__,r28
+ 972 0592 CF91 pop r28
+ 973 0594 DF91 pop r29
+ 974 0596 1F91 pop r17
+ 975 0598 0F91 pop r16
+ 976 059a FF90 pop r15
+ 977 059c EF90 pop r14
+ 978 .LVL82:
+ 979 059e DF90 pop r13
+ 980 05a0 CF90 pop r12
+ 981 .LVL83:
+ 982 05a2 BF90 pop r11
+ 983 05a4 AF90 pop r10
+ 984 .LVL84:
+ 985 05a6 9F90 pop r9
+ 986 05a8 8F90 pop r8
+ 987 .LVL85:
+ 988 05aa 7F90 pop r7
+ 989 05ac 0895 ret
+ 990 .LFE29:
+ 992 .global effect_stringfly2
+ 994 effect_stringfly2:
+ 995 .LFB5:
+ 996 .LM94:
+ 997 .LVL86:
+ 998 05ae 2F92 push r2
+ 999 05b0 3F92 push r3
+ 1000 05b2 4F92 push r4
+ 1001 05b4 5F92 push r5
+ 1002 05b6 6F92 push r6
+ 1003 05b8 7F92 push r7
+ 1004 05ba 8F92 push r8
+ 1005 05bc 9F92 push r9
+ 1006 05be AF92 push r10
+ 1007 05c0 BF92 push r11
+ 1008 05c2 CF92 push r12
+ 1009 05c4 DF92 push r13
+ 1010 05c6 EF92 push r14
+ 1011 05c8 FF92 push r15
+ 1012 05ca 0F93 push r16
+ 1013 05cc 1F93 push r17
+ 1014 05ce DF93 push r29
+ 1015 05d0 CF93 push r28
+ 1016 05d2 00D0 rcall .
+ 1017 05d4 00D0 rcall .
+ 1018 05d6 0F92 push __tmp_reg__
+ 1019 05d8 CDB7 in r28,__SP_L__
+ 1020 05da DEB7 in r29,__SP_H__
+ 1021 /* prologue: function */
+ 1022 /* frame size = 5 */
+ 1023 05dc 3C01 movw r6,r24
+ 1024 .LM95:
+ 1025 05de 2E01 movw r4,r28
+ 1026 05e0 0894 sec
+ 1027 05e2 411C adc r4,__zero_reg__
+ 1028 05e4 511C adc r5,__zero_reg__
+ 1029 .LM96:
+ 1030 05e6 F0E8 ldi r31,lo8(128)
+ 1031 05e8 2F2E mov r2,r31
+ 1032 05ea 312C mov r3,__zero_reg__
+ 1033 05ec 00C0 rjmp .L65
+ 1034 .LVL87:
+ 1035 .L78:
+ 1036 .LM97:
+ 1037 05ee B201 movw r22,r4
+ 1038 05f0 0E94 0000 call font_getchar
+ 1039 05f4 EE24 clr r14
+ 1040 05f6 FF24 clr r15
+ 1041 .LVL88:
+ 1042 05f8 00C0 rjmp .L66
+ 1043 .LVL89:
+ 1044 .L68:
+ 1045 .LM98:
+ 1046 05fa 9101 movw r18,r2
+ 1047 05fc 002E mov r0,r16
+ 1048 05fe 00C0 rjmp 2f
+ 1049 0600 3595 1: asr r19
+ 1050 0602 2795 ror r18
+ 1051 0604 0A94 2: dec r0
+ 1052 0606 02F4 brpl 1b
+ 1053 0608 F501 movw r30,r10
+ 1054 060a 8081 ld r24,Z
+ 1055 060c 90E0 ldi r25,lo8(0)
+ 1056 060e 2823 and r18,r24
+ 1057 0610 3923 and r19,r25
+ 1058 0612 232B or r18,r19
+ 1059 0614 01F0 breq .L67
+ 1060 .LM99:
+ 1061 0616 87E0 ldi r24,lo8(7)
+ 1062 0618 90E0 ldi r25,hi8(7)
+ 1063 061a B601 movw r22,r12
+ 1064 061c A801 movw r20,r16
+ 1065 061e 0E94 0000 call setvoxel
+ 1066 .L67:
+ 1067 .LM100:
+ 1068 0622 0F5F subi r16,lo8(-(1))
+ 1069 0624 1F4F sbci r17,hi8(-(1))
+ 1070 0626 0830 cpi r16,8
+ 1071 0628 1105 cpc r17,__zero_reg__
+ 1072 062a 01F4 brne .L68
+ 1073 .LM101:
+ 1074 062c 0894 sec
+ 1075 062e E11C adc r14,__zero_reg__
+ 1076 0630 F11C adc r15,__zero_reg__
+ 1077 0632 F5E0 ldi r31,lo8(5)
+ 1078 0634 EF16 cp r14,r31
+ 1079 0636 F104 cpc r15,__zero_reg__
+ 1080 0638 01F0 breq .L69
+ 1081 .LVL90:
+ 1082 .L66:
+ 1083 063a 00E0 ldi r16,lo8(0)
+ 1084 063c 10E0 ldi r17,hi8(0)
+ 1085 .LM102:
+ 1086 063e 5201 movw r10,r4
+ 1087 .LVL91:
+ 1088 0640 AE0C add r10,r14
+ 1089 0642 BF1C adc r11,r15
+ 1090 .LM103:
+ 1091 0644 E2E0 ldi r30,lo8(2)
+ 1092 0646 CE2E mov r12,r30
+ 1093 0648 D12C mov r13,__zero_reg__
+ 1094 064a CE0C add r12,r14
+ 1095 064c DF1C adc r13,r15
+ 1096 064e 00C0 rjmp .L68
+ 1097 .L69:
+ 1098 .LM104:
+ 1099 0650 AA24 clr r10
+ 1100 0652 BB24 clr r11
+ 1101 .LVL92:
+ 1102 .L77:
+ 1103 .LM105:
+ 1104 0654 88EE ldi r24,lo8(1000)
+ 1105 0656 93E0 ldi r25,hi8(1000)
+ 1106 0658 0E94 0000 call delay_ms
+ 1107 065c CC24 clr r12
+ 1108 065e DD24 clr r13
+ 1109 .LVL93:
+ 1110 0660 00C0 rjmp .L70
+ 1111 .L71:
+ 1112 .LM106:
+ 1113 0662 C401 movw r24,r8
+ 1114 0664 B701 movw r22,r14
+ 1115 0666 A801 movw r20,r16
+ 1116 0668 0E94 0000 call getvoxel
+ 1117 066c 282F mov r18,r24
+ 1118 .LM107:
+ 1119 066e C601 movw r24,r12
+ 1120 0670 B701 movw r22,r14
+ 1121 0672 A801 movw r20,r16
+ 1122 0674 30E0 ldi r19,lo8(0)
+ 1123 0676 0E94 0000 call altervoxel
+ 1124 .LM108:
+ 1125 067a 0F5F subi r16,lo8(-(1))
+ 1126 067c 1F4F sbci r17,hi8(-(1))
+ 1127 067e 0830 cpi r16,8
+ 1128 0680 1105 cpc r17,__zero_reg__
+ 1129 0682 01F4 brne .L71
+ 1130 .LM109:
+ 1131 0684 0894 sec
+ 1132 0686 E11C adc r14,__zero_reg__
+ 1133 0688 F11C adc r15,__zero_reg__
+ 1134 068a 88E0 ldi r24,lo8(8)
+ 1135 068c E816 cp r14,r24
+ 1136 068e F104 cpc r15,__zero_reg__
+ 1137 0690 01F0 breq .L72
+ 1138 .L74:
+ 1139 0692 00E0 ldi r16,lo8(0)
+ 1140 0694 10E0 ldi r17,hi8(0)
+ 1141 0696 00C0 rjmp .L71
+ 1142 .L72:
+ 1143 0698 6401 movw r12,r8
+ 1144 .LM110:
+ 1145 069a E7E0 ldi r30,lo8(7)
+ 1146 069c 8E16 cp r8,r30
+ 1147 069e 9104 cpc r9,__zero_reg__
+ 1148 06a0 01F4 brne .L70
+ 1149 .LVL94:
+ 1150 06a2 EE24 clr r14
+ 1151 06a4 FF24 clr r15
+ 1152 .LVL95:
+ 1153 06a6 00C0 rjmp .L73
+ 1154 .LVL96:
+ 1155 .L70:
+ 1156 06a8 EE24 clr r14
+ 1157 06aa FF24 clr r15
+ 1158 .LM111:
+ 1159 06ac 4601 movw r8,r12
+ 1160 06ae 0894 sec
+ 1161 06b0 811C adc r8,__zero_reg__
+ 1162 06b2 911C adc r9,__zero_reg__
+ 1163 06b4 00C0 rjmp .L74
+ 1164 .LVL97:
+ 1165 .L75:
+ 1166 .LM112:
+ 1167 06b6 87E0 ldi r24,lo8(7)
+ 1168 06b8 90E0 ldi r25,hi8(7)
+ 1169 06ba B701 movw r22,r14
+ 1170 06bc A801 movw r20,r16
+ 1171 06be 0E94 0000 call clrvoxel
+ 1172 .LM113:
+ 1173 06c2 0F5F subi r16,lo8(-(1))
+ 1174 06c4 1F4F sbci r17,hi8(-(1))
+ 1175 06c6 0830 cpi r16,8
+ 1176 06c8 1105 cpc r17,__zero_reg__
+ 1177 06ca 01F4 brne .L75
+ 1178 .LM114:
+ 1179 06cc 0894 sec
+ 1180 06ce E11C adc r14,__zero_reg__
+ 1181 06d0 F11C adc r15,__zero_reg__
+ 1182 06d2 F8E0 ldi r31,lo8(8)
+ 1183 06d4 EF16 cp r14,r31
+ 1184 06d6 F104 cpc r15,__zero_reg__
+ 1185 06d8 01F0 breq .L76
+ 1186 .L73:
+ 1187 06da 00E0 ldi r16,lo8(0)
+ 1188 06dc 10E0 ldi r17,hi8(0)
+ 1189 06de 00C0 rjmp .L75
+ 1190 .L76:
+ 1191 .LM115:
+ 1192 06e0 0894 sec
+ 1193 06e2 A11C adc r10,__zero_reg__
+ 1194 06e4 B11C adc r11,__zero_reg__
+ 1195 06e6 86E0 ldi r24,lo8(6)
+ 1196 06e8 A816 cp r10,r24
+ 1197 06ea B104 cpc r11,__zero_reg__
+ 1198 06ec 01F0 breq .+2
+ 1199 06ee 00C0 rjmp .L77
+ 1200 .LM116:
+ 1201 06f0 0894 sec
+ 1202 06f2 611C adc r6,__zero_reg__
+ 1203 06f4 711C adc r7,__zero_reg__
+ 1204 .LVL98:
+ 1205 .L65:
+ 1206 .LM117:
+ 1207 06f6 F301 movw r30,r6
+ 1208 06f8 8081 ld r24,Z
+ 1209 06fa 8823 tst r24
+ 1210 06fc 01F0 breq .+2
+ 1211 06fe 00C0 rjmp .L78
+ 1212 0700 AA24 clr r10
+ 1213 0702 BB24 clr r11
+ 1214 .LVL99:
+ 1215 .L86:
+ 1216 .LM118:
+ 1217 0704 88EE ldi r24,lo8(1000)
+ 1218 0706 93E0 ldi r25,hi8(1000)
+ 1219 0708 0E94 0000 call delay_ms
+ 1220 070c CC24 clr r12
+ 1221 070e DD24 clr r13
+ 1222 .LVL100:
+ 1223 0710 00C0 rjmp .L79
+ 1224 .L80:
+ 1225 .LM119:
+ 1226 0712 C401 movw r24,r8
+ 1227 0714 B701 movw r22,r14
+ 1228 0716 A801 movw r20,r16
+ 1229 0718 0E94 0000 call getvoxel
+ 1230 071c 282F mov r18,r24
+ 1231 .LM120:
+ 1232 071e C601 movw r24,r12
+ 1233 0720 B701 movw r22,r14
+ 1234 0722 A801 movw r20,r16
+ 1235 0724 30E0 ldi r19,lo8(0)
+ 1236 0726 0E94 0000 call altervoxel
+ 1237 .LM121:
+ 1238 072a 0F5F subi r16,lo8(-(1))
+ 1239 072c 1F4F sbci r17,hi8(-(1))
+ 1240 072e 0830 cpi r16,8
+ 1241 0730 1105 cpc r17,__zero_reg__
+ 1242 0732 01F4 brne .L80
+ 1243 .LM122:
+ 1244 0734 0894 sec
+ 1245 0736 E11C adc r14,__zero_reg__
+ 1246 0738 F11C adc r15,__zero_reg__
+ 1247 073a F8E0 ldi r31,lo8(8)
+ 1248 073c EF16 cp r14,r31
+ 1249 073e F104 cpc r15,__zero_reg__
+ 1250 0740 01F0 breq .L81
+ 1251 .L83:
+ 1252 0742 00E0 ldi r16,lo8(0)
+ 1253 0744 10E0 ldi r17,hi8(0)
+ 1254 0746 00C0 rjmp .L80
+ 1255 .L81:
+ 1256 0748 6401 movw r12,r8
+ 1257 .LM123:
+ 1258 074a 87E0 ldi r24,lo8(7)
+ 1259 074c 8816 cp r8,r24
+ 1260 074e 9104 cpc r9,__zero_reg__
+ 1261 0750 01F4 brne .L79
+ 1262 .LVL101:
+ 1263 0752 EE24 clr r14
+ 1264 0754 FF24 clr r15
+ 1265 .LVL102:
+ 1266 0756 00C0 rjmp .L82
+ 1267 .LVL103:
+ 1268 .L79:
+ 1269 0758 EE24 clr r14
+ 1270 075a FF24 clr r15
+ 1271 .LM124:
+ 1272 075c 4601 movw r8,r12
+ 1273 075e 0894 sec
+ 1274 0760 811C adc r8,__zero_reg__
+ 1275 0762 911C adc r9,__zero_reg__
+ 1276 0764 00C0 rjmp .L83
+ 1277 .LVL104:
+ 1278 .L84:
+ 1279 .LM125:
+ 1280 0766 87E0 ldi r24,lo8(7)
+ 1281 0768 90E0 ldi r25,hi8(7)
+ 1282 076a B701 movw r22,r14
+ 1283 076c A801 movw r20,r16
+ 1284 076e 0E94 0000 call clrvoxel
+ 1285 .LM126:
+ 1286 0772 0F5F subi r16,lo8(-(1))
+ 1287 0774 1F4F sbci r17,hi8(-(1))
+ 1288 0776 0830 cpi r16,8
+ 1289 0778 1105 cpc r17,__zero_reg__
+ 1290 077a 01F4 brne .L84
+ 1291 .LM127:
+ 1292 077c 0894 sec
+ 1293 077e E11C adc r14,__zero_reg__
+ 1294 0780 F11C adc r15,__zero_reg__
+ 1295 0782 E8E0 ldi r30,lo8(8)
+ 1296 0784 EE16 cp r14,r30
+ 1297 0786 F104 cpc r15,__zero_reg__
+ 1298 0788 01F0 breq .L85
+ 1299 .L82:
+ 1300 078a 00E0 ldi r16,lo8(0)
+ 1301 078c 10E0 ldi r17,hi8(0)
+ 1302 078e 00C0 rjmp .L84
+ 1303 .L85:
+ 1304 .LM128:
+ 1305 0790 0894 sec
+ 1306 0792 A11C adc r10,__zero_reg__
+ 1307 0794 B11C adc r11,__zero_reg__
+ 1308 0796 F8E0 ldi r31,lo8(8)
+ 1309 0798 AF16 cp r10,r31
+ 1310 079a B104 cpc r11,__zero_reg__
+ 1311 079c 01F0 breq .+2
+ 1312 079e 00C0 rjmp .L86
+ 1313 /* epilogue start */
+ 1314 .LM129:
+ 1315 07a0 0F90 pop __tmp_reg__
+ 1316 07a2 0F90 pop __tmp_reg__
+ 1317 07a4 0F90 pop __tmp_reg__
+ 1318 07a6 0F90 pop __tmp_reg__
+ 1319 07a8 0F90 pop __tmp_reg__
+ 1320 07aa CF91 pop r28
+ 1321 07ac DF91 pop r29
+ 1322 07ae 1F91 pop r17
+ 1323 07b0 0F91 pop r16
+ 1324 .LVL105:
+ 1325 07b2 FF90 pop r15
+ 1326 07b4 EF90 pop r14
+ 1327 .LVL106:
+ 1328 07b6 DF90 pop r13
+ 1329 07b8 CF90 pop r12
+ 1330 07ba BF90 pop r11
+ 1331 07bc AF90 pop r10
+ 1332 .LVL107:
+ 1333 07be 9F90 pop r9
+ 1334 07c0 8F90 pop r8
+ 1335 .LVL108:
+ 1336 07c2 7F90 pop r7
+ 1337 07c4 6F90 pop r6
+ 1338 .LVL109:
+ 1339 07c6 5F90 pop r5
+ 1340 07c8 4F90 pop r4
+ 1341 07ca 3F90 pop r3
+ 1342 07cc 2F90 pop r2
+ 1343 07ce 0895 ret
+ 1344 .LFE5:
+ 1346 .global effect_smileyspin
+ 1348 effect_smileyspin:
+ 1349 .LFB27:
+ 1350 .LM130:
+ 1351 .LVL110:
+ 1352 07d0 2F92 push r2
+ 1353 07d2 3F92 push r3
+ 1354 07d4 4F92 push r4
+ 1355 07d6 5F92 push r5
+ 1356 07d8 6F92 push r6
+ 1357 07da 7F92 push r7
+ 1358 07dc 8F92 push r8
+ 1359 07de 9F92 push r9
+ 1360 07e0 AF92 push r10
+ 1361 07e2 BF92 push r11
+ 1362 07e4 CF92 push r12
+ 1363 07e6 DF92 push r13
+ 1364 07e8 EF92 push r14
+ 1365 07ea FF92 push r15
+ 1366 07ec 0F93 push r16
+ 1367 07ee 1F93 push r17
+ 1368 07f0 DF93 push r29
+ 1369 07f2 CF93 push r28
+ 1370 07f4 CDB7 in r28,__SP_L__
+ 1371 07f6 DEB7 in r29,__SP_H__
+ 1372 07f8 EC97 sbiw r28,60
+ 1373 07fa 0FB6 in __tmp_reg__,__SREG__
+ 1374 07fc F894 cli
+ 1375 07fe DEBF out __SP_H__,r29
+ 1376 0800 0FBE out __SREG__,__tmp_reg__
+ 1377 0802 CDBF out __SP_L__,r28
+ 1378 /* prologue: function */
+ 1379 /* frame size = 60 */
+ 1380 0804 9FA7 std Y+47,r25
+ 1381 0806 8EA7 std Y+46,r24
+ 1382 0808 69AB std Y+49,r22
+ 1383 080a 7AAB std Y+50,r23
+ 1384 .LVL111:
+ 1385 080c 48AB std Y+48,r20
+ 1386 .LM131:
+ 1387 080e DE01 movw r26,r28
+ 1388 0810 1196 adiw r26,1
+ 1389 0812 E0E0 ldi r30,lo8(C.30.2453)
+ 1390 0814 F0E0 ldi r31,hi8(C.30.2453)
+ 1391 0816 80E2 ldi r24,lo8(32)
+ 1392 .LVL112:
+ 1393 .L98:
+ 1394 0818 0190 ld r0,Z+
+ 1395 081a 0D92 st X+,r0
+ 1396 081c 8150 subi r24,lo8(-(-1))
+ 1397 081e 01F4 brne .L98
+ 1398 0820 1DA6 std Y+45,__zero_reg__
+ 1399 0822 1CA6 std Y+44,__zero_reg__
+ 1400 .LVL113:
+ 1401 .LBB2:
+ 1402 .LBB3:
+ 1403 .LM132:
+ 1404 0824 9E01 movw r18,r28
+ 1405 0826 2F5F subi r18,lo8(-(1))
+ 1406 0828 3F4F sbci r19,hi8(-(1))
+ 1407 082a 3CAF std Y+60,r19
+ 1408 082c 2BAF std Y+59,r18
+ 1409 082e 00C0 rjmp .L99
+ 1410 .LVL114:
+ 1411 .L132:
+ 1412 .LBE3:
+ 1413 .LBE2:
+ 1414 .LM133:
+ 1415 0830 2224 clr r2
+ 1416 0832 3324 clr r3
+ 1417 .LVL115:
+ 1418 0834 8824 clr r8
+ 1419 0836 9924 clr r9
+ 1420 .LVL116:
+ 1421 0838 4424 clr r4
+ 1422 083a 5524 clr r5
+ 1423 .LVL117:
+ 1424 .L107:
+ 1425 083c C401 movw r24,r8
+ 1426 083e 0196 adiw r24,1
+ 1427 .LVL118:
+ 1428 .LBB8:
+ 1429 .LBB4:
+ 1430 .LM134:
+ 1431 0840 2114 cp r2,__zero_reg__
+ 1432 0842 3104 cpc r3,__zero_reg__
+ 1433 0844 01F4 brne .L100
+ 1434 .LM135:
+ 1435 0846 4C01 movw r8,r24
+ 1436 .LM136:
+ 1437 0848 8430 cpi r24,4
+ 1438 084a 9105 cpc r25,__zero_reg__
+ 1439 084c 01F4 brne .L101
+ 1440 084e 71E0 ldi r23,lo8(1)
+ 1441 0850 272E mov r2,r23
+ 1442 0852 312C mov r3,__zero_reg__
+ 1443 .LVL119:
+ 1444 0854 8824 clr r8
+ 1445 0856 9924 clr r9
+ 1446 .LVL120:
+ 1447 0858 00C0 rjmp .L101
+ 1448 .LVL121:
+ 1449 .L100:
+ 1450 .LM137:
+ 1451 085a 4C01 movw r8,r24
+ 1452 .LVL122:
+ 1453 .L101:
+ 1454 .LM138:
+ 1455 085c C401 movw r24,r8
+ 1456 085e 63E0 ldi r22,3
+ 1457 0860 880F 1: lsl r24
+ 1458 0862 991F rol r25
+ 1459 0864 6A95 dec r22
+ 1460 0866 01F4 brne 1b
+ 1461 .LVL123:
+ 1462 .LM139:
+ 1463 0868 6BAC ldd r6,Y+59
+ 1464 086a 7CAC ldd r7,Y+60
+ 1465 086c 681A sub r6,r24
+ 1466 086e 790A sbc r7,r25
+ 1467 0870 AA24 clr r10
+ 1468 0872 BB24 clr r11
+ 1469 0874 E7E0 ldi r30,lo8(7)
+ 1470 0876 EFA3 std Y+39,r30
+ 1471 .LM140:
+ 1472 0878 2FE1 ldi r18,lo8(31)
+ 1473 087a 30E0 ldi r19,hi8(31)
+ 1474 087c 620E add r6,r18
+ 1475 087e 731E adc r7,r19
+ 1476 0880 E1E0 ldi r30,lo8(1)
+ 1477 0882 F0E0 ldi r31,hi8(1)
+ 1478 0884 EC0F add r30,r28
+ 1479 0886 FD1F adc r31,r29
+ 1480 0888 E80F add r30,r24
+ 1481 088a F91F adc r31,r25
+ 1482 088c FAAF std Y+58,r31
+ 1483 088e E9AF std Y+57,r30
+ 1484 0890 00C0 rjmp .L102
+ 1485 .L105:
+ 1486 .LM141:
+ 1487 0892 88A9 ldd r24,Y+48
+ 1488 0894 6FA1 ldd r22,Y+39
+ 1489 0896 402F mov r20,r16
+ 1490 0898 0E94 0000 call font_getbitmappixel
+ 1491 .LVL124:
+ 1492 089c 8823 tst r24
+ 1493 089e 01F0 breq .L103
+ 1494 .LM142:
+ 1495 08a0 2114 cp r2,__zero_reg__
+ 1496 08a2 3104 cpc r3,__zero_reg__
+ 1497 08a4 01F4 brne .L104
+ 1498 .LM143:
+ 1499 08a6 F701 movw r30,r14
+ 1500 08a8 00C0 rjmp .L143
+ 1501 .L104:
+ 1502 .LM144:
+ 1503 08aa F601 movw r30,r12
+ 1504 .L143:
+ 1505 08ac 6081 ld r22,Z
+ 1506 08ae C801 movw r24,r16
+ 1507 08b0 70E0 ldi r23,lo8(0)
+ 1508 08b2 A501 movw r20,r10
+ 1509 08b4 0E94 0000 call setvoxel
+ 1510 .L103:
+ 1511 .LM145:
+ 1512 08b8 0F5F subi r16,lo8(-(1))
+ 1513 08ba 1F4F sbci r17,hi8(-(1))
+ 1514 08bc 0894 sec
+ 1515 08be C108 sbc r12,__zero_reg__
+ 1516 08c0 D108 sbc r13,__zero_reg__
+ 1517 08c2 0894 sec
+ 1518 08c4 E11C adc r14,__zero_reg__
+ 1519 08c6 F11C adc r15,__zero_reg__
+ 1520 08c8 0830 cpi r16,8
+ 1521 08ca 1105 cpc r17,__zero_reg__
+ 1522 08cc 01F4 brne .L105
+ 1523 .LM146:
+ 1524 08ce 0894 sec
+ 1525 08d0 A11C adc r10,__zero_reg__
+ 1526 08d2 B11C adc r11,__zero_reg__
+ 1527 08d4 FFA1 ldd r31,Y+39
+ 1528 08d6 F150 subi r31,lo8(-(-1))
+ 1529 08d8 FFA3 std Y+39,r31
+ 1530 08da FF3F cpi r31,lo8(-1)
+ 1531 08dc 01F0 breq .L106
+ 1532 .LVL125:
+ 1533 .L102:
+ 1534 08de 6301 movw r12,r6
+ 1535 08e0 E9AC ldd r14,Y+57
+ 1536 08e2 FAAC ldd r15,Y+58
+ 1537 08e4 00E0 ldi r16,lo8(0)
+ 1538 08e6 10E0 ldi r17,hi8(0)
+ 1539 08e8 00C0 rjmp .L105
+ 1540 .LVL126:
+ 1541 .L106:
+ 1542 .LM147:
+ 1543 08ea 89A9 ldd r24,Y+49
+ 1544 08ec 9AA9 ldd r25,Y+50
+ 1545 08ee 0E94 0000 call delay_ms
+ 1546 .LM148:
+ 1547 08f2 80E0 ldi r24,lo8(0)
+ 1548 08f4 0E94 0000 call fill
+ 1549 .LM149:
+ 1550 08f8 0894 sec
+ 1551 08fa 411C adc r4,__zero_reg__
+ 1552 08fc 511C adc r5,__zero_reg__
+ 1553 08fe 27E0 ldi r18,lo8(7)
+ 1554 0900 4216 cp r4,r18
+ 1555 0902 5104 cpc r5,__zero_reg__
+ 1556 0904 01F0 breq .+2
+ 1557 0906 00C0 rjmp .L107
+ 1558 0908 1EA2 std Y+38,__zero_reg__
+ 1559 090a 1DA2 std Y+37,__zero_reg__
+ 1560 .LVL127:
+ 1561 090c 6624 clr r6
+ 1562 090e 7724 clr r7
+ 1563 .LVL128:
+ 1564 0910 2224 clr r2
+ 1565 0912 3324 clr r3
+ 1566 .LVL129:
+ 1567 .L115:
+ 1568 0914 C301 movw r24,r6
+ 1569 0916 0196 adiw r24,1
+ 1570 .LVL130:
+ 1571 .LBE4:
+ 1572 .LBB5:
+ 1573 .LM150:
+ 1574 0918 EDA1 ldd r30,Y+37
+ 1575 091a FEA1 ldd r31,Y+38
+ 1576 091c EF2B or r30,r31
+ 1577 091e 01F4 brne .L108
+ 1578 .LM151:
+ 1579 0920 3C01 movw r6,r24
+ 1580 .LM152:
+ 1581 0922 8430 cpi r24,4
+ 1582 0924 9105 cpc r25,__zero_reg__
+ 1583 0926 01F4 brne .L109
+ 1584 0928 21E0 ldi r18,lo8(1)
+ 1585 092a 30E0 ldi r19,hi8(1)
+ 1586 092c 3EA3 std Y+38,r19
+ 1587 092e 2DA3 std Y+37,r18
+ 1588 .LVL131:
+ 1589 0930 6624 clr r6
+ 1590 0932 7724 clr r7
+ 1591 .LVL132:
+ 1592 0934 00C0 rjmp .L109
+ 1593 .LVL133:
+ 1594 .L108:
+ 1595 .LM153:
+ 1596 0936 3C01 movw r6,r24
+ 1597 .LVL134:
+ 1598 .L109:
+ 1599 .LM154:
+ 1600 0938 C301 movw r24,r6
+ 1601 093a 53E0 ldi r21,3
+ 1602 093c 880F 1: lsl r24
+ 1603 093e 991F rol r25
+ 1604 0940 5A95 dec r21
+ 1605 0942 01F4 brne 1b
+ 1606 .LM155:
+ 1607 0944 4BAC ldd r4,Y+59
+ 1608 0946 5CAC ldd r5,Y+60
+ 1609 .LVL135:
+ 1610 0948 481A sub r4,r24
+ 1611 094a 590A sbc r5,r25
+ 1612 094c 8824 clr r8
+ 1613 094e 9924 clr r9
+ 1614 0950 37E0 ldi r19,lo8(7)
+ 1615 0952 38A7 std Y+40,r19
+ 1616 .LM156:
+ 1617 0954 EFE1 ldi r30,lo8(31)
+ 1618 0956 F0E0 ldi r31,hi8(31)
+ 1619 0958 4E0E add r4,r30
+ 1620 095a 5F1E adc r5,r31
+ 1621 095c 21E0 ldi r18,lo8(1)
+ 1622 095e 30E0 ldi r19,hi8(1)
+ 1623 0960 2C0F add r18,r28
+ 1624 0962 3D1F adc r19,r29
+ 1625 0964 280F add r18,r24
+ 1626 0966 391F adc r19,r25
+ 1627 0968 38AF std Y+56,r19
+ 1628 096a 2FAB std Y+55,r18
+ 1629 096c 00C0 rjmp .L110
+ 1630 .LVL136:
+ 1631 .L113:
+ 1632 .LM157:
+ 1633 096e 4E2D mov r20,r14
+ 1634 0970 4150 subi r20,lo8(-(-1))
+ 1635 0972 88A9 ldd r24,Y+48
+ 1636 0974 68A5 ldd r22,Y+40
+ 1637 0976 0E94 0000 call font_getbitmappixel
+ 1638 097a 8823 tst r24
+ 1639 097c 01F0 breq .L111
+ 1640 .LM158:
+ 1641 097e 8DA1 ldd r24,Y+37
+ 1642 0980 9EA1 ldd r25,Y+38
+ 1643 0982 892B or r24,r25
+ 1644 0984 01F4 brne .L112
+ 1645 .LM159:
+ 1646 0986 F601 movw r30,r12
+ 1647 0988 00C0 rjmp .L144
+ 1648 .L112:
+ 1649 .LM160:
+ 1650 098a F501 movw r30,r10
+ 1651 .L144:
+ 1652 098c 8081 ld r24,Z
+ 1653 098e 90E0 ldi r25,lo8(0)
+ 1654 0990 B801 movw r22,r16
+ 1655 0992 A401 movw r20,r8
+ 1656 0994 0E94 0000 call setvoxel
+ 1657 .L111:
+ 1658 0998 0894 sec
+ 1659 099a E11C adc r14,__zero_reg__
+ 1660 099c F11C adc r15,__zero_reg__
+ 1661 099e 0150 subi r16,lo8(-(-1))
+ 1662 09a0 1040 sbci r17,hi8(-(-1))
+ 1663 09a2 0894 sec
+ 1664 09a4 A108 sbc r10,__zero_reg__
+ 1665 09a6 B108 sbc r11,__zero_reg__
+ 1666 09a8 0894 sec
+ 1667 09aa C11C adc r12,__zero_reg__
+ 1668 09ac D11C adc r13,__zero_reg__
+ 1669 .LM161:
+ 1670 09ae F9E0 ldi r31,lo8(9)
+ 1671 09b0 EF16 cp r14,r31
+ 1672 09b2 F104 cpc r15,__zero_reg__
+ 1673 09b4 01F4 brne .L113
+ 1674 .LM162:
+ 1675 09b6 0894 sec
+ 1676 09b8 811C adc r8,__zero_reg__
+ 1677 09ba 911C adc r9,__zero_reg__
+ 1678 09bc 28A5 ldd r18,Y+40
+ 1679 09be 2150 subi r18,lo8(-(-1))
+ 1680 09c0 28A7 std Y+40,r18
+ 1681 09c2 2F3F cpi r18,lo8(-1)
+ 1682 09c4 01F0 breq .L114
+ 1683 .LVL137:
+ 1684 .L110:
+ 1685 09c6 5201 movw r10,r4
+ 1686 09c8 CFA8 ldd r12,Y+55
+ 1687 09ca D8AC ldd r13,Y+56
+ 1688 09cc 41E0 ldi r20,lo8(1)
+ 1689 09ce E42E mov r14,r20
+ 1690 09d0 F12C mov r15,__zero_reg__
+ 1691 09d2 07E0 ldi r16,lo8(7)
+ 1692 09d4 10E0 ldi r17,hi8(7)
+ 1693 .LVL138:
+ 1694 09d6 00C0 rjmp .L113
+ 1695 .L114:
+ 1696 .LM163:
+ 1697 09d8 89A9 ldd r24,Y+49
+ 1698 09da 9AA9 ldd r25,Y+50
+ 1699 09dc 0E94 0000 call delay_ms
+ 1700 .LM164:
+ 1701 09e0 80E0 ldi r24,lo8(0)
+ 1702 09e2 0E94 0000 call fill
+ 1703 .LM165:
+ 1704 09e6 0894 sec
+ 1705 09e8 211C adc r2,__zero_reg__
+ 1706 09ea 311C adc r3,__zero_reg__
+ 1707 09ec 37E0 ldi r19,lo8(7)
+ 1708 09ee 2316 cp r2,r19
+ 1709 09f0 3104 cpc r3,__zero_reg__
+ 1710 09f2 01F0 breq .+2
+ 1711 09f4 00C0 rjmp .L115
+ 1712 09f6 1CA2 std Y+36,__zero_reg__
+ 1713 09f8 1BA2 std Y+35,__zero_reg__
+ 1714 .LVL139:
+ 1715 09fa 6624 clr r6
+ 1716 09fc 7724 clr r7
+ 1717 .LVL140:
+ 1718 09fe 1BA6 std Y+43,__zero_reg__
+ 1719 0a00 1AA6 std Y+42,__zero_reg__
+ 1720 .LVL141:
+ 1721 .L123:
+ 1722 0a02 C301 movw r24,r6
+ 1723 0a04 0196 adiw r24,1
+ 1724 .LVL142:
+ 1725 .LBE5:
+ 1726 .LBB6:
+ 1727 .LM166:
+ 1728 0a06 EBA1 ldd r30,Y+35
+ 1729 0a08 FCA1 ldd r31,Y+36
+ 1730 0a0a EF2B or r30,r31
+ 1731 0a0c 01F4 brne .L116
+ 1732 .LM167:
+ 1733 0a0e 3C01 movw r6,r24
+ 1734 .LM168:
+ 1735 0a10 8430 cpi r24,4
+ 1736 0a12 9105 cpc r25,__zero_reg__
+ 1737 0a14 01F4 brne .L117
+ 1738 0a16 21E0 ldi r18,lo8(1)
+ 1739 0a18 30E0 ldi r19,hi8(1)
+ 1740 0a1a 3CA3 std Y+36,r19
+ 1741 0a1c 2BA3 std Y+35,r18
+ 1742 .LVL143:
+ 1743 0a1e 6624 clr r6
+ 1744 0a20 7724 clr r7
+ 1745 .LVL144:
+ 1746 0a22 00C0 rjmp .L117
+ 1747 .LVL145:
+ 1748 .L116:
+ 1749 .LM169:
+ 1750 0a24 3C01 movw r6,r24
+ 1751 .LVL146:
+ 1752 .L117:
+ 1753 .LM170:
+ 1754 0a26 C301 movw r24,r6
+ 1755 0a28 33E0 ldi r19,3
+ 1756 0a2a 880F 1: lsl r24
+ 1757 0a2c 991F rol r25
+ 1758 0a2e 3A95 dec r19
+ 1759 0a30 01F4 brne 1b
+ 1760 .LM171:
+ 1761 0a32 4BAC ldd r4,Y+59
+ 1762 0a34 5CAC ldd r5,Y+60
+ 1763 0a36 481A sub r4,r24
+ 1764 0a38 590A sbc r5,r25
+ 1765 0a3a AA24 clr r10
+ 1766 0a3c BB24 clr r11
+ 1767 .LVL147:
+ 1768 0a3e 27E0 ldi r18,lo8(7)
+ 1769 0a40 222E mov r2,r18
+ 1770 .LVL148:
+ 1771 .LM172:
+ 1772 0a42 EFE1 ldi r30,lo8(31)
+ 1773 0a44 F0E0 ldi r31,hi8(31)
+ 1774 0a46 4E0E add r4,r30
+ 1775 0a48 5F1E adc r5,r31
+ 1776 0a4a 21E0 ldi r18,lo8(1)
+ 1777 0a4c 30E0 ldi r19,hi8(1)
+ 1778 0a4e 2C0F add r18,r28
+ 1779 0a50 3D1F adc r19,r29
+ 1780 0a52 280F add r18,r24
+ 1781 0a54 391F adc r19,r25
+ 1782 0a56 3EAB std Y+54,r19
+ 1783 0a58 2DAB std Y+53,r18
+ 1784 0a5a 00C0 rjmp .L118
+ 1785 .L121:
+ 1786 .LM173:
+ 1787 0a5c 4801 movw r8,r16
+ 1788 0a5e 0894 sec
+ 1789 0a60 8108 sbc r8,__zero_reg__
+ 1790 0a62 9108 sbc r9,__zero_reg__
+ 1791 .LM174:
+ 1792 0a64 88A9 ldd r24,Y+48
+ 1793 0a66 622D mov r22,r2
+ 1794 0a68 432D mov r20,r3
+ 1795 0a6a 0E94 0000 call font_getbitmappixel
+ 1796 0a6e 8823 tst r24
+ 1797 0a70 01F0 breq .L119
+ 1798 .LM175:
+ 1799 0a72 8BA1 ldd r24,Y+35
+ 1800 0a74 9CA1 ldd r25,Y+36
+ 1801 0a76 892B or r24,r25
+ 1802 0a78 01F4 brne .L120
+ 1803 .LM176:
+ 1804 0a7a F701 movw r30,r14
+ 1805 0a7c 00C0 rjmp .L145
+ 1806 .L120:
+ 1807 .LM177:
+ 1808 0a7e F601 movw r30,r12
+ 1809 .L145:
+ 1810 0a80 6081 ld r22,Z
+ 1811 0a82 C401 movw r24,r8
+ 1812 0a84 70E0 ldi r23,lo8(0)
+ 1813 0a86 A501 movw r20,r10
+ 1814 0a88 0E94 0000 call setvoxel
+ 1815 .L119:
+ 1816 0a8c 0F5F subi r16,lo8(-(1))
+ 1817 0a8e 1F4F sbci r17,hi8(-(1))
+ 1818 0a90 3A94 dec r3
+ 1819 0a92 0894 sec
+ 1820 0a94 C108 sbc r12,__zero_reg__
+ 1821 0a96 D108 sbc r13,__zero_reg__
+ 1822 0a98 0894 sec
+ 1823 0a9a E11C adc r14,__zero_reg__
+ 1824 0a9c F11C adc r15,__zero_reg__
+ 1825 .LM178:
+ 1826 0a9e FFEF ldi r31,lo8(-1)
+ 1827 0aa0 3F16 cp r3,r31
+ 1828 0aa2 01F4 brne .L121
+ 1829 .LM179:
+ 1830 0aa4 0894 sec
+ 1831 0aa6 A11C adc r10,__zero_reg__
+ 1832 0aa8 B11C adc r11,__zero_reg__
+ 1833 0aaa 2A94 dec r2
+ 1834 0aac 2F16 cp r2,r31
+ 1835 0aae 01F0 breq .L122
+ 1836 .L118:
+ 1837 0ab0 6201 movw r12,r4
+ 1838 0ab2 EDA8 ldd r14,Y+53
+ 1839 0ab4 FEA8 ldd r15,Y+54
+ 1840 0ab6 01E0 ldi r16,lo8(1)
+ 1841 0ab8 10E0 ldi r17,hi8(1)
+ 1842 0aba 87E0 ldi r24,lo8(7)
+ 1843 0abc 382E mov r3,r24
+ 1844 0abe 00C0 rjmp .L121
+ 1845 .L122:
+ 1846 .LM180:
+ 1847 0ac0 89A9 ldd r24,Y+49
+ 1848 0ac2 9AA9 ldd r25,Y+50
+ 1849 0ac4 0E94 0000 call delay_ms
+ 1850 .LM181:
+ 1851 0ac8 80E0 ldi r24,lo8(0)
+ 1852 0aca 0E94 0000 call fill
+ 1853 .LM182:
+ 1854 0ace 2AA5 ldd r18,Y+42
+ 1855 0ad0 3BA5 ldd r19,Y+43
+ 1856 0ad2 2F5F subi r18,lo8(-(1))
+ 1857 0ad4 3F4F sbci r19,hi8(-(1))
+ 1858 0ad6 3BA7 std Y+43,r19
+ 1859 0ad8 2AA7 std Y+42,r18
+ 1860 .LVL149:
+ 1861 0ada 2730 cpi r18,7
+ 1862 0adc 3105 cpc r19,__zero_reg__
+ 1863 0ade 01F0 breq .+2
+ 1864 0ae0 00C0 rjmp .L123
+ 1865 0ae2 1AA2 std Y+34,__zero_reg__
+ 1866 0ae4 19A2 std Y+33,__zero_reg__
+ 1867 .LVL150:
+ 1868 0ae6 6624 clr r6
+ 1869 0ae8 7724 clr r7
+ 1870 .LVL151:
+ 1871 0aea 2224 clr r2
+ 1872 0aec 3324 clr r3
+ 1873 .LVL152:
+ 1874 .L131:
+ 1875 0aee C301 movw r24,r6
+ 1876 0af0 0196 adiw r24,1
+ 1877 .LVL153:
+ 1878 .LBE6:
+ 1879 .LBB7:
+ 1880 .LM183:
+ 1881 0af2 E9A1 ldd r30,Y+33
+ 1882 0af4 FAA1 ldd r31,Y+34
+ 1883 0af6 EF2B or r30,r31
+ 1884 0af8 01F4 brne .L124
+ 1885 .LM184:
+ 1886 0afa 3C01 movw r6,r24
+ 1887 .LM185:
+ 1888 0afc 8430 cpi r24,4
+ 1889 0afe 9105 cpc r25,__zero_reg__
+ 1890 0b00 01F4 brne .L125
+ 1891 0b02 21E0 ldi r18,lo8(1)
+ 1892 0b04 30E0 ldi r19,hi8(1)
+ 1893 0b06 3AA3 std Y+34,r19
+ 1894 0b08 29A3 std Y+33,r18
+ 1895 .LVL154:
+ 1896 0b0a 6624 clr r6
+ 1897 0b0c 7724 clr r7
+ 1898 .LVL155:
+ 1899 0b0e 00C0 rjmp .L125
+ 1900 .LVL156:
+ 1901 .L124:
+ 1902 .LM186:
+ 1903 0b10 3C01 movw r6,r24
+ 1904 .LVL157:
+ 1905 .L125:
+ 1906 .LM187:
+ 1907 0b12 C301 movw r24,r6
+ 1908 0b14 B3E0 ldi r27,3
+ 1909 0b16 880F 1: lsl r24
+ 1910 0b18 991F rol r25
+ 1911 0b1a BA95 dec r27
+ 1912 0b1c 01F4 brne 1b
+ 1913 .LM188:
+ 1914 0b1e 4BAC ldd r4,Y+59
+ 1915 0b20 5CAC ldd r5,Y+60
+ 1916 0b22 481A sub r4,r24
+ 1917 0b24 590A sbc r5,r25
+ 1918 0b26 8824 clr r8
+ 1919 0b28 9924 clr r9
+ 1920 .LVL158:
+ 1921 0b2a 37E0 ldi r19,lo8(7)
+ 1922 0b2c 39A7 std Y+41,r19
+ 1923 .LM189:
+ 1924 0b2e EFE1 ldi r30,lo8(31)
+ 1925 0b30 F0E0 ldi r31,hi8(31)
+ 1926 0b32 4E0E add r4,r30
+ 1927 0b34 5F1E adc r5,r31
+ 1928 0b36 21E0 ldi r18,lo8(1)
+ 1929 0b38 30E0 ldi r19,hi8(1)
+ 1930 0b3a 2C0F add r18,r28
+ 1931 0b3c 3D1F adc r19,r29
+ 1932 0b3e 280F add r18,r24
+ 1933 0b40 391F adc r19,r25
+ 1934 0b42 3CAB std Y+52,r19
+ 1935 0b44 2BAB std Y+51,r18
+ 1936 0b46 00C0 rjmp .L126
+ 1937 .L129:
+ 1938 .LM190:
+ 1939 0b48 88A9 ldd r24,Y+48
+ 1940 0b4a 69A5 ldd r22,Y+41
+ 1941 0b4c 402F mov r20,r16
+ 1942 0b4e 0E94 0000 call font_getbitmappixel
+ 1943 0b52 8823 tst r24
+ 1944 0b54 01F0 breq .L127
+ 1945 .LM191:
+ 1946 0b56 89A1 ldd r24,Y+33
+ 1947 0b58 9AA1 ldd r25,Y+34
+ 1948 0b5a 892B or r24,r25
+ 1949 0b5c 01F4 brne .L128
+ 1950 .LM192:
+ 1951 0b5e F601 movw r30,r12
+ 1952 0b60 00C0 rjmp .L146
+ 1953 .L128:
+ 1954 .LM193:
+ 1955 0b62 F501 movw r30,r10
+ 1956 .L146:
+ 1957 0b64 8081 ld r24,Z
+ 1958 0b66 90E0 ldi r25,lo8(0)
+ 1959 0b68 B801 movw r22,r16
+ 1960 0b6a A401 movw r20,r8
+ 1961 0b6c 0E94 0000 call setvoxel
+ 1962 .L127:
+ 1963 0b70 0894 sec
+ 1964 0b72 E11C adc r14,__zero_reg__
+ 1965 0b74 F11C adc r15,__zero_reg__
+ 1966 0b76 0150 subi r16,lo8(-(-1))
+ 1967 0b78 1040 sbci r17,hi8(-(-1))
+ 1968 0b7a 0894 sec
+ 1969 0b7c A108 sbc r10,__zero_reg__
+ 1970 0b7e B108 sbc r11,__zero_reg__
+ 1971 0b80 0894 sec
+ 1972 0b82 C11C adc r12,__zero_reg__
+ 1973 0b84 D11C adc r13,__zero_reg__
+ 1974 .LM194:
+ 1975 0b86 F9E0 ldi r31,lo8(9)
+ 1976 0b88 EF16 cp r14,r31
+ 1977 0b8a F104 cpc r15,__zero_reg__
+ 1978 0b8c 01F4 brne .L129
+ 1979 .LM195:
+ 1980 0b8e 0894 sec
+ 1981 0b90 811C adc r8,__zero_reg__
+ 1982 0b92 911C adc r9,__zero_reg__
+ 1983 0b94 29A5 ldd r18,Y+41
+ 1984 0b96 2150 subi r18,lo8(-(-1))
+ 1985 0b98 29A7 std Y+41,r18
+ 1986 0b9a 2F3F cpi r18,lo8(-1)
+ 1987 0b9c 01F0 breq .L130
+ 1988 .L126:
+ 1989 0b9e 5201 movw r10,r4
+ 1990 0ba0 CBA8 ldd r12,Y+51
+ 1991 0ba2 DCA8 ldd r13,Y+52
+ 1992 0ba4 A1E0 ldi r26,lo8(1)
+ 1993 0ba6 EA2E mov r14,r26
+ 1994 0ba8 F12C mov r15,__zero_reg__
+ 1995 0baa 07E0 ldi r16,lo8(7)
+ 1996 0bac 10E0 ldi r17,hi8(7)
+ 1997 0bae 00C0 rjmp .L129
+ 1998 .L130:
+ 1999 .LM196:
+ 2000 0bb0 89A9 ldd r24,Y+49
+ 2001 0bb2 9AA9 ldd r25,Y+50
+ 2002 0bb4 0E94 0000 call delay_ms
+ 2003 .LM197:
+ 2004 0bb8 80E0 ldi r24,lo8(0)
+ 2005 0bba 0E94 0000 call fill
+ 2006 .LM198:
+ 2007 0bbe 0894 sec
+ 2008 0bc0 211C adc r2,__zero_reg__
+ 2009 0bc2 311C adc r3,__zero_reg__
+ 2010 0bc4 37E0 ldi r19,lo8(7)
+ 2011 0bc6 2316 cp r2,r19
+ 2012 0bc8 3104 cpc r3,__zero_reg__
+ 2013 0bca 01F0 breq .+2
+ 2014 0bcc 00C0 rjmp .L131
+ 2015 .LBE7:
+ 2016 .LM199:
+ 2017 0bce 8CA5 ldd r24,Y+44
+ 2018 0bd0 9DA5 ldd r25,Y+45
+ 2019 0bd2 0196 adiw r24,1
+ 2020 0bd4 9DA7 std Y+45,r25
+ 2021 0bd6 8CA7 std Y+44,r24
+ 2022 .LVL159:
+ 2023 .L99:
+ 2024 0bd8 ECA5 ldd r30,Y+44
+ 2025 0bda FDA5 ldd r31,Y+45
+ 2026 0bdc 2EA5 ldd r18,Y+46
+ 2027 0bde 3FA5 ldd r19,Y+47
+ 2028 0be0 E217 cp r30,r18
+ 2029 0be2 F307 cpc r31,r19
+ 2030 0be4 04F4 brge .+2
+ 2031 0be6 00C0 rjmp .L132
+ 2032 /* epilogue start */
+ 2033 .LBE8:
+ 2034 .LM200:
+ 2035 0be8 EC96 adiw r28,60
+ 2036 0bea 0FB6 in __tmp_reg__,__SREG__
+ 2037 0bec F894 cli
+ 2038 0bee DEBF out __SP_H__,r29
+ 2039 0bf0 0FBE out __SREG__,__tmp_reg__
+ 2040 0bf2 CDBF out __SP_L__,r28
+ 2041 0bf4 CF91 pop r28
+ 2042 0bf6 DF91 pop r29
+ 2043 0bf8 1F91 pop r17
+ 2044 0bfa 0F91 pop r16
+ 2045 0bfc FF90 pop r15
+ 2046 0bfe EF90 pop r14
+ 2047 0c00 DF90 pop r13
+ 2048 0c02 CF90 pop r12
+ 2049 0c04 BF90 pop r11
+ 2050 0c06 AF90 pop r10
+ 2051 0c08 9F90 pop r9
+ 2052 0c0a 8F90 pop r8
+ 2053 .LVL160:
+ 2054 0c0c 7F90 pop r7
+ 2055 0c0e 6F90 pop r6
+ 2056 .LVL161:
+ 2057 0c10 5F90 pop r5
+ 2058 0c12 4F90 pop r4
+ 2059 0c14 3F90 pop r3
+ 2060 0c16 2F90 pop r2
+ 2061 .LVL162:
+ 2062 0c18 0895 ret
+ 2063 .LFE27:
+ 2065 .global effect_random_sparkle_flash
+ 2067 effect_random_sparkle_flash:
+ 2068 .LFB22:
+ 2069 .LM201:
+ 2070 .LVL163:
+ 2071 0c1a 6F92 push r6
+ 2072 0c1c 7F92 push r7
+ 2073 0c1e 8F92 push r8
+ 2074 0c20 9F92 push r9
+ 2075 0c22 AF92 push r10
+ 2076 0c24 BF92 push r11
+ 2077 0c26 CF92 push r12
+ 2078 0c28 DF92 push r13
+ 2079 0c2a EF92 push r14
+ 2080 0c2c FF92 push r15
+ 2081 0c2e 0F93 push r16
+ 2082 0c30 1F93 push r17
+ 2083 0c32 CF93 push r28
+ 2084 0c34 DF93 push r29
+ 2085 /* prologue: function */
+ 2086 /* frame size = 0 */
+ 2087 0c36 3C01 movw r6,r24
+ 2088 0c38 4B01 movw r8,r22
+ 2089 0c3a 5A01 movw r10,r20
+ 2090 .LM202:
+ 2091 0c3c CC24 clr r12
+ 2092 0c3e DD24 clr r13
+ 2093 .LVL164:
+ 2094 0c40 00C0 rjmp .L148
+ 2095 .LVL165:
+ 2096 .L149:
+ 2097 .LM203:
+ 2098 0c42 0E94 0000 call rand
+ 2099 0c46 8C01 movw r16,r24
+ 2100 0c48 0E94 0000 call rand
+ 2101 0c4c 7C01 movw r14,r24
+ 2102 0c4e 0E94 0000 call rand
+ 2103 0c52 FC01 movw r30,r24
+ 2104 0c54 C801 movw r24,r16
+ 2105 0c56 68E0 ldi r22,lo8(8)
+ 2106 0c58 70E0 ldi r23,hi8(8)
+ 2107 0c5a 0E94 0000 call __divmodhi4
+ 2108 0c5e 8C01 movw r16,r24
+ 2109 0c60 C701 movw r24,r14
+ 2110 0c62 68E0 ldi r22,lo8(8)
+ 2111 0c64 70E0 ldi r23,hi8(8)
+ 2112 0c66 0E94 0000 call __divmodhi4
+ 2113 0c6a 9C01 movw r18,r24
+ 2114 0c6c CF01 movw r24,r30
+ 2115 0c6e 68E0 ldi r22,lo8(8)
+ 2116 0c70 70E0 ldi r23,hi8(8)
+ 2117 0c72 0E94 0000 call __divmodhi4
+ 2118 0c76 AC01 movw r20,r24
+ 2119 0c78 C801 movw r24,r16
+ 2120 0c7a B901 movw r22,r18
+ 2121 0c7c 0E94 0000 call setvoxel
+ 2122 .LM204:
+ 2123 0c80 2196 adiw r28,1
+ 2124 .LVL166:
+ 2125 .L151:
+ 2126 0c82 8C16 cp r8,r28
+ 2127 0c84 9D06 cpc r9,r29
+ 2128 0c86 04F4 brge .L149
+ 2129 .LM205:
+ 2130 0c88 C501 movw r24,r10
+ 2131 0c8a 0E94 0000 call delay_ms
+ 2132 .LM206:
+ 2133 0c8e 80E0 ldi r24,lo8(0)
+ 2134 0c90 0E94 0000 call fill
+ 2135 .LM207:
+ 2136 0c94 0894 sec
+ 2137 0c96 C11C adc r12,__zero_reg__
+ 2138 0c98 D11C adc r13,__zero_reg__
+ 2139 .LVL167:
+ 2140 .L148:
+ 2141 0c9a C614 cp r12,r6
+ 2142 0c9c D704 cpc r13,r7
+ 2143 0c9e 04F4 brge .L152
+ 2144 0ca0 C0E0 ldi r28,lo8(0)
+ 2145 0ca2 D0E0 ldi r29,hi8(0)
+ 2146 0ca4 00C0 rjmp .L151
+ 2147 .L152:
+ 2148 /* epilogue start */
+ 2149 .LM208:
+ 2150 0ca6 DF91 pop r29
+ 2151 0ca8 CF91 pop r28
+ 2152 .LVL168:
+ 2153 0caa 1F91 pop r17
+ 2154 0cac 0F91 pop r16
+ 2155 0cae FF90 pop r15
+ 2156 0cb0 EF90 pop r14
+ 2157 0cb2 DF90 pop r13
+ 2158 0cb4 CF90 pop r12
+ 2159 .LVL169:
+ 2160 0cb6 BF90 pop r11
+ 2161 0cb8 AF90 pop r10
+ 2162 .LVL170:
+ 2163 0cba 9F90 pop r9
+ 2164 0cbc 8F90 pop r8
+ 2165 .LVL171:
+ 2166 0cbe 7F90 pop r7
+ 2167 0cc0 6F90 pop r6
+ 2168 .LVL172:
+ 2169 0cc2 0895 ret
+ 2170 .LFE22:
+ 2172 .global effect_random_sparkle
+ 2174 effect_random_sparkle:
+ 2175 .LFB23:
+ 2176 .LM209:
+ 2177 0cc4 CF93 push r28
+ 2178 0cc6 DF93 push r29
+ 2179 /* prologue: function */
+ 2180 /* frame size = 0 */
+ 2181 .LM210:
+ 2182 0cc8 C1E0 ldi r28,lo8(1)
+ 2183 0cca D0E0 ldi r29,hi8(1)
+ 2184 .LVL173:
+ 2185 .L154:
+ 2186 .LM211:
+ 2187 0ccc 85E0 ldi r24,lo8(5)
+ 2188 0cce 90E0 ldi r25,hi8(5)
+ 2189 0cd0 BE01 movw r22,r28
+ 2190 0cd2 48EC ldi r20,lo8(200)
+ 2191 0cd4 50E0 ldi r21,hi8(200)
+ 2192 0cd6 0E94 0000 call effect_random_sparkle_flash
+ 2193 .LM212:
+ 2194 0cda 2196 adiw r28,1
+ 2195 0cdc C431 cpi r28,20
+ 2196 0cde D105 cpc r29,__zero_reg__
+ 2197 0ce0 01F4 brne .L154
+ 2198 .L157:
+ 2199 .LM213:
+ 2200 0ce2 85E0 ldi r24,lo8(5)
+ 2201 0ce4 90E0 ldi r25,hi8(5)
+ 2202 0ce6 BE01 movw r22,r28
+ 2203 0ce8 48EC ldi r20,lo8(200)
+ 2204 0cea 50E0 ldi r21,hi8(200)
+ 2205 0cec 0E94 0000 call effect_random_sparkle_flash
+ 2206 .LM214:
+ 2207 0cf0 2197 sbiw r28,1
+ 2208 0cf2 01F4 brne .L157
+ 2209 /* epilogue start */
+ 2210 .LM215:
+ 2211 0cf4 DF91 pop r29
+ 2212 0cf6 CF91 pop r28
+ 2213 .LVL174:
+ 2214 0cf8 0895 ret
+ 2215 .LFE23:
+ 2217 .global effect_loadbar
+ 2219 effect_loadbar:
+ 2220 .LFB21:
+ 2221 .LM216:
+ 2222 .LVL175:
+ 2223 0cfa DF92 push r13
+ 2224 0cfc EF92 push r14
+ 2225 0cfe FF92 push r15
+ 2226 0d00 0F93 push r16
+ 2227 0d02 1F93 push r17
+ 2228 0d04 CF93 push r28
+ 2229 0d06 DF93 push r29
+ 2230 /* prologue: function */
+ 2231 /* frame size = 0 */
+ 2232 0d08 8C01 movw r16,r24
+ 2233 .LM217:
+ 2234 0d0a 80E0 ldi r24,lo8(0)
+ 2235 .LVL176:
+ 2236 0d0c 0E94 0000 call fill
+ 2237 0d10 C0E0 ldi r28,lo8(0)
+ 2238 0d12 D0E0 ldi r29,hi8(0)
+ 2239 .LVL177:
+ 2240 .LM218:
+ 2241 0d14 DD24 clr r13
+ 2242 0d16 DA94 dec r13
+ 2243 .LM219:
+ 2244 0d18 7801 movw r14,r16
+ 2245 .LVL178:
+ 2246 0d1a 00C0 rjmp .L161
+ 2247 .LVL179:
+ 2248 .L162:
+ 2249 .LM220:
+ 2250 0d1c F901 movw r30,r18
+ 2251 0d1e E80F add r30,r24
+ 2252 0d20 F91F adc r31,r25
+ 2253 0d22 E050 subi r30,lo8(-(cube))
+ 2254 0d24 F040 sbci r31,hi8(-(cube))
+ 2255 0d26 D082 st Z,r13
+ 2256 .LM221:
+ 2257 0d28 0196 adiw r24,1
+ 2258 0d2a 8830 cpi r24,8
+ 2259 0d2c 9105 cpc r25,__zero_reg__
+ 2260 0d2e 01F4 brne .L162
+ 2261 .LM222:
+ 2262 0d30 C701 movw r24,r14
+ 2263 .LVL180:
+ 2264 0d32 0E94 0000 call delay_ms
+ 2265 .LM223:
+ 2266 0d36 2196 adiw r28,1
+ 2267 0d38 C830 cpi r28,8
+ 2268 0d3a D105 cpc r29,__zero_reg__
+ 2269 0d3c 01F0 breq .L163
+ 2270 .L161:
+ 2271 0d3e 80E0 ldi r24,lo8(0)
+ 2272 0d40 90E0 ldi r25,hi8(0)
+ 2273 .LVL181:
+ 2274 .LM224:
+ 2275 0d42 9E01 movw r18,r28
+ 2276 0d44 A3E0 ldi r26,3
+ 2277 0d46 220F 1: lsl r18
+ 2278 0d48 331F rol r19
+ 2279 0d4a AA95 dec r26
+ 2280 0d4c 01F4 brne 1b
+ 2281 0d4e 00C0 rjmp .L162
+ 2282 .LVL182:
+ 2283 .L163:
+ 2284 .LM225:
+ 2285 0d50 C801 movw r24,r16
+ 2286 .LVL183:
+ 2287 0d52 880F lsl r24
+ 2288 0d54 991F rol r25
+ 2289 0d56 800F add r24,r16
+ 2290 0d58 911F adc r25,r17
+ 2291 0d5a 0E94 0000 call delay_ms
+ 2292 0d5e C0E0 ldi r28,lo8(0)
+ 2293 0d60 D0E0 ldi r29,hi8(0)
+ 2294 .LVL184:
+ 2295 0d62 00C0 rjmp .L164
+ 2296 .LVL185:
+ 2297 .L165:
+ 2298 .LM226:
+ 2299 0d64 F901 movw r30,r18
+ 2300 0d66 E80F add r30,r24
+ 2301 0d68 F91F adc r31,r25
+ 2302 0d6a E050 subi r30,lo8(-(cube))
+ 2303 0d6c F040 sbci r31,hi8(-(cube))
+ 2304 0d6e 1082 st Z,__zero_reg__
+ 2305 .LM227:
+ 2306 0d70 0196 adiw r24,1
+ 2307 0d72 8830 cpi r24,8
+ 2308 0d74 9105 cpc r25,__zero_reg__
+ 2309 0d76 01F4 brne .L165
+ 2310 .LM228:
+ 2311 0d78 C701 movw r24,r14
+ 2312 .LVL186:
+ 2313 0d7a 0E94 0000 call delay_ms
+ 2314 .LM229:
+ 2315 0d7e 2196 adiw r28,1
+ 2316 0d80 C830 cpi r28,8
+ 2317 0d82 D105 cpc r29,__zero_reg__
+ 2318 0d84 01F0 breq .L167
+ 2319 .L164:
+ 2320 0d86 80E0 ldi r24,lo8(0)
+ 2321 0d88 90E0 ldi r25,hi8(0)
+ 2322 .LVL187:
+ 2323 .LM230:
+ 2324 0d8a 9E01 movw r18,r28
+ 2325 0d8c E3E0 ldi r30,3
+ 2326 0d8e 220F 1: lsl r18
+ 2327 0d90 331F rol r19
+ 2328 0d92 EA95 dec r30
+ 2329 0d94 01F4 brne 1b
+ 2330 0d96 00C0 rjmp .L165
+ 2331 .LVL188:
+ 2332 .L167:
+ 2333 /* epilogue start */
+ 2334 .LM231:
+ 2335 0d98 DF91 pop r29
+ 2336 0d9a CF91 pop r28
+ 2337 .LVL189:
+ 2338 0d9c 1F91 pop r17
+ 2339 0d9e 0F91 pop r16
+ 2340 .LVL190:
+ 2341 0da0 FF90 pop r15
+ 2342 0da2 EF90 pop r14
+ 2343 0da4 DF90 pop r13
+ 2344 0da6 0895 ret
+ 2345 .LFE21:
+ 2347 .global draw_positions_axis
+ 2349 draw_positions_axis:
+ 2350 .LFB19:
+ 2351 .LM232:
+ 2352 .LVL191:
+ 2353 0da8 4F92 push r4
+ 2354 0daa 5F92 push r5
+ 2355 0dac 6F92 push r6
+ 2356 0dae 7F92 push r7
+ 2357 0db0 9F92 push r9
+ 2358 0db2 AF92 push r10
+ 2359 0db4 BF92 push r11
+ 2360 0db6 CF92 push r12
+ 2361 0db8 DF92 push r13
+ 2362 0dba EF92 push r14
+ 2363 0dbc FF92 push r15
+ 2364 0dbe 0F93 push r16
+ 2365 0dc0 1F93 push r17
+ 2366 0dc2 CF93 push r28
+ 2367 0dc4 DF93 push r29
+ 2368 /* prologue: function */
+ 2369 /* frame size = 0 */
+ 2370 0dc6 982E mov r9,r24
+ 2371 0dc8 162F mov r17,r22
+ 2372 0dca 072F mov r16,r23
+ 2373 .LVL192:
+ 2374 0dcc 3A01 movw r6,r20
+ 2375 .LM233:
+ 2376 0dce 80E0 ldi r24,lo8(0)
+ 2377 .LVL193:
+ 2378 0dd0 0E94 0000 call fill
+ 2379 .LVL194:
+ 2380 0dd4 212F mov r18,r17
+ 2381 0dd6 302F mov r19,r16
+ 2382 0dd8 C901 movw r24,r18
+ 2383 0dda 6C01 movw r12,r24
+ 2384 0ddc C0E0 ldi r28,lo8(0)
+ 2385 0dde D0E0 ldi r29,hi8(0)
+ 2386 .LVL195:
+ 2387 .LM234:
+ 2388 0de0 B7E0 ldi r27,lo8(7)
+ 2389 0de2 4B2E mov r4,r27
+ 2390 0de4 512C mov r5,__zero_reg__
+ 2391 0de6 00C0 rjmp .L171
+ 2392 .LVL196:
+ 2393 .L177:
+ 2394 .LM235:
+ 2395 0de8 6114 cp r6,__zero_reg__
+ 2396 0dea 7104 cpc r7,__zero_reg__
+ 2397 0dec 01F0 breq .L172
+ 2398 .LM236:
+ 2399 0dee F501 movw r30,r10
+ 2400 0df0 8081 ld r24,Z
+ 2401 0df2 A201 movw r20,r4
+ 2402 .LVL197:
+ 2403 0df4 481B sub r20,r24
+ 2404 0df6 5109 sbc r21,__zero_reg__
+ 2405 0df8 00C0 rjmp .L173
+ 2406 .L172:
+ 2407 .LM237:
+ 2408 0dfa F701 movw r30,r14
+ 2409 0dfc 8081 ld r24,Z
+ 2410 0dfe 482F mov r20,r24
+ 2411 0e00 50E0 ldi r21,lo8(0)
+ 2412 .L173:
+ 2413 .LM238:
+ 2414 0e02 FAE7 ldi r31,lo8(122)
+ 2415 0e04 9F16 cp r9,r31
+ 2416 0e06 01F4 brne .L174
+ 2417 .LM239:
+ 2418 0e08 CE01 movw r24,r28
+ 2419 0e0a B801 movw r22,r16
+ 2420 0e0c 00C0 rjmp .L181
+ 2421 .L174:
+ 2422 .LM240:
+ 2423 0e0e 89E7 ldi r24,lo8(121)
+ 2424 0e10 9816 cp r9,r24
+ 2425 0e12 01F4 brne .L176
+ 2426 .LM241:
+ 2427 0e14 CE01 movw r24,r28
+ 2428 0e16 BA01 movw r22,r20
+ 2429 0e18 A801 movw r20,r16
+ 2430 .LVL198:
+ 2431 0e1a 00C0 rjmp .L181
+ 2432 .LVL199:
+ 2433 .L176:
+ 2434 .LM242:
+ 2435 0e1c 98E7 ldi r25,lo8(120)
+ 2436 0e1e 9916 cp r9,r25
+ 2437 0e20 01F4 brne .L175
+ 2438 .LM243:
+ 2439 0e22 CA01 movw r24,r20
+ 2440 0e24 B801 movw r22,r16
+ 2441 0e26 AE01 movw r20,r28
+ 2442 .LVL200:
+ 2443 .L181:
+ 2444 0e28 0E94 0000 call setvoxel
+ 2445 .LVL201:
+ 2446 .L175:
+ 2447 .LM244:
+ 2448 0e2c 0F5F subi r16,lo8(-(1))
+ 2449 0e2e 1F4F sbci r17,hi8(-(1))
+ 2450 0e30 0894 sec
+ 2451 0e32 A11C adc r10,__zero_reg__
+ 2452 0e34 B11C adc r11,__zero_reg__
+ 2453 0e36 0894 sec
+ 2454 0e38 E11C adc r14,__zero_reg__
+ 2455 0e3a F11C adc r15,__zero_reg__
+ 2456 0e3c 0830 cpi r16,8
+ 2457 0e3e 1105 cpc r17,__zero_reg__
+ 2458 0e40 01F4 brne .L177
+ 2459 .LM245:
+ 2460 0e42 2196 adiw r28,1
+ 2461 0e44 E8E0 ldi r30,lo8(8)
+ 2462 0e46 F0E0 ldi r31,hi8(8)
+ 2463 0e48 CE0E add r12,r30
+ 2464 0e4a DF1E adc r13,r31
+ 2465 0e4c C830 cpi r28,8
+ 2466 0e4e D105 cpc r29,__zero_reg__
+ 2467 0e50 01F0 breq .L179
+ 2468 .LVL202:
+ 2469 .L171:
+ 2470 0e52 5601 movw r10,r12
+ 2471 0e54 7601 movw r14,r12
+ 2472 0e56 00E0 ldi r16,lo8(0)
+ 2473 0e58 10E0 ldi r17,hi8(0)
+ 2474 .LVL203:
+ 2475 0e5a 00C0 rjmp .L177
+ 2476 .L179:
+ 2477 /* epilogue start */
+ 2478 .LM246:
+ 2479 0e5c DF91 pop r29
+ 2480 0e5e CF91 pop r28
+ 2481 .LVL204:
+ 2482 0e60 1F91 pop r17
+ 2483 .LVL205:
+ 2484 0e62 0F91 pop r16
+ 2485 .LVL206:
+ 2486 0e64 FF90 pop r15
+ 2487 0e66 EF90 pop r14
+ 2488 0e68 DF90 pop r13
+ 2489 0e6a CF90 pop r12
+ 2490 0e6c BF90 pop r11
+ 2491 0e6e AF90 pop r10
+ 2492 0e70 9F90 pop r9
+ 2493 .LVL207:
+ 2494 0e72 7F90 pop r7
+ 2495 0e74 6F90 pop r6
+ 2496 .LVL208:
+ 2497 0e76 5F90 pop r5
+ 2498 0e78 4F90 pop r4
+ 2499 0e7a 0895 ret
+ 2500 .LFE19:
+ 2502 .global effect_boxside_randsend_parallel
+ 2504 effect_boxside_randsend_parallel:
+ 2505 .LFB20:
+ 2506 .LM247:
+ 2507 .LVL209:
+ 2508 0e7c 2F92 push r2
+ 2509 0e7e 3F92 push r3
+ 2510 0e80 4F92 push r4
+ 2511 0e82 5F92 push r5
+ 2512 0e84 6F92 push r6
+ 2513 0e86 7F92 push r7
+ 2514 0e88 8F92 push r8
+ 2515 0e8a 9F92 push r9
+ 2516 0e8c AF92 push r10
+ 2517 0e8e BF92 push r11
+ 2518 0e90 CF92 push r12
+ 2519 0e92 DF92 push r13
+ 2520 0e94 EF92 push r14
+ 2521 0e96 FF92 push r15
+ 2522 0e98 0F93 push r16
+ 2523 0e9a 1F93 push r17
+ 2524 0e9c DF93 push r29
+ 2525 0e9e CF93 push r28
+ 2526 0ea0 CDB7 in r28,__SP_L__
+ 2527 0ea2 DEB7 in r29,__SP_H__
+ 2528 0ea4 C158 subi r28,lo8(-(-129))
+ 2529 0ea6 D040 sbci r29,hi8(-(-129))
+ 2530 0ea8 0FB6 in __tmp_reg__,__SREG__
+ 2531 0eaa F894 cli
+ 2532 0eac DEBF out __SP_H__,r29
+ 2533 0eae 0FBE out __SREG__,__tmp_reg__
+ 2534 0eb0 CDBF out __SP_L__,r28
+ 2535 /* prologue: function */
+ 2536 /* frame size = 129 */
+ 2537 0eb2 CF57 subi r28,lo8(-129)
+ 2538 0eb4 DF4F sbci r29,hi8(-129)
+ 2539 0eb6 8883 st Y,r24
+ 2540 0eb8 C158 subi r28,lo8(129)
+ 2541 0eba D040 sbci r29,hi8(129)
+ 2542 0ebc 2B01 movw r4,r22
+ 2543 0ebe 3A01 movw r6,r20
+ 2544 0ec0 4901 movw r8,r18
+ 2545 .LM248:
+ 2546 0ec2 01E4 ldi r16,lo8(65)
+ 2547 0ec4 A02E mov r10,r16
+ 2548 0ec6 B12C mov r11,__zero_reg__
+ 2549 0ec8 AC0E add r10,r28
+ 2550 0eca BD1E adc r11,r29
+ 2551 0ecc F501 movw r30,r10
+ 2552 0ece 11E8 ldi r17,lo8(129)
+ 2553 0ed0 C12E mov r12,r17
+ 2554 0ed2 D12C mov r13,__zero_reg__
+ 2555 0ed4 CC0E add r12,r28
+ 2556 0ed6 DD1E adc r13,r29
+ 2557 .LVL210:
+ 2558 .L183:
+ 2559 .LM249:
+ 2560 0ed8 1192 st Z+,__zero_reg__
+ 2561 .LM250:
+ 2562 0eda EC15 cp r30,r12
+ 2563 0edc FD05 cpc r31,r13
+ 2564 0ede 01F4 brne .L183
+ 2565 0ee0 00E0 ldi r16,lo8(0)
+ 2566 0ee2 10E0 ldi r17,hi8(0)
+ 2567 .LVL211:
+ 2568 .LM251:
+ 2569 0ee4 1E01 movw r2,r28
+ 2570 0ee6 0894 sec
+ 2571 0ee8 211C adc r2,__zero_reg__
+ 2572 0eea 311C adc r3,__zero_reg__
+ 2573 .LVL212:
+ 2574 .L194:
+ 2575 .LM252:
+ 2576 0eec 81E0 ldi r24,lo8(1)
+ 2577 0eee 8816 cp r8,r24
+ 2578 0ef0 9104 cpc r9,__zero_reg__
+ 2579 0ef2 01F4 brne .L202
+ 2580 0ef4 00C0 rjmp .L204
+ 2581 .L196:
+ 2582 .LM253:
+ 2583 0ef6 0E94 0000 call rand
+ 2584 0efa 60E4 ldi r22,lo8(64)
+ 2585 0efc 70E0 ldi r23,hi8(64)
+ 2586 0efe 0E94 0000 call __divmodhi4
+ 2587 .LM254:
+ 2588 0f02 E1E4 ldi r30,lo8(65)
+ 2589 0f04 F0E0 ldi r31,hi8(65)
+ 2590 0f06 EC0F add r30,r28
+ 2591 0f08 FD1F adc r31,r29
+ 2592 0f0a E80F add r30,r24
+ 2593 0f0c F91F adc r31,r25
+ 2594 .LVL213:
+ 2595 0f0e 8081 ld r24,Z
+ 2596 .LVL214:
+ 2597 0f10 8823 tst r24
+ 2598 0f12 01F4 brne .L196
+ 2599 .LM255:
+ 2600 0f14 0F5F subi r16,lo8(-(1))
+ 2601 0f16 1F4F sbci r17,hi8(-(1))
+ 2602 .LM256:
+ 2603 0f18 91E0 ldi r25,lo8(1)
+ 2604 0f1a 9083 st Z,r25
+ 2605 0f1c 00C0 rjmp .L187
+ 2606 .LVL215:
+ 2607 .L204:
+ 2608 .LM257:
+ 2609 0f1e 0034 cpi r16,64
+ 2610 0f20 1105 cpc r17,__zero_reg__
+ 2611 0f22 04F0 brlt .L196
+ 2612 0f24 00C0 rjmp .L187
+ 2613 .L202:
+ 2614 .LM258:
+ 2615 0f26 82E0 ldi r24,lo8(2)
+ 2616 0f28 8816 cp r8,r24
+ 2617 0f2a 9104 cpc r9,__zero_reg__
+ 2618 0f2c 01F4 brne .L187
+ 2619 .LM259:
+ 2620 0f2e 0034 cpi r16,64
+ 2621 0f30 1105 cpc r17,__zero_reg__
+ 2622 0f32 04F4 brge .L187
+ 2623 .LM260:
+ 2624 0f34 E1E4 ldi r30,lo8(65)
+ 2625 0f36 F0E0 ldi r31,hi8(65)
+ 2626 0f38 EC0F add r30,r28
+ 2627 0f3a FD1F adc r31,r29
+ 2628 0f3c E00F add r30,r16
+ 2629 0f3e F11F adc r31,r17
+ 2630 0f40 8081 ld r24,Z
+ 2631 0f42 8F5F subi r24,lo8(-(1))
+ 2632 0f44 8083 st Z,r24
+ 2633 .LM261:
+ 2634 0f46 0F5F subi r16,lo8(-(1))
+ 2635 0f48 1F4F sbci r17,hi8(-(1))
+ 2636 .L187:
+ 2637 0f4a F501 movw r30,r10
+ 2638 0f4c EE24 clr r14
+ 2639 0f4e FF24 clr r15
+ 2640 .L190:
+ 2641 .LM262:
+ 2642 0f50 9081 ld r25,Z
+ 2643 0f52 892F mov r24,r25
+ 2644 0f54 8150 subi r24,lo8(-(-1))
+ 2645 0f56 8630 cpi r24,lo8(6)
+ 2646 0f58 00F4 brsh .L188
+ 2647 .LM263:
+ 2648 0f5a 9F5F subi r25,lo8(-(1))
+ 2649 0f5c 9083 st Z,r25
+ 2650 .L188:
+ 2651 .LM264:
+ 2652 0f5e 8081 ld r24,Z
+ 2653 0f60 8730 cpi r24,lo8(7)
+ 2654 0f62 01F4 brne .L189
+ 2655 .LM265:
+ 2656 0f64 0894 sec
+ 2657 0f66 E11C adc r14,__zero_reg__
+ 2658 0f68 F11C adc r15,__zero_reg__
+ 2659 .L189:
+ 2660 0f6a 3196 adiw r30,1
+ 2661 .LM266:
+ 2662 0f6c EC15 cp r30,r12
+ 2663 0f6e FD05 cpc r31,r13
+ 2664 0f70 01F4 brne .L190
+ 2665 0f72 D101 movw r26,r2
+ 2666 0f74 F501 movw r30,r10
+ 2667 .L193:
+ 2668 0f76 8081 ld r24,Z
+ 2669 .LM267:
+ 2670 0f78 4114 cp r4,__zero_reg__
+ 2671 0f7a 5104 cpc r5,__zero_reg__
+ 2672 0f7c 01F0 breq .L203
+ 2673 .L191:
+ 2674 .LM268:
+ 2675 0f7e 97E0 ldi r25,lo8(7)
+ 2676 0f80 981B sub r25,r24
+ 2677 0f82 892F mov r24,r25
+ 2678 .L203:
+ 2679 0f84 8C93 st X,r24
+ 2680 0f86 3196 adiw r30,1
+ 2681 0f88 1196 adiw r26,1
+ 2682 .LM269:
+ 2683 0f8a EC15 cp r30,r12
+ 2684 0f8c FD05 cpc r31,r13
+ 2685 0f8e 01F4 brne .L193
+ 2686 .LM270:
+ 2687 0f90 C301 movw r24,r6
+ 2688 0f92 0E94 0000 call delay_ms
+ 2689 .LM271:
+ 2690 0f96 CF57 subi r28,lo8(-129)
+ 2691 0f98 DF4F sbci r29,hi8(-129)
+ 2692 0f9a 8881 ld r24,Y
+ 2693 0f9c C158 subi r28,lo8(129)
+ 2694 0f9e D040 sbci r29,hi8(129)
+ 2695 0fa0 B101 movw r22,r2
+ 2696 0fa2 40E0 ldi r20,lo8(0)
+ 2697 0fa4 50E0 ldi r21,hi8(0)
+ 2698 0fa6 0E94 0000 call draw_positions_axis
+ 2699 .LM272:
+ 2700 0faa 82B3 in r24,50-32
+ 2701 0fac 94E0 ldi r25,lo8(4)
+ 2702 0fae 8927 eor r24,r25
+ 2703 0fb0 82BB out 50-32,r24
+ 2704 .LM273:
+ 2705 0fb2 80E4 ldi r24,lo8(64)
+ 2706 0fb4 E816 cp r14,r24
+ 2707 0fb6 F104 cpc r15,__zero_reg__
+ 2708 0fb8 01F0 breq .+2
+ 2709 0fba 00C0 rjmp .L194
+ 2710 /* epilogue start */
+ 2711 .LM274:
+ 2712 0fbc CF57 subi r28,lo8(-(129))
+ 2713 0fbe DF4F sbci r29,hi8(-(129))
+ 2714 0fc0 0FB6 in __tmp_reg__,__SREG__
+ 2715 0fc2 F894 cli
+ 2716 0fc4 DEBF out __SP_H__,r29
+ 2717 0fc6 0FBE out __SREG__,__tmp_reg__
+ 2718 0fc8 CDBF out __SP_L__,r28
+ 2719 0fca CF91 pop r28
+ 2720 0fcc DF91 pop r29
+ 2721 0fce 1F91 pop r17
+ 2722 0fd0 0F91 pop r16
+ 2723 .LVL216:
+ 2724 0fd2 FF90 pop r15
+ 2725 0fd4 EF90 pop r14
+ 2726 .LVL217:
+ 2727 0fd6 DF90 pop r13
+ 2728 0fd8 CF90 pop r12
+ 2729 0fda BF90 pop r11
+ 2730 0fdc AF90 pop r10
+ 2731 0fde 9F90 pop r9
+ 2732 0fe0 8F90 pop r8
+ 2733 .LVL218:
+ 2734 0fe2 7F90 pop r7
+ 2735 0fe4 6F90 pop r6
+ 2736 .LVL219:
+ 2737 0fe6 5F90 pop r5
+ 2738 0fe8 4F90 pop r4
+ 2739 .LVL220:
+ 2740 0fea 3F90 pop r3
+ 2741 0fec 2F90 pop r2
+ 2742 0fee 0895 ret
+ 2743 .LFE20:
+ 2745 .global effect_axis_updown_randsuspend
+ 2747 effect_axis_updown_randsuspend:
+ 2748 .LFB18:
+ 2749 .LM275:
+ 2750 .LVL221:
+ 2751 0ff0 3F92 push r3
+ 2752 0ff2 4F92 push r4
+ 2753 0ff4 5F92 push r5
+ 2754 0ff6 6F92 push r6
+ 2755 0ff8 7F92 push r7
+ 2756 0ffa 8F92 push r8
+ 2757 0ffc 9F92 push r9
+ 2758 0ffe AF92 push r10
+ 2759 1000 BF92 push r11
+ 2760 1002 CF92 push r12
+ 2761 1004 DF92 push r13
+ 2762 1006 EF92 push r14
+ 2763 1008 FF92 push r15
+ 2764 100a 0F93 push r16
+ 2765 100c 1F93 push r17
+ 2766 100e DF93 push r29
+ 2767 1010 CF93 push r28
+ 2768 1012 CDB7 in r28,__SP_L__
+ 2769 1014 DEB7 in r29,__SP_H__
+ 2770 1016 C058 subi r28,lo8(-(-128))
+ 2771 1018 D040 sbci r29,hi8(-(-128))
+ 2772 101a 0FB6 in __tmp_reg__,__SREG__
+ 2773 101c F894 cli
+ 2774 101e DEBF out __SP_H__,r29
+ 2775 1020 0FBE out __SREG__,__tmp_reg__
+ 2776 1022 CDBF out __SP_L__,r28
+ 2777 /* prologue: function */
+ 2778 /* frame size = 128 */
+ 2779 1024 382E mov r3,r24
+ 2780 1026 2B01 movw r4,r22
+ 2781 .LVL222:
+ 2782 1028 4A01 movw r8,r20
+ 2783 102a 3901 movw r6,r18
+ 2784 .LM276:
+ 2785 102c 00E0 ldi r16,lo8(0)
+ 2786 102e 10E0 ldi r17,hi8(0)
+ 2787 .LVL223:
+ 2788 .LM277:
+ 2789 1030 6E01 movw r12,r28
+ 2790 1032 0894 sec
+ 2791 1034 C11C adc r12,__zero_reg__
+ 2792 1036 D11C adc r13,__zero_reg__
+ 2793 .LM278:
+ 2794 1038 91E4 ldi r25,lo8(65)
+ 2795 103a E92E mov r14,r25
+ 2796 103c F12C mov r15,__zero_reg__
+ 2797 103e EC0E add r14,r28
+ 2798 1040 FD1E adc r15,r29
+ 2799 .LVL224:
+ 2800 .L206:
+ 2801 .LM279:
+ 2802 1042 F601 movw r30,r12
+ 2803 1044 E00F add r30,r16
+ 2804 1046 F11F adc r31,r17
+ 2805 1048 1082 st Z,__zero_reg__
+ 2806 .LM280:
+ 2807 104a 0E94 0000 call rand
+ 2808 104e F701 movw r30,r14
+ 2809 1050 E00F add r30,r16
+ 2810 1052 F11F adc r31,r17
+ 2811 1054 68E0 ldi r22,lo8(8)
+ 2812 1056 70E0 ldi r23,hi8(8)
+ 2813 1058 0E94 0000 call __divmodhi4
+ 2814 105c 8083 st Z,r24
+ 2815 .LM281:
+ 2816 105e 0F5F subi r16,lo8(-(1))
+ 2817 1060 1F4F sbci r17,hi8(-(1))
+ 2818 1062 0034 cpi r16,64
+ 2819 1064 1105 cpc r17,__zero_reg__
+ 2820 1066 01F4 brne .L206
+ 2821 1068 EE24 clr r14
+ 2822 106a FF24 clr r15
+ 2823 .LVL225:
+ 2824 .LM282:
+ 2825 106c 5E01 movw r10,r28
+ 2826 106e 0894 sec
+ 2827 1070 A11C adc r10,__zero_reg__
+ 2828 1072 B11C adc r11,__zero_reg__
+ 2829 1074 81E4 ldi r24,lo8(65)
+ 2830 1076 C82E mov r12,r24
+ 2831 1078 D12C mov r13,__zero_reg__
+ 2832 107a CC0E add r12,r28
+ 2833 107c DD1E adc r13,r29
+ 2834 107e 00C0 rjmp .L207
+ 2835 .L210:
+ 2836 .LM283:
+ 2837 1080 D801 movw r26,r16
+ 2838 1082 8C91 ld r24,X
+ 2839 1084 9081 ld r25,Z
+ 2840 1086 8917 cp r24,r25
+ 2841 1088 00F4 brsh .L208
+ 2842 .LM284:
+ 2843 108a 8F5F subi r24,lo8(-(1))
+ 2844 108c 8C93 st X,r24
+ 2845 .L208:
+ 2846 .LM285:
+ 2847 108e D801 movw r26,r16
+ 2848 1090 8C91 ld r24,X
+ 2849 1092 9817 cp r25,r24
+ 2850 1094 00F4 brsh .L209
+ 2851 .LM286:
+ 2852 1096 8150 subi r24,lo8(-(-1))
+ 2853 1098 8C93 st X,r24
+ 2854 .L209:
+ 2855 109a 0F5F subi r16,lo8(-(1))
+ 2856 109c 1F4F sbci r17,hi8(-(1))
+ 2857 109e 3196 adiw r30,1
+ 2858 .LM287:
+ 2859 10a0 0C15 cp r16,r12
+ 2860 10a2 1D05 cpc r17,r13
+ 2861 10a4 01F4 brne .L210
+ 2862 .LM288:
+ 2863 10a6 832D mov r24,r3
+ 2864 10a8 B501 movw r22,r10
+ 2865 10aa A301 movw r20,r6
+ 2866 10ac 0E94 0000 call draw_positions_axis
+ 2867 .LM289:
+ 2868 10b0 C201 movw r24,r4
+ 2869 10b2 0E94 0000 call delay_ms
+ 2870 .LM290:
+ 2871 10b6 0894 sec
+ 2872 10b8 E11C adc r14,__zero_reg__
+ 2873 10ba F11C adc r15,__zero_reg__
+ 2874 10bc B8E0 ldi r27,lo8(8)
+ 2875 10be EB16 cp r14,r27
+ 2876 10c0 F104 cpc r15,__zero_reg__
+ 2877 10c2 01F0 breq .L211
+ 2878 .L207:
+ 2879 10c4 8501 movw r16,r10
+ 2880 10c6 F601 movw r30,r12
+ 2881 10c8 00C0 rjmp .L210
+ 2882 .L211:
+ 2883 10ca F801 movw r30,r16
+ 2884 .LM291:
+ 2885 10cc 27E0 ldi r18,lo8(7)
+ 2886 .LM292:
+ 2887 10ce CE01 movw r24,r28
+ 2888 10d0 8F57 subi r24,lo8(-(129))
+ 2889 10d2 9F4F sbci r25,hi8(-(129))
+ 2890 .L212:
+ 2891 .LM293:
+ 2892 10d4 2193 st Z+,r18
+ 2893 .LM294:
+ 2894 10d6 E817 cp r30,r24
+ 2895 10d8 F907 cpc r31,r25
+ 2896 10da 01F4 brne .L212
+ 2897 .LM295:
+ 2898 10dc C401 movw r24,r8
+ 2899 10de 0E94 0000 call delay_ms
+ 2900 10e2 EE24 clr r14
+ 2901 10e4 FF24 clr r15
+ 2902 .LVL226:
+ 2903 .LM296:
+ 2904 10e6 4E01 movw r8,r28
+ 2905 .LVL227:
+ 2906 10e8 0894 sec
+ 2907 10ea 811C adc r8,__zero_reg__
+ 2908 10ec 911C adc r9,__zero_reg__
+ 2909 10ee 00C0 rjmp .L213
+ 2910 .L216:
+ 2911 .LM297:
+ 2912 10f0 8081 ld r24,Z
+ 2913 10f2 9C91 ld r25,X
+ 2914 10f4 8917 cp r24,r25
+ 2915 10f6 00F4 brsh .L214
+ 2916 .LM298:
+ 2917 10f8 8F5F subi r24,lo8(-(1))
+ 2918 10fa 8083 st Z,r24
+ 2919 .L214:
+ 2920 .LM299:
+ 2921 10fc 8081 ld r24,Z
+ 2922 10fe 9817 cp r25,r24
+ 2923 1100 00F4 brsh .L215
+ 2924 .LM300:
+ 2925 1102 8150 subi r24,lo8(-(-1))
+ 2926 1104 8083 st Z,r24
+ 2927 .L215:
+ 2928 1106 3196 adiw r30,1
+ 2929 1108 1196 adiw r26,1
+ 2930 .LM301:
+ 2931 110a E017 cp r30,r16
+ 2932 110c F107 cpc r31,r17
+ 2933 110e 01F4 brne .L216
+ 2934 .LM302:
+ 2935 1110 832D mov r24,r3
+ 2936 1112 B401 movw r22,r8
+ 2937 1114 A301 movw r20,r6
+ 2938 1116 0E94 0000 call draw_positions_axis
+ 2939 .LM303:
+ 2940 111a C201 movw r24,r4
+ 2941 111c 0E94 0000 call delay_ms
+ 2942 .LM304:
+ 2943 1120 0894 sec
+ 2944 1122 E11C adc r14,__zero_reg__
+ 2945 1124 F11C adc r15,__zero_reg__
+ 2946 1126 88E0 ldi r24,lo8(8)
+ 2947 1128 E816 cp r14,r24
+ 2948 112a F104 cpc r15,__zero_reg__
+ 2949 112c 01F0 breq .L218
+ 2950 .L213:
+ 2951 112e F501 movw r30,r10
+ 2952 1130 D601 movw r26,r12
+ 2953 1132 00C0 rjmp .L216
+ 2954 .L218:
+ 2955 /* epilogue start */
+ 2956 .LM305:
+ 2957 1134 C058 subi r28,lo8(-(128))
+ 2958 1136 DF4F sbci r29,hi8(-(128))
+ 2959 1138 0FB6 in __tmp_reg__,__SREG__
+ 2960 113a F894 cli
+ 2961 113c DEBF out __SP_H__,r29
+ 2962 113e 0FBE out __SREG__,__tmp_reg__
+ 2963 1140 CDBF out __SP_L__,r28
+ 2964 1142 CF91 pop r28
+ 2965 1144 DF91 pop r29
+ 2966 1146 1F91 pop r17
+ 2967 1148 0F91 pop r16
+ 2968 114a FF90 pop r15
+ 2969 114c EF90 pop r14
+ 2970 .LVL228:
+ 2971 114e DF90 pop r13
+ 2972 1150 CF90 pop r12
+ 2973 1152 BF90 pop r11
+ 2974 1154 AF90 pop r10
+ 2975 1156 9F90 pop r9
+ 2976 1158 8F90 pop r8
+ 2977 115a 7F90 pop r7
+ 2978 115c 6F90 pop r6
+ 2979 .LVL229:
+ 2980 115e 5F90 pop r5
+ 2981 1160 4F90 pop r4
+ 2982 1162 3F90 pop r3
+ 2983 .LVL230:
+ 2984 1164 0895 ret
+ 2985 .LFE18:
+ 2987 .global effect_z_updown_move
+ 2989 effect_z_updown_move:
+ 2990 .LFB17:
+ 2991 .LM306:
+ 2992 .LVL231:
+ 2993 /* prologue: function */
+ 2994 /* frame size = 0 */
+ 2995 1166 AC01 movw r20,r24
+ 2996 .LVL232:
+ 2997 .LM307:
+ 2998 1168 DC01 movw r26,r24
+ 2999 116a FB01 movw r30,r22
+ 3000 .LVL233:
+ 3001 116c 20E0 ldi r18,lo8(0)
+ 3002 116e 30E0 ldi r19,hi8(0)
+ 3003 .LVL234:
+ 3004 .L226:
+ 3005 .LM308:
+ 3006 1170 9C91 ld r25,X
+ 3007 1172 8081 ld r24,Z
+ 3008 1174 9817 cp r25,r24
+ 3009 1176 00F4 brsh .L224
+ 3010 .LM309:
+ 3011 1178 9F5F subi r25,lo8(-(1))
+ 3012 117a 9C93 st X,r25
+ 3013 .L224:
+ 3014 .LM310:
+ 3015 117c 9C91 ld r25,X
+ 3016 117e 8081 ld r24,Z
+ 3017 1180 8917 cp r24,r25
+ 3018 1182 00F4 brsh .L225
+ 3019 .LM311:
+ 3020 1184 9150 subi r25,lo8(-(-1))
+ 3021 1186 9C93 st X,r25
+ 3022 .L225:
+ 3023 .LM312:
+ 3024 1188 2F5F subi r18,lo8(-(1))
+ 3025 118a 3F4F sbci r19,hi8(-(1))
+ 3026 118c 1196 adiw r26,1
+ 3027 118e 3196 adiw r30,1
+ 3028 1190 2034 cpi r18,64
+ 3029 1192 3105 cpc r19,__zero_reg__
+ 3030 1194 01F4 brne .L226
+ 3031 .LM313:
+ 3032 1196 8AE7 ldi r24,lo8(122)
+ 3033 1198 BA01 movw r22,r20
+ 3034 119a 40E0 ldi r20,lo8(0)
+ 3035 119c 50E0 ldi r21,hi8(0)
+ 3036 119e 0E94 0000 call draw_positions_axis
+ 3037 .LVL235:
+ 3038 /* epilogue start */
+ 3039 .LM314:
+ 3040 11a2 0895 ret
+ 3041 .LFE17:
+ 3043 .global effect_z_updown
+ 3045 effect_z_updown:
+ 3046 .LFB16:
+ 3047 .LM315:
+ 3048 .LVL236:
+ 3049 11a4 2F92 push r2
+ 3050 11a6 3F92 push r3
+ 3051 11a8 4F92 push r4
+ 3052 11aa 5F92 push r5
+ 3053 11ac 6F92 push r6
+ 3054 11ae 7F92 push r7
+ 3055 11b0 8F92 push r8
+ 3056 11b2 9F92 push r9
+ 3057 11b4 AF92 push r10
+ 3058 11b6 BF92 push r11
+ 3059 11b8 CF92 push r12
+ 3060 11ba DF92 push r13
+ 3061 11bc EF92 push r14
+ 3062 11be FF92 push r15
+ 3063 11c0 0F93 push r16
+ 3064 11c2 1F93 push r17
+ 3065 11c4 DF93 push r29
+ 3066 11c6 CF93 push r28
+ 3067 11c8 CDB7 in r28,__SP_L__
+ 3068 11ca DEB7 in r29,__SP_H__
+ 3069 11cc C058 subi r28,lo8(-(-128))
+ 3070 11ce D040 sbci r29,hi8(-(-128))
+ 3071 11d0 0FB6 in __tmp_reg__,__SREG__
+ 3072 11d2 F894 cli
+ 3073 11d4 DEBF out __SP_H__,r29
+ 3074 11d6 0FBE out __SREG__,__tmp_reg__
+ 3075 11d8 CDBF out __SP_L__,r28
+ 3076 /* prologue: function */
+ 3077 /* frame size = 128 */
+ 3078 11da 2C01 movw r4,r24
+ 3079 11dc 7B01 movw r14,r22
+ 3080 .LM316:
+ 3081 11de 00E0 ldi r16,lo8(0)
+ 3082 11e0 10E0 ldi r17,hi8(0)
+ 3083 .LVL237:
+ 3084 .LM317:
+ 3085 11e2 5E01 movw r10,r28
+ 3086 11e4 0894 sec
+ 3087 11e6 A11C adc r10,__zero_reg__
+ 3088 11e8 B11C adc r11,__zero_reg__
+ 3089 11ea 64E0 ldi r22,lo8(4)
+ 3090 11ec 962E mov r9,r22
+ 3091 .LVL238:
+ 3092 .LM318:
+ 3093 11ee 51E4 ldi r21,lo8(65)
+ 3094 11f0 C52E mov r12,r21
+ 3095 11f2 D12C mov r13,__zero_reg__
+ 3096 11f4 CC0E add r12,r28
+ 3097 11f6 DD1E adc r13,r29
+ 3098 .LVL239:
+ 3099 .L230:
+ 3100 .LM319:
+ 3101 11f8 F501 movw r30,r10
+ 3102 11fa E00F add r30,r16
+ 3103 11fc F11F adc r31,r17
+ 3104 11fe 9082 st Z,r9
+ 3105 .LM320:
+ 3106 1200 0E94 0000 call rand
+ 3107 1204 F601 movw r30,r12
+ 3108 1206 E00F add r30,r16
+ 3109 1208 F11F adc r31,r17
+ 3110 120a 68E0 ldi r22,lo8(8)
+ 3111 120c 70E0 ldi r23,hi8(8)
+ 3112 120e 0E94 0000 call __divmodhi4
+ 3113 1212 8083 st Z,r24
+ 3114 .LM321:
+ 3115 1214 0F5F subi r16,lo8(-(1))
+ 3116 1216 1F4F sbci r17,hi8(-(1))
+ 3117 1218 0034 cpi r16,64
+ 3118 121a 1105 cpc r17,__zero_reg__
+ 3119 121c 01F4 brne .L230
+ 3120 121e 00E0 ldi r16,lo8(0)
+ 3121 1220 10E0 ldi r17,hi8(0)
+ 3122 .LVL240:
+ 3123 .LM322:
+ 3124 1222 41E4 ldi r20,lo8(65)
+ 3125 1224 A42E mov r10,r20
+ 3126 1226 B12C mov r11,__zero_reg__
+ 3127 1228 AC0E add r10,r28
+ 3128 122a BD1E adc r11,r29
+ 3129 122c 6E01 movw r12,r28
+ 3130 122e 0894 sec
+ 3131 1230 C11C adc r12,__zero_reg__
+ 3132 1232 D11C adc r13,__zero_reg__
+ 3133 .LM323:
+ 3134 1234 3701 movw r6,r14
+ 3135 .LVL241:
+ 3136 .L231:
+ 3137 .LM324:
+ 3138 1236 C601 movw r24,r12
+ 3139 1238 B501 movw r22,r10
+ 3140 123a 4AE7 ldi r20,lo8(122)
+ 3141 123c 0E94 0000 call effect_z_updown_move
+ 3142 .LM325:
+ 3143 1240 C301 movw r24,r6
+ 3144 1242 0E94 0000 call delay_ms
+ 3145 .LM326:
+ 3146 1246 0F5F subi r16,lo8(-(1))
+ 3147 1248 1F4F sbci r17,hi8(-(1))
+ 3148 124a 0830 cpi r16,8
+ 3149 124c 1105 cpc r17,__zero_reg__
+ 3150 124e 01F4 brne .L231
+ 3151 .LM327:
+ 3152 1250 5701 movw r10,r14
+ 3153 .LVL242:
+ 3154 1252 AA0C lsl r10
+ 3155 1254 BB1C rol r11
+ 3156 1256 AA0C lsl r10
+ 3157 1258 BB1C rol r11
+ 3158 125a CC24 clr r12
+ 3159 125c DD24 clr r13
+ 3160 .LVL243:
+ 3161 .LM328:
+ 3162 125e 21E4 ldi r18,lo8(65)
+ 3163 1260 822E mov r8,r18
+ 3164 1262 912C mov r9,__zero_reg__
+ 3165 1264 8C0E add r8,r28
+ 3166 1266 9D1E adc r9,r29
+ 3167 1268 1E01 movw r2,r28
+ 3168 126a 0894 sec
+ 3169 126c 211C adc r2,__zero_reg__
+ 3170 126e 311C adc r3,__zero_reg__
+ 3171 1270 00C0 rjmp .L232
+ 3172 .LVL244:
+ 3173 .L235:
+ 3174 .LM329:
+ 3175 1272 00E0 ldi r16,lo8(0)
+ 3176 1274 10E0 ldi r17,hi8(0)
+ 3177 .LVL245:
+ 3178 .L233:
+ 3179 .LM330:
+ 3180 1276 C101 movw r24,r2
+ 3181 1278 B401 movw r22,r8
+ 3182 127a 4AE7 ldi r20,lo8(122)
+ 3183 127c 0E94 0000 call effect_z_updown_move
+ 3184 .LM331:
+ 3185 1280 C301 movw r24,r6
+ 3186 1282 0E94 0000 call delay_ms
+ 3187 .LM332:
+ 3188 1286 0F5F subi r16,lo8(-(1))
+ 3189 1288 1F4F sbci r17,hi8(-(1))
+ 3190 128a 0830 cpi r16,8
+ 3191 128c 1105 cpc r17,__zero_reg__
+ 3192 128e 01F4 brne .L233
+ 3193 .LM333:
+ 3194 1290 C501 movw r24,r10
+ 3195 1292 0E94 0000 call delay_ms
+ 3196 1296 EE24 clr r14
+ 3197 1298 FF24 clr r15
+ 3198 .LVL246:
+ 3199 .L234:
+ 3200 .LM334:
+ 3201 129a 0E94 0000 call rand
+ 3202 129e 8C01 movw r16,r24
+ 3203 .LVL247:
+ 3204 12a0 0E94 0000 call rand
+ 3205 12a4 9C01 movw r18,r24
+ 3206 12a6 C801 movw r24,r16
+ 3207 12a8 60E4 ldi r22,lo8(64)
+ 3208 12aa 70E0 ldi r23,hi8(64)
+ 3209 12ac 0E94 0000 call __divmodhi4
+ 3210 12b0 F401 movw r30,r8
+ 3211 12b2 E80F add r30,r24
+ 3212 12b4 F91F adc r31,r25
+ 3213 12b6 C901 movw r24,r18
+ 3214 12b8 68E0 ldi r22,lo8(8)
+ 3215 12ba 70E0 ldi r23,hi8(8)
+ 3216 12bc 0E94 0000 call __divmodhi4
+ 3217 12c0 8083 st Z,r24
+ 3218 .LM335:
+ 3219 12c2 0894 sec
+ 3220 12c4 E11C adc r14,__zero_reg__
+ 3221 12c6 F11C adc r15,__zero_reg__
+ 3222 12c8 8AE0 ldi r24,lo8(10)
+ 3223 12ca E816 cp r14,r24
+ 3224 12cc F104 cpc r15,__zero_reg__
+ 3225 12ce 01F4 brne .L234
+ 3226 .LM336:
+ 3227 12d0 0894 sec
+ 3228 12d2 C11C adc r12,__zero_reg__
+ 3229 12d4 D11C adc r13,__zero_reg__
+ 3230 .LVL248:
+ 3231 .L232:
+ 3232 12d6 C414 cp r12,r4
+ 3233 12d8 D504 cpc r13,r5
+ 3234 12da 04F0 brlt .L235
+ 3235 /* epilogue start */
+ 3236 .LM337:
+ 3237 12dc C058 subi r28,lo8(-(128))
+ 3238 12de DF4F sbci r29,hi8(-(128))
+ 3239 12e0 0FB6 in __tmp_reg__,__SREG__
+ 3240 12e2 F894 cli
+ 3241 12e4 DEBF out __SP_H__,r29
+ 3242 12e6 0FBE out __SREG__,__tmp_reg__
+ 3243 12e8 CDBF out __SP_L__,r28
+ 3244 12ea CF91 pop r28
+ 3245 12ec DF91 pop r29
+ 3246 12ee 1F91 pop r17
+ 3247 12f0 0F91 pop r16
+ 3248 12f2 FF90 pop r15
+ 3249 12f4 EF90 pop r14
+ 3250 .LVL249:
+ 3251 12f6 DF90 pop r13
+ 3252 12f8 CF90 pop r12
+ 3253 .LVL250:
+ 3254 12fa BF90 pop r11
+ 3255 12fc AF90 pop r10
+ 3256 12fe 9F90 pop r9
+ 3257 1300 8F90 pop r8
+ 3258 1302 7F90 pop r7
+ 3259 1304 6F90 pop r6
+ 3260 1306 5F90 pop r5
+ 3261 1308 4F90 pop r4
+ 3262 .LVL251:
+ 3263 130a 3F90 pop r3
+ 3264 130c 2F90 pop r2
+ 3265 130e 0895 ret
+ 3266 .LFE16:
+ 3268 .global effect_random_filler
+ 3270 effect_random_filler:
+ 3271 .LFB14:
+ 3272 .LM338:
+ 3273 .LVL252:
+ 3274 1310 8F92 push r8
+ 3275 1312 9F92 push r9
+ 3276 1314 AF92 push r10
+ 3277 1316 BF92 push r11
+ 3278 1318 CF92 push r12
+ 3279 131a DF92 push r13
+ 3280 131c EF92 push r14
+ 3281 131e FF92 push r15
+ 3282 1320 0F93 push r16
+ 3283 1322 1F93 push r17
+ 3284 1324 CF93 push r28
+ 3285 1326 DF93 push r29
+ 3286 /* prologue: function */
+ 3287 /* frame size = 0 */
+ 3288 1328 4C01 movw r8,r24
+ 3289 132a 8B01 movw r16,r22
+ 3290 .LM339:
+ 3291 132c 6130 cpi r22,1
+ 3292 132e 7105 cpc r23,__zero_reg__
+ 3293 1330 01F4 brne .L242
+ 3294 .LVL253:
+ 3295 .LM340:
+ 3296 1332 80E0 ldi r24,lo8(0)
+ 3297 1334 00C0 rjmp .L250
+ 3298 .LVL254:
+ 3299 .L242:
+ 3300 .LM341:
+ 3301 1336 8FEF ldi r24,lo8(-1)
+ 3302 .L250:
+ 3303 1338 0E94 0000 call fill
+ 3304 .LVL255:
+ 3305 133c C0E0 ldi r28,lo8(0)
+ 3306 133e D0E0 ldi r29,hi8(0)
+ 3307 .LVL256:
+ 3308 .L248:
+ 3309 .LM342:
+ 3310 1340 0E94 0000 call rand
+ 3311 1344 68E0 ldi r22,lo8(8)
+ 3312 1346 70E0 ldi r23,hi8(8)
+ 3313 1348 0E94 0000 call __divmodhi4
+ 3314 134c B82E mov r11,r24
+ 3315 134e A92E mov r10,r25
+ 3316 .LM343:
+ 3317 1350 0E94 0000 call rand
+ 3318 1354 68E0 ldi r22,lo8(8)
+ 3319 1356 70E0 ldi r23,hi8(8)
+ 3320 1358 0E94 0000 call __divmodhi4
+ 3321 135c D82E mov r13,r24
+ 3322 135e C92E mov r12,r25
+ 3323 .LM344:
+ 3324 1360 0E94 0000 call rand
+ 3325 1364 68E0 ldi r22,lo8(8)
+ 3326 1366 70E0 ldi r23,hi8(8)
+ 3327 1368 0E94 0000 call __divmodhi4
+ 3328 136c F82E mov r15,r24
+ 3329 136e E92E mov r14,r25
+ 3330 .LM345:
+ 3331 1370 0115 cp r16,__zero_reg__
+ 3332 1372 1105 cpc r17,__zero_reg__
+ 3333 1374 01F4 brne .L244
+ 3334 1376 8B2D mov r24,r11
+ 3335 1378 9A2D mov r25,r10
+ 3336 137a 6D2D mov r22,r13
+ 3337 137c 7C2D mov r23,r12
+ 3338 137e 4F2D mov r20,r15
+ 3339 1380 5E2D mov r21,r14
+ 3340 1382 0E94 0000 call getvoxel
+ 3341 1386 8130 cpi r24,lo8(1)
+ 3342 1388 01F4 brne .L246
+ 3343 138a 00C0 rjmp .L245
+ 3344 .L244:
+ 3345 138c 0130 cpi r16,1
+ 3346 138e 1105 cpc r17,__zero_reg__
+ 3347 1390 01F4 brne .L246
+ 3348 1392 8B2D mov r24,r11
+ 3349 1394 9A2D mov r25,r10
+ 3350 1396 6D2D mov r22,r13
+ 3351 1398 7C2D mov r23,r12
+ 3352 139a 4F2D mov r20,r15
+ 3353 139c 5E2D mov r21,r14
+ 3354 139e 0E94 0000 call getvoxel
+ 3355 13a2 8823 tst r24
+ 3356 13a4 01F4 brne .L246
+ 3357 .L245:
+ 3358 .LM346:
+ 3359 13a6 8B2D mov r24,r11
+ 3360 13a8 9A2D mov r25,r10
+ 3361 13aa 6D2D mov r22,r13
+ 3362 13ac 7C2D mov r23,r12
+ 3363 13ae 4F2D mov r20,r15
+ 3364 13b0 5E2D mov r21,r14
+ 3365 13b2 9801 movw r18,r16
+ 3366 13b4 0E94 0000 call altervoxel
+ 3367 .LM347:
+ 3368 13b8 C401 movw r24,r8
+ 3369 13ba 0E94 0000 call delay_ms
+ 3370 .LM348:
+ 3371 13be 2196 adiw r28,1
+ 3372 .L246:
+ 3373 .LM349:
+ 3374 13c0 81E0 ldi r24,hi8(511)
+ 3375 13c2 CF3F cpi r28,lo8(511)
+ 3376 13c4 D807 cpc r29,r24
+ 3377 13c6 04F4 brge .+2
+ 3378 13c8 00C0 rjmp .L248
+ 3379 /* epilogue start */
+ 3380 .LM350:
+ 3381 13ca DF91 pop r29
+ 3382 13cc CF91 pop r28
+ 3383 .LVL257:
+ 3384 13ce 1F91 pop r17
+ 3385 13d0 0F91 pop r16
+ 3386 .LVL258:
+ 3387 13d2 FF90 pop r15
+ 3388 13d4 EF90 pop r14
+ 3389 13d6 DF90 pop r13
+ 3390 13d8 CF90 pop r12
+ 3391 13da BF90 pop r11
+ 3392 13dc AF90 pop r10
+ 3393 13de 9F90 pop r9
+ 3394 13e0 8F90 pop r8
+ 3395 .LVL259:
+ 3396 13e2 0895 ret
+ 3397 .LFE14:
+ 3399 .global sendvoxels_rand_z
+ 3401 sendvoxels_rand_z:
+ 3402 .LFB12:
+ 3403 .LM351:
+ 3404 .LVL260:
+ 3405 13e4 6F92 push r6
+ 3406 13e6 7F92 push r7
+ 3407 13e8 8F92 push r8
+ 3408 13ea 9F92 push r9
+ 3409 13ec AF92 push r10
+ 3410 13ee BF92 push r11
+ 3411 13f0 DF92 push r13
+ 3412 13f2 EF92 push r14
+ 3413 13f4 FF92 push r15
+ 3414 13f6 0F93 push r16
+ 3415 13f8 1F93 push r17
+ 3416 13fa CF93 push r28
+ 3417 13fc DF93 push r29
+ 3418 /* prologue: function */
+ 3419 /* frame size = 0 */
+ 3420 13fe 3C01 movw r6,r24
+ 3421 1400 5B01 movw r10,r22
+ 3422 1402 4A01 movw r8,r20
+ 3423 .LM352:
+ 3424 1404 80E0 ldi r24,lo8(0)
+ 3425 .LVL261:
+ 3426 1406 0E94 0000 call fill
+ 3427 .LVL262:
+ 3428 140a 00E0 ldi r16,lo8(0)
+ 3429 140c 10E0 ldi r17,hi8(0)
+ 3430 140e 00C0 rjmp .L252
+ 3431 .L255:
+ 3432 .LM353:
+ 3433 1410 0E94 0000 call rand
+ 3434 1414 80FD sbrc r24,0
+ 3435 1416 00C0 rjmp .L253
+ 3436 .LM354:
+ 3437 1418 C801 movw r24,r16
+ 3438 141a BE01 movw r22,r28
+ 3439 141c 40E0 ldi r20,lo8(0)
+ 3440 141e 50E0 ldi r21,hi8(0)
+ 3441 1420 00C0 rjmp .L264
+ 3442 .L253:
+ 3443 .LM355:
+ 3444 1422 C801 movw r24,r16
+ 3445 1424 BE01 movw r22,r28
+ 3446 1426 47E0 ldi r20,lo8(7)
+ 3447 1428 50E0 ldi r21,hi8(7)
+ 3448 .L264:
+ 3449 142a 0E94 0000 call setvoxel
+ 3450 142e 2196 adiw r28,1
+ 3451 .LM356:
+ 3452 1430 C830 cpi r28,8
+ 3453 1432 D105 cpc r29,__zero_reg__
+ 3454 1434 01F4 brne .L255
+ 3455 1436 0F5F subi r16,lo8(-(1))
+ 3456 1438 1F4F sbci r17,hi8(-(1))
+ 3457 .LM357:
+ 3458 143a 0830 cpi r16,8
+ 3459 143c 1105 cpc r17,__zero_reg__
+ 3460 143e 01F4 brne .L252
+ 3461 1440 DD24 clr r13
+ 3462 .LVL263:
+ 3463 1442 EE24 clr r14
+ 3464 .LVL264:
+ 3465 1444 FF24 clr r15
+ 3466 .LVL265:
+ 3467 1446 00C0 rjmp .L256
+ 3468 .LVL266:
+ 3469 .L252:
+ 3470 1448 C0E0 ldi r28,lo8(0)
+ 3471 144a D0E0 ldi r29,hi8(0)
+ 3472 144c 00C0 rjmp .L255
+ 3473 .LVL267:
+ 3474 .L260:
+ 3475 .LM358:
+ 3476 144e 0E94 0000 call rand
+ 3477 .LVL268:
+ 3478 1452 EC01 movw r28,r24
+ 3479 .LM359:
+ 3480 1454 0E94 0000 call rand
+ 3481 1458 68E0 ldi r22,lo8(8)
+ 3482 145a 70E0 ldi r23,hi8(8)
+ 3483 145c 0E94 0000 call __divmodhi4
+ 3484 1460 082F mov r16,r24
+ 3485 .LM360:
+ 3486 1462 8E15 cp r24,r14
+ 3487 1464 01F0 breq .L257
+ 3488 .LVL269:
+ 3489 .LM361:
+ 3490 1466 CE01 movw r24,r28
+ 3491 .LVL270:
+ 3492 1468 68E0 ldi r22,lo8(8)
+ 3493 146a 70E0 ldi r23,hi8(8)
+ 3494 146c 0E94 0000 call __divmodhi4
+ 3495 1470 182F mov r17,r24
+ 3496 .LM362:
+ 3497 1472 8D15 cp r24,r13
+ 3498 1474 01F0 breq .L257
+ 3499 .LVL271:
+ 3500 .LM363:
+ 3501 1476 90E0 ldi r25,lo8(0)
+ 3502 1478 602F mov r22,r16
+ 3503 147a 70E0 ldi r23,lo8(0)
+ 3504 147c 40E0 ldi r20,lo8(0)
+ 3505 147e 50E0 ldi r21,hi8(0)
+ 3506 1480 0E94 0000 call getvoxel
+ 3507 .LVL272:
+ 3508 1484 8823 tst r24
+ 3509 1486 01F0 breq .L258
+ 3510 .LM364:
+ 3511 1488 812F mov r24,r17
+ 3512 148a 602F mov r22,r16
+ 3513 148c 40E0 ldi r20,lo8(0)
+ 3514 148e 00C0 rjmp .L265
+ 3515 .L258:
+ 3516 .LM365:
+ 3517 1490 812F mov r24,r17
+ 3518 1492 602F mov r22,r16
+ 3519 1494 47E0 ldi r20,lo8(7)
+ 3520 .L265:
+ 3521 1496 9501 movw r18,r10
+ 3522 1498 0E94 0000 call sendvoxel_z
+ 3523 .LM366:
+ 3524 149c C401 movw r24,r8
+ 3525 149e 0E94 0000 call delay_ms
+ 3526 14a2 D12E mov r13,r17
+ 3527 14a4 E02E mov r14,r16
+ 3528 .LVL273:
+ 3529 .L257:
+ 3530 .LM367:
+ 3531 14a6 F394 inc r15
+ 3532 .L256:
+ 3533 14a8 8F2D mov r24,r15
+ 3534 14aa 90E0 ldi r25,lo8(0)
+ 3535 .LVL274:
+ 3536 14ac 8615 cp r24,r6
+ 3537 14ae 9705 cpc r25,r7
+ 3538 14b0 04F0 brlt .L260
+ 3539 .LVL275:
+ 3540 /* epilogue start */
+ 3541 .LM368:
+ 3542 14b2 DF91 pop r29
+ 3543 14b4 CF91 pop r28
+ 3544 14b6 1F91 pop r17
+ 3545 .LVL276:
+ 3546 14b8 0F91 pop r16
+ 3547 .LVL277:
+ 3548 14ba FF90 pop r15
+ 3549 14bc EF90 pop r14
+ 3550 .LVL278:
+ 3551 14be DF90 pop r13
+ 3552 .LVL279:
+ 3553 14c0 BF90 pop r11
+ 3554 14c2 AF90 pop r10
+ 3555 .LVL280:
+ 3556 14c4 9F90 pop r9
+ 3557 14c6 8F90 pop r8
+ 3558 .LVL281:
+ 3559 14c8 7F90 pop r7
+ 3560 14ca 6F90 pop r6
+ 3561 .LVL282:
+ 3562 14cc 0895 ret
+ 3563 .LFE12:
+ 3565 .global effect_blinky2
+ 3567 effect_blinky2:
+ 3568 .LFB7:
+ 3569 .LM369:
+ 3570 14ce EF92 push r14
+ 3571 14d0 FF92 push r15
+ 3572 14d2 0F93 push r16
+ 3573 14d4 1F93 push r17
+ 3574 14d6 CF93 push r28
+ 3575 14d8 DF93 push r29
+ 3576 /* prologue: function */
+ 3577 /* frame size = 0 */
+ 3578 .LM370:
+ 3579 14da 80E0 ldi r24,lo8(0)
+ 3580 14dc 0E94 0000 call fill
+ 3581 14e0 00E0 ldi r16,lo8(0)
+ 3582 14e2 10E0 ldi r17,hi8(0)
+ 3583 .LVL283:
+ 3584 .LM371:
+ 3585 14e4 7FEE ldi r23,lo8(751)
+ 3586 14e6 E72E mov r14,r23
+ 3587 14e8 72E0 ldi r23,hi8(751)
+ 3588 14ea F72E mov r15,r23
+ 3589 14ec 00C0 rjmp .L267
+ 3590 .LVL284:
+ 3591 .L268:
+ 3592 .LM372:
+ 3593 14ee 80E0 ldi r24,lo8(0)
+ 3594 14f0 0E94 0000 call fill
+ 3595 .LM373:
+ 3596 14f4 CE01 movw r24,r28
+ 3597 14f6 0E94 0000 call delay_ms
+ 3598 .LM374:
+ 3599 14fa 8FEF ldi r24,lo8(-1)
+ 3600 14fc 0E94 0000 call fill
+ 3601 .LM375:
+ 3602 1500 84E6 ldi r24,lo8(100)
+ 3603 1502 90E0 ldi r25,hi8(100)
+ 3604 1504 0E94 0000 call delay_ms
+ 3605 .LM376:
+ 3606 1508 CE01 movw r24,r28
+ 3607 150a 66EF ldi r22,lo8(-10)
+ 3608 150c 7FEF ldi r23,hi8(-10)
+ 3609 150e 0E94 0000 call __divmodhi4
+ 3610 1512 88EE ldi r24,lo8(1000)
+ 3611 1514 93E0 ldi r25,hi8(1000)
+ 3612 1516 0E94 0000 call __divmodhi4
+ 3613 151a 6F50 subi r22,lo8(-(-15))
+ 3614 151c 7040 sbci r23,hi8(-(-15))
+ 3615 151e C60F add r28,r22
+ 3616 1520 D71F adc r29,r23
+ 3617 .LM377:
+ 3618 1522 1C16 cp __zero_reg__,r28
+ 3619 1524 1D06 cpc __zero_reg__,r29
+ 3620 1526 04F0 brlt .L268
+ 3621 .LM378:
+ 3622 1528 88EE ldi r24,lo8(1000)
+ 3623 152a 93E0 ldi r25,hi8(1000)
+ 3624 152c 0E94 0000 call delay_ms
+ 3625 1530 CEEE ldi r28,lo8(750)
+ 3626 1532 D2E0 ldi r29,hi8(750)
+ 3627 .LVL285:
+ 3628 .L269:
+ 3629 .LM379:
+ 3630 1534 80E0 ldi r24,lo8(0)
+ 3631 1536 0E94 0000 call fill
+ 3632 .LM380:
+ 3633 153a C701 movw r24,r14
+ 3634 153c 8C1B sub r24,r28
+ 3635 153e 9D0B sbc r25,r29
+ 3636 1540 0E94 0000 call delay_ms
+ 3637 .LM381:
+ 3638 1544 8FEF ldi r24,lo8(-1)
+ 3639 1546 0E94 0000 call fill
+ 3640 .LM382:
+ 3641 154a 84E6 ldi r24,lo8(100)
+ 3642 154c 90E0 ldi r25,hi8(100)
+ 3643 154e 0E94 0000 call delay_ms
+ 3644 .LM383:
+ 3645 1552 CE01 movw r24,r28
+ 3646 1554 66EF ldi r22,lo8(-10)
+ 3647 1556 7FEF ldi r23,hi8(-10)
+ 3648 1558 0E94 0000 call __divmodhi4
+ 3649 155c 88EE ldi r24,lo8(1000)
+ 3650 155e 93E0 ldi r25,hi8(1000)
+ 3651 1560 0E94 0000 call __divmodhi4
+ 3652 1564 6F50 subi r22,lo8(-(-15))
+ 3653 1566 7040 sbci r23,hi8(-(-15))
+ 3654 1568 C60F add r28,r22
+ 3655 156a D71F adc r29,r23
+ 3656 .LM384:
+ 3657 156c 1C16 cp __zero_reg__,r28
+ 3658 156e 1D06 cpc __zero_reg__,r29
+ 3659 1570 04F0 brlt .L269
+ 3660 .LM385:
+ 3661 1572 0F5F subi r16,lo8(-(1))
+ 3662 1574 1F4F sbci r17,hi8(-(1))
+ 3663 1576 0230 cpi r16,2
+ 3664 1578 1105 cpc r17,__zero_reg__
+ 3665 157a 01F0 breq .L271
+ 3666 .L267:
+ 3667 157c CEEE ldi r28,lo8(750)
+ 3668 157e D2E0 ldi r29,hi8(750)
+ 3669 .LVL286:
+ 3670 1580 00C0 rjmp .L268
+ 3671 .L271:
+ 3672 /* epilogue start */
+ 3673 .LM386:
+ 3674 1582 DF91 pop r29
+ 3675 1584 CF91 pop r28
+ 3676 .LVL287:
+ 3677 1586 1F91 pop r17
+ 3678 1588 0F91 pop r16
+ 3679 .LVL288:
+ 3680 158a FF90 pop r15
+ 3681 158c EF90 pop r14
+ 3682 158e 0895 ret
+ 3683 .LFE7:
+ 3685 .global effect_wormsqueeze
+ 3687 effect_wormsqueeze:
+ 3688 .LFB26:
+ 3689 .LM387:
+ 3690 .LVL289:
+ 3691 1590 2F92 push r2
+ 3692 1592 3F92 push r3
+ 3693 1594 4F92 push r4
+ 3694 1596 5F92 push r5
+ 3695 1598 6F92 push r6
+ 3696 159a 7F92 push r7
+ 3697 159c 8F92 push r8
+ 3698 159e 9F92 push r9
+ 3699 15a0 AF92 push r10
+ 3700 15a2 BF92 push r11
+ 3701 15a4 CF92 push r12
+ 3702 15a6 DF92 push r13
+ 3703 15a8 EF92 push r14
+ 3704 15aa FF92 push r15
+ 3705 15ac 0F93 push r16
+ 3706 .LVL290:
+ 3707 15ae 1F93 push r17
+ 3708 15b0 DF93 push r29
+ 3709 15b2 CF93 push r28
+ 3710 15b4 CDB7 in r28,__SP_L__
+ 3711 15b6 DEB7 in r29,__SP_H__
+ 3712 15b8 2E97 sbiw r28,14
+ 3713 15ba 0FB6 in __tmp_reg__,__SREG__
+ 3714 15bc F894 cli
+ 3715 15be DEBF out __SP_H__,r29
+ 3716 15c0 0FBE out __SREG__,__tmp_reg__
+ 3717 15c2 CDBF out __SP_L__,r28
+ 3718 /* prologue: function */
+ 3719 /* frame size = 14 */
+ 3720 15c4 9A83 std Y+2,r25
+ 3721 15c6 8983 std Y+1,r24
+ 3722 15c8 7C83 std Y+4,r23
+ 3723 15ca 6B83 std Y+3,r22
+ 3724 15cc 5E83 std Y+6,r21
+ 3725 15ce 4D83 std Y+5,r20
+ 3726 15d0 3887 std Y+8,r19
+ 3727 15d2 2F83 std Y+7,r18
+ 3728 15d4 1A87 std Y+10,r17
+ 3729 15d6 0987 std Y+9,r16
+ 3730 .LVL291:
+ 3731 .LM388:
+ 3732 15d8 4F5F subi r20,lo8(-1)
+ 3733 15da 5F4F sbci r21,hi8(-1)
+ 3734 .LVL292:
+ 3735 15dc 01F4 brne .L275
+ 3736 .LVL293:
+ 3737 15de F7E0 ldi r31,lo8(7)
+ 3738 15e0 2F2E mov r2,r31
+ 3739 15e2 312C mov r3,__zero_reg__
+ 3740 .LVL294:
+ 3741 15e4 00C0 rjmp .L276
+ 3742 .LVL295:
+ 3743 .L275:
+ 3744 15e6 2224 clr r2
+ 3745 15e8 3324 clr r3
+ 3746 .LVL296:
+ 3747 .L276:
+ 3748 .LM389:
+ 3749 15ea E9E0 ldi r30,lo8(9)
+ 3750 15ec 6E2E mov r6,r30
+ 3751 15ee 712C mov r7,__zero_reg__
+ 3752 .LVL297:
+ 3753 15f0 8981 ldd r24,Y+1
+ 3754 15f2 9A81 ldd r25,Y+2
+ 3755 15f4 681A sub r6,r24
+ 3756 15f6 790A sbc r7,r25
+ 3757 .LM390:
+ 3758 15f8 0E94 0000 call rand
+ 3759 .LVL298:
+ 3760 15fc B301 movw r22,r6
+ 3761 15fe 0E94 0000 call __divmodhi4
+ 3762 1602 6C01 movw r12,r24
+ 3763 .LVL299:
+ 3764 .LM391:
+ 3765 1604 0E94 0000 call rand
+ 3766 .LVL300:
+ 3767 1608 B301 movw r22,r6
+ 3768 160a 0E94 0000 call __divmodhi4
+ 3769 160e 7C01 movw r14,r24
+ 3770 .LVL301:
+ 3771 1610 4424 clr r4
+ 3772 1612 5524 clr r5
+ 3773 .LVL302:
+ 3774 1614 00C0 rjmp .L277
+ 3775 .LVL303:
+ 3776 .L289:
+ 3777 .LM392:
+ 3778 1616 0E94 0000 call rand
+ 3779 161a 8C01 movw r16,r24
+ 3780 .LM393:
+ 3781 161c 0E94 0000 call rand
+ 3782 1620 9C01 movw r18,r24
+ 3783 .LM394:
+ 3784 1622 C801 movw r24,r16
+ 3785 1624 63E0 ldi r22,lo8(3)
+ 3786 1626 70E0 ldi r23,hi8(3)
+ 3787 1628 0E94 0000 call __divmodhi4
+ 3788 162c 0197 sbiw r24,1
+ 3789 162e 8C0D add r24,r12
+ 3790 1630 9D1D adc r25,r13
+ 3791 1632 9E87 std Y+14,r25
+ 3792 1634 8D87 std Y+13,r24
+ 3793 .LVL304:
+ 3794 1636 1816 cp __zero_reg__,r24
+ 3795 1638 1906 cpc __zero_reg__,r25
+ 3796 163a 04F4 brge .L278
+ 3797 163c 8615 cp r24,r6
+ 3798 163e 9705 cpc r25,r7
+ 3799 1640 04F0 brlt .L279
+ 3800 .L278:
+ 3801 1642 DE86 std Y+14,r13
+ 3802 1644 CD86 std Y+13,r12
+ 3803 .L279:
+ 3804 .LM395:
+ 3805 1646 C901 movw r24,r18
+ 3806 1648 63E0 ldi r22,lo8(3)
+ 3807 164a 70E0 ldi r23,hi8(3)
+ 3808 164c 0E94 0000 call __divmodhi4
+ 3809 1650 8C01 movw r16,r24
+ 3810 .LVL305:
+ 3811 1652 0150 subi r16,lo8(-(-1))
+ 3812 1654 1040 sbci r17,hi8(-(-1))
+ 3813 1656 0E0D add r16,r14
+ 3814 1658 1F1D adc r17,r15
+ 3815 165a 1016 cp __zero_reg__,r16
+ 3816 165c 1106 cpc __zero_reg__,r17
+ 3817 165e 04F4 brge .L280
+ 3818 1660 0615 cp r16,r6
+ 3819 1662 1705 cpc r17,r7
+ 3820 1664 04F0 brlt .L281
+ 3821 .L280:
+ 3822 1666 8701 movw r16,r14
+ 3823 .L281:
+ 3824 .LM396:
+ 3825 1668 8B81 ldd r24,Y+3
+ 3826 166a 6D81 ldd r22,Y+5
+ 3827 166c 7E81 ldd r23,Y+6
+ 3828 166e 0E94 0000 call shift
+ 3829 1672 8D84 ldd r8,Y+13
+ 3830 1674 9E84 ldd r9,Y+14
+ 3831 1676 AA24 clr r10
+ 3832 1678 BB24 clr r11
+ 3833 167a 00C0 rjmp .L282
+ 3834 .LVL306:
+ 3835 .L286:
+ 3836 .LM397:
+ 3837 167c EB81 ldd r30,Y+3
+ 3838 167e FC81 ldd r31,Y+4
+ 3839 1680 EA37 cpi r30,122
+ 3840 1682 F105 cpc r31,__zero_reg__
+ 3841 1684 01F4 brne .L283
+ 3842 .LVL307:
+ 3843 .LM398:
+ 3844 1686 C401 movw r24,r8
+ 3845 1688 B601 movw r22,r12
+ 3846 168a A101 movw r20,r2
+ 3847 168c 00C0 rjmp .L291
+ 3848 .L283:
+ 3849 .LM399:
+ 3850 168e 8B81 ldd r24,Y+3
+ 3851 1690 9C81 ldd r25,Y+4
+ 3852 1692 8937 cpi r24,121
+ 3853 1694 9105 cpc r25,__zero_reg__
+ 3854 1696 01F4 brne .L285
+ 3855 .LM400:
+ 3856 1698 C401 movw r24,r8
+ 3857 169a B101 movw r22,r2
+ 3858 169c A601 movw r20,r12
+ 3859 169e 00C0 rjmp .L291
+ 3860 .L285:
+ 3861 .LM401:
+ 3862 16a0 EB81 ldd r30,Y+3
+ 3863 16a2 FC81 ldd r31,Y+4
+ 3864 16a4 E837 cpi r30,120
+ 3865 16a6 F105 cpc r31,__zero_reg__
+ 3866 16a8 01F4 brne .L284
+ 3867 .LM402:
+ 3868 16aa 4D85 ldd r20,Y+13
+ 3869 16ac 5E85 ldd r21,Y+14
+ 3870 16ae 4E0D add r20,r14
+ 3871 16b0 5F1D adc r21,r15
+ 3872 16b2 C101 movw r24,r2
+ 3873 16b4 6B85 ldd r22,Y+11
+ 3874 16b6 7C85 ldd r23,Y+12
+ 3875 .L291:
+ 3876 16b8 0E94 0000 call setvoxel
+ 3877 .L284:
+ 3878 .LM403:
+ 3879 16bc 0894 sec
+ 3880 16be E11C adc r14,__zero_reg__
+ 3881 16c0 F11C adc r15,__zero_reg__
+ 3882 16c2 0894 sec
+ 3883 16c4 C11C adc r12,__zero_reg__
+ 3884 16c6 D11C adc r13,__zero_reg__
+ 3885 .L288:
+ 3886 16c8 8981 ldd r24,Y+1
+ 3887 16ca 9A81 ldd r25,Y+2
+ 3888 16cc E816 cp r14,r24
+ 3889 16ce F906 cpc r15,r25
+ 3890 16d0 04F0 brlt .L286
+ 3891 .LVL308:
+ 3892 .LM404:
+ 3893 16d2 0894 sec
+ 3894 16d4 A11C adc r10,__zero_reg__
+ 3895 16d6 B11C adc r11,__zero_reg__
+ 3896 16d8 0894 sec
+ 3897 16da 811C adc r8,__zero_reg__
+ 3898 16dc 911C adc r9,__zero_reg__
+ 3899 .LVL309:
+ 3900 .L282:
+ 3901 16de E981 ldd r30,Y+1
+ 3902 16e0 FA81 ldd r31,Y+2
+ 3903 16e2 AE16 cp r10,r30
+ 3904 16e4 BF06 cpc r11,r31
+ 3905 16e6 04F4 brge .L287
+ 3906 16e8 6801 movw r12,r16
+ 3907 16ea EE24 clr r14
+ 3908 16ec FF24 clr r15
+ 3909 .LM405:
+ 3910 16ee C501 movw r24,r10
+ 3911 16f0 800F add r24,r16
+ 3912 16f2 911F adc r25,r17
+ 3913 16f4 9C87 std Y+12,r25
+ 3914 16f6 8B87 std Y+11,r24
+ 3915 16f8 00C0 rjmp .L288
+ 3916 .LVL310:
+ 3917 .L287:
+ 3918 .LM406:
+ 3919 16fa 8985 ldd r24,Y+9
+ 3920 16fc 9A85 ldd r25,Y+10
+ 3921 16fe 0E94 0000 call delay_ms
+ 3922 .LM407:
+ 3923 1702 0894 sec
+ 3924 1704 411C adc r4,__zero_reg__
+ 3925 1706 511C adc r5,__zero_reg__
+ 3926 1708 CD84 ldd r12,Y+13
+ 3927 170a DE84 ldd r13,Y+14
+ 3928 170c 7801 movw r14,r16
+ 3929 .LVL311:
+ 3930 .L277:
+ 3931 170e EF81 ldd r30,Y+7
+ 3932 1710 F885 ldd r31,Y+8
+ 3933 1712 4E16 cp r4,r30
+ 3934 1714 5F06 cpc r5,r31
+ 3935 1716 04F4 brge .+2
+ 3936 1718 00C0 rjmp .L289
+ 3937 /* epilogue start */
+ 3938 .LM408:
+ 3939 171a 2E96 adiw r28,14
+ 3940 171c 0FB6 in __tmp_reg__,__SREG__
+ 3941 171e F894 cli
+ 3942 1720 DEBF out __SP_H__,r29
+ 3943 1722 0FBE out __SREG__,__tmp_reg__
+ 3944 1724 CDBF out __SP_L__,r28
+ 3945 1726 CF91 pop r28
+ 3946 1728 DF91 pop r29
+ 3947 172a 1F91 pop r17
+ 3948 172c 0F91 pop r16
+ 3949 172e FF90 pop r15
+ 3950 1730 EF90 pop r14
+ 3951 .LVL312:
+ 3952 1732 DF90 pop r13
+ 3953 1734 CF90 pop r12
+ 3954 .LVL313:
+ 3955 1736 BF90 pop r11
+ 3956 1738 AF90 pop r10
+ 3957 .LVL314:
+ 3958 173a 9F90 pop r9
+ 3959 173c 8F90 pop r8
+ 3960 173e 7F90 pop r7
+ 3961 1740 6F90 pop r6
+ 3962 .LVL315:
+ 3963 1742 5F90 pop r5
+ 3964 1744 4F90 pop r4
+ 3965 .LVL316:
+ 3966 1746 3F90 pop r3
+ 3967 1748 2F90 pop r2
+ 3968 .LVL317:
+ 3969 174a 0895 ret
+ 3970 .LFE26:
+ 3972 .global effect_rain
+ 3974 effect_rain:
+ 3975 .LFB15:
+ 3976 .LM409:
+ 3977 .LVL318:
+ 3978 174c AF92 push r10
+ 3979 174e BF92 push r11
+ 3980 1750 CF92 push r12
+ 3981 1752 DF92 push r13
+ 3982 1754 EF92 push r14
+ 3983 1756 FF92 push r15
+ 3984 1758 0F93 push r16
+ 3985 175a 1F93 push r17
+ 3986 175c CF93 push r28
+ 3987 175e DF93 push r29
+ 3988 /* prologue: function */
+ 3989 /* frame size = 0 */
+ 3990 1760 5C01 movw r10,r24
+ 3991 .LM410:
+ 3992 1762 CC24 clr r12
+ 3993 1764 DD24 clr r13
+ 3994 .LVL319:
+ 3995 1766 00C0 rjmp .L293
+ 3996 .LVL320:
+ 3997 .L296:
+ 3998 .LM411:
+ 3999 1768 0E94 0000 call rand
+ 4000 176c 64E0 ldi r22,lo8(4)
+ 4001 176e 70E0 ldi r23,hi8(4)
+ 4002 1770 0E94 0000 call __divmodhi4
+ 4003 1774 EC01 movw r28,r24
+ 4004 .LVL321:
+ 4005 1776 EE24 clr r14
+ 4006 1778 FF24 clr r15
+ 4007 177a 00C0 rjmp .L294
+ 4008 .LVL322:
+ 4009 .L295:
+ 4010 .LM412:
+ 4011 177c 0E94 0000 call rand
+ 4012 1780 8C01 movw r16,r24
+ 4013 .LM413:
+ 4014 1782 0E94 0000 call rand
+ 4015 1786 9C01 movw r18,r24
+ 4016 .LM414:
+ 4017 1788 C801 movw r24,r16
+ 4018 178a 68E0 ldi r22,lo8(8)
+ 4019 178c 70E0 ldi r23,hi8(8)
+ 4020 178e 0E94 0000 call __divmodhi4
+ 4021 1792 FC01 movw r30,r24
+ 4022 1794 C901 movw r24,r18
+ 4023 1796 68E0 ldi r22,lo8(8)
+ 4024 1798 70E0 ldi r23,hi8(8)
+ 4025 179a 0E94 0000 call __divmodhi4
+ 4026 179e BC01 movw r22,r24
+ 4027 17a0 CF01 movw r24,r30
+ 4028 17a2 47E0 ldi r20,lo8(7)
+ 4029 17a4 50E0 ldi r21,hi8(7)
+ 4030 17a6 0E94 0000 call setvoxel
+ 4031 .LM415:
+ 4032 17aa 0894 sec
+ 4033 17ac E11C adc r14,__zero_reg__
+ 4034 17ae F11C adc r15,__zero_reg__
+ 4035 .L294:
+ 4036 17b0 EC16 cp r14,r28
+ 4037 17b2 FD06 cpc r15,r29
+ 4038 17b4 04F0 brlt .L295
+ 4039 .LM416:
+ 4040 17b6 88EE ldi r24,lo8(1000)
+ 4041 17b8 93E0 ldi r25,hi8(1000)
+ 4042 17ba 0E94 0000 call delay_ms
+ 4043 .LM417:
+ 4044 17be 8AE7 ldi r24,lo8(122)
+ 4045 17c0 6FEF ldi r22,lo8(-1)
+ 4046 17c2 7FEF ldi r23,hi8(-1)
+ 4047 17c4 0E94 0000 call shift
+ 4048 .LM418:
+ 4049 17c8 0894 sec
+ 4050 17ca C11C adc r12,__zero_reg__
+ 4051 17cc D11C adc r13,__zero_reg__
+ 4052 .LVL323:
+ 4053 .L293:
+ 4054 17ce CA14 cp r12,r10
+ 4055 17d0 DB04 cpc r13,r11
+ 4056 17d2 04F0 brlt .L296
+ 4057 /* epilogue start */
+ 4058 .LM419:
+ 4059 17d4 DF91 pop r29
+ 4060 17d6 CF91 pop r28
+ 4061 .LVL324:
+ 4062 17d8 1F91 pop r17
+ 4063 17da 0F91 pop r16
+ 4064 17dc FF90 pop r15
+ 4065 17de EF90 pop r14
+ 4066 .LVL325:
+ 4067 17e0 DF90 pop r13
+ 4068 17e2 CF90 pop r12
+ 4069 .LVL326:
+ 4070 17e4 BF90 pop r11
+ 4071 17e6 AF90 pop r10
+ 4072 .LVL327:
+ 4073 17e8 0895 ret
+ 4074 .LFE15:
+ 4076 .global boingboing
+ 4078 boingboing:
+ 4079 .LFB13:
+ 4080 .LM420:
+ 4081 .LVL328:
+ 4082 17ea 2F92 push r2
+ 4083 17ec 3F92 push r3
+ 4084 17ee 4F92 push r4
+ 4085 17f0 5F92 push r5
+ 4086 17f2 6F92 push r6
+ 4087 17f4 7F92 push r7
+ 4088 17f6 8F92 push r8
+ 4089 17f8 9F92 push r9
+ 4090 17fa AF92 push r10
+ 4091 17fc BF92 push r11
+ 4092 17fe CF92 push r12
+ 4093 1800 DF92 push r13
+ 4094 1802 EF92 push r14
+ 4095 1804 FF92 push r15
+ 4096 1806 0F93 push r16
+ 4097 1808 1F93 push r17
+ 4098 180a DF93 push r29
+ 4099 180c CF93 push r28
+ 4100 180e CDB7 in r28,__SP_L__
+ 4101 1810 DEB7 in r29,__SP_H__
+ 4102 1812 E897 sbiw r28,56
+ 4103 1814 0FB6 in __tmp_reg__,__SREG__
+ 4104 1816 F894 cli
+ 4105 1818 DEBF out __SP_H__,r29
+ 4106 181a 0FBE out __SREG__,__tmp_reg__
+ 4107 181c CDBF out __SP_L__,r28
+ 4108 /* prologue: function */
+ 4109 /* frame size = 56 */
+ 4110 181e 9AAB std Y+50,r25
+ 4111 1820 89AB std Y+49,r24
+ 4112 1822 7CAB std Y+52,r23
+ 4113 1824 6BAB std Y+51,r22
+ 4114 1826 222E mov r2,r18
+ 4115 .LM421:
+ 4116 1828 80E0 ldi r24,lo8(0)
+ 4117 .LVL329:
+ 4118 182a 0E94 0000 call fill
+ 4119 .LVL330:
+ 4120 182e FE01 movw r30,r28
+ 4121 1830 3196 adiw r30,1
+ 4122 .LM422:
+ 4123 1832 84E0 ldi r24,lo8(4)
+ 4124 1834 90E0 ldi r25,hi8(4)
+ 4125 .LM423:
+ 4126 1836 9E01 movw r18,r28
+ 4127 1838 2F5C subi r18,lo8(-(49))
+ 4128 183a 3F4F sbci r19,hi8(-(49))
+ 4129 183c 3EAB std Y+54,r19
+ 4130 183e 2DAB std Y+53,r18
+ 4131 .L299:
+ 4132 .LM424:
+ 4133 1840 9183 std Z+1,r25
+ 4134 1842 8083 st Z,r24
+ 4135 .LM425:
+ 4136 1844 9383 std Z+3,r25
+ 4137 1846 8283 std Z+2,r24
+ 4138 .LM426:
+ 4139 1848 9583 std Z+5,r25
+ 4140 184a 8483 std Z+4,r24
+ 4141 184c 3696 adiw r30,6
+ 4142 .LM427:
+ 4143 184e 2DA9 ldd r18,Y+53
+ 4144 1850 3EA9 ldd r19,Y+54
+ 4145 1852 E217 cp r30,r18
+ 4146 1854 F307 cpc r31,r19
+ 4147 1856 01F4 brne .L299
+ 4148 .LM428:
+ 4149 1858 0E94 0000 call rand
+ 4150 185c 68E0 ldi r22,lo8(8)
+ 4151 185e 70E0 ldi r23,hi8(8)
+ 4152 1860 0E94 0000 call __divmodhi4
+ 4153 1864 3C01 movw r6,r24
+ 4154 .LVL331:
+ 4155 .LM429:
+ 4156 1866 0E94 0000 call rand
+ 4157 .LVL332:
+ 4158 186a 68E0 ldi r22,lo8(8)
+ 4159 186c 70E0 ldi r23,hi8(8)
+ 4160 186e 0E94 0000 call __divmodhi4
+ 4161 1872 2C01 movw r4,r24
+ 4162 .LVL333:
+ 4163 .LM430:
+ 4164 1874 0E94 0000 call rand
+ 4165 .LVL334:
+ 4166 1878 68E0 ldi r22,lo8(8)
+ 4167 187a 70E0 ldi r23,hi8(8)
+ 4168 187c 0E94 0000 call __divmodhi4
+ 4169 1880 7C01 movw r14,r24
+ 4170 .LVL335:
+ 4171 1882 E1E0 ldi r30,lo8(1)
+ 4172 1884 CE2E mov r12,r30
+ 4173 1886 D12C mov r13,__zero_reg__
+ 4174 .LVL336:
+ 4175 1888 71E0 ldi r23,lo8(1)
+ 4176 188a 872E mov r8,r23
+ 4177 188c 912C mov r9,__zero_reg__
+ 4178 .LVL337:
+ 4179 188e 61E0 ldi r22,lo8(1)
+ 4180 1890 A62E mov r10,r22
+ 4181 1892 B12C mov r11,__zero_reg__
+ 4182 .LVL338:
+ 4183 .LM431:
+ 4184 1894 CE01 movw r24,r28
+ 4185 .LVL339:
+ 4186 1896 0B97 sbiw r24,11
+ 4187 1898 98AF std Y+56,r25
+ 4188 189a 8FAB std Y+55,r24
+ 4189 189c 00C0 rjmp .L300
+ 4190 .LVL340:
+ 4191 .L353:
+ 4192 .LM432:
+ 4193 189e 0E94 0000 call rand
+ 4194 18a2 63E0 ldi r22,lo8(3)
+ 4195 18a4 70E0 ldi r23,hi8(3)
+ 4196 18a6 0E94 0000 call __divmodhi4
+ 4197 18aa 892B or r24,r25
+ 4198 18ac 01F4 brne .L301
+ 4199 .LM433:
+ 4200 18ae 0E94 0000 call rand
+ 4201 18b2 63E0 ldi r22,lo8(3)
+ 4202 18b4 70E0 ldi r23,hi8(3)
+ 4203 18b6 0E94 0000 call __divmodhi4
+ 4204 .LM434:
+ 4205 18ba 0097 sbiw r24,0
+ 4206 .LVL341:
+ 4207 18bc 01F4 brne .L302
+ 4208 .LM435:
+ 4209 18be 0E94 0000 call rand
+ 4210 .LVL342:
+ 4211 18c2 63E0 ldi r22,lo8(3)
+ 4212 18c4 70E0 ldi r23,hi8(3)
+ 4213 18c6 0E94 0000 call __divmodhi4
+ 4214 18ca 6C01 movw r12,r24
+ 4215 18cc 0894 sec
+ 4216 18ce C108 sbc r12,__zero_reg__
+ 4217 18d0 D108 sbc r13,__zero_reg__
+ 4218 18d2 00C0 rjmp .L301
+ 4219 .LVL343:
+ 4220 .L302:
+ 4221 .LM436:
+ 4222 18d4 8130 cpi r24,1
+ 4223 18d6 9105 cpc r25,__zero_reg__
+ 4224 18d8 01F4 brne .L303
+ 4225 .LM437:
+ 4226 18da 0E94 0000 call rand
+ 4227 .LVL344:
+ 4228 18de 63E0 ldi r22,lo8(3)
+ 4229 18e0 70E0 ldi r23,hi8(3)
+ 4230 18e2 0E94 0000 call __divmodhi4
+ 4231 18e6 4C01 movw r8,r24
+ 4232 18e8 0894 sec
+ 4233 18ea 8108 sbc r8,__zero_reg__
+ 4234 18ec 9108 sbc r9,__zero_reg__
+ 4235 18ee 00C0 rjmp .L301
+ 4236 .LVL345:
+ 4237 .L303:
+ 4238 .LM438:
+ 4239 18f0 8230 cpi r24,2
+ 4240 18f2 9105 cpc r25,__zero_reg__
+ 4241 18f4 01F4 brne .L301
+ 4242 .LM439:
+ 4243 18f6 0E94 0000 call rand
+ 4244 .LVL346:
+ 4245 18fa 63E0 ldi r22,lo8(3)
+ 4246 18fc 70E0 ldi r23,hi8(3)
+ 4247 18fe 0E94 0000 call __divmodhi4
+ 4248 1902 5C01 movw r10,r24
+ 4249 1904 0894 sec
+ 4250 1906 A108 sbc r10,__zero_reg__
+ 4251 1908 B108 sbc r11,__zero_reg__
+ 4252 .LVL347:
+ 4253 .L301:
+ 4254 .LM440:
+ 4255 190a 9FEF ldi r25,lo8(-1)
+ 4256 190c C916 cp r12,r25
+ 4257 190e 9FEF ldi r25,hi8(-1)
+ 4258 1910 D906 cpc r13,r25
+ 4259 1912 01F4 brne .L304
+ 4260 1914 4114 cp r4,__zero_reg__
+ 4261 1916 5104 cpc r5,__zero_reg__
+ 4262 1918 01F4 brne .L304
+ 4263 .LM441:
+ 4264 191a 0E94 0000 call rand
+ 4265 .LVL348:
+ 4266 191e 63E0 ldi r22,lo8(3)
+ 4267 1920 70E0 ldi r23,hi8(3)
+ 4268 1922 0E94 0000 call __divmodhi4
+ 4269 1926 0197 sbiw r24,1
+ 4270 1928 01F0 breq .L305
+ 4271 192a CC24 clr r12
+ 4272 192c DD24 clr r13
+ 4273 192e 00C0 rjmp .L360
+ 4274 .L305:
+ 4275 1930 51E0 ldi r21,lo8(1)
+ 4276 1932 C52E mov r12,r21
+ 4277 1934 D12C mov r13,__zero_reg__
+ 4278 .L360:
+ 4279 1936 11E0 ldi r17,lo8(1)
+ 4280 1938 00C0 rjmp .L306
+ 4281 .LVL349:
+ 4282 .L304:
+ 4283 193a 10E0 ldi r17,lo8(0)
+ 4284 .L306:
+ 4285 .LM442:
+ 4286 193c EFEF ldi r30,lo8(-1)
+ 4287 193e 8E16 cp r8,r30
+ 4288 1940 EFEF ldi r30,hi8(-1)
+ 4289 1942 9E06 cpc r9,r30
+ 4290 1944 01F4 brne .L307
+ 4291 1946 6114 cp r6,__zero_reg__
+ 4292 1948 7104 cpc r7,__zero_reg__
+ 4293 194a 01F4 brne .L307
+ 4294 .LM443:
+ 4295 194c 0E94 0000 call rand
+ 4296 .LVL350:
+ 4297 1950 63E0 ldi r22,lo8(3)
+ 4298 1952 70E0 ldi r23,hi8(3)
+ 4299 1954 0E94 0000 call __divmodhi4
+ 4300 1958 0197 sbiw r24,1
+ 4301 195a 01F0 breq .L308
+ 4302 195c 8824 clr r8
+ 4303 195e 9924 clr r9
+ 4304 1960 00C0 rjmp .L361
+ 4305 .L308:
+ 4306 1962 41E0 ldi r20,lo8(1)
+ 4307 1964 842E mov r8,r20
+ 4308 1966 912C mov r9,__zero_reg__
+ 4309 .L361:
+ 4310 1968 01E0 ldi r16,lo8(1)
+ 4311 196a 00C0 rjmp .L309
+ 4312 .LVL351:
+ 4313 .L307:
+ 4314 196c 00E0 ldi r16,lo8(0)
+ 4315 .L309:
+ 4316 .LM444:
+ 4317 196e FFEF ldi r31,lo8(-1)
+ 4318 1970 AF16 cp r10,r31
+ 4319 1972 FFEF ldi r31,hi8(-1)
+ 4320 1974 BF06 cpc r11,r31
+ 4321 1976 01F4 brne .L310
+ 4322 1978 E114 cp r14,__zero_reg__
+ 4323 197a F104 cpc r15,__zero_reg__
+ 4324 197c 01F4 brne .L310
+ 4325 .LM445:
+ 4326 197e 0E94 0000 call rand
+ 4327 .LVL352:
+ 4328 1982 63E0 ldi r22,lo8(3)
+ 4329 1984 70E0 ldi r23,hi8(3)
+ 4330 1986 0E94 0000 call __divmodhi4
+ 4331 198a 0197 sbiw r24,1
+ 4332 198c 01F0 breq .L311
+ 4333 198e AA24 clr r10
+ 4334 1990 BB24 clr r11
+ 4335 1992 00C0 rjmp .L362
+ 4336 .L311:
+ 4337 1994 31E0 ldi r19,lo8(1)
+ 4338 1996 A32E mov r10,r19
+ 4339 1998 B12C mov r11,__zero_reg__
+ 4340 .L362:
+ 4341 199a 3324 clr r3
+ 4342 199c 3394 inc r3
+ 4343 199e 00C0 rjmp .L312
+ 4344 .LVL353:
+ 4345 .L310:
+ 4346 19a0 3324 clr r3
+ 4347 .L312:
+ 4348 .LM446:
+ 4349 19a2 21E0 ldi r18,lo8(1)
+ 4350 19a4 C216 cp r12,r18
+ 4351 19a6 D104 cpc r13,__zero_reg__
+ 4352 19a8 01F4 brne .L313
+ 4353 19aa 37E0 ldi r19,lo8(7)
+ 4354 19ac 4316 cp r4,r19
+ 4355 19ae 5104 cpc r5,__zero_reg__
+ 4356 19b0 01F4 brne .L313
+ 4357 .LM447:
+ 4358 19b2 0E94 0000 call rand
+ 4359 .LVL354:
+ 4360 19b6 63E0 ldi r22,lo8(3)
+ 4361 19b8 70E0 ldi r23,hi8(3)
+ 4362 19ba 0E94 0000 call __divmodhi4
+ 4363 19be 0197 sbiw r24,1
+ 4364 19c0 01F0 breq .L314
+ 4365 19c2 CC24 clr r12
+ 4366 19c4 DD24 clr r13
+ 4367 19c6 00C0 rjmp .L363
+ 4368 .L314:
+ 4369 19c8 CC24 clr r12
+ 4370 19ca CA94 dec r12
+ 4371 19cc DC2C mov r13,r12
+ 4372 .L363:
+ 4373 19ce 11E0 ldi r17,lo8(1)
+ 4374 .LVL355:
+ 4375 .L313:
+ 4376 .LM448:
+ 4377 19d0 81E0 ldi r24,lo8(1)
+ 4378 19d2 8816 cp r8,r24
+ 4379 19d4 9104 cpc r9,__zero_reg__
+ 4380 .LVL356:
+ 4381 19d6 01F4 brne .L315
+ 4382 19d8 97E0 ldi r25,lo8(7)
+ 4383 19da 6916 cp r6,r25
+ 4384 19dc 7104 cpc r7,__zero_reg__
+ 4385 19de 01F4 brne .L315
+ 4386 .LM449:
+ 4387 19e0 0E94 0000 call rand
+ 4388 19e4 63E0 ldi r22,lo8(3)
+ 4389 19e6 70E0 ldi r23,hi8(3)
+ 4390 19e8 0E94 0000 call __divmodhi4
+ 4391 19ec 0197 sbiw r24,1
+ 4392 19ee 01F0 breq .L316
+ 4393 19f0 8824 clr r8
+ 4394 19f2 9924 clr r9
+ 4395 19f4 00C0 rjmp .L364
+ 4396 .L316:
+ 4397 19f6 8824 clr r8
+ 4398 19f8 8A94 dec r8
+ 4399 19fa 982C mov r9,r8
+ 4400 .L364:
+ 4401 19fc 01E0 ldi r16,lo8(1)
+ 4402 .L315:
+ 4403 .LM450:
+ 4404 19fe E1E0 ldi r30,lo8(1)
+ 4405 1a00 AE16 cp r10,r30
+ 4406 1a02 B104 cpc r11,__zero_reg__
+ 4407 1a04 01F4 brne .L317
+ 4408 1a06 F7E0 ldi r31,lo8(7)
+ 4409 1a08 EF16 cp r14,r31
+ 4410 1a0a F104 cpc r15,__zero_reg__
+ 4411 1a0c 01F4 brne .L317
+ 4412 .LM451:
+ 4413 1a0e 0E94 0000 call rand
+ 4414 1a12 63E0 ldi r22,lo8(3)
+ 4415 1a14 70E0 ldi r23,hi8(3)
+ 4416 1a16 0E94 0000 call __divmodhi4
+ 4417 1a1a 0197 sbiw r24,1
+ 4418 1a1c 01F0 breq .L318
+ 4419 1a1e AA24 clr r10
+ 4420 1a20 BB24 clr r11
+ 4421 1a22 00C0 rjmp .L365
+ 4422 .L318:
+ 4423 1a24 AA24 clr r10
+ 4424 1a26 AA94 dec r10
+ 4425 1a28 BA2C mov r11,r10
+ 4426 .L365:
+ 4427 1a2a 3324 clr r3
+ 4428 1a2c 3394 inc r3
+ 4429 .L317:
+ 4430 .LM452:
+ 4431 1a2e 1123 tst r17
+ 4432 1a30 01F0 breq .L319
+ 4433 .LM453:
+ 4434 1a32 8114 cp r8,__zero_reg__
+ 4435 1a34 9104 cpc r9,__zero_reg__
+ 4436 1a36 01F4 brne .L320
+ 4437 .LM454:
+ 4438 1a38 27E0 ldi r18,lo8(7)
+ 4439 1a3a 6216 cp r6,r18
+ 4440 1a3c 7104 cpc r7,__zero_reg__
+ 4441 1a3e 01F0 breq .L321
+ 4442 .LM455:
+ 4443 1a40 6114 cp r6,__zero_reg__
+ 4444 1a42 7104 cpc r7,__zero_reg__
+ 4445 1a44 01F0 breq .L322
+ 4446 .LM456:
+ 4447 1a46 0E94 0000 call rand
+ 4448 1a4a 80FD sbrc r24,0
+ 4449 1a4c 00C0 rjmp .L322
+ 4450 .L321:
+ 4451 1a4e 8824 clr r8
+ 4452 1a50 8A94 dec r8
+ 4453 1a52 982C mov r9,r8
+ 4454 1a54 00C0 rjmp .L320
+ 4455 .L322:
+ 4456 1a56 21E0 ldi r18,lo8(1)
+ 4457 1a58 822E mov r8,r18
+ 4458 1a5a 912C mov r9,__zero_reg__
+ 4459 .L320:
+ 4460 .LM457:
+ 4461 1a5c A114 cp r10,__zero_reg__
+ 4462 1a5e B104 cpc r11,__zero_reg__
+ 4463 1a60 01F4 brne .L319
+ 4464 .LM458:
+ 4465 1a62 37E0 ldi r19,lo8(7)
+ 4466 1a64 E316 cp r14,r19
+ 4467 1a66 F104 cpc r15,__zero_reg__
+ 4468 1a68 01F0 breq .L323
+ 4469 .LM459:
+ 4470 1a6a E114 cp r14,__zero_reg__
+ 4471 1a6c F104 cpc r15,__zero_reg__
+ 4472 1a6e 01F0 breq .L324
+ 4473 .LM460:
+ 4474 1a70 0E94 0000 call rand
+ 4475 1a74 80FD sbrc r24,0
+ 4476 1a76 00C0 rjmp .L324
+ 4477 .L323:
+ 4478 1a78 AA24 clr r10
+ 4479 1a7a AA94 dec r10
+ 4480 1a7c BA2C mov r11,r10
+ 4481 1a7e 00C0 rjmp .L319
+ 4482 .L324:
+ 4483 1a80 91E0 ldi r25,lo8(1)
+ 4484 1a82 A92E mov r10,r25
+ 4485 1a84 B12C mov r11,__zero_reg__
+ 4486 .L319:
+ 4487 .LM461:
+ 4488 1a86 0023 tst r16
+ 4489 1a88 01F0 breq .L325
+ 4490 .LM462:
+ 4491 1a8a C114 cp r12,__zero_reg__
+ 4492 1a8c D104 cpc r13,__zero_reg__
+ 4493 1a8e 01F4 brne .L326
+ 4494 .LM463:
+ 4495 1a90 87E0 ldi r24,lo8(7)
+ 4496 1a92 4816 cp r4,r24
+ 4497 1a94 5104 cpc r5,__zero_reg__
+ 4498 1a96 01F0 breq .L327
+ 4499 .LM464:
+ 4500 1a98 4114 cp r4,__zero_reg__
+ 4501 1a9a 5104 cpc r5,__zero_reg__
+ 4502 1a9c 01F0 breq .L328
+ 4503 .LM465:
+ 4504 1a9e 0E94 0000 call rand
+ 4505 1aa2 80FD sbrc r24,0
+ 4506 1aa4 00C0 rjmp .L328
+ 4507 .L327:
+ 4508 1aa6 CC24 clr r12
+ 4509 1aa8 CA94 dec r12
+ 4510 1aaa DC2C mov r13,r12
+ 4511 1aac 00C0 rjmp .L326
+ 4512 .L328:
+ 4513 1aae 81E0 ldi r24,lo8(1)
+ 4514 1ab0 C82E mov r12,r24
+ 4515 1ab2 D12C mov r13,__zero_reg__
+ 4516 .L326:
+ 4517 .LM466:
+ 4518 1ab4 A114 cp r10,__zero_reg__
+ 4519 1ab6 B104 cpc r11,__zero_reg__
+ 4520 1ab8 01F4 brne .L325
+ 4521 .LM467:
+ 4522 1aba 93E0 ldi r25,lo8(3)
+ 4523 1abc E916 cp r14,r25
+ 4524 1abe F104 cpc r15,__zero_reg__
+ 4525 1ac0 01F0 breq .L329
+ 4526 .LM468:
+ 4527 1ac2 E114 cp r14,__zero_reg__
+ 4528 1ac4 F104 cpc r15,__zero_reg__
+ 4529 1ac6 01F0 breq .L330
+ 4530 .LM469:
+ 4531 1ac8 0E94 0000 call rand
+ 4532 1acc 80FD sbrc r24,0
+ 4533 1ace 00C0 rjmp .L330
+ 4534 .L329:
+ 4535 1ad0 AA24 clr r10
+ 4536 1ad2 AA94 dec r10
+ 4537 1ad4 BA2C mov r11,r10
+ 4538 1ad6 00C0 rjmp .L325
+ 4539 .L330:
+ 4540 1ad8 01E0 ldi r16,lo8(1)
+ 4541 1ada A02E mov r10,r16
+ 4542 1adc B12C mov r11,__zero_reg__
+ 4543 .LVL357:
+ 4544 .L325:
+ 4545 .LM470:
+ 4546 1ade 3320 tst r3
+ 4547 1ae0 01F0 breq .L331
+ 4548 .LM471:
+ 4549 1ae2 8114 cp r8,__zero_reg__
+ 4550 1ae4 9104 cpc r9,__zero_reg__
+ 4551 1ae6 01F4 brne .L332
+ 4552 .LM472:
+ 4553 1ae8 E7E0 ldi r30,lo8(7)
+ 4554 1aea 6E16 cp r6,r30
+ 4555 1aec 7104 cpc r7,__zero_reg__
+ 4556 1aee 01F0 breq .L333
+ 4557 .LM473:
+ 4558 1af0 6114 cp r6,__zero_reg__
+ 4559 1af2 7104 cpc r7,__zero_reg__
+ 4560 1af4 01F0 breq .L334
+ 4561 .LM474:
+ 4562 1af6 0E94 0000 call rand
+ 4563 1afa 80FD sbrc r24,0
+ 4564 1afc 00C0 rjmp .L334
+ 4565 .L333:
+ 4566 1afe 8824 clr r8
+ 4567 1b00 8A94 dec r8
+ 4568 1b02 982C mov r9,r8
+ 4569 1b04 00C0 rjmp .L332
+ 4570 .L334:
+ 4571 1b06 11E0 ldi r17,lo8(1)
+ 4572 1b08 812E mov r8,r17
+ 4573 1b0a 912C mov r9,__zero_reg__
+ 4574 .LVL358:
+ 4575 .L332:
+ 4576 .LM475:
+ 4577 1b0c C114 cp r12,__zero_reg__
+ 4578 1b0e D104 cpc r13,__zero_reg__
+ 4579 1b10 01F4 brne .L331
+ 4580 .LM476:
+ 4581 1b12 F7E0 ldi r31,lo8(7)
+ 4582 1b14 4F16 cp r4,r31
+ 4583 1b16 5104 cpc r5,__zero_reg__
+ 4584 1b18 01F4 brne .L335
+ 4585 1b1a CC24 clr r12
+ 4586 1b1c CA94 dec r12
+ 4587 1b1e DC2C mov r13,r12
+ 4588 1b20 00C0 rjmp .L336
+ 4589 .L335:
+ 4590 .LM477:
+ 4591 1b22 4114 cp r4,__zero_reg__
+ 4592 1b24 5104 cpc r5,__zero_reg__
+ 4593 1b26 01F4 brne .L337
+ 4594 1b28 B1E0 ldi r27,lo8(1)
+ 4595 1b2a CB2E mov r12,r27
+ 4596 1b2c D12C mov r13,__zero_reg__
+ 4597 1b2e 00C0 rjmp .L338
+ 4598 .L337:
+ 4599 .LM478:
+ 4600 1b30 0E94 0000 call rand
+ 4601 1b34 80FF sbrs r24,0
+ 4602 1b36 00C0 rjmp .L339
+ 4603 1b38 A1E0 ldi r26,lo8(1)
+ 4604 1b3a CA2E mov r12,r26
+ 4605 1b3c D12C mov r13,__zero_reg__
+ 4606 1b3e 00C0 rjmp .L340
+ 4607 .L331:
+ 4608 .LM479:
+ 4609 1b40 4114 cp r4,__zero_reg__
+ 4610 1b42 5104 cpc r5,__zero_reg__
+ 4611 1b44 01F4 brne .L341
+ 4612 .L338:
+ 4613 1b46 6114 cp r6,__zero_reg__
+ 4614 1b48 7104 cpc r7,__zero_reg__
+ 4615 1b4a 01F4 brne .L342
+ 4616 1b4c E114 cp r14,__zero_reg__
+ 4617 1b4e F104 cpc r15,__zero_reg__
+ 4618 1b50 01F0 breq .L343
+ 4619 1b52 27E0 ldi r18,lo8(7)
+ 4620 1b54 E216 cp r14,r18
+ 4621 1b56 F104 cpc r15,__zero_reg__
+ 4622 1b58 01F4 brne .L341
+ 4623 1b5a 00C0 rjmp .L343
+ 4624 .L342:
+ 4625 1b5c 37E0 ldi r19,lo8(7)
+ 4626 1b5e 6316 cp r6,r19
+ 4627 1b60 7104 cpc r7,__zero_reg__
+ 4628 1b62 01F4 brne .L341
+ 4629 1b64 E114 cp r14,__zero_reg__
+ 4630 1b66 F104 cpc r15,__zero_reg__
+ 4631 1b68 01F0 breq .L343
+ 4632 1b6a 87E0 ldi r24,lo8(7)
+ 4633 1b6c E816 cp r14,r24
+ 4634 1b6e F104 cpc r15,__zero_reg__
+ 4635 1b70 01F0 breq .L343
+ 4636 .L341:
+ 4637 1b72 97E0 ldi r25,lo8(7)
+ 4638 1b74 4916 cp r4,r25
+ 4639 1b76 5104 cpc r5,__zero_reg__
+ 4640 1b78 01F4 brne .L340
+ 4641 .L336:
+ 4642 1b7a 6114 cp r6,__zero_reg__
+ 4643 1b7c 7104 cpc r7,__zero_reg__
+ 4644 1b7e 01F4 brne .L344
+ 4645 1b80 E114 cp r14,__zero_reg__
+ 4646 1b82 F104 cpc r15,__zero_reg__
+ 4647 1b84 01F0 breq .L343
+ 4648 1b86 E7E0 ldi r30,lo8(7)
+ 4649 1b88 EE16 cp r14,r30
+ 4650 1b8a F104 cpc r15,__zero_reg__
+ 4651 1b8c 01F4 brne .L340
+ 4652 1b8e 00C0 rjmp .L343
+ 4653 .L344:
+ 4654 1b90 F7E0 ldi r31,lo8(7)
+ 4655 1b92 6F16 cp r6,r31
+ 4656 1b94 7104 cpc r7,__zero_reg__
+ 4657 1b96 01F4 brne .L340
+ 4658 1b98 E114 cp r14,__zero_reg__
+ 4659 1b9a F104 cpc r15,__zero_reg__
+ 4660 1b9c 01F0 breq .L343
+ 4661 1b9e 27E0 ldi r18,lo8(7)
+ 4662 1ba0 E216 cp r14,r18
+ 4663 1ba2 F104 cpc r15,__zero_reg__
+ 4664 1ba4 01F4 brne .L340
+ 4665 .L343:
+ 4666 .LM480:
+ 4667 1ba6 0E94 0000 call rand
+ 4668 1baa 63E0 ldi r22,lo8(3)
+ 4669 1bac 70E0 ldi r23,hi8(3)
+ 4670 1bae 0E94 0000 call __divmodhi4
+ 4671 .LM481:
+ 4672 1bb2 0097 sbiw r24,0
+ 4673 .LVL359:
+ 4674 1bb4 01F4 brne .L345
+ 4675 1bb6 CC24 clr r12
+ 4676 1bb8 DD24 clr r13
+ 4677 1bba 00C0 rjmp .L340
+ 4678 .L345:
+ 4679 .LM482:
+ 4680 1bbc 8130 cpi r24,1
+ 4681 1bbe 9105 cpc r25,__zero_reg__
+ 4682 1bc0 01F4 brne .L346
+ 4683 1bc2 8824 clr r8
+ 4684 1bc4 9924 clr r9
+ 4685 1bc6 00C0 rjmp .L340
+ 4686 .L346:
+ 4687 .LM483:
+ 4688 1bc8 8230 cpi r24,2
+ 4689 1bca 9105 cpc r25,__zero_reg__
+ 4690 1bcc 01F4 brne .L340
+ 4691 1bce AA24 clr r10
+ 4692 1bd0 BB24 clr r11
+ 4693 .L340:
+ 4694 .LM484:
+ 4695 1bd2 4C0C add r4,r12
+ 4696 1bd4 5D1C adc r5,r13
+ 4697 .LM485:
+ 4698 1bd6 680C add r6,r8
+ 4699 1bd8 791C adc r7,r9
+ 4700 .LM486:
+ 4701 1bda EA0C add r14,r10
+ 4702 1bdc FB1C adc r15,r11
+ 4703 .LM487:
+ 4704 1bde 31E0 ldi r19,lo8(1)
+ 4705 1be0 2316 cp r2,r19
+ 4706 1be2 01F4 brne .L347
+ 4707 .LM488:
+ 4708 1be4 C201 movw r24,r4
+ 4709 .LVL360:
+ 4710 1be6 B301 movw r22,r6
+ 4711 1be8 A701 movw r20,r14
+ 4712 1bea 0E94 0000 call setvoxel
+ 4713 .LM489:
+ 4714 1bee 8BA9 ldd r24,Y+51
+ 4715 1bf0 9CA9 ldd r25,Y+52
+ 4716 1bf2 0E94 0000 call delay_ms
+ 4717 .LM490:
+ 4718 1bf6 C201 movw r24,r4
+ 4719 1bf8 B301 movw r22,r6
+ 4720 1bfa A701 movw r20,r14
+ 4721 1bfc 0E94 0000 call clrvoxel
+ 4722 1c00 00C0 rjmp .L348
+ 4723 .LVL361:
+ 4724 .L347:
+ 4725 .LM491:
+ 4726 1c02 82E0 ldi r24,lo8(2)
+ 4727 .LVL362:
+ 4728 1c04 2816 cp r2,r24
+ 4729 1c06 01F4 brne .L349
+ 4730 .LM492:
+ 4731 1c08 C201 movw r24,r4
+ 4732 1c0a B301 movw r22,r6
+ 4733 1c0c A701 movw r20,r14
+ 4734 1c0e 0E94 0000 call flpvoxel
+ 4735 .LM493:
+ 4736 1c12 8BA9 ldd r24,Y+51
+ 4737 1c14 9CA9 ldd r25,Y+52
+ 4738 1c16 0E94 0000 call delay_ms
+ 4739 1c1a 00C0 rjmp .L348
+ 4740 .L349:
+ 4741 .LM494:
+ 4742 1c1c 93E0 ldi r25,lo8(3)
+ 4743 1c1e 2916 cp r2,r25
+ 4744 1c20 01F0 breq .+2
+ 4745 1c22 00C0 rjmp .L348
+ 4746 1c24 FE01 movw r30,r28
+ 4747 1c26 B596 adiw r30,37
+ 4748 .L350:
+ 4749 .LM495:
+ 4750 1c28 8081 ld r24,Z
+ 4751 1c2a 9181 ldd r25,Z+1
+ 4752 1c2c 9783 std Z+7,r25
+ 4753 1c2e 8683 std Z+6,r24
+ 4754 .LM496:
+ 4755 1c30 8281 ldd r24,Z+2
+ 4756 1c32 9381 ldd r25,Z+3
+ 4757 1c34 9187 std Z+9,r25
+ 4758 1c36 8087 std Z+8,r24
+ 4759 .LM497:
+ 4760 1c38 8481 ldd r24,Z+4
+ 4761 1c3a 9581 ldd r25,Z+5
+ 4762 1c3c 9387 std Z+11,r25
+ 4763 1c3e 8287 std Z+10,r24
+ 4764 1c40 3697 sbiw r30,6
+ 4765 .LM498:
+ 4766 1c42 2FA9 ldd r18,Y+55
+ 4767 1c44 38AD ldd r19,Y+56
+ 4768 1c46 E217 cp r30,r18
+ 4769 1c48 F307 cpc r31,r19
+ 4770 1c4a 01F4 brne .L350
+ 4771 .LM499:
+ 4772 1c4c 5A82 std Y+2,r5
+ 4773 1c4e 4982 std Y+1,r4
+ 4774 .LM500:
+ 4775 1c50 7C82 std Y+4,r7
+ 4776 1c52 6B82 std Y+3,r6
+ 4777 .LM501:
+ 4778 1c54 FE82 std Y+6,r15
+ 4779 1c56 ED82 std Y+5,r14
+ 4780 1c58 8E01 movw r16,r28
+ 4781 .LVL363:
+ 4782 1c5a 0F5F subi r16,lo8(-(1))
+ 4783 1c5c 1F4F sbci r17,hi8(-(1))
+ 4784 .L351:
+ 4785 .LM502:
+ 4786 1c5e F801 movw r30,r16
+ 4787 1c60 6281 ldd r22,Z+2
+ 4788 1c62 7381 ldd r23,Z+3
+ 4789 1c64 4481 ldd r20,Z+4
+ 4790 1c66 5581 ldd r21,Z+5
+ 4791 1c68 8081 ld r24,Z
+ 4792 1c6a 9181 ldd r25,Z+1
+ 4793 1c6c 0E94 0000 call setvoxel
+ 4794 1c70 0A5F subi r16,lo8(-(6))
+ 4795 1c72 1F4F sbci r17,hi8(-(6))
+ 4796 .LM503:
+ 4797 1c74 2DA9 ldd r18,Y+53
+ 4798 1c76 3EA9 ldd r19,Y+54
+ 4799 1c78 0217 cp r16,r18
+ 4800 1c7a 1307 cpc r17,r19
+ 4801 1c7c 01F4 brne .L351
+ 4802 .LM504:
+ 4803 1c7e 8BA9 ldd r24,Y+51
+ 4804 1c80 9CA9 ldd r25,Y+52
+ 4805 1c82 0E94 0000 call delay_ms
+ 4806 1c86 8E01 movw r16,r28
+ 4807 1c88 0F5F subi r16,lo8(-(1))
+ 4808 1c8a 1F4F sbci r17,hi8(-(1))
+ 4809 .L352:
+ 4810 .LM505:
+ 4811 1c8c F801 movw r30,r16
+ 4812 1c8e 6281 ldd r22,Z+2
+ 4813 1c90 7381 ldd r23,Z+3
+ 4814 1c92 4481 ldd r20,Z+4
+ 4815 1c94 5581 ldd r21,Z+5
+ 4816 1c96 8081 ld r24,Z
+ 4817 1c98 9181 ldd r25,Z+1
+ 4818 1c9a 0E94 0000 call clrvoxel
+ 4819 1c9e 0A5F subi r16,lo8(-(6))
+ 4820 1ca0 1F4F sbci r17,hi8(-(6))
+ 4821 .LM506:
+ 4822 1ca2 2DA9 ldd r18,Y+53
+ 4823 1ca4 3EA9 ldd r19,Y+54
+ 4824 1ca6 0217 cp r16,r18
+ 4825 1ca8 1307 cpc r17,r19
+ 4826 1caa 01F4 brne .L352
+ 4827 .LVL364:
+ 4828 .L348:
+ 4829 .LM507:
+ 4830 1cac 89A9 ldd r24,Y+49
+ 4831 1cae 9AA9 ldd r25,Y+50
+ 4832 1cb0 0197 sbiw r24,1
+ 4833 1cb2 9AAB std Y+50,r25
+ 4834 1cb4 89AB std Y+49,r24
+ 4835 .LVL365:
+ 4836 .L300:
+ 4837 .LM508:
+ 4838 1cb6 E9A9 ldd r30,Y+49
+ 4839 1cb8 FAA9 ldd r31,Y+50
+ 4840 1cba EF2B or r30,r31
+ 4841 1cbc 01F0 breq .+2
+ 4842 1cbe 00C0 rjmp .L353
+ 4843 1cc0 00C0 rjmp .L366
+ 4844 .L339:
+ 4845 .LM509:
+ 4846 1cc2 CC24 clr r12
+ 4847 1cc4 CA94 dec r12
+ 4848 1cc6 DC2C mov r13,r12
+ 4849 1cc8 00C0 rjmp .L340
+ 4850 .L366:
+ 4851 /* epilogue start */
+ 4852 1cca E896 adiw r28,56
+ 4853 1ccc 0FB6 in __tmp_reg__,__SREG__
+ 4854 1cce F894 cli
+ 4855 1cd0 DEBF out __SP_H__,r29
+ 4856 1cd2 0FBE out __SREG__,__tmp_reg__
+ 4857 1cd4 CDBF out __SP_L__,r28
+ 4858 1cd6 CF91 pop r28
+ 4859 1cd8 DF91 pop r29
+ 4860 1cda 1F91 pop r17
+ 4861 .LVL366:
+ 4862 1cdc 0F91 pop r16
+ 4863 .LVL367:
+ 4864 1cde FF90 pop r15
+ 4865 1ce0 EF90 pop r14
+ 4866 .LVL368:
+ 4867 1ce2 DF90 pop r13
+ 4868 1ce4 CF90 pop r12
+ 4869 .LVL369:
+ 4870 1ce6 BF90 pop r11
+ 4871 1ce8 AF90 pop r10
+ 4872 .LVL370:
+ 4873 1cea 9F90 pop r9
+ 4874 1cec 8F90 pop r8
+ 4875 .LVL371:
+ 4876 1cee 7F90 pop r7
+ 4877 1cf0 6F90 pop r6
+ 4878 .LVL372:
+ 4879 1cf2 5F90 pop r5
+ 4880 1cf4 4F90 pop r4
+ 4881 .LVL373:
+ 4882 1cf6 3F90 pop r3
+ 4883 .LVL374:
+ 4884 1cf8 2F90 pop r2
+ 4885 .LVL375:
+ 4886 1cfa 0895 ret
+ 4887 .LFE13:
+ 4889 .global sendplane_rand_z
+ 4891 sendplane_rand_z:
+ 4892 .LFB11:
+ 4893 .LM510:
+ 4894 .LVL376:
+ 4895 1cfc CF92 push r12
+ 4896 1cfe DF92 push r13
+ 4897 1d00 EF92 push r14
+ 4898 1d02 FF92 push r15
+ 4899 1d04 0F93 push r16
+ 4900 1d06 1F93 push r17
+ 4901 1d08 CF93 push r28
+ 4902 1d0a DF93 push r29
+ 4903 /* prologue: function */
+ 4904 /* frame size = 0 */
+ 4905 1d0c F82E mov r15,r24
+ 4906 1d0e 6B01 movw r12,r22
+ 4907 1d10 EA01 movw r28,r20
+ 4908 .LM511:
+ 4909 1d12 80E0 ldi r24,lo8(0)
+ 4910 .LVL377:
+ 4911 1d14 0E94 0000 call fill
+ 4912 .LVL378:
+ 4913 .LM512:
+ 4914 1d18 8F2D mov r24,r15
+ 4915 1d1a 90E0 ldi r25,lo8(0)
+ 4916 1d1c 0E94 0000 call setplane_z
+ 4917 1d20 10E1 ldi r17,lo8(16)
+ 4918 .LVL379:
+ 4919 .L372:
+ 4920 .LM513:
+ 4921 1d22 0E94 0000 call rand
+ 4922 1d26 64E0 ldi r22,lo8(4)
+ 4923 1d28 70E0 ldi r23,hi8(4)
+ 4924 1d2a 0E94 0000 call __divmodhi4
+ 4925 1d2e E82E mov r14,r24
+ 4926 .LM514:
+ 4927 1d30 0E94 0000 call rand
+ 4928 1d34 64E0 ldi r22,lo8(4)
+ 4929 1d36 70E0 ldi r23,hi8(4)
+ 4930 1d38 0E94 0000 call __divmodhi4
+ 4931 1d3c 082F mov r16,r24
+ 4932 .LM515:
+ 4933 1d3e 8E2D mov r24,r14
+ 4934 1d40 90E0 ldi r25,lo8(0)
+ 4935 1d42 602F mov r22,r16
+ 4936 1d44 70E0 ldi r23,lo8(0)
+ 4937 1d46 4F2D mov r20,r15
+ 4938 1d48 50E0 ldi r21,lo8(0)
+ 4939 1d4a 0E94 0000 call getvoxel
+ 4940 1d4e 8823 tst r24
+ 4941 1d50 01F0 breq .L372
+ 4942 .LM516:
+ 4943 1d52 8E2D mov r24,r14
+ 4944 1d54 602F mov r22,r16
+ 4945 1d56 4F2D mov r20,r15
+ 4946 1d58 9601 movw r18,r12
+ 4947 1d5a 0E94 0000 call sendvoxel_z
+ 4948 .LM517:
+ 4949 1d5e CE01 movw r24,r28
+ 4950 1d60 0E94 0000 call delay_ms
+ 4951 .LM518:
+ 4952 1d64 1150 subi r17,lo8(-(-1))
+ 4953 .LM519:
+ 4954 1d66 01F4 brne .L372
+ 4955 /* epilogue start */
+ 4956 .LM520:
+ 4957 1d68 DF91 pop r29
+ 4958 1d6a CF91 pop r28
+ 4959 .LVL380:
+ 4960 1d6c 1F91 pop r17
+ 4961 .LVL381:
+ 4962 1d6e 0F91 pop r16
+ 4963 1d70 FF90 pop r15
+ 4964 .LVL382:
+ 4965 1d72 EF90 pop r14
+ 4966 1d74 DF90 pop r13
+ 4967 1d76 CF90 pop r12
+ 4968 .LVL383:
+ 4969 1d78 0895 ret
+ 4970 .LFE11:
+ 4972 .global effect_box_woopwoop
+ 4974 effect_box_woopwoop:
+ 4975 .LFB9:
+ 4976 .LM521:
+ 4977 .LVL384:
+ 4978 1d7a AF92 push r10
+ 4979 1d7c BF92 push r11
+ 4980 1d7e CF92 push r12
+ 4981 1d80 DF92 push r13
+ 4982 1d82 EF92 push r14
+ 4983 1d84 FF92 push r15
+ 4984 1d86 0F93 push r16
+ 4985 1d88 1F93 push r17
+ 4986 1d8a CF93 push r28
+ 4987 1d8c DF93 push r29
+ 4988 /* prologue: function */
+ 4989 /* frame size = 0 */
+ 4990 1d8e 6C01 movw r12,r24
+ 4991 1d90 8B01 movw r16,r22
+ 4992 .LM522:
+ 4993 1d92 80E0 ldi r24,lo8(0)
+ 4994 .LVL385:
+ 4995 1d94 0E94 0000 call fill
+ 4996 .LVL386:
+ 4997 .LM523:
+ 4998 1d98 0130 cpi r16,1
+ 4999 1d9a 1105 cpc r17,__zero_reg__
+ 5000 1d9c 01F4 brne .L374
+ 5001 1d9e C3E0 ldi r28,lo8(3)
+ 5002 1da0 D0E0 ldi r29,hi8(3)
+ 5003 1da2 A7E0 ldi r26,lo8(7)
+ 5004 1da4 AA2E mov r10,r26
+ 5005 1da6 B12C mov r11,__zero_reg__
+ 5006 .L375:
+ 5007 1da8 A501 movw r20,r10
+ 5008 1daa 4C1B sub r20,r28
+ 5009 1dac 5D0B sbc r21,r29
+ 5010 .LM524:
+ 5011 1dae CA01 movw r24,r20
+ 5012 1db0 BA01 movw r22,r20
+ 5013 1db2 9E01 movw r18,r28
+ 5014 1db4 8E01 movw r16,r28
+ 5015 .LVL387:
+ 5016 1db6 7E01 movw r14,r28
+ 5017 1db8 0E94 0000 call box_wireframe
+ 5018 .LM525:
+ 5019 1dbc C601 movw r24,r12
+ 5020 1dbe 0E94 0000 call delay_ms
+ 5021 .LM526:
+ 5022 1dc2 80E0 ldi r24,lo8(0)
+ 5023 1dc4 0E94 0000 call fill
+ 5024 1dc8 2197 sbiw r28,1
+ 5025 .LM527:
+ 5026 1dca 8FEF ldi r24,hi8(-1)
+ 5027 1dcc CF3F cpi r28,lo8(-1)
+ 5028 1dce D807 cpc r29,r24
+ 5029 1dd0 01F4 brne .L375
+ 5030 1dd2 00C0 rjmp .L378
+ 5031 .LVL388:
+ 5032 .L374:
+ 5033 1dd4 C0E0 ldi r28,lo8(0)
+ 5034 1dd6 D0E0 ldi r29,hi8(0)
+ 5035 1dd8 F7E0 ldi r31,lo8(7)
+ 5036 1dda AF2E mov r10,r31
+ 5037 1ddc B12C mov r11,__zero_reg__
+ 5038 .L377:
+ 5039 1dde A501 movw r20,r10
+ 5040 1de0 4C1B sub r20,r28
+ 5041 1de2 5D0B sbc r21,r29
+ 5042 .LM528:
+ 5043 1de4 CA01 movw r24,r20
+ 5044 1de6 BA01 movw r22,r20
+ 5045 1de8 9E01 movw r18,r28
+ 5046 1dea 8E01 movw r16,r28
+ 5047 .LVL389:
+ 5048 1dec 7E01 movw r14,r28
+ 5049 1dee 0E94 0000 call box_wireframe
+ 5050 .LM529:
+ 5051 1df2 C601 movw r24,r12
+ 5052 1df4 0E94 0000 call delay_ms
+ 5053 .LM530:
+ 5054 1df8 80E0 ldi r24,lo8(0)
+ 5055 1dfa 0E94 0000 call fill
+ 5056 1dfe 2196 adiw r28,1
+ 5057 .LM531:
+ 5058 1e00 C430 cpi r28,4
+ 5059 1e02 D105 cpc r29,__zero_reg__
+ 5060 1e04 01F4 brne .L377
+ 5061 .L378:
+ 5062 /* epilogue start */
+ 5063 .LM532:
+ 5064 1e06 DF91 pop r29
+ 5065 1e08 CF91 pop r28
+ 5066 1e0a 1F91 pop r17
+ 5067 1e0c 0F91 pop r16
+ 5068 1e0e FF90 pop r15
+ 5069 1e10 EF90 pop r14
+ 5070 1e12 DF90 pop r13
+ 5071 1e14 CF90 pop r12
+ 5072 .LVL390:
+ 5073 1e16 BF90 pop r11
+ 5074 1e18 AF90 pop r10
+ 5075 1e1a 0895 ret
+ 5076 .LFE9:
+ 5078 .global effect_box_shrink_grow
+ 5080 effect_box_shrink_grow:
+ 5081 .LFB8:
+ 5082 .LM533:
+ 5083 .LVL391:
+ 5084 1e1c 2F92 push r2
+ 5085 1e1e 3F92 push r3
+ 5086 1e20 4F92 push r4
+ 5087 1e22 5F92 push r5
+ 5088 1e24 6F92 push r6
+ 5089 1e26 7F92 push r7
+ 5090 1e28 8F92 push r8
+ 5091 1e2a 9F92 push r9
+ 5092 1e2c AF92 push r10
+ 5093 1e2e BF92 push r11
+ 5094 1e30 CF92 push r12
+ 5095 1e32 DF92 push r13
+ 5096 1e34 EF92 push r14
+ 5097 1e36 FF92 push r15
+ 5098 1e38 0F93 push r16
+ 5099 1e3a 1F93 push r17
+ 5100 1e3c DF93 push r29
+ 5101 1e3e CF93 push r28
+ 5102 1e40 CDB7 in r28,__SP_L__
+ 5103 1e42 DEB7 in r29,__SP_H__
+ 5104 1e44 2C97 sbiw r28,12
+ 5105 1e46 0FB6 in __tmp_reg__,__SREG__
+ 5106 1e48 F894 cli
+ 5107 1e4a DEBF out __SP_H__,r29
+ 5108 1e4c 0FBE out __SREG__,__tmp_reg__
+ 5109 1e4e CDBF out __SP_L__,r28
+ 5110 /* prologue: function */
+ 5111 /* frame size = 12 */
+ 5112 1e50 9C83 std Y+4,r25
+ 5113 1e52 8B83 std Y+3,r24
+ 5114 1e54 7E83 std Y+6,r23
+ 5115 1e56 6D83 std Y+5,r22
+ 5116 1e58 5887 std Y+8,r21
+ 5117 1e5a 4F83 std Y+7,r20
+ 5118 1e5c 3A87 std Y+10,r19
+ 5119 1e5e 2987 std Y+9,r18
+ 5120 .LM534:
+ 5121 1e60 1A82 std Y+2,__zero_reg__
+ 5122 1e62 1982 std Y+1,__zero_reg__
+ 5123 .LVL392:
+ 5124 1e64 8824 clr r8
+ 5125 1e66 9924 clr r9
+ 5126 .LVL393:
+ 5127 1e68 AA24 clr r10
+ 5128 1e6a BB24 clr r11
+ 5129 .LVL394:
+ 5130 1e6c CC24 clr r12
+ 5131 1e6e DD24 clr r13
+ 5132 .LVL395:
+ 5133 1e70 2224 clr r2
+ 5134 1e72 3324 clr r3
+ 5135 .LVL396:
+ 5136 1e74 4424 clr r4
+ 5137 1e76 5524 clr r5
+ 5138 .LVL397:
+ 5139 1e78 6624 clr r6
+ 5140 1e7a 7724 clr r7
+ 5141 .LVL398:
+ 5142 1e7c 00C0 rjmp .L382
+ 5143 .LVL399:
+ 5144 .L409:
+ 5145 .LM535:
+ 5146 1e7e 1C86 std Y+12,__zero_reg__
+ 5147 1e80 1B86 std Y+11,__zero_reg__
+ 5148 .L395:
+ 5149 1e82 87E0 ldi r24,lo8(7)
+ 5150 1e84 90E0 ldi r25,hi8(7)
+ 5151 .LVL400:
+ 5152 1e86 2B85 ldd r18,Y+11
+ 5153 1e88 3C85 ldd r19,Y+12
+ 5154 1e8a 821B sub r24,r18
+ 5155 1e8c 930B sbc r25,r19
+ 5156 .LM536:
+ 5157 1e8e EF81 ldd r30,Y+7
+ 5158 1e90 F885 ldd r31,Y+8
+ 5159 1e92 3097 sbiw r30,0
+ 5160 1e94 01F4 brne .+2
+ 5161 1e96 00C0 rjmp .L383
+ 5162 .LM537:
+ 5163 1e98 3197 sbiw r30,1
+ 5164 1e9a 01F4 brne .L384
+ 5165 1e9c 6901 movw r12,r18
+ 5166 1e9e 47E0 ldi r20,lo8(7)
+ 5167 1ea0 642E mov r6,r20
+ 5168 1ea2 712C mov r7,__zero_reg__
+ 5169 1ea4 00C0 rjmp .L385
+ 5170 .LVL401:
+ 5171 .L384:
+ 5172 .LM538:
+ 5173 1ea6 2F81 ldd r18,Y+7
+ 5174 1ea8 3885 ldd r19,Y+8
+ 5175 1eaa 2230 cpi r18,2
+ 5176 1eac 3105 cpc r19,__zero_reg__
+ 5177 1eae 01F4 brne .L386
+ 5178 1eb0 4B84 ldd r4,Y+11
+ 5179 1eb2 5C84 ldd r5,Y+12
+ 5180 1eb4 1C01 movw r2,r24
+ 5181 1eb6 3C01 movw r6,r24
+ 5182 1eb8 8824 clr r8
+ 5183 1eba 9924 clr r9
+ 5184 1ebc 37E0 ldi r19,lo8(7)
+ 5185 1ebe A32E mov r10,r19
+ 5186 1ec0 B12C mov r11,__zero_reg__
+ 5187 1ec2 CC24 clr r12
+ 5188 1ec4 DD24 clr r13
+ 5189 1ec6 00C0 rjmp .L387
+ 5190 .LVL402:
+ 5191 .L386:
+ 5192 .LM539:
+ 5193 1ec8 EF81 ldd r30,Y+7
+ 5194 1eca F885 ldd r31,Y+8
+ 5195 1ecc 3397 sbiw r30,3
+ 5196 1ece 01F4 brne .L388
+ 5197 1ed0 4B84 ldd r4,Y+11
+ 5198 1ed2 5C84 ldd r5,Y+12
+ 5199 1ed4 1C01 movw r2,r24
+ 5200 1ed6 3201 movw r6,r4
+ 5201 1ed8 8824 clr r8
+ 5202 1eda 9924 clr r9
+ 5203 1edc 27E0 ldi r18,lo8(7)
+ 5204 1ede A22E mov r10,r18
+ 5205 1ee0 B12C mov r11,__zero_reg__
+ 5206 1ee2 97E0 ldi r25,lo8(7)
+ 5207 1ee4 C92E mov r12,r25
+ 5208 1ee6 D12C mov r13,__zero_reg__
+ 5209 1ee8 00C0 rjmp .L389
+ 5210 .LVL403:
+ 5211 .L388:
+ 5212 .LM540:
+ 5213 1eea 2F81 ldd r18,Y+7
+ 5214 1eec 3885 ldd r19,Y+8
+ 5215 1eee 2430 cpi r18,4
+ 5216 1ef0 3105 cpc r19,__zero_reg__
+ 5217 1ef2 01F4 brne .L390
+ 5218 1ef4 2B84 ldd r2,Y+11
+ 5219 1ef6 3C84 ldd r3,Y+12
+ 5220 1ef8 2C01 movw r4,r24
+ 5221 1efa 3C01 movw r6,r24
+ 5222 1efc 87E0 ldi r24,lo8(7)
+ 5223 1efe 882E mov r8,r24
+ 5224 1f00 912C mov r9,__zero_reg__
+ 5225 .LVL404:
+ 5226 1f02 AA24 clr r10
+ 5227 1f04 BB24 clr r11
+ 5228 1f06 00C0 rjmp .L415
+ 5229 .LVL405:
+ 5230 .L390:
+ 5231 .LM541:
+ 5232 1f08 EF81 ldd r30,Y+7
+ 5233 1f0a F885 ldd r31,Y+8
+ 5234 1f0c 3597 sbiw r30,5
+ 5235 1f0e 01F4 brne .L387
+ 5236 1f10 2B84 ldd r2,Y+11
+ 5237 1f12 3C84 ldd r3,Y+12
+ 5238 1f14 2C01 movw r4,r24
+ 5239 1f16 3101 movw r6,r2
+ 5240 1f18 07E0 ldi r16,lo8(7)
+ 5241 1f1a 802E mov r8,r16
+ 5242 1f1c 912C mov r9,__zero_reg__
+ 5243 1f1e AA24 clr r10
+ 5244 1f20 BB24 clr r11
+ 5245 1f22 00C0 rjmp .L414
+ 5246 .LVL406:
+ 5247 .L387:
+ 5248 .LM542:
+ 5249 1f24 2F81 ldd r18,Y+7
+ 5250 1f26 3885 ldd r19,Y+8
+ 5251 1f28 2630 cpi r18,6
+ 5252 1f2a 3105 cpc r19,__zero_reg__
+ 5253 1f2c 01F4 brne .L389
+ 5254 1f2e 2B84 ldd r2,Y+11
+ 5255 1f30 3C84 ldd r3,Y+12
+ 5256 1f32 2101 movw r4,r2
+ 5257 1f34 3C01 movw r6,r24
+ 5258 1f36 17E0 ldi r17,lo8(7)
+ 5259 1f38 812E mov r8,r17
+ 5260 1f3a 912C mov r9,__zero_reg__
+ 5261 1f3c B7E0 ldi r27,lo8(7)
+ 5262 1f3e AB2E mov r10,r27
+ 5263 1f40 B12C mov r11,__zero_reg__
+ 5264 .L415:
+ 5265 1f42 CC24 clr r12
+ 5266 1f44 DD24 clr r13
+ 5267 1f46 00C0 rjmp .L391
+ 5268 .LVL407:
+ 5269 .L389:
+ 5270 .LM543:
+ 5271 1f48 8F81 ldd r24,Y+7
+ 5272 1f4a 9885 ldd r25,Y+8
+ 5273 .LVL408:
+ 5274 1f4c 0797 sbiw r24,7
+ 5275 1f4e 01F4 brne .L391
+ 5276 1f50 2B84 ldd r2,Y+11
+ 5277 1f52 3C84 ldd r3,Y+12
+ 5278 1f54 2101 movw r4,r2
+ 5279 1f56 3101 movw r6,r2
+ 5280 1f58 A7E0 ldi r26,lo8(7)
+ 5281 1f5a 8A2E mov r8,r26
+ 5282 1f5c 912C mov r9,__zero_reg__
+ 5283 1f5e F7E0 ldi r31,lo8(7)
+ 5284 1f60 AF2E mov r10,r31
+ 5285 1f62 B12C mov r11,__zero_reg__
+ 5286 .LVL409:
+ 5287 .L414:
+ 5288 1f64 E7E0 ldi r30,lo8(7)
+ 5289 1f66 CE2E mov r12,r30
+ 5290 1f68 D12C mov r13,__zero_reg__
+ 5291 .L391:
+ 5292 .LM544:
+ 5293 1f6a ED81 ldd r30,Y+5
+ 5294 1f6c FE81 ldd r31,Y+6
+ 5295 1f6e 3397 sbiw r30,3
+ 5296 1f70 01F4 brne .L392
+ 5297 .LM545:
+ 5298 1f72 C401 movw r24,r8
+ 5299 .LVL410:
+ 5300 1f74 B501 movw r22,r10
+ 5301 1f76 A601 movw r20,r12
+ 5302 1f78 9101 movw r18,r2
+ 5303 1f7a 8201 movw r16,r4
+ 5304 1f7c 7301 movw r14,r6
+ 5305 1f7e 0E94 0000 call box_filled
+ 5306 1f82 00C0 rjmp .L393
+ 5307 .LVL411:
+ 5308 .L392:
+ 5309 .LM546:
+ 5310 1f84 2D81 ldd r18,Y+5
+ 5311 1f86 3E81 ldd r19,Y+6
+ 5312 1f88 2230 cpi r18,2
+ 5313 1f8a 3105 cpc r19,__zero_reg__
+ 5314 1f8c 01F4 brne .L394
+ 5315 .LM547:
+ 5316 1f8e C401 movw r24,r8
+ 5317 .LVL412:
+ 5318 1f90 B501 movw r22,r10
+ 5319 1f92 A601 movw r20,r12
+ 5320 1f94 9101 movw r18,r2
+ 5321 1f96 8201 movw r16,r4
+ 5322 1f98 7301 movw r14,r6
+ 5323 1f9a 0E94 0000 call box_walls
+ 5324 1f9e 00C0 rjmp .L393
+ 5325 .LVL413:
+ 5326 .L394:
+ 5327 .LM548:
+ 5328 1fa0 C401 movw r24,r8
+ 5329 .LVL414:
+ 5330 1fa2 B501 movw r22,r10
+ 5331 1fa4 A601 movw r20,r12
+ 5332 1fa6 9101 movw r18,r2
+ 5333 1fa8 8201 movw r16,r4
+ 5334 1faa 7301 movw r14,r6
+ 5335 1fac 0E94 0000 call box_wireframe
+ 5336 .L393:
+ 5337 .LM549:
+ 5338 1fb0 8985 ldd r24,Y+9
+ 5339 1fb2 9A85 ldd r25,Y+10
+ 5340 1fb4 0E94 0000 call delay_ms
+ 5341 .LM550:
+ 5342 1fb8 80E0 ldi r24,lo8(0)
+ 5343 1fba 0E94 0000 call fill
+ 5344 1fbe 8B85 ldd r24,Y+11
+ 5345 1fc0 9C85 ldd r25,Y+12
+ 5346 1fc2 0196 adiw r24,1
+ 5347 1fc4 9C87 std Y+12,r25
+ 5348 1fc6 8B87 std Y+11,r24
+ 5349 .LM551:
+ 5350 1fc8 0897 sbiw r24,8
+ 5351 1fca 01F0 breq .+2
+ 5352 1fcc 00C0 rjmp .L395
+ 5353 1fce E7E0 ldi r30,lo8(7)
+ 5354 1fd0 F0E0 ldi r31,hi8(7)
+ 5355 1fd2 FC87 std Y+12,r31
+ 5356 1fd4 EB87 std Y+11,r30
+ 5357 .L408:
+ 5358 1fd6 87E0 ldi r24,lo8(7)
+ 5359 1fd8 90E0 ldi r25,hi8(7)
+ 5360 .LVL415:
+ 5361 1fda 2B85 ldd r18,Y+11
+ 5362 1fdc 3C85 ldd r19,Y+12
+ 5363 1fde 821B sub r24,r18
+ 5364 1fe0 930B sbc r25,r19
+ 5365 .LM552:
+ 5366 1fe2 EF81 ldd r30,Y+7
+ 5367 1fe4 F885 ldd r31,Y+8
+ 5368 1fe6 3097 sbiw r30,0
+ 5369 1fe8 01F4 brne .+2
+ 5370 1fea 00C0 rjmp .L396
+ 5371 .LM553:
+ 5372 1fec 3197 sbiw r30,1
+ 5373 1fee 01F4 brne .L397
+ 5374 1ff0 6901 movw r12,r18
+ 5375 1ff2 77E0 ldi r23,lo8(7)
+ 5376 1ff4 672E mov r6,r23
+ 5377 1ff6 712C mov r7,__zero_reg__
+ 5378 1ff8 00C0 rjmp .L398
+ 5379 .L397:
+ 5380 .LM554:
+ 5381 1ffa 2F81 ldd r18,Y+7
+ 5382 1ffc 3885 ldd r19,Y+8
+ 5383 1ffe 2230 cpi r18,2
+ 5384 2000 3105 cpc r19,__zero_reg__
+ 5385 2002 01F4 brne .L399
+ 5386 2004 4B84 ldd r4,Y+11
+ 5387 2006 5C84 ldd r5,Y+12
+ 5388 2008 1C01 movw r2,r24
+ 5389 200a 3C01 movw r6,r24
+ 5390 200c 8824 clr r8
+ 5391 200e 9924 clr r9
+ 5392 2010 67E0 ldi r22,lo8(7)
+ 5393 2012 A62E mov r10,r22
+ 5394 2014 B12C mov r11,__zero_reg__
+ 5395 2016 CC24 clr r12
+ 5396 2018 DD24 clr r13
+ 5397 201a 00C0 rjmp .L400
+ 5398 .LVL416:
+ 5399 .L399:
+ 5400 .LM555:
+ 5401 201c EF81 ldd r30,Y+7
+ 5402 201e F885 ldd r31,Y+8
+ 5403 2020 3397 sbiw r30,3
+ 5404 2022 01F4 brne .L401
+ 5405 2024 4B84 ldd r4,Y+11
+ 5406 2026 5C84 ldd r5,Y+12
+ 5407 2028 1C01 movw r2,r24
+ 5408 202a 3201 movw r6,r4
+ 5409 202c 8824 clr r8
+ 5410 202e 9924 clr r9
+ 5411 2030 57E0 ldi r21,lo8(7)
+ 5412 2032 A52E mov r10,r21
+ 5413 2034 B12C mov r11,__zero_reg__
+ 5414 2036 47E0 ldi r20,lo8(7)
+ 5415 2038 C42E mov r12,r20
+ 5416 203a D12C mov r13,__zero_reg__
+ 5417 203c 00C0 rjmp .L402
+ 5418 .LVL417:
+ 5419 .L401:
+ 5420 .LM556:
+ 5421 203e 2F81 ldd r18,Y+7
+ 5422 2040 3885 ldd r19,Y+8
+ 5423 2042 2430 cpi r18,4
+ 5424 2044 3105 cpc r19,__zero_reg__
+ 5425 2046 01F4 brne .L403
+ 5426 2048 2B84 ldd r2,Y+11
+ 5427 204a 3C84 ldd r3,Y+12
+ 5428 204c 2C01 movw r4,r24
+ 5429 204e 3C01 movw r6,r24
+ 5430 2050 37E0 ldi r19,lo8(7)
+ 5431 2052 832E mov r8,r19
+ 5432 2054 912C mov r9,__zero_reg__
+ 5433 2056 AA24 clr r10
+ 5434 2058 BB24 clr r11
+ 5435 205a 00C0 rjmp .L417
+ 5436 .LVL418:
+ 5437 .L403:
+ 5438 .LM557:
+ 5439 205c EF81 ldd r30,Y+7
+ 5440 205e F885 ldd r31,Y+8
+ 5441 2060 3597 sbiw r30,5
+ 5442 2062 01F4 brne .L400
+ 5443 2064 2B84 ldd r2,Y+11
+ 5444 2066 3C84 ldd r3,Y+12
+ 5445 2068 2C01 movw r4,r24
+ 5446 206a 3101 movw r6,r2
+ 5447 206c 27E0 ldi r18,lo8(7)
+ 5448 206e 822E mov r8,r18
+ 5449 2070 912C mov r9,__zero_reg__
+ 5450 2072 AA24 clr r10
+ 5451 2074 BB24 clr r11
+ 5452 2076 00C0 rjmp .L416
+ 5453 .LVL419:
+ 5454 .L400:
+ 5455 .LM558:
+ 5456 2078 2F81 ldd r18,Y+7
+ 5457 207a 3885 ldd r19,Y+8
+ 5458 207c 2630 cpi r18,6
+ 5459 207e 3105 cpc r19,__zero_reg__
+ 5460 2080 01F4 brne .L402
+ 5461 2082 2B84 ldd r2,Y+11
+ 5462 2084 3C84 ldd r3,Y+12
+ 5463 2086 2101 movw r4,r2
+ 5464 2088 3C01 movw r6,r24
+ 5465 208a 97E0 ldi r25,lo8(7)
+ 5466 208c 892E mov r8,r25
+ 5467 208e 912C mov r9,__zero_reg__
+ 5468 2090 87E0 ldi r24,lo8(7)
+ 5469 2092 A82E mov r10,r24
+ 5470 2094 B12C mov r11,__zero_reg__
+ 5471 .LVL420:
+ 5472 .L417:
+ 5473 2096 CC24 clr r12
+ 5474 2098 DD24 clr r13
+ 5475 209a 00C0 rjmp .L404
+ 5476 .LVL421:
+ 5477 .L402:
+ 5478 .LM559:
+ 5479 209c 8F81 ldd r24,Y+7
+ 5480 209e 9885 ldd r25,Y+8
+ 5481 .LVL422:
+ 5482 20a0 0797 sbiw r24,7
+ 5483 20a2 01F4 brne .L404
+ 5484 20a4 2B84 ldd r2,Y+11
+ 5485 20a6 3C84 ldd r3,Y+12
+ 5486 20a8 2101 movw r4,r2
+ 5487 20aa 3101 movw r6,r2
+ 5488 20ac 07E0 ldi r16,lo8(7)
+ 5489 20ae 802E mov r8,r16
+ 5490 20b0 912C mov r9,__zero_reg__
+ 5491 20b2 17E0 ldi r17,lo8(7)
+ 5492 20b4 A12E mov r10,r17
+ 5493 20b6 B12C mov r11,__zero_reg__
+ 5494 .LVL423:
+ 5495 .L416:
+ 5496 20b8 B7E0 ldi r27,lo8(7)
+ 5497 20ba CB2E mov r12,r27
+ 5498 20bc D12C mov r13,__zero_reg__
+ 5499 .LVL424:
+ 5500 .L404:
+ 5501 .LM560:
+ 5502 20be ED81 ldd r30,Y+5
+ 5503 20c0 FE81 ldd r31,Y+6
+ 5504 20c2 3397 sbiw r30,3
+ 5505 20c4 01F4 brne .L405
+ 5506 .LM561:
+ 5507 20c6 C401 movw r24,r8
+ 5508 .LVL425:
+ 5509 20c8 B501 movw r22,r10
+ 5510 20ca A601 movw r20,r12
+ 5511 20cc 9101 movw r18,r2
+ 5512 20ce 8201 movw r16,r4
+ 5513 20d0 7301 movw r14,r6
+ 5514 20d2 0E94 0000 call box_filled
+ 5515 20d6 00C0 rjmp .L406
+ 5516 .LVL426:
+ 5517 .L405:
+ 5518 .LM562:
+ 5519 20d8 2D81 ldd r18,Y+5
+ 5520 20da 3E81 ldd r19,Y+6
+ 5521 20dc 2230 cpi r18,2
+ 5522 20de 3105 cpc r19,__zero_reg__
+ 5523 20e0 01F4 brne .L407
+ 5524 .LM563:
+ 5525 20e2 C401 movw r24,r8
+ 5526 .LVL427:
+ 5527 20e4 B501 movw r22,r10
+ 5528 20e6 A601 movw r20,r12
+ 5529 20e8 9101 movw r18,r2
+ 5530 20ea 8201 movw r16,r4
+ 5531 20ec 7301 movw r14,r6
+ 5532 20ee 0E94 0000 call box_walls
+ 5533 20f2 00C0 rjmp .L406
+ 5534 .LVL428:
+ 5535 .L407:
+ 5536 .LM564:
+ 5537 20f4 C401 movw r24,r8
+ 5538 .LVL429:
+ 5539 20f6 B501 movw r22,r10
+ 5540 20f8 A601 movw r20,r12
+ 5541 20fa 9101 movw r18,r2
+ 5542 20fc 8201 movw r16,r4
+ 5543 20fe 7301 movw r14,r6
+ 5544 2100 0E94 0000 call box_wireframe
+ 5545 .L406:
+ 5546 .LM565:
+ 5547 2104 8985 ldd r24,Y+9
+ 5548 2106 9A85 ldd r25,Y+10
+ 5549 2108 0E94 0000 call delay_ms
+ 5550 .LM566:
+ 5551 210c 80E0 ldi r24,lo8(0)
+ 5552 210e 0E94 0000 call fill
+ 5553 2112 8B85 ldd r24,Y+11
+ 5554 2114 9C85 ldd r25,Y+12
+ 5555 2116 0197 sbiw r24,1
+ 5556 2118 9C87 std Y+12,r25
+ 5557 211a 8B87 std Y+11,r24
+ 5558 .LM567:
+ 5559 211c 8F5F subi r24,lo8(-1)
+ 5560 211e 9F4F sbci r25,hi8(-1)
+ 5561 2120 01F0 breq .+2
+ 5562 2122 00C0 rjmp .L408
+ 5563 .LM568:
+ 5564 2124 2981 ldd r18,Y+1
+ 5565 2126 3A81 ldd r19,Y+2
+ 5566 2128 2F5F subi r18,lo8(-(1))
+ 5567 212a 3F4F sbci r19,hi8(-(1))
+ 5568 212c 3A83 std Y+2,r19
+ 5569 212e 2983 std Y+1,r18
+ 5570 .LVL430:
+ 5571 .L382:
+ 5572 2130 8981 ldd r24,Y+1
+ 5573 2132 9A81 ldd r25,Y+2
+ 5574 2134 EB81 ldd r30,Y+3
+ 5575 2136 FC81 ldd r31,Y+4
+ 5576 2138 8E17 cp r24,r30
+ 5577 213a 9F07 cpc r25,r31
+ 5578 213c 04F4 brge .+2
+ 5579 213e 00C0 rjmp .L409
+ 5580 2140 00C0 rjmp .L418
+ 5581 .LVL431:
+ 5582 .L383:
+ 5583 .LM569:
+ 5584 2142 3C01 movw r6,r24
+ 5585 2144 CC24 clr r12
+ 5586 2146 DD24 clr r13
+ 5587 .L385:
+ 5588 2148 1C01 movw r2,r24
+ 5589 214a 2C01 movw r4,r24
+ 5590 214c 8824 clr r8
+ 5591 214e 9924 clr r9
+ 5592 2150 AA24 clr r10
+ 5593 2152 BB24 clr r11
+ 5594 2154 00C0 rjmp .L390
+ 5595 .LVL432:
+ 5596 .L396:
+ 5597 2156 3C01 movw r6,r24
+ 5598 2158 CC24 clr r12
+ 5599 215a DD24 clr r13
+ 5600 .L398:
+ 5601 215c 1C01 movw r2,r24
+ 5602 215e 2C01 movw r4,r24
+ 5603 2160 8824 clr r8
+ 5604 2162 9924 clr r9
+ 5605 2164 AA24 clr r10
+ 5606 2166 BB24 clr r11
+ 5607 2168 00C0 rjmp .L403
+ 5608 .LVL433:
+ 5609 .L418:
+ 5610 /* epilogue start */
+ 5611 216a 2C96 adiw r28,12
+ 5612 216c 0FB6 in __tmp_reg__,__SREG__
+ 5613 216e F894 cli
+ 5614 2170 DEBF out __SP_H__,r29
+ 5615 2172 0FBE out __SREG__,__tmp_reg__
+ 5616 2174 CDBF out __SP_L__,r28
+ 5617 2176 CF91 pop r28
+ 5618 2178 DF91 pop r29
+ 5619 217a 1F91 pop r17
+ 5620 217c 0F91 pop r16
+ 5621 217e FF90 pop r15
+ 5622 2180 EF90 pop r14
+ 5623 2182 DF90 pop r13
+ 5624 2184 CF90 pop r12
+ 5625 .LVL434:
+ 5626 2186 BF90 pop r11
+ 5627 2188 AF90 pop r10
+ 5628 .LVL435:
+ 5629 218a 9F90 pop r9
+ 5630 218c 8F90 pop r8
+ 5631 .LVL436:
+ 5632 218e 7F90 pop r7
+ 5633 2190 6F90 pop r6
+ 5634 .LVL437:
+ 5635 2192 5F90 pop r5
+ 5636 2194 4F90 pop r4
+ 5637 .LVL438:
+ 5638 2196 3F90 pop r3
+ 5639 2198 2F90 pop r2
+ 5640 .LVL439:
+ 5641 219a 0895 ret
+ 5642 .LFE8:
+ 5644 .global effect_planboing
+ 5646 effect_planboing:
+ 5647 .LFB6:
+ 5648 .LM570:
+ 5649 .LVL440:
+ 5650 219c EF92 push r14
+ 5651 219e FF92 push r15
+ 5652 21a0 0F93 push r16
+ 5653 21a2 1F93 push r17
+ 5654 21a4 CF93 push r28
+ 5655 21a6 DF93 push r29
+ 5656 /* prologue: function */
+ 5657 /* frame size = 0 */
+ 5658 21a8 8C01 movw r16,r24
+ 5659 21aa 7B01 movw r14,r22
+ 5660 .LVL441:
+ 5661 .LM571:
+ 5662 21ac C0E0 ldi r28,lo8(0)
+ 5663 21ae D0E0 ldi r29,hi8(0)
+ 5664 .LVL442:
+ 5665 .L423:
+ 5666 .LM572:
+ 5667 21b0 80E0 ldi r24,lo8(0)
+ 5668 21b2 0E94 0000 call fill
+ 5669 .LM573:
+ 5670 21b6 0A37 cpi r16,122
+ 5671 21b8 1105 cpc r17,__zero_reg__
+ 5672 21ba 01F4 brne .L420
+ 5673 .LM574:
+ 5674 21bc CE01 movw r24,r28
+ 5675 21be 0E94 0000 call setplane_z
+ 5676 21c2 00C0 rjmp .L421
+ 5677 .L420:
+ 5678 .LM575:
+ 5679 21c4 0837 cpi r16,120
+ 5680 21c6 1105 cpc r17,__zero_reg__
+ 5681 21c8 01F4 brne .L422
+ 5682 .LM576:
+ 5683 21ca CE01 movw r24,r28
+ 5684 21cc 0E94 0000 call setplane_x
+ 5685 21d0 00C0 rjmp .L421
+ 5686 .L422:
+ 5687 .LM577:
+ 5688 21d2 0937 cpi r16,121
+ 5689 21d4 1105 cpc r17,__zero_reg__
+ 5690 21d6 01F4 brne .L421
+ 5691 .LM578:
+ 5692 21d8 CE01 movw r24,r28
+ 5693 21da 0E94 0000 call setplane_y
+ 5694 .L421:
+ 5695 .LM579:
+ 5696 21de C701 movw r24,r14
+ 5697 21e0 0E94 0000 call delay_ms
+ 5698 .LM580:
+ 5699 21e4 2196 adiw r28,1
+ 5700 21e6 C830 cpi r28,8
+ 5701 21e8 D105 cpc r29,__zero_reg__
+ 5702 21ea 01F4 brne .L423
+ 5703 21ec C7E0 ldi r28,lo8(7)
+ 5704 21ee D0E0 ldi r29,hi8(7)
+ 5705 .LVL443:
+ 5706 .L427:
+ 5707 .LM581:
+ 5708 21f0 80E0 ldi r24,lo8(0)
+ 5709 21f2 0E94 0000 call fill
+ 5710 .LM582:
+ 5711 21f6 0A37 cpi r16,122
+ 5712 21f8 1105 cpc r17,__zero_reg__
+ 5713 21fa 01F4 brne .L424
+ 5714 .LM583:
+ 5715 21fc CE01 movw r24,r28
+ 5716 21fe 0E94 0000 call setplane_z
+ 5717 2202 00C0 rjmp .L425
+ 5718 .L424:
+ 5719 .LM584:
+ 5720 2204 0837 cpi r16,120
+ 5721 2206 1105 cpc r17,__zero_reg__
+ 5722 2208 01F4 brne .L426
+ 5723 .LM585:
+ 5724 220a CE01 movw r24,r28
+ 5725 220c 0E94 0000 call setplane_x
+ 5726 2210 00C0 rjmp .L425
+ 5727 .L426:
+ 5728 .LM586:
+ 5729 2212 0937 cpi r16,121
+ 5730 2214 1105 cpc r17,__zero_reg__
+ 5731 2216 01F4 brne .L425
+ 5732 .LM587:
+ 5733 2218 CE01 movw r24,r28
+ 5734 221a 0E94 0000 call setplane_y
+ 5735 .L425:
+ 5736 .LM588:
+ 5737 221e C701 movw r24,r14
+ 5738 2220 0E94 0000 call delay_ms
+ 5739 .LM589:
+ 5740 2224 2197 sbiw r28,1
+ 5741 2226 8FEF ldi r24,hi8(-1)
+ 5742 2228 CF3F cpi r28,lo8(-1)
+ 5743 222a D807 cpc r29,r24
+ 5744 222c 01F4 brne .L427
+ 5745 /* epilogue start */
+ 5746 .LM590:
+ 5747 222e DF91 pop r29
+ 5748 2230 CF91 pop r28
+ 5749 .LVL444:
+ 5750 2232 1F91 pop r17
+ 5751 2234 0F91 pop r16
+ 5752 .LVL445:
+ 5753 2236 FF90 pop r15
+ 5754 2238 EF90 pop r14
+ 5755 223a 0895 ret
+ 5756 .LFE6:
+ 5758 .global effect_test
+ 5760 effect_test:
+ 5761 .LFB4:
+ 5762 .LM591:
+ 5763 223c AF92 push r10
+ 5764 223e BF92 push r11
+ 5765 2240 CF92 push r12
+ 5766 2242 DF92 push r13
+ 5767 2244 EF92 push r14
+ 5768 2246 FF92 push r15
+ 5769 2248 0F93 push r16
+ 5770 224a 1F93 push r17
+ 5771 224c CF93 push r28
+ 5772 224e DF93 push r29
+ 5773 /* prologue: function */
+ 5774 /* frame size = 0 */
+ 5775 .LM592:
+ 5776 2250 C0E0 ldi r28,lo8(0)
+ 5777 2252 D0E0 ldi r29,hi8(0)
+ 5778 .LVL446:
+ 5779 .L432:
+ 5780 .LM593:
+ 5781 2254 BE01 movw r22,r28
+ 5782 2256 53E0 ldi r21,3
+ 5783 2258 7595 1: asr r23
+ 5784 225a 6795 ror r22
+ 5785 225c 5A95 dec r21
+ 5786 225e 01F4 brne 1b
+ 5787 2260 8827 clr r24
+ 5788 2262 77FD sbrc r23,7
+ 5789 2264 8095 com r24
+ 5790 2266 982F mov r25,r24
+ 5791 2268 0E94 0000 call __floatsisf
+ 5792 226c 7B01 movw r14,r22
+ 5793 226e 8C01 movw r16,r24
+ 5794 2270 0E94 0000 call sin
+ 5795 2274 9B01 movw r18,r22
+ 5796 2276 AC01 movw r20,r24
+ 5797 2278 0E94 0000 call __addsf3
+ 5798 227c 20E0 ldi r18,lo8(0x40600000)
+ 5799 227e 30E0 ldi r19,hi8(0x40600000)
+ 5800 2280 40E6 ldi r20,hlo8(0x40600000)
+ 5801 2282 50E4 ldi r21,hhi8(0x40600000)
+ 5802 2284 0E94 0000 call __addsf3
+ 5803 2288 0E94 0000 call __fixsfsi
+ 5804 228c 5B01 movw r10,r22
+ 5805 228e 6C01 movw r12,r24
+ 5806 .LM594:
+ 5807 2290 C801 movw r24,r16
+ 5808 2292 B701 movw r22,r14
+ 5809 2294 0E94 0000 call cos
+ 5810 2298 9B01 movw r18,r22
+ 5811 229a AC01 movw r20,r24
+ 5812 229c 0E94 0000 call __addsf3
+ 5813 22a0 20E0 ldi r18,lo8(0x40600000)
+ 5814 22a2 30E0 ldi r19,hi8(0x40600000)
+ 5815 22a4 40E6 ldi r20,hlo8(0x40600000)
+ 5816 22a6 50E4 ldi r21,hhi8(0x40600000)
+ 5817 22a8 0E94 0000 call __addsf3
+ 5818 22ac 0E94 0000 call __fixsfsi
+ 5819 22b0 7B01 movw r14,r22
+ 5820 22b2 8C01 movw r16,r24
+ 5821 .LM595:
+ 5822 22b4 C501 movw r24,r10
+ 5823 22b6 B701 movw r22,r14
+ 5824 22b8 41E0 ldi r20,lo8(1)
+ 5825 22ba 50E0 ldi r21,hi8(1)
+ 5826 22bc 0E94 0000 call setvoxel
+ 5827 .LM596:
+ 5828 22c0 C501 movw r24,r10
+ 5829 22c2 B701 movw r22,r14
+ 5830 22c4 41E0 ldi r20,lo8(1)
+ 5831 22c6 50E0 ldi r21,hi8(1)
+ 5832 22c8 0E94 0000 call setvoxel
+ 5833 .LM597:
+ 5834 22cc 88EE ldi r24,lo8(1000)
+ 5835 22ce 93E0 ldi r25,hi8(1000)
+ 5836 22d0 0E94 0000 call delay_ms
+ 5837 .LM598:
+ 5838 22d4 80E0 ldi r24,lo8(0)
+ 5839 22d6 0E94 0000 call fill
+ 5840 .LM599:
+ 5841 22da 2196 adiw r28,1
+ 5842 22dc 83E0 ldi r24,hi8(1000)
+ 5843 22de C83E cpi r28,lo8(1000)
+ 5844 22e0 D807 cpc r29,r24
+ 5845 22e2 01F0 breq .+2
+ 5846 22e4 00C0 rjmp .L432
+ 5847 /* epilogue start */
+ 5848 .LM600:
+ 5849 22e6 DF91 pop r29
+ 5850 22e8 CF91 pop r28
+ 5851 .LVL447:
+ 5852 22ea 1F91 pop r17
+ 5853 22ec 0F91 pop r16
+ 5854 22ee FF90 pop r15
+ 5855 22f0 EF90 pop r14
+ 5856 22f2 DF90 pop r13
+ 5857 22f4 CF90 pop r12
+ 5858 22f6 BF90 pop r11
+ 5859 22f8 AF90 pop r10
+ 5860 22fa 0895 ret
+ 5861 .LFE4:
+ 5863 .data
+ 5866 C.30.2453:
+ 5867 0000 00 .byte 0
+ 5868 0001 01 .byte 1
+ 5869 0002 02 .byte 2
+ 5870 0003 03 .byte 3
+ 5871 0004 04 .byte 4
+ 5872 0005 05 .byte 5
+ 5873 0006 06 .byte 6
+ 5874 0007 07 .byte 7
+ 5875 0008 01 .byte 1
+ 5876 0009 01 .byte 1
+ 5877 000a 02 .byte 2
+ 5878 000b 03 .byte 3
+ 5879 000c 04 .byte 4
+ 5880 000d 05 .byte 5
+ 5881 000e 06 .byte 6
+ 5882 000f 06 .byte 6
+ 5883 0010 02 .byte 2
+ 5884 0011 02 .byte 2
+ 5885 0012 03 .byte 3
+ 5886 0013 03 .byte 3
+ 5887 0014 04 .byte 4
+ 5888 0015 04 .byte 4
+ 5889 0016 05 .byte 5
+ 5890 0017 05 .byte 5
+ 5891 0018 03 .byte 3
+ 5892 0019 03 .byte 3
+ 5893 001a 03 .byte 3
+ 5894 001b 03 .byte 3
+ 5895 001c 04 .byte 4
+ 5896 001d 04 .byte 4
+ 5897 001e 04 .byte 4
+ 5898 001f 04 .byte 4
+ 5899 .comm cube,64,1
+ 5900 .comm fb,64,1
+ 6149 .Letext0:
+DEFINED SYMBOLS
+ *ABS*:0000000000000000 effect.c
+ /tmp/ccaJZNIL.s:2 *ABS*:000000000000003f __SREG__
+ /tmp/ccaJZNIL.s:3 *ABS*:000000000000003e __SP_H__
+ /tmp/ccaJZNIL.s:4 *ABS*:000000000000003d __SP_L__
+ /tmp/ccaJZNIL.s:5 *ABS*:0000000000000034 __CCP__
+ /tmp/ccaJZNIL.s:6 *ABS*:0000000000000000 __tmp_reg__
+ /tmp/ccaJZNIL.s:7 *ABS*:0000000000000001 __zero_reg__
+ /tmp/ccaJZNIL.s:20 .text:0000000000000000 effect_telcstairs_do
+ *COM*:0000000000000040 cube
+ /tmp/ccaJZNIL.s:84 .text:000000000000004a effect_telcstairs
+ /tmp/ccaJZNIL.s:146 .text:000000000000008c sendvoxel_z
+ /tmp/ccaJZNIL.s:255 .text:000000000000012a effect_pathmove
+ /tmp/ccaJZNIL.s:374 .text:00000000000001d6 effect_path_bitmap
+ /tmp/ccaJZNIL.s:562 .text:00000000000002fe effect_path_text
+ /tmp/ccaJZNIL.s:762 .text:0000000000000442 effect_pathspiral
+ /tmp/ccaJZNIL.s:861 .text:00000000000004dc effect_rand_patharound
+ /tmp/ccaJZNIL.s:994 .text:00000000000005ae effect_stringfly2
+ /tmp/ccaJZNIL.s:1348 .text:00000000000007d0 effect_smileyspin
+ /tmp/ccaJZNIL.s:5866 .data:0000000000000000 C.30.2453
+ /tmp/ccaJZNIL.s:2067 .text:0000000000000c1a effect_random_sparkle_flash
+ /tmp/ccaJZNIL.s:2174 .text:0000000000000cc4 effect_random_sparkle
+ /tmp/ccaJZNIL.s:2219 .text:0000000000000cfa effect_loadbar
+ /tmp/ccaJZNIL.s:2349 .text:0000000000000da8 draw_positions_axis
+ /tmp/ccaJZNIL.s:2504 .text:0000000000000e7c effect_boxside_randsend_parallel
+ /tmp/ccaJZNIL.s:2747 .text:0000000000000ff0 effect_axis_updown_randsuspend
+ /tmp/ccaJZNIL.s:2989 .text:0000000000001166 effect_z_updown_move
+ /tmp/ccaJZNIL.s:3045 .text:00000000000011a4 effect_z_updown
+ /tmp/ccaJZNIL.s:3270 .text:0000000000001310 effect_random_filler
+ /tmp/ccaJZNIL.s:3401 .text:00000000000013e4 sendvoxels_rand_z
+ /tmp/ccaJZNIL.s:3567 .text:00000000000014ce effect_blinky2
+ /tmp/ccaJZNIL.s:3687 .text:0000000000001590 effect_wormsqueeze
+ /tmp/ccaJZNIL.s:3974 .text:000000000000174c effect_rain
+ /tmp/ccaJZNIL.s:4078 .text:00000000000017ea boingboing
+ /tmp/ccaJZNIL.s:4891 .text:0000000000001cfc sendplane_rand_z
+ /tmp/ccaJZNIL.s:4974 .text:0000000000001d7a effect_box_woopwoop
+ /tmp/ccaJZNIL.s:5080 .text:0000000000001e1c effect_box_shrink_grow
+ /tmp/ccaJZNIL.s:5646 .text:000000000000219c effect_planboing
+ /tmp/ccaJZNIL.s:5760 .text:000000000000223c effect_test
+ *COM*:0000000000000040 fb
+
+UNDEFINED SYMBOLS
+__do_copy_data
+__do_clear_bss
+delay_ms
+clrvoxel
+setvoxel
+getvoxel
+altervoxel
+font_getpath
+font_getbitmappixel
+font_getchar
+rand
+__divmodhi4
+fill
+shift
+flpvoxel
+setplane_z
+box_wireframe
+box_filled
+box_walls
+setplane_x
+setplane_y
+__floatsisf
+sin
+__addsf3
+__fixsfsi
+cos
diff --git a/instructables/cube_pc/font.c b/instructables/cube_pc/font.c
new file mode 100644
index 0000000..9868e9a
--- /dev/null
+++ b/instructables/cube_pc/font.c
@@ -0,0 +1,158 @@
+#include "font.h"
+//#include <avr/eeprom.h>
+
+#define EEMEM
+#define PROGMEM
+
+volatile const unsigned char font[455] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x5f,0x00,0x00, // !
+ 0x00,0x03,0x00,0x03,0x00,0x14,0x7f,0x14,0x7f,0x14, // "#
+ 0x24,0x2a,0x7f,0x2a,0x12,0x23,0x13,0x08,0x64,0x62, // $%
+ 0x36,0x49,0x55,0x22,0x50,0x00,0x05,0x03,0x00,0x00, // &'
+ 0x00,0x1c,0x22,0x41,0x00,0x00,0x41,0x22,0x1c,0x00, // ()
+ 0x14,0x08,0x3e,0x08,0x14,0x08,0x08,0x3e,0x08,0x08, // *+
+ 0x00,0x50,0x30,0x00,0x00,0x08,0x08,0x08,0x08,0x08, // ,-
+ 0x00,0x60,0x60,0x00,0x00,0x20,0x10,0x08,0x04,0x02, // ./
+ 0x3e,0x51,0x49,0x45,0x3e,0x00,0x42,0x7f,0x40,0x00, // 01
+ 0x42,0x61,0x51,0x49,0x46,0x21,0x41,0x45,0x4b,0x31, // 23
+ 0x18,0x14,0x12,0x7f,0x10,0x27,0x45,0x45,0x45,0x39, // 45
+ 0x3c,0x4a,0x49,0x49,0x30,0x01,0x71,0x09,0x05,0x03, // 67
+ 0x36,0x49,0x49,0x49,0x36,0x06,0x49,0x49,0x29,0x1e, // 89
+ 0x00,0x36,0x36,0x00,0x00,0x00,0x56,0x36,0x00,0x00, // :;
+ 0x08,0x14,0x22,0x41,0x00,0x14,0x14,0x14,0x14,0x14, // <=
+ 0x00,0x41,0x22,0x14,0x08,0x02,0x01,0x51,0x09,0x06, // >?
+ 0x32,0x49,0x79,0x41,0x3e,0x7e,0x11,0x11,0x11,0x7e, // @A
+ 0x7f,0x49,0x49,0x49,0x36,0x3e,0x41,0x41,0x41,0x22, // BC
+ 0x7f,0x41,0x41,0x22,0x1c,0x7f,0x49,0x49,0x49,0x41, // DE
+ 0x7f,0x09,0x09,0x09,0x01,0x3e,0x41,0x49,0x49,0x7a, // FG
+ 0x7f,0x08,0x08,0x08,0x7f,0x00,0x41,0x7f,0x41,0x00, // HI
+ 0x20,0x40,0x41,0x3f,0x01,0x7f,0x08,0x14,0x22,0x41, // JK
+ 0x7f,0x40,0x40,0x40,0x40,0x7f,0x02,0x0c,0x02,0x7f, // LM
+ 0x7f,0x04,0x08,0x10,0x7f,0x3e,0x41,0x41,0x41,0x3e, // NO
+ 0x7f,0x09,0x09,0x09,0x06,0x3e,0x41,0x51,0x21,0x5e, // PQ
+ 0x7f,0x09,0x19,0x29,0x46,0x46,0x49,0x49,0x49,0x31, // RS
+ 0x01,0x01,0x7f,0x01,0x01,0x3f,0x40,0x40,0x40,0x3f, // TU
+ 0x1f,0x20,0x40,0x20,0x1f,0x3f,0x40,0x38,0x40,0x3f, // VW
+ 0x63,0x14,0x08,0x14,0x63,0x07,0x08,0x70,0x08,0x07, // XY
+ 0x61,0x51,0x49,0x45,0x43,0x00,0x7f,0x41,0x41,0x00, // Z[
+ 0x02,0x04,0x08,0x10,0x20,0x00,0x41,0x41,0x7f,0x00, // \]
+ 0x04,0x02,0x01,0x02,0x04,0x40,0x40,0x40,0x40,0x40, // ^_
+ 0x00,0x01,0x02,0x04,0x00,0x20,0x54,0x54,0x54,0x78, // `a
+ 0x7f,0x48,0x44,0x44,0x38,0x38,0x44,0x44,0x44,0x20, // bc
+ 0x38,0x44,0x44,0x48,0x7f,0x38,0x54,0x54,0x54,0x18, // de
+ 0x08,0x7e,0x09,0x01,0x02,0x0c,0x52,0x52,0x52,0x3e, // fg
+ 0x7f,0x08,0x04,0x04,0x78,0x00,0x44,0x7d,0x40,0x00, // hi
+ 0x20,0x40,0x44,0x3d,0x00,0x7f,0x10,0x28,0x44,0x00, // jk
+ 0x00,0x41,0x7f,0x40,0x00,0x7c,0x04,0x18,0x04,0x78, // lm
+ 0x7c,0x08,0x04,0x04,0x78,0x38,0x44,0x44,0x44,0x38, // no
+ 0x7c,0x14,0x14,0x14,0x08,0x08,0x14,0x14,0x18,0x7c, // pq
+ 0x7c,0x08,0x04,0x04,0x08,0x48,0x54,0x54,0x54,0x20, // rs
+ 0x04,0x3f,0x44,0x40,0x20,0x3c,0x40,0x40,0x20,0x7c, // tu
+ 0x1c,0x20,0x40,0x20,0x1c,0x3c,0x40,0x30,0x40,0x3c, // vw
+ 0x44,0x28,0x10,0x28,0x44,0x0c,0x50,0x50,0x50,0x3c, // xy
+ 0x44,0x64,0x54,0x4c,0x44 // z
+};
+
+
+volatile const unsigned char bitmaps[6][8] EEMEM = {
+ {0xc3,0xc3,0x00,0x18,0x18,0x81,0xff,0x7e}, // smiley 3 small
+ {0x3c,0x42,0x81,0x81,0xc3,0x24,0xa5,0xe7}, // Omega
+ {0x00,0x04,0x06,0xff,0xff,0x06,0x04,0x00}, // Arrow
+ {0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81}, // X
+ {0xBD,0xA1,0xA1,0xB9,0xA1,0xA1,0xA1,0x00}, // ifi
+ {0xEF,0x48,0x4B,0x49,0x4F,0x00,0x00,0x00} // TG
+};
+
+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,
+0x04,0x03,0x12,0x21,0x30,0x40,0x51,0x62,0x73,0x74,0x65,0x56,0x47,0x37,0x26,0x15}; // circle, len 16, offset 28
+
+void font_getpath (unsigned char path, unsigned char *destination, int length)
+{
+ int i;
+ int offset = 0;
+
+ if (path == 1)
+ offset=28;
+
+ //for (i = 0; i < length; i++)
+ // destination[i] = pgm_read_byte(&paths[i+offset]);
+}
+
+void font_getchar (char chr, unsigned char dst[5])
+{
+ int i;
+ chr -= 32;
+
+ unsigned char font[455] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x5f,0x00,0x00, // !
+ 0x00,0x03,0x00,0x03,0x00,0x14,0x7f,0x14,0x7f,0x14, // "#
+ 0x24,0x2a,0x7f,0x2a,0x12,0x23,0x13,0x08,0x64,0x62, // $%
+ 0x36,0x49,0x55,0x22,0x50,0x00,0x05,0x03,0x00,0x00, // &'
+ 0x00,0x1c,0x22,0x41,0x00,0x00,0x41,0x22,0x1c,0x00, // ()
+ 0x14,0x08,0x3e,0x08,0x14,0x08,0x08,0x3e,0x08,0x08, // *+
+ 0x00,0x50,0x30,0x00,0x00,0x08,0x08,0x08,0x08,0x08, // ,-
+ 0x00,0x60,0x60,0x00,0x00,0x20,0x10,0x08,0x04,0x02, // ./
+ 0x3e,0x51,0x49,0x45,0x3e,0x00,0x42,0x7f,0x40,0x00, // 01
+ 0x42,0x61,0x51,0x49,0x46,0x21,0x41,0x45,0x4b,0x31, // 23
+ 0x18,0x14,0x12,0x7f,0x10,0x27,0x45,0x45,0x45,0x39, // 45
+ 0x3c,0x4a,0x49,0x49,0x30,0x01,0x71,0x09,0x05,0x03, // 67
+ 0x36,0x49,0x49,0x49,0x36,0x06,0x49,0x49,0x29,0x1e, // 89
+ 0x00,0x36,0x36,0x00,0x00,0x00,0x56,0x36,0x00,0x00, // :;
+ 0x08,0x14,0x22,0x41,0x00,0x14,0x14,0x14,0x14,0x14, // <=
+ 0x00,0x41,0x22,0x14,0x08,0x02,0x01,0x51,0x09,0x06, // >?
+ 0x32,0x49,0x79,0x41,0x3e,0x7e,0x11,0x11,0x11,0x7e, // @A
+ 0x7f,0x49,0x49,0x49,0x36,0x3e,0x41,0x41,0x41,0x22, // BC
+ 0x7f,0x41,0x41,0x22,0x1c,0x7f,0x49,0x49,0x49,0x41, // DE
+ 0x7f,0x09,0x09,0x09,0x01,0x3e,0x41,0x49,0x49,0x7a, // FG
+ 0x7f,0x08,0x08,0x08,0x7f,0x00,0x41,0x7f,0x41,0x00, // HI
+ 0x20,0x40,0x41,0x3f,0x01,0x7f,0x08,0x14,0x22,0x41, // JK
+ 0x7f,0x40,0x40,0x40,0x40,0x7f,0x02,0x0c,0x02,0x7f, // LM
+ 0x7f,0x04,0x08,0x10,0x7f,0x3e,0x41,0x41,0x41,0x3e, // NO
+ 0x7f,0x09,0x09,0x09,0x06,0x3e,0x41,0x51,0x21,0x5e, // PQ
+ 0x7f,0x09,0x19,0x29,0x46,0x46,0x49,0x49,0x49,0x31, // RS
+ 0x01,0x01,0x7f,0x01,0x01,0x3f,0x40,0x40,0x40,0x3f, // TU
+ 0x1f,0x20,0x40,0x20,0x1f,0x3f,0x40,0x38,0x40,0x3f, // VW
+ 0x63,0x14,0x08,0x14,0x63,0x07,0x08,0x70,0x08,0x07, // XY
+ 0x61,0x51,0x49,0x45,0x43,0x00,0x7f,0x41,0x41,0x00, // Z[
+ 0x02,0x04,0x08,0x10,0x20,0x00,0x41,0x41,0x7f,0x00, // \]
+ 0x04,0x02,0x01,0x02,0x04,0x40,0x40,0x40,0x40,0x40, // ^_
+ 0x00,0x01,0x02,0x04,0x00,0x20,0x54,0x54,0x54,0x78, // `a
+ 0x7f,0x48,0x44,0x44,0x38,0x38,0x44,0x44,0x44,0x20, // bc
+ 0x38,0x44,0x44,0x48,0x7f,0x38,0x54,0x54,0x54,0x18, // de
+ 0x08,0x7e,0x09,0x01,0x02,0x0c,0x52,0x52,0x52,0x3e, // fg
+ 0x7f,0x08,0x04,0x04,0x78,0x00,0x44,0x7d,0x40,0x00, // hi
+ 0x20,0x40,0x44,0x3d,0x00,0x7f,0x10,0x28,0x44,0x00, // jk
+ 0x00,0x41,0x7f,0x40,0x00,0x7c,0x04,0x18,0x04,0x78, // lm
+ 0x7c,0x08,0x04,0x04,0x78,0x38,0x44,0x44,0x44,0x38, // no
+ 0x7c,0x14,0x14,0x14,0x08,0x08,0x14,0x14,0x18,0x7c, // pq
+ 0x7c,0x08,0x04,0x04,0x08,0x48,0x54,0x54,0x54,0x20, // rs
+ 0x04,0x3f,0x44,0x40,0x20,0x3c,0x40,0x40,0x20,0x7c, // tu
+ 0x1c,0x20,0x40,0x20,0x1c,0x3c,0x40,0x30,0x40,0x3c, // vw
+ 0x44,0x28,0x10,0x28,0x44,0x0c,0x50,0x50,0x50,0x3c, // xy
+ 0x44,0x64,0x54,0x4c,0x44 // z
+ };
+ for (i = 0; i < 5; i++)
+ {
+ dst[i] = font[(chr*5)+i];
+ }
+
+}
+
+void font_getbitmap (char bitmap, unsigned char dst[8])
+{
+ int i;
+
+ //for (i = 0; i < 8; i++)
+ // dst[i] = eeprom_read_byte(&bitmaps[bitmap][i]);
+
+}
+
+unsigned char font_getbitmappixel ( char bitmap, char x, char y)
+{
+ //unsigned char tmp = eeprom_read_byte(&bitmaps[bitmap][x]);
+ //return (tmp >> y) & 0x01;
+}
+
+
+
+
diff --git a/instructables/cube_pc/font.h b/instructables/cube_pc/font.h
new file mode 100644
index 0000000..1558204
--- /dev/null
+++ b/instructables/cube_pc/font.h
@@ -0,0 +1,13 @@
+#ifndef FONT_H
+#define FONT_H
+
+//#include <avr/pgmspace.h>
+
+void font_getchar (char chr, unsigned char dst[5]);
+void font_getpath (unsigned char path, unsigned char *destination, int length);
+void font_getbitmap (char bitmap, unsigned char dst[8]);
+unsigned char font_getbitmappixel ( char bitmap, char x, char y);
+
+
+
+#endif
diff --git a/instructables/cube_pc/gameoflife.c b/instructables/cube_pc/gameoflife.c
new file mode 100644
index 0000000..52d630b
--- /dev/null
+++ b/instructables/cube_pc/gameoflife.c
@@ -0,0 +1,148 @@
+#include "gameoflife.h"
+#include "cube.h"
+#include "draw.h"
+
+// Game of Life for the 4x4x4 and 8x8x8 led cube
+
+// Original rules:
+// live cells:
+// fewer than two neighbour: die
+// two or three neighbours: live
+// more than three neighbours: die
+// dead cells:
+// exactly three live neighbours becomes alive
+
+// This is 3d space, so the cell can have life on two more sides.
+// We have to tweak the rules a bit to make it work:
+
+// Create life in a dead cell if neighbours == 4
+#define GOL_CREATE_MIN 4
+#define GOL_CREATE_MAX 4
+
+// Underpopulation
+#define GOL_TERMINATE_LONELY 3
+// Overpopulation
+#define GOL_TERMINATE_CROWDED 5
+
+#define GOL_X 8
+#define GOL_Y 8
+#define GOL_Z 8
+
+#define GOL_WRAP 0
+
+
+
+void gol_play (int iterations, int delay)
+{
+ int i;
+
+ for (i = 0; i < iterations; i++)
+ {
+ LED_PORT ^= LED_GREEN;
+
+ gol_nextgen();
+
+ if (gol_count_changes() == 0)
+ return;
+
+ tmp2cube();
+
+ delay_ms(delay);
+
+ //led_red(1);
+ }
+}
+
+void gol_nextgen (void)
+{
+ int x,y,z;
+ unsigned char neigh;
+
+ tmpfill(0x00);
+
+ for (x = 0; x < GOL_X; x++)
+ {
+ for (y = 0; y < GOL_Y; y++)
+ {
+ for (z = 0; z < GOL_Z; z++)
+ {
+ neigh = gol_count_neighbors(x, y, z);
+
+ // Current voxel is alive.
+ if (getvoxel(x,y,z) == 0x01)
+ {
+ if (neigh <= GOL_TERMINATE_LONELY)
+ {
+ tmpclrvoxel(x,y,z);
+ } else if(neigh >= GOL_TERMINATE_CROWDED)
+ {
+ tmpclrvoxel(x,y,z);
+ } else
+ {
+ tmpsetvoxel(x,y,z);
+ }
+ // Current voxel is dead.
+ } else
+ {
+ if (neigh >= GOL_CREATE_MIN && neigh <= GOL_CREATE_MAX)
+ tmpsetvoxel(x,y,z);
+ }
+ }
+ }
+ }
+}
+
+unsigned char gol_count_neighbors (int x, int y, int z)
+{
+ int ix, iy, iz; // offset 1 in each direction in each dimension
+ int nx, ny, nz; // neighbours address.
+
+ unsigned char neigh = 0; // number of alive neighbours.
+
+ for (ix = -1; ix < 2; ix++)
+ {
+ for (iy = -1; iy < 2; iy++)
+ {
+ for (iz = -1; iz < 2; iz++)
+ {
+ // Your not your own neighbour, exclude 0,0,0, offset.
+ if ( !(ix == 0 && iy == 0 && iz == 0) )
+ {
+ if (GOL_WRAP == 0x01)
+ {
+ nx = (x+ix)%GOL_X;
+ ny = (y+iy)%GOL_Y;
+ nz = (z+iz)%GOL_Z;
+ } else
+ {
+ nx = x+ix;
+ ny = y+iy;
+ nz = z+iz;
+ }
+
+ if ( getvoxel(nx, ny, nz) )
+ neigh++;
+ }
+ }
+ }
+ }
+ return neigh;
+}
+
+int gol_count_changes (void)
+{
+ int x,y;
+ int i = 0;
+
+ for (x = 0; x < GOL_X; x++)
+ {
+ for (y = 0; y < GOL_Y; y++)
+ {
+ if (fb[x][y] != cube[x][y])
+ i++;
+ }
+ }
+
+ return i;
+}
+
diff --git a/instructables/cube_pc/gameoflife.h b/instructables/cube_pc/gameoflife.h
new file mode 100644
index 0000000..8e88be6
--- /dev/null
+++ b/instructables/cube_pc/gameoflife.h
@@ -0,0 +1,9 @@
+#ifndef GOL_H
+#define GOL_H
+
+void gol_play (int iterations, int delay);
+unsigned char gol_count_neighbors (int x, int y, int z);
+void gol_nextgen (void);
+int gol_count_changes (void);
+
+#endif
diff --git a/instructables/cube_pc/launch_effect.c b/instructables/cube_pc/launch_effect.c
new file mode 100644
index 0000000..b49b4af
--- /dev/null
+++ b/instructables/cube_pc/launch_effect.c
@@ -0,0 +1,182 @@
+#include "launch_effect.h"
+#include "effect.h"
+#include "draw.h"
+#include "gameoflife.h"
+
+void launch_effect (int effect)
+{
+ int i;
+ unsigned char ii;
+
+ fill(0x00);
+
+ switch (effect)
+ {
+ case 0x00:
+ effect_rain(100);
+ break;
+
+
+ case 1:
+ sendvoxels_rand_z(20,220,2000);
+ break;
+
+ case 2:
+ effect_random_filler(5,1);
+ effect_random_filler(5,0);
+ effect_random_filler(5,1);
+ effect_random_filler(5,0);
+ break;
+
+ case 3:
+ effect_z_updown(20,1000);
+ break;
+
+ case 4:
+ effect_wormsqueeze (2, AXIS_Z, -1, 100, 1000);
+ break;
+
+ case 5:
+ effect_blinky2();
+ break;
+
+ case 6:
+ for (ii=0;ii<8;ii++)
+ {
+ effect_box_shrink_grow (1, ii%4, ii & 0x04, 450);
+ }
+
+ effect_box_woopwoop(800,0);
+ effect_box_woopwoop(800,1);
+ effect_box_woopwoop(800,0);
+ effect_box_woopwoop(800,1);
+ break;
+
+ case 7:
+ effect_planboing (AXIS_Z, 400);
+ effect_planboing (AXIS_X, 400);
+ effect_planboing (AXIS_Y, 400);
+ effect_planboing (AXIS_Z, 400);
+ effect_planboing (AXIS_X, 400);
+ effect_planboing (AXIS_Y, 400);
+ fill(0x00);
+ break;
+
+ case 8:
+ fill(0x00);
+ effect_telcstairs(0,800,0xff);
+ effect_telcstairs(0,800,0x00);
+ effect_telcstairs(1,800,0xff);
+ effect_telcstairs(1,800,0xff);
+ break;
+
+ case 9:
+ effect_axis_updown_randsuspend(AXIS_Z, 550,5000,0);
+ effect_axis_updown_randsuspend(AXIS_Z, 550,5000,1);
+ effect_axis_updown_randsuspend(AXIS_Z, 550,5000,0);
+ effect_axis_updown_randsuspend(AXIS_Z, 550,5000,1);
+ effect_axis_updown_randsuspend(AXIS_X, 550,5000,0);
+ effect_axis_updown_randsuspend(AXIS_X, 550,5000,1);
+ effect_axis_updown_randsuspend(AXIS_Y, 550,5000,0);
+ effect_axis_updown_randsuspend(AXIS_Y, 550,5000,1);
+ break;
+
+ case 10:
+ effect_loadbar(700);
+ break;
+
+ case 11:
+ effect_wormsqueeze (1, AXIS_Z, 1, 100, 1000);
+ break;
+
+
+ case 12:
+ effect_stringfly2("Boo !!!!");
+ break;
+
+ case 13:
+ fill(0x00);
+ // Create a random starting point for the Game of Life effect.
+ for (i = 0; i < 20;i++)
+ {
+ setvoxel(rand()%4,rand()%4,rand()%4);
+ }
+
+ gol_play(20, 400);
+ break;
+
+ case 14:
+ effect_boxside_randsend_parallel (AXIS_Z, 0 , 200,1);
+ delay_ms(1500);
+ effect_boxside_randsend_parallel (AXIS_Z, 1 , 200,1);
+ delay_ms(1500);
+
+ effect_boxside_randsend_parallel (AXIS_Z, 0 , 200,2);
+ delay_ms(1500);
+ effect_boxside_randsend_parallel (AXIS_Z, 1 , 200,2);
+ delay_ms(1500);
+
+ effect_boxside_randsend_parallel (AXIS_Y, 0 , 200,1);
+ delay_ms(1500);
+ effect_boxside_randsend_parallel (AXIS_Y, 1 , 200,1);
+ delay_ms(1500);
+ break;
+
+ case 15:
+ boingboing(250, 600, 0x01, 0x02);
+ break;
+
+ case 16:
+ effect_smileyspin(2,1000,0);
+ break;
+
+ case 17:
+ effect_pathspiral(100,500);
+ break;
+
+ case 18:
+ effect_path_bitmap(700,2,3);
+ break;
+
+ case 19:
+ effect_smileyspin(2,1000,1);
+ break;
+
+ case 20:
+ effect_path_text(1000,"TG");
+ break;
+
+ case 21:
+ effect_rand_patharound(200,500);
+ break;
+
+ case 22:
+ effect_wormsqueeze (1, AXIS_Z, -1, 100, 1000);
+ break;
+
+ case 23:
+ effect_smileyspin(2,1000,2);
+ break;
+
+ case 24:
+ effect_random_sparkle();
+ break;
+
+ case 25:
+ effect_wormsqueeze (1, AXIS_Z, -1, 100, 1000);
+ break;
+
+ case 26:
+ boingboing(250, 600, 0x01, 0x03);
+ break;
+
+ // In case the effect number is out of range:
+ default:
+ effect_stringfly2("FAIL");
+ break;
+
+
+
+ }
+}
+
diff --git a/instructables/cube_pc/launch_effect.h b/instructables/cube_pc/launch_effect.h
new file mode 100644
index 0000000..072822a
--- /dev/null
+++ b/instructables/cube_pc/launch_effect.h
@@ -0,0 +1,15 @@
+#ifndef LAUNCH_H
+#define LAUNCH_H
+
+#include "cube.h"
+
+// Total number of effects
+// Used in the main loop to loop through all the effects one by bone.
+// Set this number one higher than the highest number inside switch()
+// in launch_effect() in launch_effect.c
+#define EFFECTS_TOTAL 27
+
+void launch_effect (int effect);
+
+#endif
+
diff --git a/instructables/cube_pc/lisence.txt b/instructables/cube_pc/lisence.txt
new file mode 100644
index 0000000..812dab5
--- /dev/null
+++ b/instructables/cube_pc/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/instructables/cube_pc/main.c b/instructables/cube_pc/main.c
new file mode 100644
index 0000000..61e4f9a
--- /dev/null
+++ b/instructables/cube_pc/main.c
@@ -0,0 +1,81 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "cube.h"
+#include "draw.h"
+#include "draw_3d.h"
+#include "effect.h"
+#include "gameoflife.h"
+#include "launch_effect.h"
+
+void *cube_updater (unsigned char rs232_cube[8][8]);
+
+int main (int argc, char **argv)
+{
+
+ if (argc < 2) {
+ fprintf(stderr, "Please indicate device to use.\n");
+ return 1;
+ }
+
+ cube_init(argv[1]);
+
+ pthread_t cube_thread;
+ int iret, i, x;
+
+ iret = pthread_create (&cube_thread, NULL, cube_updater, rs232_cube);
+
+
+ while (1)
+ {
+ for (i = 0; i < 0; i++) {
+ effect_blinky2();
+ }
+ for (i=0; i<EFFECTS_TOTAL; i++)
+ launch_effect(i);
+
+ printf("Effect: sidewaves\n");
+ sidewaves(2000,50);
+
+ printf("Effect: ripples\n");
+ ripples(2000,50);
+
+ printf("Effect: linespin\n");
+ linespin(2000,50);
+
+ printf("Effect: sinelines\n");
+ sinelines(2000,50);
+
+ printf("Effect: spheremove\n");
+ spheremove(1500,50);
+
+ printf("Effect: fireworks\n");
+ fireworks(7,50,600);
+
+ printf("Effect: gol_play\n");
+ for (i=0; i<10; i++)
+ {
+ for (x=0; x<20; x++)
+ setvoxel(rand()%4,rand()%4,rand()%4);
+
+ gol_play(50,1000);
+
+ }
+ }
+
+}
+
+void *cube_updater (unsigned char rs232_cube[8][8])
+{
+ unsigned char pushcube[8][8];
+
+
+ while (1)
+ {
+ memcpy(pushcube, rs232_cube, 64);
+ cube_push(pushcube);
+ }
+}
+
+
diff --git a/instructables/cube_pc/main.h b/instructables/cube_pc/main.h
new file mode 100644
index 0000000..f19cd4d
--- /dev/null
+++ b/instructables/cube_pc/main.h
@@ -0,0 +1,4 @@
+
+#include "cube.h"
+
+
diff --git a/instructables/pricelist.xls b/instructables/pricelist.xls
new file mode 100644
index 0000000..f1c4770
--- /dev/null
+++ b/instructables/pricelist.xls
Binary files differ