Top secrets sources NedoPC pentevo

Rev

Rev 800 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

#pragma once

struct SECHDR
{
    unsigned char c, s, n, l;
    unsigned short crc; // CRC çàãîëîâêà ñåêòîðà

    // ôëàãè crc çîíû àäðåñà è äàííûõ:
    // Ïðè ôîðìàòèðîâàíèè:
    //   0 - ãåíåðèðóåòñÿ ïðàâèëüíîå çíà÷åíèå crc
    //   1 - çàïèñü crc èç crc(äëÿ àäðåñà)/crcd(äëÿ äàííûõ)
    //   2 - îøèáî÷íûé crc (ãåíåðèðóåòñÿ èíâåðñèåé ïðàâèëüíîãî crc))
    // Ïðè ÷òåíèè (ôóíêöèÿ seek óñòàíàâëèâàåò ïîëÿ c1 è c2):
    //   0 - ðàññ÷èòàííîå crc íå ñîâïàäàåò ñ óêàçàííûì â çàãîëîâêå (âîçâðàùàåòñÿ crc error)
    //   1 - ðàññ÷èòàííîå crc ñîâïàäàåò ñ óêàçàííûì â çàãîëîâêå
    unsigned char c1, c2;
   
    // Óêàçàòåëü íà äàííûå ñåêòîðà âíóòðè òðýêà
    // Ïðè ôîðìàòèðîâàíèè ñïåèöàëüíîå çíà÷åíèå:
    //   1 -çàïîëíÿòü ñåêòîð íóëÿìè
    u8 *data;
    u8 *id; // Óêàçàòåëü íà çàãîëîâîê ñåêòîðà âíóòðè òðýêà
    u8 *wp; // Óêàçàòåëü íà áèòîâóþ êàðòó ñáîéíûõ áàéòîâ ñåêòîðà âíóòðè òðýêà (èñïîëüçóåòñÿ òîëüêî ïðè çàãðóçêå)
    unsigned wp_start; // Íîìåð ïåðâîãî áèòà â êàðòå ñáîéíûõ áàéòîâ (îòíîñèòåëüíî íà÷àëà òðýêà) äëÿ äàííîãî ñåêòîðà

    // Ðàçìåð ñåêòîðà â áàéòàõ
    // Ïðè ôîðìàòèðîâàíèè:
    //   0 - Ðàçìåð ñåêòîðà áåðåòñÿ êàê (128 << n) & SectorSizeMask
    unsigned datlen;
    unsigned crcd;        // used to load specific CRC from FDI-file

    // Èñïîëüçóþòñÿ äëÿ .dsk ôîðìàòà
    static constexpr u8 FL_DDAM{ 0b00000001 };
    u8 Flags = 0;
};

enum SEEK_MODE
{
    JUST_SEEK = 0, LOAD_SECTORS = 1
};

static inline bool test_bit(const u8 *data, unsigned bit)
{
    return (data[bit >> 3] & (1U << (bit & 7))) != 0;
}

static inline void set_bit(u8 *data, unsigned bit)
{
    data[bit >> 3] |= (1U << (bit & 7));
}

static inline void clr_bit(u8 *data, unsigned bit)
{
    data[bit >> 3] &= ~(1U << (bit & 7));
}


struct TRKCACHE
{
    // cached track position
    struct FDD *drive;
    unsigned cyl, side; // Ôèçè÷åñêèå ïàðàìåòðû

    // generic track data
    unsigned trklen;
    // pointer to data inside UDI
    u8 *trkd; // äàííûå (ìîæåò áûòü NULL, åñëè òðýê áåç äàííûõ)
    u8 *trki; // áèòîâàÿ êàðòà ñèíõðîèìïóëüñîâ
    u8 *trkwp; // áèòîâàÿ êàðòà ñáîéíûõ áàéòîâ
    unsigned ts_byte;                 // cpu.t per byte
    SEEK_MODE sf;                     // flag: is sectors filled
    unsigned s;                       // no. of sectors
    // sectors on track
    SECHDR hdr[MAX_SEC];

