asdf

Dependencies:   mbed

Fork of manworm_ticker_tv by Bayley Wang

Revision:
9:2a47b9ff8911
Parent:
8:caeb6582cdc1
Child:
10:1163fb31b0a7
--- a/main.cpp	Sat Mar 03 18:05:36 2018 +0000
+++ b/main.cpp	Sat Mar 10 05:09:55 2018 +0000
@@ -1,36 +1,190 @@
 #include "mbed.h"
-#define V_RES 220
-#define H_RES 100
 #include <math.h>
-#define X_MIN 24
-#define X_MAX (76+18)
-#define Y_MIN 7
-#define Y_MAX (V_RES/4 - 15)
+#include "lisp.h"
+#include "main.h"
+#include "gfx.h"
 
+// Resolution, including porches
+#define V_RES 200
+#define H_RES 300
+
+
+// old shit
 #define SX_MIN 30
 #define SX_MAX 95
 #define SY_MIN 10
 #define SY_MAX 48
-
-#define Y_0 ( (Y_MIN + Y_MAX)/2 )
-#define X_0 ( (X_MIN + X_MAX)/2 )
-#define SIDE 8
-#define HSIDE 8
-#define SIN_V (0.03)
-#define COS_V (0.99955f)
 #define BX_0 30
 #define BY_0 (V_RES/4 - 15)
 #define BX 42
 #define BY 15
 #define BY2 9
-#define DEMO_LENGTH 600
+
+// good new stuff
+#define X0 75  // start of image in X
+#define Y0 30  // start of image in Y
+#define XL 220 // 25 chars
+#define YL 165 // 20 chars
+
+#define TX 24  // number of characters in X
+#define TY 18  // number of characters in Y
 
+#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
+#define MIN(a,b) (((a)<(b))?(a):(b))
+#define MAX(a,b) (((a)>(b))?(a):(b))
+
+uint8_t char_col = 0;  // current column counter
+uint8_t char_row = 0;  // current row counter
+uint8_t text_buffer_counter = 0; // current index in text buffer counter
+char most_recent_char = '0';
+
+char text_buffer[TX*TY]; // input text buffer for lisp
+
+uint8_t want_gfx = 0;
+
+Serial pc(USBTX, USBRX);
 
-DigitalOut sout(D8); //sync
-DigitalOut vout(D7); //video
+// font
+char vincent_data[128][8] = { 
+  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 
+  { 0x00, 0x3E, 0x41, 0x55, 0x41, 0x55, 0x49, 0x3E }, 
+  { 0x00, 0x3E, 0x7F, 0x6B, 0x7F, 0x6B, 0x77, 0x3E }, 
+  { 0x00, 0x22, 0x77, 0x7F, 0x7F, 0x3E, 0x1C, 0x08 }, 
+  { 0x00, 0x08, 0x1C, 0x3E, 0x7F, 0x3E, 0x1C, 0x08 }, 
+  { 0x00, 0x08, 0x1C, 0x2A, 0x7F, 0x2A, 0x08, 0x1C }, 
+  { 0x00, 0x08, 0x1C, 0x3E, 0x7F, 0x3E, 0x08, 0x1C }, 
+  { 0x00, 0x00, 0x1C, 0x3E, 0x3E, 0x3E, 0x1C, 0x00 }, 
+  { 0xFF, 0xFF, 0xE3, 0xC1, 0xC1, 0xC1, 0xE3, 0xFF }, 
+  { 0x00, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00 }, 
+  { 0xFF, 0xFF, 0xE3, 0xDD, 0xDD, 0xDD, 0xE3, 0xFF }, 
+  { 0x00, 0x0F, 0x03, 0x05, 0x39, 0x48, 0x48, 0x30 }, 
+  { 0x00, 0x08, 0x3E, 0x08, 0x1C, 0x22, 0x22, 0x1C }, 
+  { 0x00, 0x18, 0x14, 0x10, 0x10, 0x30, 0x70, 0x60 }, 
+  { 0x00, 0x0F, 0x19, 0x11, 0x13, 0x37, 0x76, 0x60 }, 
+  { 0x00, 0x08, 0x2A, 0x1C, 0x77, 0x1C, 0x2A, 0x08 }, 
+  { 0x00, 0x60, 0x78, 0x7E, 0x7F, 0x7E, 0x78, 0x60 }, 
+  { 0x00, 0x03, 0x0F, 0x3F, 0x7F, 0x3F, 0x0F, 0x03 }, 
+  { 0x00, 0x08, 0x1C, 0x2A, 0x08, 0x2A, 0x1C, 0x08 }, 
+  { 0x00, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66 }, 
+  { 0x00, 0x3F, 0x65, 0x65, 0x3D, 0x05, 0x05, 0x05 }, 
+  { 0x00, 0x0C, 0x32, 0x48, 0x24, 0x12, 0x4C, 0x30 }, 
+  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F }, 
+  { 0x00, 0x08, 0x1C, 0x2A, 0x08, 0x2A, 0x1C, 0x3E }, 
+  { 0x00, 0x08, 0x1C, 0x3E, 0x7F, 0x1C, 0x1C, 0x1C }, 
+  { 0x00, 0x1C, 0x1C, 0x1C, 0x7F, 0x3E, 0x1C, 0x08 }, 
+  { 0x00, 0x08, 0x0C, 0x7E, 0x7F, 0x7E, 0x0C, 0x08 }, 
+  { 0x00, 0x08, 0x18, 0x3F, 0x7F, 0x3F, 0x18, 0x08 }, 
+  { 0x00, 0x00, 0x00, 0x70, 0x70, 0x70, 0x7F, 0x7F }, 
+  { 0x00, 0x00, 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00 }, 
+  { 0x00, 0x08, 0x1C, 0x1C, 0x3E, 0x3E, 0x7F, 0x7F }, 
+  { 0x00, 0x7F, 0x7F, 0x3E, 0x3E, 0x1C, 0x1C, 0x08 }, 
+  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 
+  { 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18 }, 
+  { 0x00, 0x36, 0x36, 0x14, 0x00, 0x00, 0x00, 0x00 }, 
+  { 0x00, 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36 }, 
+  { 0x00, 0x08, 0x1E, 0x20, 0x1C, 0x02, 0x3C, 0x08 }, 
+  { 0x00, 0x60, 0x66, 0x0C, 0x18, 0x30, 0x66, 0x06 }, 
+  { 0x00, 0x3C, 0x66, 0x3C, 0x28, 0x65, 0x66, 0x3F }, 
+  { 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00 }, 
+  { 0x00, 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60 }, 
+  { 0x00, 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06 }, 
+  { 0x00, 0x00, 0x36, 0x1C, 0x7F, 0x1C, 0x36, 0x00 }, 
+  { 0x00, 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00 }, 
+  { 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x60 }, 
+  { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00 }, 
+  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60 }, 
+  { 0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00 }, 
+  { 0x00, 0x3C, 0x66, 0x6E, 0x76, 0x66, 0x66, 0x3C }, 
+  { 0x00, 0x18, 0x18, 0x38, 0x18, 0x18, 0x18, 0x7E }, 
+  { 0x00, 0x3C, 0x66, 0x06, 0x0C, 0x30, 0x60, 0x7E }, 
+  { 0x00, 0x3C, 0x66, 0x06, 0x1C, 0x06, 0x66, 0x3C }, 
+  { 0x00, 0x0C, 0x1C, 0x2C, 0x4C, 0x7E, 0x0C, 0x0C }, 
+  { 0x00, 0x7E, 0x60, 0x7C, 0x06, 0x06, 0x66, 0x3C }, 
+  { 0x00, 0x3C, 0x66, 0x60, 0x7C, 0x66, 0x66, 0x3C }, 
+  { 0x00, 0x7E, 0x66, 0x0C, 0x0C, 0x18, 0x18, 0x18 }, 
+  { 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x66, 0x66, 0x3C }, 
+  { 0x00, 0x3C, 0x66, 0x66, 0x3E, 0x06, 0x66, 0x3C }, 
+  { 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00 }, 
+  { 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30 }, 
+  { 0x00, 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06 }, 
+  { 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00 }, 
+  { 0x00, 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60 }, 
+  { 0x00, 0x3C, 0x66, 0x06, 0x1C, 0x18, 0x00, 0x18 }, 
+  { 0x00, 0x38, 0x44, 0x5C, 0x58, 0x42, 0x3C, 0x00 }, 
+  { 0x00, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66 }, 
+  { 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C }, 
+  { 0x00, 0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C }, 
+  { 0x00, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C }, 
+  { 0x00, 0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x7E }, 
+  { 0x00, 0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60 }, 
+  { 0x00, 0x3C, 0x66, 0x60, 0x60, 0x6E, 0x66, 0x3C }, 
+  { 0x00, 0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66 }, 
+  { 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C }, 
+  { 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x6C, 0x6C, 0x38 }, 
+  { 0x00, 0x66, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x66 }, 
+  { 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E }, 
+  { 0x00, 0x63, 0x77, 0x7F, 0x6B, 0x63, 0x63, 0x63 }, 
+  { 0x00, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x63, 0x63 }, 
+  { 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C }, 
+  { 0x00, 0x7C, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60 }, 
+  { 0x00, 0x3C, 0x66, 0x66, 0x66, 0x6E, 0x3C, 0x06 }, 
+  { 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x78, 0x6C, 0x66 }, 
+  { 0x00, 0x3C, 0x66, 0x60, 0x3C, 0x06, 0x66, 0x3C }, 
+  { 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x18 }, 
+  { 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3E }, 
+  { 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18 }, 
+  { 0x00, 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63 }, 
+  { 0x00, 0x63, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x63 }, 
+  { 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18 }, 
+  { 0x00, 0x7E, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x7E }, 
+  { 0x00, 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E }, 
+  { 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00 }, 
+  { 0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78 }, 
+  { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00 }, 
+  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F }, 
+  { 0x00, 0x0C, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00 }, 
+  { 0x00, 0x00, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E }, 
+  { 0x00, 0x60, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C }, 
+  { 0x00, 0x00, 0x00, 0x3C, 0x66, 0x60, 0x66, 0x3C }, 
+  { 0x00, 0x06, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3E }, 
+  { 0x00, 0x00, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C }, 
+  { 0x00, 0x1C, 0x36, 0x30, 0x30, 0x7C, 0x30, 0x30 }, 
+  { 0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x3C }, 
+  { 0x00, 0x60, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66 }, 
+  { 0x00, 0x00, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3C }, 
+  { 0x00, 0x0C, 0x00, 0x0C, 0x0C, 0x6C, 0x6C, 0x38 }, 
+  { 0x00, 0x60, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0x66 }, 
+  { 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, 
+  { 0x00, 0x00, 0x00, 0x63, 0x77, 0x7F, 0x6B, 0x6B }, 
+  { 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x66, 0x66, 0x66 }, 
+  { 0x00, 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C }, 
+  { 0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60 }, 
+  { 0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x3C, 0x0D, 0x0F }, 
+  { 0x00, 0x00, 0x00, 0x7C, 0x66, 0x66, 0x60, 0x60 }, 
+  { 0x00, 0x00, 0x00, 0x3E, 0x40, 0x3C, 0x02, 0x7C }, 
+  { 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18 }, 
+  { 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E }, 
+  { 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x3C, 0x18 }, 
+  { 0x00, 0x00, 0x00, 0x63, 0x6B, 0x6B, 0x6B, 0x3E }, 
+  { 0x00, 0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66 }, 
+  { 0x00, 0x00, 0x00, 0x66, 0x66, 0x3E, 0x06, 0x3C }, 
+  { 0x00, 0x00, 0x00, 0x3C, 0x0C, 0x18, 0x30, 0x3C }, 
+  { 0x00, 0x0E, 0x18, 0x18, 0x30, 0x18, 0x18, 0x0E }, 
+  { 0x00, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18 }, 
+  { 0x00, 0x70, 0x18, 0x18, 0x0C, 0x18, 0x18, 0x70 }, 
+  { 0x00, 0x00, 0x00, 0x3A, 0x6C, 0x00, 0x00, 0x00 }, 
+  { 0x00, 0x08, 0x1C, 0x36, 0x63, 0x41, 0x41, 0x7F }
+};
+
+DigitalOut sout(D8); //sync PA_9
+DigitalOut vout(D7); //video PA_8
+
+// trigger horizontal line draw
 Ticker t;
