#include <vectrex.h> #define signed8 int #define unsigned8 unsigned int #define joybit Joy_Digital #define tstat (*((volatile unsigned8 *) 0xc856)) #define pot0 (*((volatile signed8 *) 0xc81b)) #define pot1 (*((volatile signed8 *) 0xc81c)) #define pot2 (*((volatile signed8 *) 0xc81d)) #define pot3 (*((volatile signed8 *) 0xc81e)) #define epot0 (*((volatile unsigned8 *) 0xc81f)) #define epot1 (*((volatile unsigned8 *) 0xc820)) #define epot2 (*((volatile unsigned8 *) 0xc821)) #define epot3 (*((volatile unsigned8 *) 0xc822)) #define t1lolc (*((volatile unsigned8 *) 0xd004)) #define read_ram(x) (*((volatile signed8 *) x)) #define joystick1_button1 (signed8)(read_ram(0xC80F) & 1U) /* A */ #define joystick1_button2 (signed8)(read_ram(0xC80F) & 2U) /* S */ #define joystick1_button3 (signed8)(read_ram(0xC80F) & 4U) /* D */ #define joystick1_button4 (signed8)(read_ram(0xC80F) & 8U) /* F */ static signed8 XJoy, YJoy, button1, button2, button3, button4; static void poll_joystick(void) { joybit(); if (pot0 < -10) { // Left XJoy = -1; } else if (pot0 > 10) { // Right XJoy = 1; } else { XJoy = 0; } if (pot1 < -10) { // Down YJoy = -1; } else if (pot1 > 10) { // Up YJoy = 1; } else { YJoy = 0; } asm("pshs x,y,u,dp"); asm("lda #0"); asm("jsr 0HF1B4 ; read_btns_mask":::"a","b","d"); asm("puls dp,u,y,x"); button1 = joystick1_button1; button2 = joystick1_button2; button3 = joystick1_button3; button4 = joystick1_button4; } static void init_hardware(void) { // setup joystick read function to read only joystick 1 epot0 = 1; epot1 = 3; epot2 = 0; epot3 = 0; } static int y, debugging; static long addr, line, base; static char text[26]; void hex(unsigned int val, int offset) { unsigned int nib1 = (val>>4)&15; unsigned int nib2 = val&15; text[offset] += nib1; text[offset+1] += nib2; if (nib1 > 9) text[offset] += 7; if (nib2 > 9) text[offset+1] += 7; } static void printline(void) { int i; // "0000:0000 0000 0000 0000\x80" for (i = 0; i < 25; i++) text[i] = '0'; text[4] = ':'; text[9] = text[14] = text[19] = ' '; text[24] = 0x80; hex((unsigned int)(line>>8),0); hex((unsigned int)line, 2); hex(*((char *)line), 5); hex(*((char *)(line+1L)), 7); hex(*((char *)(line+2L)), 10); hex(*((char *)(line+3L)), 12); hex(*((char *)(line+4L)), 15); hex(*((char *)(line+5L)), 17); hex(*((char *)(line+6L)), 20); hex(*((char *)(line+7L)), 22); Print_Str_d(y, -127, text); y-= 17; } static void DEBUG(void) { if (debugging) { int i, byte; base = addr; line = 0; // for (;;) { y = 127; Intensity_7F(); for (i = 0; i < 16; i++) { byte = (int) *((char *)(addr+(long)i)); if ((unsigned int)byte == 0x80U) text[i] = '?'; else if ((unsigned int)byte < 32U) text[i] = '?'; else text[i] = (char)byte; } text[16] = 0x80; Print_Str_d(y, -80, text); y-= 17; Intensity_3F(); for (line = base; line != base+0x68; line += 8) { if (line == addr) Intensity_7F(); printline(); if (line == addr) Intensity_3F(); } // } } } int main(void) { init_hardware(); addr = (long)0xc000; debugging = 1; for (;;) { Wait_Recal(); poll_joystick(); if (button1) { addr += 0x10; base += 0x10; while (button1) { Wait_Recal(); poll_joystick(); DEBUG(); } } else if (button2) { addr -= 0x10; base -= 0x10; while (button2) { Wait_Recal(); poll_joystick(); DEBUG(); } } else if (button3) { addr += 0x0800; base += 0x0800; while (button3) { Wait_Recal(); poll_joystick(); DEBUG(); } } else if (button4) { addr -= 0x0800; base -= 0x0800; while (button4) { Wait_Recal(); poll_joystick(); DEBUG(); } } else DEBUG(); } // if return value is <= 0, then a warm reset will be performed, // otherwise a cold reset will be performed return 0; }