mirror of
https://github.com/AppleWin/AppleWin.git
synced 2024-06-03 13:29:40 +00:00
Sync to master
This commit is contained in:
commit
57f076dde7
|
@ -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...
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 };
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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" // < >
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue
Block a user