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
}