+
 uint8_t draw_line_inv = 0;
-//9x42
+
+// miters logo bitmap
 uint8_t miters[] = {
 1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
 1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
@@ -50,327 +204,53 @@
 
 };
 
-uint8_t tv[] = {
-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0};
 
-uint8_t chr_A[] = {
-0,0,1,1,0,0,
-0,1,0,0,1,0,
-1,0,0,0,0,1,
-1,1,1,1,1,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,};
-
-uint8_t chr_D[] = {
-1,1,1,1,1,0,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,1,1,1,1,0,};
-
-uint8_t chr_F[] = {
-1,1,1,1,1,1,
-1,0,0,0,0,0,
-1,0,0,0,0,0,
-1,1,1,1,1,1,
-1,0,0,0,0,0,
-1,0,0,0,0,0,
-1,0,0,0,0,0,};
 
-uint8_t chr_G[] = {
-0,1,1,1,1,0,
-1,0,0,0,0,1,
-1,0,0,0,0,0,
-1,0,0,1,1,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-0,1,1,1,1,0,};
 
-uint8_t chr_H[] = {
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,1,1,1,1,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,};
-
-uint8_t chr_L[] = {
-1,0,0,0,0,0,
-1,0,0,0,0,0,
-1,0,0,0,0,0,
-1,0,0,0,0,0,
-1,0,0,0,0,0,
-1,0,0,0,0,0,
-1,1,1,1,1,1,};
-
-uint8_t chr_M[] = {
-1,0,0,0,0,1,
-1,1,0,0,1,1,
-1,0,1,1,0,1,
-1,0,1,1,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,};
-
-uint8_t chr_N[] = {
-1,0,0,0,0,1,
-1,1,0,0,0,1,
-1,0,1,0,0,1,
-1,0,0,1,0,1,
-1,0,0,0,1,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,};
 
