X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgui.cpp;h=a3379721e10d3b242038f6d602e79e7632431643;hb=1c26b00fe4ae49984de2d33f7d13c20760664dd9;hp=77640416e0e4ac53d6432e941d5681008362d481;hpb=daddbc234577dec4d318337f7ee0cf32517f0540;p=thunder diff --git a/src/gui.cpp b/src/gui.cpp index 7764041..a337972 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -2,7 +2,7 @@ // Thunder Graphic User Interface // // by James Hammons -// (c) 2004, 2014 Underground Software +// (C) 2004, 2014 Underground Software // // JLH = James Hammons // @@ -14,23 +14,16 @@ #include "gui.h" #include -#include // Needed for tracelog #include "screen.h" +#include "sound.h" #include "resource.h" // Thunder graphics & sounds 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 uint32_t voffsets[8]; -extern uint8_t voice_rom[]; // PCM data pointer -extern fstream tr; // Tracelog // Global shit @@ -39,7 +32,6 @@ 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 @@ -53,30 +45,6 @@ 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... - -const float sampleBase = 22050.0/6000.0; // Btwn 5512.5 and 6000 -bool snd_go = false; -bool chan1_go = false, chan2_go = false, chan3_go = false; -bool chan4_go = false, chan5_go = false, chan6_go = false; -uint8_t * sndp1, * sndp2, * sndp3, * sndp4, * sndp5, * sndp6; -uint32_t rom_pos, end_pos; -uint32_t spos1, end_pos1; -uint32_t spos2, end_pos2; -uint32_t spos3, end_pos3; -uint32_t spos4, end_pos4; -uint32_t spos5, end_pos5; -uint32_t spos6, end_pos6; -float sample1; -uint8_t prevSamp1; -int8_t delta_x1; -float sample2; -uint8_t prevSamp2; -int8_t delta_x2; - -uint8_t * snd_array[3] = { sunknown, scya, scamera }; // From RESOURCE.H -uint32_t snd_lens[3] = { sunknownlen, scyalen, scameralen }; - // Bitmaps uint8_t bmp1[] = { @@ -263,7 +231,7 @@ uint8_t bnF[] = { }; - // +// // Initialize GUI // void InitGUI(void) @@ -376,7 +344,7 @@ void DrawSmallIcons(uint16_t icon_not_to_draw) xl = xlens[iconidx[idx]]; yl = ylens[iconidx[idx]]; - uint32_t scadr = hScrollOffset + voffsets[vScrollOffset]; + 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; @@ -404,7 +372,7 @@ void DrawSmallIcons(uint16_t icon_not_to_draw) xl = xlens[iconidx[idx]]; yl = ylens[iconidx[idx]]; - uint32_t scadr = hScrollOffset + voffsets[vScrollOffset]; + 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; @@ -471,7 +439,7 @@ void DrawLargeIcon(uint16_t icon) yl = ylens[6]; } - uint32_t scadr = hScrollOffset + voffsets[vScrollOffset]; + uint32_t scadr;// = hScrollOffset + voffsets[vScrollOffset]; scadr += 320 * ((224 - yl) / 2); // Center vertically scadr += (288 - xl) / 2; // Center horizontally uint16_t bmpptr = 0; @@ -541,7 +509,7 @@ void DrawDipswitch(void) uint32_t scadr, bmpptr; //dsx = //26x65 - uint32_t dbase = hScrollOffset + voffsets[vScrollOffset]; + uint32_t dbase;// = hScrollOffset + voffsets[vScrollOffset]; dbase += (288 - 26) / 2; // Center horizontally dbase += 320 * ((224 - ((65 * 2) + 8)) / 2); // Center vertically @@ -868,7 +836,7 @@ uint8_t UserSelectedSomething(void) if (selection == SNAPSHOT) // Snapshot { SpawnSound(USERSOUND, SCAMERA); - SnapPCX(screen); + SavePCXSnapshot(); } if (selection == RESET) // Reset machine @@ -914,7 +882,8 @@ 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; +// uint32_t scadr = hScrollOffset + voffsets[vScrollOffset] + 642 + 2560; + uint32_t scadr = ((2 * 288) + 2) + (8 * 288); uint16_t bmpptr = 0; uint8_t first_dig = number >> 4, second_dig = number & 0x0F; @@ -924,9 +893,11 @@ void ShowNumbers(int number) for(int x=0; x<6; x++) { if (bnarray[first_dig][bmpptr++] == 1) - my_scr[scadr + x + y * 320] = 7; +// my_scr[scadr + x + y * 320] = 7; + my_scr[scadr + x + y * 288] = 7; else - my_scr[scadr + x + y * 320] = 0; +// my_scr[scadr + x + y * 320] = 0; + my_scr[scadr + x + y * 288] = 0; } } @@ -938,9 +909,11 @@ void ShowNumbers(int number) for(int x=0; x<6; x++) { if (bnarray[second_dig][bmpptr++] == 1) - my_scr[scadr + x + y * 320] = 7; +// my_scr[scadr + x + y * 320] = 7; + my_scr[scadr + x + y * 288] = 7; else - my_scr[scadr + x + y * 320] = 0; +// my_scr[scadr + x + y * 320] = 0; + my_scr[scadr + x + y * 288] = 0; } } } @@ -973,7 +946,8 @@ void DrawText(void) text_life--; // Draw the message here... - uint32_t scadr = hScrollOffset + voffsets[vScrollOffset] + 642; +// uint32_t scadr = hScrollOffset + voffsets[vScrollOffset] + 642; + uint32_t scadr = (288 * 2) + 2; uint16_t bmpptr = 0; for(int y=0; y<7; y++) @@ -983,23 +957,29 @@ void DrawText(void) if (show_which_msg == M60FPS) { if (bmp1[bmpptr++] == 1) - my_scr[scadr + x + y * 320] = 7; +// my_scr[scadr + x + y * 320] = 7; + my_scr[scadr + x + y * 288] = 7; else - my_scr[scadr + x + y * 320] = 0; +// my_scr[scadr + x + y * 320] = 0; + my_scr[scadr + x + y * 288] = 0; } else if (show_which_msg == M30FPS) { if (bmp2[bmpptr++] == 1) - my_scr[scadr + x + y * 320] = 7; +// my_scr[scadr + x + y * 320] = 7; + my_scr[scadr + x + y * 288] = 7; else - my_scr[scadr + x + y * 320] = 0; +// my_scr[scadr + x + y * 320] = 0; + my_scr[scadr + x + y * 288] = 0; } else if (show_which_msg == MSNAPSHOT) { if (bmp3[bmpptr++] == 1) - my_scr[scadr + x + y * 320] = 7; +// my_scr[scadr + x + y * 320] = 7; + my_scr[scadr + x + y * 288] = 7; else - my_scr[scadr + x + y * 320] = 0; +// my_scr[scadr + x + y * 320] = 0; + my_scr[scadr + x + y * 288] = 0; } } } @@ -1008,232 +988,3 @@ void DrawText(void) ShowNumbers(snd_num); } - -// -// Sound stuff (Will go elsewhere??? Perhaps in sound.cpp?) -// -void SpawnSound(int type, int snd, int channel/* = 0*/) -{ - extern uint32_t psg_lens[16]; - extern uint8_t * psg_adrs[16]; - extern uint32_t voc_lens[32]; - extern uint8_t * voc_adrs[32]; - extern uint32_t fm_lens[14]; - extern uint8_t * fm_adrs[14]; - - snd_num = snd; - SpawnMsg(MSHOWNUMS); - - if (type == GAMESOUND) - { - snd--; // Will that do it??? Yes!!! - - if (channel == 0) - { - // 00 nn ss (nn # of repeats of sample ss) - uint32_t st = 0; - - if (snd & 0x40) - { - st = 0x10000; - snd &= 0x0F; - } - - spos1 = (voice_rom[st + (snd << 1)] << 8) | voice_rom[st + (snd << 1) + 1]; - spos1 += st; // Need to add start somewhere... - prevSamp1 = 128; - sample1 = 0; - chan1_go = true; - } - else - { - uint32_t st = 0; - - if (snd & 0x40) - { - st = 0x10000; - snd &= 0x0F; - } - - spos2 = (voice_rom[st + (snd << 1)] << 8) | voice_rom[st + (snd << 1) + 1]; - spos2 += st; // Need to add start somewhere... - prevSamp2 = 128; - sample2 = 0; - chan2_go = true; - } - } - else if (type == PSGSOUND) - { - if (snd_num & 0x10) // Second channel? - { - spos3 = 0; - end_pos3 = psg_lens[snd_num & 0x0F]; - sndp3 = psg_adrs[snd_num & 0x0F]; - chan3_go = true; - - if (spos3 == end_pos3) - chan3_go = false; // No sound loaded, so don't do it! - } - else // First channel - { - spos4 = 0; - end_pos4 = psg_lens[snd_num & 0x0F]; - sndp4 = psg_adrs[snd_num & 0x0F]; - chan4_go = true; - - if (spos4 == end_pos4) - chan4_go = false; // No sound loaded, so don't do it! - } - } - else if (type == FMSOUND) - { - spos5 = 0; - end_pos5 = fm_lens[snd_num]; - sndp5 = fm_adrs[snd_num]; - chan5_go = true; - - if (spos5 == end_pos5) - chan5_go = false; // No sound loaded, so don't do it! - } - else if (type == USERSOUND) - { - spos6 = 0; - end_pos6 = snd_lens[snd_num]; // User sound - sndp6 = snd_array[snd_num]; // Load pointer - chan6_go = true; - } -} - - -// -// Sound card IRQ handler -// -void SoundFunc(void * userdata, Uint8 * buff, int num) -{ - // 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... - - // Kill sound... - memset(buff, 128, num); - - if (chan1_go || chan2_go || chan3_go || chan4_go || chan5_go || chan6_go) - { - while (cnt != num) - { - if (chan1_go) - { - if (sample1 < 1) - { - samp1 = voice_rom[spos1++]; - - // Kill channel 1 if done... - if (samp1 == 0xFF) - { - chan1_go = false; - samp1 = 128; - } - // RLE compression... - else if (samp1 == 0x00) - { - // # of repeats - sample1 += (float)voice_rom[spos1++] * sampleBase; - // Get last good sample - samp1 = prevSamp1; - } - else - // Keep fractional part intact - sample1 += sampleBase; - } - - prevSamp1 = samp1; // Save last sample value - sample1 -= 1.0; // Decrement repeat counter - } - -// Stretching 5KHz samples to 22KHz: -// numRepeats = 4; -// 6KHz -> 22KHz: 22/6 repeats... - if (chan2_go) - { - if (sample2 < 1) - { - samp2 = voice_rom[spos2++]; - - if (samp2 == 0xFF) - { - chan2_go = false; - samp2 = 128; // Kill channel 2 if done... - } - else if (samp2 == 0x00) // RLE compression... - { - sample2 += (float)voice_rom[spos2++] * sampleBase; // # of repeats - samp2 = prevSamp2; - } - else - sample2 += sampleBase; - } - -// Delta-X values were making the samples sound like crap... -// start_samp2 += delta_x2; - prevSamp2 = samp2; - 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 (chan6_go) - { - samp6 = sndp6[spos6++]; - - if (spos6 == end_pos6) - { - chan6_go = false; - samp6 = 128; // Kill channel 6... - } - } - - // Mix 'em... - sample = samp1 + samp2 + samp3 + samp4 + samp5 + samp6 - 640; - - // If it overflowed, clip it - if (sample & 0xFF00) - sample = (sample & 0x8000 ? 0x00 : 0xFF); - - buff[cnt++] = sample; - } - } -} -