#include #define DSK_MAX_TRACKS 85 #define FDC_MAX_SECTORS 20 #define FDC_NUM_DRIVES 4 typedef struct DISC_DRIVE_s { unsigned int write_protect; // 0,1 FILE *fd; unsigned int tracks; unsigned int track_table[85*2]; // max pocet stop int active_track; // track, nebo -1 } DISC_DRIVE_t; typedef struct FDContr_s { unsigned int motor; unsigned int track; unsigned int sector; unsigned int side; // 0,1 unsigned int status_reg; unsigned int hd; // 0,1 unsigned int int_enabled; // 0,1 DISC_DRIVE_t disc_drive[FDC_NUM_DRIVES]; } FDContr_t; struct FDContr_s fdc; int open_disk ( DISC_DRIVE_t *d_drive, char *dsk_filename) { int i; if ( ! ( d_drive->fd = fopen ( dsk_filename, "r" ) )) { perror ( "Can't open file." ); return ( 1 ); }; d_drive->active_track=-1; fseek ( d_drive->fd, 0x30, SEEK_SET); d_drive->tracks = fgetc ( d_drive->fd ); if ( d_drive->tracks > DSK_MAX_TRACKS ) { printf( "Error: DSK_MAX_TRACKS exceed!\n" ); return ( 1 ); }; // printf("Track table:\n============\n"); fseek ( d_drive->fd, 0x34, SEEK_SET); for ( i = 0; i < d_drive->tracks * 2; i++ ) { d_drive->track_table[i] = fgetc ( d_drive->fd ); // bugfix: u HD disket je spatne uvedena Sharp stopa if ( i == 1 ) { if ( d_drive->track_table[i] == 0x18 ) { d_drive->track_table[i] = 0x11; }; }; // printf ("%i\n", d_drive->track_table[i] ); }; // printf("\n\n"); return ( 0 ); }; void open_track( DISC_DRIVE_t *d_drive, unsigned int track, unsigned int side) { int i; long track_offset = 0; long sector_offset = 0; unsigned int sectors; int real_size; for ( i = 0; i < ((track * 2) + side); i++) { track_offset += d_drive->track_table[i] * 256; // printf ("o: %i (trk: %i) = %X\n", i, d_drive->track_table[i], track_offset); }; fseek ( d_drive->fd, track_offset + 0x0100 + 0x10, SEEK_SET); printf ( "Track: %02X, ", fgetc ( d_drive->fd ) ); printf ( "side: %i, ", fgetc ( d_drive->fd ) ); fseek ( d_drive->fd, track_offset + 0x0100 + 0x14, SEEK_SET); printf ( "sec_size: %i, ", fgetc ( d_drive->fd ) * 256 ); sectors = fgetc ( d_drive->fd ); printf ( "sectors: %i, ", sectors ); // GAP#3 length ? // filler byte ? printf ( "GAP#3: %i, ", fgetc ( d_drive->fd ) ); printf ( "filler: %i,", fgetc ( d_drive->fd ) ); printf ( "T-offset: %X\n", track_offset + 0x0100 ); fseek ( d_drive->fd, track_offset + 0x0100 + 0x18, SEEK_SET); for ( i = 1; i <= sectors; i++ ) { printf( "\ts_track: %i, ", fgetc ( d_drive->fd ) ); printf( "s_side: %i, ", fgetc ( d_drive->fd ) ); printf( "s_sector: %x, ", fgetc ( d_drive->fd ) ); printf( "s_size: %i, ", fgetc ( d_drive->fd ) * 256 ); printf( "FDCreg1: %i, ", fgetc ( d_drive->fd ) ); printf( "FDCreg2: %i, ", fgetc ( d_drive->fd ) ); real_size = fgetc ( d_drive->fd ); real_size += fgetc ( d_drive->fd ) * 0x100; printf( "size: %i, ", real_size ); printf( "offset: %X\n", track_offset + sector_offset + 0x0100 + 0x0100); sector_offset += real_size; }; }; int main(void) { int i; // resetovat fdc // otevrit disk a nacist info o stopach fdc.track = 0; fdc.sector = 0; fdc.side = 0; if ( open_disk( &fdc.disc_drive[ fdc.motor&0x03 ], "hryhd1.dsk" ) ) { return ( 1 ); }; printf ( "Tracks: %i\n", fdc.disc_drive[ 0 ].tracks ); for ( i = 0; i < fdc.disc_drive[ 0 ].tracks; i++ ) { open_track( &fdc.disc_drive[ 0 ], i, 0); open_track( &fdc.disc_drive[ 0 ], i, 1); }; return ( 0 ); };