#include <vectrex.h>
#include "controller.h"
#define Intensity(x) Intensity_a(x)
static inline void set_scale(unsigned int s) {
VIA_t1_cnt_lo = s;
}
static void sprintl(char *dest, long num) { // left-aligned
#define show_digit(x) *dest++ = (char)((x)+'0')
int digit, zeroes;
// This replaces code that used divide by 10 and modulo 10. Much faster.
// handles full 16 bit range of -32768:32767 - Uses negative numbers to avoid the issue of negating -32768
if (num >= 0) num = -num; else *dest++ = '-';
digit = 0;
zeroes = 1; // CLRing is shorter
// max 11 add/subtracts...
if (num <= -20000) { num += 20000; digit += 2; zeroes = 0; }
if (num <= -10000) { num += 10000; digit += 1; zeroes = 0; }
if (!zeroes) show_digit(digit);
digit = 0;
if (num <= -8000) { num += 8000; digit += 8; zeroes = 0; } else if (num <= -4000) { num += 4000; digit += 4; zeroes = 0; }
if (num <= -2000) { num += 2000; digit += 2; zeroes = 0; }
if (num <= -1000) { num += 1000; digit += 1; zeroes = 0; }
if (!zeroes) show_digit(digit);
digit = 0;
if (num <= -800) { num += 800; digit += 8; zeroes = 0; } else if (num <= -400) { num += 400; digit += 4; zeroes = 0; }
if (num <= -200) { num += 200; digit += 2; zeroes = 0; }
if (num <= -100) { num += 100; digit += 1; zeroes = 0; }
if (!zeroes) show_digit(digit);
digit = 0;
if (num <= -80) { num += 80; digit += 8; zeroes = 0; } else if (num <= -40) { num += 40; digit += 4; zeroes = 0; }
if (num <= -20) { num += 20; digit += 2; zeroes = 0; }
if (num <= -10) { num += 10; digit += 1; zeroes = 0; }
if (!zeroes) show_digit(digit);
show_digit((int)-num);
//*dest = 0x80;
}
static long V1X=0L, V1Y=0L, V2X=0L, V2Y=0L;
static unsigned long timer = 0UL;
#define TIMEOUT 0xAF0UL
int main(void) {
unsigned int bright, dim;
static char coords[11];
// * (volatile char *)0xC81A = 0;// Analog joystick max resolution
Vec_Joy_Resltn = 0;
enable_controller_1_x();
enable_controller_1_y();
enable_controller_2_x();
enable_controller_2_y();
for (;;) {
// There's an excess of intensities, reset0refs, moveto 0,0's and set_scales
// in this code, as I was trying to work out if some call was out of order and
// causing the extreme 'clicking' under Vide. Works OK on real hardware.
if (timer == TIMEOUT) {
// Avoid burn-in if left running for a long time...
if (bright) bright -= 1U;
if (dim) dim -= 1U;
} else {
timer += 1UL;
bright = 0x7FU;
dim = 0x3FU;
}
Wait_Recal();
Vec_Joy_Resltn = 0;
Joy_Analog ();
Read_Btns ();
coords[0] = coords[1] = coords[2] = coords[3] = ' ';
sprintl(&coords[0], (long)Vec_Joy_1_X);
coords[4] = ',';
coords[5] = coords[6] = coords[7] = coords[8] = ' ';
sprintl(&coords[5], (long)Vec_Joy_1_Y);
coords[9] = 0x80; coords[10] = '\0';
Reset0Ref (); Intensity(bright); set_scale(127); Moveto_d(0,0);
Print_Str_d(-10, -52, coords);
coords[0] = coords[1] = coords[2] = coords[3] = ' ';
sprintl(&coords[0], (long)Vec_Joy_2_X);
coords[4] = ',';
coords[5] = coords[6] = coords[7] = coords[8] = ' ';
sprintl(&coords[5], (long)Vec_Joy_2_Y);
coords[9] = 0x80; coords[10] = '\0';
Reset0Ref (); Intensity(bright); set_scale(127); Moveto_d(0,0);
Print_Str_d(10, -52, coords);
if ((buttons_held()&255U)
// allow a smal amount of wobble when controls not being touched
|| Vec_Joy_1_X < V1X-1
|| Vec_Joy_1_Y < V1Y-1
|| Vec_Joy_2_X < V2X-1
|| Vec_Joy_2_Y < V2Y-1
|| Vec_Joy_1_X > V1X+1
|| Vec_Joy_1_Y > V1Y+1
|| Vec_Joy_2_X > V2X+1
|| Vec_Joy_2_Y > V2Y+1) {
timer = 0L; V1X = Vec_Joy_1_X; V1Y = Vec_Joy_1_Y; V2X = Vec_Joy_2_X; V2Y = Vec_Joy_2_Y;
}
// X
Reset0Ref(); set_scale(0x7F); Moveto_d(Vec_Joy_1_Y, Vec_Joy_1_X); set_scale(0x8); Intensity(bright); Draw_Line_d(127,127);
Reset0Ref(); set_scale(0x7F); Moveto_d(Vec_Joy_1_Y, Vec_Joy_1_X); set_scale(0x8); Intensity(bright); Draw_Line_d(-127,127);
Reset0Ref(); set_scale(0x7F); Moveto_d(Vec_Joy_1_Y, Vec_Joy_1_X); set_scale(0x8); Intensity(bright); Draw_Line_d(-127,-127);
Reset0Ref(); set_scale(0x7F); Moveto_d(Vec_Joy_1_Y, Vec_Joy_1_X); set_scale(0x8); Intensity(bright); Draw_Line_d(127,-127);
// square with a dot in the middle
Reset0Ref(); set_scale(0x7F); Moveto_d(Vec_Joy_2_Y, Vec_Joy_2_X);
set_scale(0x8); Moveto_d(100,100); set_scale(0x10); Intensity(bright); Draw_Line_d(0,-127);
Reset0Ref(); set_scale(0x7F); Moveto_d(Vec_Joy_2_Y, Vec_Joy_2_X);
set_scale(0x8); Moveto_d(100,100); set_scale(0x10); Intensity(bright); Draw_Line_d(-127,0);
Reset0Ref(); set_scale(0x7F); Moveto_d(Vec_Joy_2_Y, Vec_Joy_2_X);
set_scale(0x8); Moveto_d(-100,-100); set_scale(0x10); Intensity(bright); Draw_Line_d(127,0);
Reset0Ref(); set_scale(0x7F); Moveto_d(Vec_Joy_2_Y, Vec_Joy_2_X);
set_scale(0x8); Moveto_d(-100,-100); set_scale(0x10); Intensity(bright); Draw_Line_d(0,127);
Reset0Ref(); set_scale(0x7F); Moveto_d(Vec_Joy_2_Y, Vec_Joy_2_X);
Intensity(dim); Draw_Line_d(0,0);
Intensity(dim);
Reset0Ref(); Moveto_d(0,0); set_scale(0x7F); Draw_Line_d(127,127);
Reset0Ref(); Moveto_d(0,0); set_scale(0x7F); Draw_Line_d(-128,127);
Reset0Ref(); Moveto_d(0,0); set_scale(0x7F); Draw_Line_d(-128,-128);
Reset0Ref(); Moveto_d(0,0); set_scale(0x7F); Draw_Line_d(127,-128);
Intensity(bright);
if (buttons_held() & 1) {
Reset0Ref(); set_scale(0x7F); Moveto_d(-32,32); set_scale(0x40); Draw_Line_d(127,0);
Reset0Ref(); set_scale(8); Print_Str_d(6+9, 30, "C1\x80");
Reset0Ref(); set_scale(8); Print_Str_d(6-9, 30, "B1\x80");
}
if (buttons_held() & 2) {
Reset0Ref(); set_scale(0x7F); Moveto_d(32,32); set_scale(0x40); Draw_Line_d(0,-127);
Reset0Ref(); set_scale(0x7f); Print_Str_d(48, -32, "C1 B2\x80");
}
if (buttons_held() & 4) {
Reset0Ref(); set_scale(0x7F); Moveto_d(32,-32); set_scale(0x40); Draw_Line_d(-127,0);
Reset0Ref(); set_scale(0x7f); Print_Str_d(6+9, -94+35, "C1\x80");
Reset0Ref(); set_scale(0x7f); Print_Str_d(6-9, -94+35, "B3\x80");
}
if (buttons_held() & 8) {
Reset0Ref(); set_scale(0x7F); Moveto_d(-32,-32); set_scale(0x40); Draw_Line_d(0,127);
Reset0Ref(); set_scale(0x7f); Print_Str_d(-36, -32, "C1 B4\x80");
}
if (buttons_held() & (16)) {
Reset0Ref(); set_scale(0x7F); Moveto_d(-64,64); set_scale(0x7f); Draw_Line_d(127,0);
Reset0Ref(); set_scale(8); Print_Str_d(6+9, 62, "C2\x80");
Reset0Ref(); set_scale(8); Print_Str_d(6-9, 62, "B1\x80");
}
if (buttons_held() & (32)) {
Reset0Ref(); set_scale(0x7F); Moveto_d(64,64); set_scale(0x7f); Draw_Line_d(0,-127);
Reset0Ref(); set_scale(0x7f); Print_Str_d(80, -32, "C2 B2\x80");
}
if (buttons_held() & (64)) {
Reset0Ref(); set_scale(0x7F); Moveto_d(64,-64); set_scale(0x7f); Draw_Line_d(-127,0);
Reset0Ref(); set_scale(0x7f); Print_Str_d(6+9, -92, "C2\x80");
Reset0Ref(); set_scale(0x7f); Print_Str_d(6-9, -92, "B3\x80");
}
if (buttons_held() & (128)) {
Reset0Ref(); set_scale(0x7F); Moveto_d(-64,-64); set_scale(0x7f); Draw_Line_d(0,127);
Reset0Ref(); set_scale(0x7f); Print_Str_d(-68, -32, "C2 B4\x80");
}
}
return 0;
}