// First of several components for building a vectrex game. // This one implements a title animation. Then you enter your game. #include <vectrex.h> typedef enum {WAITING, MOVING, STOPPING, DONE} STATE; STATE state = WAITING; // set to DONE to skip intro animation #define set_scale(s) do { VIA_t1_cnt_lo = s; } while (0) static long reset_size; struct cartridge_t // from cartridge.c unfortunately { char copyright[11]; // copyright string, must start with "g GCE" and must end with "\x80" const void* music; // 16 bit memory adress of title music data signed int title_height; // signed 8 bit value, height of game title letters unsigned int title_width; // unsigned 8 bit value, width of game title letters int title_y; // signed 8 bit value, y coordinate of game title int title_x; // signed 8 bit value, x coordinate of game title char title[]; // game title string, must end with "\x80\x00" }; extern struct cartridge_t game_header __attribute__((section(".cartridge"))); // dropped const. void fake_title(int x, int y) { Reset0Ref(); set_scale(0x70); Moveto_d(y,x); *(volatile long *)0xC82A = reset_size; Print_Str_d(69,-45, game_header.title); Reset0Ref(); set_scale(0x70); Moveto_d(y,x); set_scale(0x38); Moveto_d(0,1); *(volatile long *)0xC82A = (long)0xf848; // ht wd Print_Str_d(21,-38, game_header.copyright); } static int sin, cos; void play_game(void) { // your game code for one frame goes here // random silly program here as a space-filler #ifdef ORIG static long sin = 0L, cos = 100L, prevsin = 0L, prevcos = -7349L; int i,j; long dx, dy; Wait_Recal(); Intensity_7F(); Reset0Ref(); set_scale(0x30); Moveto_d(0,0); for (i = 0; i < 44; i++) { // segments in line for (j = 0; j < 2; j++) { // length of line sin = sin - (dx=(cos >> 4)); cos = cos + (dy=(sin >> 4)); } Draw_Line_d((int)(prevcos-cos),(int)(sin-prevsin)); prevsin=sin; prevcos=cos; } #else int i, dx, dy; Wait_Recal(); Intensity_7F(); Reset0Ref(); set_scale(0x80); sin = 8; cos = 99; Moveto_d(-80,0);Draw_Line_d(1,8); for (i=0;i < 48;i++) { // segments in line dx = cos>>4; sin = sin + dx; dy = sin>>4; cos = cos - dy; Draw_Line_d(dy,dx); } Draw_Line_d(1,-18); Reset0Ref(); sin = 8; cos = 99; Moveto_d(-80,0);Draw_Line_d(1,-8); for (i=0;i < 48;i++) { // segments in line dx = cos>>4; sin = sin + dx; dy = sin>>4; cos = cos - dy; Draw_Line_d(dy,-dx); } Draw_Line_d(1,18); set_scale(0x68); Reset0Ref(); Intensity_3F(); {static int RX = 100, RY = 0; Moveto_d(0,0); Draw_Line_d(RY, -RX); dx = RX>>4; RY = RY + dx; dy = RY>>4; RX = RX - dy; } #endif } int main(void) { int delay = 127; sin = -96; cos = 1; reset_size = *(volatile long *)0xC82A; for (;;) { switch (state) { case WAITING: Wait_Recal(); Intensity_7F(); fake_title(cos-31, sin); delay -= 1; if (delay == 0) { state = MOVING; delay = 2; // loops/2 } break; case MOVING: Wait_Recal(); Intensity_7F(); sin = sin - (cos >> 4); cos = cos + (sin >> 4); fake_title(cos-31, sin); if (sin == -96 && cos == 1) { delay -= 1; if (delay == 0) { state = STOPPING; delay = 0x7F; } } break; case STOPPING: Wait_Recal(); Intensity_a((unsigned int)delay); fake_title(cos-31, sin); // fade out delay -= 1; if (delay == 0) state = DONE; break; case DONE: play_game(); break; } } return 0; }