static void SetSecteur(int index) { int HoleIndex = 0; int tmpC = 0, tmpH = 0, tmpR = 0, tmpN = 0; if (UnitSel < 2 && Dsk[UnitSel].ImageOk) { while (HoleIndex < 2) { CPCEMUSect Sect = CurrTrackDatasDSK[UnitSel][HeadSel].Sect[IndexSecteur]; if (IndexSecteur == index) { ST0 &= ~ST0_IC1; ST1 = Sect.ST1 & (ST1_DE | ST1_ND | ST1_MA); ST2 = Sect.ST2 & (ST2_CM | ST2_CRC | ST2_MD); CalcTailleSect(Sect); return; } if (NextSecteur(ref tmpC, ref tmpH, ref tmpR, ref tmpN) == 0) { HoleIndex++; } } } ST0 |= ST0_IC1; ST1 |= ST1_ND; }
static void CalcTailleSect(CPCEMUSect Sect) { TailleSect = Sect.SectSize > 0 ? Sect.SectSize : 128 << Sect.N; Weak = (Sect.SectSize / TailleSect) - 1; if (TailleSect > 0x1800) { TailleSect = 0x1800; } }
static void RechercheSecteur(int findC, int findH, int findR, int findN, int Eot) { int HoleIndex = 0; int tmpC = 0, tmpH = 0, tmpR = 0, tmpN = 0; if (UnitSel < 2 && Dsk[UnitSel].ImageOk) { while (HoleIndex < 2) { CPCEMUSect Sect = CurrTrackDatasDSK[UnitSel][HeadSel].Sect[IndexSecteur]; if (Sect.R == findR) { if (Sect.C == findC) { ST2 &= ~ST2_WC; ST2 &= ~ST2_BC; if (Sect.H == findH && Sect.N == findN) { ST0 &= ~ST0_IC1; ST1 = Sect.ST1 & (ST1_DE | ST1_ND | ST1_MA); ST2 = Sect.ST2 & (ST2_CM | ST2_CRC | ST2_MD); CalcTailleSect(Sect); if (findR == Eot) { ST1 |= ST1_EN; } return; } } else { ST2 |= ST2_WC; if (Sect.C == 0xFF) { ST2 |= ST2_BC; } break; } } if (NextSecteur(ref tmpC, ref tmpH, ref tmpR, ref tmpN) == 0) { HoleIndex++; } } } ST0 |= ST0_IC1; ST1 |= ST1_ND; }
static int NextSecteur(ref int sectC, ref int sectH, ref int sectR, ref int sectN) { if (UnitSel < 2 && Dsk[UnitSel].ImageOk) { // Calcule la "position" du secteur actuel int i, tps = 146 * 32; // 146 octets avant le premier secteur for (i = 0; i <= IndexSecteur; i++) { tps += 0; // ### } ST1 &= ~ST1_ND; CPCEMUSect Sect = CurrTrackDatasDSK[UnitSel][HeadSel].Sect[IndexSecteur]; CalcTailleSect(Sect); PosData += TailleSect + PosWeak; PosWeak += TailleSect; if (PosWeak > TailleSect * Weak) { PosWeak = 0; } if (++IndexSecteur >= CurrTrackDatasDSK[UnitSel][HeadSel].NbSect) { IndexSecteur = 0; PosData = 0; } Sect = CurrTrackDatasDSK[UnitSel][HeadSel].Sect[IndexSecteur]; sectC = Sect.C; sectH = Sect.H; sectR = Sect.R; sectN = Sect.N; } else { sectC = sectH = sectR = sectN = 0xFF; } return(IndexSecteur); }