-uint8_t chr_O[] = {
-0,1,1,1,1,0,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-0,1,1,1,1,0,};
-
-uint8_t chr_P[] = {
-1,1,1,1,1,0,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,1,1,1,1,0,
-1,0,0,0,0,0,
-1,0,0,0,0,0,
-1,0,0,0,0,0,};
-
-uint8_t chr_R[] = {
-1,1,1,1,1,0,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,1,0,
-1,0,0,1,0,0,
-1,0,0,0,1,0,
-1,0,0,0,0,1,};
-
-uint8_t chr_S[] = {
-0,1,1,1,1,1,
-1,0,0,0,0,0,
-1,0,0,0,0,0,
-0,1,1,1,1,0,
-0,0,0,0,0,1,
-0,0,0,0,0,1,
-1,1,1,1,1,0,};
-
-uint8_t chr_V[] = {
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-0,1,0,0,1,0,
-0,1,0,0,1,0,
-0,1,0,0,1,0,
-0,0,1,1,0,0,};
-
-uint8_t chr_W[] = {
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,0,0,0,1,
-1,0,1,1,0,1,
-1,0,1,1,0,1,
-1,1,0,0,1,1,
-1,0,0,0,0,1,};
-
-uint8_t sprite_tree[] = {
-0,0,0,1,0,0,0,
-0,0,1,1,1,0,0,
-0,1,1,1,1,1,0,
-1,1,1,1,1,1,1,
-0,1,1,1,1,1,0,
-1,1,1,1,1,1,1,
-0,0,0,1,0,0,0,
-0,0,0,1,0,0,0,};
-
-uint8_t sprite_man[] = {
-0,0,0,1,0,0,0,
-0,0,1,1,1,0,0,
-0,0,0,1,0,0,1,
-0,1,1,1,1,1,0,
-1,0,1,1,1,0,0,
-0,0,1,1,1,0,0,
-0,1,0,0,0,1,0,
-0,1,0,0,0,1,0};
-
-uint8_t sprite_manl[] = {
-0,0,0,1,0,0,0,
-0,0,1,1,1,0,0,
-1,0,0,1,0,0,0,
-0,1,1,1,1,1,0,
-0,0,1,1,1,0,1,
-0,0,1,1,1,0,0,
-0,1,0,0,0,1,0,
-0,1,0,0,0,0,0};
-
-uint8_t sprite_manr[] = {
-0,0,0,1,0,0,0,
-0,0,1,1,1,0,0,
-0,0,0,1,0,0,1,
-0,1,1,1,1,1,0,
-1,0,1,1,1,0,0,
-0,0,1,1,1,0,0,
-0,1,0,0,0,1,0,
-0,0,0,0,0,1,0};
-
-uint8_t *menu[] = {
-chr_P,chr_A,chr_N,chr_G,
-chr_F,chr_A,chr_S,chr_H,
-chr_D,chr_A,chr_M,chr_O,
-chr_D,chr_R,chr_A,chr_V,
-chr_W,chr_A,chr_L,chr_F,
-};
+uint8_t bl_line_s[H_RES]; //blank line sync buffer
+uint8_t bl_line_v[H_RES]; //blank line video buffer
+uint8_t vb_line_s[H_RES]; //vertical sync, sync buffer
+uint8_t vb_line_v[H_RES]; //vertical sync, video buffer
+uint8_t im_line_s[H_RES]; //image sync buffer
+uint8_t im_line_va_1[H_RES*V_RES];
+uint8_t im_line_va_2[H_RES*V_RES];
+uint8_t* im_line_va; // active image buff
+//uint8_t im_line_va[H_RES*V_RES]; //image video buffer
 
 uint16_t l=0; //current line of scan
 
-uint8_t im_line_s[H_RES]; //image sync buffer
-
-uint8_t bl_line_s[H_RES]; //lower 1/4 of screen sync buffer
-uint8_t bl_line_v[H_RES]; //lower 1/4 of screen video buffer
-uint8_t vb_line_s[H_RES]; //vertical sync, sync buffer
-uint8_t vb_line_v[H_RES]; //vertical sync, video buffer
-
-float cube_a[3] = {15.f, 0.f, 0.f};
-
-
-float cube_pts[8][3] = { {SIDE,SIDE,HSIDE},
-                         {-SIDE,SIDE,HSIDE},
-                         {-SIDE,-SIDE,HSIDE},
-                         {SIDE,-SIDE,HSIDE},
-                         {SIDE,-SIDE,-HSIDE},
-                         {-SIDE,-SIDE,-HSIDE},
-                         {-SIDE,SIDE,-HSIDE},
-                         {SIDE,SIDE,-HSIDE} };
-                         
-float x_rot[3][3] = { {1.f, 0.f, 0.f},
-                        {0.f, COS_V, -SIN_V},
-                        {0.f, SIN_V, COS_V} };
-                        
-float y_rot[3][3] = { {COS_V, 0.f, SIN_V},
-                        {0.f, 1.f, 0.f},
-                        {-SIN_V, 0, COS_V} };
-                        
-float z_rot[3][3] = { {COS_V, -SIN_V, 0.f},
-                        {SIN_V, COS_V, 0.f},
-                        {0.f, 0.f, 1.f} };
-
-
-uint8_t im_line_va[H_RES*V_RES]; //image buffer
-
-//pong variables
-#define PADDLE_LEN 10
-float p1 = (SY_MIN+SY_MAX)/2-PADDLE_LEN/2, p2 = (SY_MIN+SY_MAX)/2-PADDLE_LEN/2;
-float p1v = 0.1, p2v = -0.1;
-
-float bx = (SX_MIN+SX_MAX)/2, by = (SY_MIN+SY_MAX)/2;
-float bxv = 0.03, byv = 0.03;
-
-int s1 = 0, s2 = 0;
-
-//fish variables
-#define FDEATH_RESET 30000
-float fx = (SX_MAX+SX_MIN)/2.f, fy = (SY_MIN+SY_MAX)/2.f, fv = 0.02f, ftheta = 0.0, fa = 0.002;
-float uv = 0.005;
-float ux[8] = {53,70,78,78,70,53,45,45};
-float uy[8] = {10,10,20,35,50,50,35,20};
-float uvx[8] = {-1,1,1,1,1,-1,-1,-1};
-float uvy[8] = {1,1,1,-1,-1,-1,-1,1};
-int ulive[8] = {1,1,1,1,1,1,1,1};
-
-int fdeath_ticker = FDEATH_RESET;
-float fs = 0;
-
-//tunnel variables
-#define TUN_LEN (SY_MAX - SY_MIN)
-uint8_t tunnel[TUN_LEN];
-float tunnp = 50;
-int tundir = 1;
-int leg_ctr = 0;
-
-//raycaster variables
-#define mapWidth 24
-#define mapHeight 24
-
-uint8_t worldMap[mapWidth][mapHeight]=
+// positive or negative?
+int16_t sign(int16_t a)
 {
-  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
-  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,0,0,0,0,0,2,2,2,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1},
-  {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,3,0,0,0,3,0,0,0,1},
-  {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,0,0,0,0,0,2,2,0,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1},
-  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,4,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,4,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
-  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
-};
-
-float posX = 12, posY = 12;
-float dirX = -1, dirY = 0;
-float planeX = 0, planeY = 0.66;
-float rc_cos = cosf(0.03f);
-float rc_sin = sinf(0.03f);
-
-//mode7 variables
-float m7_theta = 0.8f;
-float m7_x = mapWidth/2, m7_y=mapHeight/2;
-
-DigitalIn p1_in(A1);
-DigitalIn p2_in(A0);
-
-void make_checkerboard()
-{
-    for(int i = 0; i < H_RES; i++)
-        for(int j = 0; j < V_RES; j++)
-            im_line_va[i+j*H_RES] = 0*((i > 20) && (i < 98)) && ((j%2) ^ (i%2)); //checkerboard
-    
+    if(a > 0) return 1;
+    if(a < 0) return -1;
+    return 0;
 }
 
+// clear the text buffer
+void clr_text_buff()
+{
+    text_buffer_counter = 0;
+    for(int i = 0; i < TX*TY; i++)
+        text_buffer[i] = 0;
+}
+
+// clear the screen and the text buffer
 void clr()
 {
     for(int i = 0; i < H_RES; i++)
         for(int j = 0; j < V_RES; j++)
             im_line_va[i+j*H_RES] = 0;
+            
+    clr_text_buff();
     
 }
 
