LSS WIP: boots ProDOS flux woz image

This commit is contained in:
tomcw 2023-11-03 22:16:04 +00:00
parent 572fcbf1d5
commit bba87f8141
2 changed files with 99 additions and 25 deletions

View File

@ -1184,6 +1184,10 @@ void Disk2InterfaceCard::ResetLogicStateSequencer(void)
m_shiftReg = 0;
m_latchDelay = 0;
m_writeStarted = false;
m_LSSState = 0;
m_LSSTicks = 0;
m_LSSCode = 0; // TODO
m_readPulse = 0;
m_dbgLatchDelayedCnt = 0;
m_T00S00PatternIdx = 0;
@ -1561,6 +1565,29 @@ void Disk2InterfaceCard::NextFluxData(FloppyDisk& floppy)
_ASSERT(floppy.m_bitCellCount);
}
void Disk2InterfaceCard::NextLSS(BYTE readPulse)
{
// UTAIIe 9-11(Fig 9.8) & 9-14
// A0 = LSS ROM O5
// A1 = QA
// A2 = SHIFT/LOAD
// A3 = READ/WRITE
// A4 = read pulse' (UTAIIe 9-15: "...inverted in the process to form a negative pulse.")
// A5 = LSS ROM O4
// A6 = LSS ROM O6
// A7 = LSS ROM O7
const BYTE sequence = m_LSSCode & 0xf0;
BYTE addr = ((sequence >> 5) & 0x01) |
((m_shiftReg >> 6) & 0x02) |
(((BYTE)m_seqFunc.loadMode) << 2) |
(((BYTE)m_seqFunc.writeMode) << 3) |
((readPulse ? 0 : 1) << 4) |
((sequence << 1) & 0x20) |
(sequence & 0xC0);
m_LSSCode = m_16SectorLSSROM[addr];
}
void Disk2InterfaceCard::DataLatchReadWOZFlux(WORD pc, WORD addr, UINT ticks)
{
#if LOG_DISK_NIBBLES_READ
@ -1584,35 +1611,76 @@ void Disk2InterfaceCard::DataLatchReadWOZFlux(WORD pc, WORD addr, UINT ticks)
floppy.m_zeroTickCount--;
floppy.m_tickCountdown--;
if (floppy.m_tickCountdown)
continue;
floppy.m_bitCellCount--;
floppy.m_bitOffset++;
const BYTE floppyBit = floppy.m_bitCellCount ? 0 : 1;
if (floppyBit == 0)
if (floppy.m_tickCountdown == 0)
{
if (floppy.m_bitCellCount > 1)
floppy.m_tickCountdown = 0x20;
else if (floppy.m_bitCellCount == 1)
floppy.m_tickCountdown = floppy.m_zeroTickCount; // last one may be eg. 0x1E,0x20,0x22
}
else
{
NextFluxData(floppy);
if (floppy.m_byte == 0)
floppy.m_bitOffset = 0;
floppy.m_bitCellCount--;
floppy.m_bitOffset++;
const BYTE floppyBit = floppy.m_bitCellCount ? 0 : 1;
if (floppyBit == 0)
{
if (floppy.m_bitCellCount > 1)
floppy.m_tickCountdown = 0x20;
else if (floppy.m_bitCellCount == 1)
floppy.m_tickCountdown = floppy.m_zeroTickCount; // last one may be eg. 0x1E,0x20,0x22
}
else
{
NextFluxData(floppy);
if (floppy.m_byte == 0)
floppy.m_bitOffset = 0;
}
drive.m_headWindow <<= 1;
drive.m_headWindow |= floppyBit;
m_readPulse = (drive.m_headWindow & 0xf) ? (drive.m_headWindow >> 1) & 1
: (rand() < RAND_THRESHOLD(3, 10)) ? 1 : 0; // ~30% chance of a 1 bit (Ref: WOZ-2.0)
// NB. Read pulse lasts for one sequencer clock (UTAIIe page 9-29) - ie. 4x 125ns ticks
m_readPulse *= 4;
}
drive.m_headWindow <<= 1;
drive.m_headWindow |= floppyBit;
BYTE outputBit = (drive.m_headWindow & 0xf) ? (drive.m_headWindow >> 1) & 1
: (rand() < RAND_THRESHOLD(3, 10)) ? 1 : 0; // ~30% chance of a 1 bit (Ref: WOZ-2.0)
m_LSSTicks = (++m_LSSTicks) & 3; // 2MHz clock (= 4x 125ns ticks)
if (m_LSSTicks == 0)
{
NextLSS(m_readPulse);
const BYTE code = m_LSSCode & 0x0f;
if (code == CLR)
{
m_shiftReg = 0;
}
else if (code == NOP)
{
// NOP
}
else if (code == SL0)
{
m_shiftReg <<= 1;
}
else if (code == SL1)
{
m_shiftReg <<= 1;
m_shiftReg |= 1;
}
else
{
_ASSERT(0);
}
}
if (m_readPulse)
m_readPulse--;
m_floppyLatch = m_shiftReg;
}
////////////
#if 0
m_shiftReg <<= 1;
m_shiftReg |= outputBit;
m_shiftReg |= readPulse;
if (m_latchDelay)
{
@ -1666,8 +1734,8 @@ void Disk2InterfaceCard::DataLatchReadWOZFlux(WORD pc, WORD addr, UINT ticks)
#endif
}
}
}
#endif
}
void Disk2InterfaceCard::DataLoadWriteWOZ(WORD pc, WORD addr, UINT bitCellRemainder)

View File

@ -221,6 +221,7 @@ private:
void UpdateBitStreamOffsets(FloppyDisk& floppy);
__forceinline void IncBitStream(FloppyDisk& floppy);
void NextFluxData(FloppyDisk& floppy);
void NextLSS(BYTE readPulse);
void DataLatchReadWOZ(WORD pc, WORD addr, UINT bitCellRemainder);
void DataLatchReadWOZFlux(WORD pc, WORD addr, UINT ticks);
void DataLoadWriteWOZ(WORD pc, WORD addr, UINT bitCellRemainder);
@ -271,6 +272,10 @@ private:
static const UINT DISK2_LSS_SIZE = 256;
BYTE m_16SectorLSSROM[DISK2_LSS_SIZE];
BYTE m_LSSState;
BYTE m_LSSTicks;
BYTE m_LSSCode;
BYTE m_readPulse;
WORD m_currDrive;
FloppyDrive m_floppyDrive[NUM_DRIVES];
@ -296,6 +301,7 @@ private:
int m_latchDelay;
bool m_writeStarted;
enum SEQCODE {CLR=0, NOP=8, SL0=9, SR=0xA, LD=0xB, SL1=0xD}; // UTAIIe 9-20
enum SEQFUNC {readSequencing=0, dataShiftWrite, checkWriteProtAndInitWrite, dataLoadWrite}; // UTAIIe 9-14
union SEQUENCER_FUNCTION
{