This commit is contained in:
tomcw 2017-02-25 22:48:07 +00:00
commit 29b7fa15b8
7 changed files with 25 additions and 113 deletions

View File

@ -9,6 +9,17 @@ https://github.com/AppleWin/AppleWin/issues/new
Tom Charlesworth
1.26.1.1 - 17 Feb 2017
----------------------
Fixes:
. [Bug #371] Flickery video when using GR from CP/M. (A regression at 1.26.0.x)
. [Bug #363] Debugger: Screen not updating when running in single-stepping debugger mode. (A regression at 1.26.0.x)
. Save-state: Fix for loading state when TEXT40 changes to TEXT80 or vice versa
Fixes since 1.26.1.0 (11 Feb 2017):
. [Bug #382] Reset not resetting the 40/80-col text mode for mixed-mode NTSC rendering
1.26.0.6 - 16 Oct 2016
----------------------
Changes:

View File

@ -13,7 +13,7 @@
<p>The complete<sub style="FONT-WEIGHT: bold">1</sub> Apple //e state can be saved
to a PC file at any time. This can be useful for continuity across AppleWin
sessions or to help with games that don't have a save option.</p>
<p>This is controlled by the AppleWin Configuration tab labelled <em>Save State</em>.</p>
<p>This is controlled by the AppleWin Configuration tab labelled <em>Advanced</em>.</p>
<p style="FONT-WEIGHT: bold">Details:</p>
<p>The entire Apple //e state is saved to a human-readable (.yaml) file.</p>
<p><span style="FONT-WEIGHT: bold">1</span>

View File

@ -251,8 +251,8 @@ DISK_ICON ICON "DISK.ICO"
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,26,0,6
PRODUCTVERSION 1,26,0,6
FILEVERSION 1,26,1,1
PRODUCTVERSION 1,26,1,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -270,12 +270,12 @@ BEGIN
VALUE "Comments", "https://github.com/AppleWin"
VALUE "CompanyName", "AppleWin"
VALUE "FileDescription", "Apple //e Emulator for Windows"
VALUE "FileVersion", "1, 26, 0, 6"
VALUE "FileVersion", "1, 26, 1, 1"
VALUE "InternalName", "APPLEWIN"
VALUE "LegalCopyright", " 1994-2016 Michael O'Brien, Oliver Schmidt, Tom Charlesworth, Michael Pohoreski, Nick Westgate, Linards Ticmanis"
VALUE "LegalCopyright", " 1994-2017 Michael O'Brien, Oliver Schmidt, Tom Charlesworth, Michael Pohoreski, Nick Westgate, Linards Ticmanis"
VALUE "OriginalFilename", "APPLEWIN.EXE"
VALUE "ProductName", "Apple //e Emulator"
VALUE "ProductVersion", "1, 26, 0, 6"
VALUE "ProductVersion", "1, 26, 1, 1"
END
END
BLOCK "VarFileInfo"

View File

@ -6755,9 +6755,9 @@ Update_t _ViewOutput( ViewVideoPage_t iPage, int bVideoModeFlags )
{
switch( iPage )
{
case VIEW_PAGE_X: bVideoModeFlags |= _Video_SetupBanks( VideoGetSWPAGE2() ); break; // Page Current
case VIEW_PAGE_1: bVideoModeFlags |= _Video_SetupBanks( false ); break; // Page 1
case VIEW_PAGE_2: bVideoModeFlags |= _Video_SetupBanks( true ); break; // Page 2 !
case VIEW_PAGE_X: bVideoModeFlags |= !VideoGetSWPAGE2() ? 0 : VF_PAGE2; break; // Page Current
case VIEW_PAGE_1: bVideoModeFlags |= 0; break; // Page 1
case VIEW_PAGE_2: bVideoModeFlags |= VF_PAGE2; break; // Page 2
default:
break;
}

View File

@ -2078,13 +2078,13 @@ void ResetMachineState ()
void CtrlReset()
{
// Ctrl+Reset - TODO: This is a terrible place for this code!
if (!IS_APPLE2)
if (!IS_APPLE2) // TODO: Why not for A][ & A][+ too?
MemResetPaging();
PravetsReset();
DiskReset();
KeybReset();
if (!IS_APPLE2)
if (!IS_APPLE2) // TODO: Why not for A][ & A][+ too?
VideoResetState(); // Switch Alternate char set off
sg_SSC.CommReset();
MB_Reset();

View File

@ -236,8 +236,6 @@ static HDC g_hDeviceDC;
static LPBITMAPINFO g_pFramebufferinfo = NULL;
static LPBYTE g_aFrameBufferOffset[FRAMEBUFFER_H]; // array of pointers to start of each scanline
static LPBYTE g_pHiresBank1;
static LPBYTE g_pHiresBank0;
HBITMAP g_hLogoBitmap;
static HPALETTE g_hPalette;
@ -245,11 +243,6 @@ static HBITMAP g_hSourceBitmap;
static LPBYTE g_pSourcePixels;
const int MAX_SOURCE_Y = 512;
static LPBYTE g_aSourceStartofLine[ MAX_SOURCE_Y ];
static LPBYTE g_pTextBank1; // Aux
static LPBYTE g_pTextBank0; // Main
// TC (25/8/2016): TODO: Need to investigate the use of this global flag for 1.27
static /*bool*/ UINT g_VideoForceFullRedraw = 1;
static LPBYTE framebufferaddr = (LPBYTE)0;
static LONG g_nFrameBufferPitch = 0;
@ -584,64 +577,10 @@ static void CreateLookup_TextCommon(HDC hDstDC, DWORD rop)
//===========================================================================
static inline int GetOriginal2EOffset(BYTE ch)
{
// No mousetext for original IIe
return !IsOriginal2E() || !g_nAltCharSetOffset || (ch<0x40) || (ch>0x5F) ? 0 : -g_nAltCharSetOffset;
}
//===========================================================================
//
// ----- ALL GLOBALLY ACCESSIBLE FUNCTIONS ARE BELOW THIS LINE -----
//
//===========================================================================
BOOL VideoApparentlyDirty ()
{
if (SW_MIXED || g_VideoForceFullRedraw)
return 1;
DWORD address = (SW_HIRES && !SW_TEXT)
? (0x20 << (SW_PAGE2 ? 1 : 0))
: (0x04 << (SW_PAGE2 ? 1 : 0));
DWORD length = (SW_HIRES && !SW_TEXT) ? 0x20 : 0x4;
while (length--)
if (*(memdirty+(address++)) & 2)
return 1;
//
// Scan visible text page for any flashing chars
if((SW_TEXT || SW_MIXED) && (g_nAltCharSetOffset == 0))
{
BYTE* pTextBank0 = MemGetMainPtr(0x400 << (SW_PAGE2 ? 1 : 0));
BYTE* pTextBank1 = MemGetAuxPtr (0x400 << (SW_PAGE2 ? 1 : 0));
const bool b80Col = SW_80COL;
// Scan 8 long-lines of 120 chars (at 128 char offsets):
// . Skip 8-char holes in TEXT
for(UINT y=0; y<8; y++)
{
for(UINT x=0; x<40*3; x++)
{
BYTE ch = pTextBank0[y*128+x];
if((ch >= 0x40) && (ch <= 0x7F))
return 1;
if (b80Col)
{
ch = pTextBank1[y*128+x];
if((ch >= 0x40) && (ch <= 0x7F))
return 1;
}
}
}
}
return 0;
}
//===========================================================================
void VideoBenchmark () {
Sleep(500);
@ -1130,17 +1069,6 @@ void VideoRedrawScreen (void)
VideoRefreshScreen( g_uVideoMode, true );
}
//===========================================================================
int _Video_SetupBanks( bool bBank2 )
{
g_pHiresBank1 = MemGetAuxPtr (0x2000 << (int)bBank2);
g_pHiresBank0 = MemGetMainPtr(0x2000 << (int)bBank2);
g_pTextBank1 = MemGetAuxPtr (0x400 << (int)bBank2);
g_pTextBank0 = MemGetMainPtr(0x400 << (int)bBank2);
return bBank2 ? VF_PAGE2 : 0;
}
//===========================================================================
// NB. Can get "big" 1000+ms times: these occur during disk loading when the emulator is at full-speed.
@ -1258,8 +1186,6 @@ void VideoRefreshScreen ( uint32_t uRedrawWholeScreenVideoMode /* =0*/, bool bRe
GdiFlush();
FrameReleaseVideoDC();
g_VideoForceFullRedraw = 0;
// NTSC_END
}
@ -1278,7 +1204,9 @@ void VideoResetState ()
{
g_nAltCharSetOffset = 0;
g_uVideoMode = VF_TEXT;
g_VideoForceFullRedraw = 1;
NTSC_SetVideoTextMode( 40 );
NTSC_SetVideoMode( g_uVideoMode );
}
@ -1288,9 +1216,6 @@ BYTE VideoSetMode (WORD, WORD address, BYTE write, BYTE, ULONG uExecutedCycles)
{
address &= 0xFF;
// DWORD oldpage2 = SW_PAGE2;
// int oldvalue = g_nAltCharSetOffset+(int)(g_uVideoMode & ~(VF_80STORE | VF_PAGE2));
switch (address)
{
case 0x00: g_uVideoMode &= ~VF_80STORE; break;
@ -1320,28 +1245,6 @@ BYTE VideoSetMode (WORD, WORD address, BYTE write, BYTE, ULONG uExecutedCycles)
NTSC_SetVideoMode( g_uVideoMode );
// NTSC_END
#if 0 // NTSC_CLEANUP: Is this still needed??
if (oldvalue != g_nAltCharSetOffset+(int)(g_uVideoMode & ~(VF_80STORE | VF_PAGE2)))
g_VideoForceFullRedraw = 1; // Defer video redraw until VideoEndOfVideoFrame()
if (oldpage2 != SW_PAGE2)
{
// /g_bVideoUpdatedThisFrame/ is used to limit the video update to once per 60Hz frame (CPU clk=1MHz):
// . this easily supports the common double-buffered "flip-immediate" case (eg. Airheart flips at a max of ~15Hz, Skyfox/Boulderdash at a max of ~11Hz)
// . crucially this prevents tight-loop page flipping (GH#129,GH#204) from max'ing out an x86 CPU core (and not providing realtime emulation)
// NB. Deferring the update by just setting /g_VideoForceFullRedraw/ is not an option, since this doesn't provide "flip-immediate"
//
// Ultimately this isn't the correct solution, and proper cycle-accurate video rendering should be done, but this is a much bigger job!
// TODO-Michael: Is MemReadFloatingBus() still accurate now that we have proper per cycle video rendering??
if (!g_bVideoUpdatedThisFrame)
{
VideoRedrawScreen(); // VideoRefreshScreen();
g_bVideoUpdatedThisFrame = true;
}
}
#endif // NTSC_CLEANUP
return MemReadFloatingBus(uExecutedCycles);
}

View File

@ -162,7 +162,6 @@ typedef bool (*VideoUpdateFuncPtr_t)(int,int,int,int,int);
// Prototypes _______________________________________________________
BOOL VideoApparentlyDirty ();
void VideoBenchmark ();
void VideoChooseMonochromeColor (); // FIXME: Should be moved to PageConfig and call VideoSetMonochromeColor()
void VideoDestroy ();
@ -191,7 +190,6 @@ void VideoSetSnapshot_v1(const UINT AltCharSet, const UINT VideoMode);
void VideoSaveSnapshot(class YamlSaveHelper& yamlSaveHelper);
void VideoLoadSnapshot(class YamlLoadHelper& yamlLoadHelper);
int _Video_SetupBanks( bool bBank2 );
bool Update40ColCell (int x, int y, int xpixel, int ypixel, int offset);
bool Update80ColCell (int x, int y, int xpixel, int ypixel, int offset);
bool UpdateLoResCell (int x, int y, int xpixel, int ypixel, int offset);