/*
* app_video_lib.c
*
* Created: 2014/10/8 18:23:55
*
Author: leo20_000
*/
#include "functions.h"
#include "app_fontset.h"
#include <avr/pgmspace.h>
#include <stdint.h>
#include <stdio.h>
#include <util/delay.h>
#define maxkeys 16
#define PORTDIR DDRB
#define PORTDATA PORTB
#define PORTIN PINB
#define right 20
#define down 30
#define left 40
#define cw 50
#define ccw 60
char
str;
uint8_t screen[screen_array_size];
//One bit masks
uint8_t pos[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
int cri; //change to floats
int no_syl;
int syl_dur;
int sri;
int bf;
int dc;
int calc_val[8];
int index;
int cnt;
int fp;
//timeout value for LCD task
#define t2 100
// The raw keyscan
unsigned char key, debounce_key ;
// The decoded button number
unsigned char butnum ;
int enter;
int butval;
//*************************************************
// Draw and Delete Squares
//*************************************************
void draw_square(int x, int y) {
int new_x = x * 10;
int new_y = y * 10;
video_line(new_x, new_y,
new_x + 9, new_y, 1);
video_line(new_x + 9, new_y, new_x + 9, new_y + 9, 1);
video_line(new_x + 9, new_y + 9, new_x, new_y + 9, 1);
video_line(new_x, new_y + 9, new_x,
new_y, 1);
}
void draw_square_tp(int x, int y) {
int new_x = x * 6;
int new_y = y * 6;
video_line(new_x, new_y,
new_x + 5, new_y, 1);
video_line(new_x + 5, new_y, new_x + 5, new_y + 5, 1);
video_line(new_x + 5, new_y + 5, new_x, new_y + 5, 1);
video_line(new_x, new_y + 5, new_x,
new_y, 1);
}
void delete_square(int x, int y) {
int new_x = x * 10;
int new_y = y * 10;
video_line(new_x, new_y,
new_x + 9, new_y, 0);
video_line(new_x + 9, new_y, new_x + 9, new_y + 9, 0);
video_line(new_x + 9, new_y + 9, new_x, new_y + 9, 0);
video_line(new_x, new_y + 9, new_x,
new_y, 0);
}
void delete_square_tp(int x, int y) {
int new_x = x * 6;
int new_y = y * 6;
video_line(new_x, new_y,
new_x + 5, new_y, 0);
video_line(new_x + 5, new_y, new_x + 5, new_y + 5, 0);
video_line(new_x + 5, new_y + 5, new_x, new_y + 5, 0);
video_line(new_x, new_y + 5, new_x,
new_y, 0);
}
space spin_shape(int x, int y, int rand, int spin)
{
space
s;
if( rand == 0 ){
if (spin == 0 || spin == 2)
{
s.a[0][0]= x - 2;
s.a[1][0] = y;
s.a[0][1] = x - 1;
s.a[1][1] = y;
s.a[0][2] = x;
s.a[1][2] = y;
s.a[0][3] = x + 1;
s.a[1][3] = y;
s.r_wall = 1;
s.l_wall = 2;
s.floor = 0;
}
else
{
s.a[0][0]= x;
s.a[1][0] = y - 2;
s.a[0][1] = x;
s.a[1][1] = y - 1;
s.a[0][2] = x;
s.a[1][2] = y;
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 0;
s.l_wall = 0;
s.floor = 1;
}
}//if (rand == 0)
else if ( rand == 1 ) {
s.a[0][0] = x - 1;
s.a[1][0] = y;
s.a[0][1] = x;
s.a[1][1] = y;
s.a[0][2] = x;
s.a[1][2] = y + 1;
s.a[0][3] = x - 1;
s.a[1][3] = y + 1;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 1;
}//else if (rand ==
1)
else if ( rand == 2 ) {
if(spin == 0)
{
s.a[0][0] = x;
s.a[1][0] = y;
s.a[0][1] = x - 1;
s.a[1][1] = y;
s.a[0][2] = x + 1;
s.a[1][2] = y;
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 1;
}
else if (spin == 1)
{
s.a[0][0] = x;
s.a[1][0] = y;
s.a[0][1] = x;
s.a[1][1] = y - 1;
s.a[0][2] = x - 1;
s.a[1][2] = y;
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 1;
}
else if(spin == 2)
{
s.a[0][0] = x;
s.a[1][0] = y;
s.a[0][1] = x - 1;
s.a[1][1] = y;
s.a[0][2] = x + 1;
s.a[1][2] = y;
s.a[0][3] = x;
s.a[1][3] = y - 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 0;
}
else if (spin == 3)
{
s.a[0][0] = x;
s.a[1][0] = y;
s.a[0][1] = x;
s.a[1][1] = y - 1;
s.a[0][2] = x + 1;
s.a[1][2] = y;
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 0;
s.floor = 1;
}
}//else if (rand ==
2)
else if ( rand == 3 ) {
if (spin == 0)
{
s.a[0][0] = x - 1;
s.a[1][0] = y;
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
s.a[0][3] = x;
s.a[1][3] = y + 2;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 2;
}
if (spin == 1)
{
s.a[0][0] = x;
s.a[1][0] = y + 1;
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
s.a[0][3] = x - 2;
s.a[1][3] = y + 2;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 2;
}
if (spin == 2)
{
s.a[0][0] = x - 1;
s.a[1][0] = y;
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
s.a[0][3] = x - 2;
s.a[1][3] = y;
s.r_wall = -1;
s.l_wall = 2;
s.floor = 2;
}
else if (spin == 3)
{
s.a[0][0] = x;
s.a[1][0] = y + 1;
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
s.a[0][3] = x;
s.a[1][3] = y;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 1;
}
}//else if (rand ==
3)
else if ( rand == 4 ) {
if (spin == 0)
{
s.a[0][0] = x - 1;
s.a[1][0] = y;
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
s.a[0][3] = x - 2;
s.a[1][3] = y + 2;
s.r_wall = -1;
s.l_wall = 2;
s.floor = 2;
}
if (spin == 1)
{
s.a[0][0] = x;
s.a[1][0] = y + 1;
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
s.a[0][3] = x - 2;
s.a[1][3] = y;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 1;
}
if (spin == 2)
{
s.a[0][0] = x - 1;
s.a[1][0] = y;
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
s.a[0][3] = x;
s.a[1][3] = y;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 2;
}
else if (spin == 3)
{
s.a[0][0] = x;
s.a[1][0] = y + 1;
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
s.a[0][3] = x;
s.a[1][3] = y + 2;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 2;
}
}//else if (rand ==
4)
else if ( rand == 5 ) {
if (spin == 0 || spin == 2)
{
s.a[0][0] = x;
s.a[1][0] = y;
s.a[0][1] = x + 1;
s.a[1][1] = y;
s.a[0][2] = x;
s.a[1][2] = y - 1;
s.a[0][3] = x - 1;
s.a[1][3] = y - 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 0;
}
else
{
s.a[0][0] = x;
s.a[1][0] = y;
s.a[0][1] = x + 1;
s.a[1][1] = y;
s.a[0][2] = x;
s.a[1][2] = y - 1;
s.a[0][3] = x + 1;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 0;
s.floor = 1;
}
}//else if (rand ==5)
else if ( rand == 6 ) {
if (spin == 0 || spin == 2)
{
s.a[0][0] = x;
s.a[1][0] = y;
s.a[0][1] = x - 1;
s.a[1][1] = y;
s.a[0][2] = x;
s.a[1][2] = y + 1;
s.a[0][3] = x + 1;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 1;
}
else
{
s.a[0][0] = x;
s.a[1][0] = y;
s.a[0][1] = x + 1;
s.a[1][1] = y;
s.a[0][2] = x;
s.a[1][2] = y + 1;
s.a[0][3] = x + 1;
s.a[1][3] = y - 1;
s.r_wall = 1;
s.l_wall = 0;
s.floor = 1;
}
}//else if (rand ==
6)
return s;
}//space spin_shape(...
space draw_shape(int x, int y, int rand, int spin, int two_player) {
space
s;
if(!two_player)
{
if( rand == 0 ){
s
= draw_four_by_one(x, y, spin);
}
else if ( rand == 1 ) {
s
= draw_two_by_two (x, y);
}
else if ( rand == 2 ) {
s
= draw_T(x, y, spin);
}
else if ( rand == 3 ) {
s
= draw_L(x, y, spin);
}
else if ( rand == 4 ) {
s
= draw_backward_L(x, y, spin);
}
else if ( rand == 5 ) {
s
= draw_s(x, y, spin);
}
else if ( rand == 6 ) {
s
= draw_z(x, y, spin);
}
return s;
}
else
{
if( rand == 0 ){
s
=
draw_four_by_one_tp(x, y, spin);
}
else if ( rand == 1 ) {
s
=
draw_two_by_two_tp (x, y);
}
else if ( rand == 2 ) {
s
= draw_T_tp(x, y, spin);
}
else if ( rand == 3 ) {
s
= draw_L_tp(x, y, spin);
}
else if ( rand == 4 ) {
s
=
draw_backward_L_tp(x, y, spin);
}
else if ( rand == 5 ) {
s
= draw_s_tp(x, y, spin);
}
else if ( rand == 6 ) {
s
= draw_z_tp(x, y, spin);
}
return s;
}
}//space draw_shape(...
//*************************************************
// One Player Shapes
//*************************************************
space draw_four_by_one(int x, int y, int spin) {
space
s;
if (spin == 0 || spin == 2)
{
draw_square(x - 2, y);
s.a[0][0]= x - 2;
s.a[1][0] = y;
draw_square(x - 1, y);
s.a[0][1] = x - 1;
s.a[1][1] = y;
draw_square(x, y);
s.a[0][2] = x;
s.a[1][2] = y;
draw_square(x + 1, y);
s.a[0][3] = x + 1;
s.a[1][3] = y;
s.r_wall = 1;
s.l_wall = 2;
s.floor = 0;
}
else
{
draw_square(x, y - 2);
s.a[0][0]= x;
s.a[1][0] = y - 2;
draw_square(x, y - 1);
s.a[0][1] = x;
s.a[1][1] = y - 1;
draw_square(x, y);
s.a[0][2] = x;
s.a[1][2] = y;
draw_square(x, y + 1);
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 0;
s.l_wall = 0;
s.floor = 1;
}
return s;
}
space draw_two_by_two(int x, int y) {
space
s;
draw_square(x - 1, y );
s.a[0][0] = x - 1;
s.a[1][0] = y;
draw_square(x, y
);
s.a[0][1] = x;
s.a[1][1] = y;
draw_square(x, y + 1);
s.a[0][2] = x;
s.a[1][2] = y + 1;
draw_square(x - 1, y + 1);
s.a[0][3] = x - 1;
s.a[1][3] = y + 1;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 1;
return s;
}
space draw_T(int x, int y, int spin) {
space
s;
if(spin == 0)
{
draw_square(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square(x - 1, y );
s.a[0][1] = x - 1;
s.a[1][1] = y;
draw_square(x + 1, y );
s.a[0][2] = x + 1;
s.a[1][2] = y;
draw_square(x , y + 1);
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 1;
}
else if (spin == 1)
{
draw_square(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square(x , y - 1);
s.a[0][1] = x;
s.a[1][1] = y - 1;
draw_square(x - 1, y );
s.a[0][2] = x - 1;
s.a[1][2] = y;
draw_square(x , y + 1);
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 1;
}
else if(spin == 2)
{
draw_square(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square(x - 1, y );
s.a[0][1] = x - 1;
s.a[1][1] = y;
draw_square(x + 1, y );
s.a[0][2] = x + 1;
s.a[1][2] = y;
draw_square(x , y - 1);
s.a[0][3] = x;
s.a[1][3] = y - 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 0;
}
else if (spin == 3)
{
draw_square(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square(x , y - 1);
s.a[0][1] = x;
s.a[1][1] = y - 1;
draw_square(x + 1, y );
s.a[0][2] = x + 1;
s.a[1][2] = y;
draw_square(x , y + 1);
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 0;
s.floor = 1;
}
return s;
}
space draw_L(int x, int y, int spin) {
space
s;
if (spin == 0)
{
draw_square(x - 1, y );
s.a[0][0] = x - 1;
s.a[1][0] = y;
draw_square(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square(x - 1, y + 2);
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
draw_square(x , y + 2);
s.a[0][3] = x;
s.a[1][3] = y + 2;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 2;
}
if (spin == 1)
{
draw_square(x , y + 1);
s.a[0][0] = x;
s.a[1][0] = y + 1;
draw_square(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square(x - 2, y + 1);
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
draw_square(x - 2, y + 2);
s.a[0][3] = x - 2;
s.a[1][3] = y + 2;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 2;
}
if (spin == 2)
{
draw_square(x - 1, y );
s.a[0][0] = x - 1;
s.a[1][0] = y;
draw_square(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square(x - 1, y + 2);
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
draw_square(x - 2, y );
s.a[0][3] = x - 2;
s.a[1][3] = y;
s.r_wall = -1;
s.l_wall = 2;
s.floor = 2;
}
else if (spin == 3)
{
draw_square(x , y + 1);
s.a[0][0] = x;
s.a[1][0] = y + 1;
draw_square(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square(x - 2, y + 1);
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
draw_square(x , y
);
s.a[0][3] = x;
s.a[1][3] = y;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 1;
}
return s;
}
space draw_backward_L(int x, int y, int spin) {
space
s;
if (spin == 0)
{
draw_square(x - 1, y );
s.a[0][0] = x - 1;
s.a[1][0] = y;
draw_square(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square(x - 1, y + 2);
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
draw_square(x - 2, y + 2);
s.a[0][3] = x - 2;
s.a[1][3] = y + 2;
s.r_wall = -1;
s.l_wall = 2;
s.floor = 2;
}
if (spin == 1)
{
draw_square(x , y + 1);
s.a[0][0] = x;
s.a[1][0] = y + 1;
draw_square(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square(x - 2, y + 1);
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
draw_square(x - 2, y );
s.a[0][3] = x - 2;
s.a[1][3] = y;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 1;
}
if (spin == 2)
{
draw_square(x - 1, y );
s.a[0][0] = x - 1;
s.a[1][0] = y;
draw_square(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square(x - 1, y + 2);
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
draw_square(x , y
);
s.a[0][3] = x;
s.a[1][3] = y;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 2;
}
else if (spin == 3)
{
draw_square(x , y + 1);
s.a[0][0] = x;
s.a[1][0] = y + 1;
draw_square(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square(x - 2, y + 1);
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
draw_square(x , y + 2);
s.a[0][3] = x;
s.a[1][3] = y + 2;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 2;
}
return s;
}
space draw_s(int x, int y, int spin) {
space
s;
if (spin == 0 || spin == 2)
{
draw_square(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square(x - 1, y );
s.a[0][1] = x - 1;
s.a[1][1] = y;
draw_square(x , y - 1);
s.a[0][2] = x;
s.a[1][2] = y - 1;
draw_square(x + 1, y - 1);
s.a[0][3] = x + 1;
s.a[1][3] = y - 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 0;
}
else
{
draw_square(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square(x + 1, y );
s.a[0][1] = x + 1;
s.a[1][1] = y;
draw_square(x , y - 1);
s.a[0][2] = x;
s.a[1][2] = y - 1;
draw_square(x + 1, y + 1);
s.a[0][3] = x + 1;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 0;
s.floor = 1;
}
return s;
}
space draw_z(int x, int y, int spin) {
space
s;
if (spin == 0 || spin == 2)
{
draw_square(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square(x - 1, y );
s.a[0][1] = x - 1;
s.a[1][1] = y;
draw_square(x , y + 1);
s.a[0][2] = x;
s.a[1][2] = y + 1;
draw_square(x + 1, y + 1);
s.a[0][3] = x + 1;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 1;
}
else
{
draw_square(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square(x + 1, y );
s.a[0][1] = x + 1;
s.a[1][1] = y;
draw_square(x , y + 1);
s.a[0][2] = x;
s.a[1][2] = y + 1;
draw_square(x + 1, y - 1);
s.a[0][3] = x + 1;
s.a[1][3] = y - 1;
s.r_wall = 1;
s.l_wall = 0;
s.floor = 1;
}
return s;
}
//*************************************************
// Two Player Shapes
//*************************************************
space draw_four_by_one_tp(int x, int y, int spin) {
space
s;
if (spin == 0 || spin == 2)
{
draw_square_tp(x - 2, y);
s.a[0][0]= x - 2;
s.a[1][0] = y;
draw_square_tp(x - 1, y);
s.a[0][1] = x - 1;
s.a[1][1] = y;
draw_square_tp(x, y);
s.a[0][2] = x;
s.a[1][2] = y;
draw_square_tp(x + 1, y);
s.a[0][3] = x + 1;
s.a[1][3] = y;
s.r_wall = 1;
s.l_wall = 2;
s.floor = 0;
}
else
{
draw_square_tp(x, y - 2);
s.a[0][0]= x;
s.a[1][0] = y - 2;
draw_square_tp(x, y - 1);
s.a[0][1] = x;
s.a[1][1] = y - 1;
draw_square_tp(x, y);
s.a[0][2] = x;
s.a[1][2] = y;
draw_square_tp(x, y + 1);
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 0;
s.l_wall = 0;
s.floor = 1;
}
return s;
}
space draw_two_by_two_tp(int x, int y) {
space
s;
draw_square_tp(x - 1, y );
s.a[0][0] = x - 1;
s.a[1][0] = y;
draw_square_tp(x, y
);
s.a[0][1] = x;
s.a[1][1] = y;
draw_square_tp(x, y + 1);
s.a[0][2] = x;
s.a[1][2] = y + 1;
draw_square_tp(x - 1, y + 1);
s.a[0][3] = x - 1;
s.a[1][3] = y + 1;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 1;
return s;
}
space draw_T_tp(int x, int y, int spin) {
space
s;
if(spin == 0)
{
draw_square_tp(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square_tp(x - 1, y );
s.a[0][1] = x - 1;
s.a[1][1] = y;
draw_square_tp(x + 1, y );
s.a[0][2] = x + 1;
s.a[1][2] = y;
draw_square_tp(x , y + 1);
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 1;
}
else if (spin == 1)
{
draw_square_tp(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square_tp(x , y - 1);
s.a[0][1] = x;
s.a[1][1] = y - 1;
draw_square_tp(x - 1, y );
s.a[0][2] = x - 1;
s.a[1][2] = y;
draw_square_tp(x , y + 1);
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 1;
}
else if(spin == 2)
{
draw_square_tp(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square_tp(x - 1, y );
s.a[0][1] = x - 1;
s.a[1][1] = y;
draw_square_tp(x + 1, y );
s.a[0][2] = x + 1;
s.a[1][2] = y;
draw_square_tp(x , y - 1);
s.a[0][3] = x;
s.a[1][3] = y - 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 0;
}
else if (spin == 3)
{
draw_square_tp(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square_tp(x , y - 1);
s.a[0][1] = x;
s.a[1][1] = y - 1;
draw_square_tp(x + 1, y );
s.a[0][2] = x + 1;
s.a[1][2] = y;
draw_square_tp(x , y + 1);
s.a[0][3] = x;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 0;
s.floor = 1;
}
return s;
}
space draw_L_tp(int x, int y, int spin) {
space
s;
if (spin == 0)
{
draw_square_tp(x - 1, y );
s.a[0][0] = x - 1;
s.a[1][0] = y;
draw_square_tp(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square_tp(x - 1, y + 2);
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
draw_square_tp(x , y + 2);
s.a[0][3] = x;
s.a[1][3] = y + 2;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 2;
}
if (spin == 1)
{
draw_square_tp(x , y + 1);
s.a[0][0] = x;
s.a[1][0] = y + 1;
draw_square_tp(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square_tp(x - 2, y + 1);
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
draw_square_tp(x - 2, y + 2);
s.a[0][3] = x - 2;
s.a[1][3] = y + 2;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 2;
}
if (spin == 2)
{
draw_square_tp(x - 1, y );
s.a[0][0] = x - 1;
s.a[1][0] = y;
draw_square_tp(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square_tp(x - 1, y + 2);
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
draw_square_tp(x - 2, y );
s.a[0][3] = x - 2;
s.a[1][3] = y;
s.r_wall = -1;
s.l_wall = 2;
s.floor = 2;
}
else if (spin == 3)
{
draw_square_tp(x , y + 1);
s.a[0][0] = x;
s.a[1][0] = y + 1;
draw_square_tp(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square_tp(x - 2, y + 1);
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
draw_square_tp(x , y
);
s.a[0][3] = x;
s.a[1][3] = y;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 1;
}
return s;
}
space draw_backward_L_tp(int x, int y, int spin) {
space
s;
if (spin == 0)
{
draw_square_tp(x - 1, y );
s.a[0][0] = x - 1;
s.a[1][0] = y;
draw_square_tp(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square_tp(x - 1, y + 2);
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
draw_square_tp(x - 2, y + 2);
s.a[0][3] = x - 2;
s.a[1][3] = y + 2;
s.r_wall = -1;
s.l_wall = 2;
s.floor = 2;
}
if (spin == 1)
{
draw_square_tp(x , y + 1);
s.a[0][0] = x;
s.a[1][0] = y + 1;
draw_square_tp(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square_tp(x - 2, y + 1);
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
draw_square_tp(x - 2, y );
s.a[0][3] = x - 2;
s.a[1][3] = y;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 1;
}
if (spin == 2)
{
draw_square_tp(x - 1, y );
s.a[0][0] = x - 1;
s.a[1][0] = y;
draw_square_tp(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square_tp(x - 1, y + 2);
s.a[0][2] = x - 1;
s.a[1][2] = y + 2;
draw_square_tp(x , y
);
s.a[0][3] = x;
s.a[1][3] = y;
s.r_wall = 0;
s.l_wall = 1;
s.floor = 2;
}
else if (spin == 3)
{
draw_square_tp(x , y + 1);
s.a[0][0] = x;
s.a[1][0] = y + 1;
draw_square_tp(x - 1, y + 1);
s.a[0][1] = x - 1;
s.a[1][1] = y + 1;
draw_square_tp(x - 2, y + 1);
s.a[0][2] = x - 2;
s.a[1][2] = y + 1;
draw_square_tp(x , y + 2);
s.a[0][3] = x;
s.a[1][3] = y + 2;
s.r_wall = 0;
s.l_wall = 2;
s.floor = 2;
}
return s;
}
space draw_s_tp(int x, int y, int spin) {
space
s;
if (spin == 0 || spin == 2)
{
draw_square_tp(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square_tp(x + 1, y );
s.a[0][1] = x + 1;
s.a[1][1] = y;
draw_square_tp(x , y - 1);
s.a[0][2] = x;
s.a[1][2] = y - 1;
draw_square_tp(x - 1, y - 1);
s.a[0][3] = x - 1;
s.a[1][3] = y - 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 0;
}
else
{
draw_square_tp(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square_tp(x + 1, y );
s.a[0][1] = x + 1;
s.a[1][1] = y;
draw_square_tp(x , y + 1);
s.a[0][2] = x;
s.a[1][2] = y + 1;
draw_square_tp(x + 1, y - 1);
s.a[0][3] = x + 1;
s.a[1][3] = y - 1;
s.r_wall = 1;
s.l_wall = 0;
s.floor = 1;
}
return s;
}
space draw_z_tp(int x, int y, int spin) {
space
s;
if (spin == 0 || spin == 2)
{
draw_square_tp(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square_tp(x + 1, y );
s.a[0][1] = x + 1;
s.a[1][1] = y;
draw_square_tp(x , y + 1);
s.a[0][2] = x;
s.a[1][2] = y + 1;
draw_square_tp(x - 1, y + 1);
s.a[0][3] = x - 1;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 1;
s.floor = 1;
}
else
{
draw_square_tp(x , y
);
s.a[0][0] = x;
s.a[1][0] = y;
draw_square_tp(x + 1, y );
s.a[0][1] = x + 1;
s.a[1][1] = y;
draw_square_tp(x , y - 1);
s.a[0][2] = x;
s.a[1][2] = y - 1;
draw_square_tp(x + 1, y + 1);
s.a[0][3] = x + 1;
s.a[1][3] = y + 1;
s.r_wall = 1;
s.l_wall = 0;
s.floor = 1;
}
return s;
}
void delete_shape(int x, int y, int rand, int spin, int two_player) {
if(!two_player)
{
if( rand == 0 ){
delete_four_by_one(x, y, spin);
}
else if (rand == 1){
delete_two_by_two
(x, y);
}
else if ( rand == 2 ) {
delete_T(x, y, spin);
}
else if ( rand == 3 ) {
delete_L(x, y, spin);
}
else if ( rand == 4 ) {
delete_backward_L(x, y, spin);
}
else if ( rand == 5 ) {
delete_s(x, y, spin);
}
else if ( rand == 6 ) {
delete_z(x, y, spin);
}
}
else
{
if( rand == 0 ){
delete_four_by_one_tp(x, y, spin);
}
else if (rand == 1){
delete_two_by_two_tp (x, y);
}
else if ( rand == 2 ) {
delete_T_tp(x, y, spin);
}
else if ( rand == 3 ) {
delete_L_tp(x, y, spin);
}
else if ( rand == 4 ) {
delete_backward_L_tp(x, y, spin);
}
else if ( rand == 5 ) {
delete_s_tp(x, y, spin);
}
else if ( rand == 6 ) {
delete_z_tp(x, y, spin);
}
}
}
//*************************************************
// Delete One Player Shapes
//*************************************************
void delete_four_by_one(int x, int y, int spin) {
if (spin == 0 || spin == 2)
{
delete_square(x - 2, y);
delete_square(x - 1, y);
delete_square(x, y);
delete_square(x + 1, y);
}
else
{
delete_square(x, y - 2);
delete_square(x, y - 1);
delete_square(x, y);
delete_square(x, y + 1);
}
}
void delete_two_by_two(int x, int y) {
delete_square(x - 1, y );
delete_square(x , y
);
delete_square(x , y + 1);
delete_square(x - 1, y + 1);
}
void delete_T(int x, int y, int spin) {
if (spin == 0)
{
delete_square(x , y
);
delete_square(x - 1, y );
delete_square(x + 1, y );
delete_square(x , y + 1);
}
if (spin == 1)
{
delete_square(x , y
);
delete_square(x , y - 1);
delete_square(x - 1, y );
delete_square(x , y + 1);
}
if (spin == 2)
{
delete_square(x , y
);
delete_square(x - 1, y );
delete_square(x + 1, y );
delete_square(x , y - 1);
}
if (spin == 3)
{
delete_square(x , y
);
delete_square(x , y - 1);
delete_square(x + 1, y );
delete_square(x , y + 1);
}
}
void delete_L(int x, int y, int spin) {
if (spin == 0)
{
delete_square(x - 1, y );
delete_square(x - 1, y + 1);
delete_square(x - 1, y + 2);
delete_square(x , y + 2);
}
if (spin == 1)
{
delete_square(x , y + 1);
delete_square(x - 1, y + 1);
delete_square(x - 2, y + 1);
delete_square(x - 2, y + 2);
}
if (spin == 2)
{
delete_square(x - 1, y );
delete_square(x - 1, y + 1);
delete_square(x - 1, y + 2);
delete_square(x - 2, y );
}
if (spin == 3)
{
delete_square(x , y + 1);
delete_square(x - 1, y + 1);
delete_square(x - 2, y + 1);
delete_square(x , y
);
}
}
void delete_backward_L(int x, int y, int spin) {
if (spin == 0)
{
delete_square(x - 1, y );
delete_square(x - 1, y + 1);
delete_square(x - 1, y + 2);
delete_square(x - 2, y + 2);
}
if (spin == 1)
{
delete_square(x , y + 1);
delete_square(x - 1, y + 1);
delete_square(x - 2, y + 1);
delete_square(x - 2, y );
}
if (spin == 2)
{
delete_square(x - 1, y );
delete_square(x - 1, y + 1);
delete_square(x - 1, y + 2);
delete_square(x , y
);
}
if (spin == 3)
{
delete_square(x , y + 1);
delete_square(x - 1, y + 1);
delete_square(x - 2, y + 1);
delete_square(x , y + 2);
}
}
void delete_s(int x, int y, int spin) {
if (spin == 0 || spin == 2)
{
delete_square(x , y
);
delete_square(x - 1, y );
delete_square(x , y - 1);
delete_square(x + 1, y - 1);
}
else
{
delete_square(x , y
);
delete_square(x + 1, y );
delete_square(x , y - 1);
delete_square(x + 1, y + 1);
}
}
void delete_z(int x, int y, int spin) {
if (spin == 0 || spin == 2)
{
delete_square(x , y
);
delete_square(x - 1, y );
delete_square(x , y + 1);
delete_square(x + 1, y + 1);
}
else
{
delete_square(x , y
);
delete_square(x + 1, y );
delete_square(x , y + 1);
delete_square(x + 1, y - 1);
}
}
//*************************************************
// Delete Two Player Shapes
//*************************************************
void delete_four_by_one_tp(int x, int y, int spin) {
if (spin == 0 || spin == 2)
{
delete_square_tp(x - 2, y);
delete_square_tp(x - 1, y);
delete_square_tp(x, y);
delete_square_tp(x + 1, y);
}
else
{
delete_square_tp(x, y - 2);
delete_square_tp(x, y - 1);
delete_square_tp(x, y);
delete_square_tp(x, y + 1);
}
}
void delete_two_by_two_tp(int x, int y) {
delete_square_tp(x - 1, y );
delete_square_tp(x , y
);
delete_square_tp(x , y + 1);
delete_square_tp(x - 1, y + 1);
}
void delete_T_tp(int x, int y, int spin) {
if (spin == 0)
{
delete_square_tp(x , y
);
delete_square_tp(x - 1, y );
delete_square_tp(x + 1, y );
delete_square_tp(x , y + 1);
}
if (spin == 1)
{
delete_square_tp(x , y
);
delete_square_tp(x , y - 1);
delete_square_tp(x - 1, y );
delete_square_tp(x , y + 1);
}
if (spin == 2)
{
delete_square_tp(x , y
);
delete_square_tp(x - 1, y );
delete_square_tp(x + 1, y );
delete_square_tp(x , y - 1);
}
if (spin == 3)
{
delete_square_tp(x , y
);
delete_square_tp(x , y - 1);
delete_square_tp(x + 1, y );
delete_square_tp(x , y + 1);
}
}
void delete_L_tp(int x, int y, int spin) {
if (spin == 0)
{
delete_square_tp(x - 1, y );
delete_square_tp(x - 1, y + 1);
delete_square_tp(x - 1, y + 2);
delete_square_tp(x , y + 2);
}
if (spin == 1)
{
delete_square_tp(x , y + 1);
delete_square_tp(x - 1, y + 1);
delete_square_tp(x - 2, y + 1);
delete_square_tp(x - 2, y + 2);
}
if (spin == 2)
{
delete_square_tp(x - 1, y );
delete_square_tp(x - 1, y + 1);
delete_square_tp(x - 1, y + 2);
delete_square_tp(x - 2, y );
}
if (spin == 3)
{
delete_square_tp(x , y + 1);
delete_square_tp(x - 1, y + 1);
delete_square_tp(x - 2, y + 1);
delete_square_tp(x , y
);
}
}
void delete_backward_L_tp(int x, int y, int spin) {
if (spin == 0)
{
delete_square_tp(x - 1, y );
delete_square_tp(x - 1, y + 1);
delete_square_tp(x - 1, y + 2);
delete_square_tp(x - 2, y + 2);
}
if (spin == 1)
{
delete_square_tp(x , y + 1);
delete_square_tp(x - 1, y + 1);
delete_square_tp(x - 2, y + 1);
delete_square_tp(x - 2, y );
}
if (spin == 2)
{
delete_square_tp(x - 1, y );
delete_square_tp(x - 1, y + 1);
delete_square_tp(x - 1, y + 2);
delete_square_tp(x , y
);
}
if (spin == 3)
{
delete_square_tp(x , y + 1);
delete_square_tp(x - 1, y + 1);
delete_square_tp(x - 2, y + 1);
delete_square_tp(x , y + 2);
}
}
void delete_s_tp(int x, int y, int spin) {
if (spin == 0 || spin == 2)
{
delete_square_tp(x , y
);
delete_square_tp(x + 1, y );
delete_square_tp(x , y - 1);
delete_square_tp(x - 1, y - 1);
}
else
{
delete_square_tp(x , y
);
delete_square_tp(x + 1, y );
delete_square_tp(x , y + 1);
delete_square_tp(x + 1, y - 1);
}
}
void delete_z_tp(int x, int y, int spin) {
if (spin == 0 || spin == 2)
{
delete_square_tp(x , y
);
delete_square_tp(x + 1, y );
delete_square_tp(x , y + 1);
delete_square_tp(x - 1, y + 1);
}
else
{
delete_square_tp(x , y
);
delete_square_tp(x + 1, y );
delete_square_tp(x , y - 1);
delete_square_tp(x + 1, y + 1);
}
}
//Checks if we have hit another piece
while falling
int check_matrix(matrix board, space array){
int bottom = 0;
int x;
int y;
for(int i = 0; i < 4; i++){
x
= array.a[0][i];
y
= array.a[1][i];
if (board.b[y+1][x] == 1){
bottom
= 1;
return bottom;
}
}
return bottom;
}
int check_matrix_tp(matrix board, space array){
int bottom = 0;
int x;
int y;
for(int i = 0; i < 4; i++){
x
= array.a[0][i] - 16;
y
= array.a[1][i];
if (board.b[y+1][x] == 1){
bottom
= 1;
return bottom;
}
}
return bottom;
}
//Checks if we will hit another piece
while moving left or right
int check_matrix_wall(matrix board, space array, int direction){
int wall = 0;
int x;
int y;
for(int i = 0; i < 4; i++){
x
= array.a[0][i];
y
= array.a[1][i];
if (board.b[y][x + direction] == 1){
wall
= 1;
return wall;
}
}
return wall;
}
int check_matrix_wall_tp(matrix board, space array, int direction){
int wall = 0;
int x;
int y;
for(int i = 0; i < 4; i++){
x
= array.a[0][i]-16;
y
= array.a[1][i];
if (board.b[y][x + direction] == 1){
wall
= 1;
return wall;
}
}
return wall;
}
//Checks if we will hit another
stationary piece if we spin
int check_matrix_spin(matrix board, space array, int two_player){
int x;
int y;
int cant_spin = 0;
for(int i = 0; i < 4; i++){
x
= array.a[0][i];
y
= array.a[1][i];
if (board.b[y][x] == 1){
cant_spin
= 1;
return cant_spin;
}
if(!two_player){
if (x <= 5)
{
cant_spin
= 2;
return cant_spin;
}
if( x >= 14)
{
cant_spin
= 3;
return cant_spin;
}
if ( y >= 18)
{
cant_spin
= 4;
return cant_spin;
}
}
else{
if (x <= 0)
{
cant_spin
= 2;
return cant_spin;
}
if( x >= 9)
{
cant_spin
= 3;
return cant_spin;
}
if ( y >= 25)
{
cant_spin
= 4;
return cant_spin;
}
}
}
return cant_spin;
}
int check_matrix_spin_A(matrix board, space array){
int x;
int y;
int cant_spin = 0;
for(int i = 0; i < 4; i++){
x
= array.a[0][i];
y
= array.a[1][i];
if (board.b[y][x] == 1){
cant_spin
= 1;
return cant_spin;
}
if (x <= 0)
{
cant_spin
= 2;
return cant_spin;
}
if( x >= 9)
{
cant_spin
= 3;
return cant_spin;
}
if ( y >= 25)
{
cant_spin
= 4;
return cant_spin;
}
}
return cant_spin;
}
int check_matrix_spin_B(matrix board, space array){
int x;
int y;
int cant_spin = 0;
for(int i = 0; i < 4; i++){
x
= array.a[0][i] - 16;
y
= array.a[1][i];
if (board.b[y][x] == 1){
cant_spin
= 1;
return cant_spin;
}
if (x <= 0)
{
cant_spin
= 2;
return cant_spin;
}
if( x >= 9)
{
cant_spin
= 3;
return cant_spin;
}
if ( y >= 25)
{
cant_spin
= 4;
return cant_spin;
}
}
return cant_spin;
}
//Check if we need to delete a row
row check_matrix_row(matrix board, space array, int two_player){
int block;
int counter;
row
deletion;
deletion.clear = 0;
if(!two_player)
{
for(int i = 0; i < 4; i++)
{
counter
= 0;
block
= array.a[1][i];
for(int j = 5; j < 15; j++)
{
if(board.b[block][j] == 1)
{
counter++;
}
else
{
j
= 15;
}
}
if (counter == 10)
{
deletion.c[i] = 1;
deletion.clear = 1;
}
else
{
deletion.c[i] = 0;
}
}
return deletion;
}
else
{
for(int i = 0; i < 4; i++)
{
//draw_square_tp(13,
6);
counter
= 0;
block
= array.a[1][i];
for(int j = 0; j < 10; j++)
{
if(board.b[block][j] == 1)
{
counter++;
}
else
{
j
= 10;
}
}
if (counter == 10)
{
//draw_square_tp(13, 6);
deletion.c[i] = 1;
deletion.clear = 1;
}
else
{
deletion.c[i] = 0;
}
}
return deletion;
}
}
//Delete a row
matrix row_deleter(row deletion, space array, matrix board, int two_player, int player)
{
matrix
new_board = board;
int value_array[4] = {100, 100, 100, 100};
int temp;
int skip;
for(int i = 0; i < 4; i++)
{
skip
= 0;
int value = array.a[1][i];
for(int d = 0; d < 4; d++)
{
if(value_array[d] == value)
{
skip
= 1;
}
}
if(deletion.c[i] == 1 && skip == 0)
{
value_array[i] = value;
if(!two_player)
{
for(int j = 5; j < 15; j++)
{
delete_square(j, array.a[1][i]);
board.b[array.a[1][i]][j] = 0;
}
}
else if (player)
{
for(int j = 0; j < 10; j++)
{
delete_square(j, array.a[1][i]);
board.b[array.a[1][i]][j] = 0;
}
}
else
{
for(int j = 0; j < 10; j++)
{
delete_square(j+15, array.a[1][i]);
board.b[array.a[1][i]][j] = 0;
}
}
}
}
int sorted = 0;
while(sorted == 0)
{
sorted
= 1;
for(int e = 0; e < 3; e++)
{
if(value_array[e] > value_array[e+1])
{
temp
= value_array[e];
value_array[e] = value_array[e+1];
value_array[e+1] = temp;
sorted
= 0;
}
}
}
int k = 0;
int f = 0;
for(k = 0; value_array[k] != 100; k++)
{
for(int g = value_array[k]; g > 0; g--)
{
if(!two_player)
{
for(int d = 5; d < 15; d++)
{
new_board.b[g][d] = new_board.b[g-1][d];
}
}
else
{
for(int d = 0; d < 10; d++)
{
new_board.b[g][d] = new_board.b[g-1][d];
}
f
= k+1;
}
}
}
new_board.k = f;
return new_board;
}
//Update matrix with new piece
matrix update_matrix(matrix board, space array, int player){
int x;
int y;
for(int i = 0; i < 4; i++){
if(player == 1)
{
x
= array.a[0][i];
y
= array.a[1][i];
board.b[y][x] = 1;
}
else
{
x
= array.a[0][i]-16;
y
= array.a[1][i];
board.b[y][x] = 1;
}
}
return board;
}
//Draw the board over again after we
clear or add lines
void draw_board(matrix board, matrix new_board, int two_player)
{
if(!two_player)
{
for(int i = 0; i < 20; i++)
{
for(int j = 5; j < 15; j++)
{
if(board.b[i][j] == 1)
{
delete_square(j, i);
}
if(new_board.b[i][j] == 1)
{
draw_square(j, i);
}
}
}
}
else
{
for(int i = 0; i < 26; i++)
{
for(int j = 0; j < 10; j++)
{
if(board.b[i][j] == 1)
{
delete_square_tp(j, i);
}
if(new_board.b[i][j] == 1)
{
draw_square_tp(j, i);
}
}
}
}
}
void draw_board_tp(matrix board, matrix new_board)
{
for(int i = 0; i < 26; i++)
{
for(int j = 0; j < 10; j++)
{
if(board.b[i][j] == 1)
{
delete_square_tp(j+16, i);
}
if(new_board.b[i][j] == 1)
{
draw_square_tp(j+16, i);
}
}
}
}
//==================================
//plot one point
//at x,y with color 1=white 0=black
2=invert
void video_pt(uint8_t x, uint8_t y, uint8_t c) {
//each
line has 18 bytes
//calculate
i based upon this and x,y
//
the byte with the pixel in it
//int
i = (x >> 3) + ((int)y<<4) + ((int)y<<1);
int i = (x >> 3) + (int)y * bytes_per_line ;
if (c==1)
screen[i] = screen[i] | pos[x & 7];
else if (c==0)
screen[i] = screen[i] & ~pos[x & 7];
else
screen[i] = screen[i] ^ pos[x & 7];
}
//==================================
//plot a line
//at x1,y1 to x2,y2 with color
1=white 0=black 2=invert
//NOTE: this function requires signed
chars
//Code is from David Rodgers,
//"Procedural Elements of
Computer Graphics",1985
void video_line(int x1, int y1, int x2, int y2, int c) {
int e;
int dx,dy,j, temp;
int s1,s2, xchange;
int x,y;
x = x1;
y = y1;
//take
absolute value
if (x2 < x1) {
dx = x1 - x2;
s1 = -1;
}
else if (x2 == x1) {
dx = 0;
s1 = 0;
}
else {
dx = x2 - x1;
s1 = 1;
}
if (y2 < y1) {
dy = y1 - y2;
s2 = -1;
}
else if (y2 == y1) {
dy = 0;
s2 = 0;
}
else {
dy = y2 - y1;
s2 = 1;
}
xchange = 0;
if (dy>dx) {
temp = dx;
dx = dy;
dy = temp;
xchange = 1;
}
e = ((int)dy<<1) - dx;
for (j=0; j<=dx; j++) {
video_pt(x,y,c);
if (e>=0) {
if (xchange==1) x = x + s1;
else y = y + s2;
e = e - ((int)dx<<1);
}
if (xchange==1) y = y + s2;
else x = x + s1;
e = e + ((int)dy<<1);
}
}
//==================================
// put a big character on the screen
// c is index into bitmap
void video_putchar(uint8_t x, uint8_t y, uint8_t c) {
uint8_t i;
uint8_t y_pos;
uint8_t j;
for (i=0;i<7;i++) {
y_pos = y + i;
j = pgm_read_byte(((uint16_t)(&ascii[0])) + c*7 + i);
video_pt(x,
y_pos, (j & 0x80)==0x80);
video_pt(x+1, y_pos, (j & 0x40)==0x40);
video_pt(x+2, y_pos, (j & 0x20)==0x20);
video_pt(x+3, y_pos, (j & 0x10)==0x10);
video_pt(x+4, y_pos, (j & 0x08)==0x08);
}
}
//==================================
// put a string of big characters on
the screen
void video_puts(uint8_t x, uint8_t y, uint8_t *str) {
uint8_t i = 0;
for (i=0; str[i] != 0; i++) {
video_putchar(x,y,str[i]);
x = x+6;
}
}
//==================================
// put a small character on the
screen
// x-coord must be on divisible by 4
// c is index into bitmap
void video_smallchar(uint8_t x, uint8_t y, uint8_t c) {
uint8_t mask;
//int
i=((int)x>>3) + ((int)y<<4) + ((int)y<<1);
int i=((int)x>>3) + (int)y * bytes_per_line ;
if (x == (x & 0xf8)) mask = 0x0f; //f8
else mask = 0xf0;
uint8_t j = pgm_read_byte(((uint16_t)(smallbitmap)) + c*5);
screen[i] = (screen[i] & mask) | (j & ~mask);
j = pgm_read_byte(((uint16_t)(smallbitmap)) + c*5 + 1);
screen[i+bytes_per_line] = (screen[i+bytes_per_line] & mask) | (j & ~mask);
j = pgm_read_byte(((uint16_t)(smallbitmap)) + c*5 + 2);
screen[i+bytes_per_line*2] = (screen[i+bytes_per_line*2] & mask) | (j & ~mask);
j = pgm_read_byte(((uint16_t)(smallbitmap)) + c*5 + 3);
screen[i+bytes_per_line*3] = (screen[i+bytes_per_line*3] & mask) | (j & ~mask);
j = pgm_read_byte(((uint16_t)(smallbitmap)) + c*5 + 4);
screen[i+bytes_per_line*4] = (screen[i+bytes_per_line*4] & mask) | (j & ~mask);
}
//==================================
// put a string of small characters
on the screen
// x-cood must be on divisible by 4
void video_putsmalls(uint8_t x, uint8_t y, uint8_t *str) {
uint8_t i;
x = x & 0b11111100; //make it divisible
by 4
for (i = 0; str[i] != 0; i++) {
if (str[i] >= 0x30 && str[i] <= 0x3a)
video_smallchar(x, y, str[i] - 0x30);
else video_smallchar(x, y, str[i] - 0x40 + 12);
x += 4;
}
}
//==================================
//return the value of one point
//at x,y with color 1=white 0=black
2=invert
uint8_t video_set(uint8_t x, uint8_t y) {
//The
following construction
//detects
exactly one bit at the x,y location
//
int i = (x>>3) + ((int)y<<4) + ((int)y<<3);
int i = (x>>3) + (int)y * bytes_per_line ;
return (screen[i] & 1<<(7-(x & 0x7)));
}