+// initialize video buffers
 void init_buffers()
 {
-    clr();
+    clr(); // zero buffers
     for(int i = 0; i < H_RES; i++)
     {
         im_line_s[i] = 1;   
@@ -382,85 +262,103 @@
     im_line_s[0] = 0;
     im_line_s[1] = 0;
     im_line_s[2] = 0;
+    im_line_s[3] = 0;
+    
+  for(int i = 0; i < 15; i++) 
+    im_line_s[i] = 0;
+
+    
     bl_line_s[0] = 0;
     vb_line_s[0] = 1;
     bl_line_s[1] = 0;
     vb_line_s[1] = 1;
     
-    
-    
+    bl_line_s[3] = 0;
+    vb_line_s[3] = 1;
+    bl_line_s[2] = 0;
+    vb_line_s[2] = 1;
 }
+
+// video interrupt
 void isr()
 {
     uint8_t nop = 0; //use nops or use wait_us
     uint8_t* sptr; //pointer to sync buffer for line
     uint8_t* vptr; //pointer to video buffer for line
-    if(l < V_RES){ vptr = im_line_va + ((l/4)*H_RES); sptr = im_line_s; nop = 1; } //pick line buffers
+    if(l < V_RES){ vptr = im_line_va + ((l)*H_RES); sptr = im_line_s; nop = 1; } //pick line buffers
     else if(l < 254){ vptr = bl_line_v; sptr = bl_line_s; nop = 0; }
     else{ vptr = vb_line_v; sptr = vb_line_s; nop = 1;}
-    uint8_t lmax = nop?H_RES:12; //number of columns
-    for(uint8_t i = 0; i < lmax; i++) //loop over each column
+    uint16_t lmax = nop?H_RES:12; //number of columns
+    for(uint16_t i = 0; i < lmax; i++) //loop over each column
     {
-        vout = vptr[i]; //set output pins
-        sout = sptr[i];   
+        nop = 1;
+        if(sptr[i])
+            GPIOA->ODR |= (1 << 9);
+        else
+            GPIOA->ODR &= ~(1 << 9);
+             
+        if(vptr[i])
+            GPIOA->ODR |= (1 << 8);
+        else
+            GPIOA->ODR &= ~(1 << 8);
+
+        
         if(nop) //nop delay
         {
-            asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");//asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
+            asm("nop");asm("nop");//asm("nop");asm("nop");//asm("nop");asm("nop");asm("nop");//asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
         }
-        else {wait_us(1); if(i > 2) i++;} //wait delay
-        
-        
+        else {wait_us(1); if(i > 2) i+=1;} //wait delay 
     }
     //move to next line
     l++;
     if(l > 255) l = 0;
 }
 
-//coordinates for bouncing ball
-
-
-
-int k = 0;
-uint16_t px = X_0*10;
-uint16_t py = Y_0*10;
-uint16_t vx = 10;
-uint16_t vy = 10;
-uint16_t px2 = X_0*10 + 80;
-uint16_t py2 = Y_0*10 - 40;
-uint16_t vx2 = 3;
-uint16_t vy2 = -4;
-
-int16_t sign(int16_t a)
+// draw checkerboard pattern
+void write_test_pattern(int x_in, int y_in,int k)
 {
-    if(a > 0) return 1;
-    if(a < 0) return -1;
-    return 0;
+    int x_max = MIN(H_RES,x_in);
+    int y_max = MIN(V_RES,y_in);
+    
+    // x 50 to 245
+    for(int x = 65; x < x_max; x++)
+    {
+        for(int y = 30; y < y_max; y++)
+        {
+            im_line_va[y*H_RES + x] = ((y/k)%2)^((x/k)%2);
+        }
+    }
 }
 
+// draw miters logo
+void draw_miters_at(int xx, int yy)
+{
+           int bmi = 0;
+        for(int y = yy; y < BY2+yy; y++)
+    {
+        for(int x = xx; x < BX+xx; x++)
+        {
+            im_line_va[H_RES*y + x] = miters[bmi];
+            bmi++;
+        }
+    }
+}
+
+// draw vertical line
 void draw_vert(int16_t y0, int16_t y1, int16_t x0)
 {
     for(int16_t i = y0; i < y1; i++)
         im_line_va[H_RES*i + x0] = 1;
 }
 
+// draw horizonal line
 void draw_horiz(int16_t x0, int16_t x1, int16_t y0)
 {
     for(int16_t i = x0; i < x1; i++)
         im_line_va[H_RES*y0 + i] = 1;
 }
 
-int16_t imin(int16_t a, int16_t b)
-{
-    if(a<b) return a;
-    return b;
-}
-
-int16_t imax(int16_t a, int16_t b)
-{
-    if(a>b) return a;
-    return b;
-}
-
+// draw line between points
 void draw_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1)
 {
     if(x0 > x1){ x0 = x0 ^ x1; x1 = x1^x0; x0 = x0^x1;y0 = y0 ^ y1; y1 = y1^y0; y0 = y0^y1; }
@@ -485,632 +383,318 @@
     }
 }
 
