/* * fdc.h * * header for floppy controller handler * * Copyright (C) 1998 Fabian Nunez * * 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 * * The author can be reached by email at: fabian@cs.uct.ac.za * * or by airmail at: Fabian Nunez * 10 Eastbrooke * Highstead Road * Rondebosch 7700 * South Africa */ #ifndef FDC_H_ #define FDC_H_ #include "mytypes.h" /*! * \ingroup drivers * \defgroup fdc Floppy drive controller * @{ */ /* datatypes */ /* drive geometry */ typedef struct DrvGeom { byte heads; byte tracks; byte spt; /* sectors per track */ } DrvGeom; /* drive geometries */ #define DG144_HEADS 2 /* heads per drive (1.44M) */ #define DG144_TRACKS 80 /* number of tracks (1.44M) */ #define DG144_SPT 18 /* sectors per track (1.44M) */ #define DG144_GAP3FMT 0x54 /* gap3 while formatting (1.44M) */ #define DG144_GAP3RW 0x1b /* gap3 while reading/writing (1.44M) */ #define DG168_HEADS 2 /* heads per drive (1.68M) */ #define DG168_TRACKS 80 /* number of tracks (1.68M) */ #define DG168_SPT 21 /* sectors per track (1.68M) */ #define DG168_GAP3FMT 0x0c /* gap3 while formatting (1.68M) */ #define DG168_GAP3RW 0x1c /* gap3 while reading/writing (1.68M) */ /* IO ports */ #define FDC_DOR (0x3f2) /* Digital Output Register */ #define FDC_MSR (0x3f4) /* Main Status Register (input) */ #define FDC_DRS (0x3f4) /* Data Rate Select Register (output) */ #define FDC_DATA (0x3f5) /* Data Register */ #define FDC_DIR (0x3f7) /* Digital Input Register (input) */ #define FDC_CCR (0x3f7) /* Configuration Control Register (output) */ /* command bytes (these are 765 commands + options such as MFM, etc) */ #define CMD_SPECIFY (0x03) /* specify drive timings */ #define CMD_WRITE (0xc5) /* write data (+ MT,MFM) */ #define CMD_READ (0xe6) /* read data (+ MT,MFM,SK) */ #define CMD_RECAL (0x07) /* recalibrate */ #define CMD_SENSEI (0x08) /* sense interrupt status */ #define CMD_FORMAT (0x4d) /* format track (+ MFM) */ #define CMD_SEEK (0x0f) /* seek track */ #define CMD_VERSION (0x10) /* FDC version */ #define FDC_DOR_ENABLE 0x4 #define FDC_DOR_IRQIO 0x8 #define FDC_DOR_MOTOR0 0x10 #define FDC_DOR_MOTOR1 0x20 #define FDC_DOR_MOTOR2 0x40 #define FDC_DOR_MOTOR3 0x80 #define FDC_CCR_500K 0 #define FDC_CCR_250K 2 typedef struct Fdc Fdc; /* function prototypes */ void fdcInit(Fdc* fdc); void fdcCleanup(Fdc* fdc); void fdcReset(Fdc* fdc); bool fdcDiskChange(Fdc* fdc); void fdcMotorOn(Fdc* fdc); void fdcMotorOff(Fdc* fdc); void fdcRecalibrate(Fdc* fdc); bool fdcSeek(Fdc* fdc, int track); bool fdcLogDisk(Fdc* fdc, DrvGeom *g); bool fdcReadBlock(Fdc* fdc, int block,byte *blockbuff); bool fdcWriteBlock(Fdc* fdc, int block,byte *blockbuff); bool fdcFormatTrack(Fdc* fdc, byte track,DrvGeom *g); //@} #endif /* FDC_H_ */