diff --git a/source/Disk.cpp b/source/Disk.cpp index 4ddfbf36..262edd6f 100644 --- a/source/Disk.cpp +++ b/source/Disk.cpp @@ -1100,8 +1100,6 @@ UINT Disk2InterfaceCard::DataLatchReadWriteCommonWOZ(ULONG uExecutedCycles) void __stdcall Disk2InterfaceCard::DataLatchReadWOZ(WORD pc, WORD addr, BYTE d, ULONG uExecutedCycles) { - _ASSERT(!m_floppyWriteMode); - const UINT bitCellRemainder = DataLatchReadWriteCommonWOZ(uExecutedCycles); if (!bitCellRemainder) return; @@ -1115,6 +1113,15 @@ void __stdcall Disk2InterfaceCard::DataLatchReadWOZ(WORD pc, WORD addr, BYTE d, FloppyDrive& drive = m_floppyDrive[m_currDrive]; FloppyDisk& floppy = drive.m_disk; +#if _DEBUG + static int dbgWOZ = 0; + if (dbgWOZ) + { + DumpSectorWOZ(floppy); + //DumpTrackWOZ(floppy); // Enable as necessary + } +#endif + for (UINT i = 0; i < bitCellRemainder; i++) { BYTE n = floppy.m_trackimage[floppy.m_byte]; @@ -1238,6 +1245,133 @@ void __stdcall Disk2InterfaceCard::DataLatchWriteWOZ(WORD pc, WORD addr, BYTE d, //=========================================================================== +#ifdef _DEBUG +// Dump nibbles from current position until 0xDEAA (ie. data epilogue) +void Disk2InterfaceCard::DumpSectorWOZ(FloppyDisk floppy) // pass a copy of m_floppy +{ + BYTE shiftReg = 0; + UINT32 lastNibbles = 0; + UINT zeroCount = 0; + UINT nibbleCount = 0; + + while (1) + { + BYTE n = floppy.m_trackimage[floppy.m_byte]; + BYTE outputBit = (n & floppy.m_bitMask) ? 1 : 0; + + floppy.m_bitMask >>= 1; + if (!floppy.m_bitMask) + { + floppy.m_bitMask = 1 << 7; + floppy.m_byte++; + } + + floppy.m_bitOffset++; + if (floppy.m_bitOffset == floppy.m_bitCount) + { + floppy.m_bitMask = 1 << 7; + floppy.m_bitOffset = 0; + floppy.m_byte = 0; + } + + if (shiftReg == 0 && outputBit == 0) + { + zeroCount++; + continue; + } + + shiftReg <<= 1; + shiftReg |= outputBit; + + if ((shiftReg & 0x80) == 0) + continue; + + nibbleCount++; + + char str[10]; + sprintf(str, "%02X ", shiftReg); + OutputDebugString(str); + if ((nibbleCount & 0xf) == 0) + OutputDebugString("\n"); + + lastNibbles <<= 8; + lastNibbles |= shiftReg; + + if ((lastNibbles & 0xffff) == 0xDEAA) + break; + + shiftReg = 0; + zeroCount = 0; + } +} + +// Dump nibbles from current position bitstream wraps to same position +void Disk2InterfaceCard::DumpTrackWOZ(FloppyDisk floppy) // pass a copy of m_floppy +{ +#ifdef LOG_DISK_NIBBLES_READ + FormatTrack formatTrack; +#endif + + BYTE shiftReg = 0; + UINT nibbleCount = 0; + + floppy.m_bitMask = 1 << 7; + floppy.m_bitOffset = 0; + floppy.m_byte = 0; + + const UINT startBitOffset = floppy.m_bitOffset; + + while (1) + { + BYTE n = floppy.m_trackimage[floppy.m_byte]; + BYTE outputBit = (n & floppy.m_bitMask) ? 1 : 0; + + floppy.m_bitMask >>= 1; + if (!floppy.m_bitMask) + { + floppy.m_bitMask = 1 << 7; + floppy.m_byte++; + } + + floppy.m_bitOffset++; + if (floppy.m_bitOffset == floppy.m_bitCount) + { + floppy.m_bitMask = 1 << 7; + floppy.m_bitOffset = 0; + floppy.m_byte = 0; + } + + if (startBitOffset == floppy.m_bitOffset) + break; + + if (shiftReg == 0 && outputBit == 0) + continue; + + shiftReg <<= 1; + shiftReg |= outputBit; + + if ((shiftReg & 0x80) == 0) + continue; + + nibbleCount++; + + char str[10]; + sprintf(str, "%02X ", shiftReg); + OutputDebugString(str); + if ((nibbleCount % 32) == 0) + OutputDebugString("\n"); + +#ifdef LOG_DISK_NIBBLES_READ + formatTrack.DecodeLatchNibbleRead(shiftReg); +#endif + + shiftReg = 0; + } +} +#endif + +//=========================================================================== + void Disk2InterfaceCard::Reset(const bool bIsPowerCycle/*=false*/) { // RESET forces all switches off (UTAIIe Table 9.1) diff --git a/source/Disk.h b/source/Disk.h index 4ceab3a8..00234557 100644 --- a/source/Disk.h +++ b/source/Disk.h @@ -189,6 +189,9 @@ private: void UpdateBitStreamPosition(FloppyDisk& floppy, const ULONG bitCellDelta); void UpdateBitStreamOffsets(FloppyDisk& floppy); UINT DataLatchReadWriteCommonWOZ(ULONG uExecutedCycles); + void DumpSectorWOZ(FloppyDisk floppy); + void DumpTrackWOZ(FloppyDisk floppy); + void SaveSnapshotFloppy(YamlSaveHelper& yamlSaveHelper, UINT unit); void SaveSnapshotDriveUnit(YamlSaveHelper& yamlSaveHelper, UINT unit); bool LoadSnapshotFloppy(YamlLoadHelper& yamlLoadHelper, UINT unit, UINT version, std::vector& track);