diff --git a/AppleWin/source/Applewin.cpp b/AppleWin/source/Applewin.cpp index 0ecca7c9..f7fb97f2 100644 --- a/AppleWin/source/Applewin.cpp +++ b/AppleWin/source/Applewin.cpp @@ -194,7 +194,6 @@ void ContinueExecution() nCyclesToExecute = 0; DWORD dwExecutedCycles = CpuExecute(nCyclesToExecute); - g_dwCyclesThisFrame += dwExecutedCycles; // @@ -203,7 +202,6 @@ void ContinueExecution() DiskUpdatePosition(dwExecutedCycles); JoyUpdatePosition(); - VideoUpdateVbl(g_dwCyclesThisFrame); SpkrUpdate(cyclenum); sg_SSC.CommUpdate(cyclenum); diff --git a/AppleWin/source/CPU.cpp b/AppleWin/source/CPU.cpp index 48c2272e..3cd2d1a1 100644 --- a/AppleWin/source/CPU.cpp +++ b/AppleWin/source/CPU.cpp @@ -119,8 +119,7 @@ static BYTE benchopcode[BENCHOPCODES] = {0x06,0x16,0x24,0x45,0x48,0x65,0x68,0x76 regsrec regs; unsigned __int64 g_nCumulativeCycles = 0; -static ULONG g_nCyclesSubmitted; // Number of cycles submitted to CpuExecute() -static ULONG g_nCyclesExecuted; +static ULONG g_nCyclesExecuted; // # of cycles executed up to last IO access //static signed long g_uInternalExecutedCycles; // TODO: Use IRQ_CHECK_TIMEOUT=128 when running at full-speed else with IRQ_CHECK_TIMEOUT=1 @@ -405,20 +404,23 @@ void CpuDestroy () } //=========================================================================== -// Pre: + +// Description: // Call this when an IO-reg is access & accurate cycle info is needed +// Pre: +// nExecutedCycles = # of cycles executed by Cpu6502() or Cpu65C02() for this iteration of ContinueExecution() // Post: // g_nCyclesExecuted // g_nCumulativeCycles // -void CpuCalcCycles(ULONG nExecutedCycles) +void CpuCalcCycles(const ULONG nExecutedCycles) { // Calc # of cycles executed since this func was last called - ULONG nCycles = nExecutedCycles - g_nCyclesExecuted; + const ULONG nCycles = nExecutedCycles - g_nCyclesExecuted; _ASSERT( (LONG)nCycles >= 0 ); - - g_nCyclesExecuted += nCycles; g_nCumulativeCycles += nCycles; + + g_nCyclesExecuted = nExecutedCycles; } //=========================================================================== @@ -431,13 +433,13 @@ void CpuCalcCycles(ULONG nExecutedCycles) // - 137.9,135.6MHz (with check for VBL IRQ & MB_Update every 128 cycles) #if 0 // TODO: Measure perf increase by using this new method -ULONG CpuGetCyclesThisFrame(ULONG) // Old func using g_uInternalExecutedCycles +ULONG CpuGetCyclesThisVideoFrame(ULONG) // Old func using g_uInternalExecutedCycles { CpuCalcCycles(g_uInternalExecutedCycles); return g_dwCyclesThisFrame + g_nCyclesExecuted; } #else -ULONG CpuGetCyclesThisFrame(ULONG nExecutedCycles) +ULONG CpuGetCyclesThisVideoFrame(const ULONG nExecutedCycles) { CpuCalcCycles(nExecutedCycles); return g_dwCyclesThisFrame + g_nCyclesExecuted; @@ -446,27 +448,22 @@ ULONG CpuGetCyclesThisFrame(ULONG nExecutedCycles) //=========================================================================== -DWORD CpuExecute (DWORD uCycles) +DWORD CpuExecute(const DWORD uCycles) { - DWORD uExecutedCycles = 0; - - g_nCyclesSubmitted = uCycles; g_nCyclesExecuted = 0; - // - MB_StartOfCpuExecute(); - if (uCycles == 0) // Do single step - uExecutedCycles = InternalCpuExecute(0); - else // Do multi-opcode emulation - uExecutedCycles = InternalCpuExecute(uCycles); + // uCycles: + // =0 : Do single step + // >0 : Do multi-opcode emulation + const DWORD uExecutedCycles = InternalCpuExecute(uCycles); MB_UpdateCycles(uExecutedCycles); // Update 6522s (NB. Do this before updating g_nCumulativeCycles below) // - UINT nRemainingCycles = uExecutedCycles - g_nCyclesExecuted; + const UINT nRemainingCycles = uExecutedCycles - g_nCyclesExecuted; g_nCumulativeCycles += nRemainingCycles; return uExecutedCycles; diff --git a/AppleWin/source/CPU.h b/AppleWin/source/CPU.h index 5ca395bd..2e21591b 100644 --- a/AppleWin/source/CPU.h +++ b/AppleWin/source/CPU.h @@ -16,7 +16,7 @@ extern unsigned __int64 g_nCumulativeCycles; void CpuDestroy (); void CpuCalcCycles(ULONG nExecutedCycles); DWORD CpuExecute (DWORD); -ULONG CpuGetCyclesThisFrame(ULONG nExecutedCycles); +ULONG CpuGetCyclesThisVideoFrame(ULONG nExecutedCycles); void CpuInitialize (); void CpuSetupBenchmark (); void CpuIrqReset(); diff --git a/AppleWin/source/Debugger/Debug.cpp b/AppleWin/source/Debugger/Debug.cpp index 1c47103c..c863d4eb 100644 --- a/AppleWin/source/Debugger/Debug.cpp +++ b/AppleWin/source/Debugger/Debug.cpp @@ -7256,10 +7256,9 @@ Update_t ExecuteCommand (int nArgs) //=========================================================================== + bool InternalSingleStep () { - static DWORD dwCyclesThisFrame = 0; - bool bResult = false; _try { @@ -7269,14 +7268,16 @@ bool InternalSingleStep () g_aProfileOpcodes[ nOpcode ].m_nCount++; g_aProfileOpmodes[ nOpmode ].m_nCount++; - DWORD dwExecutedCycles = CpuExecute(g_nDebugStepCycles); - dwCyclesThisFrame += dwExecutedCycles; - - if (dwCyclesThisFrame >= dwClksPerFrame) + // Like ContinueExecution() { - dwCyclesThisFrame -= dwClksPerFrame; + DWORD dwExecutedCycles = CpuExecute(g_nDebugStepCycles); + g_dwCyclesThisFrame += dwExecutedCycles; + + if (g_dwCyclesThisFrame >= dwClksPerFrame) + { + g_dwCyclesThisFrame -= dwClksPerFrame; + } } - VideoUpdateVbl( dwCyclesThisFrame ); bResult = true; } diff --git a/AppleWin/source/Keyboard.cpp b/AppleWin/source/Keyboard.cpp index 715a50af..eaa24f6c 100644 --- a/AppleWin/source/Keyboard.cpp +++ b/AppleWin/source/Keyboard.cpp @@ -245,7 +245,7 @@ void KeybQueueKeypress (int key, BOOL bASCII) if (key == ']') keycode = '}'; if (key == '`') keycode = '~'; if (key == 92) keycode = 96; - if (GetCapsLockAllowed ()== true) + if (GetCapsLockAllowed() == true) { if ((key == 92) || (key == 124)) keycode = 96; //Ý to Þ //This shall be rewriten, so that enabling CAPS_LOCK (i.e. F10) will not invert these keys values) diff --git a/AppleWin/source/Memory.cpp b/AppleWin/source/Memory.cpp index 936256a3..41cac526 100644 --- a/AppleWin/source/Memory.cpp +++ b/AppleWin/source/Memory.cpp @@ -211,7 +211,7 @@ static BYTE __stdcall IORead_C02x(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG static BYTE __stdcall IOWrite_C02x(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft) { - return IO_Null(pc, addr, bWrite, d, nCyclesLeft); + return IO_Null(pc, addr, bWrite, d, nCyclesLeft); // $C020 TAPEOUT } //------------------------------------- @@ -302,7 +302,7 @@ static BYTE __stdcall IORead_C06x(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG //If (CAPS lOCK of Pravets8A/C is on or Shift is pressed) and (MODE is enabled), bit7 in $C000 is 1; Else it is 0 //Writing into $C060 sets MODE on and off. If bit 0 is 0 the the MODE is set 0, if bit 0 is 1 then MODE is set to 1 (8-bit) - case 0x0: return TapeRead(pc, addr, bWrite, d, nCyclesLeft); + case 0x0: return TapeRead(pc, addr, bWrite, d, nCyclesLeft); // $C060 TAPEIN case 0x1: return JoyReadButton(pc, addr, bWrite, d, nCyclesLeft); //$C061 Digital input 0 (If bit 7=1 then JoyButton 0 or OpenApple is pressed) case 0x2: return JoyReadButton(pc, addr, bWrite, d, nCyclesLeft); //$C062 Digital input 1 (If bit 7=1 then JoyButton 1 or ClosedApple is pressed) case 0x3: return JoyReadButton(pc, addr, bWrite, d, nCyclesLeft); //$C063 Digital input 2 diff --git a/AppleWin/source/PropertySheetPage.cpp b/AppleWin/source/PropertySheetPage.cpp index e658fab5..59738206 100644 --- a/AppleWin/source/PropertySheetPage.cpp +++ b/AppleWin/source/PropertySheetPage.cpp @@ -280,6 +280,9 @@ void Config_Load_Video() REGLOAD(TEXT(REGVALUE_VIDEO_MODE ),&g_eVideoType); REGLOAD(TEXT(REGVALUE_VIDEO_HALF_SCAN_LINES),&g_uHalfScanLines); REGLOAD(TEXT(REGVALUE_VIDEO_MONO_COLOR ),&monochrome); + + if (g_eVideoType >= NUM_VIDEO_MODES) + g_eVideoType = VT_COLOR_TVEMU; } diff --git a/AppleWin/source/Tape.cpp b/AppleWin/source/Tape.cpp index bbdd1920..1df06bc3 100644 --- a/AppleWin/source/Tape.cpp +++ b/AppleWin/source/Tape.cpp @@ -30,46 +30,49 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "StdAfx.h" - -static BYTE C060 = 255; -static bool CapsLockAllowed = false; +static bool g_CapsLockAllowed = false; //--------------------------------------------------------------------------- - -BYTE __stdcall TapeRead (WORD, WORD address, BYTE, BYTE, ULONG nCyclesLeft) +BYTE __stdcall TapeRead(WORD, WORD address, BYTE, BYTE, ULONG nCyclesLeft) { /* - If retrieving KeybGetKeycode(); causes problems CurrentKestroke shall be added + If retrieving KeybGetKeycode(); causes problems uCurrentKeystroke shall be added in the submission variables and it shall be added by the TapeRead caller i.e. BYTE __stdcall TapeRead (WORD, WORD address, BYTE, BYTE, ULONG nCyclesLeft) shall become - BYTE __stdcall TapeRead (WORD, WORD address, BYTE, BYTE, ULONG nCyclesLeft, byte CurrentKeystroke) + BYTE __stdcall TapeRead (WORD, WORD address, BYTE, BYTE, ULONG nCyclesLeft, BYTE uCurrentKeystroke) */ - static byte CurrentKestroke = 0; - CurrentKestroke = KeybGetKeycode(); - if (g_Apple2Type == A2TYPE_PRAVETS8A ) + if (g_Apple2Type == A2TYPE_PRAVETS8A) { - C060= MemReadFloatingBus(nCyclesLeft); //IO_Null(pc, addr, bWrite, d, nCyclesLeft); - if (CapsLockAllowed) //8bit keyboard mode + const BYTE uCurrentKeystroke = KeybGetKeycode(); + BYTE C060 = MemReadFloatingBus(nCyclesLeft); + + if (g_CapsLockAllowed) //8bit keyboard mode { if (((P8CAPS_ON == false) && (P8Shift == false)) || ((P8CAPS_ON ) && (P8Shift ))) //LowerCase - if ((CurrentKestroke<65) //|| ((CurrentKestroke>90) && (CurrentKestroke<96)) - || ((CurrentKestroke>126) && (CurrentKestroke<193))) + { + if ((uCurrentKeystroke<65) //|| ((uCurrentKeystroke>90) && (uCurrentKeystroke<96)) + || ((uCurrentKeystroke>126) && (uCurrentKeystroke<193))) C060 |= 1 << 7; //Sets bit 7 to 1 for special keys (arrows, return, etc) and for control+ key combinations. else C060 &= 127; //sets bit 7 to 0 + } else //UpperCase + { C060 |= 1 << 7; + } } else //7bit keyboard mode { C060 &= 191; //Sets bit 6 to 0; I am not sure if this shall be done, because its value is disregarded in this case. C060 |= 1 << 7; //Sets bit 7 to 1 - } + } + return C060; } - else return MemReadFloatingBus(nCyclesLeft); //IO_Null(pc, addr, bWrite, d, nCyclesLeft); + + return (1<<7) | (MemReadFloatingBus(nCyclesLeft) & 0x7F); // Keep high-bit fixed (since TAPEIN isn't supported) } /* @@ -80,20 +83,20 @@ BYTE __stdcall TapeWrite(WORD programcounter, WORD address, BYTE write, BYTE val { if (g_Apple2Type == A2TYPE_PRAVETS8A) { - if (value & 1) - CapsLockAllowed = true; - else - CapsLockAllowed = false; - //If bit0 of the input byte is 0, it will forbid 8-bit characters (Default) - //If bit0 of the input byte is 1, it will allow 8-bit characters - return 0; + if (value & 1) + g_CapsLockAllowed = true; + else + g_CapsLockAllowed = false; + + //If bit0 of the input byte is 0, it will forbid 8-bit characters (Default) + //If bit0 of the input byte is 1, it will allow 8-bit characters + return 0; } - else - { + return MemReadFloatingBus(nCyclesLeft); - } } -bool __stdcall GetCapsLockAllowed () + +bool GetCapsLockAllowed(void) { - return CapsLockAllowed; + return g_CapsLockAllowed; } diff --git a/AppleWin/source/Tape.h b/AppleWin/source/Tape.h index 8104c318..b787baec 100644 --- a/AppleWin/source/Tape.h +++ b/AppleWin/source/Tape.h @@ -1,5 +1,5 @@ #pragma once -extern BYTE __stdcall TapeRead (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft); -extern BYTE __stdcall TapeWrite (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft); -extern bool __stdcall GetCapsLockAllowed (); +extern BYTE __stdcall TapeRead(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft); +extern BYTE __stdcall TapeWrite(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft); +extern bool GetCapsLockAllowed(void); diff --git a/AppleWin/source/Video.cpp b/AppleWin/source/Video.cpp index 3f9d11e2..646881c7 100644 --- a/AppleWin/source/Video.cpp +++ b/AppleWin/source/Video.cpp @@ -234,7 +234,6 @@ static BOOL hasrefreshed = 0; static DWORD lastpageflip = 0; COLORREF monochrome = RGB(0xC0,0xC0,0xC0); static BOOL rebuiltsource = 0; -static DWORD dwVBlCounter = 0; static LPBYTE vidlastmem = NULL; static DWORD vidmode = VF_TEXT; @@ -1725,7 +1724,6 @@ void VideoBenchmark () { cycles -= executedcycles; DiskUpdatePosition(executedcycles); JoyUpdatePosition(); - VideoUpdateVbl(0); } } if (cycle & 1) @@ -1759,11 +1757,11 @@ void VideoBenchmark () { } //=========================================================================== -BYTE __stdcall VideoCheckMode (WORD, WORD address, BYTE, BYTE, ULONG nCyclesLeft) +BYTE __stdcall VideoCheckMode (WORD, WORD address, BYTE, BYTE, ULONG uExecutedCycles) { address &= 0xFF; if (address == 0x7F) - return MemReadFloatingBus(SW_DHIRES != 0, nCyclesLeft); + return MemReadFloatingBus(SW_DHIRES != 0, uExecutedCycles); else { BOOL result = 0; switch (address) { @@ -1790,52 +1788,61 @@ void VideoCheckPage (BOOL force) { } //=========================================================================== -BYTE __stdcall VideoCheckVbl (WORD, WORD, BYTE, BYTE, ULONG nCyclesLeft) + +/* + // Drol expects = 80 + 68DE A5 02 LDX #02 + 68E0 AD 50 C0 LDA TXTCLR + 68E3 C9 80 CMP #80 + 68E5 D0 F7 BNE $68DE + + 6957 A5 02 LDX #02 + 6959 AD 50 C0 LDA TXTCLR + 695C C9 80 CMP #80 + 695E D0 F7 BNE $68DE + + 69D3 A5 02 LDX #02 + 69D5 AD 50 C0 LDA TXTCLR + 69D8 C9 80 CMP #80 + 69DA D0 F7 BNE $68DE + + // Karateka expects < 80 + 07DE AD 19 C0 LDA RDVBLBAR + 07E1 30 FB BMI $7DE + + 77A1 AD 19 C0 LDA RDVBLBAR + 77A4 30 FB BMI $7DE + + // Gumball expects non-zero low-nibble on VBL + BBB5 A5 60 LDA $60 + BBB7 4D 50 C0 EOR TXTCLR + BBBA 85 60 STA $60 + BBBC 29 0F AND #$0F + BBBE F0 F5 BEQ $BBB5 + BBC0 C9 0F CMP #$0F + BBC2 F0 F1 BEQ $BBB5 + + // Diversi-Dial (DD4.DSK or DIAL.DSK) + F822 LDA RDVBLBAR + F825 EOR #$3C + BMI $F82A + RTS + F82A LDA $F825+1 + EOR #$80 + STA $F825+1 + BMI $F86A + ... + F86A RTS + +*/ + +BYTE __stdcall VideoCheckVbl (WORD, WORD, BYTE, BYTE, ULONG uExecutedCycles) { - /* - // Drol expects = 80 - 68DE A5 02 LDX #02 - 68E0 AD 50 C0 LDA TXTCLR - 68E3 C9 80 CMP #80 - 68E5 D0 F7 BNE $68DE + bool bVblBar = false; + VideoGetScannerAddress(&bVblBar, uExecutedCycles); - 6957 A5 02 LDX #02 - 6959 AD 50 C0 LDA TXTCLR - 695C C9 80 CMP #80 - 695E D0 F7 BNE $68DE - - 69D3 A5 02 LDX #02 - 69D5 AD 50 C0 LDA TXTCLR - 69D8 C9 80 CMP #80 - 69DA D0 F7 BNE $68DE - - // Karateka expects < 80 - 07DE AD 19 C0 LDA RDVBLBAR - 07E1 30 FB BMI $7DE - - 77A1 AD 19 C0 LDA RDVBLBAR - 77A4 30 FB BMI $7DE - - // Gumball expects non-zero low-nibble on VBL - BBB5 A5 60 LDA $60 - BBB7 4D 50 C0 EOR TXTCLR - BBBA 85 60 STA $60 - BBBC 29 0F AND #$0F - BBBE F0 F5 BEQ $BBB5 - BBC0 C9 0F CMP #$0F - BBC2 F0 F1 BEQ $BBB5 - -// return MemReturnRandomData(dwVBlCounter <= nVBlStop_NTSC); - if (dwVBlCounter <= nVBlStop_NTSC) - return (BYTE)(dwVBlCounter & 0x7F); // 0x00; - else - return 0x80 | ((BYTE)(dwVBlCounter & 1)); - */ - - bool bVblBar; - VideoGetScannerAddress(&bVblBar, nCyclesLeft); - BYTE r = KeybGetKeycode(); - return (r & ~0x80) | ((bVblBar) ? 0x80 : 0); + BYTE r = KeybGetKeycode(); + return (r & ~0x80) | ((bVblBar) ? 0x80 : 0); } //=========================================================================== @@ -2319,7 +2326,7 @@ void VideoResetState () { } //=========================================================================== -BYTE __stdcall VideoSetMode (WORD, WORD address, BYTE write, BYTE, ULONG nCyclesLeft) +BYTE __stdcall VideoSetMode (WORD, WORD address, BYTE write, BYTE, ULONG uExecutedCycles) { address &= 0xFF; DWORD oldpage2 = SW_PAGE2; @@ -2374,14 +2381,7 @@ BYTE __stdcall VideoSetMode (WORD, WORD address, BYTE write, BYTE, ULONG nCycles } lastpageflip = emulmsec; } - return MemReadFloatingBus(nCyclesLeft); -} - -//=========================================================================== - -void VideoUpdateVbl (DWORD dwCyclesThisFrame) -{ - dwVBlCounter = (DWORD) ((double)dwCyclesThisFrame / (double)uCyclesPerLine); + return MemReadFloatingBus(uExecutedCycles); } //=========================================================================== @@ -2447,7 +2447,7 @@ WORD VideoGetScannerAddress(bool* pbVblBar_OUT, const DWORD uExecutedCycles) { // get video scanner position // - int nCycles = CpuGetCyclesThisFrame(uExecutedCycles); + int nCycles = CpuGetCyclesThisVideoFrame(uExecutedCycles); // machine state switches // @@ -2560,7 +2560,7 @@ bool VideoGetVbl(const DWORD uExecutedCycles) { // get video scanner position // - int nCycles = CpuGetCyclesThisFrame(uExecutedCycles); + int nCycles = CpuGetCyclesThisVideoFrame(uExecutedCycles); // calculate video parameters according to display standard // @@ -2589,6 +2589,8 @@ bool VideoGetVbl(const DWORD uExecutedCycles) } } +//=========================================================================== + #define SCREENSHOT_BMP 1 #define SCREENSHOT_TGA 0 diff --git a/AppleWin/source/Video.h b/AppleWin/source/Video.h index cee11370..66087da9 100644 --- a/AppleWin/source/Video.h +++ b/AppleWin/source/Video.h @@ -68,7 +68,6 @@ void VideoReinitialize (); void VideoResetState (); WORD VideoGetScannerAddress(bool* pbVblBar_OUT, const DWORD uExecutedCycles); bool VideoGetVbl(DWORD uExecutedCycles); -void VideoUpdateVbl (DWORD dwCyclesThisFrame); void VideoUpdateFlash(); bool VideoGetSW80COL(); DWORD VideoGetSnapshot(SS_IO_Video* pSS); @@ -98,6 +97,6 @@ enum VideoScreenShot_e }; void Video_TakeScreenShot( int iScreenShotType ); -BYTE __stdcall VideoCheckMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft); -BYTE __stdcall VideoCheckVbl (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft); -BYTE __stdcall VideoSetMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft); +BYTE __stdcall VideoCheckMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles); +BYTE __stdcall VideoCheckVbl (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles); +BYTE __stdcall VideoSetMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles);