Sync to master

This commit is contained in:
michaelangel007 2023-04-30 14:48:45 -07:00
commit 57f076dde7
20 changed files with 211 additions and 62 deletions

View File

@ -1,4 +1,8 @@
/*
2.9.1.20 Fixed: Changed DISK INFO to have 1 line abbreviation for disk state
2.9.1.19 Added: QoL to DISK INFO.
Colorized numbers and status to improve readability.
Also shows the .WOZ current shift register.
2.9.1.18 Fixed: NTSC LOAD was failing to import BMPs exported from GIMP.
To export a 64x256 bitmap from GIMP:
1. File, Export As...

View File

@ -161,6 +161,8 @@ std::string Card::GetCardName(const SS_CARDTYPE cardType)
return Uthernet2::GetSnapshotCardName();
case CT_MegaAudio:
return MockingboardCard::GetSnapshotCardNameMegaAudio();
case CT_SDMusic:
return MockingboardCard::GetSnapshotCardNameSDMusic();
default:
return "Unknown";
}
@ -236,6 +238,10 @@ SS_CARDTYPE Card::GetCardType(const std::string & card)
{
return CT_MegaAudio;
}
else if (card == MockingboardCard::GetSnapshotCardNameSDMusic())
{
return CT_SDMusic;
}
else
{
throw std::runtime_error("Slots: Unknown card: " + card); // todo: don't throw - just ignore & continue

View File

@ -26,6 +26,7 @@ enum SS_CARDTYPE
CT_VidHD,
CT_Uthernet2,
CT_MegaAudio, // Soundcard
CT_SDMusic, // Soundcard
};
enum SLOTS { SLOT0=0, SLOT1, SLOT2, SLOT3, SLOT4, SLOT5, SLOT6, SLOT7, NUM_SLOTS, SLOT_AUX, GAME_IO_CONNECTOR };

View File

@ -67,6 +67,7 @@ void CardManager::InsertInternal(UINT slot, SS_CARDTYPE type)
break;
case CT_MockingboardC:
case CT_MegaAudio:
case CT_SDMusic:
m_slot[slot] = new MockingboardCard(slot, type);
break;
case CT_GenericPrinter:

View File

@ -176,7 +176,15 @@ bool ProcessCmdLine(LPSTR lpCmdLine)
if (strcmp(lpCmdLine, "hdc") == 0)
g_cmdLine.slotInsert[slot] = CT_GenericHDD;
if (strcmp(lpCmdLine, "megaaudio") == 0)
{
g_cmdLine.slotInsert[slot] = CT_MegaAudio;
g_cmdLine.supportExtraMBCardTypes = true;
}
if (strcmp(lpCmdLine, "sdmusic") == 0)
{
g_cmdLine.slotInsert[slot] = CT_SDMusic;
g_cmdLine.supportExtraMBCardTypes = true;
}
if (strcmp(lpCmdLine, "parallel") == 0)
{
if (slot == SLOT1)
@ -599,6 +607,12 @@ bool ProcessCmdLine(LPSTR lpCmdLine)
lpNextArg = GetNextArg(lpNextArg);
g_cmdLine.wavFileMockingboard = lpCmdLine;
}
else if (strcmp(lpCmdLine, "-mb-audit") == 0) // enable selection of additional sound cards, eg. for mb-audit
{
lpCmdLine = GetCurrArg(lpNextArg);
lpNextArg = GetNextArg(lpNextArg);
g_cmdLine.supportExtraMBCardTypes = true;
}
else if (strcmp(lpCmdLine, "-no-disk2-stepper-defer") == 0) // a debug switch (likely to be removed in a future version)
{
g_cmdLine.noDisk2StepperDefer = true;

View File

@ -32,6 +32,7 @@ struct CmdLine
snesMaxAltControllerType[1] = false;
supportDCD = false;
enableDumpToRealPrinter = false;
supportExtraMBCardTypes = false;
noDisk2StepperDefer = false;
szSnapshotName = NULL;
szScreenshotFilename = NULL;
@ -74,6 +75,7 @@ struct CmdLine
bool snesMaxAltControllerType[2];
bool supportDCD;
bool enableDumpToRealPrinter;
bool supportExtraMBCardTypes;
bool noDisk2StepperDefer; // debug
SS_CARDTYPE slotInsert[NUM_SLOTS];
SlotInfo slotInfo[NUM_SLOTS];

View File

@ -44,7 +44,7 @@ const char CPageSound::m_soundCardChoices[] = "Mockingboard\0"
"SAM\0"
"Empty\0";
// Don't reveal MegaAudio card unless it's been specified from the command line.
// Don't reveal MegaAudio/SD Music cards unless it's been specified from the command line.
// The reasons being are that:
// . this card is purely for regression testing against mb-audit
// . it's confusing to offer this to the end user
@ -52,7 +52,8 @@ const char CPageSound::m_soundCardChoicesEx[] = "Mockingboard\0"
"Phasor\0"
"SAM\0"
"Empty\0"
"MEGA Audio\0";
"MEGA Audio\0"
"SD Music\0";
const char CPageSound::m_soundCardChoice_Unavailable[] = "Unavailable\0\0"; // doubly-null terminate
@ -116,6 +117,7 @@ INT_PTR CPageSound::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPAR
case SC_SAM: newCard = CT_SAM; break;
case SC_EMPTY: newCard = CT_Empty; break;
case SC_MEGAAUDIO: newCard = CT_MegaAudio; break;
case SC_SDMUSIC: newCard = CT_SDMusic; break;
default: _ASSERT(0); break;
}
@ -178,6 +180,7 @@ CPageSound::SOUNDCARDCHOICE CPageSound::CardTypeToComboItem(SS_CARDTYPE card)
case CT_SAM: return SC_SAM;
case CT_Empty: return SC_EMPTY;
case CT_MegaAudio: return SC_MEGAAUDIO;
case CT_SDMusic: return SC_SDMUSIC;
default: _ASSERT(0); return SC_EMPTY;
}
}
@ -190,31 +193,28 @@ void CPageSound::InitOptions(HWND hWnd)
bool isSlot4SoundCard = slot4 == CT_MockingboardC || slot4 == CT_Phasor || slot4 == CT_SAM || slot4 == CT_Empty;
bool isSlot5SoundCard = slot5 == CT_MockingboardC || slot5 == CT_Phasor || slot5 == CT_SAM || slot5 == CT_Empty;
bool isSlot4SoundCardEx = slot4 == CT_MegaAudio;
bool isSlot5SoundCardEx = slot5 == CT_MegaAudio;
bool isSlotXSoundCardEx = GetCardMgr().GetMockingboardCardMgr().GetEnableExtraCardTypes();
if (isSlot4SoundCardEx || isSlot5SoundCardEx)
{
isSlot4SoundCardEx = isSlot5SoundCardEx = true; // if MegaAudio is visible in either, then make it available in both menus
if (isSlotXSoundCardEx)
isSlot4SoundCard = isSlot5SoundCard = false;
}
if (isSlot4SoundCard)
m_PropertySheetHelper.FillComboBox(hWnd, IDC_SOUNDCARD_SLOT4, m_soundCardChoices, (int)CardTypeToComboItem(slot4));
else if (isSlot4SoundCardEx)
else if (isSlotXSoundCardEx)
m_PropertySheetHelper.FillComboBox(hWnd, IDC_SOUNDCARD_SLOT4, m_soundCardChoicesEx, (int)CardTypeToComboItem(slot4));
else
m_PropertySheetHelper.FillComboBox(hWnd, IDC_SOUNDCARD_SLOT4, m_soundCardChoice_Unavailable, 0);
if (isSlot5SoundCard)
m_PropertySheetHelper.FillComboBox(hWnd, IDC_SOUNDCARD_SLOT5, m_soundCardChoices, (int)CardTypeToComboItem(slot5));
else if (isSlot5SoundCardEx)
else if (isSlotXSoundCardEx)
m_PropertySheetHelper.FillComboBox(hWnd, IDC_SOUNDCARD_SLOT5, m_soundCardChoicesEx, (int)CardTypeToComboItem(slot5));
else
m_PropertySheetHelper.FillComboBox(hWnd, IDC_SOUNDCARD_SLOT5, m_soundCardChoice_Unavailable, 0);
bool enableMBVolume = slot4 == CT_MockingboardC || slot5 == CT_MockingboardC
|| slot4 == CT_Phasor || slot5 == CT_Phasor
|| slot4 == CT_MegaAudio || slot5 == CT_MegaAudio;
|| slot4 == CT_MegaAudio || slot5 == CT_MegaAudio
|| slot4 == CT_SDMusic || slot5 == CT_SDMusic;
EnableWindow(GetDlgItem(hWnd, IDC_MB_VOLUME), enableMBVolume ? TRUE : FALSE);
}

View File

@ -28,7 +28,7 @@ protected:
virtual void DlgCANCEL(HWND hWnd){}
private:
enum SOUNDCARDCHOICE { SC_MOCKINGBOARD = 0, SC_PHASOR, SC_SAM, SC_EMPTY, SC_MEGAAUDIO };
enum SOUNDCARDCHOICE { SC_MOCKINGBOARD = 0, SC_PHASOR, SC_SAM, SC_EMPTY, SC_MEGAAUDIO, SC_SDMUSIC };
void InitOptions(HWND hWnd);
SOUNDCARDCHOICE CardTypeToComboItem(SS_CARDTYPE card);

View File

@ -53,7 +53,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#define MAKE_VERSION(a,b,c,d) ((a<<24) | (b<<16) | (c<<8) | (d))
// See /docs/Debugger_Changelog.txt for full details
const int DEBUGGER_VERSION = MAKE_VERSION(2,9,1,18);
const int DEBUGGER_VERSION = MAKE_VERSION(2,9,1,20);
// Public _________________________________________________________________________________________
@ -3640,7 +3640,7 @@ Update_t CmdFlag (int nArgs)
// DISK # PROTECT # // Write-protect disk on/off
// DISK # "<filename>" // Mount filename as floppy disk
// TODO:
// DISK # READ <Track> <Sector> <NumSec> <Addr> // Read Track/Sector(s)
// DISK # READ <Track> <Sector> <NumSec> <Addr> // Read Track/Sector(s)
// DISK # READ <Track> <Sector> Addr:Addr // Read Track/Sector(s)
// DISK # WRITE <Track> <Sector> Addr:Addr // Write Track/Sector(s)
// Examples:
@ -3681,17 +3681,43 @@ Update_t CmdDisk (int nArgs)
if (iParam == PARAM_DISK_INFO)
{
if (nArgs > 2)
if (nArgs > 1)
return HelpLastCommand();
ConsoleBufferPushFormat("FW%2d: D%d at T$%s, phase $%s, bitOffset $%04X, extraCycles %.2f, %s",
Disk_Status_e eDiskState;
LPCTSTR sDiskState = diskCard.GetCurrentState(eDiskState);
BYTE nShiftReg = diskCard.GetCurrentShiftReg();
static const char *aDiskStatusCHC[NUM_DISK_STATUS] =
{
CHC_INFO "%s" CHC_DEFAULT " " CHC_NUM_HEX " " // DISK_STATUS_OFF
,CHC_COMMAND "%s" CHC_DEFAULT " << " CHC_NUM_HEX "%02X" // DISK_STATUS_READ
,CHC_ERROR "%s" CHC_DEFAULT " >> " CHC_NUM_HEX "%02X" // DISK_STATUS_WRITE
,CHC_WARNING "%s" CHC_DEFAULT " >| " CHC_NUM_HEX "%02X" // DISK_STATUS_PROT
,CHC_INFO "%s" CHC_DEFAULT " " CHC_NUM_HEX " " // DISK_STATUS_EMPTY
,CHC_INFO "%s" CHC_DEFAULT " " CHC_NUM_HEX " " // DISK_STATUS_SPIN
};
std::string Format(
/*CHC_DEFAULT*/ "FW" CHC_NUM_DEC "%2d" CHC_ARG_SEP ":"
CHC_DEFAULT " D" CHC_NUM_DEC "%d"
CHC_DEFAULT " T$" CHC_NUM_HEX "%s" CHC_ARG_SEP ","
CHC_DEFAULT " Phase $" CHC_NUM_HEX "%s" CHC_ARG_SEP ","
CHC_DEFAULT " bitOffset $" CHC_ADDRESS "%04X" CHC_ARG_SEP ","
CHC_DEFAULT " Cycles " CHC_NUM_DEC "%.2f" CHC_ARG_SEP ", "
);
Format += aDiskStatusCHC[eDiskState];
ConsolePrintFormat(
Format.c_str(),
diskCard.GetCurrentFirmware(),
diskCard.GetCurrentDrive() + 1,
diskCard.GetCurrentTrackString().c_str(),
diskCard.GetCurrentPhaseString().c_str(),
diskCard.GetCurrentBitOffset(),
diskCard.GetCurrentExtraCycles(),
diskCard.GetCurrentState()
sDiskState,
nShiftReg
);
return ConsoleUpdate();

View File

@ -127,30 +127,40 @@ void ConsolePrint ( const char * pText )
// Convert color string to native console color text
// Ignores g_nConsoleDisplayWidth
char c;
int x = 0;
int y = 0;
const char *pSrc = pText;
conchar_t *pDst = & g_aConsoleBuffer[ g_nConsoleBuffer ][ 0 ];
const int MAX_PUSH_HEIGHT = 16;
conchar_t g = 0;
bool bHaveColor = false;
char cColor = 0;
while ((x < CONSOLE_WIDTH) && (c = *pSrc))
while ((y < MAX_PUSH_HEIGHT) && (c = *pSrc))
{
if ((c == '\n') || (x >= (CONSOLE_WIDTH - 1)))
if ((c == '\n') || (x >= g_nConsoleDisplayWidth))
{
*pDst = 0;
x = 0;
y++;
if (cColor)
bHaveColor = true; // wrap color to next line
if (g_nConsoleBuffer >= CONSOLE_BUFFER_HEIGHT)
{
ConsoleBufferToDisplay();
ConsoleBufferToDisplay();
}
else
{
g_nConsoleBuffer++;
}
}
pDst = & g_aConsoleBuffer[ g_nConsoleBuffer ][ 0 ];
if (c == '\n')
pSrc++;
}
else
{
@ -192,7 +202,7 @@ void ConsolePrint ( const char * pText )
{
if (bHaveColor)
{
g = ConsoleColor_MakeColor( cColor, c );
g = ConsoleColor_MakeColor( cColor, c );
bHaveColor = false;
}
*pDst = g;

View File

@ -64,7 +64,7 @@
// Console Help Color
#define CHC_DEFAULT "`0"
#define CHC_USAGE "`3"
#define CHC_CATEGORY "`6"
#define CHC_CATEGORY "`6" // Cyan
#define CHC_COMMAND "`2" // Green
#define CHC_KEY "`1" // Red
#define CHC_ARG_MAND "`7" // < >

View File

@ -129,13 +129,15 @@ void Disk2InterfaceCard::SetLastReadTrackSector(int track, int physical)
}
}
int Disk2InterfaceCard::GetCurrentDrive(void) { return m_currDrive; }
int Disk2InterfaceCard::GetCurrentTrack(void) { return ImagePhaseToTrack(m_floppyDrive[m_currDrive].m_disk.m_imagehandle, m_floppyDrive[m_currDrive].m_phasePrecise, false); }
float Disk2InterfaceCard::GetCurrentPhase(void) { return m_floppyDrive[m_currDrive].m_phasePrecise; }
UINT Disk2InterfaceCard::GetCurrentBitOffset(void) { return m_floppyDrive[m_currDrive].m_disk.m_bitOffset; }
UINT Disk2InterfaceCard::GetCurrentBitOffset (void) { return m_floppyDrive[m_currDrive].m_disk.m_bitOffset; }
double Disk2InterfaceCard::GetCurrentExtraCycles(void) { return m_floppyDrive[m_currDrive].m_disk.m_extraCycles; }
float Disk2InterfaceCard::GetCurrentPhase (void) { return m_floppyDrive[m_currDrive].m_phasePrecise; }
int Disk2InterfaceCard::GetCurrentDrive (void) { return m_currDrive; }
BYTE Disk2InterfaceCard::GetCurrentShiftReg (void) { return m_shiftReg; }
int Disk2InterfaceCard::GetCurrentTrack (void) { return ImagePhaseToTrack(m_floppyDrive[m_currDrive].m_disk.m_imagehandle, m_floppyDrive[m_currDrive].m_phasePrecise, false); }
float Disk2InterfaceCard::GetPhase(const int drive) { return m_floppyDrive[drive].m_phasePrecise; }
int Disk2InterfaceCard::GetTrack(const int drive) { return ImagePhaseToTrack(m_floppyDrive[drive].m_disk.m_imagehandle, m_floppyDrive[drive].m_phasePrecise, false); }
int Disk2InterfaceCard::GetTrack(const int drive) { return ImagePhaseToTrack(m_floppyDrive[drive].m_disk.m_imagehandle, m_floppyDrive[drive].m_phasePrecise, false); }
std::string Disk2InterfaceCard::FormatIntFracString(float phase, bool hex)
{
@ -159,24 +161,34 @@ std::string Disk2InterfaceCard::GetCurrentPhaseString(void)
return FormatIntFracString(m_floppyDrive[m_currDrive].m_phasePrecise, true);
}
LPCTSTR Disk2InterfaceCard::GetCurrentState(void)
LPCTSTR Disk2InterfaceCard::GetCurrentState(Disk_Status_e& eDiskState_)
{
if (m_floppyDrive[m_currDrive].m_disk.m_imagehandle == NULL)
return "Empty";
{
eDiskState_ = DISK_STATUS_EMPTY;
}
else
if (!m_floppyMotorOn)
{
if (m_floppyDrive[m_currDrive].m_spinning > 0)
return "Off (spinning)";
{
eDiskState_ = DISK_STATUS_SPIN;
}
else
return "Off";
{
eDiskState_ = DISK_STATUS_OFF;
}
}
else if (m_seqFunc.writeMode)
{
if (m_floppyDrive[m_currDrive].m_disk.m_bWriteProtected)
return "Writing (write protected)";
{
eDiskState_ = DISK_STATUS_PROT;
}
else
return "Writing";
{
eDiskState_ = DISK_STATUS_WRITE;
}
}
else
{
@ -188,8 +200,22 @@ LPCTSTR Disk2InterfaceCard::GetCurrentState(void)
return "Reading write protect state (not write protected)";
}
else*/
return "Reading";
{
eDiskState_ = DISK_STATUS_READ;
}
}
static const char *aDiskStateMiniDesc[NUM_DISK_STATUS] =
{
"Off" // DISK_STATUS_OFF
,"R" // DISK_STATUS_READ
,"W" // DISK_STATUS_WRITE
,"WP" // DISK_STATUS_PROT
,"n/a" // DISK_STATUS_EMPTY
,"Spin" // DISK_STATUS_SPIN
};
return aDiskStateMiniDesc[eDiskState_];
}
//===========================================================================
@ -793,7 +819,7 @@ Disk_Status_e Disk2InterfaceCard::GetDriveLightStatus(const int drive)
}
}
return DISK_STATUS_OFF;
return DISK_STATUS_EMPTY;
}
void Disk2InterfaceCard::GetLightStatus(Disk_Status_e *pDisk1Status, Disk_Status_e *pDisk2Status)
@ -1159,6 +1185,9 @@ void __stdcall Disk2InterfaceCard::ReadWrite(WORD pc, WORD addr, BYTE bWrite, BY
#endif
}
// GH #1212 We have a non .WOZ disk, mirror so that GetCurrentShiftReg() returns last nibble read
m_shiftReg = m_floppyLatch;
if (++pFloppy->m_byte >= pFloppy->m_nibbles)
pFloppy->m_byte = 0;
}

View File

@ -160,19 +160,21 @@ public:
bool IsConditionForFullSpeed(void);
void NotifyInvalidImage(const int drive, LPCTSTR pszImageFilename, const ImageError_e Error);
UINT GetCurrentFirmware(void) { return m_is13SectorFirmware ? 13 : 16; }
void SetLastReadTrackSector(int track, int sector);
int GetCurrentDrive(void);
int GetCurrentTrack(void);
float GetCurrentPhase(void);
UINT GetCurrentBitOffset(void);
UINT GetCurrentFirmware(void) { return m_is13SectorFirmware ? 13 : 16; }
double GetCurrentExtraCycles(void);
float GetCurrentPhase(void);
int GetCurrentDrive(void);
BYTE GetCurrentShiftReg(void);
int GetCurrentTrack(void);
float GetPhase(const int drive);
int GetTrack(const int drive);
static std::string FormatIntFracString(float phase, bool hex);
std::string GetCurrentTrackString(void);
std::string GetCurrentPhaseString(void);
LPCTSTR GetCurrentState(void);
LPCTSTR GetCurrentState(Disk_Status_e& eDiskState_);
bool UserSelectNewDiskImage(const int drive, LPCSTR pszFilename="");
bool DriveSwap(void);
bool IsDriveConnected(int drive) { return m_floppyDrive[drive].m_isConnected; }

View File

@ -45,10 +45,12 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
enum Disk_Status_e
{
DISK_STATUS_OFF ,
DISK_STATUS_OFF , // motor is off
DISK_STATUS_READ ,
DISK_STATUS_WRITE,
DISK_STATUS_PROT ,
DISK_STATUS_PROT , // NOTE: GetDriveLightStatus() and GetCurrentState() return slightly different states
DISK_STATUS_EMPTY, // See: GetCurrentState(); no disk image mounted
DISK_STATUS_SPIN , // See: GetCurrentState(), motor has been turned off, spinning before stopping
NUM_DISK_STATUS
};

View File

@ -202,11 +202,11 @@ void MockingboardCard::Get6522IrqDescription(std::string& desc)
// EG, to do a "AY1 LATCH", then write 6522 ORB with b4:3=%01, b2:0=%111
//
void MockingboardCard::WriteToORB(BYTE subunit)
void MockingboardCard::WriteToORB(BYTE subunit, BYTE subunitForAY/*=0*/)
{
BYTE value = m_MBSubUnit[subunit].sy6522.Read(SY6522::rORB);
if ((QueryType() == CT_MockingboardC || QueryType() == CT_Phasor) && // Not CT_MegaAudio
if ((QueryType() == CT_MockingboardC || QueryType() == CT_Phasor) && // Not CT_MegaAudio/CT_SDMusic
subunit == 0 && // SC01 only at $Cn00 (not $Cn80)
m_MBSubUnit[subunit].sy6522.Read(SY6522::rPCR) == 0xB0)
{
@ -246,7 +246,10 @@ void MockingboardCard::WriteToORB(BYTE subunit)
}
else
{
AY8910_Write(subunit, AY8913_DEVICE_A, value);
if (QueryType() == CT_SDMusic)
AY8910_Write(subunitForAY, AY8913_DEVICE_A, value);
else
AY8910_Write(subunit, AY8913_DEVICE_A, value);
}
#endif
}
@ -257,7 +260,7 @@ void MockingboardCard::AY8910_Write(BYTE subunit, BYTE ay, BYTE value)
{
m_regAccessedFlag = true;
MB_SUBUNIT* pMB = &m_MBSubUnit[subunit];
SY6522& r6522 = pMB->sy6522;
SY6522& r6522 = (QueryType() != CT_SDMusic) ? pMB->sy6522 : m_MBSubUnit[0].sy6522;
if ((value & 4) == 0)
{
@ -647,8 +650,7 @@ BYTE MockingboardCard::IOReadInternal(WORD PC, WORD nAddr, BYTE bWrite, BYTE nVa
#endif
// NB. Mockingboard: SSI263.bit7 not readable (TODO: check this with real h/w)
const BYTE offset = nAddr & 0xff;
const BYTE subunit = (offset < SY6522B_Offset) ? SY6522_DEVICE_A : SY6522_DEVICE_B;
const BYTE subunit = QueryType() == CT_SDMusic ? SY6522_DEVICE_A : !(nAddr & 0x80) ? SY6522_DEVICE_A : SY6522_DEVICE_B;
const BYTE reg = nAddr & 0xf;
return m_MBSubUnit[subunit].sy6522.Read(reg);
}
@ -748,15 +750,25 @@ BYTE MockingboardCard::IOWriteInternal(WORD PC, WORD nAddr, BYTE bWrite, BYTE nV
return 0;
}
const BYTE offset = nAddr & 0xff;
const BYTE subunit = (offset < SY6522B_Offset) ? SY6522_DEVICE_A : SY6522_DEVICE_B;
const BYTE reg = nAddr & 0xf;
m_MBSubUnit[subunit].sy6522.Write(reg, nValue);
if (reg == SY6522::rORB)
WriteToORB(subunit);
if (QueryType() == CT_SDMusic)
{
const BYTE subunit = SY6522_DEVICE_A; // Only one 6522
const BYTE reg = nAddr & 0xf;
m_MBSubUnit[subunit].sy6522.Write(reg, nValue);
if (reg == SY6522::rORB)
WriteToORB(subunit, !(nAddr & 0x80) ? SY6522_DEVICE_A : SY6522_DEVICE_B);
}
else
{
const BYTE subunit = !(nAddr & 0x80) ? SY6522_DEVICE_A : SY6522_DEVICE_B;
const BYTE reg = nAddr & 0xf;
m_MBSubUnit[subunit].sy6522.Write(reg, nValue);
if (reg == SY6522::rORB)
WriteToORB(subunit);
}
#if !DBG_MB_SS_CARD
if (QueryType() == CT_MockingboardC || QueryType() == CT_Phasor) // Not CT_MegaAudio
if (QueryType() == CT_MockingboardC || QueryType() == CT_Phasor) // Not CT_MegaAudio/CT_SDMusic
{
if (nAddr & 0x40)
m_MBSubUnit[1].ssi263.Write(nAddr & 0x7, nValue); // 2nd 6522 is used for 1st speech chip
@ -1164,6 +1176,12 @@ std::string MockingboardCard::GetSnapshotCardNameMegaAudio(void)
return name;
}
std::string MockingboardCard::GetSnapshotCardNameSDMusic(void)
{
static const std::string name("SD Music");
return name;
}
void MockingboardCard::SaveSnapshot(YamlSaveHelper& yamlSaveHelper)
{
if (QueryType() == CT_Phasor)
@ -1174,6 +1192,8 @@ void MockingboardCard::SaveSnapshot(YamlSaveHelper& yamlSaveHelper)
std::string cardName = GetSnapshotCardName();
if (QueryType() == CT_MegaAudio)
cardName = GetSnapshotCardNameMegaAudio();
else if (QueryType() == CT_SDMusic)
cardName = GetSnapshotCardNameSDMusic();
YamlSaveHelper::Slot slot(yamlSaveHelper, cardName, m_slot, kUNIT_VERSION);

View File

@ -69,6 +69,7 @@ public:
static std::string GetSnapshotCardName(void);
static std::string GetSnapshotCardNamePhasor(void);
static std::string GetSnapshotCardNameMegaAudio(void);
static std::string GetSnapshotCardNameSDMusic(void);
private:
enum MockingboardUnitState_e { AY_NOP0, AY_NOP1, AY_INACTIVE, AY_READ, AY_NOP4, AY_NOP5, AY_WRITE, AY_LATCH };
@ -101,7 +102,7 @@ private:
}
};
void WriteToORB(BYTE subunit);
void WriteToORB(BYTE subunit, BYTE subunitForAY=0);
void AY8910_Write(BYTE subunit, BYTE ay, BYTE value);
void UpdateIFRandIRQ(MB_SUBUNIT* pMB, BYTE clr_mask, BYTE set_mask);

View File

@ -42,7 +42,13 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
bool MockingboardCardManager::IsMockingboard(UINT slot)
{
SS_CARDTYPE type = GetCardMgr().QuerySlot(slot);
return type == CT_MockingboardC || type == CT_Phasor || type == CT_MegaAudio;
return type == CT_MockingboardC || type == CT_Phasor || IsMockingboardExtraCardType(slot);
}
bool MockingboardCardManager::IsMockingboardExtraCardType(UINT slot)
{
SS_CARDTYPE type = GetCardMgr().QuerySlot(slot);
return type == CT_MegaAudio || type == CT_SDMusic;
}
void MockingboardCardManager::ReinitializeClock(void)
@ -162,6 +168,20 @@ void MockingboardCardManager::SetVolume(DWORD volume, DWORD volumeMax)
}
}
bool MockingboardCardManager::GetEnableExtraCardTypes(void)
{
// Scan slots for any extra card types
// . eg. maybe started a new AppleWin (with empty cmd line), but with Registry's slot 4 = CT_MegaAudio
// Otherwise, Config->Sound will show slot as "Unavailable"
for (UINT i = SLOT0; i < NUM_SLOTS; i++)
{
if (IsMockingboardExtraCardType(i))
return true;
}
return m_enableExtraCardTypes;
}
#ifdef _DEBUG
void MockingboardCardManager::CheckCumulativeCycles(void)
{

View File

@ -13,6 +13,7 @@ public:
m_cyclesThisAudioFrame = 0;
m_userVolume = 0;
m_outputToRiff = false;
m_enableExtraCardTypes = false;
// NB. Cmd line has already been processed
LogFileOutput("MBCardMgr::ctor() g_bDisableDirectSound=%d, g_bDisableDirectSoundMockingboard=%d\n", g_bDisableDirectSound, g_bDisableDirectSoundMockingboard);
@ -31,6 +32,8 @@ public:
DWORD GetVolume(void);
void SetVolume(DWORD volume, DWORD volumeMax);
void OutputToRiff(void) { m_outputToRiff = true; }
void SetEnableExtraCardTypes(bool enable) { m_enableExtraCardTypes = enable; }
bool GetEnableExtraCardTypes(void);
void Destroy(void);
void Reset(const bool powerCycle)
@ -49,6 +52,7 @@ private:
bool Init(void);
UINT GenerateAllSoundData(void);
void MixAllAndCopyToRingBuffer(UINT nNumSamples);
bool IsMockingboardExtraCardType(UINT slot);
static const unsigned short NUM_MB_CHANNELS = 2;
static const DWORD SOUNDBUFFER_SIZE = MAX_SAMPLES * sizeof(short) * NUM_MB_CHANNELS;
@ -66,4 +70,5 @@ private:
UINT m_cyclesThisAudioFrame;
DWORD m_userVolume; // GUI's slide volume
bool m_outputToRiff;
bool m_enableExtraCardTypes;
};

View File

@ -866,6 +866,9 @@ static void RepeatInitialization(void)
if (g_cmdLine.bRemoveNoSlotClock)
MemRemoveNoSlotClock();
if (g_cmdLine.supportExtraMBCardTypes)
GetCardMgr().GetMockingboardCardMgr().SetEnableExtraCardTypes(true);
if (g_cmdLine.noDisk2StepperDefer)
GetCardMgr().GetDisk2CardMgr().SetStepperDefer(false);

View File

@ -68,8 +68,9 @@ static const DWORD g_aDiskFullScreenColorsLED[ NUM_DISK_STATUS ] =
RGB( 0, 0, 0), // DISK_STATUS_OFF BLACK
RGB( 0,255, 0), // DISK_STATUS_READ GREEN
RGB(255, 0, 0), // DISK_STATUS_WRITE RED
RGB(255,128, 0) // DISK_STATUS_PROT ORANGE
// RGB( 0, 0,255) // DISK_STATUS_PROT -blue-
RGB(255,128, 0), // DISK_STATUS_PROT ORANGE
RGB( 0, 0,255), // DISK_STATUS_EMPTY -blue-
RGB( 0,128,128) // DISK_STATUS_SPIN -cyan-
};
void Win32Frame::SetAltEnterToggleFullScreen(bool mode)
@ -227,6 +228,8 @@ void Win32Frame::CreateGdiObjects(void)
g_hDiskWindowedLED[ DISK_STATUS_READ ] = (HBITMAP)LOADBUTTONBITMAP(TEXT("DISKREAD_BITMAP"));
g_hDiskWindowedLED[ DISK_STATUS_WRITE] = (HBITMAP)LOADBUTTONBITMAP(TEXT("DISKWRITE_BITMAP"));
g_hDiskWindowedLED[ DISK_STATUS_PROT ] = (HBITMAP)LOADBUTTONBITMAP(TEXT("DISKPROT_BITMAP"));
g_hDiskWindowedLED[ DISK_STATUS_EMPTY] = (HBITMAP)LOADBUTTONBITMAP(TEXT("DISKOFF_BITMAP"));
g_hDiskWindowedLED[ DISK_STATUS_SPIN ] = (HBITMAP)LOADBUTTONBITMAP(TEXT("DISKREAD_BITMAP"));
btnfacebrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
btnfacepen = CreatePen(PS_SOLID,1,GetSysColor(COLOR_BTNFACE));