From ece71e8f00fb2199a2f693e843c0796d00552a09 Mon Sep 17 00:00:00 2001
From: leo <leo@chaotikum.org>
Date: Sat, 4 Jun 2022 17:24:33 +0200
Subject: [PATCH] duno

---
 Makefile |   2 +-
 draw.c   | 966 +++----------------------------------------------------
 draw.h   |  42 +--
 main.c   | 358 ++++++++++++++++-----
 main.hex | 519 ++++++++++++++++++++++++++++++
 poly     |  12 +
 pong.c   |  56 +++-
 shapes.c |  19 ++
 shapes.h |   5 +
 stl.c    |  69 ++++
 text.c   | 439 +++++++++++++++++++++++++
 text.h   |   3 +
 uart.c   |   4 +-
 13 files changed, 1451 insertions(+), 1043 deletions(-)
 create mode 100644 main.hex
 create mode 100644 poly
 create mode 100644 shapes.c
 create mode 100644 shapes.h
 create mode 100644 stl.c
 create mode 100644 text.c
 create mode 100644 text.h

diff --git a/Makefile b/Makefile
index 3966c5b..9aa4d88 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@ CFLAGS=-g -Wall -mcall-prologues -mmcu=$(MCU) -O2 -I ./
 LDFLAGS=-Wl,-gc-sections -Wl,-relax
 CC=avr-gcc
 TARGET=main
-OBJECT_FILES=main.o draw.o tennis.o pong.o 
+OBJECT_FILES=main.o draw.o uart.o shapes.o text.o pong.o
 
 all: $(TARGET).hex
 
diff --git a/draw.c b/draw.c
index 64a77c0..4428027 100644
--- a/draw.c
+++ b/draw.c
@@ -1,7 +1,6 @@
 #include <avr/io.h>
 #include <draw.h>
-#include <uart.h>
-
+#include "uart.h"
 
 #define F_CPU 16000000
 
@@ -10,473 +9,39 @@
 uint8_t currentPxX = 0;
 uint8_t currentPxY = 0;
 