-void draw_cube(float cp[][3])
-{
-    for(uint8_t i = 0; i < 7; i++)
-    {
-        draw_line((int16_t)cp[i][0]+cube_a[0]+X_0,(int16_t)cp[i][1]+cube_a[1]+Y_0,(int16_t)cp[i+1][0]+cube_a[0]+X_0,(int16_t)cp[i+1][1]+cube_a[1]+Y_0);    
-    }
-    draw_line((int16_t)cp[0][0]+cube_a[0]+X_0,(int16_t)cp[0][1]+cube_a[1]+Y_0,(int16_t)cp[3][0]+cube_a[0]+X_0,(int16_t)cp[3][1]+cube_a[1]+Y_0);   
-    draw_line((int16_t)cp[4][0]+cube_a[0]+X_0,(int16_t)cp[4][1]+cube_a[1]+Y_0,(int16_t)cp[7][0]+cube_a[0]+X_0,(int16_t)cp[7][1]+cube_a[1]+Y_0);   
-    draw_line((int16_t)cp[0][0]+cube_a[0]+X_0,(int16_t)cp[0][1]+cube_a[1]+Y_0,(int16_t)cp[7][0]+cube_a[0]+X_0,(int16_t)cp[7][1]+cube_a[1]+Y_0);   
-    draw_line((int16_t)cp[1][0]+cube_a[0]+X_0,(int16_t)cp[1][1]+cube_a[1]+Y_0,(int16_t)cp[6][0]+cube_a[0]+X_0,(int16_t)cp[6][1]+cube_a[1]+Y_0);   
-    draw_line((int16_t)cp[2][0]+cube_a[0]+X_0,(int16_t)cp[2][1]+cube_a[1]+Y_0,(int16_t)cp[5][0]+cube_a[0]+X_0,(int16_t)cp[5][1]+cube_a[1]+Y_0);   
-}
-
-void apply_rot(float cp[][3], float r[][3])
-{
-    for(uint8_t pti = 0; pti < 8; pti++)
-    {
-        float* cpt = cp[pti];
-        float xn = r[0][0] * cpt[0] + r[0][1] * cpt[1] + r[0][2] * cpt[2]; 
-        float yn = r[1][0] * cpt[0] + r[1][1] * cpt[1] + r[1][2] * cpt[2]; 
-        float zn = r[2][0] * cpt[0] + r[2][1] * cpt[1] + r[2][2] * cpt[2];  
-        cpt[0] = xn;
-        cpt[1] = yn;
-        cpt[2] = zn;   
-    }   
-}
-
-void apply_xf_rot(float cpt[], float r[][3])
-{
-        float xn = r[0][0] * cpt[0] + r[0][1] * cpt[1] + r[0][2] * cpt[2]; 
-        float yn = r[1][0] * cpt[0] + r[1][1] * cpt[1] + r[1][2] * cpt[2]; 
-        float zn = r[2][0] * cpt[0] + r[2][1] * cpt[1] + r[2][2] * cpt[2];  
-        cpt[0] = xn;
-        cpt[1] = yn;
-        cpt[2] = zn;   
-}
-
-void draw_v_check(int8_t r,uint8_t tt)
+// draw letter
+void draw_vincent(uint16_t x0, uint16_t y0, uint8_t c)
 {
-    for(int i = 0; i < H_RES; i++)
-        for(int j = 0; j < V_RES; j++)
-            im_line_va[i+j*H_RES] = (((i > 20) && (i < 98)) && ( tt ^(((j%(r*2))>=r) ^ ((i%(r*2)))>=r))); //checkerboard
-}
-
-
-int jjj = 0;
-int f_count = DEMO_LENGTH + 10;
-void draw_cube_spin(int kkkk);
-//update bouncing balls
-
-void draw_blank()
-{
-    for(uint16_t h = X_MIN; h < X_MAX; h++)
-    {
-        for(uint16_t v = Y_MIN; v < Y_MAX+15; v++)
-        {
-                im_line_va[v*H_RES + h] = 0;
-        }
-    }
-}
-
-void wipe();
-
-void update_image()
-{
-    //delay
-    k++;
-    if(k%4000) return;
-    f_count++;
-    if(f_count < DEMO_LENGTH/2)
-    {
-        draw_cube_spin(0);
-    }
-    else if(f_count < DEMO_LENGTH)
-    {
-        draw_cube_spin(0);
-    }
-    else if(f_count < DEMO_LENGTH * 1.22)
+    if(c == 40) c = 41;
+    else if(c == 41) c = 40;
+    char* letter = vincent_data[c];
+    for(uint16_t xp = 0; xp < 8; xp++)
     {
-        for(int k = 1; k < 10; k++)
-            //for(int kk = 1; kk < 3; kk++)
-            {
-                draw_v_check(k,1);
-                draw_v_check(k,1);
-                draw_v_check(k,0);
-                draw_v_check(k,0); 
-            }
-            
-        draw_v_check(1,0);
-        wipe();
-        f_count = 0;
-    }
-}
-
-void wipe()
-{
-    for(int v = Y_MIN; v < Y_MAX+15; v++)
-    {
-        for(uint16_t h = X_MIN; h < X_MAX; h++)
-        {
-            im_line_va[v*H_RES+h] = 1;
-        }
-        wait(.01);
-    }
-    
-        for(int v = Y_MAX+15; v > Y_MIN; v--)
-        {
-            for(uint16_t h = X_MIN; h < X_MAX; h++)
-            {
-                im_line_va[v*H_RES+h] = 0;
-            }
-            wait(.005);
-        }  
-    
-        for(uint16_t h = X_MIN; h < X_MAX; h++)
-        {
-            for(uint16_t v = Y_MIN; v < Y_MAX+15; v++)
-            {
-                im_line_va[v*H_RES + h] = 1;
-            }
-            wait(.005);
-        }
-    
-        for(uint16_t h = X_MIN; h < X_MAX; h++)
+        for(uint16_t yp = 0; yp < 8; yp++)
         {
-            for(uint16_t v = Y_MIN; v < Y_MAX+15; v++)
-            {
-                im_line_va[v*H_RES + h] = 0;
-            }
-            wait(.005);
-        }
-    
-        for(int v = Y_MIN; v < Y_MAX+15; v++)
-        {
-            for(uint16_t h = X_MIN; h < X_MAX; h++)
-            {
-                im_line_va[v*H_RES+h] = 0;
-            }
-        }
-}
-
-void draw_cube_spin(int kkkk)
-{
-    draw_line_inv = kkkk;
-    //blank
-    for(uint16_t h = X_MIN; h < X_MAX; h++)
-    {
-        for(uint16_t v = Y_MIN; v < Y_MAX; v++)
-        {
-            if( (h > 22) && (h < 76+18))
-                im_line_va[v*H_RES + h] = kkkk;
-        }
-    }
-    apply_xf_rot(cube_a,y_rot);
-    apply_xf_rot(cube_a,y_rot);
-    apply_rot(cube_pts,x_rot);
-    apply_rot(cube_pts,x_rot);
-    apply_rot(cube_pts,y_rot);
-    apply_rot(cube_pts,y_rot);
-    apply_rot(cube_pts,z_rot);
-    //draw ball
-    im_line_va[(py/10)*H_RES + (px/10)] = 1;
-    draw_line(X_0,Y_0,(px/10),(py/10));
-    draw_cube(cube_pts);
-    
-    //update position/check for bounces
-    px += vx;
-    py += vy;
-    px2 += vx2;
-    py2 += vy2;
-    if(px/10 > (X_MAX-2) || px/10 < (X_MIN+1)) vx = -vx;
-    if(py/10 > (Y_MAX-2) || py/10 < (Y_MIN+1)) vy = -vy;
-    if(px2/10 > (X_MAX-2) || px2/10 < (X_MIN+1)) vx2 = -vx2;
-    if(py2/10 > (Y_MAX-2) || py2/10 < (Y_MIN+1)) vy2 = -vy2;
-    if(k%(8000*50)) return;
-    
-        jjj = !jjj;
-    int bmi = 0;
-    for(int y = BY_0; y < BY_0 + BY; y++)
-    {
-        for(int x = BX_0; x < BX_0 + BX; x++)
-        {
-            im_line_va[H_RES*y + x] = kkkk^(miters[bmi]*jjj + (!jjj)*tv[bmi]);
-            bmi++;
+            im_line_va[H_RES*(yp+y0) + xp + x0] = CHECK_BIT(letter[yp],8-xp);
         }
     }
 }
 
