Timer counters now 64-bit;
Cleaned up floppy code a lot and reverted to single poller; Fixed segment present bit and limit checking at read/write within segment; The ASUS boards now have memregs too; RTC code improved based on suggestion by Sarah Walker; Fixed SVGA odd/even emulation and added chain odd/even support; Removed non-existent CPU's.
This commit is contained in:
392
src/disc_fdi.c
392
src/disc_fdi.c
@@ -19,23 +19,15 @@ static struct
|
||||
} fdi[2];
|
||||
|
||||
static uint8_t fdi_timing[256*1024];
|
||||
#if 0
|
||||
static int fdi_pos;
|
||||
static int fdi_revs;
|
||||
|
||||
static int fdi_sector, fdi_track, fdi_side, fdi_drive, fdi_density, fdi_n;
|
||||
static int fdi_inread, fdi_inwrite, fdi_readpos, fdi_inreadaddr;
|
||||
#endif
|
||||
|
||||
static int fdi_pos[2];
|
||||
static int fdi_revs[2];
|
||||
|
||||
static int fdi_sector[2], fdi_track[2], fdi_side[2], fdi_drive[2], fdi_density[2], fdi_n[2];
|
||||
static int fdi_inread[2], fdi_inwrite[2], fdi_readpos[2], fdi_inreadaddr[2];
|
||||
|
||||
static uint16_t CRCTable[256];
|
||||
|
||||
static int pollbytesleft[2]={0, 0},pollbitsleft[2]={0, 0};
|
||||
static int pollbytesleft=0,pollbitsleft=0;
|
||||
|
||||
int fdi_realtrack(int drive, int track)
|
||||
{
|
||||
@@ -75,19 +67,6 @@ void fdi_init()
|
||||
fdi_setupcrc(0x1021, 0xcdb4);
|
||||
}
|
||||
|
||||
int fdi_hole(int drive)
|
||||
{
|
||||
switch (fdi2raw_get_bit_rate(fdi[drive].h))
|
||||
{
|
||||
case 1000:
|
||||
return 2;
|
||||
case 500:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int fdi_byteperiod(int drive)
|
||||
{
|
||||
switch (fdi2raw_get_bit_rate(fdi[drive].h))
|
||||
@@ -100,6 +79,19 @@ int fdi_byteperiod(int drive)
|
||||
return 26;
|
||||
case 250:
|
||||
return 32;
|
||||
default:
|
||||
return 32;
|
||||
}
|
||||
}
|
||||
|
||||
int fdi_hole(int drive)
|
||||
{
|
||||
switch (fdi2raw_get_bit_rate(fdi[drive].h))
|
||||
{
|
||||
case 1000:
|
||||
return 2;
|
||||
case 500:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -173,7 +165,7 @@ void fdi_seek(int drive, int track)
|
||||
else
|
||||
{
|
||||
memset(fdi[drive].track_data[1][density], 0, 65536);
|
||||
fdi[drive].tracklen[0][density] = fdi[drive].tracklen[1][density] = 10000;
|
||||
fdi[drive].tracklen[1][density] = fdi[drive].tracklen[1][density] = 10000;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -185,97 +177,97 @@ void fdi_writeback(int drive, int track)
|
||||
|
||||
void fdi_readsector(int drive, int sector, int track, int side, int rate, int sector_size)
|
||||
{
|
||||
fdi_revs[drive] = 0;
|
||||
fdi_sector[drive] = sector;
|
||||
fdi_track[drive] = track;
|
||||
fdi_side[drive] = side;
|
||||
fdi_n[drive] = sector_size;
|
||||
// fdi_drive = drive;
|
||||
fdi_revs = 0;
|
||||
fdi_sector = sector;
|
||||
fdi_track = track;
|
||||
fdi_side = side;
|
||||
fdi_n = sector_size;
|
||||
fdi_drive = drive;
|
||||
if (rate == 2)
|
||||
fdi_density[drive] = 1;
|
||||
fdi_density = 1;
|
||||
if (rate == 0)
|
||||
fdi_density[drive] = 2;
|
||||
fdi_density = 2;
|
||||
if (rate == 3)
|
||||
fdi_density[drive] = 3;
|
||||
fdi_density = 3;
|
||||
|
||||
// pclog("FDI Read sector %i %i %i %i %i\n",drive,side,track,sector, fdi_density);
|
||||
// if (pollbytesleft)
|
||||
// pclog("In the middle of a sector!\n");
|
||||
|
||||
fdi_inread[drive] = 1;
|
||||
fdi_inwrite[drive] = 0;
|
||||
fdi_inreadaddr[drive] = 0;
|
||||
fdi_readpos[drive] = 0;
|
||||
fdi_inread = 1;
|
||||
fdi_inwrite = 0;
|
||||
fdi_inreadaddr = 0;
|
||||
fdi_readpos = 0;
|
||||
}
|
||||
|
||||
void fdi_writesector(int drive, int sector, int track, int side, int rate, int sector_size)
|
||||
{
|
||||
fdi_revs[drive] = 0;
|
||||
fdi_sector[drive] = sector;
|
||||
fdi_track[drive] = track;
|
||||
fdi_side[drive] = side;
|
||||
fdi_n[drive] = sector_size;
|
||||
// fdi_drive = drive;
|
||||
fdi_revs = 0;
|
||||
fdi_sector = sector;
|
||||
fdi_track = track;
|
||||
fdi_side = side;
|
||||
fdi_n = sector_size;
|
||||
fdi_drive = drive;
|
||||
if (rate == 2)
|
||||
fdi_density[drive] = 1;
|
||||
fdi_density = 1;
|
||||
if (rate == 0)
|
||||
fdi_density[drive] = 2;
|
||||
fdi_density = 2;
|
||||
if (rate == 3)
|
||||
fdi_density[drive] = 3;
|
||||
fdi_density = 3;
|
||||
// pclog("Write sector %i %i %i %i\n",drive,side,track,sector);
|
||||
|
||||
fdi_inread[drive] = 0;
|
||||
fdi_inwrite[drive] = 1;
|
||||
fdi_inreadaddr[drive] = 0;
|
||||
fdi_readpos[drive] = 0;
|
||||
fdi_inread = 0;
|
||||
fdi_inwrite = 1;
|
||||
fdi_inreadaddr = 0;
|
||||
fdi_readpos = 0;
|
||||
}
|
||||
|
||||
void fdi_readaddress(int drive, int track, int side, int rate)
|
||||
{
|
||||
fdi_revs[drive] = 0;
|
||||
fdi_track[drive] = track;
|
||||
fdi_side[drive] = side;
|
||||
// fdi_drive = drive;
|
||||
fdi_revs = 0;
|
||||
fdi_track = track;
|
||||
fdi_side = side;
|
||||
fdi_drive = drive;
|
||||
if (rate == 2)
|
||||
fdi_density[drive] = 1;
|
||||
fdi_density = 1;
|
||||
if (rate == 0)
|
||||
fdi_density[drive] = 2;
|
||||
fdi_density = 2;
|
||||
if (rate == 3)
|
||||
fdi_density[drive] = 3;
|
||||
fdi_density = 3;
|
||||
// pclog("Read address %i %i %i %i %i %p\n",drive,side,track, rate, fdi_density, &fdi_inreadaddr);
|
||||
|
||||
fdi_inread[drive] = 0;
|
||||
fdi_inwrite[drive] = 0;
|
||||
fdi_inreadaddr[drive] = 1;
|
||||
fdi_readpos[drive] = 0;
|
||||
fdi_inread = 0;
|
||||
fdi_inwrite = 0;
|
||||
fdi_inreadaddr = 1;
|
||||
fdi_readpos = 0;
|
||||
}
|
||||
|
||||
void fdi_format(int drive, int track, int side, int rate, uint8_t fill)
|
||||
{
|
||||
fdi_revs[drive] = 0;
|
||||
fdi_track[drive] = track;
|
||||
fdi_side[drive] = side;
|
||||
// fdi_drive = drive;
|
||||
fdi_revs = 0;
|
||||
fdi_track = track;
|
||||
fdi_side = side;
|
||||
fdi_drive = drive;
|
||||
if (rate == 2)
|
||||
fdi_density[drive] = 1;
|
||||
fdi_density = 1;
|
||||
if (rate == 0)
|
||||
fdi_density[drive] = 2;
|
||||
fdi_density = 2;
|
||||
if (rate == 3)
|
||||
fdi_density[drive] = 3;
|
||||
fdi_density = 3;
|
||||
// pclog("Format %i %i %i\n",drive,side,track);
|
||||
|
||||
fdi_inread[drive] = 0;
|
||||
fdi_inwrite[drive] = 1;
|
||||
fdi_inreadaddr[drive] = 0;
|
||||
fdi_readpos[drive] = 0;
|
||||
fdi_inread = 0;
|
||||
fdi_inwrite = 1;
|
||||
fdi_inreadaddr = 0;
|
||||
fdi_readpos = 0;
|
||||
}
|
||||
|
||||
static uint16_t fdi_buffer[2];
|
||||
static int readidpoll[2]={0, 0},readdatapoll[2]={0, 0},fdi_nextsector[2]={0, 0},inreadop[2]={0, 0};
|
||||
static uint8_t fdi_sectordat[2][1026];
|
||||
static int lastfdidat[2][2],sectorcrc[2][2];
|
||||
static int sectorsize[2],fdc_sectorsize[2];
|
||||
static int ddidbitsleft[2]={0, 0};
|
||||
static uint16_t fdi_buffer;
|
||||
static int readidpoll=0,readdatapoll=0,fdi_nextsector=0,inreadop=0;
|
||||
static uint8_t fdi_sectordat[1026];
|
||||
static int lastfdidat[2],sectorcrc[2];
|
||||
static int sectorsize,fdc_sectorsize;
|
||||
static int ddidbitsleft=0;
|
||||
|
||||
static uint8_t decodefm(uint16_t dat)
|
||||
{
|
||||
@@ -295,216 +287,216 @@ static uint8_t decodefm(uint16_t dat)
|
||||
void fdi_stop(int drive)
|
||||
{
|
||||
// pclog("fdi_stop\n");
|
||||
fdi_inread[drive] = fdi_inwrite[drive] = fdi_inreadaddr[drive] = 0;
|
||||
fdi_nextsector[drive] = ddidbitsleft[drive] = pollbitsleft[drive] = 0;
|
||||
fdi_inread = fdi_inwrite = fdi_inreadaddr = 0;
|
||||
fdi_nextsector = ddidbitsleft = pollbitsleft = 0;
|
||||
}
|
||||
|
||||
static uint16_t crc[2];
|
||||
static uint16_t crc;
|
||||
|
||||
static void calccrc(int drive, uint8_t byte)
|
||||
static void calccrc(uint8_t byte)
|
||||
{
|
||||
crc[drive] = (crc[drive] << 8) ^ CRCTable[(crc[drive] >> 8)^byte];
|
||||
crc = (crc << 8) ^ CRCTable[(crc >> 8)^byte];
|
||||
}
|
||||
|
||||
static int fdi_indextime_blank[2] = {6250 * 8, 6250 * 8};
|
||||
int fdi_poll(int drive)
|
||||
static int fdi_indextime_blank = 6250 * 8;
|
||||
void fdi_poll()
|
||||
{
|
||||
int tempi, c;
|
||||
int bitcount;
|
||||
|
||||
for (bitcount = 0; bitcount < 16; bitcount++)
|
||||
{
|
||||
if (fdi_pos[drive] >= fdi[drive].tracklen[fdi_side[drive]][fdi_density[drive]])
|
||||
if (fdi_pos >= fdi[fdi_drive].tracklen[fdi_side][fdi_density])
|
||||
{
|
||||
fdi_pos[drive] = 0;
|
||||
if (fdi[drive].tracklen[fdi_side[drive]][fdi_density[drive]])
|
||||
fdi_pos = 0;
|
||||
if (fdi[fdi_drive].tracklen[fdi_side][fdi_density])
|
||||
fdc_indexpulse();
|
||||
else
|
||||
{
|
||||
fdi_indextime_blank[drive]--;
|
||||
if (!fdi_indextime_blank[drive])
|
||||
fdi_indextime_blank--;
|
||||
if (!fdi_indextime_blank)
|
||||
{
|
||||
fdi_indextime_blank[drive] = 6250 * 8;
|
||||
fdi_indextime_blank = 6250 * 8;
|
||||
fdc_indexpulse();
|
||||
}
|
||||
}
|
||||
}
|
||||
tempi = fdi[drive].track_data[fdi_side[drive]][fdi_density[drive]][((fdi_pos[drive] >> 3) & 0xFFFF) ^ 1] & (1 << (7 - (fdi_pos[drive] & 7)));
|
||||
fdi_pos[drive]++;
|
||||
fdi_buffer[drive] <<= 1;
|
||||
fdi_buffer[drive] |= (tempi ? 1 : 0);
|
||||
if (fdi_inwrite[drive])
|
||||
tempi = fdi[fdi_drive].track_data[fdi_side][fdi_density][((fdi_pos >> 3) & 0xFFFF) ^ 1] & (1 << (7 - (fdi_pos & 7)));
|
||||
fdi_pos++;
|
||||
fdi_buffer <<= 1;
|
||||
fdi_buffer |= (tempi ? 1 : 0);
|
||||
if (fdi_inwrite)
|
||||
{
|
||||
fdi_inwrite[drive] = 0;
|
||||
fdi_inwrite = 0;
|
||||
fdc_writeprotect();
|
||||
return 1;
|
||||
return;
|
||||
}
|
||||
if (!fdi_inread[drive] && !fdi_inreadaddr[drive])
|
||||
return 1;
|
||||
if (fdi_pos[drive] == fdi[drive].trackindex[fdi_side[drive]][fdi_density[drive]])
|
||||
if (!fdi_inread && !fdi_inreadaddr)
|
||||
return;
|
||||
if (fdi_pos == fdi[fdi_drive].trackindex[fdi_side][fdi_density])
|
||||
{
|
||||
fdi_revs[drive]++;
|
||||
if (fdi_revs[drive] == 3)
|
||||
fdi_revs++;
|
||||
if (fdi_revs == 3)
|
||||
{
|
||||
// pclog("Not found!\n");
|
||||
fdc_notfound();
|
||||
fdi_inread[drive] = fdi_inreadaddr[drive] = 0;
|
||||
return 1;
|
||||
fdi_inread = fdi_inreadaddr = 0;
|
||||
return;
|
||||
}
|
||||
if (fdi_sector[drive] == SECTOR_FIRST)
|
||||
fdi_sector[drive] = SECTOR_NEXT;
|
||||
if (fdi_sector == SECTOR_FIRST)
|
||||
fdi_sector = SECTOR_NEXT;
|
||||
}
|
||||
if (pollbitsleft[drive])
|
||||
if (pollbitsleft)
|
||||
{
|
||||
pollbitsleft[drive]--;
|
||||
if (!pollbitsleft[drive])
|
||||
pollbitsleft--;
|
||||
if (!pollbitsleft)
|
||||
{
|
||||
pollbytesleft[drive]--;
|
||||
if (pollbytesleft[drive]) pollbitsleft[drive] = 16; /*Set up another word if we need it*/
|
||||
if (readidpoll[drive])
|
||||
pollbytesleft--;
|
||||
if (pollbytesleft) pollbitsleft = 16; /*Set up another word if we need it*/
|
||||
if (readidpoll)
|
||||
{
|
||||
fdi_sectordat[drive][5 - pollbytesleft[drive]] = decodefm(fdi_buffer[drive]);
|
||||
if (fdi_inreadaddr[drive] && !fdc_sectorid)// && pollbytesleft[drive] > 1)
|
||||
fdi_sectordat[5 - pollbytesleft] = decodefm(fdi_buffer);
|
||||
if (fdi_inreadaddr && !fdc_sectorid)// && pollbytesleft > 1)
|
||||
{
|
||||
// rpclog("inreadaddr - %02X\n", fdi_sectordat[drive][5 - pollbytesleft][drive]);
|
||||
fdc_data(fdi_sectordat[drive][5 - pollbytesleft[drive]]);
|
||||
// rpclog("inreadaddr - %02X\n", fdi_sectordat[5 - pollbytesleft]);
|
||||
fdc_data(fdi_sectordat[5 - pollbytesleft]);
|
||||
}
|
||||
if (!pollbytesleft[drive])
|
||||
if (!pollbytesleft)
|
||||
{
|
||||
// pclog("Header over %i,%i %i,%i\n", fdi_sectordat[drive][0], fdi_sectordat[drive][2], fdi_track[drive], fdi_sector[drive]);
|
||||
if ((fdi_sectordat[drive][0] == fdi_track[drive] && (fdi_sectordat[drive][3] == fdi_n[drive]) && (fdi_sectordat[drive][2] == fdi_sector[drive] || fdi_sector[drive] == SECTOR_NEXT)) || fdi_inreadaddr[drive])
|
||||
// pclog("Header over %i,%i %i,%i\n", fdi_sectordat[0], fdi_sectordat[2], fdi_track, fdi_sector);
|
||||
if ((fdi_sectordat[0] == fdi_track && (fdi_sectordat[3] == fdi_n) && (fdi_sectordat[2] == fdi_sector || fdi_sector == SECTOR_NEXT)) || fdi_inreadaddr)
|
||||
{
|
||||
crc[drive] = (fdi_density) ? 0xcdb4 : 0xffff;
|
||||
calccrc(drive, 0xFE);
|
||||
crc = (fdi_density) ? 0xcdb4 : 0xffff;
|
||||
calccrc(0xFE);
|
||||
for (c = 0; c < 4; c++)
|
||||
calccrc(drive, fdi_sectordat[drive][c]);
|
||||
calccrc(fdi_sectordat[c]);
|
||||
|
||||
if ((crc[drive] >> 8) != fdi_sectordat[drive][4] || (crc[drive] & 0xFF) != fdi_sectordat[drive][5])
|
||||
if ((crc >> 8) != fdi_sectordat[4] || (crc & 0xFF) != fdi_sectordat[5])
|
||||
{
|
||||
// pclog("Header CRC error : %02X %02X %02X %02X\n",crc[drive]>>8,crc[drive]&0xFF,fdi_sectordat[drive][4],fdi_sectordat[drive][5]);
|
||||
// pclog("Header CRC error : %02X %02X %02X %02X\n",crc>>8,crc&0xFF,fdi_sectordat[4],fdi_sectordat[5]);
|
||||
// dumpregs();
|
||||
// exit(-1);
|
||||
inreadop[drive] = 0;
|
||||
if (fdi_inreadaddr[drive])
|
||||
inreadop = 0;
|
||||
if (fdi_inreadaddr)
|
||||
{
|
||||
// rpclog("inreadaddr - %02X\n", fdi_sector[drive]);
|
||||
// fdc_data(fdi_sector[drive]);
|
||||
// rpclog("inreadaddr - %02X\n", fdi_sector);
|
||||
// fdc_data(fdi_sector);
|
||||
if (fdc_sectorid)
|
||||
fdc_sectorid(fdi_sectordat[drive][0], fdi_sectordat[drive][1], fdi_sectordat[drive][2], fdi_sectordat[drive][3], fdi_sectordat[drive][4], fdi_sectordat[drive][5]);
|
||||
fdc_sectorid(fdi_sectordat[0], fdi_sectordat[1], fdi_sectordat[2], fdi_sectordat[3], fdi_sectordat[4], fdi_sectordat[5]);
|
||||
else
|
||||
fdc_finishread(drive);
|
||||
fdc_finishread();
|
||||
}
|
||||
else fdc_headercrcerror();
|
||||
return 1;
|
||||
return;
|
||||
}
|
||||
// pclog("Sector %i,%i %i,%i\n", fdi_sectordat[drive][0], fdi_sectordat[drive][2], fdi_track[drive], fdi_sector[drive]);
|
||||
if (fdi_sectordat[drive][0] == fdi_track[drive] && (fdi_sectordat[drive][2] == fdi_sector[drive] || fdi_sector[drive] == SECTOR_NEXT) && fdi_inread[drive] && !fdi_inreadaddr[drive])
|
||||
// pclog("Sector %i,%i %i,%i\n", fdi_sectordat[0], fdi_sectordat[2], fdi_track, fdi_sector);
|
||||
if (fdi_sectordat[0] == fdi_track && (fdi_sectordat[2] == fdi_sector || fdi_sector == SECTOR_NEXT) && fdi_inread && !fdi_inreadaddr)
|
||||
{
|
||||
fdi_nextsector[drive] = 1;
|
||||
readidpoll[drive] = 0;
|
||||
sectorsize[drive] = (1 << (fdi_sectordat[drive][3] + 7)) + 2;
|
||||
fdc_sectorsize[drive] = fdi_sectordat[drive][3];
|
||||
fdi_nextsector = 1;
|
||||
readidpoll = 0;
|
||||
sectorsize = (1 << (fdi_sectordat[3] + 7)) + 2;
|
||||
fdc_sectorsize = fdi_sectordat[3];
|
||||
}
|
||||
if (fdi_inreadaddr[drive])
|
||||
if (fdi_inreadaddr)
|
||||
{
|
||||
if (fdc_sectorid)
|
||||
fdc_sectorid(fdi_sectordat[drive][0], fdi_sectordat[drive][1], fdi_sectordat[drive][2], fdi_sectordat[drive][3], fdi_sectordat[drive][4], fdi_sectordat[drive][5]);
|
||||
fdc_sectorid(fdi_sectordat[0], fdi_sectordat[1], fdi_sectordat[2], fdi_sectordat[3], fdi_sectordat[4], fdi_sectordat[5]);
|
||||
else
|
||||
fdc_finishread(drive);
|
||||
fdi_inreadaddr[drive] = 0;
|
||||
fdc_finishread();
|
||||
fdi_inreadaddr = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (readdatapoll[drive])
|
||||
if (readdatapoll)
|
||||
{
|
||||
// pclog("readdatapoll %i %02x\n", pollbytesleft[drive], decodefm(fdi_buffer[drive]));
|
||||
if (pollbytesleft[drive] > 1)
|
||||
// pclog("readdatapoll %i %02x\n", pollbytesleft, decodefm(fdi_buffer));
|
||||
if (pollbytesleft > 1)
|
||||
{
|
||||
calccrc(drive, decodefm(fdi_buffer[drive]));
|
||||
calccrc(decodefm(fdi_buffer));
|
||||
}
|
||||
else
|
||||
sectorcrc[drive][1 - pollbytesleft[drive]] = decodefm(fdi_buffer[drive]);
|
||||
if (!pollbytesleft[drive])
|
||||
sectorcrc[1 - pollbytesleft] = decodefm(fdi_buffer);
|
||||
if (!pollbytesleft)
|
||||
{
|
||||
fdi_inread[drive] = 0;
|
||||
fdi_inread = 0;
|
||||
//#if 0
|
||||
if ((crc[drive] >> 8) != sectorcrc[drive][0] || (crc[drive] & 0xFF) != sectorcrc[drive][1])// || (fditrack[drive]==79 && fdisect[drive]==4 && fdc_side[drive]&1))
|
||||
if ((crc >> 8) != sectorcrc[0] || (crc & 0xFF) != sectorcrc[1])// || (fditrack==79 && fdisect==4 && fdc_side&1))
|
||||
{
|
||||
// pclog("Data CRC error : %02X %02X %02X %02X %i %04X %02X%02X\n",crc[drive]>>8,crc[drive]&0xFF,sectorcrc[0],sectorcrc[1],fdi_pos,crc,sectorcrc[0],sectorcrc[1]);
|
||||
inreadop[drive] = 0;
|
||||
fdc_data(decodefm(lastfdidat[drive][1]));
|
||||
fdc_finishread(drive);
|
||||
// pclog("Data CRC error : %02X %02X %02X %02X %i %04X %02X%02X\n",crc>>8,crc&0xFF,sectorcrc[0],sectorcrc[1],fdi_pos,crc,sectorcrc[0],sectorcrc[1]);
|
||||
inreadop = 0;
|
||||
fdc_data(decodefm(lastfdidat[1]));
|
||||
fdc_finishread();
|
||||
fdc_datacrcerror();
|
||||
readdatapoll[drive] = 0;
|
||||
return 1;
|
||||
readdatapoll = 0;
|
||||
return;
|
||||
}
|
||||
//#endif
|
||||
// pclog("End of FDI read %02X %02X %02X %02X\n",crc[drive]>>8,crc[drive]&0xFF,sectorcrc[0],sectorcrc[1]);
|
||||
fdc_data(decodefm(lastfdidat[drive][1]));
|
||||
fdc_finishread(drive);
|
||||
// pclog("End of FDI read %02X %02X %02X %02X\n",crc>>8,crc&0xFF,sectorcrc[0],sectorcrc[1]);
|
||||
fdc_data(decodefm(lastfdidat[1]));
|
||||
fdc_finishread();
|
||||
}
|
||||
else if (lastfdidat[drive][1] != 0)
|
||||
fdc_data(decodefm(lastfdidat[drive][1]));
|
||||
lastfdidat[drive][1] = lastfdidat[drive][0];
|
||||
lastfdidat[drive][0] = fdi_buffer[drive];
|
||||
if (!pollbytesleft[drive])
|
||||
readdatapoll[drive] = 0;
|
||||
else if (lastfdidat[1] != 0)
|
||||
fdc_data(decodefm(lastfdidat[1]));
|
||||
lastfdidat[1] = lastfdidat[0];
|
||||
lastfdidat[0] = fdi_buffer;
|
||||
if (!pollbytesleft)
|
||||
readdatapoll = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (fdi_buffer[drive] == 0x4489 && fdi_density[drive])
|
||||
if (fdi_buffer == 0x4489 && fdi_density)
|
||||
{
|
||||
// rpclog("Found sync\n");
|
||||
ddidbitsleft[drive] = 17;
|
||||
ddidbitsleft = 17;
|
||||
}
|
||||
|
||||
if (fdi_buffer[drive] == 0xF57E && !fdi_density[drive])
|
||||
if (fdi_buffer == 0xF57E && !fdi_density)
|
||||
{
|
||||
pollbytesleft[drive] = 6;
|
||||
pollbitsleft[drive] = 16;
|
||||
readidpoll[drive] = 1;
|
||||
pollbytesleft = 6;
|
||||
pollbitsleft = 16;
|
||||
readidpoll = 1;
|
||||
}
|
||||
if ((fdi_buffer[drive] == 0xF56F || fdi_buffer[drive] == 0xF56A) && !fdi_density[drive])
|
||||
if ((fdi_buffer == 0xF56F || fdi_buffer == 0xF56A) && !fdi_density)
|
||||
{
|
||||
if (fdi_nextsector[drive])
|
||||
if (fdi_nextsector)
|
||||
{
|
||||
pollbytesleft[drive] = sectorsize[drive];
|
||||
pollbitsleft[drive] = 16;
|
||||
readdatapoll[drive] = 1;
|
||||
fdi_nextsector[drive] = 0;
|
||||
crc[drive] = 0xffff;
|
||||
if (fdi_buffer[drive] == 0xF56A) calccrc(drive, 0xF8);
|
||||
else calccrc(drive, 0xFB);
|
||||
lastfdidat[drive][0] = lastfdidat[drive][1] = 0;
|
||||
pollbytesleft = sectorsize;
|
||||
pollbitsleft = 16;
|
||||
readdatapoll = 1;
|
||||
fdi_nextsector = 0;
|
||||
crc = 0xffff;
|
||||
if (fdi_buffer == 0xF56A) calccrc(0xF8);
|
||||
else calccrc(0xFB);
|
||||
lastfdidat[0] = lastfdidat[1] = 0;
|
||||
}
|
||||
}
|
||||
if (ddidbitsleft[drive])
|
||||
if (ddidbitsleft)
|
||||
{
|
||||
ddidbitsleft[drive]--;
|
||||
if (!ddidbitsleft[drive] && !readdatapoll[drive])
|
||||
ddidbitsleft--;
|
||||
if (!ddidbitsleft && !readdatapoll)
|
||||
{
|
||||
// printf("ID bits over %04X %02X %i\n",fdibuffer[drive],decodefm(fdibuffer[drive]),fdipos[drive]);
|
||||
if (decodefm(fdi_buffer[drive]) == 0xFE)
|
||||
// printf("ID bits over %04X %02X %i\n",fdibuffer,decodefm(fdibuffer),fdipos);
|
||||
if (decodefm(fdi_buffer) == 0xFE)
|
||||
{
|
||||
// printf("Sector header %i %i\n", fdi_inread[drive], fdi_inreadaddr[drive]);
|
||||
pollbytesleft[drive] = 6;
|
||||
pollbitsleft[drive] = 16;
|
||||
readidpoll[drive] = 1;
|
||||
// printf("Sector header %i %i\n", fdi_inread, fdi_inreadaddr);
|
||||
pollbytesleft = 6;
|
||||
pollbitsleft = 16;
|
||||
readidpoll = 1;
|
||||
}
|
||||
else if (decodefm(fdi_buffer[drive]) == 0xFB)
|
||||
else if (decodefm(fdi_buffer) == 0xFB)
|
||||
{
|
||||
// printf("Data header %i %i\n", fdi_inread[drive], fdi_inreadaddr[drive]);
|
||||
if (fdi_nextsector[drive])
|
||||
// printf("Data header %i %i\n", fdi_inread, fdi_inreadaddr);
|
||||
if (fdi_nextsector)
|
||||
{
|
||||
pollbytesleft[drive] = sectorsize[drive];
|
||||
pollbitsleft[drive] = 16;
|
||||
readdatapoll[drive] = 1;
|
||||
fdi_nextsector[drive] = 0;
|
||||
crc[drive] = 0xcdb4;
|
||||
if (fdi_buffer[drive] == 0xF56A) calccrc(drive, 0xF8);
|
||||
else calccrc(drive, 0xFB);
|
||||
lastfdidat[drive][0] = lastfdidat[drive][1] = 0;
|
||||
pollbytesleft = sectorsize;
|
||||
pollbitsleft = 16;
|
||||
readdatapoll = 1;
|
||||
fdi_nextsector = 0;
|
||||
crc = 0xcdb4;
|
||||
if (fdi_buffer == 0xF56A) calccrc(0xF8);
|
||||
else calccrc(0xFB);
|
||||
lastfdidat[0] = lastfdidat[1] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user