예제 #1
0
        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;
        }
예제 #2
0
 static void CalcTailleSect(CPCEMUSect Sect)
 {
     TailleSect = Sect.SectSize > 0 ? Sect.SectSize : 128 << Sect.N;
     Weak       = (Sect.SectSize / TailleSect) - 1;
     if (TailleSect > 0x1800)
     {
         TailleSect = 0x1800;
     }
 }
예제 #3
0
        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;
        }
예제 #4
0
        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);
        }