/* Read OPUS * Convert a standard 40 Trk single side OPUS disk to a DOS file * ******************************************************* * Roelof : should have a flag for 1 or 2 sides * a flag for 256 or 512 sect len (16 or 8 sects) * 'double step' adjusts the head movement for 40 tracks ******************************************************* * The disk is converted into a contigious file in the following layout: * 0..255 Track 0, Sector 0 * 256..511 Track 0, Sector 1 * etc. */ #include #include #include #include #include "readopus.h" FILE *output ; void set_double_step ( void ) { char far *drive_0_media_state; // Point into BIOS memory drive_0_media_state = MK_FP ( 0x0040,0x0090 ); // enable "double stepping" bit *drive_0_media_state = ( *drive_0_media_state | 0x30 ); } void set_sector_size ( int size ) { struct dpt far * far *param_table ; param_table = MK_FP (0000,0x0078); (*param_table)-> sector_size = size ; } int fd_recal (int drive) { union REGS in, out; in.h.ah = 0x11; in.h.dl = drive; int86 (0x13, &in, &out); return out.h.ah; } int main() { int i, side=0, track=0, sector=0 ; output = fopen ( "OPUS.OUT", "wb"); if ( ! output ) printf ("Unable to create file : OPUS.OUT"); fd_recal ( 0 ); set_sector_size ( SECTOR_256 ); set_double_step (); for (track=0;track<40;track++) { for ( sector=0;sector<18;sector++) { int result; result = read_sectors (0, side, track, sector,1 ); printf ( "SIDE : %2d, TRACK : %2d, SECTOR : %2d = %d\n", side,track,sector,result); } } set_sector_size ( SECTOR_512 ); fclose (output); } void reset_fdc () // Issue int13, subfn 00 to reset the floppy controller { union REGS in, out; in.h.ah = 0; in.h.dl = 0; int86 (0x13, &in, &out); } int read_sectors ( int drive, int side, int track, int sector, int numsectors ) { union REGS in, out; struct SREGS seg; char *buffer; size_t num_written; buffer = malloc ( numsectors * BPS ); if ( ! buffer ) { printf ( "Insufficient memory\n" ); exit (1); } // Copy params in.h.ah = 2; in.h.dl = drive; in.h.dh = side; in.h.ch = track; in.h.cl = sector; in.h.al = numsectors; // Pass buffer address in.x.bx = FP_OFF ( buffer ); seg.es = FP_SEG ( buffer ); int86x ( 0x13, &in, &out, &seg ); // showbuffer (buffer) fwrite ( buffer, 1, numsectors * BPS, output ); free (buffer); return out.h.ah; }