// JLH = James Hammons <jlhamm@acm.org>
//
// WHO WHEN WHAT
-// --- ---------- ------------------------------------------------------------
+// --- ---------- -----------------------------------------------------------
// JLH 07/23/2009 Added changelog ;-)
//
#include <string>
#include <fstream> // Needed for tracelog
-//#include "SDL.h" // Needed for screen.h
#include "screen.h"
#include "resource.h" // Thunder graphics & sounds
-using namespace std; // Yes!
+using namespace std;
// External shit
extern SDL_Surface * screen;
-extern uint8_t my_scr[0x14000]; // Screen buffer...
-extern uint8_t gram1[]; // Game RAM (do here??)
-extern uint8_t hScrollOffset; // Horizontal scroll offset
-extern uint8_t vScrollOffset; // Vertical scroll offset
+extern uint8_t my_scr[0x14000]; // Screen buffer...
+extern uint8_t gram1[]; // Game RAM (do here??)
+extern uint8_t hScrollOffset; // Horizontal scroll offset
+extern uint8_t vScrollOffset; // Vertical scroll offset
extern uint32_t voffsets[8];
-extern uint8_t voice_rom[]; // PCM data pointer
-extern fstream tr; // Tracelog
+extern uint8_t voice_rom[]; // PCM data pointer
+extern fstream tr; // Tracelog
// Global shit
-uint16_t text_life; // How long text is visible
-bool show_text; // Whether or not to show text
-uint16_t show_which_msg; // Which message to show
-bool show_gui; // Whether or not to show GUI
-uint16_t selection; // Which GUI item currently selected
+uint16_t text_life; // How long text is visible
+bool show_text; // Whether or not to show text
+uint16_t show_which_msg; // Which message to show
+bool show_gui; // Whether or not to show GUI
+uint16_t selection; // Which GUI item currently selected
uint16_t snd_num;
-uint16_t gui_debounce; // GUI key debounce value
-uint16_t num_coins; // Number of coins dropped
-uint16_t blink = 0; // Used to blink player 1 & 2 start buttons
-uint16_t flash = 23; // Used to flash GUI lights
-uint16_t iline = 0; // Used to roll line
-uint16_t dcurcol = 179; // dipswitch cursor color
-int dcurdir = 1; // Initially going up...
+uint16_t gui_debounce; // GUI key debounce value
+uint16_t num_coins; // Number of coins dropped
+uint16_t blink = 0; // Used to blink player 1 & 2 start buttons
+uint16_t flash = 23; // Used to flash GUI lights
+uint16_t iline = 0; // Used to roll line
+uint16_t dcurcol = 179; // dipswitch cursor color
+int dcurdir = 1; // Initially going up...
bool blink_on = false;
-bool game_refresh; // Refresh rate user set
-bool do_decrement; // Flag to handle decrement...
-bool user_selected_something; // Flag for well, you know...
-uint16_t dswitch; // Which dipswitch is selected...
+bool game_refresh; // Refresh rate user set
+bool do_decrement; // Flag to handle decrement...
+bool user_selected_something; // Flag for well, you know...
+uint16_t dswitch; // Which dipswitch is selected...
// The following are global for the sound routines...
0,0,0,0,0,0
};
-//
+
+ //
// Initialize GUI
//
void InitGUI(void)
user_selected_something = false;
}
+
//
// Handle key debounce
//
void HandleGUIDebounce(void)
{
- if (gui_debounce) gui_debounce--; // Debounce GUI keys...
- do_decrement = !do_decrement; // Called at 60Hz, so skip decrementing blink
- if (do_decrement)
- {
- if (blink) blink--; // Handle blinking stuff (Should prb go in DrawGUI)
-
- flash-=2; // Handle flashing stuff (Should prb go in DrawGUI)
- if (flash == 0xFFFF) flash = 23;
-
- iline++;
- if (iline > 30) iline = 0; // 30 pixels high, going past by 1
-
- dcurcol += dcurdir;
- if (dcurcol == 186) dcurdir = -1;
- if (dcurcol == 179) dcurdir = 1;
- }
+ if (gui_debounce)
+ gui_debounce--; // Debounce GUI keys...
+
+ do_decrement = !do_decrement; // Called at 60Hz, so skip decrementing blink
+
+ if (do_decrement)
+ {
+ if (blink)
+ blink--; // Handle blinking stuff (Should prb go in DrawGUI)
+
+ flash -= 2; // Handle flashing stuff (Should prb go in DrawGUI)
+
+ if (flash == 0xFFFF)
+ flash = 23;
+
+ iline++;
+
+ if (iline > 30)
+ iline = 0; // 30 pixels high, going past by 1
+
+ dcurcol += dcurdir;
+
+ if (dcurcol == 186)
+ dcurdir = -1;
+
+ if (dcurcol == 179)
+ dcurdir = 1;
+ }
}
+
//
// Set the refresh rate (30/60 Hz)
//
void SetRefreshRate(bool refresh)
{
- game_refresh = refresh;
+ game_refresh = refresh;
}
+
//
// Whether or not GUI is showing
//
-bool ShowGUI(void) { return show_gui; }
+bool ShowGUI(void)
+{
+ return show_gui;
+}
+
//
// Turn the GUI on
//
-void ActivateGUI(void) { show_gui = true; }
+void ActivateGUI(void)
+{
+ show_gui = true;
+}
+
//
// Turn the GUI off
//
-void DeactivateGUI(void) { show_gui = false; }
+void DeactivateGUI(void)
+{
+ show_gui = false;
+}
+
//
// Draw the small icons...
//
void DrawSmallIcons(uint16_t icon_not_to_draw)
{
- uint8_t * iconmem;
- uint8_t xl, yl;
- uint8_t * sIcons[12] = { inoguis, icoinus, ipl1sts, ipl2sts, ii30hzs, ii60hzs,
- idipsws, ichecks, ikeycns, isnapss, iresets, ibyebys };
- uint8_t xlens[12] = { 31, 18, 32, 35, 37, 37, 29, 23, 28, 32, 19, 19 };
- uint8_t ylens[12] = { 31, 18, 19, 19, 21, 21, 23, 20, 16, 17, 20, 23 };
- uint8_t xpos[11] = { 33, 48, 63, 78, 104, 0, 184, 210, 225, 240, 255 };
- uint8_t iconidx[11] = { 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 6 };
-
- if (game_refresh) iconidx[9] = 5; // 60 Hz...
-
- // Draw small icons 1 to 5 on left, then 11 to 7 on right.
-
- for(int i=0; i<5; i++)
- {
- uint16_t idx = i + icon_not_to_draw; // Get correct start pos.
- if (idx > 10) idx -= 11;
-
- iconmem = sIcons[iconidx[idx]];
- xl = xlens[iconidx[idx]]; yl = ylens[iconidx[idx]];
-
- uint32_t scadr = hScrollOffset + voffsets[vScrollOffset];
- scadr += 320*((224-yl)/2); // Center vertically
- scadr += xpos[i] - (xl/2); // Center around horiz. pos.
- uint16_t bmpptr = 0;
-
- for(int yy=0; yy<yl; yy++)
- {
- for(int xx=0; xx<xl; xx++)
- {
- uint8_t b = iconmem[bmpptr++];
- if (b) my_scr[scadr+xx+yy*320] = b;
- }
- }
- }
- for(int i=10; i>5; i--)
- {
- uint16_t idx = i + icon_not_to_draw; // Get correct start pos.
- if (idx > 10) idx -= 11;
-
- iconmem = sIcons[iconidx[idx]];
- xl = xlens[iconidx[idx]]; yl = ylens[iconidx[idx]];
-
- uint32_t scadr = hScrollOffset + voffsets[vScrollOffset];
- scadr += 320*((224-yl)/2); // Center vertically
- scadr += xpos[i] - (xl/2); // Center around horiz. pos.
- uint16_t bmpptr = 0;
-
- for(int yy=0; yy<yl; yy++)
- {
- for(int xx=0; xx<xl; xx++)
- {
- uint8_t b = iconmem[bmpptr++];
- if (b) my_scr[scadr+xx+yy*320] = b;
- }
- }
- }
+ uint8_t * iconmem;
+ uint8_t xl, yl;
+ uint8_t * sIcons[12] = { inoguis, icoinus, ipl1sts, ipl2sts, ii30hzs,
+ ii60hzs, idipsws, ichecks, ikeycns, isnapss, iresets, ibyebys };
+ uint8_t xlens[12] = { 31, 18, 32, 35, 37, 37, 29, 23, 28, 32, 19, 19 };
+ uint8_t ylens[12] = { 31, 18, 19, 19, 21, 21, 23, 20, 16, 17, 20, 23 };
+ uint8_t xpos[11] = { 33, 48, 63, 78, 104, 0, 184, 210, 225, 240, 255 };
+ uint8_t iconidx[11] = { 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 6 };
+
+ if (game_refresh)
+ iconidx[9] = 5; // 60 Hz...
+
+ // Draw small icons 1 to 5 on left, then 11 to 7 on right.
+
+ for(int i=0; i<5; i++)
+ {
+ uint16_t idx = i + icon_not_to_draw; // Get correct start pos.
+
+ if (idx > 10)
+ idx -= 11;
+
+ iconmem = sIcons[iconidx[idx]];
+ xl = xlens[iconidx[idx]];
+ yl = ylens[iconidx[idx]];
+
+ uint32_t scadr = hScrollOffset + voffsets[vScrollOffset];
+ scadr += 320 * ((224 - yl) / 2); // Center vertically
+ scadr += xpos[i] - (xl / 2); // Center around horiz. pos.
+ uint16_t bmpptr = 0;
+
+ for(int yy=0; yy<yl; yy++)
+ {
+ for(int xx=0; xx<xl; xx++)
+ {
+ uint8_t b = iconmem[bmpptr++];
+
+ if (b)
+ my_scr[scadr + xx + yy * 320] = b;
+ }
+ }
+ }
+
+ for(int i=10; i>5; i--)
+ {
+ uint16_t idx = i + icon_not_to_draw; // Get correct start pos.
+
+ if (idx > 10)
+ idx -= 11;
+
+ iconmem = sIcons[iconidx[idx]];
+ xl = xlens[iconidx[idx]];
+ yl = ylens[iconidx[idx]];
+
+ uint32_t scadr = hScrollOffset + voffsets[vScrollOffset];
+ scadr += 320 * ((224 - yl) / 2); // Center vertically
+ scadr += xpos[i] - (xl / 2); // Center around horiz. pos.
+ uint16_t bmpptr = 0;
+
+ for(int yy=0; yy<yl; yy++)
+ {
+ for(int xx=0; xx<xl; xx++)
+ {
+ uint8_t b = iconmem[bmpptr++];
+
+ if (b)
+ my_scr[scadr + xx + yy * 320] = b;
+ }
+ }
+ }
}
+
//
// Draw the large (selected) icon
//
void DrawLargeIcon(uint16_t icon)
{
- uint8_t * iconmem;
- uint8_t xl, yl;
- uint8_t * lIcons[11] = { inoguib, icoinub, ipl1stb, ipl2stb, ii30hzb, ii60hzb,
- idipswb, ikeycnb, isnapsb, iresetb, ibyebyb };
- uint8_t xlens[11] = { 44, 45, 50, 52, 59, 59, 42, 45, 48, 58, 42 };
- uint8_t ylens[11] = { 44, 40, 33, 29, 52, 52, 34, 45, 37, 40, 50 };
-
- uint8_t gsubs1[24] = { 21, 21, 20, 19, 168, 168, 31, 155, 68, 68, 67, 66,
- 36, 36, 35, 34, 188, 188, 183, 181, 81, 81, 85, 80 },
- gsubs2[24] = { 20, 20, 19, 19, 31, 31, 155, 155, 67, 67, 66, 66,
- 35, 35, 34, 34, 183, 183, 181, 181, 85, 85, 80, 80 },
- gsubs3[24] = { 35, 34, 188, 188, 183, 181, 81, 81, 85, 80, 21, 21,
- 20, 19, 168, 168, 31, 155, 68, 68, 67, 66, 36, 36 },
- gsubs4[24] = { 34, 34, 183, 183, 181, 181, 85, 85, 80, 80, 20, 20,
- 19, 19, 31, 31, 155, 155, 67, 67, 66, 66, 35, 35 },
- gsubs5[24] = { 20, 20, 183, 183, 31, 31, 85, 85, 67, 67, 20, 20,
- 35, 35, 31, 31, 183, 183, 67, 67, 85, 85, 35, 35 };
-
- iconmem = lIcons[icon];
- xl = xlens[icon]; yl = ylens[icon];
- if (icon == OPTIONS)
- {
- iconmem = boptions;
- xl = 35; yl = 9;
- }
- if ((icon == REFRESH) && game_refresh)
- {
- iconmem = lIcons[5];
- xl = xlens[5]; yl = ylens[5];
- }
- if (icon == DIPSWITCH)
- {
- iconmem = lIcons[6];
- xl = xlens[6]; yl = ylens[6];
- }
-
- uint32_t scadr = hScrollOffset + voffsets[vScrollOffset];
- scadr += 320*((224-yl)/2); // Center vertically
- scadr += (288-xl)/2; // Center horizontally
- uint16_t bmpptr = 0;
-
- for(int yy=0; yy<yl; yy++)
- {
- for(int xx=0; xx<xl; xx++)
- {
- uint8_t b = iconmem[bmpptr++];
- if (b)
- {
- if ((icon == PL1START) && (b == 235) && (num_coins) && !blink_on)
- b = 125; // Light ON color
-/*noguib: 44x44 [Green (hi/lo): 36/235 Orange: 168/31 Neutral:12]
- Rainbow (ROYGBP, hi/med/lo): 21,20,19; 168, 31,155; 68,67,66;
- 36,35,34; 188,183,181; 81,85,80 */
- if (icon == NOGUI)
- {
- uint8_t fln = (23 - flash) + 1; // Want to go forward (maybe fix it?)
- switch (b)
- {
- case 36: { b = gsubs1[fln]; break; }
- case 235: { b = gsubs2[fln]; break; }
- case 168: { b = gsubs3[fln]; break; }
- case 31: { b = gsubs4[fln]; break; }
- case 12: { b = gsubs5[fln]; break; }
- }
- }
- if ((icon == REFRESH) && (iline == yy) && (b == 50)) b = 188;
- my_scr[scadr+xx+yy*320] = b;
- }
- }
- }
- if (!blink) // Should go here???
- {
- blink_on = !blink_on; // Switch blink state
- if (blink_on) blink = 12;
- else blink = 6;
- }
+ uint8_t * iconmem;
+ uint8_t xl, yl;
+ uint8_t * lIcons[11] = { inoguib, icoinub, ipl1stb, ipl2stb, ii30hzb,
+ ii60hzb, idipswb, ikeycnb, isnapsb, iresetb, ibyebyb };
+ uint8_t xlens[11] = { 44, 45, 50, 52, 59, 59, 42, 45, 48, 58, 42 };
+ uint8_t ylens[11] = { 44, 40, 33, 29, 52, 52, 34, 45, 37, 40, 50 };
+
+ uint8_t gsubs1[24] = { 21, 21, 20, 19, 168, 168, 31, 155, 68, 68, 67, 66,
+ 36, 36, 35, 34, 188, 188, 183, 181, 81, 81, 85, 80 },
+ gsubs2[24] = { 20, 20, 19, 19, 31, 31, 155, 155, 67, 67, 66, 66,
+ 35, 35, 34, 34, 183, 183, 181, 181, 85, 85, 80, 80 },
+ gsubs3[24] = { 35, 34, 188, 188, 183, 181, 81, 81, 85, 80, 21, 21,
+ 20, 19, 168, 168, 31, 155, 68, 68, 67, 66, 36, 36 },
+ gsubs4[24] = { 34, 34, 183, 183, 181, 181, 85, 85, 80, 80, 20, 20,
+ 19, 19, 31, 31, 155, 155, 67, 67, 66, 66, 35, 35 },
+ gsubs5[24] = { 20, 20, 183, 183, 31, 31, 85, 85, 67, 67, 20, 20,
+ 35, 35, 31, 31, 183, 183, 67, 67, 85, 85, 35, 35 };
+
+ iconmem = lIcons[icon];
+ xl = xlens[icon];
+ yl = ylens[icon];
+
+ if (icon == OPTIONS)
+ {
+ iconmem = boptions;
+ xl = 35;
+ yl = 9;
+ }
+
+ if ((icon == REFRESH) && game_refresh)
+ {
+ iconmem = lIcons[5];
+ xl = xlens[5];
+ yl = ylens[5];
+ }
+
+ if (icon == DIPSWITCH)
+ {
+ iconmem = lIcons[6];
+ xl = xlens[6];
+ yl = ylens[6];
+ }
+
+ uint32_t scadr = hScrollOffset + voffsets[vScrollOffset];
+ scadr += 320 * ((224 - yl) / 2); // Center vertically
+ scadr += (288 - xl) / 2; // Center horizontally
+ uint16_t bmpptr = 0;
+
+ for(int yy=0; yy<yl; yy++)
+ {
+ for(int xx=0; xx<xl; xx++)
+ {
+ uint8_t b = iconmem[bmpptr++];
+
+ if (b)
+ {
+ if ((icon == PL1START) && (b == 235) && (num_coins) && !blink_on)
+ b = 125; // Light ON color
+ /*noguib: 44x44 [Green (hi/lo): 36/235 Orange: 168/31 Neutral:12]
+ Rainbow (ROYGBP, hi/med/lo): 21,20,19; 168, 31,155; 68,67,66;
+ 36,35,34; 188,183,181; 81,85,80 */
+ if (icon == NOGUI)
+ {
+ uint8_t fln = (23 - flash) + 1; // Want to go forward (maybe fix it?)
+ switch (b)
+ {
+ case 36: { b = gsubs1[fln]; break; }
+ case 235: { b = gsubs2[fln]; break; }
+ case 168: { b = gsubs3[fln]; break; }
+ case 31: { b = gsubs4[fln]; break; }
+ case 12: { b = gsubs5[fln]; break; }
+ }
+ }
+
+ if ((icon == REFRESH) && (iline == yy) && (b == 50))
+ b = 188;
+
+ my_scr[scadr+xx+yy*320] = b;
+ }
+ }
+ }
+
+ if (!blink) // Should go here???
+ {
+ blink_on = !blink_on; // Switch blink state
+
+ if (blink_on)
+ blink = 12;
+ else
+ blink = 6;
+ }
//if (flash == 1) flash = 23; // Reset flash value
}
+
//
// Draw the dipswitch portion of the GUI
//
void DrawDipswitch(void)
{
- uint8_t dseloff[16] = { 0, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 11, 12 };
- uint8_t * dtxt[13] = { idstext1, idstext2, idstext3, idstext4, idstext5,
- idstext2, idstext6, idstext7, idstext8, idstext9,
- idstext10, idstext11, idstext12 };
-
- uint8_t dtx[13] = { 48, 80, 96, 82, 60, 80, 76, 57, 33, 50, 62, 65, 63 },
- dty[13] = { 7, 9, 7, 9, 7, 9, 7, 7, 7, 9, 7, 9, 7 };
- uint32_t dtxtoff[13] = { 4*320+24, 14*320-78, 25*320+24, 32*320-80,
- 39*320+24, 49*320-78,
- 4*320+24, 11*320-55, 18*320+24, 25*320-48,
- 32*320+24, 42*320-63, 53*320+24 };
- uint32_t scadr, bmpptr;
- //dsx = //26x65
-
- uint32_t dbase = hScrollOffset + voffsets[vScrollOffset];
- dbase += (288-26)/2; // Center horizontally
- dbase += 320*((224-((65*2)+8))/2); // Center vertically
-
- scadr = dbase; // Reset screen address
- bmpptr = 0;
- for(int yy=0; yy<65; yy++)
- {
- for(int xx=0; xx<26; xx++)
- {
- uint8_t b = idswitch[bmpptr++];
- if (b) my_scr[scadr+xx+yy*320] = b;
- }
- }
- scadr = dbase + (320*73); // Reset screen address
- bmpptr = 0;
- for(int yy=0; yy<65; yy++)
- {
- for(int xx=0; xx<26; xx++)
- {
- uint8_t b = idswitch[bmpptr++];
- if (b) my_scr[scadr+xx+yy*320] = b;
- }
- }
- for(int i=0; i<16; i++)
- {
- scadr = dbase + (5*320+5) + i*7*320;
- if (i>7) scadr += 17*320; // Adjust for DSW #2
- bmpptr = 0;
- if (gram1[0x423D+(i<<1)]) scadr += 12; // Adjust position if ON
- for(int yy=0; yy<5; yy++)
- {
- for(int xx=0; xx<5; xx++)
- {
- my_scr[scadr++] = idsbutton[bmpptr++];
- }
- scadr += 315; // Adjust position...
- }
- }
- uint8_t dselected_text = dseloff[dswitch];
- for(int i=0; i<13; i++)
- {
- if (dselected_text != i)
- {
- scadr = dbase + dtxtoff[i];
- if (i>5) scadr += (73*320);
- bmpptr = 0;
- for(int yy=0; yy<dty[i]; yy++)
- {
- for(int xx=0; xx<dtx[i]; xx++)
- {
- uint8_t b = dtxt[i][bmpptr++];
- if (b) my_scr[scadr] = b;
- scadr++;
- }
- scadr += (320-dtx[i]); // Adjust position...
- }
- }
- }
- scadr = dbase + dtxtoff[dselected_text];
- if (dselected_text>5) scadr += (73*320);
- bmpptr = 0;
- for(int yy=0; yy<dty[dselected_text]; yy++)
- {
- for(int xx=0; xx<dtx[dselected_text]; xx++)
- {
- uint8_t b = dtxt[dselected_text][bmpptr++];
- if (b) my_scr[scadr] = 125;
- scadr++;
- }
- scadr += (320-dtx[dselected_text]); // Adjust position...
- }
- if (dswitch != 16) // Draw cursor
- {
- scadr = dbase + (4*320+4) + dswitch*7*320;
- if (dswitch>7) scadr += 17*320; // Adjust for DSW #2
- for(int xx=0; xx<19; xx++) my_scr[scadr++] = dcurcol;
- scadr += 301;
- for(int xx=0; xx<5; xx++)
- {
- my_scr[scadr] = dcurcol; scadr += 18;
- my_scr[scadr] = dcurcol; scadr += 302;
- }
- for(int xx=0; xx<19; xx++) my_scr[scadr++] = dcurcol;
- }
+ uint8_t dseloff[16] = { 0, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 11, 12 };
+ uint8_t * dtxt[13] = { idstext1, idstext2, idstext3, idstext4, idstext5,
+ idstext2, idstext6, idstext7, idstext8, idstext9, idstext10, idstext11,
+ idstext12 };
+
+ uint8_t dtx[13] = { 48, 80, 96, 82, 60, 80, 76, 57, 33, 50, 62, 65, 63 },
+ dty[13] = { 7, 9, 7, 9, 7, 9, 7, 7, 7, 9, 7, 9, 7 };
+ uint32_t dtxtoff[13] = { 4*320+24, 14*320-78, 25*320+24, 32*320-80,
+ 39*320+24, 49*320-78, 4*320+24, 11*320-55, 18*320+24, 25*320-48,
+ 32*320+24, 42*320-63, 53*320+24 };
+ uint32_t scadr, bmpptr;
+ //dsx = //26x65
+
+ uint32_t dbase = hScrollOffset + voffsets[vScrollOffset];
+ dbase += (288 - 26) / 2; // Center horizontally
+ dbase += 320 * ((224 - ((65 * 2) + 8)) / 2); // Center vertically
+
+ scadr = dbase; // Reset screen address
+ bmpptr = 0;
+
+ for(int yy=0; yy<65; yy++)
+ {
+ for(int xx=0; xx<26; xx++)
+ {
+ uint8_t b = idswitch[bmpptr++];
+
+ if (b)
+ my_scr[scadr + xx + yy * 320] = b;
+ }
+ }
+
+ scadr = dbase + (320*73); // Reset screen address
+ bmpptr = 0;
+
+ for(int yy=0; yy<65; yy++)
+ {
+ for(int xx=0; xx<26; xx++)
+ {
+ uint8_t b = idswitch[bmpptr++];
+
+ if (b)
+ my_scr[scadr + xx + yy * 320] = b;
+ }
+ }
+
+ for(int i=0; i<16; i++)
+ {
+ scadr = dbase + (5 * 320 + 5) + i * 7 * 320;
+
+ if (i > 7)
+ scadr += 17*320; // Adjust for DSW #2
+
+ bmpptr = 0;
+
+ if (gram1[0x423D + (i << 1)])
+ scadr += 12; // Adjust position if ON
+
+ for(int yy=0; yy<5; yy++)
+ {
+ for(int xx=0; xx<5; xx++)
+ {
+ my_scr[scadr++] = idsbutton[bmpptr++];
+ }
+
+ scadr += 315; // Adjust position...
+ }
+ }
+
+ uint8_t dselected_text = dseloff[dswitch];
+
+ for(int i=0; i<13; i++)
+ {
+ if (dselected_text != i)
+ {
+ scadr = dbase + dtxtoff[i];
+
+ if (i > 5)
+ scadr += (73 * 320);
+
+ bmpptr = 0;
+
+ for(int yy=0; yy<dty[i]; yy++)
+ {
+ for(int xx=0; xx<dtx[i]; xx++)
+ {
+ uint8_t b = dtxt[i][bmpptr++];
+
+ if (b)
+ my_scr[scadr] = b;
+
+ scadr++;
+ }
+
+ scadr += (320 - dtx[i]); // Adjust position...
+ }
+ }
+ }
+
+ scadr = dbase + dtxtoff[dselected_text];
+
+ if (dselected_text>5)
+ scadr += (73 * 320);
+
+ bmpptr = 0;
+
+ for(int yy=0; yy<dty[dselected_text]; yy++)
+ {
+ for(int xx=0; xx<dtx[dselected_text]; xx++)
+ {
+ uint8_t b = dtxt[dselected_text][bmpptr++];
+
+ if (b)
+ my_scr[scadr] = 125;
+
+ scadr++;
+ }
+
+ scadr += (320 - dtx[dselected_text]); // Adjust position...
+ }
+
+ if (dswitch != 16) // Draw cursor
+ {
+ scadr = dbase + (4 * 320 + 4) + dswitch * 7 * 320;
+
+ if (dswitch>7)
+ scadr += 17 * 320; // Adjust for DSW #2
+
+ for(int xx=0; xx<19; xx++)
+ my_scr[scadr++] = dcurcol;
+
+ scadr += 301;
+
+ for(int xx=0; xx<5; xx++)
+ {
+ my_scr[scadr] = dcurcol;
+ scadr += 18;
+ my_scr[scadr] = dcurcol;
+ scadr += 302;
+ }
+
+ for(int xx=0; xx<19; xx++)
+ my_scr[scadr++] = dcurcol;
+ }
}
+
//
// The actual GUI display routine
//
void DrawGUI(void)
{
- if (!user_selected_something) // i.e. we're not inside a selection...
- {
- DrawSmallIcons(selection); // 'selection' is icon *not* to draw
- DrawLargeIcon(selection);
- }
- else
- {
- if (selection == DIPSWITCH) DrawDipswitch();
- }
+ if (!user_selected_something) // i.e. we're not inside a selection...
+ {
+ DrawSmallIcons(selection); // 'selection' is icon *not* to draw
+ DrawLargeIcon(selection);
+ }
+ else
+ {
+ if (selection == DIPSWITCH)
+ DrawDipswitch();
+ }
}
+
//
// User pressed left arrow handler
//
void SelectLeft(void)
{
- if (!gui_debounce)
- {
- gui_debounce = 6;
- if (!user_selected_something)
- {
- selection++;
- if (selection > 10) selection = 0;
- }
- else
- {
- if (gram1[0x423D+(dswitch<<1)]) // It's switchable...
- {} //SpawnSound(USERSOUND, SCLICK);
- else
- {} //SpawnSound(USERSOUND, SUNGH);
- gram1[0x423D+(dswitch<<1)] = 0; // & turn it off
- }
- }
+ if (!gui_debounce)
+ {
+ gui_debounce = 6;
+
+ if (!user_selected_something)
+ {
+ selection++;
+
+ if (selection > 10)
+ selection = 0;
+ }
+ else
+ {
+ if (gram1[0x423D + (dswitch << 1)]) // It's switchable...
+ {} //SpawnSound(USERSOUND, SCLICK);
+ else
+ {} //SpawnSound(USERSOUND, SUNGH);
+
+ gram1[0x423D + (dswitch << 1)] = 0; // & turn it off
+ }
+ }
}
+
//
// User pressed right arrow handler
//
void SelectRight(void)
{
- if (!gui_debounce)
- {
- gui_debounce = 6;
- if (!user_selected_something)
- {
- selection--;
- if (selection > 10) selection = 10; // Unsigned compare
- }
- else
- {
- if (!gram1[0x423D+(dswitch<<1)]) // It's switchable...
- {} //SpawnSound(USERSOUND, SCLICK);
- else
- {} //SpawnSound(USERSOUND, SUNGH);
- gram1[0x423D+(dswitch<<1)] = 1; // & turn it on
- }
- }
+ if (!gui_debounce)
+ {
+ gui_debounce = 6;
+
+ if (!user_selected_something)
+ {
+ selection--;
+
+ if (selection > 10)
+ selection = 10; // Unsigned compare
+ }
+ else
+ {
+ if (!gram1[0x423D + (dswitch << 1)]) // It's switchable...
+ {} //SpawnSound(USERSOUND, SCLICK);
+ else
+ {} //SpawnSound(USERSOUND, SUNGH);
+
+ gram1[0x423D+(dswitch<<1)] = 1; // & turn it on
+ }
+ }
}
+
//
// User pressed Up arrow handler
//
void SelectUp(void)
{
- if (!gui_debounce)
- {
- gui_debounce = 6;
- if (user_selected_something)
- {
- if (selection == DIPSWITCH)
- {
- dswitch--;
- if (dswitch > 16) dswitch = 16; // Wrap non-int
- //snd_num = dswitch; SpawnMsg(MSHOWNUMS); // Temp...
- }
- }
- }
+ if (!gui_debounce)
+ {
+ gui_debounce = 6;
+
+ if (user_selected_something)
+ {
+ if (selection == DIPSWITCH)
+ {
+ dswitch--;
+
+ if (dswitch > 16)
+ dswitch = 16; // Wrap non-int
+ //snd_num = dswitch; SpawnMsg(MSHOWNUMS); // Temp...
+ }
+ }
+ }
}
+
//
// User pressed down arrow handler
//
void SelectDown(void)
{
- if (!gui_debounce)
- {
- gui_debounce = 6;
- if (user_selected_something)
- {
- if (selection == DIPSWITCH)
- {
- dswitch++;
- if (dswitch > 16) dswitch = 0;
- //snd_num = dswitch; SpawnMsg(MSHOWNUMS); // Temp...
- }
- }
- }
+ if (!gui_debounce)
+ {
+ gui_debounce = 6;
+
+ if (user_selected_something)
+ {
+ if (selection == DIPSWITCH)
+ {
+ dswitch++;
+
+ if (dswitch > 16)
+ dswitch = 0;
+ //snd_num = dswitch; SpawnMsg(MSHOWNUMS); // Temp...
+ }
+ }
+ }
}
+
//
// User selected something! Handle it!
//
uint8_t UserSelectedSomething(void)
{
- //extern uint8_t * gram1;
-
- if (!gui_debounce)
- {
- gui_debounce = 6;
- if (!user_selected_something) // Inside a selection? no...
- {
- if (selection == NOGUI) // Turn off GUI
- {
- show_gui = false;
- }
- if (selection == COINUP) // Coin up machine
- {
- gram1[0x41A5]++; // Add one coin... (prob. need sep. counter)
- num_coins++;
- gram1[0x4189] = num_coins/10; // Should be in THUNDER.CPP?
- gram1[0x418A] = num_coins - (gram1[0x4189]*10);
- }
- if (selection == PL1START) // 1 Player start
- {
- if (num_coins)
- {
- num_coins--;
- show_gui = false; // Shut off GUI only if coined up
- }
- gram1[0x418C] = 1; // Strobe start location
- }
- if (selection == PL2START) // 2 Player start
- {
- if (num_coins > 1)
- {
- num_coins -= 2;
- show_gui = false;
- }
- }
- if (selection == REFRESH) // Toggle refresh rate
- {
- //SpawnSound(USERSOUND, SCLICK);
- }
- if (selection == DIPSWITCH) // Edit game settings
- {
- //SpawnSound(USERSOUND, SBLAH);
- user_selected_something = true;
- dswitch = 0; // Set at first dipswitch
- }
- if (selection == OPTIONS) // Edit emulator settings
- {
- }
- if (selection == KEYCONFIG) // Edit game keys
- {
- }
- if (selection == SNAPSHOT) // Snapshot
- {
- SpawnSound(USERSOUND, SCAMERA);
- SnapPCX(screen);
- }
- if (selection == RESET) // Reset machine
- {
- //SpawnSound(USERSOUND, SRESET);
- }
- if (selection == EXIT)
- {
- SpawnSound(USERSOUND, SCYA);
- }
- return selection;
- }
- else // Selected something inside selection...
- {
- if (selection == DIPSWITCH)
- {
- if (dswitch == 16) // Selected 'back to GUI'
- {
- //SpawnSound(USERSOUND, SBLAH2);
- user_selected_something = false;
- }
- else
- {
- //SpawnSound(USERSOUND, SCLICK);
- gram1[0x423D + (dswitch<<1)] = !gram1[0x423D + (dswitch<<1)];
- }
- }
- return 0xFF; // Nothing for main to do...
- }
- }
- else return 0xFF; // Wasn't debounced, so return invalid
+ //extern uint8_t * gram1;
+
+ if (!gui_debounce)
+ {
+ gui_debounce = 6;
+
+ if (!user_selected_something) // Inside a selection? no...
+ {
+
+ if (selection == NOGUI) // Turn off GUI
+ {
+ show_gui = false;
+ }
+
+ if (selection == COINUP) // Coin up machine
+ {
+ gram1[0x41A5]++; // Add one coin... (prob. need sep. counter)
+ num_coins++;
+ gram1[0x4189] = num_coins / 10; // Should be in THUNDER.CPP?
+ gram1[0x418A] = num_coins - (gram1[0x4189] * 10);
+ }
+
+ if (selection == PL1START) // 1 Player start
+ {
+ if (num_coins)
+ {
+ num_coins--;
+ show_gui = false; // Shut off GUI only if coined up
+ }
+
+ gram1[0x418C] = 1; // Strobe start location
+ }
+
+ if (selection == PL2START) // 2 Player start
+ {
+ if (num_coins > 1)
+ {
+ num_coins -= 2;
+ show_gui = false;
+ }
+ }
+
+ if (selection == REFRESH) // Toggle refresh rate
+ {
+ //SpawnSound(USERSOUND, SCLICK);
+ }
+
+ if (selection == DIPSWITCH) // Edit game settings
+ {
+ //SpawnSound(USERSOUND, SBLAH);
+ user_selected_something = true;
+ dswitch = 0; // Set at first dipswitch
+ }
+
+ if (selection == OPTIONS) // Edit emulator settings
+ {
+ }
+
+ if (selection == KEYCONFIG) // Edit game keys
+ {
+ }
+
+ if (selection == SNAPSHOT) // Snapshot
+ {
+ SpawnSound(USERSOUND, SCAMERA);
+ SnapPCX(screen);
+ }
+
+ if (selection == RESET) // Reset machine
+ {
+ //SpawnSound(USERSOUND, SRESET);
+ }
+
+ if (selection == EXIT)
+ {
+ SpawnSound(USERSOUND, SCYA);
+ }
+
+ return selection;
+ }
+ else // Selected something inside selection...
+ {
+ if (selection == DIPSWITCH)
+ {
+ if (dswitch == 16) // Selected 'back to GUI'
+ {
+ //SpawnSound(USERSOUND, SBLAH2);
+ user_selected_something = false;
+ }
+ else
+ {
+ //SpawnSound(USERSOUND, SCLICK);
+ gram1[0x423D + (dswitch << 1)] = !gram1[0x423D + (dswitch << 1)];
+ }
+ }
+
+ return 0xFF; // Nothing for main to do...
+ }
+ }
+ else
+ return 0xFF; // Wasn't debounced, so return invalid
}
+
//
// Show byte passed to it
//
void ShowNumbers(int number)
{
- uint8_t * bnarray[16] = { bn0, bn1, bn2, bn3, bn4, bn5, bn6, bn7, bn8, bn9,
- bnA, bnB, bnC, bnD, bnE, bnF };
- uint32_t scadr = hScrollOffset + voffsets[vScrollOffset] + 642 + 2560;
- uint16_t bmpptr = 0;
-
- uint8_t first_dig = number>>4, second_dig = number&0x0F;
- for(int y=0; y<7; y++)
- {
- for(int x=0; x<6; x++)
- {
- if (bnarray[first_dig][bmpptr++] == 1) my_scr[scadr+x+y*320] = 7;
- else my_scr[scadr+x+y*320] = 0;
- }
- }
- bmpptr = 0; scadr += 6;
- for(int y=0; y<7; y++)
- {
- for(int x=0; x<6; x++)
- {
- if (bnarray[second_dig][bmpptr++] == 1) my_scr[scadr+x+y*320] = 7;
- else my_scr[scadr+x+y*320] = 0;
- }
- }
+ uint8_t * bnarray[16] = { bn0, bn1, bn2, bn3, bn4, bn5, bn6, bn7, bn8, bn9,
+ bnA, bnB, bnC, bnD, bnE, bnF };
+ uint32_t scadr = hScrollOffset + voffsets[vScrollOffset] + 642 + 2560;
+ uint16_t bmpptr = 0;
+
+ uint8_t first_dig = number >> 4, second_dig = number & 0x0F;
+
+ for(int y=0; y<7; y++)
+ {
+ for(int x=0; x<6; x++)
+ {
+ if (bnarray[first_dig][bmpptr++] == 1)
+ my_scr[scadr + x + y * 320] = 7;
+ else
+ my_scr[scadr + x + y * 320] = 0;
+ }
+ }
+
+ bmpptr = 0;
+ scadr += 6;
+
+ for(int y=0; y<7; y++)
+ {
+ for(int x=0; x<6; x++)
+ {
+ if (bnarray[second_dig][bmpptr++] == 1)
+ my_scr[scadr + x + y * 320] = 7;
+ else
+ my_scr[scadr + x + y * 320] = 0;
+ }
+ }
}
+
//
// Spawn a message
//
void SpawnMsg(uint8_t msg)
{
- text_life = 60; // 1 second...
- show_text = true; // Show the damn thing...
- show_which_msg = msg; // And tell it which message to show...
+ text_life = 60; // 1 second...
+ show_text = true; // Show the damn thing...
+ show_which_msg = msg; // And tell it which message to show...
}
+
//
// Draw text message
//
void DrawText(void)
{
- if (!text_life) // Kill text if it's time
+ // Kill text if it's time
+ if (!text_life)
{
show_text = false;
return;
}
- text_life--; // Your life force is running out...
+ // Your life force is running out...
+ text_life--;
// Draw the message here...
uint32_t scadr = hScrollOffset + voffsets[vScrollOffset] + 642;
ShowNumbers(snd_num);
}
+
//
// Sound stuff (Will go elsewhere??? Perhaps in sound.cpp?)
//
}
}
+
//
// Sound card IRQ handler
//
void SoundFunc(void * userdata, Uint8 * buff, int num)
{
- uint16_t cnt = 0, sample; // 0-22 different sounds...
+ // 0-22 different sounds...
+ uint16_t cnt = 0, sample;
uint8_t start_samp1, end_samp1, start_samp2, end_samp2;
uint8_t samp1 = 128, samp2 = 128, samp3 = 128,
samp4 = 128, samp5 = 128, samp6 = 128; // Zero samples...
- memset(buff, 128, num); // Kill sound...
+ // Kill sound...
+ memset(buff, 128, num);
if (chan1_go || chan2_go || chan3_go || chan4_go || chan5_go || chan6_go)
{
{
samp1 = voice_rom[spos1++];
+ // Kill channel 1 if done...
if (samp1 == 0xFF)
{
chan1_go = false;
- samp1 = 128; // Kill channel 1 if done...
+ samp1 = 128;
}
- else if (samp1 == 0x00) // RLE compression...
+ // RLE compression...
+ else if (samp1 == 0x00)
{
- sample1 += (float)voice_rom[spos1++] * sampleBase; // # of repeats
- samp1 = prevSamp1; // Get last good sample
+ // # of repeats
+ sample1 += (float)voice_rom[spos1++] * sampleBase;
+ // Get last good sample
+ samp1 = prevSamp1;
}
else
- sample1 += sampleBase; // Keep fractional part intact
+ // Keep fractional part intact
+ sample1 += sampleBase;
}
- prevSamp1 = samp1; // Save last sample value
- sample1 -= 1.0; // Decrement repeat counter
+ prevSamp1 = samp1; // Save last sample value
+ sample1 -= 1.0; // Decrement repeat counter
}
// Stretching 5KHz samples to 22KHz:
sample2 -= 1.0;
}
- if (chan3_go)
- {
- samp3 = sndp3[spos3++];
- if (spos3 == end_pos3)
- {
- chan3_go = false; samp3 = 128; // Kill channel 3 if done...
- }
- }
-
- if (chan4_go)
- {
- samp4 = sndp4[spos4++];
- if (spos4 == end_pos4)
- {
- chan4_go = false; samp4 = 128; // Kill channel 4 if done...
- }
- }
-
- if (chan5_go)
- {
- samp5 = sndp5[spos5++];
- if (spos5 == end_pos5)
- {
- chan5_go = false; samp5 = 128; // Kill channel 5 if done...
- }
- }
+ if (chan3_go)
+ {
+ samp3 = sndp3[spos3++];
+
+ if (spos3 == end_pos3)
+ {
+ chan3_go = false;
+ samp3 = 128; // Kill channel 3 if done...
+ }
+ }
+
+ if (chan4_go)
+ {
+ samp4 = sndp4[spos4++];
+
+ if (spos4 == end_pos4)
+ {
+ chan4_go = false;
+ samp4 = 128; // Kill channel 4 if done...
+ }
+ }
+
+ if (chan5_go)
+ {
+ samp5 = sndp5[spos5++];
+
+ if (spos5 == end_pos5)
+ {
+ chan5_go = false;
+ samp5 = 128; // Kill channel 5 if done...
+ }
+ }
if (chan6_go)
{
samp6 = sndp6[spos6++];
if (spos6 == end_pos6)
- chan6_go = false, samp6 = 128; // Kill channel 6...
+ {
+ chan6_go = false;
+ samp6 = 128; // Kill channel 6...
+ }
}
- sample = samp1 + samp2 + samp3 + samp4 + samp5 + samp6 - 640; // Mix 'em...
+ // Mix 'em...
+ sample = samp1 + samp2 + samp3 + samp4 + samp5 + samp6 - 640;
- if (sample & 0xFF00) // i.e., it overflowed
- sample = (sample&0x8000 ? 0x00 : 0xFF); // Clip it
+ // If it overflowed, clip it
+ if (sample & 0xFF00)
+ sample = (sample & 0x8000 ? 0x00 : 0xFF);
- buff[cnt++] = sample; // & store it...
+ buff[cnt++] = sample;
}
}
}
+