269 lines
9.1 KiB
C
269 lines
9.1 KiB
C
/* $NetBSD: iwmreg.h,v 1.3 1999/03/27 05:45:20 scottr Exp $ */
|
|
|
|
/*
|
|
* Copyright (c) 1996-99 Hauke Fath. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. The name of the author may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
#ifndef _MAC68K_IWMREG_H
|
|
#define _MAC68K_IWMREG_H
|
|
|
|
/*
|
|
* iwmreg.h -- Interface declarations for iwm.
|
|
*/
|
|
|
|
#ifndef _LOCORE
|
|
|
|
/*
|
|
* Configuration
|
|
*/
|
|
|
|
/* Virtual Drive flags register */
|
|
enum {
|
|
IWM_DS_DISK = 0x01,
|
|
IWM_NO_DISK = 0x02,
|
|
IWM_MOTOR_OFF = 0x04,
|
|
IWM_WRITEABLE = 0x08,
|
|
IWM_DD_DISK = 0x10,
|
|
IWM_NO_DRIVE = 0x80000000
|
|
};
|
|
|
|
/*
|
|
* Access
|
|
*/
|
|
enum {
|
|
noErr = 0, /* All went well */
|
|
noDriveErr = -64, /* Drive not installed */
|
|
offLinErr = -65, /* R/W requested for an offline drive */
|
|
noNybErr = -66, /* Disk is probably blank */
|
|
noAdrMkErr = -67, /* Can't find an address mark */
|
|
dataVerErr = -68, /* Read verify compare failed */
|
|
badCkSmErr = -69, /* Bad address mark checksum */
|
|
badBtSlpErr = -70, /* Bad address mark (no lead-out) */
|
|
noDtaMkErr = -71, /* Could not find a data mark */
|
|
badDCkSum = -72, /* Bad data mark checksum */
|
|
badDBtSlp = -73, /* One of the data mark bit slip */
|
|
/* nibbles was incorrect. */
|
|
wrUnderRun = -74, /* Could not write fast enough to */
|
|
/* keep up with the IWM */
|
|
cantStepErr = -75, /* Step handshake failed during seek */
|
|
tk0BadErr = -76, /* Track 00 sensor does not change */
|
|
/* during head calibration */
|
|
initIWMErr = -77, /* Unable to initialize IWM */
|
|
twoSideErr = -78, /* Tried to access a double-sided disk */
|
|
/* on a single-sided drive (400K drive) */
|
|
spAdjErr = -79, /* Can't adjust drive speed (400K drive) */
|
|
seekErr = -80, /* Wrong track number read in a sector's */
|
|
/* address field */
|
|
sectNFErr = -81, /* Sector number never found on a track */
|
|
fmt1Err = -82, /* Can't find sector 0 after track format */
|
|
fmt2Err = -83, /* Can't get enough sync */
|
|
verErr = -84 /* Track failed to verify */
|
|
};
|
|
|
|
#define IWM_TAG_SIZE 20 /* That's what "SonyEqu.a" says */
|
|
|
|
|
|
/* Buffer for sector header data */
|
|
struct sectorHdr {
|
|
u_int8_t side;
|
|
u_int8_t track;
|
|
u_int8_t sector;
|
|
u_int8_t Tags[IWM_TAG_SIZE];
|
|
};
|
|
typedef struct sectorHdr sectorHdr_t;
|
|
|
|
/*
|
|
* Cylinder cache data structure
|
|
* Cyl buffer is allocated in fdopen() and deallocated in fdclose().
|
|
*
|
|
* The "valid" flag is overloaded as "dirty" flag when writing
|
|
* to disk.
|
|
*/
|
|
struct cylCacheSlot {
|
|
unsigned char *secbuf; /* ptr to one sector buffer */
|
|
int32_t valid; /* content valid for cur. cylinder? */
|
|
};
|
|
typedef struct cylCacheSlot cylCacheSlot_t;
|
|
|
|
|
|
#else /* _LOCORE */
|
|
|
|
|
|
/*
|
|
* Assembler equates for IWM, kept here to ensure consistency.
|
|
* Modelled after <sys/disklabel.h>
|
|
*/
|
|
|
|
/*
|
|
* Offsets into data structures
|
|
*/
|
|
/* sectorHdr_t */
|
|
.equ o_side, 0
|
|
.equ o_track, 1
|
|
.equ o_sector, 2
|
|
.equ o_Tags, 3
|
|
|
|
/* cylCacheSlot_t */
|
|
.equ o_secbuf, 0
|
|
.equ o_valid, 4
|
|
|
|
/*
|
|
* Parameter (a6) offsets from <mac68k/obio/iwm_fdvar.h>
|
|
*
|
|
* int iwmReadSector __P((sectorHdr_t *hdr, cylCacheSlot_t *r_slots,
|
|
* caddr_t buf))
|
|
* int iwmWriteSector __P((sectorHdr_t *hdr, cylCacheSlot_t *w_slots))
|
|
*/
|
|
.equ o_hdr, 8
|
|
.equ o_rslots, 12
|
|
.equ o_wslots, 12
|
|
.equ o_buf, 16
|
|
|
|
|
|
/*
|
|
* I/O base addresses
|
|
*/
|
|
.global _Via1Base /* in machdep.c */
|
|
.global _IOBase
|
|
.global _IWMBase /* in iwm_fd.c */
|
|
|
|
/*
|
|
* Offsets from IWM base address
|
|
* Lines are set by any memory access to corresponding address (IM III-34/-44).
|
|
* The SWIM has actual registers at these addresses, so writing to them
|
|
* in IWM mode is a no-no.
|
|
*/
|
|
.equ ph0L, 0x0000 /* CA0 off (0) */
|
|
.equ ph0H, 0x0200 /* CA0 on (1) */
|
|
.equ ph1L, 0x0400 /* CA1 off (0) */
|
|
.equ ph1H, 0x0600 /* CA1 on (1) */
|
|
.equ ph2L, 0x0800 /* CA2 off (0) */
|
|
.equ ph2H, 0x0A00 /* CA2 on (1) */
|
|
.equ ph3L, 0x0C00 /* LSTRB off (low) */
|
|
.equ ph3H, 0x0E00 /* LSTRB on (high) */
|
|
.equ mtrOff, 0x1000 /* disk enable off */
|
|
.equ mtrOn, 0x1200 /* disk enable on */
|
|
.equ intDrive, 0x1400 /* select internal drive */
|
|
.equ extDrive, 0x1600 /* select external drive */
|
|
.equ q6L, 0x1800 /* Q6 off */
|
|
.equ q6H, 0x1A00 /* Q6 on */
|
|
.equ q7L, 0x1C00 /* Q7 off */
|
|
.equ q7H, 0x1E00 /* Q7 on */
|
|
|
|
|
|
/*
|
|
* VIA Disk SEL line
|
|
*/
|
|
.equ vBufA, 0x1E00 /* Offset from vBase to register A */
|
|
/* (IM III-43) */
|
|
.equ vHeadSel, 5 /* Multi-purpose line (SEL) */
|
|
.equ vHeadSelMask, 0x0020 /* Corresponding bit mask */
|
|
|
|
|
|
/*
|
|
* Disk registers
|
|
* bit 0 - CA2, bit 1 - SEL, bit 2 - CA0, bit 3 - CA1 IM III name
|
|
*/
|
|
|
|
/* Status */
|
|
.equ stepDirection, 0x0000 /* Direction of next head step */
|
|
/* 0 = in, 1 = out (DIRTN) */
|
|
.equ rdDataFrom0, 0x0001 /* Set up drive to read data from */
|
|
/* head 0 (RDDATA0) */
|
|
.equ diskInserted, 0x0002 /* Disk inserted */
|
|
/* 0 = yes, 1 = no (CSTIN) */
|
|
.equ rdDataFrom1, 0x0003 /* Set up drive to read data from */
|
|
/* head 1 (RDDATA1) */
|
|
.equ stillStepping, 0x0004 /* Drive is still stepping */
|
|
/* 0 = yes, 1 = no (STEP) */
|
|
.equ writeProtected, 0x0006 /* Disk is locked */
|
|
/* 0 = yes, 1 = no (WRTPRT) */
|
|
.equ drvMotorState, 0x0008 /* Drive motor is on */
|
|
/* 0 = yes, 1 = no (MOTORON) */
|
|
.equ singleSided, 0x0009 /* Drive is single-sided */
|
|
/* 0 = yes, 1 = no (SIDES) */
|
|
.equ atTrack00, 0x000A /* Head is at track 00 */
|
|
/* 0 = yes, 1 = no (TK0) */
|
|
.equ headLoaded, 0x000B /* Head loaded, drive is ready */
|
|
/* 0 = yes, 1 = no () */
|
|
.equ drvInstalled, 0x000D /* Disk drive installed */
|
|
/* 0 = yes, 1 = no () */
|
|
.equ tachPulse, 0x000E /* Tachometer pulse (60 /rev.) */
|
|
/* 0 = yes, 1 = no (TACH) */
|
|
.equ diskIsHD, 0x000F /* HD disk detected */
|
|
/* 0 = yes, 1 = no (DRVIN) */
|
|
|
|
/* Commands */
|
|
.equ stepInCmd, 0x0000 /* Head step direction in (DIRTN) */
|
|
.equ stepOutCmd, 0x0001 /* Head step direction out (DIRTN+1) */
|
|
.equ doStepCmd, 0x0004 /* Step head (STEP) */
|
|
.equ motorOnCmd, 0x0008 /* Switch drive motor on (MOTORON) */
|
|
.equ motorOffCmd, 0x0009 /* Switch drive motor off (MOTOROFF) */
|
|
.equ ejectDiskCmd, 0x000D /* Eject disk from drive (EJECT) */
|
|
|
|
|
|
/*
|
|
* Low level disk errors
|
|
* For simplicity, they are given the MacOS names and numbers.
|
|
*/
|
|
.equ noErr, 0 /* All went well */
|
|
.equ noDriveErr, -64 /* Drive not installed */
|
|
.equ offLinErr, -65 /* R/W requested for an offline drive */
|
|
.equ noNybErr, -66 /* Disk is probably blank */
|
|
.equ noAdrMkErr, -67 /* Can't find an address mark */
|
|
.equ dataVerErr, -68 /* Read verify compare failed */
|
|
.equ badCkSmErr, -69 /* Bad address mark checksum */
|
|
.equ badBtSlpErr, -70 /* Bad address mark (no lead-out) */
|
|
.equ noDtaMkErr, -71 /* Could not find a data mark */
|
|
.equ badDCkSum, -72 /* Bad data mark checksum */
|
|
.equ badDBtSlp, -73 /* One of the data mark bit slip */
|
|
/* nibbles was incorrect. */
|
|
.equ wrUnderRun, -74 /* Could not write fast enough to */
|
|
/* keep up with the IWM */
|
|
.equ cantStepErr, -75 /* Step handshake failed during seek */
|
|
.equ tk0BadErr, -76 /* Track 00 sensor does not change */
|
|
/* during head calibration */
|
|
.equ initIWMErr, -77 /* Unable to initialize IWM */
|
|
.equ twoSideErr, -78 /* Tried to access a double-sided disk */
|
|
/* on a single-sided drive (400K drive) */
|
|
.equ spAdjErr, -79 /* Can't adjust drive speed (400K drive) */
|
|
.equ seekErr, -80 /* Wrong track number read in a */
|
|
/* sector's address field */
|
|
.equ sectNFErr, -81 /* Sector number never found on a track */
|
|
.equ fmt1Err, -82 /* Can't find sector 0 after */
|
|
/* track format */
|
|
.equ fmt2Err, -83 /* Can't get enough sync */
|
|
.equ verErr, -84 /* Track failed to verify */
|
|
|
|
/*
|
|
* Misc constants
|
|
*/
|
|
.equ iwmMode, 0x17 /* SWIM switch */
|
|
.equ maxGCRSectors, 12 /* Max. sectors per track for GCR */
|
|
|
|
|
|
#endif /* _LOCORE */
|
|
|
|
#endif /* _MAC68K_IWMREG_H */
|