-uint8_t cursorX = 0;
-uint8_t cursorY = 0;
-
-
-#define CHARSX 27
-#define CHARSY 14
-
-
-uint16_t charBuffer[CHARSX][CHARSY];
-
-/*
-struct polyList{
-	int x;	//relative 
-	int y;
-	int z;
-	uint8_t mode; //0=goto 1=drawto 255=terminate 
-};
-
-struct polyList chaotikumLogo[140]={
-	{4,2,0,0},
-
-	{0,-2,0,1},
-	{1,0,0,1},
-	{0,2,0,1},
-	{1,0,0,1},
-
-	{0,-2,0,1},
-	{1,0,0,1},
-	{0,2,0,1},
-	{1,0,0,1},
-
-	{0,-2,0,1},
-	{1,0,0,1},
-	{0,2,0,1},
-	{1,0,0,1},
-
-	{0,-2,0,1},
-	{1,0,0,1},
-	{0,2,0,1},
-	{1,0,0,1},
-
-	{0,-2,0,1},
-	{1,0,0,1},
-	{0,2,0,1},
-
-	{2,2,0,1},
-
-	{2,0,0,1},
-	{0,1,0,1},
-	{-2,0,0,1},
-	{0,1,0,1},
-
-	{2,0,0,1},
-	{0,1,0,1},
-	{-2,0,0,1},
-	{0,1,0,1},
-
-	{2,0,0,1},
-	{0,1,0,1},
-	{-2,0,0,1},
-	{0,1,0,1},
-
-	{2,0,0,1},
-	{0,1,0,1},
-	{-2,0,0,1},
-	{0,1,0,1},
-
-	{2,0,0,1},
-	{0,1,0,1},
-	{-2,0,0,1},
-
-	{-2,2,0,1},
-
-	{0,2,0,1},
-	{-1,0,0,1},
-	{0,-2,0,1},
-	{-1,0,0,1},
-
-	{0,2,0,1},
-	{-1,0,0,1},
-	{0,-2,0,1},
-	{-1,0,0,1},
-
-	{0,2,0,1},
-	{-1,0,0,1},
-	{0,-2,0,1},
-	{-1,0,0,1},
-
-	{0,2,0,1},
-	{-1,0,0,1},
-	{0,-2,0,1},
-	{-1,0,0,1},
-
-	{0,2,0,1},
-	{-1,0,0,1},
-	{0,-2,0,1},
-
-	{-2,-2,0,1},
-
-	{-2,0,0,1},
-	{0,-1,0,1},
-	{2,0,0,1},
-	{0,-1,0,1},
-
-	{-2,0,0,1},
-	{0,-1,0,1},
-	{2,0,0,1},
-	{0,-1,0,1},
-
-	{-2,0,0,1},
-	{0,-1,0,1},
-	{2,0,0,1},
-	{0,-1,0,1},
-
-	{-2,0,0,1},
-	{0,-1,0,1},
-	{2,0,0,1},
-	{0,-1,0,1},
-
-	{-2,0,0,1},
-	{0,-1,0,1},
-	{2,0,0,1},
-	{2,-2,0,1},
-
 
+uint16_t bufferIndex = 0;
+struct polyList buffer[500]={};
 
-
-	{0,0,0,255}
-};
-
-void drawPolyList(uint8_t startX, uint8_t startY, uint8_t scale){
-
-	uint16_t ListPointer=0;
-	goXY(startX,startY);
-	while(chaotikumLogo[ListPointer].mode!=255){
-		switch(chaotikumLogo[ListPointer].mode){
-			case 0:
-				goXY(currentPxX + (chaotikumLogo[ListPointer].x*scale), currentPxY + (chaotikumLogo[ListPointer].y*scale));
-				break;
-			case 1:
-				drawLine(currentPxX, currentPxY, currentPxX + (chaotikumLogo[ListPointer].x*scale), currentPxY + (chaotikumLogo[ListPointer].y*scale));
-				break;
-		}
-		ListPointer++;
-	}
-
-}
-
-*//*
-int intSine[] = {
-	0,-2,-4,-6,-8,-11,-13,-15,-17,-19,
-	-22,-24,-26,-28,-30,-32,-35,-37,-39,-41,
-	-43,-45,-47,-49,-51,-53,-55,-57,-59,-61,
-	-63,-65,-67,-69,-71,-73,-74,-76,-78,-80,
-	-81,-83,-85,-86,-88,-90,-91,-93,-94,-96,
-	-97,-99,-100,-101,-103,-104,-105,-106,-108,-109,
-	-110,-111,-112,-113,-114,-115,-116,-117,-118,-119,
-	-119,-120,-121,-121,-122,-123,-123,-124,-124,-125,
-	-125,-125,-126,-126,-126,-127,-127,-127,-127,-127,
-	-127,-127,-127,-127,-127,-127,-126,-126,-126,-125,
-	-125,-125,-124,-124,-123,-123,-122,-121,-121,-120,
-	-119,-119,-118,-117,-116,-115,-114,-113,-112,-111,
-	-110,-109,-108,-106,-105,-104,-103,-101,-100,-99,
-	-97,-96,-94,-93,-91,-90,-88,-86,-85,-83,
-	-81,-80,-78,-76,-74,-73,-71,-69,-67,-65,
-	-63,-61,-59,-57,-55,-53,-51,-49,-47,-45,
-	-43,-41,-39,-37,-35,-32,-30,-28,-26,-24,
-	-22,-19,-17,-15,-13,-11,-8,-6,-4,-2,
-	0,3,5,7,9,12,14,16,18,20,
-	23,25,27,29,31,33,36,38,40,42,
-	44,46,48,50,52,54,56,58,60,62,
-	64,66,68,70,72,74,75,77,79,81,
-	82,84,86,87,89,91,92,94,95,97,
-	98,100,101,102,104,105,106,107,109,110,
-	111,112,113,114,115,116,117,118,119,120,
-	120,121,122,122,123,124,124,125,125,126,
-	126,126,127,127,127,128,128,128,128,128,
-	128,128,128,128,128,128,127,127,127,126,
-	126,126,125,125,124,124,123,122,122,121,
-	120,120,119,118,117,116,115,114,113,112,
-	111,110,109,107,106,105,104,102,101,100,
-	98,97,95,94,92,91,89,87,86,84,
-	82,81,79,77,75,74,72,70,68,66,
-	64,62,60,58,56,54,52,50,48,46,
-	44,42,40,38,36,33,31,29,27,25,
-	23,20,18,16,14,12,9,7,5,3
-};*/
-
-uint8_t sine[] = {
-	0x80,0x82,0x84,0x86,0x88,0x8b,0x8d,0x8f,
-	0x91,0x93,0x96,0x98,0x9a,0x9c,0x9e,0xa0,
-	0xa3,0xa5,0xa7,0xa9,0xab,0xad,0xaf,0xb1,
-	0xb3,0xb5,0xb7,0xb9,0xbb,0xbd,0xbf,0xc1,
-	0xc3,0xc5,0xc7,0xc9,0xca,0xcc,0xce,0xd0,
-	0xd1,0xd3,0xd5,0xd6,0xd8,0xda,0xdb,0xdd,
-	0xde,0xe0,0xe1,0xe3,0xe4,0xe5,0xe7,0xe8,
-	0xe9,0xea,0xec,0xed,0xee,0xef,0xf0,0xf1,
-	0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf7,0xf8,
-	0xf9,0xf9,0xfa,0xfb,0xfb,0xfc,0xfc,0xfd,
-	0xfd,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff,
-	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-	0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfc,0xfc,
-	0xfb,0xfb,0xfa,0xf9,0xf9,0xf8,0xf7,0xf7,
-	0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xef,
-	0xee,0xed,0xec,0xea,0xe9,0xe8,0xe7,0xe5,
-	0xe4,0xe3,0xe1,0xe0,0xde,0xdd,0xdb,0xda,
-	0xd8,0xd6,0xd5,0xd3,0xd1,0xd0,0xce,0xcc,
-	0xca,0xc9,0xc7,0xc5,0xc3,0xc1,0xbf,0xbd,
-	0xbb,0xb9,0xb7,0xb5,0xb3,0xb1,0xaf,0xad,
-	0xab,0xa9,0xa7,0xa5,0xa3,0xa0,0x9e,0x9c,
-	0x9a,0x98,0x96,0x93,0x91,0x8f,0x8d,0x8b,
-	0x88,0x86,0x84,0x82,0x80,0x7d,0x7b,0x79,
-	0x77,0x74,0x72,0x70,0x6e,0x6c,0x69,0x67,
-	0x65,0x63,0x61,0x5f,0x5c,0x5a,0x58,0x56,
-	0x54,0x52,0x50,0x4e,0x4c,0x4a,0x48,0x46,
-	0x44,0x42,0x40,0x3e,0x3c,0x3a,0x38,0x36,
-	0x35,0x33,0x31,0x2f,0x2e,0x2c,0x2a,0x29,
-	0x27,0x25,0x24,0x22,0x21,0x1f,0x1e,0x1c,
-	0x1b,0x1a,0x18,0x17,0x16,0x15,0x13,0x12,
-	0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa,
-	0x9,0x8,0x8,0x7,0x6,0x6,0x5,0x4,
-	0x4,0x3,0x3,0x2,0x2,0x2,0x1,0x1,
-	0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
-	0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x2,
-	0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x6,
-	0x6,0x7,0x8,0x8,0x9,0xa,0xb,0xc,
-	0xd,0xe,0xf,0x10,0x11,0x12,0x13,0x15,
-	0x16,0x17,0x18,0x1a,0x1b,0x1c,0x1e,0x1f,
-	0x21,0x22,0x24,0x25,0x27,0x29,0x2a,0x2c,
-	0x2e,0x2f,0x31,0x33,0x35,0x36,0x38,0x3a,
-	0x3c,0x3e,0x40,0x42,0x44,0x46,0x48,0x4a,
-	0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x5a,
-	0x5c,0x5f,0x61,0x63,0x65,0x67,0x69,0x6c,
-	0x6e,0x70,0x72,0x74,0x77,0x79,0x7b,0x7d
-};
-
-uint8_t cosine[] = {
-	0x0,0x0,
-	0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x2,
-	0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x6,
-	0x6,0x7,0x8,0x8,0x9,0xa,0xb,0xc,
-	0xd,0xe,0xf,0x10,0x11,0x12,0x13,0x15,
-	0x16,0x17,0x18,0x1a,0x1b,0x1c,0x1e,0x1f,
-	0x21,0x22,0x24,0x25,0x27,0x29,0x2a,0x2c,
-	0x2e,0x2f,0x31,0x33,0x35,0x36,0x38,0x3a,
-	0x3c,0x3e,0x40,0x42,0x44,0x46,0x48,0x4a,
-	0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x5a,
-	0x5c,0x5f,0x61,0x63,0x65,0x67,0x69,0x6c,
-	0x6e,0x70,0x72,0x74,0x77,0x79,0x7b,0x7d,
-	0x80,0x82,0x84,0x86,0x88,0x8b,0x8d,0x8f,
-	0x91,0x93,0x96,0x98,0x9a,0x9c,0x9e,0xa0,
-	0xa3,0xa5,0xa7,0xa9,0xab,0xad,0xaf,0xb1,
-	0xb3,0xb5,0xb7,0xb9,0xbb,0xbd,0xbf,0xc1,
-	0xc3,0xc5,0xc7,0xc9,0xca,0xcc,0xce,0xd0,
-	0xd1,0xd3,0xd5,0xd6,0xd8,0xda,0xdb,0xdd,
-	0xde,0xe0,0xe1,0xe3,0xe4,0xe5,0xe7,0xe8,
-	0xe9,0xea,0xec,0xed,0xee,0xef,0xf0,0xf1,
-	0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf7,0xf8,
-	0xf9,0xf9,0xfa,0xfb,0xfb,0xfc,0xfc,0xfd,
-	0xfd,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff,
-	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-	0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfc,0xfc,
-	0xfb,0xfb,0xfa,0xf9,0xf9,0xf8,0xf7,0xf7,
-	0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xef,
-	0xee,0xed,0xec,0xea,0xe9,0xe8,0xe7,0xe5,
-	0xe4,0xe3,0xe1,0xe0,0xde,0xdd,0xdb,0xda,
-	0xd8,0xd6,0xd5,0xd3,0xd1,0xd0,0xce,0xcc,
-	0xca,0xc9,0xc7,0xc5,0xc3,0xc1,0xbf,0xbd,
-	0xbb,0xb9,0xb7,0xb5,0xb3,0xb1,0xaf,0xad,
-	0xab,0xa9,0xa7,0xa5,0xa3,0xa0,0x9e,0x9c,
-	0x9a,0x98,0x96,0x93,0x91,0x8f,0x8d,0x8b,
-	0x88,0x86,0x84,0x82,0x80,0x7d,0x7b,0x79,
-	0x77,0x74,0x72,0x70,0x6e,0x6c,0x69,0x67,
-	0x65,0x63,0x61,0x5f,0x5c,0x5a,0x58,0x56,
-	0x54,0x52,0x50,0x4e,0x4c,0x4a,0x48,0x46,
-	0x44,0x42,0x40,0x3e,0x3c,0x3a,0x38,0x36,
-	0x35,0x33,0x31,0x2f,0x2e,0x2c,0x2a,0x29,
-	0x27,0x25,0x24,0x22,0x21,0x1f,0x1e,0x1c,
-	0x1b,0x1a,0x18,0x17,0x16,0x15,0x13,0x12,
-	0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa,
-	0x9,0x8,0x8,0x7,0x6,0x6,0x5,0x4,
-	0x4,0x3,0x3,0x2,0x2,0x2,0x1,0x1,
-	0x1,0x0,0x0,0x0,0x0,0x0
-};
-
-
-struct polyList{
-	int x;	//relative 
-	int y;
-	int z;
-	uint8_t mode; //0=goto 1=drawto 255=terminate 
-};
-
-struct polyList pyramid[50]={	
-	{ 0, 1, 0,0},
-	{ 1,-1, 1,1},
-	{ 1,-1,-1,1},
-	{-1,-1,-1,1},
-	{ 0, 1, 0,1},
-	{ 1,-1,-1,1},
-	{-1,-1,-1,0},
-	{-1,-1, 1,1},
-	{ 0, 1, 0,1},
-	{-1,-1, 1,0},
-	{ 1,-1, 1,1},
-	{0,0,0,255}
-};
-
-#define NORMSIN(pos) ((127-sine[pos])/127.0)
-#define NORMCOS(pos) ((127-cosine[pos])/127.0)
-
-#define INORMSIN(pos) ((127-sine[pos]))
-#define INORMCOS(pos) ((127-cosine[pos]))
-
-
-int readInt(){
-	int tmpVal=0;
-	int isNeg=0;
-	int digi=0;
-	char buf[15];
-	while(1){
-		goXY(10,50);
-
-	    sprintf(buf,"READ IN%d",tmpVal);
-		drawString(buf,5);
-
-		char newChar = uart_read();
-		if(newChar == ','){
+void drawBuffer(){
+	uint16_t ListPointer = 0;
+	while(buffer[ListPointer].mode != 255){
+		switch(buffer[ListPointer].mode){
+			case 0://goto
+				goXY(buffer[ListPointer].x, buffer[ListPointer].y);
+			break;
+			case 1://drawto
+				drawLine(currentPxX, currentPxY, currentPxX + buffer[ListPointer].x, currentPxY + buffer[ListPointer].y);				
+			break;
+			case 2://moveto
+				goXY(currentPxX + buffer[ListPointer].x,currentPxY + buffer[ListPointer].y);
+			break;
+			case 3://drawto Abs
+				drawLine(currentPxX, currentPxY, /*currentPxX +*/ buffer[ListPointer].x, /*currentPxY*/ + buffer[ListPointer].y);				
 			break;
 		}
-		if(newChar == '-'){
-			isNeg=1;
-		}
-		if(newChar >= '0' && newChar <= '9'){
-			digi = newChar - '0';
-			if(tmpVal==0){
-				tmpVal+=digi;
-			}else{
-				tmpVal*=10;
-				tmpVal+=digi;
-			}
-			digi=0;
-		}
-	}
-	if(isNeg){
-		return -tmpVal;
-	}
-	return tmpVal;
-}
-
-struct polyList buffer[50]={};
+		ListPointer++;		
 
-void getNewPolyList(){
-	uint16_t ListPointer=0;
-
-	int lastNum = 0;
-
-	while(lastNum!=255){
-		
-		pyramid[ListPointer].x =readInt();
-		pyramid[ListPointer].y =readInt();
-		pyramid[ListPointer].z =readInt();
-		lastNum = readInt();
-		pyramid[ListPointer].mode=lastNum;
-		ListPointer++;
 	}
-	pyramid[ListPointer].x =0;
-	pyramid[ListPointer].y =0;
-	pyramid[ListPointer].z =0;
-	pyramid[ListPointer].mode=255;
 
 }
 
-
-
-void updateBufferFast(int rotX, int rotY, int rotZ, int scale){
-	uint16_t ListPointer=0;
-
-	int oldX;
-	int oldY;
-	int oldZ;
-	int oldMode = pyramid[ListPointer].mode;
-
-	int sinX = INORMSIN(rotX);
-	int sinY = INORMSIN(rotY);
-	int sinZ = INORMSIN(rotZ);
-
-	int cosX = INORMCOS(rotX);
-	int cosY = INORMCOS(rotY);
-	int cosZ = INORMCOS(rotZ);
-
-	int xx = (INORMCOS(rotY) * INORMCOS(rotZ))>>7;
-	int xy = (INORMCOS(rotY) * INORMSIN(rotZ))>>7;
-	int xz = INORMSIN(rotY);
-
-/*		
-	float yx = (NORMCOS(rotZ) * NORMSIN(rotX) * NORMSIN(rotY) + NORMCOS(rotX) * NORMSIN(rotZ));
-	float yy = (NORMCOS(rotX) * NORMCOS(rotZ) - NORMSIN(rotX) * NORMSIN(rotY) * NORMSIN(rotZ));
-	float yz = NORMCOS(rotY) * NORMSIN(rotX);
-*/
-	int yx = ((((cosZ * sinX)/128) * sinY)/128) + (cosX * sinZ)/128;
-	int yy = ((cosX * sinZ)/128) - (((sinX * sinY)/128) * sinZ)/128;
-	int yz = (cosX * sinZ)/128;
-
-	while(buffer[ListPointer].mode!=255){
-		
-		oldX = pyramid[ListPointer].x * scale;
-		oldY = pyramid[ListPointer].y * scale;
-		oldZ = pyramid[ListPointer].z * scale;
-		oldMode = pyramid[ListPointer].mode;
-
-		buffer[ListPointer].x = (( oldX * xx)>>7) + (( oldZ * xz)>>7) - (( oldY * xy)>>7);
-
-		buffer[ListPointer].y = ((-oldZ * yz)>>7) + (( oldX * yx)>>7) + (( oldY * yy)>>7) ;
-		
-		buffer[ListPointer].z = oldZ;
-		buffer[ListPointer].mode = oldMode;
-		ListPointer++;
-	}
-	buffer[ListPointer] = pyramid[ListPointer];
+void addJump(int newX, int newY){
+	addElement(newX,newY,0,2);
 }
 
-
-void updateBuffer(int rotX, int rotY, int rotZ, float scale){
-	uint16_t ListPointer=0;
-
-	float xx = NORMCOS(rotY) * NORMCOS(rotZ);
-	float xy = NORMCOS(rotY) * NORMSIN(rotZ);
-	float xz = NORMSIN(rotY);
-
-	float yx = (NORMCOS(rotZ) * NORMSIN(rotX) * NORMSIN(rotY) + NORMCOS(rotX) * NORMSIN(rotZ));
-	float yy = (NORMCOS(rotX) * NORMCOS(rotZ) - NORMSIN(rotX) * NORMSIN(rotY) * NORMSIN(rotZ));
-	float yz = NORMCOS(rotY) * NORMSIN(rotX);
-
-	int oldX;
-	int oldY;
-	int oldZ;
-
-	while(buffer[ListPointer].mode!=255){
-		oldX = pyramid[ListPointer].x * scale;
-		oldY = pyramid[ListPointer].y * scale;
-		oldZ = pyramid[ListPointer].z * scale;
-
-		buffer[ListPointer].x = ( oldX * xx) + (oldZ * xz) - (oldY * xy);
-		buffer[ListPointer].y = (-oldZ * yz) + (oldX * yx) + (oldY * yy);
-
-		buffer[ListPointer].mode = pyramid[ListPointer].mode;
-		ListPointer++;
-	}
-	buffer[ListPointer] = pyramid[ListPointer];
-}
-
-void drawPolyList(uint8_t startX, uint8_t startY, uint8_t scale){
-	uint16_t ListPointer = 0;
-	goXY(startX,startY);
-	while(buffer[ListPointer].mode!=255){
-		switch(buffer[ListPointer].mode){
-			case 0:
-				goXY((buffer[ListPointer].x)+127, (buffer[ListPointer].y)+127);
-				break;
-			case 1:
-				drawLine(currentPxX, currentPxY,(buffer[ListPointer].x)+127, (buffer[ListPointer].y)+127);				
-				break;
-		}
-		ListPointer++;
-	}
-	goXY(0,0);
+void addDrawTo(int newX, int newY){
+	addElement(newX,newY,0,1);
 }
 
 int abs(int val){
@@ -486,491 +51,48 @@ int abs(int val){
 	return -val;
 }
 
-
-int fontSize = 8;
-
-void testPattern(int loop){
-	for(int k = 0 ; k < loop ; k++){
-		//drawRec(0,0,255);
-	goXY(0,255);
-	//_delay_ms(1);
-	goXY(5,230);
-	for(int i = 'A'; i < 'K';i++){
-		drawChar(i,fontSize);
-	}
-	goXY(5,206);
-	for(int i = 'K'; i < 'U';i++){
-		drawChar(i,fontSize);
-	}
-	goXY(5,182);
-	for(int i = 'U'; i < 'Z'+1;i++){
-		drawChar(i,fontSize);
-	}
-
-
-
-	}
-
-	goXY(0,0);
-}
-
-
 void goXY(uint8_t x, uint8_t y){	
 	PORTA = 255-x;
 	PORTC = y;
 	//PORTL = y;
 	currentPxX = x;
 	currentPxY = y;
-	//_delay_ms(5);
 
-}
 
-void drawToXY(uint8_t x, uint8_t y){
-	while(currentPxX != x || currentPxY != y){
-		if(currentPxX<x){goXY(currentPxX+1,currentPxY);}
-		if(currentPxX>x){goXY(currentPxX-1,currentPxY);}
-		if(currentPxY<y){goXY(currentPxX,currentPxY+1);}
-		if(currentPxY>y){goXY(currentPxX,currentPxY-1);}
-	}
 }
 
-void drawRec(uint8_t xbeg, uint8_t ybeg, uint8_t size){
-	goXY(xbeg,ybeg);
-	drawToXY(currentPxX+size,currentPxY);
-	drawToXY(currentPxX,currentPxY+size);
-	drawToXY(currentPxX-size,currentPxY);
-	drawToXY(currentPxX,currentPxY-size);
+void drawLine(int x0, int y0, int x1, int y1){
+  int dx =  abs (x1 - x0), sx = x0 < x1 ? 1 : -1;
+  int dy = -abs (y1 - y0), sy = y0 < y1 ? 1 : -1; 
+  int err = dx + dy, e2; /* error value e_xy */
+ 
+  for (;;){  /* loop */
+    goXY(x0,y0);
+    if (x0 == x1 && y0 == y1) break;
+    e2 = 2 * err;
+    if (e2 >= dy) { err += dy; x0 += sx; } /* e_xy+e_x > 0 */
+    if (e2 <= dx) { err += dx; y0 += sy; } /* e_xy+e_y < 0 */
+  }
 }
 
+void addElement(int newX, int newY, int newZ, uint8_t newMode){
+    buffer[bufferIndex].x = newX;
+    buffer[bufferIndex].y = newY;
+    buffer[bufferIndex].z = newZ;
+    buffer[bufferIndex].mode = newMode;
 
-void drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2){
-	int deltaX = x2-x1;
-	int deltaY = y2-y1;
-
-	int xdir = deltaX < 0 ? -1 : 1;
-	int ydir = deltaY < 0 ? -1 : 1;
-
-	if(abs(deltaX) > abs(deltaY)){
-		int y=0;
-		for(int x = x1; x != x2; x+=xdir){
-			y = (x - x1) * deltaY / deltaX + y1;
-			goXY(x,y);
-		}
-	}else{
-		int x=0;
-		for(int y = y1; y != y2; y+=ydir){
-			x = (y - y1) * deltaX / deltaY + x1;
-			goXY(x,y);
-		}
-	}
+    bufferIndex++;
 }
 
-void drawChar(char charToDraw, int scale){
-	uint8_t lastx=currentPxX;
-	uint8_t lasty=currentPxY;
-	switch(charToDraw){
-		case '(':
-			goXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY+1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY+1*scale);
-		break;
-		case ')':
-			drawToXY(currentPxX+1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX,currentPxY+1*scale);
-		break;
-		case '0':
-			goXY(currentPxX+2*scale,currentPxY+2*scale);
-			drawToXY(currentPxX-2*scale,currentPxY-2*scale);
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-2*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-		break;
-		case '1':
-			drawToXY(currentPxX+2*scale,currentPxY);
-			goXY(currentPxX-1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY+2*scale);
-			goXY(currentPxX-1*scale,currentPxY);
-		break;
-		case '2':
-			goXY(currentPxX+1*scale,currentPxY+2*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-		break;
-		case '3':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-2*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-			goXY(currentPxX+1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-		break;
-		case '4':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			goXY(currentPxX-1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX,currentPxY-2*scale);
-		break;
-		case '5':
-			goXY(currentPxX+2*scale,currentPxY+2*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX-1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX-1*scale,currentPxY);
-		break;
-		case '6':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX,currentPxY-2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY+1*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-		break;
-		case '7':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-2*scale);
-			goXY(currentPxX-1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-		break;
-		case '8':
-			goXY(currentPxX,currentPxY+1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX-1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX-1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-		break;
-		case '9':
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-		break;
-		case '.': ///DOES NOT SCALE 
-			//goXY(currentPxX+1*scale,currentPxY);
-			goXY(currentPxX+1,currentPxY);
-			goXY(currentPxX+1,currentPxY);
-
-
-			goXY(currentPxX,currentPxY+1);
-			goXY(currentPxX-1,currentPxY);
-			goXY(currentPxX-1,currentPxY);
-
+void terminateBuffer(){
+    buffer[bufferIndex].mode = 255;
 
-			goXY(currentPxX,currentPxY+1);
-			goXY(currentPxX+1,currentPxY);
-			goXY(currentPxX+1,currentPxY);
-
-		break;
-		case ':': ///DOES NOT SCALE 
-			//goXY(currentPxX+1*scale,currentPxY);
-			goXY(currentPxX+1,currentPxY);
-			goXY(currentPxX+1,currentPxY);
-			goXY(currentPxX+1,currentPxY);
-			goXY(currentPxX,currentPxY+1);
-			goXY(currentPxX-1,currentPxY);
-			goXY(currentPxX-1,currentPxY);
-			goXY(currentPxX,currentPxY+1);
-			goXY(currentPxX+1,currentPxY);
-			goXY(currentPxX+1,currentPxY);
-			goXY(currentPxX-2,currentPxY+2);
-			goXY(currentPxX+1,currentPxY);
-			goXY(currentPxX+1,currentPxY);
-			goXY(currentPxX,currentPxY+1);
-			goXY(currentPxX-1,currentPxY);
-			goXY(currentPxX-1,currentPxY);
-			goXY(currentPxX,currentPxY+1);
-			goXY(currentPxX+1,currentPxY);
-			goXY(currentPxX+1,currentPxY);
-			
-		break;
-		case '-':
-			goXY(currentPxX,currentPxY+1*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-		break;
-		case '_':
-			drawToXY(currentPxX+2*scale,currentPxY);
-		break;
-		case '[':
-			goXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-			goXY(currentPxX-1*scale,currentPxY);
-			goXY(currentPxX,currentPxY-2*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-		break;
-		case ']':
-			drawToXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX-1*scale,currentPxY);
-			goXY(currentPxX+1*scale,currentPxY);
-			goXY(currentPxX,currentPxY-1*scale);
-		break;
-		case '$':
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY+1*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY+1*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			goXY(currentPxX-1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-2*scale);
-		break;
-		case 'A':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-2*scale);
-			goXY(currentPxX-2*scale-2, currentPxY+1*scale);
-			drawToXY(currentPxX+2*scale+2,currentPxY);
-		break;
-		
-		case 'B':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-			goXY(currentPxX,currentPxY+1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-		break;
-		case 'C':
-			goXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX-1*scale,currentPxY);
-			drawToXY(currentPxX-1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-		break;
-		case 'D':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX+1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-		break;
-		case 'E':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			goXY(currentPxX-2*scale,currentPxY-1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-			goXY(currentPxX-1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-		break;
-		case 'F':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			goXY(currentPxX-2*scale,currentPxY-1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-		break;		
-		case 'G':
-			goXY(currentPxX+2*scale,currentPxY+2*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-2*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX-1*scale,currentPxY+1*scale);
-		break;
-		case 'H':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			goXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			goXY(currentPxX,currentPxY+1*scale);
-			drawToXY(currentPxX,currentPxY-2*scale);
-		break;
-		case 'I':
-			drawToXY(currentPxX+2*scale,currentPxY);
-			goXY(currentPxX-1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY+2*scale);
-			goXY(currentPxX-1*scale,currentPxY);
-			drawToXY(currentPxX+2*scale,currentPxY);
-		break;
-		case 'J':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX-1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX-1*scale,currentPxY);
-		break;
-		case 'K':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			goXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX-1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY-1*scale);
-		break;
-		case 'L':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX,currentPxY-2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-		break;
-		case 'M':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX,currentPxY-2*scale);
-		break;
-		case 'N':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY-2*scale);
-			drawToXY(currentPxX,currentPxY+2*scale);
-		break;
-		case 'O':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-2*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-		break;
-		case 'P':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-		break;
-		case 'Q':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-2*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-			goXY(currentPxX+1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY-1*scale);
-		break;	
-		case 'R':
-			drawToXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-			goXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX+1*scale,currentPxY-1*scale);
-		break;	
-		case 'S':
-			goXY(currentPxX+2*scale,currentPxY+2*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX-2*scale,currentPxY);
-		break;
-		case 'T':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			goXY(currentPxX-1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-2*scale);
-		break;
-		case 'U':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX,currentPxY-2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY+2*scale);
-		break;
-		case 'V':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX,currentPxY+1*scale);
-		break;
-		case 'W':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX,currentPxY-2*scale);
-			drawToXY(currentPxX+1*scale,currentPxY+1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX,currentPxY+2*scale);
-		break;
-		case 'X':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY-2*scale);
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX-2*scale,currentPxY-2*scale);
-		break;
-		case 'Y':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY+1*scale);
-			goXY(currentPxX-1*scale,currentPxY-1*scale);
-			drawToXY(currentPxX,currentPxY-1*scale);
-		break;
-		case 'Z':
-			goXY(currentPxX,currentPxY+2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-			drawToXY(currentPxX-2*scale,currentPxY-2*scale);
-			drawToXY(currentPxX+2*scale,currentPxY);
-		break;
-		default:
-			drawToXY(currentPxX,currentPxY+1*scale);
-			drawToXY(currentPxX+1*scale,currentPxY);
-			drawToXY(currentPxX,currentPxY-1*scale);
-			drawToXY(currentPxX-1*scale,currentPxY);
-		break;
-
-	}
-	goXY(lastx+3*scale,lasty);
+    bufferIndex=0;
 }
 
-void drawString(const char *str,int size){
-	while(*str!='\0'){
-		drawChar(*str,size);
-		str++;
-	}
-}
 
-void controlChar(uint8_t control){
-	switch(control){
-		case 7://Bell
-			__asm__("nop");
-		break;
-		case 10://LF
-			__asm__("nop");
-		break;
-		case 13://CR
-			cursorX = 0;
-			for(int y=CHARSY-2;y>-1;y--){
-				for(int x=0;x<CHARSX;x++){
-					charBuffer[x][y+1] = charBuffer[x][y];
-				}
-			}
-			for(int x=0;x<CHARSX;x++){
-				loadCharInBuffer(32,x,0,0);
-			}
-		case 127://DEL
-			if(cursorX>0){cursorX--;}
-			loadCharInBuffer(' ',cursorX,cursorY,0);
 
 
-		break;
-	}
-}
 
-void appendChar(uint8_t charToAppend, uint8_t flags){
-	if(cursorX+1>CHARSX){controlChar(13);}
-	loadCharInBuffer(charToAppend, cursorX, cursorY, flags);
-	cursorX++;
-}
 
-void loadCharInBuffer(uint8_t charToLoad, uint8_t xPos, uint8_t yPos, uint8_t flags){
-	uint16_t tmpChar = (flags << 8) | (charToLoad);
-	charBuffer[xPos][yPos] = tmpChar;
-}
 
-void displayCharBuffer(){
-	goXY(2,2);
-	int spaceCounter=0;
-	for(int y=0;y<CHARSY;y++){
-		for(int x=0;x<CHARSX;x++){
-			uint16_t tmpChar = (charBuffer[x][y] & 0xFF);
-			if(tmpChar==32){
-				spaceCounter++;
-			}else{
-				goXY(currentPxX+3*spaceCounter,currentPxY);
-				spaceCounter=0;
-				drawChar((charBuffer[x][y] & 0xFF),3);
-			}
-		}
-		goXY(2,currentPxY+15);
-		spaceCounter=0;
-	}
-}
\ No newline at end of file
diff --git a/draw.h b/draw.h
index 3be3398..5b699af 100644
--- a/draw.h
+++ b/draw.h
@@ -1,36 +1,24 @@
+#include <stdint.h>
 
-void goXY(uint8_t x, uint8_t y);
-
-void drawToXY(uint8_t x, uint8_t y);
-
-void drawRec(uint8_t xbeg, uint8_t ybeg, uint8_t size);
-
-void drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2);
-
-void drawChar(char charToDraw, int scale);
-
-void testPattern(int loop);
+struct polyList{
+	int x;	//relative if draw to and moveto, abs if goto 
+	int y;
+	int z;
+	uint8_t mode; //0=goto 1=drawto 2=moveto 255=terminate 
+};
 
-void uart_write(const char *str);
+void drawBuffer();
 
-void loadCharInBuffer(uint8_t charToLoad, uint8_t xPos, uint8_t yPos, uint8_t flags);
+int abs(int val);
 
-void displayCharBuffer();
-
-void controlChar(uint8_t control);
-
-void appendChar(uint8_t charToAppend, uint8_t flags);
-
-void drawString(const char *str,int size);
-
-void updateBuffer(int rotX, int rotY, int rotZ, float scale);
+void goXY(uint8_t x, uint8_t y);
 
-void updateBufferFast(int rotX, int rotY, int rotZ, int scale);
+void drawLine(int x0, int y0, int x1, int y1);
 
-void initBuffer();
+void addElement(int newX, int newY, int newZ, uint8_t newMode);
 
-void drawPolyList(uint8_t startX, uint8_t startY, uint8_t scale);
+void terminateBuffer();
 
-void getNewPolyList();
+void addJump(int newX, int newY);
 
-//void drawPolyList(uint8_t startX, uint8_t startY, struct polyList listToDraw, uint8_t scale);
+void addDrawTo(int newX, int newY);
\ No newline at end of file
diff --git a/main.c b/main.c
index e2a1e2f..8511e05 100644
--- a/main.c
+++ b/main.c
@@ -2,54 +2,28 @@
 #define F_CPU 16000000
 
 
-
 #include <avr/interrupt.h>
 #include <avr/io.h>
+#include <stdio.h>
 
-#include <draw.h>
-#include <tennis.h>
-#include <pong.h>
-#include <util/delay.h>
-#include <uart.c>
-
-#define _BUFER_SIZE 128      /**< size of receive buffer, must be a power of two */
-
-#define _INC_PTR(ptr) ((ptr + 1) & (_BUFER_SIZE - 1))
-
-static char _bufer[_BUFER_SIZE];
-
-static uint8_t _ptrer; 
 
+#include "draw.h"
+#include <util/delay.h>
+#include "uart.h"
+#include "shapes.h"
+#include "text.h"
+#include "pong.h"
 
+#include <assert.h>
 
 
-uint8_t curCharX = 0;
-uint8_t curCharY = 0;
+#define _BUFER_SIZE 128      /**< size of receive buffer, must be a power of two */
 
+#define _INC_PTR(ptr) ((ptr + 1) & (_BUFER_SIZE - 1))
 
 
 
-void terminal(){
-		displayCharBuffer();
-		char newChar = uart_read();
-			
-		if(newChar!=0){
-			if(newChar==13){controlChar(13);}else{
-				if(newChar==127){controlChar(127);}else{
-					if(newChar==32){appendChar(newChar,0);}else{
-						if(newChar>=32){
-							if(newChar>=97&&newChar<=122){newChar &= 0b11011111;}
-						
-							appendChar(newChar,0);
-						}
-					}
-				}
-			}
-			
-		}
-}
-#define NORMSIN(pos) ((127-sinus[pos])/127.0)
-uint8_t sinus[] = {
+uint8_t sine[] = {
 	0x80,0x82,0x84,0x86,0x88,0x8b,0x8d,0x8f,
 	0x91,0x93,0x96,0x98,0x9a,0x9c,0x9e,0xa0,
 	0xa3,0xa5,0xa7,0xa9,0xab,0xad,0xaf,0xb1,
@@ -97,77 +71,307 @@ uint8_t sinus[] = {
 	0x6e,0x70,0x72,0x74,0x77,0x79,0x7b,0x7d
 };
 
-	static void _main_loop(void){
-	startMenu();
-	while(1){
-	getNewPolyList();
-	goXY(10,50);
+uint8_t cosine[] = {
+	0x0,0x0,
+	0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x2,
+	0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x6,
+	0x6,0x7,0x8,0x8,0x9,0xa,0xb,0xc,
+	0xd,0xe,0xf,0x10,0x11,0x12,0x13,0x15,
+	0x16,0x17,0x18,0x1a,0x1b,0x1c,0x1e,0x1f,
+	0x21,0x22,0x24,0x25,0x27,0x29,0x2a,0x2c,
+	0x2e,0x2f,0x31,0x33,0x35,0x36,0x38,0x3a,
+	0x3c,0x3e,0x40,0x42,0x44,0x46,0x48,0x4a,
+	0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x5a,
+	0x5c,0x5f,0x61,0x63,0x65,0x67,0x69,0x6c,
+	0x6e,0x70,0x72,0x74,0x77,0x79,0x7b,0x7d,
+	0x80,0x82,0x84,0x86,0x88,0x8b,0x8d,0x8f,
+	0x91,0x93,0x96,0x98,0x9a,0x9c,0x9e,0xa0,
+	0xa3,0xa5,0xa7,0xa9,0xab,0xad,0xaf,0xb1,
+	0xb3,0xb5,0xb7,0xb9,0xbb,0xbd,0xbf,0xc1,
+	0xc3,0xc5,0xc7,0xc9,0xca,0xcc,0xce,0xd0,
+	0xd1,0xd3,0xd5,0xd6,0xd8,0xda,0xdb,0xdd,
+	0xde,0xe0,0xe1,0xe3,0xe4,0xe5,0xe7,0xe8,
+	0xe9,0xea,0xec,0xed,0xee,0xef,0xf0,0xf1,
+	0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf7,0xf8,
+	0xf9,0xf9,0xfa,0xfb,0xfb,0xfc,0xfc,0xfd,
+	0xfd,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff,
+	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+	0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfc,0xfc,
+	0xfb,0xfb,0xfa,0xf9,0xf9,0xf8,0xf7,0xf7,
+	0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xef,
+	0xee,0xed,0xec,0xea,0xe9,0xe8,0xe7,0xe5,
+	0xe4,0xe3,0xe1,0xe0,0xde,0xdd,0xdb,0xda,
+	0xd8,0xd6,0xd5,0xd3,0xd1,0xd0,0xce,0xcc,
+	0xca,0xc9,0xc7,0xc5,0xc3,0xc1,0xbf,0xbd,
+	0xbb,0xb9,0xb7,0xb5,0xb3,0xb1,0xaf,0xad,
+	0xab,0xa9,0xa7,0xa5,0xa3,0xa0,0x9e,0x9c,
+	0x9a,0x98,0x96,0x93,0x91,0x8f,0x8d,0x8b,
+	0x88,0x86,0x84,0x82,0x80,0x7d,0x7b,0x79,
+	0x77,0x74,0x72,0x70,0x6e,0x6c,0x69,0x67,
+	0x65,0x63,0x61,0x5f,0x5c,0x5a,0x58,0x56,
+	0x54,0x52,0x50,0x4e,0x4c,0x4a,0x48,0x46,
+	0x44,0x42,0x40,0x3e,0x3c,0x3a,0x38,0x36,
+	0x35,0x33,0x31,0x2f,0x2e,0x2c,0x2a,0x29,
+	0x27,0x25,0x24,0x22,0x21,0x1f,0x1e,0x1c,
+	0x1b,0x1a,0x18,0x17,0x16,0x15,0x13,0x12,
+	0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa,
+	0x9,0x8,0x8,0x7,0x6,0x6,0x5,0x4,
+	0x4,0x3,0x3,0x2,0x2,0x2,0x1,0x1,
+	0x1,0x0,0x0,0x0,0x0,0x0
+};
 
-	int updater=0;
-	uint32_t mani=49;
+struct polyList pyramid[]={
+	{0, 1, 0,0},
+	{1,-1, 1,1},
+	{1,-1,-1,1},
+	{-1,-1,-1,1},
+	{0, 1, 0,1},
+	{1,-1,-1,1},
+	{-1,-1,-1,0},
+	{-1,-1, 1,1},
+	{0, 1, 0,1},
+	{-1,-1, 1,0},
+	{1,-1, 1,1},
+	{0, 0, 0, 255}
+};
+struct polyList pyramidBuffer[40]={};
 
-	
-	int gotbuf=0;
-	updateBuffer((mani*2)%360,(mani*3)%360,(mani*1)%360,1.0*(20+(mani%50)));
-	char buf[15];
-	while(uart_read()!='N'){
-			mani++;
+#define NORMSIN(pos) ((127-sine[pos])/127.0)
+#define NORMCOS(pos) ((127-cosine[pos])/127.0)
 
+uint16_t milCounter=0;
 
-			drawPolyList(127,127,30);
-			goXY(10,10);
-			updateBuffer((mani*2+17)%360,(mani*3+33)%360,(mani*1)%360,50);//60+(10.0*NORMSIN(mani*5%360))
+uint8_t charto=65;
+uint16_t secCounter=0;
+uint8_t blink=0;
+char* buf[10];
 
-			//drawString("FLOAT",5);
-			
+uint8_t hereX=0;
+uint8_t hereY=0;
+
+uint8_t penX=0;
+uint8_t penY=0;
+uint8_t elcount=0;
+
+ISR(INT5_vect){
+	cli();
+	goXY(0,0);
+	_delay_ms(500);
+	getPenPos();
+	if(penX!=0&&penY!=0){
+		if(elcount==0){
+			addElement(penX,penY,0,0);
+		}else{
+			addElement(penX,penY,0,3);
+		}
+		elcount++;
+	}
+	
+	_delay_ms(10);
+	sei();
+	/*
+	sprintf(buf,"x: %d   y: %d\n\r",hereX, hereY);
+	uart_write(buf);
+	addElement(hereX-6,hereY-6,0,0);
+	drawChar('O',6);
+	addElement(0,0,0,0);
+	terminateBuffer();
+	*/
+}
 
-			/*
-			goXY(10,10);
-			drawString("INT",5);
-			*/
 
+ISR(TIMER0_COMPA_vect){
+	milCounter++;
+	if(milCounter%250==0){
+		blink++;
 	}
+	if(milCounter>1000){
+		milCounter=0;
+		secCounter++;
+		charto++;
 	}
 }
-void(* resetFunc) (void) = 0;
 
-void startMenu(){
+
+void startScreen(){
+	while(secCounter<3){
+		addElement(10,200,0,0);
+		drawString("TTY2XY",8);
+		if(blink%2==0){
+			addElement(5*3,0,0,1);
+		}
+		addElement(40,170,0,0);
+		drawString("VERSION 2",5);
+		addElement(20,100,0,0);
+		drawString("0123456789ABCDEFGHIJ",3);
+		addElement(20,90,0,0);
+		drawString("KLMNOPQRSTUVWXYZ",3);
+
+		addElement(0,0,0,0);
+		terminateBuffer();
+		drawBuffer();
+	}
+
+}
+
+void getPenPos(){
+	penX=0;
+	penY=0;
 	while(1){
+		int port=PINB&(1<<PB6);
+		
+		if(port==0){
+			hereY+=1;
+		}else{
+			break;
+		}
 
+		for(int x=0;x<256;x+=1){
+			goXY(x,hereY);
+			for(int i=0;i<5;i++){
+				__asm__("nop");
+			}
+		}
+	}
+	_delay_ms(20);
+	int xTry=0;
 
-		//drawRec(0,0,255);
-		goXY(1,0);
-		drawString("1TERMINAL",6);
-		goXY(1,20);
-		drawString("2TENNIS",6);
-		goXY(1,40);
-		drawString("3PONG",6);
-		goXY(1,60);
-		drawString("43D",6);
+	while(1){
+		int port=PINB&(1<<PB6);
+	
+		if(port==0){
+			hereX+=1;
+			xTry++;
+		}else{
+			break;
+		}
+		if(xTry>2*256){
+			return;
+		}
+		goXY(hereX,hereY);
+		for(int i=0;i<500;i++){
+			__asm__("nop");
+		}
+			
+	}
+		goXY(0,0);
+		penX=hereX;
+		penY=hereY;
+
+		sprintf(buf,"x: %d  y: %d el: %d\n\r", hereX, hereY, elcount);
+		uart_write(buf);
+		_delay_ms(100);
+		hereX=0;
+		hereY=0;
+}
+
+void drawRec(uint8_t posX, uint8_t posY, uint8_t size){
+	addElement(posX,posY,0,0);
+	for(uint8_t i=0; i<size; i++){
+		addElement(posX+size,posY+i,0,3);
+	}
+}
+
+static void _main_loop(void){
+	startScreen();
+	pong();
+	//addElement(0,0,0,0);
 		
+	while(1){
+		addElement(10,70,0,0);
+		drawChar('O',10);
+		addElement(30,70,0,0);
+		drawString("OPTION A",4);
+
+		addElement(10,100,0,0);
+		drawChar('O',10);
+		addElement(30,100,0,0);
+		drawString("OPTION B",4);
+		terminateBuffer();
+
+		if(penY>70&&penY<100){
+			addElement(15,75,0,0);
+			drawChar('X',5);
+		}else if(penY>100&&penY<130){
+			addElement(15,105,0,0);
+			drawChar('X',5);
+		}
+		addElement(0,0,0,0);
 
+		drawBuffer();
+		//_delay_ms(1);
 
-		char newChar = uart_read();
-		if(newChar=='1'){while(1){terminal();}}
-		if(newChar=='2'){tennis();}	
-		if(newChar=='3'){pong();}
-		if(newChar=='4'){break;}
 
+		/*
+		drawBuffer();
+
+		addElement(5,20+i,0,0);
+		for(int i=0;i<20;i++){
+			addElement(5,20+i,0,1);
+		}
+		*/
 
-	}
 
+		/*
+		for(int y=0;y<256;y+=16){
+			hereY=y;
+			for(int x=0;x<256;x+=16){
+				hereX=x;
+				goXY(x,y);
+				for(int i=0;i<500;i++){
+					__asm__("nop");
+				}
+				//_delay_ms(1);
+			}
+		}
+		drawBuffer();
+		_delay_ms(20);
+		*/
+	}
+	
 
 }
 
+void(* resetFunc) (void) = 0;
+
+
+
 int main(void)
 {
 	uart_init();
+	uart_write("\r\n#################\r\n");
 	DDRA = 0xFF;
 	DDRC = 0xFF;
 	DDRL = 0xFF;
+	DDRB = 0x00;
 	goXY(0,0);
 
-	sei();
+
+
+
+	// TIMER 0 for interrupt frequency 1000 Hz:
+	cli(); // stop interrupts
+
+
+ 	EICRB = (1<<ISC50)|(1<<ISC51);
+   	EIMSK = (1<<INT5);
+	
+
+	TCCR0A = 0; // set entire TCCR0A register to 0
+	TCCR0B = 0; // same for TCCR0B
+	TCNT0  = 0; // initialize counter value to 0
+	// set compare match register for 1000 Hz increments
+	OCR0A = 249; // = 16000000 / (64 * 1000) - 1 (must be <256)
+	// turn on CTC mode
+	TCCR0B |= (1 << WGM01);
+	// Set CS02, CS01 and CS00 bits for 64 prescaler
+	TCCR0B |= (0 << CS02) | (1 << CS01) | (1 << CS00);
+	// enable timer compare interrupt
+	TIMSK0 |= (1 << OCIE0A);
+
+	
+	sei(); // allow interrupts
+
 	_main_loop();
 	
 	return 0;
diff --git a/main.hex b/main.hex
new file mode 100644
index 0000000..18bb655
--- /dev/null
+++ b/main.hex
@@ -0,0 +1,519 @@
+:1000000071C0000090C000008EC000008CC00000D5
+:100010008AC0000088C00000A2C1000084C00000A7
+:1000200082C0000080C000007EC000007CC00000D4
+:100030007AC0000078C0000076C0000074C00000E4
+:1000400072C0000070C000006EC000006CC00000F4
+:100050006AC0000069C0000066C0000064C0000003
+:1000600062C000001BC300005EC000005CC0000056
+:100070005AC0000058C0000056C0000054C0000024
+:1000800052C0000050C000004EC000004CC0000034
+:100090004AC0000048C0000046C0000044C0000044
+:1000A00042C0000040C000003EC000003CC0000054
+:1000B0003AC0000038C0000036C0000034C0000064
+:1000C00032C0000030C000002EC000002CC0000074
+:1000D0002AC0000028C0000026C0000024C0000084
+:1000E00022C0000011241FBECFEFD1E2DEBFCDBF82
+:1000F00000E00CBF15E0A0E0B2E0EAEAFCE100E0BD
+:100100000BBF02C007900D92A43AB107D9F725E1C1
+:10011000A4EAB5E001C01D92A439B207E1F70E943C
+:10012000900A0C94130E6CCF0F920FB60F921F9281
+:1001300011242F933F934F935F938F939F938091BD
+:10014000C2059091C30501969093C3058093C205A3
+:1001500045ED58E7849F9001859F300D949F300DA9
+:10016000112420FB3795279537F92730314028F4A3
+:100170002091BF052F5F2093BF05893E934090F0EB
+:100180001092C3051092C2058091C0059091C105DF
+:1001900001969093C1058093C005809100028F5F06
+:1001A000809300029F918F915F914F913F912F918A
+:1001B0001F900F900FBE0F90189534C020E050E0B4
+:1001C00040E06AEA70E088E290E036D265E070E0F4
+:1001D00082E395E00E94350920E050E040E064E6CB
+:1001E00070E084E190E028D263E070E08CE395E079
+:1001F0000E94350920E050E040E06AE570E084E1CB
+:1002000090E01AD263E070E081E595E00E94350944
+:1002100020E050E040E070E060E090E080E00CD250
+:1002200027D2C1D18091C0059091C1050397D8F420
+:1002300020E050E040E068EC70E08AE090E0FCD123
+:1002400068E070E08BE295E00E9435098091BF057F
+:1002500080FDB4CF21E050E040E070E060E08FE04E
+:1002600090E0EAD1ABCF0895CF93DF931092A80529
+:100270001092A7051E9915C06091A9056F5F609344
+:10028000A905C0E003C06091A905CF5F8C2F23D1E1
+:1002900000000000000000000000CF3FA1F71E9BFF
+:1002A000EBCF2FEF89EF90E0215080409040E1F7B5
+:1002B00000C000001E991BC08091AA058F5F80932B
+:1002C000AA05C0E0D2E06091A90505D184EF91E0D4
+:1002D00000000197E9F71E990AC08091AA058F5F77
+:1002E0008093AA05219779F7DF91CF91089560E077
+:1002F00080E0F1D08091AA058093A8059091A9058E
+:100300009093A7052091A6051F922F931F929F936C
+:100310001F928F9382E695E09F938F938BEA95E0EF
+:100320009F938F930E94510B8BEA95E0F0D12FEFB2
+:1003300081EE94E0215080409040E1F700C0000041
+:100340001092AA051092A9058DB79EB70A960FB60E
+:10035000F8949EBF0FBE8DBFDF91CF9108951F927D
+:100360000F920FB60F9211240BB60F922F933F935B
+:100370004F935F936F937F938F939F93AF93BF93AD
+:10038000EF93FF93F89460E080E0A5D02FEF89E62B
+:1003900098E1215080409040E1F700C0000064DF08
+:1003A0008091A805882391F06091A705662371F0DC
+:1003B00070E090E02091A605211122C050E040E0BD
+:1003C0003BD18091A6058F5F8093A6058FE39CE9C2
+:1003D0000197F1F700C000007894FF91EF91BF9171
+:1003E000AF919F918F917F916F915F914F913F91CD
+:1003F0002F910F900BBE0F900FBE0F901F9018956E
+:1004000023E0DCCFEF92FF920F931F93CF93DF9304
+:10041000042FE82EF12CC62FD0E020E050E040E081
+:10042000BE01C70109D1002379F010E0E00EF11EF2
+:100430000C0F1D1F23E050E040E0BE01C701FCD0BF
+:100440002196C017D107B1F7CDB7DEB7E6E00C941F
+:10045000420B2091881430918914F901EE0FFF1F8F
+:10046000EE0FFF1FEE0FFF1FE21BF30BE452F94FDD
+:1004700091838083738362831582148282E08683F2
+:100480002F5F3F4F30938914209388140895209153
+:10049000881430918914F901EE0FFF1FEE0FFF1F32
+:1004A000EE0FFF1FE21BF30BE452F94F91838083A1
+:1004B000738362831582148281E086832F5F3F4FAE
+:1004C0003093891420938814089597FF0895919587
+:1004D000819591090895982F909592B968B9809364
+:1004E0008B1460938A140895B0E0A0E0EAE7F2E08C
+:1004F0000C94210BFC01DB01BA015901481B590B7B
+:1005000057FF03C0519541955109EE24EA94FE2C02
+:10051000E617F7071CF4EE24E394F12C85010A1B7F
+:100520001B0B17FF03C0119501951109CC27DD277F
+:10053000C01BD10BCC24CA94DC2CAA15BB051CF41F
+:10054000CC24C394D12CCA01801B910B07C0801B03
+:10055000910BEE0DFF1D4217530714F59E2E90943C
+:1005600092B8A8B9E617F70779F09C01220F331F5C
+:100570002C173D0764F7840F951FAC0DBD1D92B875
+:10058000A8B9E617F70789F7AA15BB0571F7E09335
+:100590008B14A0938A14CDB7DEB7EBE00C943D0B1F
+:1005A0009E2E9094E8CFCF93DF938091E2068F3F09
+:1005B00049F1CCEDD6E013C060918A1470E08091CF
+:1005C0008B1490E02A813B81260F371F4881598187
+:1005D000480F591F89DF27968E818F3F99F082300F
+:1005E00011F198F48111E8CF8A819881292F209503
+:1005F00022B988B990938B1480938A1427968E81A0
+:100600008F3F69F7DF91CF910895833021F72A81D9
+:100610003B814881598160918A1470E080918B14EC
+:1006200090E062DFD8CF8A8190918A14890F9881F7
+:1006300020918B14920FDACFA0918814B091891475
+:10064000FD01EE0FFF1FEE0FFF1FEE0FFF1FEA1B56
+:10065000FB0BE452F94F918380837383628355834C
+:10066000448326831196B0938914A0938814089527
+:100670008091881490918914FC01EE0FFF1FEE0FFA
+:10068000FF1FEE0FFF1FE81BF90BE452F94F8FEF2E
+:100690008683109289141092881408958F938FB7CF
+:1006A0008F938BB78F939F93EF93FF93F8948091E1
+:1006B000C0008F779927892BB1F09091C600809167
+:1006C0008D14E82FF0E0E257FB4E90838F5F80930C
+:1006D0008D147894FF91EF919F918F918BBF8F91A3
+:1006E0008FBF8F9118958091C600F4CF90918C1494
+:1006F00080918D14891749F0E92FF0E0E257FB4E05
+:1007000080819F5F90938C14089580E00895FC0190
+:100710009081992351F031968091C00085FFFCCFE4
+:100720009093C60091919111F7CF089510928D1476
+:1007300010928C14E5ECF0E080818083E4ECF0E032
+:1007400080818860808388E98093C100E2ECF0E0DA
+:1007500080818660808390E080E00895EF92FF9230
+:100760000F931F93CF93DF93D42FC22FE62EF12C3C
+:10077000082F10E020E050E040E0B701C8015CDF46
+:100780006C2F70E06E197F098D2F90E021E050E012
+:1007900040E0801B910B50DFCDB7DEB7E6E072C7BB
+:1007A000B0E0A0E0E5EDF3E04FC7C42F022FC62E66
+:1007B000D12CE82EF12C20E050E040E0B601C7013A
+:1007C0003BDF20E050E040E0B601C70135DF10E03C
+:1007D000B8016C197D0921E050E040E090E080E034
+:1007E0002BDF20E050E040E0B801C70125DFD0E07A
+:1007F00021E050E040E070E060E0CE018E199F09FA
+:100800001BDF20E050E040E0B801CE0115DFB6016B
+:10081000601B710B21E050E040E090E080E00CDFD5
+:1008200020E050E040E0B601CE0106DF21E050E0DC
+:1008300040E070E060E0C7018C1B9D0BFDDECDB792
+:10084000DEB7E8E01DC770E020E050E040E090E057
+:10085000F3CEEF92FF920F931F93CF93DF93EB01B1
+:10086000E0EEE80FE034C0F0BE0190E080E00FDE83
+:1008700070E060E0CE010BDED195C195D109BE01DB
+:1008800090E080E004DE70E060E0CE0100DECDB7F5
+:10089000DEB7E6E0F7C6E9C40E2E000CFF0B882792
+:1008A000EB5EF14F8F4FBEC670E060E081E090E0FC
+:1008B000D0DD70E060E081E090E0CBDD70E060E0F2
+:1008C00081E090E0C6DD61E070E090E080E0C1DDB5
+:1008D00070E060E08FEF9FEFBCDD70E060E08FEFD5
+:1008E0009FEFB7DD61E070E090E080E0B2DD70E0A6
+:1008F00060E081E090E0ADDD70E060E081E090E0FC
+:10090000A8DD62E070E08EEF9FEFA3DD70E060E0B5
+:1009100081E090E09EDD70E060E081E090E099DDB4
+:1009200061E070E090E080E094DD70E060E08FEFE7
+:100930009FEF8FDD70E060E08FEF9FEF8ADD61E079
+:1009400070E090E080E085DD70E060E081E090E0C4
+:1009500080DD70E060E081E090E07BDD98CF90E0AA
+:1009600080E077DD70E060E0CE01880F991F8FDDB9
+:100970008ECF8B01000F111FB80190E080E087DD62
+:1009800070E060E0C80183DD119501951109B8019F
+:1009900090E080E07CDDBE0190E080E05ADD70E018
+:1009A00060E0C80174DD662777276C1B7D0B90E043
+:1009B00080E04FDD6CCFCC0FDD1FBE01CE0149DDE5
+:1009C000002711270C1B1D0BB801C80160DDBE01FB
+:1009D00090E080E05CDD70E060E0CE0158DDB801C1
+:1009E00090E080E054DD70E060E0C80150DD4FCF62
+:1009F0008B01000F111FB801CE012BDD70E060E00C
+:100A0000CE0145DDD195C195D109BE0190E080E0D0
+:100A10003EDDEE24FF24E01AF10A70E060E0C70139
+:100A200036DDBE0190E080E032DD70E060E0C801BC
+:100A30002EDD70E060E0C7010CDD29CF8B01000FD7
+:100A4000111F70E060E0C80122DDBE0190E080E08F
+:100A50001EDDEE24FF24E01AF10A70E060E0C70119
+:100A600016DDBE0190E080E012DD70E060E0C801BC
+:100A70000EDD70E060E0882799278C1B9D0BE9DC78
+:100A8000B70190E080E003DD02CF8B01000F111F62
+:100A900070E060E0C801FBDCB80190E080E0F7DCCA
+:100AA000EE24FF24E01AF10A70E060E0C701EFDCF9
+:100AB000D195C195D109BE0190E080E0E8DC70E0FD
+:100AC00060E0C801E4DCBE01C701C3DCE0CE8B01FD
+:100AD000000F111FB80190E080E0D9DC70E060E009
+:100AE000C801D5DCEE24FF24E01AF10AB70190E03A
+:100AF00080E0CDDC70E060E0C701C9DCBE0190E0C1
+:100B000080E0A7DC70E060E0C801C1DC66277727E1
+:100B10006C1B7D0BC7019DDCBACE8B01000F111F32
+:100B2000B80190E080E095DC70E060E0C801AFDCE7
+:100B3000119501951109B80190E080E0A8DCEE2440
+:100B4000FF24EC1AFD0ABE01C70183DC70E060E0FF
+:100B5000CE019DDCB701C8017CDC99CE8B01000F72
+:100B6000111FB80190E080E074DCEE24FF24E01A4D
+:100B7000F10AB70190E080E08ADC70E060E0C80133
+:100B800086DCBE0190E080E082DC70E060E0C701BE
+:100B900009CF8B01000F111FB801C8015ADC70E0AA
+:100BA00060E088279927801B910B71DCD195C19556
+:100BB000D109BE0190E080E06ADC70E060E0C8012D
+:100BC00066DCBE01CE015ECE8B01000F111FB801A5
+:100BD00090E080E03EDCEE24FF24EC1AFD0AB70131
+:100BE00090E080E054DC70E060E0C80150DCBE01C1
+:100BF000C7012FDC66277727601B710B90E080E030
+:100C000017CF660F771F90E080E023DC00271127C5
+:100C10000C1B1D0BB801CE013ADCBE01CE0137DC46
+:100C2000B801C80116DCB80190E080E030DC70E06B
+:100C300060E0C8010EDCCDB7DEB7E6E023C515C322
+:100C4000CB0125DCBE0190E080E021DC20CE70E00D
+:100C500060E0CE01FEDBBE0190E080E018DCBE016A
+:100C6000CE0115DC14CE8B01000F111F70E060E087
+:100C7000C8010DDCD195C195D10970E060E0CE01CD
+:100C8000E8DBB80190E080E002DC70E060E0CE01DB
+:100C9000E0DB70E060E0C801FADB88279927801B61
+:100CA000910BBC01D6DBF3CD8B01000F111FB801F6
+:100CB00090E080E0ECDB662777276C1B7D0B90E0F3
+:100CC00080E0C7DB70E060E0C801E1DBBE0190E0DE
+:100CD00080E0BFDB119501951109B80190E080E03B
+:100CE000A5CF8B01000F111FB801C801B2DBEE24A4
+:100CF000FF24E01AF10A70E060E0C701C8DBB70129
+:100D000090E080E0C4DB70E060E0C801C0DB002759
+:100D100011270C1B1D0BBE01C801B9DBB801C801AE
+:100D200098DBB5CD8B01000F111FB80190E080E07A
+:100D3000AEDB70E060E0C801AADBD195C195D109B6
+:100D4000BE01CE0186DB70E060E0CE01A0DBBE011B
+:100D500090E080E07EDB9BCD8B01000F111FB8017E
+:100D600090E080E094DB70E060E0C80190DBEE246E
+:100D7000FF24EC1AFD0A119501951109B701C8016C
+:100D800068DB70E060E0CE0182DBB701CE0161DBA1
+:100D900070E060E0C8017BDB7ACD8B01000F111F92
+:100DA000B80190E080E073DB70E060E0CE016FDBC3
+:100DB000EE24FF24EC1AFD0AB701CE0168DBB7016F
+:100DC00090E080E064DB70E060E088279927801B7A
+:100DD000910B5DDB5CCD8B01000F111F70E060E0BB
+:100DE000C80137DBEE24FF24EC1AFD0A70E060E056
+:100DF000C7014DDBBE01C7014ADBBE01CE0147DBA7
+:100E000070E060E0CE0143DB88279927801B910BBF
+:100E1000BC011FDB3CCD7B01EE0CFF1CB70190E059
+:100E200080E035DB70E060E0CE0131DB0027112788
+:100E30000C1B1D0BB80190E080E029DB70E060E046
+:100E4000C80125DB70E060E0CE0103DB70E060E00C
+:100E5000CE011DDBB80190E080E019DB70E060E0BE
+:100E6000882799278E199F0912DB11CD8B01000F5E
+:100E7000111FB80190E080E00ADB662777276C1B22
+:100E80007D0BCE0104DBBE01CE0101DB1195019586
+:100E90001109B80190E080E0C9CECC0FDD1FBE0182
+:100EA00090E080E0D6DA002711270C1B1D0BB8015B
+:100EB00090E080E0ECDA70E060E0CE01B7CE8B012C
+:100EC000000F111FB80190E080E0E1DA70E060E00F
+:100ED000C801BFDAEE24FF24EC1AFD0AB701C701EE
+:100EE000D6DAB701CE01D3DA70E060E0882799271F
+:100EF000801B910BAEDACBCC8B01000F111FB80118
+:100F000090E080E0A6DA70E060E0C801C0DAD19538
+:100F1000C195D109BE0190E080E0B9DABE01CE01F1
+:100F2000B1CC8B01000F111FB80190E080E091DA85
+:100F300070E060E0C801ABDA119501951109B801C4
+:100F400090E080E0A4DA70E060E0C801A0DABE01C1
+:100F5000CE017FDA70E060E0CE0199DA662777276C
+:100F60006C1B7D0BC80175DA92CC8B01000F111F31
+:100F7000B80190E080E08BDA70E060E0C80187DAC9
+:100F8000D195C195D109BE0190E080E080DA70E092
+:100F900060E088279927801B910BD8CECC0FDD1FEE
+:100FA00063CCCC0FDD1FBE0190E080E070DA00273B
+:100FB00011270C1B1D0BB801CE0169DABE0190E0B0
+:100FC00080E065DAB801C80144DA61CCCC0FDD1FDE
+:100FD000BE0190E080E03DDA002711270C1B1D0BBD
+:100FE000B80190E080E053DA70E060E0CE014FDAC3
+:100FF000BE01E5CF8B01000F111FB80190E080E02A
+:1010000028DA70E060E0C80142DAD195C195D109D3
+:1010100070E060E0CE011DDA66277727601B710B58
+:1010200090E080E034DA70E060E0CE0112DA2FCC9C
+:101030008B01000F111FB801C8010BDAEE24FF2449
+:10104000E01AF10A70E060E0C70121DAD195C1959C
+:10105000D109BE0190E080E01ADA70E060E0C801DA
+:1010600016DABE0190E080E012DA70E060E0C701BD
+:101070000EDA0DCC8B01000F111FB80190E080E05B
+:1010800006DA70E060E0C80102DAEE24FF24EC1A10
+:10109000FD0AB70190E080E0FAD911950195110998
+:1010A00070E060E0C801F3D970E060E0CE01D1D912
+:1010B000B701CE01BBCD8B01000F111FB80190E02D
+:1010C00080E0E5D970E060E0C801E1D911950195B3
+:1010D0001109B80190E080E0DAD970E060E0C80161
+:1010E000D6D9BE01CE01B5D9662777276C1B7D0BFB
+:1010F000CE019CCD70E060E0CE01C9D9BE01660F83
+:10110000771F90E080E0C3D9002711270C1B1D0B2F
+:1011100070E060E0C801BBD970E060E0CE0199D911
+:10112000B80190E080E095D9B2CB70E060E0CE01EC
+:1011300090D98E01000F111FB80190E080E0A7D96F
+:1011400070E060E0CE01A3D970E060E088279927C5
+:101150008C1B9D0B7ED966277727601B710B90E057
+:1011600080E077D970E060E0CE0191D990CBCC0FD0
+:10117000DD1FBE0190E080E06CD970E060E0CE0140
+:1011800086D9002711270C1B1D0BB801C80192CE70
+:101190008B01000F111F70E060E0C80178D9D19574
+:1011A000C195D10970E060E0CE0153D9B80190E05B
+:1011B00080E06DD970E060E0CE0169D966277727BD
+:1011C000601B710B90E080E044D961CBCC0FDD1F38
+:1011D000BE0190E080E03DD9002711270C1B1D0BBC
+:1011E000B801CE0154D9BE0190E080E032D9B801F7
+:1011F000C8014DD94CCB7B01EE0CFF1CB70190E030
+:1012000080E027D9002711270E191F09B80190E0A7
+:1012100080E03DD9BE01CE013AD9662777276C1B05
+:101220007D0BCE0134D9B701CACE8B01000F111F3F
+:10123000B80190E080E00DD9EE24FF24EC1AFD0AFD
+:10124000B70190E080E023D9B701CE0120D9BE01DB
+:10125000CE011DD9BE0190E080E019D988279927D9
+:10126000801B910BBC01F5D812CBEF92FF920F932C
+:101270001F93CF93DF93EC018B018881882379F052
+:101280007B01EE0CFF1CEE0CFF1C2196B801E1DA8D
+:1012900070E060E0C701DDD889918111F7CFCDB74B
+:1012A000DEB7E6E0EFC19C01CA012417350724F43C
+:1012B000C901261737070CF00895CB010895860F52
+:1012C000971F8F3F910524F4823091051CF00895FB
+:1012D0008FEF089581E0089580912A056091290596
+:1012E000262F30E0509126058F3F09F463C08230ED
+:1012F000B0F5E0912805F0E05195DF0153972A17EA
+:101300003B072CF07396E217F3070CF07DC0809139
+:101310009015909191150196909391158093901549
+:101320005093260540912505852F550F990B805C1C
+:101330009F4F2FE730E0823091050CF463C080931B
+:101340002A05240F311D47FD3A952F3F31050CF03A
+:1013500055C02230310554F120932905089590E0BD
+:1013600040912505603F60F0419540932505850F2C
+:10137000911D57FD9A958F3F9105ECF28FEFDFCFCE
+:101380006B30A8F7850F911D57FD9A9541954093B5
+:1013900025058F3F91057CF2240F311D47FD3A95BD
+:1013A0008FEF80932A0522303105B4F621E0209397
+:1013B000290508958091270590E05195FC017397C8
+:1013C0002E173F074CF04396821793072CF050934B
+:1013D00026058FEF90E0C4CF8091921590919315E0
+:1013E0000196909393158093921550932605409102
+:1013F00025052FE730E080EC90E0B9CF2FEF209368
+:101400002905089581E09BCF5093260590E0A8CF51
+:10141000AFE0B0E0EDE0FAE01DC16091280570E0BA
+:101420009B012C5E3F4F6451710950E040E090E019
+:1014300080E094D920E050E040E068EC70E080E487
+:1014400090E0FAD8809193158F93809192158F93A5
+:1014500080EA95E09F938F93CE0101969F938F939F
+:1014600020D12FEF30E040E850E070E060E080E80D
+:1014700090E074D96091270570E09B012C5E3F4F8E
+:10148000645171094FEF50E08FEF90E067D96091A0
+:10149000290570E080912A0590E0D5D9E9D883D854
+:1014A0008FE99FE00197F1F700C000000F900F90C7
+:1014B0000F900F900F900F902F96E2E0E7C01092E0
+:1014C0008F1510928E151CC0843351F4809127051E
+:1014D00090E044968C3E91050CF08BEE80932705AE
+:1014E0008091290590E08431910514F484E190E025
+:1014F0008C3E91050CF08BEE80932805EDDE88DFA5
+:10150000F5D8813309F720912705422F4451550B17
+:10151000CA012F3F19F34431510504F784E1DECFAE
+:1015200005D988E795E0F3D88FEF81B987B9809323
+:101530000A0114B860E080E00E946B02F8948CE02D
+:1015400080936A0080E28DBB14BC15BC16BC89EF89
+:1015500087BD85B5826085BD85B5836085BD809179
+:101560006E00826080936E0078940E94DD00A7DF99
+:1015700015C020E050E040E06BE470E08FE090E0C8
+:101580005BD865E070E088E564D920E050E040E099
+:1015900070E060E090E080E04FD805D820E050E0B7
+:1015A00040E066E470E08AE090E046D86AE070E0EF
+:1015B0008FE44FD920E050E040E066E470E08EE137
+:1015C00090E03AD864E070E08EE895E04EDE20E0EE
+:1015D00050E040E064E670E08AE090E02DD86AE0F8
+:1015E00070E08FE436D920E050E040E064E670E03F
+:1015F0008EE190E021D864E070E087E995E035DE87
+:1016000037D88091A70599EB980F9D3108F4B1CF99
+:1016100085568D3108F0B9CF20E050E040E069E612
+:1016200070E0ACCFEE0FFF1F881F8BBF0790F691C5
+:10163000E02D19942F923F924F925F926F927F927A
+:101640008F929F92AF92BF92CF92DF92EF92FF92D2
+:101650000F931F93CF93DF93CDB7DEB7CA1BDB0B7E
+:101660000FB6F894DEBF0FBECDBF19942A88398813
+:1016700048885F846E847D848C849B84AA84B9842A
+:10168000C884DF80EE80FD800C811B81AA81B98136
+:10169000CE0FD11D0FB6F894DEBF0FBECDBFED014A
+:1016A00008950F931F93CF93DF93CDB7DEB72E9797
+:1016B0000FB6F894DEBF0FBECDBF0E891F8986E03E
+:1016C0008C831A8309838FEF9FE79E838D83AE01FE
+:1016D000465E5F4F688D798DCE01019611D02F81C6
+:1016E0003885020F131FF80110822E960FB6F8945A
+:1016F000DEBF0FBECDBFDF91CF911F910F91089537
+:101700002F923F924F925F926F927F928F929F9211
+:10171000AF92BF92CF92DF92EF92FF920F931F93FF
+:10172000CF93DF93CDB7DEB72F970FB6F894DEBF18
+:101730000FBECDBF7C013B018A01DC0117961C92D4
+:101740001E92169713968C9181FFC6C19AE0292E9E
+:10175000FE0131964F01D70113969C91F30193FD41
+:10176000859193FF81913F01882309F43AC1853225
+:1017700039F493FD859193FF81913F01853221F4E6
+:10178000B70190E0C2D1E7CFB12C412C512CBFE181
+:10179000B51538F08B3209F188F4803201F18332CB
+:1017A00021F157FC3AC020ED280F2A3040F556FEB3
+:1017B0001FC0B29C200D1124B22E06C08D3291F0B4
+:1017C000803379F7689450F8F30193FD859193FF86
+:1017D00081913F018111DBCF20C0689451F868945A
+:1017E00052F8F2CF689453F8EFCF689454F8ECCFE6
+:1017F000429C200D1124422E689455F8E5CF8E327C
+:1018000029F456FCEEC0689456F8DECF8C3619F4F5
+:10181000689457F8D9CF8836B9F2982F9F7D9554A0
+:101820009330B8F0833671F1833791F1833509F045
+:1018300056C0D801CD90DD908D016B2D70E056FC27
+:1018400002C06FEF7FEFC6014AD15C01689457F880
+:101850000AC00C5F1F4FEFE3E983AA24A394B12CC5
+:101860006401E89457F853FE26C0342CA114B10447
+:1018700039F5332009F46FCFB70180E290E045D10C
+:101880003A94F7CFD8018C9189830E5F1F4FE5CF33
+:10189000F801C190D1908F016B2D70E056FC02C011
+:1018A0006FEF7FEFC60126D15C01DBCFB70180E28D
+:1018B00090E02BD14A944A141B0409F0B8F7D5CF15
+:1018C000F60157FC859157FE81916F01B70190E0B9
+:1018D0001CD131103A94B1E0AB1AB108C7CF8436AD
+:1018E00019F0893609F06DC0F80157FE63C06191A7
+:1018F0007191819191918F01E52DEF76DE2E97FF09
+:1019000009C090958095709561957F4F8F4F9F4F3F
+:101910006894D7F82AE030E0A40127D1C82EC8186F
+:10192000AC2C5D2CD6FE0CC0E89450F8CB1440F4DF
+:10193000D4FE05C0D2FC03C05D2D5E7E552EAB2CBF
+:1019400054FEA4C0FE01EC0DF11D8081803309F02E
+:1019500096C0652D697E562E752D7870372E53FCF6
+:10196000A3C050FE9DC0BC2CA41410F4B40CBA1833
+:1019700054FEA0C0B70180E390E0C7D052FE06C07D
+:1019800088E751FC88E590E0B701BFD0CB1408F49C
+:101990009DC0CA94D12C8FEFC81AD80AC80CD91C84
+:1019A000D6018E916D01B70190E0AFD08C149D04EB
+:1019B000B9F75FCF61917191072E000C880B990BDD
+:1019C0009ACFD52CE894D4F82AE08537D1F1F52DBB
+:1019D000F97FDF2E803749F100F5883549F18F36E0
+:1019E00079F1F701868197812F960FB6F894DEBFC3
+:1019F0000FBECDBFDF91CF911F910F91FF90EF9060
+:101A0000DF90CF90BF90AF909F908F907F906F901E
+:101A10005F904F903F902F900895883711F7D4FE34
+:101A200002C06894D2F820E10CC06894D4F8F7CFD3
+:101A300054FE03C02F2F2660D22E20E132E002C0D8
+:101A400028E030E0F801D7FE14C041915191619136
+:101A500071914C875D876E877F878F01A4016C85AC
+:101A60007D858E859F8581D0C82EC818E894D7F8CB
+:101A700057CF81919191AC0170E060E0EACF52FCC8
+:101A800002C0A39469CFA394A39466CF852D8678D2
+:101A900009F462CFF6CFB70180E290E036D0A3948C
+:101AA000A414C8F3312C64CF342C3A18A41408F4CD
+:101AB0005FCFF8CF852D867809F468CF8BE251FE91
+:101AC00080E257FC8DE2B70190E05FCFB70180E381
+:101AD00090E01BD0BA945ACF8FEF9FEF85CFFC01D7
+:101AE0000590615070400110D8F7809590958E0F49
+:101AF0009F1F0895FC016150704001900110D8F7BC
+:101B0000809590958E0F9F1F08950F931F93CF93ED
+:101B1000DF93182F092FEB018B8181FD09C01FEF87
+:101B20000FEF812F902FDF91CF911F910F9108958B
+:101B300082FF14C02E813F818C819D812817390737
+:101B40003CF4E881F981CF01019699838883108361
+:101B50008E819F8101969F838E83E3CFE885F985EF
+:101B6000812F1995892BA1F3DACFFA01AA27283002
+:101B700051F1203181F1E8946F936E7F6E5F7F4F5A
+:101B80008F4F9F4FAF4FB1E03ED0B4E03CD0670FD6
+:101B9000781F891F9A1FA11D680F791F8A1F911D29
+:101BA000A11D6A0F711D811D911DA11D20D009F479
+:101BB00068943F912AE0269F11243019305D3193BB
+:101BC000DEF6CF010895462F4770405D4193B3E0A4
+:101BD0000FD0C9F7F6CF462F4F70405D4A3318F04B
+:101BE000495D31FD4052419302D0A9F7EACFB4E0FC
+:101BF000A6959795879577956795BA95C9F70097B4
+:101C00006105710508959B01AC010A2E0694579554
+:101C1000479537952795BA95C9F7620F731F841FAB
+:101C2000951FA01D0895F894FFCF47043404340491
+:101C300034041E0534043404340427062006340416
+:101C400034043404AF0486043404DB04C808F80404
+:101C50009107E405C905AE058D05670545055404E2
+:101C6000340434043404340434043404B9040B0755
+:101C7000EB06CD06AC0692067106540633067C07C9
+:101C80005F074D073607D107CE07B5075B083A084F
+:101C90001808FA07E6071509FB08E6080106B70861
+:0A1CA000950834047A083404B204F5
+:101CAA0041000001000000000100FFFF01000101E6
+:101CBA0000FFFFFFFF01FFFFFFFFFFFF0100000121
+:101CCA00000000010100FFFFFFFF01FFFFFFFFFF10
+:101CDA00FF00FFFFFFFF01000100000100000001FB
+:101CEA00FFFFFFFF0100000100FFFF0100010000EC
+:101CFA0000000000FF0000000000000101010202D4
+:101D0A000203030404050606070808090A0B0C0D5A
+:101D1A000E0F10111213151617181A1B1C1E1F214D
+:101D2A0022242527292A2C2E2F31333536383A3CBE
+:101D3A003E40424446484A4C4E50525456585A5CC9
+:101D4A005F61636567696C6E70727477797B7D8099
+:101D5A00828486888B8D8F919396989A9C9EA0A355
+:101D6A00A5A7A9ABADAFB1B3B5B7B9BBBDBFC1C329
+:101D7A00C5C7C9CACCCED0D1D3D5D6D8DADBDDDE39
+:101D8A00E0E1E3E4E5E7E8E9EAECEDEEEFF0F1F2B1
+:101D9A00F3F4F5F6F7F7F8F9F9FAFBFBFCFCFDFDAD
+:101DAA00FDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFE3F
+:101DBA00FEFEFDFDFDFCFCFBFBFAF9F9F8F7F7F670
+:101DCA00F5F4F3F2F1F0EFEEEDECEAE9E8E7E5E439
+:101DDA00E3E1E0DEDDDBDAD8D6D5D3D1D0CECCCA8A
+:101DEA00C9C7C5C3C1BFBDBBB9B7B5B3B1AFADAB49
+:101DFA00A9A7A5A3A09E9C9A989693918F8D8B884C
+:101E0A00868482807D7B79777472706E6C6967656F
+:101E1A0063615F5C5A58565452504E4C4A48464485
+:101E2A0042403E3C3A38363533312F2E2C2A292768
+:101E3A00252422211F1E1C1B1A18171615131211EE
+:101E4A00100F0E0D0C0B0A090808070606050404F4
+:101E5A0003030202020101010000000000808284E3
+:101E6A0086888B8D8F919396989A9C9EA0A3A5A7FE
+:101E7A00A9ABADAFB1B3B5B7B9BBBDBFC1C3C5C7D8
+:101E8A00C9CACCCED0D1D3D5D6D8DADBDDDEE0E1F3
+:101E9A00E3E4E5E7E8E9EAECEDEEEFF0F1F2F3F47A
+:101EAA00F5F6F7F7F8F9F9FAFBFBFCFCFDFDFDFE88
+:101EBA00FEFEFFFFFFFFFFFFFFFFFFFFFFFEFEFE2D
+:101ECA00FDFDFDFCFCFBFBFAF9F9F8F7F7F6F5F472
+:101EDA00F3F2F1F0EFEEEDECEAE9E8E7E5E4E3E14D
+:101EEA00E0DEDDDBDAD8D6D5D3D1D0CECCCAC9C7AD
+:101EFA00C5C3C1BFBDBBB9B7B5B3B1AFADABA9A778
+:101F0A00A5A3A09E9C9A989693918F8D8B88868480
+:101F1A0082807D7B79777472706E6C6967656361A4
+:101F2A005F5C5A58565452504E4C4A4846444240B6
+:101F3A003E3C3A38363533312F2E2C2A2927252490
+:101F4A0022211F1E1C1B1A18171615131211100F07
+:101F5A000E0D0C0B0A0908080706060504040303FC
+:101F6A00020202010101000000000000000000005E
+:101F7A000001010102020203030404050606070820
+:101F8A0008090A0B0C0D0E0F10111213151617184B
+:101F9A001A1B1C1E1F2122242527292A2C2E2F31E9
+:101FAA00333536383A3C3E40424446484A4C4E5015
+:101FBA00525456585A5C5F61636567696C6E7072F9
+:101FCA007477797B7D01011414327F545459325845
+:101FDA00590056455253494F4E2032003031323360
+:101FEA003435363738394142434445464748494AE9
+:101FFA00004B4C4D4E4F5051525354555657585909
+:10200A005A00783A2025642020793A2025642065F0
+:10201A006C3A2025640A0D000D0A23232323232367
+:10202A0023232323232323232323230D0A004F506F
+:10203A0054494F4E2041004F5054494F4E204200C0
+:04204A002564000009
+:00000001FF
diff --git a/poly b/poly
new file mode 100644
index 0000000..5191137
--- /dev/null
+++ b/poly
@@ -0,0 +1,12 @@
+4 0, 1, 0,1,
+ 1,-1, 1,1,
+ 1,-1,-1,1,
+-1,-1,-1,1,
+ 0, 1, 0,1,
+ 1,-1,-1,1,
+-1,-1,-1,0,
+-1,-1, 1,1,
+ 0, 1, 0,1,
+-1,-1, 1,0,
+ 1,-1, 1,1,
+ 0,0,0,255,
diff --git a/pong.c b/pong.c
index 30fbf65..c14f039 100644
--- a/pong.c
+++ b/pong.c
@@ -21,6 +21,28 @@ uint8_t paddelR=20;
 int8_t pongBallSpeedX=1;
 int8_t pongBallSpeedY=1;
 
+int clamp(int in, int min, int max){
+    if(in>=max){
+        return max;
+    }
+    if(in<=min){
+        return min;
+    }
+    return in;
+}
+
+uint8_t satAdd(int a, int b){
+    int res = a + b;
+    if(res>=255){
+        return 255;
+    }
+    if(res<=1){
+        return 1;
+    }
+    return res;
+}
+
+
 
 void pongPhy(){
 
@@ -65,25 +87,25 @@ void pongPhy(){
 
 void renderPong(){
     char buf[15];
-    goXY(0,paddelL-PADDLELENG);
-    drawToXY(0,paddelL+PADDLELENG);
+    addLine(0,paddelL-PADDLELENG,0,paddelL+PADDLELENG);
 
-    goXY(64,200);
+    addElement(64,200,0,0);
+    
     sprintf(buf,"%d",scoreL);
-    drawString(buf,10);
-
-    goXY(128,0);
-	drawToXY(128,255);
-
-    goXY(255,paddelR-PADDLELENG);
-    drawToXY(255,paddelR+PADDLELENG);
+    //drawString(buf,10);
     
+    addLine(128,0,128,255);
+
+    addLine(255,paddelR-PADDLELENG,255,paddelR+PADDLELENG);
+    /*
     goXY(192-20,200);
     sprintf(buf,"%d",scoreR);
     drawString(buf,10);
+    */
 
-    goXY(pongBallX,pongBallY);
-    //drawString("MOIN",3);
+    addDot(pongBallX,pongBallY);
+    terminateBuffer();
+    drawBuffer();
     _delay_ms(1);
 
 
@@ -99,15 +121,21 @@ void pong(){
         char tmpChar= uart_read();
         if(tmpChar=='1'){paddelR=clamp(paddelR-20,PADDLELENG,255-PADDLELENG);}
         if(tmpChar=='4'){paddelR=clamp(paddelR+20,PADDLELENG,255-PADDLELENG);}
-
+        /*
         if(tmpChar=='z'){paddelL=clamp(paddelL-20,PADDLELENG,255-PADDLELENG);}
         if(tmpChar=='a'){paddelL=clamp(paddelL+20,PADDLELENG,255-PADDLELENG);}
+        */
+        paddelL=clamp(pongBallY,PADDLELENG,255-PADDLELENG);
 
+        /*
         pongTick++;
-        if(pongTick>=4){
+        
+        if(pongTick>=1){
 			pongPhy();
 			pongTick=0;
 		}
+        */
+        pongPhy();
         renderPong();
     }
 
diff --git a/shapes.c b/shapes.c
new file mode 100644
index 0000000..bfe95b7
--- /dev/null
+++ b/shapes.c
@@ -0,0 +1,19 @@
+#include "draw.h"
+#include "shapes.h"
+
+void addLine(uint8_t startX, uint8_t startY, uint8_t endX, uint8_t endY){
+    addElement(startX, startY, 0, 0);
+    addElement(endX-startX, endY-startY, 0, 1);
+}
+
+void addRectangle(uint8_t startX, uint8_t startY, uint8_t endX, uint8_t endY){
+    addElement(startX, startY, 0, 0);
+    addLine(startX,startY,startX,endY);
+    addLine(startX,endY,endX,endY);
+    addLine(endX,endY,endX,startY);
+    addLine(endX,startY,startX,startY);
+}
+
+void addDot(uint8_t posX, uint8_t posY){
+    addElement(posX,posY,0,0);
+}
\ No newline at end of file
diff --git a/shapes.h b/shapes.h
new file mode 100644
index 0000000..2d06309
--- /dev/null
+++ b/shapes.h
@@ -0,0 +1,5 @@
+void addLine(uint8_t startX, uint8_t startY, uint8_t endX, uint8_t endY);
+
+void addRectangle(uint8_t startX, uint8_t startY, uint8_t endX, uint8_t endY);
+
+void addDot(uint8_t posX, uint8_t posY);
\ No newline at end of file
diff --git a/stl.c b/stl.c
new file mode 100644
index 0000000..03242a9
--- /dev/null
+++ b/stl.c
@@ -0,0 +1,69 @@
+void updateBufferFast(int rotX, int rotY, int rotZ, float scale){
+
+	int ListPointer=0;
+    int oldMode = pyramid[ListPointer].mode;
+	float xfactor1 = scale * NORMCOS(rotY) * NORMCOS(rotZ);
+	float xfactor2 = scale * NORMSIN(rotY);
+	float xfactor3 = scale * NORMCOS(rotY) * NORMSIN(rotZ);
+
+	float yfactor1 = scale * NORMCOS(rotY) * NORMSIN(rotX);
+	float yfactor2 = scale * (NORMCOS(rotZ) * NORMSIN(rotX) * NORMSIN(rotY) + NORMCOS(rotX) * NORMSIN(rotZ));
+	float yfactor3 = scale * (NORMCOS(rotX) * NORMCOS(rotZ) - NORMSIN(rotX) * NORMSIN(rotY) * NORMSIN(rotZ));
+
+	while(oldMode != 255){
+		float oldX = pyramid[ListPointer].x;
+		float oldY = pyramid[ListPointer].y;
+		float oldZ = pyramid[ListPointer].z;
+		oldMode = pyramid[ListPointer].mode;
+        //printf("ListPointer= %d, mode= %d\n",ListPointer,oldMode);
+		pyramidBuffer[ListPointer].x = (oldX * xfactor1) + (oldZ * xfactor2) - (oldY * xfactor3);
+
+		pyramidBuffer[ListPointer].y = (-oldZ * yfactor1) + (oldX * yfactor2) + (oldY * yfactor3);
+		
+		pyramidBuffer[ListPointer].mode = oldMode;
+		ListPointer++;
+	}
+	pyramidBuffer[ListPointer] = pyramid[ListPointer];
+}
+
+void updateBuffer(int rotX, int rotY, int rotZ, float scale){
+
+	int ListPointer=0;
+    int oldMode = pyramid[ListPointer].mode;
+	while(oldMode != 255){
+		float oldX = pyramid[ListPointer].x;
+		float oldY = pyramid[ListPointer].y;
+		float oldZ = pyramid[ListPointer].z;
+		oldMode = pyramid[ListPointer].mode;
+        //printf("ListPointer= %d, mode= %d\n",ListPointer,oldMode);
+		pyramidBuffer[ListPointer].x =
+			(scale *  oldX * NORMCOS(rotY) * NORMCOS(rotZ)) + 
+			(scale *  oldZ * NORMSIN(rotY)) -
+			(scale *  oldY * NORMCOS(rotY) * NORMSIN(rotZ));
+
+		pyramidBuffer[ListPointer].y =
+			(scale * -oldZ * NORMCOS(rotY) * NORMSIN(rotX)) + 
+			(scale *  oldX * (NORMCOS(rotZ) * NORMSIN(rotX) * NORMSIN(rotY) + NORMCOS(rotX) * NORMSIN(rotZ))) + 
+			(scale *  oldY * (NORMCOS(rotX) * NORMCOS(rotZ) - NORMSIN(rotX) * NORMSIN(rotY) * NORMSIN(rotZ))) ;
+		
+		pyramidBuffer[ListPointer].mode = oldMode;
+		ListPointer++;
+	}
+	pyramidBuffer[ListPointer] = pyramid[ListPointer];
+}
+
+
+void foo(int offx, int offy){
+	uint16_t ListPointer = 0;
+	while(pyramidBuffer[ListPointer].mode != 255){
+		switch(pyramidBuffer[ListPointer].mode){
+			case 0://goto
+				addElement(offx + 127+pyramidBuffer[ListPointer].x,offy + 127+pyramidBuffer[ListPointer].y,127+pyramidBuffer[ListPointer].z,0);
+			break;
+			case 1://drawto
+				addElement(offx + 127+pyramidBuffer[ListPointer].x,offy + 127+pyramidBuffer[ListPointer].y,127+pyramidBuffer[ListPointer].z,3);		
+			break;
+		}
+		ListPointer++;
+	}
+}
\ No newline at end of file
diff --git a/text.c b/text.c
new file mode 100644
index 0000000..494fd22
--- /dev/null
+++ b/text.c
@@ -0,0 +1,439 @@
+#include <stdint.h>
+#include "draw.h"
+
+void drawChar(char charToDraw, int scale){
+	switch(charToDraw){
+		case '(':
+			addJump(1*scale,0);
+			addDrawTo(0,1*scale);
+			addDrawTo(1*scale,1*scale);
+		break;
+		case ')':
+			addDrawTo(1*scale,1*scale);
+			addDrawTo(0,1*scale);
+		break;
+		case '0':
+			addJump(2*scale,2*scale);
+			addDrawTo(-2*scale,-2*scale);
+			addDrawTo(0,2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,-2*scale);
+			addDrawTo(-2*scale,0);
+		break;
+		case '1':
+			addDrawTo(2*scale,0);
+			addJump(-1*scale,0);
+			addDrawTo(0,2*scale);
+			addDrawTo(-1*scale,0);
+			addJump(0,-2*scale);
+		break;
+		case '2':
+			addJump(1*scale,2*scale);
+			addDrawTo(1*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(-2*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(2*scale,0);
+			addJump(-2*scale,0);
+		break;
+		case '3':
+			addJump(0,2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,-2*scale);
+			addDrawTo(-2*scale,0);
+			addJump(1*scale,1*scale);
+			addDrawTo(1*scale,0);
+			addJump(-2*scale,-1*scale);
+		break;
+		case '4':
+			addJump(0,2*scale);
+			addDrawTo(0,-1*scale);
+			addDrawTo(2*scale,0);
+			addJump(-1*scale,1*scale);
+			addDrawTo(0,-2*scale);
+			addJump(-1*scale,0);
+		break;
+		case '5':
+			addJump(2*scale,2*scale);
+			addDrawTo(-2*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(-1*scale,-1*scale);
+			addDrawTo(-1*scale,0);
+		break;
+		case '6':
+			addJump(0,2*scale);
+			addDrawTo(0,-2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,1*scale);
+			addDrawTo(-2*scale,0);
+			addJump(0,-1*scale);
+		break;
+		case '7':
+			addJump(0,2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,-2*scale);
+			addJump(-1*scale,1*scale);
+			addDrawTo(1*scale,0);
+			addJump(-2*scale,-1*scale);
+		break;
+		case '8':
+			addDrawTo(0,2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,-2*scale);
+			addDrawTo(-2*scale,0);
+			addJump(0,1*scale);
+			addDrawTo(2*scale,0);
+			addJump(-2*scale,-1*scale);
+		break;
+		case '9':
+			addDrawTo(2*scale,0);
+			addDrawTo(0,2*scale);
+			addDrawTo(-2*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(2*scale,0);
+			addJump(-2*scale,-1*scale);
+		break;
+		case '.': ///DOES NOT SCALE 
+			//addJump(1*scale,0);
+			addJump(1,0);
+			addJump(1,0);
+
+
+			addJump(0,1);
+			addJump(-1,0);
+			addJump(-1,0);
+
+
+			addJump(0,1);
+			addJump(1,0);
+			addJump(1,0);
+
+		break;
+		case ':': ///DOES NOT SCALE 
+			//addJump(1*scale,0);
+			addJump(1,0);
+			addJump(1,0);
+			addJump(1,0);
+			addJump(0,1);
+			addJump(-1,0);
+			addJump(-1,0);
+			addJump(0,1);
+			addJump(1,0);
+			addJump(1,0);
+			addJump(-2,2);
+			addJump(1,0);
+			addJump(1,0);
+			addJump(0,1);
+			addJump(-1,0);
+			addJump(-1,0);
+			addJump(0,1);
+			addJump(1,0);
+			addJump(1,0);
+			
+		break;
+		case '-':
+			addJump(0,1*scale);
+			addDrawTo(2*scale,0);
+		break;
+		case '_':
+			addDrawTo(2*scale,0);
+		break;
+		case '[':
+			addJump(1*scale,0);
+			addDrawTo(0,2*scale);
+			addDrawTo(1*scale,0);
+			addJump(-1*scale,0);
+			addJump(0,-2*scale);
+			addDrawTo(1*scale,0);
+		break;
+		case ']':
+			addDrawTo(1*scale,0);
+			addDrawTo(0,2*scale);
+			addDrawTo(-1*scale,0);
+			addJump(1*scale,0);
+			addJump(0,-1*scale);
+		break;
+		case '$':
+			addDrawTo(2*scale,0);
+			addDrawTo(0,1*scale);
+			addDrawTo(-2*scale,0);
+			addDrawTo(0,1*scale);
+			addDrawTo(2*scale,0);
+			addJump(-1*scale,0);
+			addDrawTo(0,-2*scale);
+		break;
+		case 'A':
+			addDrawTo(0,2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,-2*scale);
+			addJump(0,1*scale);
+			addDrawTo(-2*scale,0);
+			addJump(0,-1*scale);
+		break;
+		case 'B':
+			addDrawTo(0,2*scale);
+			addDrawTo(1*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(-1*scale,0);
+			addJump(1*scale,0);
+			addDrawTo(1*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(-2*scale,0);
+		break;
+		case 'C':
+			addJump(2*scale,0);
+			addDrawTo(-1*scale,0);
+			addDrawTo(-1*scale,1*scale);
+			addDrawTo(1*scale,1*scale);
+			addDrawTo(1*scale,0);
+			addJump(-2*scale,-2*scale);
+		break;
+		case 'D':
+			addDrawTo(0,2*scale);
+			addDrawTo(1*scale,0);
+			addDrawTo(1*scale,-1*scale);
+			addDrawTo(0,-1*scale);
+			addDrawTo(-2*scale,0);
+		break;
+		case 'E':
+			addDrawTo(0,2*scale);
+			addDrawTo(2*scale,0);
+			addJump(-2*scale,-1*scale);
+			addDrawTo(1*scale,0);
+			addJump(1*scale,-1*scale);
+			addDrawTo(-2*scale,0);
+		break;
+		case 'F':
+			addDrawTo(0,2*scale);
+			addDrawTo(2*scale,0);
+			addJump(-1*scale,-1*scale);
+			addDrawTo(-1*scale,0);
+			addJump(0,-1*scale);
+		break;		
+		case 'G':
+			addJump(2*scale,2*scale);
+			addDrawTo(-2*scale,0);
+			addDrawTo(0,-2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(-1*scale,1*scale);
+			addJump(-1*scale,-1*scale);
+		break;
+		case 'H':
+			addDrawTo(0,2*scale);
+			addJump(0,-1*scale);
+			addDrawTo(2*scale,0);
+			addJump(0,1*scale);
+			addDrawTo(0,-2*scale);
+			addJump(-2*scale,0);
+		break;
+		case 'I':
+			addDrawTo(2*scale,0);
+			addJump(-1*scale,0);
+			addDrawTo(0,2*scale);
+			addJump(-1*scale,0);
+			addDrawTo(2*scale,0);
+			addJump(-2*scale,-2*scale);
+		break;
+		case 'J':
+			addJump(0,2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(-1*scale,-1*scale);
+			addDrawTo(-1*scale,0);
+		break;
+		case 'K':
+			addDrawTo(0,2*scale);
+			addJump(2*scale,0);
+			addDrawTo(-1*scale,-1*scale);
+			addDrawTo(1*scale,-1*scale);
+			addJump(-2*scale,0);
+		break;
+		case 'L':
+			addJump(0,2*scale);
+			addDrawTo(0,-2*scale);
+			addDrawTo(2*scale,0);
+			addJump(-2*scale,0);
+		break;
+		case 'M':
+			addDrawTo(0,2*scale);
+			addDrawTo(1*scale,-1*scale);
+			addDrawTo(1*scale,1*scale);
+			addDrawTo(0,-2*scale);
+			addJump(-2*scale,0);
+		break;
+		case 'N':
+			addDrawTo(0,2*scale);
+			addDrawTo(2*scale,-2*scale);
+			addDrawTo(0,2*scale);
+			addJump(-2*scale,-2*scale);
+		break;
+		case 'O':
+			addDrawTo(0,2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,-2*scale);
+			addDrawTo(-2*scale,0);
+		break;
+		case 'P':
+			addDrawTo(0,2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(-2*scale,0);
+			addJump(0,-1*scale);
+		break;
+		case 'Q':
+			addDrawTo(0,2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,-2*scale);
+			addDrawTo(-2*scale,0);
+			addJump(1*scale,1*scale);
+			addDrawTo(1*scale,-1*scale);
+			addJump(-2*scale,0);
+		break;	
+		case 'R':
+			addDrawTo(0,2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(-2*scale,0);
+			addJump(1*scale,0);
+			addDrawTo(1*scale,-1*scale);
+			addJump(-2*scale,0);
+		break;	
+		case 'S':
+			addJump(2*scale,2*scale);
+			addDrawTo(-2*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(-2*scale,0);
+		break;
+		case 'T':
+			addJump(0,2*scale);
+			addDrawTo(2*scale,0);
+			addJump(-1*scale,0);
+			addDrawTo(0,-2*scale);
+			addJump(-1*scale,0);
+		break;
+		case 'U':
+			addJump(0,2*scale);
+			addDrawTo(0,-2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(0,2*scale);
+			addJump(-2*scale,-2*scale);
+		break;
+		case 'V':
+			addJump(0,2*scale);
+			addDrawTo(0,-1*scale);
+			addDrawTo(1*scale,-1*scale);
+			addDrawTo(1*scale,1*scale);
+			addDrawTo(0,1*scale);
+			addJump(-2*scale,-2*scale);
+		break;
+		case 'W':
+			addJump(0,2*scale);
+			addDrawTo(0,-2*scale);
+			addDrawTo(1*scale,1*scale);
+			addDrawTo(1*scale,-1*scale);
+			addDrawTo(0,2*scale);
+			addJump(-2*scale,-2*scale);
+		break;
+		case 'X':
+			addJump(0,2*scale);
+			addDrawTo(2*scale,-2*scale);
+			addJump(0,2*scale);
+			addDrawTo(-2*scale,-2*scale);
+		break;
+		case 'Y':
+			addJump(0,2*scale);
+			addDrawTo(1*scale,-1*scale);
+			addDrawTo(1*scale,1*scale);
+			addJump(-1*scale,-1*scale);
+			addDrawTo(0,-1*scale);
+			addJump(-1*scale,0);
+		break;
+		case 'Z':
+			addJump(0,2*scale);
+			addDrawTo(2*scale,0);
+			addDrawTo(-2*scale,-2*scale);
+			addDrawTo(2*scale,0);
+			addJump(-2*scale,0);
+		break;
+		case ' ':
+
+		break;
+		default:
+			addDrawTo(0,1*scale);
+			addDrawTo(1*scale,0);
+			addDrawTo(0,-1*scale);
+			addDrawTo(-1*scale,0);
+		break;
+
+	}
+}
+
+void drawString(const char *str,int size){
+	while(*str!='\0'){
+		drawChar(*str,size);
+		addJump(4*size,0);
+		str++;
+	}
+}
+
+/*
+void controlChar(uint8_t control){
+	switch(control){
+		case 7://Bell
+			__asm__("nop");
+		break;
+		case 10://LF
+			__asm__("nop");
+		break;
+		case 13://CR
+			cursorX = 0;
+			for(int y=CHARSY-2;y>-1;y--){
+				for(int x=0;x<CHARSX;x++){
+					charBuffer[x][y+1] = charBuffer[x][y];
+				}
+			}
+			for(int x=0;x<CHARSX;x++){
+				loadCharInBuffer(32,x,0,0);
+			}
+		case 127://DEL
+			if(cursorX>0){cursorX--;}
+			loadCharInBuffer(' ',cursorX,cursorY,0);
+
+
+		break;
+	}
+}
+
+void appendChar(uint8_t charToAppend, uint8_t flags){
+	if(cursorX+1>CHARSX){controlChar(13);}
+	loadCharInBuffer(charToAppend, cursorX, cursorY, flags);
+	cursorX++;
+}
+
+void loadCharInBuffer(uint8_t charToLoad, uint8_t xPos, uint8_t yPos, uint8_t flags){
+	uint16_t tmpChar = (flags << 8) | (charToLoad);
+	charBuffer[xPos][yPos] = tmpChar;
+}
+
+void displayCharBuffer(){
+	addJump(2,2);
+	int spaceCounter=0;
+	for(int y=0;y<CHARSY;y++){
+		for(int x=0;x<CHARSX;x++){
+			uint16_t tmpChar = (charBuffer[x][y] & 0xFF);
+			if(tmpChar==32){
+				spaceCounter++;
+			}else{
+				addJump(3*spaceCounter,0);
+				spaceCounter=0;
+				drawChar((charBuffer[x][y] & 0xFF),3);
+			}
+		}
+		addJump(2,0+15);
+		spaceCounter=0;
+	}
+}
+*/
\ No newline at end of file
diff --git a/text.h b/text.h
new file mode 100644
index 0000000..0b24801
--- /dev/null
+++ b/text.h
@@ -0,0 +1,3 @@
+void drawChar(char charToDraw, int scale);
+
+void drawString(const char *str,int size);
diff --git a/uart.c b/uart.c
index e63f102..0e99cd2 100644
--- a/uart.c
+++ b/uart.c
@@ -8,8 +8,8 @@
 #define _INC_PTR(ptr) ((ptr + 1) & (_BUF_SIZE - 1))
 
 
-#define F_CPU 25000000UL
-#define BAUD 9600UL      // Baudrate
+#define F_CPU 16000000UL
+#define BAUD 115200UL      // Baudrate
 
 
 
-- 
GitLab