Support for AppleColor / Video7 DHGR mixed mode (#523) (PR #620)

Supported modes selected via toggling AN3 and clocking in 80COL:
- 140 color mode (Apple calls this mode 2, Video7 calls this mode 0).
- mixed mode (Apple calls this mode 3, Video7 calls this mode 2).
- 560 mono mode (Apple calls this mode 1, Video7 calls this mode 3).

Save-state is also persists the extra state.

And there's a few corrections to APPLE2E.SYM for the 80STORE and 80COL I/O addresses.
This commit is contained in:
TomCh 2019-02-02 15:51:27 +00:00 committed by GitHub
parent 8f7ae7dc28
commit dd53812132
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 265 additions and 58 deletions

View File

@ -1,7 +1,10 @@
; Apple 2 Rom Symbol Table
; Version 5 Renamed "KBD/CLR80COL" -> "KBD/CLR80STORE", "SET80COL" -> "SET80STORE"
; Renamed "CLR80VID" -> "CLR80COL", "SET80VID" -> "SET80COL"
; Renamed "RD80COL" -> "RD80STORE", "RD80VID" -> "RD80COL"
; Version 4 GH#484
; Version 3 Cross-referenced/Sync'd with APPLE2E.SYM & A2_BASIC.SYM
Added Text Holes
; Added Text Holes
; Version 2 by Michael Pohoreski - AppleWin Debugger Dev
; Version 1 Original
@ -91,8 +94,8 @@
07FB A2C.TEMP2
; Softswitches
C000 KBD/CLR80COL
C001 SET80COL
C000 KBD/CLR80STORE
C001 SET80STORE
C002 RDMAINRAM
C003 RDCARDRAM
C004 WRMAINRAM
@ -103,8 +106,8 @@ C008 SETSTDZP
C009 SETALTZP
C00A SETINTC3ROM
C00B SETSLOTC3ROM
C00C CLR80VID
C00D SET80VID
C00C CLR80COL
C00D SET80COL
C00E CLRALTCHAR
C00F SETALTCHAR
C010 KBDSTRB
@ -115,12 +118,12 @@ C014 RDRAMWRT
C015 RDCXROM
C016 RDALTZP
C017 RDC3ROM
C018 RD80COL
C018 RD80STORE
C019 RDVBLBAR
C01A RDTEXT
C01C RDPAGE2
C01E ALTCHARSET
C01F RD80VID
C01F RD80COL
C020 TAPEOUT
C030 SPKR
C050 TXTCLR

View File

@ -1301,7 +1301,7 @@ static BYTE __stdcall Disk_IOWrite(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULON
//===========================================================================
// Unit version history:
// Unit version history:
// 2: Added: Format Track state & DiskLastCycle
// 3: Added: DiskLastReadLatchCycle
static const UINT kUNIT_VERSION = 3;

View File

@ -51,6 +51,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "Speaker.h"
#include "Tape.h"
#include "Video.h"
#include "RGBMonitor.h"
#include "z80emu.h"
#include "Z80VICE/z80.h"
@ -2045,7 +2046,13 @@ LPVOID MemGetSlotParameters(UINT uSlot)
//
static const UINT kUNIT_AUXSLOT_VER = 1;
// Unit version history:
// 2: Added version field to card's state
static const UINT kUNIT_AUXSLOT_VER = 2;
// Unit version history:
// 2: Added: RGB card state
static const UINT kUNIT_VER = 2;
#define SS_YAML_VALUE_CARD_80COL "80 Column"
#define SS_YAML_VALUE_CARD_EXTENDED80COL "Extended 80 Column"
@ -2198,32 +2205,42 @@ void MemSaveSnapshotAux(YamlSaveHelper& yamlSaveHelper)
}
yamlSaveHelper.UnitHdr(MemGetSnapshotUnitAuxSlotName(), kUNIT_AUXSLOT_VER);
YamlSaveHelper::Label state(yamlSaveHelper, "%s:\n", SS_YAML_KEY_STATE);
std::string card = g_uMaxExPages == 0 ? SS_YAML_VALUE_CARD_80COL : // todo: support empty slot
g_uMaxExPages == 1 ? SS_YAML_VALUE_CARD_EXTENDED80COL :
SS_YAML_VALUE_CARD_RAMWORKSIII;
yamlSaveHelper.SaveString(SS_YAML_KEY_CARD, card.c_str());
yamlSaveHelper.Save("%s: 0x%02X # [0,1..7F] 0=no aux mem, 1=128K system, etc\n", SS_YAML_KEY_NUMAUXBANKS, g_uMaxExPages);
yamlSaveHelper.Save("%s: 0x%02X # [ 0..7E] 0=memaux\n", SS_YAML_KEY_ACTIVEAUXBANK, g_uActiveBank);
for(UINT uBank = 1; uBank <= g_uMaxExPages; uBank++)
// Unit state
{
MemSaveSnapshotMemory(yamlSaveHelper, false, uBank);
YamlSaveHelper::Label unitState(yamlSaveHelper, "%s:\n", SS_YAML_KEY_STATE);
std::string card = g_uMaxExPages == 0 ? SS_YAML_VALUE_CARD_80COL : // todo: support empty slot
g_uMaxExPages == 1 ? SS_YAML_VALUE_CARD_EXTENDED80COL :
SS_YAML_VALUE_CARD_RAMWORKSIII;
yamlSaveHelper.SaveString(SS_YAML_KEY_CARD, card.c_str());
yamlSaveHelper.Save("%s: %d\n", SS_YAML_KEY_VERSION, kUNIT_VER);
// Card state
{
YamlSaveHelper::Label cardState(yamlSaveHelper, "%s:\n", SS_YAML_KEY_STATE);
yamlSaveHelper.Save("%s: 0x%02X # [0,1..7F] 0=no aux mem, 1=128K system, etc\n", SS_YAML_KEY_NUMAUXBANKS, g_uMaxExPages);
yamlSaveHelper.Save("%s: 0x%02X # [ 0..7E] 0=memaux\n", SS_YAML_KEY_ACTIVEAUXBANK, g_uActiveBank);
for(UINT uBank = 1; uBank <= g_uMaxExPages; uBank++)
{
MemSaveSnapshotMemory(yamlSaveHelper, false, uBank);
}
RGB_SaveSnapshot(yamlSaveHelper);
}
}
}
bool MemLoadSnapshotAux(YamlLoadHelper& yamlLoadHelper, UINT version)
static void MemLoadSnapshotAuxCommon(YamlLoadHelper& yamlLoadHelper, const std::string& card)
{
if (version != kUNIT_AUXSLOT_VER)
throw std::string(SS_YAML_KEY_UNIT ": AuxSlot: Version mismatch");
// "State"
UINT numAuxBanks = yamlLoadHelper.LoadUint(SS_YAML_KEY_NUMAUXBANKS);
UINT activeAuxBank = yamlLoadHelper.LoadUint(SS_YAML_KEY_ACTIVEAUXBANK);
SS_CARDTYPE type = CT_Empty;
std::string card = yamlLoadHelper.LoadString(SS_YAML_KEY_CARD);
if (card == SS_YAML_VALUE_CARD_80COL)
{
type = CT_80Col;
@ -2282,6 +2299,36 @@ bool MemLoadSnapshotAux(YamlLoadHelper& yamlLoadHelper, UINT version)
memaux = RWpages[g_uActiveBank];
// NB. MemUpdatePaging(TRUE) called at end of Snapshot_LoadState_v2()
}
static void MemLoadSnapshotAuxVer1(YamlLoadHelper& yamlLoadHelper)
{
std::string card = yamlLoadHelper.LoadString(SS_YAML_KEY_CARD);
MemLoadSnapshotAuxCommon(yamlLoadHelper, card);
}
static void MemLoadSnapshotAuxVer2(YamlLoadHelper& yamlLoadHelper, UINT unitVersion)
{
std::string card = yamlLoadHelper.LoadString(SS_YAML_KEY_CARD);
UINT cardVersion = yamlLoadHelper.LoadUint(SS_YAML_KEY_VERSION);
if (!yamlLoadHelper.GetSubMap(std::string(SS_YAML_KEY_STATE)))
throw std::string(SS_YAML_KEY_UNIT ": Expected sub-map name: " SS_YAML_KEY_STATE);
MemLoadSnapshotAuxCommon(yamlLoadHelper, card);
RGB_LoadSnapshot(yamlLoadHelper);
}
bool MemLoadSnapshotAux(YamlLoadHelper& yamlLoadHelper, UINT version)
{
if (version < 1 || version > kUNIT_AUXSLOT_VER)
throw std::string(SS_YAML_KEY_UNIT ": AuxSlot: Version mismatch");
if (version == 1)
MemLoadSnapshotAuxVer1(yamlLoadHelper);
else
MemLoadSnapshotAuxVer2(yamlLoadHelper, version);
return true;
}

View File

@ -688,6 +688,19 @@ inline bool GetColorBurst( void )
//===========================================================================
void update7MonoPixels( uint16_t bits )
{
g_pFuncUpdateBnWPixel(bits & 1); bits >>= 1;
g_pFuncUpdateBnWPixel(bits & 1); bits >>= 1;
g_pFuncUpdateBnWPixel(bits & 1); bits >>= 1;
g_pFuncUpdateBnWPixel(bits & 1); bits >>= 1;
g_pFuncUpdateBnWPixel(bits & 1); bits >>= 1;
g_pFuncUpdateBnWPixel(bits & 1); bits >>= 1;
g_pFuncUpdateBnWPixel(bits & 1);
}
//===========================================================================
// NB. g_nLastColumnPixelNTSC = bits.b13 will be superseded by these parent funcs which use bits.b14:
// . updateScreenDoubleHires80(), updateScreenDoubleLores80(), updateScreenText80()
inline void updatePixels( uint16_t bits )
@ -1362,8 +1375,34 @@ void updateScreenDoubleHires80Simplified (long cycles6502 ) // wsUpdateVideoDblH
else if (g_nVideoClockHorz >= VIDEO_SCANNER_HORZ_START)
{
uint16_t addr = getVideoScannerAddressHGR();
UpdateDHiResCell(g_nVideoClockHorz-VIDEO_SCANNER_HORZ_START, g_nVideoClockVert, addr, g_pVideoAddress);
g_pVideoAddress += 14;
uint8_t a = *MemGetAuxPtr(addr);
uint8_t m = *MemGetMainPtr(addr);
if (RGB_Is560Mode() || (RGB_IsMixMode() && !((a | m) & 0x80)))
{
update7MonoPixels(a);
update7MonoPixels(m);
}
else if (!RGB_IsMixMode() || (RGB_IsMixMode() && (a & m & 0x80)))
{
UpdateDHiResCell(g_nVideoClockHorz-VIDEO_SCANNER_HORZ_START, g_nVideoClockVert, addr, g_pVideoAddress, true, true);
g_pVideoAddress += 14;
}
else // RGB_IsMixMode() && ((a ^ m) & 0x80)
{
if (a & 0x80) // RGB color, then monochrome
{
UpdateDHiResCell(g_nVideoClockHorz-VIDEO_SCANNER_HORZ_START, g_nVideoClockVert, addr, g_pVideoAddress, true ,false);
g_pVideoAddress += 7;
update7MonoPixels(m);
}
else // monochrome, then RGB color
{
update7MonoPixels(a);
UpdateDHiResCell(g_nVideoClockHorz-VIDEO_SCANNER_HORZ_START, g_nVideoClockVert, addr, g_pVideoAddress, false, true);
g_pVideoAddress += 7;
}
}
}
}
updateVideoScannerHorzEOLSimple();

View File

@ -6,6 +6,7 @@
#include "Memory.h" // MemGetMainPtr() MemGetAuxPtr()
#include "Video.h"
#include "RGBMonitor.h"
#include "YamlHelper.h"
const int SRCOFFS_LORES = 0; // 0
const int SRCOFFS_HIRES = (SRCOFFS_LORES + 16); // 16
@ -542,30 +543,38 @@ void UpdateHiResCell (int x, int y, uint16_t addr, bgra_t *pVideoAddress)
//===========================================================================
void UpdateDHiResCell (int x, int y, uint16_t addr, bgra_t *pVideoAddress)
#define COLOR ((xpixel + PIXEL) & 3)
#define VALUE (dwordval >> (4 + PIXEL - COLOR))
void UpdateDHiResCell (int x, int y, uint16_t addr, bgra_t *pVideoAddress, bool updateAux, bool updateMain)
{
const int xpixel = x*14;
uint8_t *pAux = MemGetAuxPtr(addr);
uint8_t *pAux = MemGetAuxPtr(addr);
uint8_t *pMain = MemGetMainPtr(addr);
BYTE byteval1 = (x > 0) ? *(pMain-1) : 0;
BYTE byteval2 = *pAux;
BYTE byteval3 = *pMain;
BYTE byteval4 = (x < 39) ? *(pAux+1) : 0;
BYTE byteval1 = (x > 0) ? *(pMain-1) : 0;
BYTE byteval2 = *pAux;
BYTE byteval3 = *pMain;
BYTE byteval4 = (x < 39) ? *(pAux+1) : 0;
DWORD dwordval = (byteval1 & 0x70) | ((byteval2 & 0x7F) << 7) |
((byteval3 & 0x7F) << 14) | ((byteval4 & 0x07) << 21);
#define PIXEL 0
#define COLOR ((xpixel + PIXEL) & 3)
#define VALUE (dwordval >> (4 + PIXEL - COLOR))
if (updateAux)
{
CopySource(7,2, SRCOFFS_DHIRES+10*HIBYTE(VALUE)+COLOR, LOBYTE(VALUE)<<1, pVideoAddress);
pVideoAddress += 7;
}
#undef PIXEL
#define PIXEL 7
CopySource(7,2, SRCOFFS_DHIRES+10*HIBYTE(VALUE)+COLOR, LOBYTE(VALUE)<<1, pVideoAddress+7);
if (updateMain)
{
CopySource(7,2, SRCOFFS_DHIRES+10*HIBYTE(VALUE)+COLOR, LOBYTE(VALUE)<<1, pVideoAddress);
}
#undef PIXEL
#undef COLOR
#undef VALUE
}
//===========================================================================
@ -592,7 +601,7 @@ void UpdateLoResCell (int x, int y, uint16_t addr, bgra_t *pVideoAddress)
// Tested with FT's Ansi Story
void UpdateDLoResCell (int x, int y, uint16_t addr, bgra_t *pVideoAddress)
{
BYTE auxval = *MemGetAuxPtr(addr);
BYTE auxval = *MemGetAuxPtr(addr);
const BYTE mainval = *MemGetMainPtr(addr);
const BYTE auxval_h = auxval >> 4;
@ -649,3 +658,98 @@ void VideoInitializeOriginal(baseColors_t pBaseNtscColors)
PalIndex2RGB[HGR_VIOLET] = PalIndex2RGB[MAGENTA];
#endif
}
//===========================================================================
#define DBG_SUPPORT_A2OSX
static UINT g_rgbFlags = 0;
static UINT g_rgbMode = 0;
static WORD g_rgbPrevAN3Addr = 0;
// Video7 RGB card:
// . Clock in the !80COL state to define the 2 flags: F2, F1
// . Clocking done by toggling AN3
// . NB. There's a final 5th AN3 transition to set DHGR mode
void RGB_SetVideoMode(WORD address)
{
if ((address&~1) != 0x5E) // 0x5E or 0x5F?
return;
// Precondition before togglng AN3:
// . Video7 manual: set 80STORE, but "King's Quest 1"(*) will re-enable RGB card's MIX mode with only VF_TEXT & VF_HIRES set!
// . "Extended 80-Column Text/AppleColor Card" manual: TEXT off($C050), MIXED off($C052), HIRES on($C057)
// . (*) "King's Quest 1" - see routine at 0x5FD7 (trigger by pressing TAB twice)
if ((g_uVideoMode & (VF_MIXED|VF_HIRES)) != (VF_HIRES))
{
g_rgbMode = 0;
g_rgbPrevAN3Addr = 0;
return;
}
if (address == 0x5F && g_rgbPrevAN3Addr == 0x5E) // Check for AN3 clock transition
{
g_rgbFlags = (g_rgbFlags<<1) & 3;
g_rgbFlags |= ((g_uVideoMode & VF_80COL) ? 0 : 1); // clock in !80COL
g_rgbMode = g_rgbFlags; // latch F2,F1
}
g_rgbPrevAN3Addr = address;
}
bool RGB_Is140Mode(void) // Extended 80-Column Text/AppleColor Card's Mode 2
{
return g_rgbMode == 0;
}
//bool RGB_Is160Mode(void) // Extended 80-Column Text/AppleColor Card: N/A
//{
// return g_rgbMode == 1;
//}
bool RGB_IsMixMode(void) // Extended 80-Column Text/AppleColor Card's Mode 3
{
return g_rgbMode == 2;
}
bool RGB_Is560Mode(void) // Extended 80-Column Text/AppleColor Card's Mode 1
{
return g_rgbMode == 3;
}
void RGB_ResetState(void)
{
g_rgbFlags = 0;
g_rgbMode = 0;
g_rgbPrevAN3Addr = 0;
}
//===========================================================================
#define SS_YAML_KEY_RGB_CARD "AppleColor RGB Adaptor"
// NB. No version - this is determined by the parent card
#define SS_YAML_KEY_RGB_FLAGS "RGB mode flags"
#define SS_YAML_KEY_RGB_MODE "RGB mode"
#define SS_YAML_KEY_RGB_PREVIOUS_AN3 "Previous AN3"
void RGB_SaveSnapshot(YamlSaveHelper& yamlSaveHelper)
{
YamlSaveHelper::Label label(yamlSaveHelper, "%s:\n", SS_YAML_KEY_RGB_CARD);
yamlSaveHelper.SaveHexUint8(SS_YAML_KEY_RGB_FLAGS, g_rgbFlags);
yamlSaveHelper.SaveHexUint8(SS_YAML_KEY_RGB_MODE, g_rgbMode);
yamlSaveHelper.SaveHexUint8(SS_YAML_KEY_RGB_PREVIOUS_AN3, g_rgbPrevAN3Addr);
}
void RGB_LoadSnapshot(YamlLoadHelper& yamlLoadHelper)
{
if (!yamlLoadHelper.GetSubMap(SS_YAML_KEY_RGB_CARD))
throw std::string("Card: Expected key: ") + std::string(SS_YAML_KEY_RGB_CARD);
g_rgbFlags = yamlLoadHelper.LoadUint(SS_YAML_KEY_RGB_FLAGS);
g_rgbMode = yamlLoadHelper.LoadUint(SS_YAML_KEY_RGB_MODE);
g_rgbPrevAN3Addr = yamlLoadHelper.LoadUint(SS_YAML_KEY_RGB_PREVIOUS_AN3);
yamlLoadHelper.PopMap();
}

View File

@ -1,8 +1,17 @@
void UpdateHiResCell(int x, int y, uint16_t addr, bgra_t *pVideoAddress);
void UpdateDHiResCell(int x, int y, uint16_t addr, bgra_t *pVideoAddress);
void UpdateDHiResCell (int x, int y, uint16_t addr, bgra_t *pVideoAddress, bool updateAux, bool updateMain);
void UpdateLoResCell(int x, int y, uint16_t addr, bgra_t *pVideoAddress);
void UpdateDLoResCell(int x, int y, uint16_t addr, bgra_t *pVideoAddress);
const UINT kNumBaseColors = 16;
typedef bgra_t (*baseColors_t)[kNumBaseColors];
void VideoInitializeOriginal(baseColors_t pBaseNtscColors);
void RGB_SetVideoMode(WORD address);
bool RGB_Is140Mode(void);
bool RGB_IsMixMode(void);
bool RGB_Is560Mode(void);
void RGB_ResetState(void);
void RGB_SaveSnapshot(class YamlSaveHelper& yamlSaveHelper);
void RGB_LoadSnapshot(class YamlLoadHelper& yamlLoadHelper);

View File

@ -220,14 +220,14 @@ static void ParseUnitApple2(YamlLoadHelper& yamlLoadHelper, UINT version)
// g_Apple2Type may've changed: so redraw frame (title, buttons, leds, etc)
VideoReinitialize(); // g_CharsetType changed
FrameUpdateApple2Type();
FrameUpdateApple2Type(); // Calls VideoRedrawScreen() before the aux mem has been loaded (so if DHGR is enabled, then aux mem will be zeros at this stage)
}
//---
static void ParseSlots(YamlLoadHelper& yamlLoadHelper, UINT version)
static void ParseSlots(YamlLoadHelper& yamlLoadHelper, UINT unitVersion)
{
if (version != UNIT_SLOTS_VER)
if (unitVersion != UNIT_SLOTS_VER)
throw std::string(SS_YAML_KEY_UNIT ": Slots: Version mismatch");
while (1)
@ -244,7 +244,7 @@ static void ParseSlots(YamlLoadHelper& yamlLoadHelper, UINT version)
yamlLoadHelper.GetSubMap(scalar);
std::string card = yamlLoadHelper.LoadString(SS_YAML_KEY_CARD);
UINT version = yamlLoadHelper.LoadUint(SS_YAML_KEY_VERSION);
UINT cardVersion = yamlLoadHelper.LoadUint(SS_YAML_KEY_VERSION);
if (!yamlLoadHelper.GetSubMap(std::string(SS_YAML_KEY_STATE)))
throw std::string(SS_YAML_KEY_UNIT ": Expected sub-map name: " SS_YAML_KEY_STATE);
@ -254,42 +254,42 @@ static void ParseSlots(YamlLoadHelper& yamlLoadHelper, UINT version)
if (card == Printer_GetSnapshotCardName())
{
bRes = Printer_LoadSnapshot(yamlLoadHelper, slot, version);
bRes = Printer_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
type = CT_GenericPrinter;
}
else if (card == sg_SSC.GetSnapshotCardName())
{
bRes = sg_SSC.LoadSnapshot(yamlLoadHelper, slot, version);
bRes = sg_SSC.LoadSnapshot(yamlLoadHelper, slot, cardVersion);
type = CT_SSC;
}
else if (card == sg_Mouse.GetSnapshotCardName())
{
bRes = sg_Mouse.LoadSnapshot(yamlLoadHelper, slot, version);
bRes = sg_Mouse.LoadSnapshot(yamlLoadHelper, slot, cardVersion);
type = CT_MouseInterface;
}
else if (card == Z80_GetSnapshotCardName())
{
bRes = Z80_LoadSnapshot(yamlLoadHelper, slot, version);
bRes = Z80_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
type = CT_Z80;
}
else if (card == MB_GetSnapshotCardName())
{
bRes = MB_LoadSnapshot(yamlLoadHelper, slot, version);
bRes = MB_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
type = CT_MockingboardC;
}
else if (card == Phasor_GetSnapshotCardName())
{
bRes = Phasor_LoadSnapshot(yamlLoadHelper, slot, version);
bRes = Phasor_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
type = CT_Phasor;
}
else if (card == DiskGetSnapshotCardName())
{
bRes = DiskLoadSnapshot(yamlLoadHelper, slot, version);
bRes = DiskLoadSnapshot(yamlLoadHelper, slot, cardVersion);
type = CT_Disk2;
}
else if (card == HD_GetSnapshotCardName())
{
bRes = HD_LoadSnapshot(yamlLoadHelper, slot, version, g_strSaveStatePath);
bRes = HD_LoadSnapshot(yamlLoadHelper, slot, cardVersion, g_strSaveStatePath);
m_ConfigNew.m_bEnableHDD = true;
type = CT_GenericHDD;
}
@ -298,14 +298,14 @@ static void ParseSlots(YamlLoadHelper& yamlLoadHelper, UINT version)
type = CT_LanguageCard;
SetExpansionMemType(type);
CreateLanguageCard();
bRes = GetLanguageCard()->LoadSnapshot(yamlLoadHelper, slot, version);
bRes = GetLanguageCard()->LoadSnapshot(yamlLoadHelper, slot, cardVersion);
}
else if (card == Saturn128K::GetSnapshotCardName())
{
type = CT_Saturn128K;
SetExpansionMemType(type);
CreateLanguageCard();
bRes = GetLanguageCard()->LoadSnapshot(yamlLoadHelper, slot, version);
bRes = GetLanguageCard()->LoadSnapshot(yamlLoadHelper, slot, cardVersion);
}
else
{
@ -331,22 +331,22 @@ static void ParseUnit(void)
YamlLoadHelper yamlLoadHelper(yamlHelper);
std::string unit = yamlLoadHelper.LoadString(SS_YAML_KEY_TYPE);
UINT version = yamlLoadHelper.LoadUint(SS_YAML_KEY_VERSION);
UINT unitVersion = yamlLoadHelper.LoadUint(SS_YAML_KEY_VERSION);
if (!yamlLoadHelper.GetSubMap(std::string(SS_YAML_KEY_STATE)))
throw std::string(SS_YAML_KEY_UNIT ": Expected sub-map name: " SS_YAML_KEY_STATE);
if (unit == GetSnapshotUnitApple2Name())
{
ParseUnitApple2(yamlLoadHelper, version);
ParseUnitApple2(yamlLoadHelper, unitVersion);
}
else if (unit == MemGetSnapshotUnitAuxSlotName())
{
MemLoadSnapshotAux(yamlLoadHelper, version);
MemLoadSnapshotAux(yamlLoadHelper, unitVersion);
}
else if (unit == GetSnapshotUnitSlotsName())
{
ParseSlots(yamlLoadHelper, version);
ParseSlots(yamlLoadHelper, unitVersion);
}
else
{

View File

@ -37,6 +37,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "Registry.h"
#include "Video.h"
#include "NTSC.h"
#include "RGBMonitor.h"
#include "../resource/resource.h"
#include "Configuration/PropertySheet.h"
@ -641,8 +642,9 @@ void VideoResetState ()
NTSC_SetVideoTextMode( 40 );
NTSC_SetVideoMode( g_uVideoMode );
}
RGB_ResetState();
}
//===========================================================================
@ -670,6 +672,9 @@ BYTE VideoSetMode(WORD, WORD address, BYTE write, BYTE, ULONG uExecutedCycles)
case 0x5F: if (!IS_APPLE2) g_uVideoMode &= ~VF_DHIRES; break;
}
if (!IS_APPLE2)
RGB_SetVideoMode(address);
NTSC_SetVideoMode( g_uVideoMode );
return MemReadFloatingBus(uExecutedCycles);