-int flappy_pong() {
-    
-    //clear frame
-    for(int y = 0; y < PADDLE_LEN; y++) {
-        im_line_va[H_RES*(y+(int)p1)+SX_MIN] = 0;
-        im_line_va[H_RES*(y+(int)p2)+SX_MAX] = 0;
+// go to new line
+void new_line()
+{
+    char_col = 0;
+    char_row++;
+    if(char_row >= TY)
+    {
+        char_row = 0;
     }
-    im_line_va[H_RES*(int)by+(int)bx] = 0;
-    //read inputs
-    int cmd1 = p1_in.read();
-    int cmd2 = p2_in.read();
-    if (cmd1 == 0) p1v = 0.1; else p1v = -0.1f;
-    if (cmd2 == 0) p2v = 0.1; else p2v = -0.1f;
-    
-    p1 += p1v;
-    p2 += p2v;
-    bx += bxv;
-    by += byv;
-    
-    if (p1 < SY_MIN) p1 = SY_MIN;
-    if (p1 > SY_MAX-PADDLE_LEN) p1 = SY_MAX-PADDLE_LEN;
-    if (p2 < SY_MIN) p2 = SY_MIN;
-    if (p2 > SY_MAX-PADDLE_LEN) p2 = SY_MAX-PADDLE_LEN;
-    
-    if (bx < SX_MIN) {
-        bxv = -bxv; 
-        bx = SX_MIN;
-        if (by < p1 - 3 || by > p1 + PADDLE_LEN + 3) {
-            im_line_va[H_RES*(SY_MIN-2)+2*s1+SX_MIN] = 1;
-            bx = (SX_MIN+SX_MAX)/2, by = (SY_MIN+SY_MAX)/2;
-            s1++;
-            if (s1>14) return 0;
-        }
-    } 
-    if (bx > SX_MAX) {
-        bxv = -bxv; 
-        bx = SX_MAX;
-        if (by < p2 - 3 || by > p2 + PADDLE_LEN + 3) {
-            im_line_va[H_RES*(SY_MAX+2)+2*s2+SX_MIN] = 1;
-            bx = (SX_MIN+SX_MAX)/2, by = (SY_MIN+SY_MAX)/2;
-            s2++;
-            if (s2>14) return 0;
-        }
-    }
-    if (by < SY_MIN) {byv = -byv; by = SY_MIN;}
-    if (by > SY_MAX) {byv = -byv; by = SY_MAX;}
-    
-    for(int y = 0; y < PADDLE_LEN; y++) {
-        im_line_va[H_RES*(y+(int)p1)+SX_MIN] = 1;
-        im_line_va[H_RES*(y+(int)p2)+SX_MAX] = 1;
-    }
-    im_line_va[H_RES*(int)by+(int)bx] = 1;
-    
-    wait(1/1200.0f);
-    return 1;
 }
 
-int fishy() {
-    uint16_t xstart, ystart, xend, yend;
-    float s = sinf(ftheta);
-    float c = cosf(ftheta);
-    
-    xstart = (uint16_t) fx;
-    ystart = (uint16_t) fy;
-    
-
-    for(int x = xstart-5; x < xstart + 5; x++) {
-        for (int y = ystart - 5; y < ystart + 5; y++) {
-            im_line_va[H_RES*y+x] = 0;
-        }
+// draw string
+void draw_vincent_string(char* str)
+{
+    for(int i = 0; i < strlen(str); i++)
+    {
+        if(str[i] == 0 || str[i] == EOF) return;
+        char_col++; 
+    if(char_col >= TX)
+    {
+        char_col = 0;
+        char_row++;
     }
-    for (int i = 0; i < 8; i++) {
-        int index = H_RES*(int)uy[i]+(int)ux[i];
-        im_line_va[index] = 0;
-    }    
-
-    float fx_old = fx, fy_old = fy;
-    fx += fv * s;
-    fy += fv * c;
-    int cmd = p1_in.read();
-    if (cmd) ftheta += fa; else ftheta -= fa;
-    if (ftheta >= 2 * 3.1415926) ftheta -= 2 * 3.1415926;
-    if (ftheta < 0) ftheta += 2 * 3.1415926;
-    
-    s = sinf(ftheta);
-    c = cosf(ftheta);
-    
-    xstart = (uint16_t)fx;
-    ystart = (uint16_t)fy;
-    xend = (uint16_t)(fx+s*4);
-    yend = (uint16_t)(fy+c*4);
+    if(char_row >= TY)
+    {
+        char_row = 0;
+    }
     
-    if (xstart < SX_MIN || xstart > SX_MAX ||
-        ystart < SY_MIN || ystart > SY_MAX ||
-        xend < SX_MIN || xend > SX_MAX ||
-        yend < SY_MIN || yend > SY_MAX) {
-        fx = fx_old;
-        fy = fy_old;
-        xstart = (uint16_t)fx;
-        ystart = (uint16_t)fy;
-        xend = (uint16_t)(fx+s*4);
-        yend = (uint16_t)(fy+c*4);
+    draw_vincent(X0 +2 + 8*char_col, Y0 + 14 + 8*char_row, 
+        str[i]);
     }
-
-    draw_line(xstart, ystart, xend, yend);
-    for (int i = 0; i < 8; i++) {
-        if (!ulive[i]) continue;
-        if (xstart == (int)ux[i] && ystart == (int)uy[i]) {
-            fdeath_ticker = FDEATH_RESET;
-            fs+=1;
-            ulive[i] = 0;
-        }
-        ux[i]+= uv*uvx[i];
-        uy[i]+= uv*uvy[i];
-        if (ux[i] < SX_MIN) {ux[i] = SX_MIN; uvx[i] = -uvx[i];}
-        if (ux[i] > SX_MAX) {ux[i] = SX_MAX; uvx[i] = -uvx[i];}
-        if (uy[i] < SY_MIN) {uy[i] = SY_MIN; uvy[i] = -uvy[i];}
-        if (uy[i] > SY_MAX) {uy[i] = SY_MAX; uvy[i] = -uvy[i];}  
-                  
-        int index = H_RES*(int)uy[i]+(int)ux[i];
-        im_line_va[index] = 1;
-    }
-    for (int i = 0; i < 8; i++) {
-        im_line_va[H_RES*(SY_MAX+6)+2*(int)i+SX_MIN] = 0;
-    }
-    for (int i = 0; i < fs; i++) {
-        im_line_va[H_RES*(SY_MAX+6)+2*(int)i+SX_MIN] = 1;
-    }
-    fdeath_ticker--;
-    if (fdeath_ticker < 0) fs -= 0.0001f;
-    if (fs < 0) fs = 0;
-
-    return 1;
 }
 
-void dispchr(int x0, int y0, uint8_t* chr) {
-    int bmi = 0;
-    for(int y = SY_MIN + y0; y < SY_MIN + y0 + 7; y++)
+//void draw_text_buffer()
+//{
+//    for(int yc = 0; yc < TY; yc++)
+//    {
+//        for(int xc = 0; xc < TX; xc++)
+//        {
+//            draw_vincent(X0 + 10 + 8*xc, Y0 + 10 + 8*yc, 
+//                text_buffer[TX*yc + xc]%128);
+//        }
+//    } 
+//}
+
+// should the lisp interpreter run?
+int want_lisp = 0;
+
+void backspace()
+{
+    text_buffer[text_buffer_counter] = 0;
+    if(text_buffer_counter > 0)
+        text_buffer_counter--;
+        
+    draw_vincent(X0 +2 + 8*char_col, Y0 + 14 + 8*char_row, ' ');
+    if(char_col > 0)
+        char_col--;
+    else
     {
-        for(int x = SX_MIN + x0; x < SX_MIN + x0 + 6; x++)
-        {
-            im_line_va[H_RES*y + x] = chr[bmi];
-            bmi++;
-        }
+        char_row--;
+        char_col = TX - 1;
     }
 }
 
-void dispsprite(int x0, int y0, uint8_t* chr) {
-    int bmi = 0;
-    for(int y = SY_MIN + y0; y < SY_MIN + y0 + 8; y++)
+void clear_all_text()
+{
+    char_col = 0;
+    char_row = 0;
+    clr_text_buff();
+    clr();   
+        // startup animation
+    int miter_x_final = XL/2 + 20*cos(.11f*MAX(XL,YL)) + 80;
+    int miter_y_final = YL/2 + 20*sin(.11f*MAX(XL,YL)) + 80;
+    
+    int x_correct = -miter_x_final +  X0 + 6;
+    int y_correct = -miter_y_final +  Y0;
+        for(int i = MAX(XL,YL) - 1; i < MAX(XL,YL); i++)
     {
-        for(int x = SX_MIN + x0; x < SX_MIN + x0 + 7; x++)
+        wait_us(10000);
+        clr();
+        int xp = MIN(XL,i);
+        int yp = MIN(YL,i);
+        draw_line(X0, Y0, X0 + xp, Y0);
+        draw_line(X0+xp,Y0,X0+xp,Y0+yp);
+        
+        draw_line(X0, Y0+yp, X0 +xp, Y0+yp);
+        draw_line(X0,Y0,X0,Y0+yp);
+        float phase = (float)(i) / (float)MAX(XL,YL); 
+        draw_miters_at(xp/2 + 20*cos(.11f*i) + 80 + (x_correct * phase),yp/2 + 20*sin(.11f*i) + 80 + (y_correct * phase));
+        //draw_vincent(100,100,15);
+    }
+    
+    // draw prompt
+    draw_vincent_string(">");
+}
+
+void set_status_string(char* str)
+{
+    uint8_t char_col_backup = char_col;
+    uint8_t char_row_backup = char_row;
+    char_col = 0;
+    char_row = TY - 1;
+    
+    draw_vincent_string(str);
+    
+    char_col = char_col_backup;
+    char_row = char_row_backup;
+}
+
+// on each serial char received
+void serial_callback()
+{
+    // get characeter and store in text_buffer
+    char new_char = pc.getc();
+    most_recent_char = new_char;
+    
+    if(new_char == '^')
+    {
+        want_gfx = 1;
+        return;
+    }
+    //char cn[8];
+    //sprintf(cn,"[%d]",new_char);
+    //draw_vincent_string(cn);
+    if(new_char == 127)
+    {
+        backspace();
+        return;
+    }
+    
+    text_buffer[text_buffer_counter++] = new_char;
+    
+    // if it's <enter>, request lisp
+    if(new_char == 13)
+    {
+        want_lisp = 1;
+        return;
+    }
+
+    
+    // increment rows/cols as needed
+    char_col++; 
+    if(char_col >= TX)
+    {
+        char_col = 0;
+        char_row++;
+    }
+    if(char_row >= TY)
+    {
+        char_row = 0;
+    }
+
+    // draw new character
+    draw_vincent(X0 +2 + 8*char_col, Y0 + 14 + 8*char_row, 
+        new_char%128);
+            
+}
+
+void spin_for_a_while(volatile int a)
+{
+    volatile int k = a;
+    for(int i = 0; i < k; i++)
+    {
+        for(int j = 0; j < k; j++)
         {
-            if (chr[bmi]) im_line_va[H_RES*y + x] = chr[bmi];
-            bmi++;
+            a++;
         }
     }
 }
 
-void disp_tunnel() {
-    for (int y = SY_MIN; y < SY_MAX; y++) {
-        int tunw = 30 * (y) / TUN_LEN;
-        int yy = SY_MAX-(SY_MAX-y)*3/4;
-        for (int x = SX_MIN; x < SX_MIN + tunnel[y - SY_MIN]; x++) im_line_va[H_RES*yy+x] = (x&1)^(y&1);
-        for (int x = SX_MIN + tunnel[y - SY_MIN]; x < SX_MIN + tunnel[y - SY_MIN] + tunw; x++) im_line_va[H_RES*yy+x] = 0;
-        for (int x = SX_MIN + tunnel[y - SY_MIN] + tunw; x < SX_MAX; x++) im_line_va[H_RES*yy+x] = (x&1)^(y&1);
-    }
+uint8_t gfx_is_init = 0;
+
+// screen goes from -.5 to .5 on both axes
+void draw_gfx_line(float x0, float y0, float x1, float y1)
+{
+    float x_width = (XL);
+    float y_height = (YL);
+    
+    // want to rescale to 0 to 1
+    x0 += 0.5f;
+    y0 += 0.5f;
+    
+    x1 += 0.5f;
+    y1 += 0.5f;
+    //printf("x0: %.3f, y0: %.3f\r\n",x0,y0);
+    int xx = x0 * x_width + X0;
+    if(xx > (X0 + XL)) xx = (X0 + XL);
+    if(xx < X0) xx = X0;
+    int yy = y0 * y_height + Y0;
+    if(yy > (Y0 + YL)) yy = (Y0 + YL);
+    if(yy < Y0) yy = Y0;   
+    
+    int xx1 = x1 * x_width + X0;
+    if(xx1 > (X0 + XL)) xx1 = (X0 + XL);
+    if(xx1 < X0) xx1 = X0;
+    int yy1 = y1 * y_height + Y0;
+    if(yy1 > (Y0 + YL)) yy1 = (Y0 + YL);
+    if(yy1 < Y0) yy1 = Y0;   
+    
+    draw_line(xx,yy,xx1,yy1);
+    
 }
-
-void init_tunnel() {
-    for (int i = 0; i < TUN_LEN; i++) tunnel[i] = 20;
-    disp_tunnel();
+//void swap_buffers()
+//{
+//    if(im_line_va == im_line_va_1)
+//        im_line_va = im_line_va_2;
+//    else
+//        im_line_va = im_line_va_1;
+//}
+int main()
+{
+    im_line_va = im_line_va_1;
+    // init serial
+    pc.baud(115200);
+    pc.attach(&serial_callback);
+    pc.printf("derp!\r\n");
+ 
+    // init buffers
+    init_buffers();
+    // init timer
+    t.attach_us(&isr,64);
     
-    int bmi = 0;
+    wait_us(200000);
+    int miter_x_final = XL/2 + 20*cos(.11f*MAX(XL,YL)) + 80;
+    int miter_y_final = YL/2 + 20*sin(.11f*MAX(XL,YL)) + 80;
+    int x_correct = -miter_x_final +  X0 + 6;
+    int y_correct = -miter_y_final +  Y0;
     
-    for(int y = SY_MIN; y < SY_MIN + BY; y++)
+    for(int i = 0; i < MAX(XL,YL); i+=3)
     {
-        for(int x = SX_MIN; x < SX_MIN + BX; x++)
-        {
-            im_line_va[H_RES*y + x + 10] = tv[bmi];
-            bmi++;
-        }
-    }
-    dispsprite(1,2,sprite_tree);
-    dispsprite(50,2,sprite_tree);
-    dispsprite(11,2,sprite_tree);
-}
-
-void update_tunnel() {
-    for (int j = TUN_LEN-1; j > 0; j--) tunnel[j] = tunnel[j-1];
-    
-    int x = rand() % 48;
-    if (x == 0) tundir = -tundir;
-    if (x > 24) tunnel[0] = tunnel[0]+tundir;
-    
-    if (tunnel[0] < 1) {
-        tunnel[0] = 1;
-        tundir = 1;
-    }
-    if (SX_MIN + tunnel[0] + 30 + 1 > SX_MAX) {
-        tunnel[0] = SX_MAX-SX_MIN-30-1;
-        tundir = -1;
+        char stat_buff[30];
+        sprintf(stat_buff,"f: %d",i);
+        set_status_string(stat_buff);
+        //wait_us(10000);
+        
+        spin_for_a_while(200);
+        clr();
+        int xp = MIN(XL,i);
+        int yp = MIN(YL,i);
+        draw_line(X0, Y0, X0 + xp, Y0);
+        draw_line(X0+xp,Y0,X0+xp,Y0+yp);
+        
+        draw_line(X0, Y0+yp, X0 +xp, Y0+yp);
+        draw_line(X0,Y0,X0,Y0+yp);
+        float phase = (float)(i) / (float)MAX(XL,YL); 
+        draw_miters_at(xp/2 + 20*cos(.11f*i) + 80 + (x_correct * phase),yp/2 + 20*sin(.11f*i) + 80 + (y_correct * phase));
+        //draw_vincent(100,100,15);
     }
     
-    disp_tunnel();
-    
-    int cmd1 = p1_in.read();
-    int cmd2 = p2_in.read();
-    if (cmd1) tunnp+=1.0f;
-    if (cmd2) tunnp-=1.0f;
-    if (tunnp<SX_MIN+8) tunnp = SX_MIN+8;
-    if (tunnp>SX_MAX-8) tunnp = SX_MAX-8;
-    leg_ctr++;
-    if (leg_ctr == 50) leg_ctr = 0;
-    if (leg_ctr < 25) dispsprite((int)(tunnp-SX_MIN), 31, sprite_manl);
-    else dispsprite((int)(tunnp-SX_MIN), 31, sprite_manr);
-    
-    wait(0.01);
-}
-
-void update_rc() {
-    int cmd1 = p1_in.read();
-    int cmd2 = p2_in.read();
-    if (!cmd1) {
-        float oldDirX = dirX;
-        dirX = dirX * rc_cos - dirY * rc_sin;
-        dirY = oldDirX * rc_sin + dirY * rc_cos;
-        float oldPlaneX = planeX;
-        planeX = planeX * rc_cos - planeY * rc_sin;
-        planeY = oldPlaneX * rc_sin + planeY * rc_cos;
-    }
-    if (!cmd2) {
-        float oldDirX = dirX;
-        dirX = dirX * rc_cos + dirY * rc_sin;
-        dirY = -oldDirX * rc_sin + dirY * rc_cos;
-        float oldPlaneX = planeX;
-        planeX = planeX * rc_cos + planeY * rc_sin;
-        planeY = -oldPlaneX * rc_sin + planeY * rc_cos;
-    }
-    if(worldMap[int(posX + dirX * 0.01f)][int(posY)] == false) posX += dirX * 0.01f;
-    if(worldMap[int(posX)][int(posY + dirY * 0.01f)] == false) posY += dirY * 0.01f;
-    
-    int w = SX_MAX-SX_MIN;
-    int h = SY_MAX-SY_MIN;
-    for (int x = 0; x < SX_MAX - SX_MIN; x++) {
-        float cameraX = 2 * x / float(w) - 1; //x-coordinate in camera space
-        float rayPosX = posX;
-        float rayPosY = posY;
-        float rayDirX = dirX + planeX * cameraX;
-        float rayDirY = dirY + planeY * cameraX;
-        
-        int mapX = int(rayPosX);
-        int mapY = int(rayPosY);
-        
-        float sideDistX, sideDistY;
-        
-        float deltaDistX = sqrtf(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX));
-        float deltaDistY = sqrtf(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY));
-        float perpWallDist;
-        
-        int stepX, stepY;
-        int hit = 0, side;
-        if (rayDirX < 0) {
-            stepX = -1;
-            sideDistX = (rayPosX - mapX) * deltaDistX;
-        } else {
-            stepX = 1;
-            sideDistX = (mapX + 1.0 - rayPosX) * deltaDistX;
-        }
-        if (rayDirY < 0) {
-            stepY = -1;
-            sideDistY = (rayPosY - mapY) * deltaDistY;
-        } else {
-            stepY = 1;
-            sideDistY = (mapY + 1.0 - rayPosY) * deltaDistY;
+    clear_all_text();
+    draw_vincent_string("Welcome to LISP MACHINE");
+    new_line();
+    draw_vincent_string("Connect over USB serial");
+    new_line();
+    draw_vincent_string("115200 baud");
+    new_line();
+    draw_vincent_string("use 'clear' to clear");
+    new_line();
+    draw_vincent_string("use '^' to use 3D MODE");
+    new_line();
+    draw_vincent_string(">");
+    // main loop
+    for(;;) 
+    {
+        if(want_lisp) 
+        {
+            new_line();
+            // runs interpreter and prints answer
+//            run_lisp(text_buffer);
+//            want_lisp = 0;
+//            new_line();
+//            clr_text_buff();
+            //draw_vincent_string(">");
         }
         
-         while (hit == 0)
+        if(want_gfx)
         {
-            //jump to next map square, OR in x-direction, OR in y-direction
-            if (sideDistX < sideDistY)
-            {
-              sideDistX += deltaDistX;
-              mapX += stepX;
-              side = 0;
-            }
-            else
+            if(!gfx_is_init)
             {
-              sideDistY += deltaDistY;
-              mapY += stepY;
-              side = 1;
-            }
-            //Check if ray has hit a wall
-            if (worldMap[mapX][mapY] > 0) hit = 1;
-        }
-        //Calculate distance projected on camera direction (oblique distance will give fisheye effect!)
-        if (side == 0) perpWallDist = (mapX - rayPosX + (1 - stepX) / 2) / rayDirX;
-        else           perpWallDist = (mapY - rayPosY + (1 - stepY) / 2) / rayDirY;
-        
-        //Calculate height of line to draw on screen
-        int drawStart,drawEnd;
-        int lineHeight = (int)(h / perpWallDist);
-        if (lineHeight > h) {
-            drawStart = 0;
-            drawEnd = h;
-        } else {
-            drawStart = -lineHeight / 2 + h / 2;
-            drawEnd = lineHeight / 2 + h / 2;
-        }
-        if (side == 0) {
-            for(int y = 0; y < drawStart; y++) {
-                im_line_va[H_RES*(y+SY_MIN)+x+SX_MIN] = 0;
-            }
-            for(int y = drawStart;y < drawEnd;y++) {
-                im_line_va[H_RES*(y+SY_MIN)+x+SX_MIN] = 1;
-            }
-            for(int y = drawEnd; y < h; y++) {
-                im_line_va[H_RES*(y+SY_MIN)+x+SX_MIN] = 0;
-            }
-        } else {
-            for(int y = 0; y < h; y++) im_line_va[H_RES*(y+SY_MIN)+x+SX_MIN] = 0;
-            im_line_va[H_RES*(drawStart+SY_MIN)+x+SX_MIN] = 1;
-            im_line_va[H_RES*(drawEnd-1+SY_MIN)+x+SX_MIN] = 1;
+                init_gfx();
+                gfx_is_init = 1;
+            }   
+            new_frame(most_recent_char);
+            most_recent_char = '0';
+            spin_for_a_while(100);
+            clr();
+            draw_line(X0, Y0, X0 + XL, Y0);
+            draw_line(X0+XL,Y0,X0+XL,Y0+YL);
+            draw_line(X0, Y0+YL, X0 +XL, Y0+YL);
+            draw_line(X0,Y0,X0,Y0+YL);
+            //draw_gfx_line(-0.01,-0.01,0.01,0.01);
+
+            set_status_string(get_gfx_stat());
+            //swap_buffers();
+            
         }
     }
 }
 
-void update_m7() {
-    int w = SX_MAX-SX_MIN;
-    int h = SY_MAX-SY_MIN;
-    float c = cosf(m7_theta);
-    float s = sinf(m7_theta);
-    for (int y = 0; y < h; y++) {
-        for (int x = 0; x < w; x++) {
-            float xx, yy;
-            yy = y;
-            xx = (x-w/2)*(h-yy)/h+w/2;
-            xx = xx * (float) mapWidth / w - m7_x;
-            yy = yy * (float) mapHeight / h - 2*m7_y;
-
-            float xx_old = xx;
-            float yy_old = yy;
-            xx = xx_old*c-yy_old*s;
-            yy = xx_old*s+yy_old*c;
-            xx *= 1.0f;
-            yy *= 1.0f;
-            
-            xx += m7_x;
-            yy += m7_y;
-
-            if (xx < 0 || xx >= mapWidth+1 || yy < 0 || yy > mapHeight+1) {
-                im_line_va[H_RES*(SY_MIN+y)+x+SX_MIN] = 0;
-            } else if (worldMap[(int)yy][(int)xx] == 0) {
-                im_line_va[H_RES*(SY_MIN+y)+x+SX_MIN] = 0;
-            } else {
-                im_line_va[H_RES*(SY_MIN+y)+x+SX_MIN] = 1;
-            }
-        }
-    }
-    int cmd1 = p1_in.read();
-    int cmd2 = p2_in.read();
-    if (!cmd1) m7_theta+=0.03f;
-    if (!cmd2) m7_theta-=0.03f;
-}
-
-int main() {
-    potato:
-    init_buffers();
-    t.attach_us(&isr,63);
-    
-    //for(;;){update_m7();}
-    
-    int bmi = 0;
-    
-    for(int y = SY_MIN; y < SY_MIN + BY2; y++)
-    {
-        for(int x = SX_MIN; x < SX_MIN + BX; x++)
-        {
-            im_line_va[H_RES*y + x] = miters[bmi];
-            bmi++;
-        }
-    }
-    
-    int cursor_pos = 0;
-    int menu_offs = 0;
-    
-    for (;;) {
-        int cmd1 = p1_in.read();
-        int cmd2 = p2_in.read();
-        
-        int cursor_x = SX_MIN;
-        int cursor_y = SY_MIN + 8*cursor_pos + BY2 + 5;
-        
-        if (cmd1 || cmd2) im_line_va[H_RES*cursor_y+cursor_x] = 0;
-        
-        if (!cmd1) cursor_pos++;
-        if (!cmd2) cursor_pos--;
-        if (!cmd1 && !cmd2) break;
-        
-        if (cursor_pos < 0) cursor_pos = 0;
-        if (cursor_pos > 4) cursor_pos = 4;
-        if (cursor_pos > 3) menu_offs = cursor_pos - 3; else menu_offs = 0;
-        
-        cursor_x = SX_MIN;
-        if (cursor_pos < 4) cursor_y = SY_MIN + 8*cursor_pos + BY2 + 5;
-        else cursor_y = SY_MIN + 8*3 + BY2 + 5;
-        
-        for(int y = 0; y < 4; y++) {
-            for(int x = 0; x < 4; x++) {
-                dispchr(4+7*x,BY2+1+8*y,menu[4*(y+menu_offs)+x]);
-            }
-        }
-        
-        im_line_va[H_RES*cursor_y+cursor_x] = 1;
-        
-        wait(0.1);
-    }
-    
-    init_buffers();
-    
-    if (cursor_pos == 0) {
-        for (;;) {
-            if (!flappy_pong()) break;
-        }
-    } else if (cursor_pos == 1) {
-        for (;;) fishy();
-    } else if (cursor_pos == 2) {
-        for (;;) update_image();
-    } else if (cursor_pos == 3) {
-        init_tunnel();    
-        for (;;) 
-        {
-            update_tunnel();
-        }
-    } else if (cursor_pos == 4) {
-        for (;;) {
-            update_rc();
-        }
-    }
-    goto potato;
-}
+    
\ No newline at end of file