X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthunder.cpp;fp=src%2Fthunder.cpp;h=18cf8df7b3b212602b1fbc5e44c958949f8cd0ac;hb=009359ef732411d9d978d137f1371647abc97261;hp=d1ebfde22f9e07fbac870ff4c933170210cba2cf;hpb=be67039a7ed493081dd1503f94cdfae4dd4d965e;p=thunder diff --git a/src/thunder.cpp b/src/thunder.cpp index d1ebfde..18cf8df 100644 --- a/src/thunder.cpp +++ b/src/thunder.cpp @@ -28,6 +28,7 @@ #include #include "gui.h" #include "log.h" +#include "psg.h" #include "screen.h" #include "sound.h" #include "v63701.h" @@ -73,13 +74,14 @@ using namespace std; SDL_Surface * screen; -uint8_t * gram, * grom; // Allocate RAM & ROM pointers -uint8_t gram1[0x10000], gram2[0x10000], grom1[0x10000], grom2[0x10000]; // Actual memory -uint8_t grom3[0x8000], grom4[0x8000], data_rom[0x40000], spr_rom[0x80000], voice_rom[0x20000]; -uint8_t chr_rom[0x60000]; // Character ROM pointer +uint8_t * gram, * grom; // Allocate RAM & ROM pointers +// Actual memory +uint8_t gram1[0x10000], gram2[0x10000], grom1[0x10000], grom2[0x10000]; +uint8_t grom3[0x8000], data_rom[0x40000], spr_rom[0x80000], voice_rom[0x20000]; +uint8_t chr_rom[0x60000]; // Character ROM pointer uint8_t mcuMem[0x10000]; // 64K for MCU -V6809REGS cpu1, cpu2; +V6809REGS cpu1, cpu2; // CPU execution contexts V63701REGS mcu; bool trace1 = false; // ditto... @@ -97,188 +99,153 @@ bool refresh2 = true; uint32_t psg_lens[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; uint8_t * psg_adrs[16]; -//uint32_t voc_lens[32] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -//uint8_t * voc_adrs[32]; -//uint32_t fm_lens[14] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -//uint8_t * fm_adrs[14]; Byte input1, input2, input3, input4, input5; fstream tr; // Tracelog hook uint16_t pcx; // Where we at? +// Function prototypes +uint8_t MCUReadMemory(uint16_t address); +void MCUWriteMemory(uint16_t address, uint8_t data); + // -// Read a byte from memory (without touching PC. Not a Fetch!) +// Read a byte from memory // uint8_t RdMem(uint16_t addr) { uint8_t b; - // $4000-4300 is RAM shared with the microcontroller... - if (addr < 0x8000) { // Memory shared with MCU (CPU #1 only! CPU #2 does not) if ((addr >= 0x4000) && (addr <= 0x43FF)) return mcuMem[addr - 0x3000]; +// if ((addr >= 0x4000) && (addr <= 0x41FF)) +// return MCUReadMemory(addr - 0x3000); +// if ((addr >= 0x4200) && (addr <= 0x43FF)) +// return mcuMem[addr - 0x3000]; - if (addr > 0x5FFF) - b = data_rom[banksw1 + (addr - 0x6000)]; // Get char data + if (addr >= 0x6000) + return data_rom[banksw1 + (addr - 0x6000)]; // Get char data else - b = gram1[addr]; + return gram1[addr]; } - else - b = grom1[addr]; - return b; + return grom1[addr]; } // // Write a byte to memory // -void WrMem(uint16_t addr, uint8_t b) +void WrMem(uint16_t address, uint8_t data) { extern bool disasm; extern bool charbase; // Needed for screen. Extern it in it?? #if 0 - if (addr == 0x4182) + if (address == 0x4182) { WriteLog("\nWriteMem: CPU #1 writing $%02X to $4182!\n\n", b); } #endif #if 0 -if (((addr >= 0x4180) && (addr <= 0x4191)) || (addr == 0x4380)) - printf("WriteMem: CPU #1 writing $%02X to $%04X...\n", b, addr); +if (((address >= 0x4180) && (address <= 0x4191)) || (address == 0x4380)) + printf("WriteMem: CPU #1 writing $%02X to $%04X...\n", b, address); #endif - if (addr == 0x6000) - SpawnSound(GAMESOUND, gram1[0x6200], 0); // Do voice chan 1 - if (addr == 0x6400) - SpawnSound(GAMESOUND, gram1[0x6600], 1); // Do voice chan 2 - if (addr == 0x6800) - banksw1 = (uint32_t)b << 13; // Set char data bankswitch base address - if (addr > 0x4284 && addr < 0x42A5 && b) - SpawnSound(PSGSOUND, addr - 0x4285); // Do PSG sound on chans 2, 3 -#if 0 - if (addr == 0x4380) - { - SpawnSound(FMSOUND, b); // Do FM sound on channel 4 - if (b == 12) - game_over_switch = 240; // Set game over delay... - } -#endif -// if (addr < 0x423D || addr > 0x425C) // Protect writes to DSWs -//if (addr == 0x4191) + if (address == 0x6000) +{ +//printf("Spawning VOICE channel #1: $6000=$%02X, $6200=$%02X\n", b, gram1[0x6200]); + SpawnSound(GAMESOUND, gram1[0x6200], 0); // Do voice chan 1 +} + if (address == 0x6400) +{ +//printf("Spawning VOICE channel #2: $6400=$%02X, $6600=$%02X\n", b, gram1[0x6600]); + SpawnSound(GAMESOUND, gram1[0x6600], 1); // Do voice chan 2 +} + if (address == 0x6800) + banksw1 = (uint32_t)data << 13; // Set char data bankswitch base address + if (address > 0x4284 && address < 0x42A5 && data) + SpawnSound(PSGSOUND, address - 0x4285); // Do PSG sound on chans 2, 3 + +//if ((address >= 0x4284) && (address < 0x42A5)) //{ -// printf("V6809: Writing %02X to $4191...\n", b); +// printf("WrMem: Wrote $%02X to PSG address $%04X...\n", data, address); //} // Memory shared with MCU (CPU #1 only! CPU #2 does not) - if ((addr >= 0x4000) && (addr <= 0x43FF)) - mcuMem[addr - 0x3000] = b; + if ((address >= 0x4000) && (address <= 0x43FF)) + mcuMem[address - 0x3000] = data; +// if ((address >= 0x4000) && (address <= 0x41FF)) +// MCUWriteMemory(address - 0x3000, data); +// if ((address >= 0x4200) && (address <= 0x43FF)) +// mcuMem[address - 0x3000] = data; else - gram1[addr] = b; + gram1[address] = data; - if (addr == 0x8800) - charbase = false; // Char banksw1 - if (addr == 0x8C00) - charbase = true; // Char banksw2 - if (addr == 0x8400) // Frame go strobe? VBlank acknowledge? + if (address == 0x8800) + charbase = false; // Char banksw1 + if (address == 0x8C00) + charbase = true; // Char banksw2 + if (address == 0x8400) // Frame go strobe? VBlank acknowledge? { - if (refresh_++ == 1) // 30 Hz... - { - BlitChar(screen, chr_rom, gram1); - refresh_ = (refresh2 ? 1 : 0); // 60/30 Hz... - } + BlitChar(screen, chr_rom, gram1); // IRQ Ack (may also be frame go... ClearLineOfCurrentV6809(V6809_ASSERT_LINE_IRQ); #if 1 if (disasm) - WriteLog("WriteMem: CPU #1 Acknowledging IRQ...\n", b); + WriteLog("WriteMem: CPU #1 Acknowledging IRQ...\n", data); #endif } } // -// Read a byte from memory (without touching PC. Not a Fetch!) (2nd processor) +// Read a byte from memory (2nd processor) // -uint8_t RdMemB(uint16_t addr) +uint8_t RdMemB(uint16_t address) { - uint8_t b; - - if (addr < 0x8000) + if (address < 0x8000) { - if (addr < 0x2000) - b = gram1[addr + 0x4000]; - if (addr > 0x1FFF && addr < 0x6000) - b = gram1[addr - 0x2000]; - if (addr > 0x5FFF) - b = grom3[banksw2 + (addr - 0x6000)]; + if (address < 0x2000) + return gram1[address + 0x4000]; + else if ((address >= 0x2000) && (address < 0x6000)) + return gram1[address - 0x2000]; + else if (address >= 0x6000) + return grom3[banksw2 + (address - 0x6000)]; } - else - b = grom2[addr]; - return b; + return grom2[address]; } // // Write a byte to memory (2nd processor) // -void WrMemB(uint16_t addr, uint8_t b) +void WrMemB(uint16_t address, uint8_t data) { extern bool disasm; extern bool charbase; -#if 0 - if (addr == 0x0182) - { - WriteLog("\nWriteMem: CPU #2 writing $%02X to $0182 ($4182)!\n\n", b); - } -#endif -#if 0 -if (((addr >= 0x0180) && (addr <= 0x0191)) || (addr == 0x0380)) - printf("WriteMem: CPU #2 writing $%02X to $%04X...\n", b, addr); -#endif + // Set sprite data bank switch + if (address == 0xD803) + banksw2 = (uint32_t)(data & 0x03) << 13; -#if 0 - if (addr == 0x6000) - SpawnSound(GAMESOUND, gram1[0x6200], 0); // Do voice chan 1 - if (addr == 0x6400) - SpawnSound(GAMESOUND, gram1[0x6600], 1); // Do voice chan 2 - if (addr > 0x0284 && addr < 0x02A5 && b) - SpawnSound(PSGSOUND, addr - 0x0285); // Do PSG sound on chans 2, 3 -#endif - if (addr == 0xD803) - banksw2 = (uint32_t)(b & 0x03) << 13; // Set sprite data bank switch -#if 0 - if (addr == 0x0380) - { - SpawnSound(FMSOUND, b); // Do FM sound on chan 4 - if (b == 12) - game_over_switch = 240; // Set game over delay... - } -#endif -// if (addr < 0x023D || addr > 0x025C) // Protect writes against DSWs - { - if (addr < 0x2000) - gram1[addr + 0x4000] = b; - if (addr > 0x1FFF && addr < 0x6000) - gram1[addr - 0x2000] = b; -// if (addr > 0x5FFF) -// gram1[addr] = b; - } - if (addr == 0x8800) + if (address < 0x2000) + gram1[address + 0x4000] = data; + + if ((address >= 0x2000) && (address < 0x6000)) + gram1[address - 0x2000] = data; + + if (address == 0x8800) { // IRQ Ack (may also be frame go...) ClearLineOfCurrentV6809(V6809_ASSERT_LINE_IRQ); #if 1 if (disasm) - WriteLog("WriteMem: CPU #2 Acknowledging IRQ...\n", b); + WriteLog("WriteMem: CPU #2 Acknowledging IRQ...\n", data); #endif } } @@ -287,41 +254,22 @@ if (((addr >= 0x0180) && (addr <= 0x0191)) || (addr == 0x0380)) uint8_t MCUReadMemory(uint16_t address) { if (address < 0x20) - { -// printf("V63701 read $%02X from $%02X...\n", memory[address], address); return InternalRegisterRead(address); - } + else if ((address >= 0x1000) && (address <= 0x113F)) +// else if ((address >= 0x1000) && (address <= 0x11FF)) + return ReadPSG(address - 0x1000); else if ((address >= 0x2000) && (address <= 0x2001)) - { -// return 0; //for now return YMReadReg(0); - } // Various joystick + buttons; all are active low. else if (address == 0x2020) - { -//printf("MCURead: Returning $%02X from $2020...\n", input1.byte); return input1.byte; - } else if (address == 0x2021) - { -//extern bool V63701LogGo; -//if (input2.byte == 0xDF) -// V63701LogGo = true; - -//printf("MCURead: Returning $%02X from $2021...\n", input2.byte); return input2.byte; - } // This is DSW1 & 2. All switch settings are active low. else if (address == 0x2030) - { -//printf("MCURead: Returning $%02X from $2030...\n", input4.byte); return input4.byte; - } else if (address == 0x2031) - { -//printf("MCURead: Returning $%02X from $2031...\n", input5.byte); return input5.byte; - } return mcuMem[address]; } @@ -331,31 +279,20 @@ void MCUWriteMemory(uint16_t address, uint8_t data) { static uint8_t ymRegister; -#if 1 if (address < 0x20) { -// printf("V63701 wrote $%02X to $%02X...\n", data, address); InternalRegisterWrite(address, data); return; } -#endif - -//if (address == 0x1191) -//{ -// printf("V63701: Writing $%02X to $1191...\n", data); -//} -#if 0 - // Translate local reads @ $1000-$13FF to $4000-$43FF in shared RAM - if ((address >= 0x1000) && (address <= 0x13FF)) + else if (((address >= 0x4000) && (address <= 0xBFFF)) + || (address >= 0xF000)) + return; + else if ((address >= 0x1000) && (address <= 0x113F)) +// else if ((address >= 0x1000) && (address <= 0x11FF)) { - gram1[0x3000 + address] = data; + WritePSG(address - 0x1000, data); return; } -#endif - - if (((address >= 0x4000) && (address <= 0xBFFF)) - || (address >= 0xF000)) - return; else if (address == 0x2000) { ymRegister = data; @@ -363,7 +300,6 @@ void MCUWriteMemory(uint16_t address, uint8_t data) } else if (address == 0x2001) { -//printf("Writing $%02X to YM2151 register $%02X...\n", data, ymRegister); YMWriteReg(0, ymRegister, data); return; } @@ -587,6 +523,7 @@ uint32_t GetWAVLength(fstream & file) } +#if 0 // // Load PSG samples from disk // @@ -626,48 +563,8 @@ void LoadPSGs(void) } } } - - -#if 0 -// -// Load FM samples from disk -// -void LoadFMs(void) -{ - char file[200]; - char ch; - uint32_t len; - - for(int i=0; i<14; i++) - { - fstream fp; - - fm_adrs[i] = NULL; // Zero out pointer - sprintf(file, "./sounds/fm%i.wav", i); // Create filename - fp.open(file, ios::binary | ios::in); // Attempt to open it... - - if (!fp) - continue; - - len = GetWAVLength(fp); // Get WAV length... - fm_adrs[i] = new uint8_t[len]; // Attempt to allocate space... - - if (fm_adrs[i] != NULL) - { - for(int j=0; j<(signed)len; j++) - { - fp.get(ch); - fm_adrs[i][j] = ch; // & load it in... - } - - fm_lens[i] = len; - printf("Found sample file: %s\t[Length: %u]\n", file, len); - } - - fp.close(); - } -} #endif +FILE * psg1, * psg2; // @@ -691,7 +588,7 @@ extern bool disasm; // From 'V6809.CPP' uint16_t debounce = 0; // Key de-bounce counter uint16_t fire_debounce = 0; // Fire button debounce counter uint8_t x; // General placeholder... - bool active = true; // Program running flag +// bool active = true; // Program running flag SDL_Event event; // SDL "event" extern uint8_t palette[768]; // Screen physical palette @@ -729,9 +626,6 @@ extern bool disasm; // From 'V6809.CPP' if (!LoadImg(ROM3, grom3, 0, 0x8000)) // Load 3rd ROM into its own space { cout << "Could not open file '" << ROM3 << "'!" << endl; return -1; } -// if (!LoadImg(ROM4, grom4, 0, 0x8000)) // Load 4rd ROM into its own space -// { cout << "Could not open file '" << ROM4 << "'!" << endl; return -1; } - if (!LoadImg(ROM17, data_rom, 0, 0x10000)) // Load 17th ROM { cout << "Could not open file '" << ROM17 << "'!" << endl; return -1; } @@ -787,9 +681,9 @@ extern bool disasm; // From 'V6809.CPP' if (!LoadImg(ROM4, mcuMem, 0x4000, 0x8000)) // Load 4th ROM { cout << "Could not open file '" << ROM4 << "'!" << endl; return -1; } - // Load samples if they're there... - LoadPSGs(); -// LoadFMs(); +// Now emulated! :-D + // Load PSG samples if they're there... +// LoadPSGs(); // Set up V6809 execution contexts @@ -808,10 +702,10 @@ extern bool disasm; // From 'V6809.CPP' mcu.WrMem = MCUWriteMemory; mcu.cpuFlags |= V63701_ASSERT_LINE_RESET; - uint32_t my_clock = 0; +// uint32_t my_clock = 0; running = true; // Set running status... - trace1 = false; - SetRefreshRate(refresh2); // Tell GUI our refresh rate +// trace1 = false; +// SetRefreshRate(refresh2); // Tell GUI our refresh rate // Set all inputs to inactive... input1.byte = input2.byte = input3.byte = input4.byte = input5.byte = 0xFF; @@ -826,7 +720,6 @@ extern bool disasm; // From 'V6809.CPP' #endif banksw1 = 0; // Will this work? banksw2 = 0; -// iclock = 0; // Reset instr clock #1... InitGUI(); // Reset # of coins WriteLog("About to set up screen...\n"); @@ -835,30 +728,16 @@ WriteLog("About to set up screen...\n"); oldTicks = SDL_GetTicks(); WriteLog("About to set up audio...\n"); -#if 0 - // This crap SHOULD be in sound.cpp (not yet created)... - SDL_AudioSpec desired, obtained; - desired.freq = 22050; - desired.format = AUDIO_U8; - desired.channels = 1; - desired.samples = 600; - desired.callback = SoundFunc; - desired.userdata = NULL; - // Also, should check to see if it got the hardware it needed, correct sample size, etc. - if (SDL_OpenAudio(&desired, &obtained) < 0) - { - cout << "Couldn't open audio: " << SDL_GetError() << endl; - return -1; - } - - SDL_PauseAudio(0); // Get that audio going! -#else InitSound(); -#endif memset(scrBuffer, 0xFF, VIRTUAL_SCREEN_WIDTH*VIRTUAL_SCREEN_HEIGHT*sizeof(uint32_t)); RenderScreenBuffer(); +#if 1 +psg1 = fopen("psgchan1.raw", "wb"); +psg2 = fopen("psgchan3.raw", "wb"); +#endif + WriteLog("About to enter main loop...\n"); while (running) { @@ -881,16 +760,6 @@ WriteLog("About to enter main loop...\n"); //gram1[0x423D] = 1; //gram1[0x423D] = self_test; // Reset DSW1-1 // gram1[0x4268] = 0; // Reset Video test -// gram1[0x427A] = 0; gram1[0x427C] = 0; - //gram1[0x427B] = 0; gram1[0x427D] = 0; -// gram1[0x427E] = 0;// gram1[0x427F] = 0; -// gram1[0x4280] = 0;// gram1[0x4281] = 0; - //gram1[0x4276] = 0; -// gram1[0x426A] = 0; - //gram1[0x4278] = 0; -// gram1[0x426C] = 0; -// gram1[0x4262] = 0; gram1[0x4260] = 0; - //gram1[0x4247] = 0; // SDL key handling... @@ -1298,11 +1167,16 @@ WriteLog("About to enter main loop...\n"); SDL_Quit(); +#if 1 +fclose(psg1); +fclose(psg2); +#endif +#if 0 // Deallocate sounds if they were loaded for(int i=0; i<16; i++) if (psg_adrs[i]) delete[] psg_adrs[i]; - +#endif #if 0 for(int i=0; i<14; i++) if (fm_adrs[i])