C64Lib.Core.Job1541.sector2gcr C# (CSharp) Method

sector2gcr() private method

private sector2gcr ( int track, int sector ) : void
track int
sector int
return void
        void sector2gcr(int track, int sector)
        {
            byte[] block = new byte[256];
            byte[] buf = new byte[4];
            int p = (track - 1) * GCR_TRACK_SIZE + sector * GCR_SECTOR_SIZE;

            read_sector(track, sector, block);

            // Create GCR header
            gcr_data[p++] = 0xff;						// SYNC
            buf[0] = 0x08;							    // Header mark
            buf[1] = (byte)(sector ^ track ^ id2 ^ id1);// Checksum
            buf[2] = (byte)(sector);
            buf[3] = (byte)(track);
            gcr_conv4(buf, gcr_data, 0, p);
            buf[0] = id2;
            buf[1] = id1;
            buf[2] = 0x0f;
            buf[3] = 0x0f;
            gcr_conv4(buf, gcr_data, 0, p + 5);
            p += 10;
            memset(gcr_data, p, 0x55, 9);			// Gap
            p += 9;

            // Create GCR data
            byte sum;
            gcr_data[p++] = 0xff;					// SYNC
            buf[0] = 0x07;							// Data mark
            sum = buf[1] = block[0];
            sum ^= buf[2] = block[1];
            sum ^= buf[3] = block[2];
            gcr_conv4(buf, gcr_data, 0, p);
            p += 5;
            for (int i = 3; i < 255; i += 4)
            {
                sum ^= buf[0] = block[i];
                sum ^= buf[1] = block[i + 1];
                sum ^= buf[2] = block[i + 2];
                sum ^= buf[3] = block[i + 3];
                gcr_conv4(buf, gcr_data, 0, p);
                p += 5;
            }
            sum ^= buf[0] = block[255];
            buf[1] = sum;							// Checksum
            buf[2] = 0;
            buf[3] = 0;
            gcr_conv4(buf, gcr_data, 0, p);
            p += 5;
            memset(gcr_data, p, 0x55, 8);           // Gap
        }