From: Pokemonhacker <pok...@us...> - 2004-12-18 23:10:09
|
Update of /cvsroot/vba/VisualBoyAdvance/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22222 Modified Files: AutoBuild.h Cheats.cpp Cheats.h GBA.cpp GBA.h GBAinline.h hq2x.cpp Sound.cpp Log Message: - Added GPL link to Help menu - Fixed problem displaying rom names that use & character - SDL debugger improvements adapted from VBA-H: break on change, conditional breakpoints (ARM and THUMB), dump load and save (memory), edit register, disassemble to file, save and load state from debugger, - Fix lq2x filter (was using hq2x code) - Major AR V1/2/3 support by PokemonHacker - Simplified GBA emulation loop (easier to understand and maintain) - Fixed some bugs with IntrWait emulation - Fixed some timer bugs - Fixed memory timing when loading a save state (was using the timings before loading the state) - Added emulation for DMA interaction with reading from invalid address - Fixed bug writing to IO register past 0x4000400 (no mirroring) - Ignore 8-bit writes to OBJ and OAM memory Index: Cheats.h =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/Cheats.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** Cheats.h 13 May 2004 15:06:43 -0000 1.8 --- Cheats.h 18 Dec 2004 23:09:56 -0000 1.9 *************** *** 26,29 **** --- 26,30 ---- int status; bool enabled; + u32 rawaddress; u32 address; u32 value; *************** *** 33,37 **** }; ! extern void cheatsAdd(const char *,const char *,u32,u32,int,int); extern void cheatsAddCheatCode(const char *code, const char *desc); extern void cheatsAddGSACode(const char *code, const char *desc, bool v3); --- 34,38 ---- }; ! extern void cheatsAdd(const char *,const char *,u32, u32,u32,int,int); extern void cheatsAddCheatCode(const char *code, const char *desc); extern void cheatsAddGSACode(const char *code, const char *desc, bool v3); *************** *** 46,52 **** extern void cheatsSaveCheatList(const char *file); extern bool cheatsLoadCheatList(const char *file); ! extern void cheatsWriteMemory(u32 *, u32, u32); ! extern void cheatsWriteHalfWord(u16 *, u16, u16); ! extern void cheatsWriteByte(u8 *, u8); extern int cheatsCheckKeys(u32,u32); extern int cheatsNumber; --- 47,53 ---- extern void cheatsSaveCheatList(const char *file); extern bool cheatsLoadCheatList(const char *file); ! extern void cheatsWriteMemory(u32, u32); ! extern void cheatsWriteHalfWord(u32, u16); ! extern void cheatsWriteByte(u32, u8); extern int cheatsCheckKeys(u32,u32); extern int cheatsNumber; Index: GBAinline.h =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/GBAinline.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** GBAinline.h 13 May 2004 15:06:44 -0000 1.10 --- GBAinline.h 18 Dec 2004 23:09:56 -0000 1.11 *************** *** 29,32 **** --- 29,35 ---- extern bool cpuEEPROMEnabled; extern bool cpuEEPROMSensorEnabled; + extern bool cpuDmaHack; + extern bool cpuDmaHack2; + extern u32 cpuDmaLast; #define CPUReadByteQuick(addr) \ *************** *** 117,122 **** } #endif ! ! // if(ioMem[0x205] & 0x40) { if(armState) { value = CPUReadMemoryQuick(reg[15].I); --- 120,127 ---- } #endif ! ! if(cpuDmaHack || cpuDmaHack2) { ! value = cpuDmaLast; ! } else { if(armState) { value = CPUReadMemoryQuick(reg[15].I); *************** *** 125,132 **** CPUReadHalfWordQuick(reg[15].I) << 16; } ! // } else { ! // value = *((u32 *)&bios[address & 0x3ffc]); ! // } ! // return 0xFFFFFFFF; } --- 130,134 ---- CPUReadHalfWordQuick(reg[15].I) << 16; } ! } } *************** *** 233,241 **** } #endif ! extern bool cpuDmaHack; ! extern u32 cpuDmaLast; ! extern int cpuDmaCount; ! if(cpuDmaHack && cpuDmaCount) { ! value = (u16)cpuDmaLast; } else { if(armState) { --- 235,240 ---- } #endif ! if(cpuDmaHack2 || cpuDmaHack) { ! value = cpuDmaLast & 0xFFFF; } else { if(armState) { *************** *** 245,252 **** } } - // return value; - // if(address & 1) - // value = (value >> 8) | ((value & 0xFF) << 24); - // return 0xFFFF; break; } --- 244,247 ---- *************** *** 326,341 **** unreadable: #ifdef DEV_VERSION ! if(systemVerbose & VERBOSE_ILLEGAL_READ) { ! log("Illegal byte read: %08x at %08x\n", address, armMode ? ! armNextPC - 4 : armNextPC - 2); ! } #endif ! ! if(armState) { ! return CPUReadByteQuick(reg[15].I+(address & 3)); } else { ! return CPUReadByteQuick(reg[15].I+(address & 1)); } - // return 0xFF; break; } --- 321,338 ---- unreadable: #ifdef DEV_VERSION ! if(systemVerbose & VERBOSE_ILLEGAL_READ) { ! log("Illegal byte read: %08x at %08x\n", address, armMode ? ! armNextPC - 4 : armNextPC - 2); ! } #endif ! if(cpuDmaHack || cpuDmaHack2) { ! return cpuDmaLast & 0xFF; } else { ! if(armState) { ! return CPUReadByteQuick(reg[15].I+(address & 3)); ! } else { ! return CPUReadByteQuick(reg[15].I+(address & 1)); ! } } break; } *************** *** 359,365 **** #ifdef SDL if(*((u32 *)&freezeWorkRAM[address & 0x3FFFC])) ! cheatsWriteMemory((u32 *)&workRAM[address & 0x3FFFC], ! value, ! *((u32 *)&freezeWorkRAM[address & 0x3FFFC])); else #endif --- 356,361 ---- #ifdef SDL if(*((u32 *)&freezeWorkRAM[address & 0x3FFFC])) ! cheatsWriteMemory(address & 0x203FFFC, ! value); else #endif *************** *** 369,375 **** #ifdef SDL if(*((u32 *)&freezeInternalRAM[address & 0x7ffc])) ! cheatsWriteMemory((u32 *)&internalRAM[address & 0x7FFC], ! value, ! *((u32 *)&freezeInternalRAM[address & 0x7ffc])); else #endif --- 365,370 ---- #ifdef SDL if(*((u32 *)&freezeInternalRAM[address & 0x7ffc])) ! cheatsWriteMemory(address & 0x3007FFC, ! value); else #endif *************** *** 377,382 **** break; case 0x04: ! CPUUpdateRegister((address & 0x3FC), value & 0xFFFF); ! CPUUpdateRegister((address & 0x3FC) + 2, (value >> 16)); break; case 0x05: --- 372,379 ---- break; case 0x04: ! if(address < 0x4000400) { ! CPUUpdateRegister((address & 0x3FC), value & 0xFFFF); ! CPUUpdateRegister((address & 0x3FC) + 2, (value >> 16)); ! } else goto unwritable; break; case 0x05: Index: Cheats.cpp =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/Cheats.cpp,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** Cheats.cpp 10 Nov 2004 22:14:56 -0000 1.24 --- Cheats.cpp 18 Dec 2004 23:09:56 -0000 1.25 *************** *** 30,52 **** /** ! * Gameshark code types: * * NNNNNNNN 001DC0DE - ID code for the game (game 4 character name) from ROM ! * DEADFACE XXXXXXXX - changes decryption seeds * 0AAAAAAA 000000YY - 8-bit constant write * 1AAAAAAA 0000YYYY - 16-bit constant write * 2AAAAAAA YYYYYYYY - 32-bit constant write ! * 3AAAAAAA YYYYYYYY - ?? [...1871 lines suppressed...] ! return; } #endif #endif ! } \ No newline at end of file --- 2758,2770 ---- #ifdef SDL if(cheatsNumber == 0) { ! int type = cheatsGetType(address); ! u8 oldValue = debuggerReadByte(address); ! if(type == 1 || (type == 2 && oldValue != value)) { ! debuggerBreakOnWrite(address, oldValue, value, 0, type); ! cpuNextEvent = 0; ! } ! debuggerWriteByte(address, value); } #endif #endif ! } Index: Sound.cpp =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/Sound.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** Sound.cpp 13 May 2004 15:06:44 -0000 1.14 --- Sound.cpp 18 Dec 2004 23:09:56 -0000 1.15 *************** *** 30,33 **** --- 30,34 ---- extern bool stopState; + extern bool cpuDmaHack2; u8 soundWavePattern[4][32] = { *************** *** 852,856 **** if(soundDSAEnabled) { if(soundDSFifoACount <= 16) { ! CPUCheckDMA(3, 2); if(soundDSFifoACount <= 16) { soundEvent(FIFOA_L, (u16)0); --- 853,857 ---- if(soundDSAEnabled) { if(soundDSFifoACount <= 16) { ! cpuDmaHack2 = CPUCheckDMA(3, 2); if(soundDSFifoACount <= 16) { soundEvent(FIFOA_L, (u16)0); *************** *** 881,885 **** if(soundDSBEnabled) { if(soundDSFifoBCount <= 16) { ! CPUCheckDMA(3, 4); if(soundDSFifoBCount <= 16) { soundEvent(FIFOB_L, (u16)0); --- 882,886 ---- if(soundDSBEnabled) { if(soundDSFifoBCount <= 16) { ! cpuDmaHack2 = CPUCheckDMA(3, 4); if(soundDSFifoBCount <= 16) { soundEvent(FIFOB_L, (u16)0); Index: GBA.cpp =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/GBA.cpp,v retrieving revision 1.58 retrieving revision 1.59 diff -C2 -d -r1.58 -r1.59 *** GBA.cpp 14 Nov 2004 18:54:14 -0000 1.58 --- GBA.cpp 18 Dec 2004 23:09:56 -0000 1.59 *************** *** 67,78 **** #endif - #define CPU_BREAK_LOOP \ - cpuSavedTicks = cpuSavedTicks - *extCpuLoopTicks;\ - *extCpuLoopTicks = *extClockTicks; - - #define CPU_BREAK_LOOP_2 \ - cpuSavedTicks = cpuSavedTicks - *extCpuLoopTicks;\ - *extCpuLoopTicks = *extClockTicks;\ - *extTicks = *extClockTicks; extern int emulating; --- 67,70 ---- *************** *** 80,90 **** int cpuDmaTicksToUpdate = 0; int cpuDmaCount = 0; ! bool cpuDmaHack = 0; u32 cpuDmaLast = 0; int dummyAddress = 0; ! int *extCpuLoopTicks = NULL; ! int *extClockTicks = NULL; ! int *extTicks = NULL; int gbaSaveType = 0; // used to remember the save type on reset --- 72,83 ---- int cpuDmaTicksToUpdate = 0; int cpuDmaCount = 0; ! bool cpuDmaHack = false; ! bool cpuDmaHack2 = false; u32 cpuDmaLast = 0; int dummyAddress = 0; ! bool cpuBreakLoop = true; ! int cpuNextEvent = 0; ! int cpuTotalTicks = 0; int gbaSaveType = 0; // used to remember the save type on reset *************** *** 108,113 **** static int profilScale = 0; #endif ! bool freezeWorkRAM[0x40000]; ! bool freezeInternalRAM[0x8000]; int lcdTicks = 960; bool timer0On = false; --- 101,106 ---- static int profilScale = 0; #endif ! u8 freezeWorkRAM[0x40000]; ! u8 freezeInternalRAM[0x8000]; int lcdTicks = 960; bool timer0On = false; *************** *** 341,345 **** 0xE3A01001, 0xE92D4010, - 0xE3A0C301, 0xE3A03000, 0xE3A04001, --- 334,337 ---- *************** *** 351,359 **** 0xE8BD4010, 0xE12FFF1E, 0xE5CC3208, 0xE15C20B8, 0xE0110002, ! 0x10200002, ! 0x114C00B8, 0xE5CC4208, 0xE12FFF1E, --- 343,352 ---- 0xE8BD4010, 0xE12FFF1E, + 0xE3A0C301, 0xE5CC3208, 0xE15C20B8, 0xE0110002, ! 0x10222000, ! 0x114C20B8, 0xE5CC4208, 0xE12FFF1E, *************** *** 508,513 **** }; - //int cpuLoopTicks = 0; - int cpuSavedTicks = 0; static int romSize = 0x2000000; --- 501,504 ---- *************** *** 557,561 **** cpuLoopTicks = soundTicks; ! if(timer0On && !(TM0CNT & 4) && (timer0Ticks < cpuLoopTicks)) { cpuLoopTicks = timer0Ticks; } --- 548,552 ---- cpuLoopTicks = soundTicks; ! if(timer0On && (timer0Ticks < cpuLoopTicks)) { cpuLoopTicks = timer0Ticks; } *************** *** 576,580 **** } #endif - cpuSavedTicks = cpuLoopTicks; return cpuLoopTicks; } --- 567,570 ---- *************** *** 838,841 **** --- 828,833 ---- THUMB_PREFETCH; } + + CPUUpdateRegister(0x204, CPUReadHalfWordQuick(0x4000204)); return true; *************** *** 1499,1503 **** if(breakLoop) { if(armIrqEnable && (IF & IE) && (IME & 1)) { ! CPU_BREAK_LOOP_2; } } --- 1491,1495 ---- if(breakLoop) { if(armIrqEnable && (IF & IE) && (IME & 1)) { ! cpuNextEvent = 0; } } *************** *** 1708,1712 **** if(comment == 0xf9) { emulating = 0; ! CPU_BREAK_LOOP_2; return; } --- 1700,1705 ---- if(comment == 0xf9) { emulating = 0; ! cpuNextEvent = 0; ! cpuBreakLoop = true; return; } *************** *** 1747,1750 **** --- 1740,1744 ---- holdState = true; holdType = -1; + cpuNextEvent = 0; break; case 0x03: *************** *** 1758,1761 **** --- 1752,1756 ---- holdType = -1; stopState = true; + cpuNextEvent = 0; break; case 0x04: *************** *** 1910,1914 **** } else { while(c != 0) { ! CPUWriteMemory(d, CPUReadMemory(s)); d += di; s += si; --- 1905,1910 ---- } else { while(c != 0) { ! cpuDmaLast = CPUReadMemory(s); ! CPUWriteMemory(d, cpuDmaLast); d += di; s += si; *************** *** 1930,1933 **** --- 1926,1930 ---- cpuDmaLast = CPUReadHalfWord(s); CPUWriteHalfWord(d, cpuDmaLast); + cpuDmaLast |= (cpuDmaLast<<16); d += di; s += si; *************** *** 1955,1969 **** cpuDmaTicksToUpdate += totalTicks; ! if(*extCpuLoopTicks >= 0) { ! CPU_BREAK_LOOP; ! } } ! void CPUCheckDMA(int reason, int dmamask) { cpuDmaHack = 0; // DMA 0 if((DM0CNT_H & 0x8000) && (dmamask & 1)) { if(((DM0CNT_H >> 12) & 3) == reason) { u32 sourceIncrement = 4; u32 destIncrement = 4; --- 1952,1966 ---- cpuDmaTicksToUpdate += totalTicks; ! cpuNextEvent = 0; } ! bool CPUCheckDMA(int reason, int dmamask) { + bool res = false; cpuDmaHack = 0; // DMA 0 if((DM0CNT_H & 0x8000) && (dmamask & 1)) { if(((DM0CNT_H >> 12) & 3) == reason) { + res = true; u32 sourceIncrement = 4; u32 destIncrement = 4; *************** *** 2001,2005 **** DM0CNT_L ? DM0CNT_L : 0x4000, DM0CNT_H & 0x0400); ! cpuDmaHack = 1; if(DM0CNT_H & 0x4000) { IF |= 0x0100; --- 1998,2002 ---- DM0CNT_L ? DM0CNT_L : 0x4000, DM0CNT_H & 0x0400); ! cpuDmaHack = true; if(DM0CNT_H & 0x4000) { IF |= 0x0100; *************** *** 2021,2024 **** --- 2018,2022 ---- if((DM1CNT_H & 0x8000) && (dmamask & 2)) { if(((DM1CNT_H >> 12) & 3) == reason) { + res = true; u32 sourceIncrement = 4; u32 destIncrement = 4; *************** *** 2068,2072 **** DM1CNT_H & 0x0400); } ! cpuDmaHack = 1; if(DM1CNT_H & 0x4000) { --- 2066,2070 ---- DM1CNT_H & 0x0400); } ! cpuDmaHack = true; if(DM1CNT_H & 0x4000) { *************** *** 2089,2092 **** --- 2087,2091 ---- if((DM2CNT_H & 0x8000) && (dmamask & 4)) { if(((DM2CNT_H >> 12) & 3) == reason) { + res = true; u32 sourceIncrement = 4; u32 destIncrement = 4; *************** *** 2137,2141 **** DM2CNT_H & 0x0400); } ! cpuDmaHack = 1; if(DM2CNT_H & 0x4000) { IF |= 0x0400; --- 2136,2140 ---- DM2CNT_H & 0x0400); } ! cpuDmaHack = true; if(DM2CNT_H & 0x4000) { IF |= 0x0400; *************** *** 2157,2160 **** --- 2156,2160 ---- if((DM3CNT_H & 0x8000) && (dmamask & 8)) { if(((DM3CNT_H >> 12) & 3) == reason) { + res = true; u32 sourceIncrement = 4; u32 destIncrement = 4; *************** *** 2207,2211 **** } } ! cpuDmaHack = 0; } --- 2207,2212 ---- } } ! cpuDmaHack = false; ! return res; } *************** *** 2595,2598 **** --- 2596,2602 ---- timer0Ticks = 0x10000 - TM0D; UPDATE_REG(0x100, TM0D); + int event = cpuTotalTicks + timer0Ticks; + if(event < cpuNextEvent) + cpuNextEvent = event; } timer0On = value & 0x80 ? true : false; *************** *** 2612,2615 **** --- 2616,2622 ---- timer1Ticks = 0x10000 - TM1D; UPDATE_REG(0x104, TM1D); + int event = cpuTotalTicks + timer1Ticks; + if(event < cpuNextEvent) + cpuNextEvent = event; } timer1On = value & 0x80 ? true : false; *************** *** 2628,2631 **** --- 2635,2641 ---- timer2Ticks = 0x10000 - TM2D; UPDATE_REG(0x108, TM2D); + int event = cpuTotalTicks + timer2Ticks; + if(event < cpuNextEvent) + cpuNextEvent = event; } timer2On = value & 0x80 ? true : false; *************** *** 2644,2647 **** --- 2654,2660 ---- timer3Ticks = 0x10000 - TM3D; UPDATE_REG(0x10C, TM3D); + int event = cpuTotalTicks + timer3Ticks; + if(event < cpuNextEvent) + cpuNextEvent = event; } timer3On = value & 0x80 ? true : false; *************** *** 2672,2676 **** UPDATE_REG(0x200, IE); if((IME & 1) && (IF & IE) && armIrqEnable) { ! CPU_BREAK_LOOP_2; } break; --- 2685,2689 ---- UPDATE_REG(0x200, IE); if((IME & 1) && (IF & IE) && armIrqEnable) { ! cpuNextEvent = 0; } break; *************** *** 2716,2720 **** if(value & 0x4000) { for(i = 8; i < 16; i++) { ! memoryWaitFetch32[i] = 2*cpuMemoryWait[i]; memoryWaitFetch[i] = cpuMemoryWait[i]; } --- 2729,2733 ---- if(value & 0x4000) { for(i = 8; i < 16; i++) { ! memoryWaitFetch32[i] = cpuMemoryWait32[i]; memoryWaitFetch[i] = cpuMemoryWait[i]; } *************** *** 2727,2731 **** UPDATE_REG(0x208, IME); if((IME & 1) && (IF & IE) && armIrqEnable) { ! CPU_BREAK_LOOP_2; } break; --- 2740,2744 ---- UPDATE_REG(0x208, IME); if((IME & 1) && (IF & IE) && armIrqEnable) { ! cpuNextEvent = 0; } break; *************** *** 2758,2764 **** #ifdef SDL if(*((u16 *)&freezeWorkRAM[address & 0x3FFFE])) ! cheatsWriteHalfWord((u16 *)&workRAM[address & 0x3FFFE], ! value, ! *((u16 *)&freezeWorkRAM[address & 0x3FFFE])); else #endif --- 2771,2776 ---- #ifdef SDL if(*((u16 *)&freezeWorkRAM[address & 0x3FFFE])) ! cheatsWriteHalfWord(address & 0x203FFFE, ! value); else #endif *************** *** 2768,2774 **** #ifdef SDL if(*((u16 *)&freezeInternalRAM[address & 0x7ffe])) ! cheatsWriteHalfWord((u16 *)&internalRAM[address & 0x7ffe], ! value, ! *((u16 *)&freezeInternalRAM[address & 0x7ffe])); else #endif --- 2780,2785 ---- #ifdef SDL if(*((u16 *)&freezeInternalRAM[address & 0x7ffe])) ! cheatsWriteHalfWord(address & 0x3007ffe, ! value); else #endif *************** *** 2776,2780 **** break; case 4: ! CPUUpdateRegister(address & 0x3fe, value); break; case 5: --- 2787,2793 ---- break; case 4: ! if(address < 0x4000400) ! CPUUpdateRegister(address & 0x3fe, value); ! else goto unwritable; break; case 5: *************** *** 2829,2833 **** #ifdef SDL if(freezeWorkRAM[address & 0x3FFFF]) ! cheatsWriteByte(&workRAM[address & 0x3FFFF], b); else #endif --- 2842,2846 ---- #ifdef SDL if(freezeWorkRAM[address & 0x3FFFF]) ! cheatsWriteByte(address & 0x203FFFF, b); else #endif *************** *** 2837,2841 **** #ifdef SDL if(freezeInternalRAM[address & 0x7fff]) ! cheatsWriteByte(&internalRAM[address & 0x7fff], b); else #endif --- 2850,2854 ---- #ifdef SDL if(freezeInternalRAM[address & 0x7fff]) ! cheatsWriteByte(address & 0x3007fff, b); else #endif *************** *** 2843,2908 **** break; case 4: ! switch(address & 0x3FF) { ! case 0x301: ! if(b == 0x80) ! stopState = true; ! holdState = 1; ! holdType = -1; ! break; ! case 0x60: ! case 0x61: ! case 0x62: ! case 0x63: ! case 0x64: ! case 0x65: ! case 0x68: ! case 0x69: ! case 0x6c: ! case 0x6d: ! case 0x70: ! case 0x71: ! case 0x72: ! case 0x73: ! case 0x74: ! case 0x75: ! case 0x78: ! case 0x79: ! case 0x7c: ! case 0x7d: ! case 0x80: ! case 0x81: ! case 0x84: ! case 0x85: ! case 0x90: ! case 0x91: ! case 0x92: ! case 0x93: ! case 0x94: ! case 0x95: ! case 0x96: ! case 0x97: ! case 0x98: ! case 0x99: ! case 0x9a: ! case 0x9b: ! case 0x9c: ! case 0x9d: ! case 0x9e: ! case 0x9f: ! soundEvent(address&0xFF, b); break; ! default: ! // if(address & 1) { ! // CPUWriteHalfWord(address-1, (CPUReadHalfWord(address-1)&0x00FF)|((int)b<<8)); ! // } else ! if(address & 1) ! CPUUpdateRegister(address & 0x3fe, ! ((READ16LE(((u16 *)&ioMem[address & 0x3fe]))) ! & 0x00FF) | ! b<<8); ! else ! CPUUpdateRegister(address & 0x3fe, ! ((READ16LE(((u16 *)&ioMem[address & 0x3fe])) & 0xFF00) | b)); ! } break; case 5: --- 2856,2922 ---- break; case 4: ! if(address < 0x4000400) { ! switch(address & 0x3FF) { ! case 0x301: ! if(b == 0x80) ! stopState = true; ! holdState = 1; ! holdType = -1; ! cpuNextEvent = 0; ! break; ! case 0x60: ! case 0x61: ! case 0x62: ! case 0x63: ! case 0x64: ! case 0x65: ! case 0x68: ! case 0x69: ! case 0x6c: ! case 0x6d: ! case 0x70: ! case 0x71: ! case 0x72: ! case 0x73: ! case 0x74: ! case 0x75: ! case 0x78: ! case 0x79: ! case 0x7c: ! case 0x7d: ! case 0x80: ! case 0x81: ! case 0x84: ! case 0x85: ! case 0x90: ! case 0x91: ! case 0x92: ! case 0x93: ! case 0x94: ! case 0x95: ! case 0x96: ! case 0x97: ! case 0x98: ! case 0x99: ! case 0x9a: ! case 0x9b: ! case 0x9c: ! case 0x9d: ! case 0x9e: ! case 0x9f: ! soundEvent(address&0xFF, b); ! break; ! default: ! if(address & 1) ! CPUUpdateRegister(address & 0x3fe, ! ((READ16LE(((u16 *)&ioMem[address & 0x3fe]))) ! & 0x00FF) | ! b<<8); ! else ! CPUUpdateRegister(address & 0x3fe, ! ((READ16LE(((u16 *)&ioMem[address & 0x3fe])) & 0xFF00) | b)); ! } break; ! } else goto unwritable; break; case 5: *************** *** 2911,2923 **** break; case 6: ! // no need to switch ! if(address & 0x10000) ! *((u16 *)&vram[address & 0x17FFE]) = (b << 8) | b; ! else ! *((u16 *)&vram[address & 0x1FFFE]) = (b << 8) | b; break; case 7: // no need to switch ! *((u16 *)&oam[address & 0x3FE]) = (b << 8) | b; break; case 13: --- 2925,2939 ---- break; case 6: ! // no need to switch ! // byte writes to OBJ VRAM are ignored ! if(!(address & 0x10000)) ! // *((u16 *)&vram[address & 0x17FFE]) = (b << 8) | b; ! // else ! *((u16 *)&vram[address & 0xFFFE]) = (b << 8) | b; break; case 7: // no need to switch ! // byte writes to OAM are ignored ! // *((u16 *)&oam[address & 0x3FE]) = (b << 8) | b; break; case 13: *************** *** 3334,3337 **** --- 3350,3355 ---- systemSaveUpdateCounter = SYSTEM_SAVE_NOT_UPDATED; + + cpuDmaHack2 = false; lastTime = systemGetClock(); *************** *** 3385,3407 **** { int clockTicks; ! int cpuLoopTicks = 0; int timerOverflow = 0; // variables used by the CPU core ! ! extCpuLoopTicks = &cpuLoopTicks; ! extClockTicks = &clockTicks; ! extTicks = &ticks; ! ! cpuLoopTicks = CPUUpdateTicks(); ! if(cpuLoopTicks > ticks) { ! cpuLoopTicks = ticks; ! cpuSavedTicks = ticks; } if(intState) { ! cpuLoopTicks = 5; ! cpuSavedTicks = 5; } ! for(;;) { #ifndef FINAL_VERSION --- 3403,3420 ---- { int clockTicks; ! int totalTicks = 0; int timerOverflow = 0; // variables used by the CPU core ! cpuNextEvent = CPUUpdateTicks(); ! if(cpuNextEvent > ticks) { ! cpuNextEvent = ticks; } if(intState) { ! cpuNextEvent = 5; } ! if(cpuDmaHack2) ! cpuNextEvent = 1; ! cpuBreakLoop = false; for(;;) { #ifndef FINAL_VERSION *************** *** 3445,3455 **** clockTicks = timer0Ticks; } ! if(timer1On && (timer1Ticks < clockTicks)) { clockTicks = timer1Ticks; } ! if(timer2On && (timer2Ticks < clockTicks)) { clockTicks = timer2Ticks; } ! if(timer3On && (timer3Ticks < clockTicks)) { clockTicks = timer3Ticks; } --- 3458,3468 ---- clockTicks = timer0Ticks; } ! if(timer1On && !(TM1CNT & 4) && (timer1Ticks < clockTicks)) { clockTicks = timer1Ticks; } ! if(timer2On && !(TM2CNT & 4) && (timer2Ticks < clockTicks)) { clockTicks = timer2Ticks; } ! if(timer3On && !(TM3CNT & 4) && (timer3Ticks < clockTicks)) { clockTicks = timer3Ticks; } *************** *** 3461,3472 **** } #endif } ! ! cpuLoopTicks -= clockTicks; ! if((cpuLoopTicks <= 0)) { ! if(cpuSavedTicks) { ! clockTicks = cpuSavedTicks;// + cpuLoopTicks; ! } ! cpuDmaTicksToUpdate = -cpuLoopTicks; updateLoop: --- 3474,3489 ---- } #endif + // if((clockTicks+totalTicks) > cpuNextEvent) { + // clockTicks = cpuNextEvent - totalTicks; + // } } ! totalTicks += clockTicks; ! cpuTotalTicks = totalTicks; ! if(totalTicks >= cpuNextEvent) { ! cpuDmaHack2 = false; ! int remainingTicks = totalTicks - cpuNextEvent; ! clockTicks = cpuNextEvent; ! int oldTotalTicks = totalTicks; ! cpuTotalTicks = totalTicks = 0; updateLoop: *************** *** 3558,3565 **** u32 ext = (joy >> 10); - int cheatTicks = 0; if(cheatsEnabled) ! cheatsCheckKeys(P1^0x3FF, ext); ! cpuDmaTicksToUpdate += cheatTicks; speedup = (ext & 1) ? true : false; capture = (ext & 2) ? true : false; --- 3575,3580 ---- u32 ext = (joy >> 10); if(cheatsEnabled) ! remainingTicks += cheatsCheckKeys(P1^0x3FF, ext); speedup = (ext & 1) ? true : false; capture = (ext & 2) ? true : false; *************** *** 3578,3582 **** UPDATE_REG(0x202, IF); } ! CPUCheckDMA(1, 0x0f); if(frameCount >= framesToSkip) { systemDrawScreen(); --- 3593,3597 ---- UPDATE_REG(0x202, IF); } ! cpuDmaHack2 = CPUCheckDMA(1, 0x0f); if(frameCount >= framesToSkip) { systemDrawScreen(); *************** *** 3698,3702 **** UPDATE_REG(0x04, DISPSTAT); lcdTicks += 272; ! CPUCheckDMA(2, 0x0f); if(DISPSTAT & 16) { IF |= 2; --- 3713,3717 ---- UPDATE_REG(0x04, DISPSTAT); lcdTicks += 272; ! cpuDmaHack2 = CPUCheckDMA(2, 0x0f); if(DISPSTAT & 16) { IF |= 2; *************** *** 3721,3724 **** --- 3736,3741 ---- } TM0D = tm0d; + if(TM0D < timer0Reload) + TM0D = timer0Reload; timer0Ticks = 0x10000 - TM0D; UPDATE_REG(0x100, TM0D); *************** *** 3770,3773 **** --- 3787,3792 ---- } TM1D = tm1d; + if(TM1D < timer1Reload) + TM1D = timer1Reload; timer1Ticks = 0x10000 - TM1D; UPDATE_REG(0x104, TM1D); *************** *** 3819,3822 **** --- 3838,3843 ---- } TM2D = tm2d; + if(TM2D < timer2Reload) + TM2D = timer2Reload; timer2Ticks = 0x10000 - TM2D; UPDATE_REG(0x108, TM2D); *************** *** 3865,3868 **** --- 3886,3891 ---- } TM3D = tm3d; + if(TM3D < timer3Reload) + TM3D = timer3Reload; timer3Ticks = 0x10000 - TM3D; UPDATE_REG(0x10C, TM3D); *************** *** 3912,3926 **** ticks -= clockTicks; ! cpuLoopTicks = CPUUpdateTicks(); if(cpuDmaTicksToUpdate > 0) { ! clockTicks = cpuSavedTicks; ! if(clockTicks > cpuDmaTicksToUpdate) ! clockTicks = cpuDmaTicksToUpdate; ! cpuDmaTicksToUpdate -= clockTicks; if(cpuDmaTicksToUpdate < 0) cpuDmaTicksToUpdate = 0; goto updateLoop; } if(IF && (IME & 1) && armIrqEnable) { --- 3935,3952 ---- ticks -= clockTicks; ! cpuNextEvent = CPUUpdateTicks(); if(cpuDmaTicksToUpdate > 0) { ! if(cpuDmaTicksToUpdate < cpuNextEvent) ! cpuNextEvent = cpuDmaTicksToUpdate; ! cpuDmaTicksToUpdate -= cpuNextEvent; ! clockTicks = cpuNextEvent; if(cpuDmaTicksToUpdate < 0) cpuDmaTicksToUpdate = 0; goto updateLoop; } + + if(cpuDmaHack2) + cpuNextEvent = 1; if(IF && (IME & 1) && armIrqEnable) { *************** *** 3939,3944 **** if(!holdState) { intState = true; ! cpuLoopTicks = 5; ! cpuSavedTicks = 5; } else { CPUInterrupt(); --- 3965,3969 ---- if(!holdState) { intState = true; ! cpuNextEvent = 5; } else { CPUInterrupt(); *************** *** 3952,3956 **** } ! if(ticks <= 0) break; } --- 3977,3991 ---- } ! if(remainingTicks > 0) { ! if(remainingTicks < cpuNextEvent) ! cpuNextEvent = remainingTicks; ! remainingTicks -= cpuNextEvent; ! clockTicks = cpuNextEvent; ! if(remainingTicks < 0) ! remainingTicks = 0; ! goto updateLoop; ! } ! ! if(ticks <= 0 || cpuBreakLoop) break; } Index: GBA.h =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/GBA.h,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** GBA.h 13 May 2004 15:06:43 -0000 1.19 --- GBA.h 18 Dec 2004 23:09:56 -0000 1.20 *************** *** 84,89 **** extern void (*cpuSaveGameFunc)(u32,u8); ! extern bool freezeWorkRAM[0x40000]; ! extern bool freezeInternalRAM[0x8000]; extern bool CPUReadGSASnapshot(const char *); extern bool CPUWriteGSASnapshot(const char *, const char *, const char *, const char *); --- 84,89 ---- extern void (*cpuSaveGameFunc)(u32,u8); ! extern u8 freezeWorkRAM[0x40000]; ! extern u8 freezeInternalRAM[0x8000]; extern bool CPUReadGSASnapshot(const char *); extern bool CPUWriteGSASnapshot(const char *, const char *, const char *, const char *); *************** *** 107,111 **** extern void CPUReset(); extern void CPULoop(int); ! extern void CPUCheckDMA(int,int); extern bool CPUIsGBAImage(const char *); extern bool CPUIsZipFile(const char *); --- 107,111 ---- extern void CPUReset(); extern void CPULoop(int); ! extern bool CPUCheckDMA(int,int); extern bool CPUIsGBAImage(const char *); extern bool CPUIsZipFile(const char *); Index: AutoBuild.h =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/AutoBuild.h,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** AutoBuild.h 15 May 2004 21:38:18 -0000 1.15 --- AutoBuild.h 18 Dec 2004 23:09:56 -0000 1.16 *************** *** 21,31 **** #define __AUTOBUILD_H__ #ifndef VERSION ! #define VERSION "1.7.2" #endif //change the FALSE to TRUE for autoincrement of build number #define INCREMENT_VERSION FALSE ! #define FILEVER 1,7,2,560 ! #define PRODUCTVER 1,7,2,560 ! #define STRFILEVER "1, 7, 2, 560\0" ! #define STRPRODUCTVER "1, 7, 2, 560\0" #endif //__AUTOBUILD_H__ --- 21,31 ---- #define __AUTOBUILD_H__ #ifndef VERSION ! #define VERSION "1.8.0" #endif //change the FALSE to TRUE for autoincrement of build number #define INCREMENT_VERSION FALSE ! #define FILEVER 1,8,0,600 ! #define PRODUCTVER 1,8,0,600 ! #define STRFILEVER "1, 8, 0, 600\0" ! #define STRPRODUCTVER "1, 8, 0, 600\0" #endif //__AUTOBUILD_H__ Index: hq2x.cpp =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/hq2x.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** hq2x.cpp 20 Jan 2004 22:02:03 -0000 1.2 --- hq2x.cpp 18 Dec 2004 23:09:56 -0000 1.3 *************** *** 560,564 **** dst0 += dstPitch; dst1 += dstPitch; ! hq2x_16_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; --- 560,564 ---- dst0 += dstPitch; dst1 += dstPitch; ! lq2x_16_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; *************** *** 588,592 **** dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; ! hq2x_32_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; --- 588,592 ---- dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; ! lq2x_32_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; |