This is gcr.c in view mode; [Download] [Up]
/* * gcr.c - GCR handling. * * Written by * Daniel Sladic (sladic@eecg.toronto.edu) * Andreas Boose (boose@unixserv.rz.fh-hannover.de) * * This file is part of VICE, the Versatile Commodore Emulator. * See README for copyright notice. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. * */ #include "vice.h" #include <stdio.h> #include <fcntl.h> #include <ctype.h> #include <string.h> #include "gcr.h" /* GCR handling. */ static BYTE GCR_conv_data[16] = { 0x0a, 0x0b, 0x12, 0x13, 0x0e, 0x0f, 0x16, 0x17, 0x09, 0x19, 0x1a, 0x1b, 0x0d, 0x1d, 0x1e, 0x15 }; static BYTE From_GCR_conv_data[32] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0,12, 4, 5, 0, 0, 2, 3, 0,15, 6, 7, 0, 9,10,11, 0,13,14, 0 }; void convert_4bytes_to_GCR(BYTE *buffer, BYTE *ptr) { *ptr = GCR_conv_data[(*buffer) >> 4] << 3; *ptr |= GCR_conv_data[(*buffer) & 0x0f] >> 2; ptr++; *ptr = GCR_conv_data[(*buffer) & 0x0f] << 6; buffer++; *ptr |= GCR_conv_data[(*buffer) >> 4] << 1; *ptr |= GCR_conv_data[(*buffer) & 0x0f] >> 4; ptr++; *ptr = GCR_conv_data[(*buffer) & 0x0f] << 4; buffer++; *ptr |= GCR_conv_data[(*buffer) >> 4] >> 1; ptr++; *ptr = GCR_conv_data[(*buffer) >> 4] << 7; *ptr |= GCR_conv_data[(*buffer) & 0x0f] << 2; buffer++; *ptr |= GCR_conv_data[(*buffer) >> 4] >> 3; ptr++; *ptr = GCR_conv_data[(*buffer) >> 4] << 5; *ptr |= GCR_conv_data[(*buffer) & 0x0f]; } void convert_GCR_to_4bytes(BYTE *buffer, BYTE *ptr) { BYTE gcr_bytes[8]; int i; gcr_bytes[0] = (*buffer) >> 3; gcr_bytes[1] = ((*buffer) & 0x07) << 2; buffer++; gcr_bytes[1] |= (*buffer) >> 6; gcr_bytes[2] = ((*buffer) & 0x3e) >> 1; gcr_bytes[3] = ((*buffer) & 0x01) << 4; buffer++; gcr_bytes[3] |= ((*buffer) & 0xf0) >> 4; gcr_bytes[4] = ((*buffer) & 0x0f) << 1; buffer++; gcr_bytes[4] |= (*buffer) >> 7; gcr_bytes[5] = ((*buffer) & 0x7c) >> 2; gcr_bytes[6] = ((*buffer) & 0x03) << 3; buffer++; gcr_bytes[6] |= ((*buffer) & 0xe0) >> 5; gcr_bytes[7] = (*buffer) & 0x1f; for (i = 0; i < 4; i++, ptr++) { *ptr = From_GCR_conv_data[gcr_bytes[2 * i]] << 4; *ptr |= From_GCR_conv_data[gcr_bytes[2 * i + 1]]; } } void convert_sector_to_GCR(BYTE *buffer, BYTE *ptr, int track, int sector, BYTE diskID1, BYTE diskID2) { int i; BYTE buf[4]; memset(ptr, 0xff, 5); /* Sync */ ptr += 5; buf[0] = 0x08; /* Header identifier */ buf[1] = sector ^ track ^ diskID2 ^ diskID1; buf[2] = sector; buf[3] = track; convert_4bytes_to_GCR(buf, ptr); ptr += 5; buf[0] = diskID2; buf[1] = diskID1; buf[2] = buf[3] = 0x0f; convert_4bytes_to_GCR(buf, ptr); ptr += 5; memset(ptr, 0x55, 9); /* Header Gap */ ptr += 9; memset(ptr, 0xff, 5); /* Sync */ ptr += 5; for (i = 0; i < 65; i++) { convert_4bytes_to_GCR(buffer, ptr); buffer += 4; ptr += 5; } /* FIXME: This is approximated. */ memset(ptr, 0x55, 6); /* Gap before next sector. */ ptr += 6; } void convert_GCR_to_sector(BYTE *buffer, BYTE *ptr, BYTE *GCR_track_start_ptr, int GCR_current_track_size) { BYTE *offset = ptr; BYTE *GCR_track_end = GCR_track_start_ptr + GCR_current_track_size; char GCR_header[5]; int i, j; for (i = 0; i < 65; i++) { for (j = 0; j < 5; j++) { GCR_header[j] = *(offset++); if (offset >= GCR_track_end) offset = GCR_track_start_ptr; } convert_GCR_to_4bytes(GCR_header, buffer); buffer += 4; } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.