    void set_i(unsigned pos)
    {
        set_bit(trki, pos);
    }
    void clr_i(unsigned pos)
    {
        clr_bit(trki, pos);
    }
    bool test_i(unsigned pos)
    {
        return test_bit(trki, pos);
    }

    void set_wp(unsigned pos)
    {
        set_bit(trkwp, pos);
    }
    bool test_wp(unsigned pos)
    {
        return test_bit(trkwp, pos);
    }

    void write(unsigned pos, unsigned char byte, u8 index)
    {
        if(!trkd)
            return;

        trkd[pos] = byte;
        if(index)
            set_i(pos);
        else
            clr_i(pos);
    }

    void seek(FDD *d, unsigned cyl, unsigned side, SEEK_MODE fs);
    void format(); // before use, call seek(d,c,s,JUST_SEEK), set s and hdr[]
    unsigned write_sector(unsigned sec, unsigned l, unsigned char *data); // call seek(d,c,s,LOAD_SECTORS)
    const SECHDR *get_sector(unsigned sec, unsigned l) const; // before use, call fill(d,c,s,LOAD_SECTORS)

    void dump();
    void clear()
    {
        drive = nullptr;
        trkd = nullptr;
        ts_byte = Z80FQ / (MAX_TRACK_LEN * FDD_RPS);
    }
    TRKCACHE()
    {
        clear();
    }
};

struct FDD
{
    u8 Id;
    // drive data

    __int64 motor;       // 0 - not spinning, >0 - time when it'll stop
    unsigned char track; // head position

    // disk data

    unsigned char *rawdata;              // used in VirtualAlloc/VirtualFree
    unsigned rawsize;

    // Íà÷àëüíîå ÷èñëî äîðîæåê (ïðè çàãðóçêå îáðàçà èëè ïðè ñîçäàíèè ïóñòîãî äèñêà), ìîæåò áûòü óâåëè÷åíî äî MAX_CYLS
    // ïóòåì ôîðàòèðîâàíèÿ äîïîëíèòåëüíûõ äîðîæåê óòèëèòàìè òèïà ADS è ïîäîáíûõ
    unsigned cyls;
    unsigned sides;
    unsigned trklen[MAX_CYLS][2];
    u8 *trkd[MAX_CYLS][2]; // äàííûå
    u8 *trki[MAX_CYLS][2]; // áèòîâûå êàðòû ñèíõðîèìïóëüñîâ
    u8 *trkwp[MAX_CYLS][2]; // áèòîâûå êàðòû ñáîéíûõ áàéòîâ
    unsigned char optype; // bits: 0-not modified, 1-write sector, 2-format track
    unsigned char snaptype;

    TRKCACHE t; // used in read/write image
    char name[0x200];
    char dsc[0x200];

    char test();
    void free();
    int index();

    void format_trd(unsigned CylCnt); // Èñïîëüçóåòñÿ òîëüêî äëÿ wldr_trd
    void emptydisk(unsigned FreeSecCnt); // Èñïîëüçóåòñÿ òîëüêî äëÿ wldr_trd
    int addfile(unsigned char *hdr, unsigned char *data); // Èñïîëüçóåòñÿ òîëüêî äëÿ wldr_trd
    void addboot(); // Èñïîëüçóåòñÿ òîëüêî äëÿ wldr_trd

    void set_i(unsigned c, unsigned s, unsigned pos)
    {
        set_bit(trki[c][s], pos);
    }

    void newdisk(unsigned cyls, unsigned sides);

    int read(unsigned char snType);

    int read_scl();
    int read_hob();
    int read_trd();
    int write_trd(FILE *ff);
    int read_fdi();
    int write_fdi(FILE *ff);
    int read_td0();
    int write_td0(FILE *ff);
    int read_udi();
    int write_udi(FILE *ff);

    void format_isd();
    int read_isd();
    int write_isd(FILE *ff);

    void format_pro();
    int read_pro();
    int write_pro(FILE *ff);

    int read_dsk();
    int read_ipf();

    ~FDD()
    {
        free();
    }
};

bool done_fdd(bool Cancelable);