; ; File: SWIMDefs.aii ; ; Contains: Equates for the IOP based SWIM driver. ; ; Written by: Gary G. Davidian ; ; Copyright: © 1987-1990 by Apple Computer, Inc., all rights reserved. ; ; Change History (most recent first): ; ; <2> 1/2/90 GGD NEEDED FOR ZONE-5: Changes needed to support the Raw Track I/O ; command. ; <1.4> 12/11/89 GGD NEEDED FOR ZONE-5: Added record formats for new DiskDuplicator ; support requests. Added record formats for new Get RAW Data ; support requests. ; <1.3> 7/8/89 CCH Added EASE comments to file. ; <•1.2> 6/15/89 GGD Updated to use equates for the latest rev of the IOP chip, ; re-formated tab stops in source. ; <1.1> 2/5/89 GGD Updated for latest version of SWIMDrvr. ; <1.0> 11/9/88 CCH Adding to EASE. ; ; To Do: ; SwimIOCtlReg equ $3*IODelayCount+$2*IODurationCount ; SWIM Addresses wData equ IOBase+$40 ; Write a data byte wMark equ IOBase+$41 ; Write a mark byte wCRC equ IOBase+$42 ; Write a 2-byte CRC (1 access does both) wIWMConfig equ wCRC ; Set IWM configuration (when StartAction=0) wParams equ IOBase+$43 ; Set the 16 parameter registers wPhase equ IOBase+$44 ; Set phase lines states and directions wSetup equ IOBase+$45 ; Set the current configuration wZeroes equ IOBase+$46 ; Mode reg: 1's clr bits, 0's=don't care wOnes equ IOBase+$47 ; Mode reg: 1's set bits, 0's=don't care rData equ IOBase+$48 ; Read a data byte rCorrection equ rData ; Read the correction factor rMark equ IOBase+$49 ; Read a mark byte rError equ IOBase+$4A ; Error register rParams equ IOBase+$4B ; Parameters (16 bytes deep at this addr) rPhase equ IOBase+$4C ; Phase lines states and directions rSetup equ IOBase+$4D ; Read the current configuration rStatus equ IOBase+$4E ; Status (returns current mode reg value) rHandshake equ IOBase+$4F ; Handshake register ; SWIM register bit masks ; wIWMConfig IWMtimerOverride equ %10000000 ; Override IWM timer IWMtimer2X equ %01000000 ; IWM timer takes twice as long to timeout IWMlatchAsync equ %00100000 ; latch data bit 7 in async mode ; rError UnderrunFIFO equ %00000001 ; Underrun FIFO MarkInData equ %00000010 ; Mark In Data OverrunFIFO equ %00000100 ; Overrun FIFO CorrectionError equ %00001000 ; Correction Error TransTooNarrow equ %00010000 ; Transition Too Narrow TransTooWide equ %00100000 ; Transition Too Wide TransUnresolved equ %01000000 ; Unresolved Transition ;not used equ %10000000 ; not used ; rPhase / wPhase ph0 equ %00000001 ; phase line 0 output data ph1 equ %00000010 ; phase line 1 output data ph2 equ %00000100 ; phase line 2 output data ph3 equ %00001000 ; phase line 3 output data ph0en equ %00010000 ; phase line 0 output enable ph1en equ %00100000 ; phase line 1 output enable ph2en equ %01000000 ; phase line 2 output enable ph3en equ %10000000 ; phase line 3 output enable ca0 equ ph0 ca1 equ ph1 ca2 equ ph2 lstrb equ ph3 ph0123en equ ph0en+ph1en+ph2en+ph3en enPh0L equ %00010000 enPh0H equ %00010001 enPh1L equ %00100000 enPh1H equ %00100010 enPh2L equ %01000000 enPh2H equ %01000100 enPh3L equ %10000000 enPh3H equ %10001000 ; rSetup / wSetup HeadSelEnable equ %00000001 ; enable Q3/Head Select to be an output Select35 equ %00000010 ; 3.5 selected GCRMode equ %00000100 ; select GCR mode ClockDiv2 equ %00001000 ; internal clock frequency / 2 EnableECM equ %00010000 ; enables the Error Correction Machine IBMDrive equ %00100000 ; IBM type drive TransSpaceDis equ %01000000 ; Trans-Space logic disabled MotorTimeOut equ %10000000 ; enable 1/2 second motor timeout ; rHandshake MarkInFIFO equ %00000001 ; next byte read from FIFO is a Mark CRCNotZero equ %00000010 ; CRC register is not Zero DriveRdData equ %00000100 ; state of the RdData signal from the drive DriveSense equ %00001000 ; state of the Sense signal from the drive DriveEnabled equ %00010000 ; a drive is explicitly enabled, or timing out rErrorValid equ %00100000 ; error register is non-zero Dat2Bytes equ %01000000 ; 2 bytes valid / available in the FIFO Dat1Byte equ %10000000 ; 1 byte valid / available in the FIFO ; wZeros / wOnes / rStatus ClearFIFO equ %00000001 ; Clear the FIFO Drive1Enabled equ %00000010 ; select Drive 1 Drive2Enabled equ %00000100 ; select Drive 2 StartAction equ %00001000 ; start Read / Write operation WriteMode equ %00010000 ; set the chip into Write mode HeadSelect equ %00100000 ; select head (side) 0 or 1 ;reserved equ %01000000 ; reserved, reads back as a one MotorOn equ %10000000 ; Causes selected drive to be enabled ; disk drive pulse addresses / data wDirNextAdr equ 0*HeadSelect+0*ca2+0*ca1+0*ca0 wDirPrevAdr equ 0*HeadSelect+1*ca2+0*ca1+0*ca0 wStepOnAdr equ 0*HeadSelect+0*ca2+0*ca1+1*ca0 wStepOffAdr equ 0*HeadSelect+1*ca2+0*ca1+1*ca0 wMotorOnAdr equ 0*HeadSelect+0*ca2+1*ca1+0*ca0 wMotorOffAdr equ 0*HeadSelect+1*ca2+1*ca1+0*ca0 wEjectOffAdr equ 0*HeadSelect+0*ca2+1*ca1+1*ca0 wEjectOnAdr equ 0*HeadSelect+1*ca2+1*ca1+1*ca0 ; equ 1*HeadSelect+0*ca2+0*ca1+0*ca0 ; undefined ; equ 1*HeadSelect+1*ca2+0*ca1+0*ca0 ; undefined wDiskInPlAdr equ 1*HeadSelect+0*ca2+0*ca1+0*ca0 ; don't know for sure if you can wNoDiskInPlAdr equ 1*HeadSelect+1*ca2+0*ca1+0*ca0 ; really write to these addresses wMFMModeOnAdr equ 1*HeadSelect+0*ca2+0*ca1+1*ca0 wGCRModeOffAdr equ wMFMModeOnAdr wMFMModeOffAdr equ 1*HeadSelect+1*ca2+0*ca1+1*ca0 wGCRModeOnAdr equ wMFMModeOffAdr ; equ 1*HeadSelect+0*ca2+1*ca1+0*ca0 ; undefined ; equ 1*HeadSelect+1*ca2+1*ca1+0*ca0 ; undefined ; equ 1*HeadSelect+0*ca2+1*ca1+1*ca0 ; undefined ; equ 1*HeadSelect+1*ca2+1*ca1+1*ca0 ; undefined ; disk drive sense addresses rDirPrevAdr equ 0*HeadSelect+0*ca2+0*ca1+0*ca0 rStepOffAdr equ 0*HeadSelect+0*ca2+0*ca1+1*ca0 rMotorOffAdr equ 0*HeadSelect+0*ca2+1*ca1+0*ca0 rEjectOnAdr equ 0*HeadSelect+0*ca2+1*ca1+1*ca0 rRdData0Adr equ 0*HeadSelect+1*ca2+0*ca1+0*ca0 rMFMDriveAdr equ 0*HeadSelect+1*ca2+0*ca1+1*ca0 rDoubleSidedAdr equ 0*HeadSelect+1*ca2+1*ca1+0*ca0 rNoDriveAdr equ 0*HeadSelect+1*ca2+1*ca1+1*ca0 rNoDiskInPlAdr equ 1*HeadSelect+0*ca2+0*ca1+0*ca0 rNoWrProtectAdr equ 1*HeadSelect+0*ca2+0*ca1+1*ca0 rNotTrack0Adr equ 1*HeadSelect+0*ca2+1*ca1+0*ca0 rNoTachPulseAdr equ 1*HeadSelect+0*ca2+1*ca1+1*ca0 rIndexPulseAdr equ rNoTachPulseAdr rRdData1Adr equ 1*HeadSelect+1*ca2+0*ca1+0*ca0 rMFMModeOnAdr equ 1*HeadSelect+1*ca2+0*ca1+1*ca0 rGCRModeOffAdr equ rMFMModeOnAdr rNotReadyAdr equ 1*HeadSelect+1*ca2+1*ca1+0*ca0 rNotRevisedAdr equ 1*HeadSelect+1*ca2+1*ca1+1*ca0 r1MegMediaAdr equ rNotRevisedAdr ; IWM Addresses ph0L equ IOBase+$40 ; phase 0 low ph0H equ IOBase+$41 ; phase 0 high ph1L equ IOBase+$42 ; phase 1 low ph1H equ IOBase+$43 ; phase 1 high ph2L equ IOBase+$44 ; phase 2 low ph2H equ IOBase+$45 ; phase 2 high ph3L equ IOBase+$46 ; phase 3 low ph3H equ IOBase+$47 ; phase 3 high mtrOff equ IOBase+$48 ; motor off mtrOn equ IOBase+$49 ; motor on intDrive equ IOBase+$4A ; enable internal drive extDrive equ IOBase+$4B ; enable external drive q6L equ IOBase+$4C ; q 6 low q6H equ IOBase+$4D ; q 6 high q7L equ IOBase+$4E ; q 7 low q7H equ IOBase+$4F ; q 7 high ca0L equ ph0L ca0H equ ph0H ca1L equ ph1L ca1H equ ph1H ca2L equ ph2L ca2H equ ph2H lstrbL equ ph3L lstrbH equ ph3H IWMmode equ $17 ; mode register value ; SWIM IWM Addresses mapping ; wData ph0L ; wMark ph0H ; wCRC ph1L ; wParams ph1H ; wPhase ph2L ; wSetup ph2H ; wZeroes ph3L ; wOnes ph3H ; rData mtrOff ; rCorrection mtrOff ; rMark mtrOn ; rError intDrive ; rParams extDrive ; rPhase q6L ; rSetup q6H ; rStatus q7L ; rHandshake q7H ; Message Assignments RCVState equ RCVMsg2State RCVData equ RCVMsg2Data XMTState equ XMTMsg2State XMTData equ XMTMsg2Data ; SWIM Driver IOP -> HOST Request encodings DiskInsertedXmtReq equ $01 ; Disk Inserted event DiskEjectedXmtReq equ $02 ; Disk Ejected event DiskStatusChangedXmtReq equ $03 ; Disk Status Changed XmtKind equ XMTData+$00 ; (byte) Request Kind XmtDriveNumber equ XMTData+$01 ; (byte) Drive Number XmtErrorCode equ XMTData+$02 ; (word) Error Code XmtDriveStatus equ XMTData+$04 ; (?? bytes) Drive Status Information ; SWIM Driver HOST -> IOP Request encodings InitializeReq equ $01 ; Initialize Driver ShutDownReq equ $02 ; Shut down driver StartPollingReq equ $03 ; Start Polling Drives StopPollingReq equ $04 ; Stop Polling Drives SetHFSTagAddrReq equ $05 ; Set HFS tag host address DriveStatusReq equ $06 ; Drive Status EjectReq equ $07 ; Eject FormatReq equ $08 ; Format disk FormatVerifyReq equ $09 ; Verify disk formatting WriteReq equ $0A ; Write blocks to disk ReadReq equ $0B ; Read blocks from disk ReadVerifyReq equ $0C ; Read and compare blocks from disk CacheControlReq equ $0D ; track cache control TagBufferControlReq equ $0E ; tag buffer control GetIconReq equ $0F ; get media or drive Icon DiskDupInfoReq equ $10 ; get Disk Duplicator information GetRawDataReq equ $11 ; Read RAW disk data (for copy protection) ReqKind equ RCVData+$00 ; (byte) Request Kind ReqDriveNumber equ RCVData+$01 ; (byte) Drive Number ReqControlKind equ RCVData+$01 ; (byte) DriverControl sub-command ReqErrorCode equ RCVData+$02 ; (word) Error Code ReqFormatKind equ RCVData+$04 ; (word) Format Kind ReqAdditionalParams equ RCVData+$04 ; (long) control / status csParam ReqDriveStatus equ RCVData+$04 ; (?? bytes) Drive Status Information ReqDriveKinds equ RCVData+$04 ; (28 bytes) Drive kinds (returned by init) ReqRAMAddress equ RCVData+$04 ; (long) Main CPU RAM Address ReqDupVersion equ RCVData+$04 ; (word) Disk Duplicator Version ReqHdrFmtKind equ RCVData+$06 ; (byte) Format byte from the last sector hdr (0=use default) ReqFmtInterleave equ RCVData+$07 ; (byte) Format Interleave (0=use default) ReqBlockNumber equ RCVData+$08 ; (long) Disk Starting Block Number ReqFmtDataAddress equ RCVData+$08 ; (long) CPU RAM Address of format sector data ReqBlockCount equ RCVData+$0C ; (long) Transfer Block Count ReqFmtTagAddress equ RCVData+$0C ; (long) CPU RAM Address of format tag data ReqMfsTagData equ RCVData+$10 ; (12 bytes) MFS Disk Tag Information ReqRawClockAddress equ RCVData+$04 ; (long) Buffer for packed MFM clock bits ReqRawDataAddress equ RCVData+$08 ; (long) Buffer for RAW data bytes ReqRawByteCount equ RCVData+$0C ; (long) Number of RAW bytes to read ReqRawSearchMode equ RCVData+$10 ; (word) RAW Read search mode ReqRawCylinder equ RCVData+$12 ; (word) RAW Read cylinder number ReqRawHead equ RCVData+$14 ; (byte) RAW Read head number ReqRawSector equ RCVData+$15 ; (byte) RAW Read sector number ; Search modes for RAW read requests SearchImmediate equ 0 ; don't search, read immediatly SearchForAddress equ 1 ; find address field, read raw after address SearchForData equ 2 ; find data field, read raw after data SearchForIndex equ 3 ; find index, read raw after index ; Status Message field offsets StatTrackH equ $04 ; High byte of Current Track Location StatTrackL equ $05 ; Low byte of Current Track Location StatWrProtected equ $06 ; bit7=1=write protected StatDiskInPlace equ $07 ; 0 = no disk place, 1 or 2 = disk in place StatInstalled equ $08 ; 0 = don't know, 1=installed, $FF=not installed StatSides equ $09 ; bit7=0=single sided, bit7=1=double sided ; drive queue element is not returned from IOP StatTwoSidedFmt equ $0A ; $FF=2-sided disk, $00=1-sided disk StatNewIntface equ $0B ; $00=old drive interface (400K), $FF=new (800K and later) StatDiskErrorsH equ $0C ; High byte of disk error count StatDiskErrorsL equ $0D ; Low byte of disk error count StatDriveInfoB3 equ $0E ; start of data for drive info control call StatDriveInfoB2 equ $0F ; high 2 bytes unused for now StatDriveAttr equ $10 ; disk drive attributes StatDriveType equ $11 ; type of disk drive ; ; start of data for extended drive status control call StatMfmDrive equ $12 ; $FF=SuperDrive, otherwise zero StatMfmDisk equ $13 ; $FF=MFM disk in drive, otherwise zero StatMfmFormat equ $14 ; $FF=1440K, $00=720K StatDiskCtlr equ $15 ; $FF=SWIM, $00=IWM StatCurrentFmtH equ $16 ; High byte of bit mask of current format StatCurrentFmtL equ $17 ; Low byte of bit mask of current format StatFmtAllowedH equ $18 ; High byte bit mask of allowable formats StatFmtAllowedL equ $19 ; Low byte bit mask of allowable formats StatDiskSizeB3 equ $1A ; Byte 3 of size of current drive, if fixed media drive. (HD-20) StatDiskSizeB2 equ $1B ; Byte 2 of size of current drive, if fixed media drive. (HD-20) StatDiskSizeB1 equ $1C ; Byte 1 of size of current drive, if fixed media drive. (HD-20) StatDiskSizeB0 equ $1D ; Byte 0 of size of current drive, if fixed media drive. (HD-20) StatIconFlags equ $1E ; bit 0 - call for Media Icon, bit 1 - call for Drive Icon StatSpare equ $1F ; (1 spare byte left) ; Drive number assignments intDriveNumber equ 1 ; drive number 1 is internal drive extDriveNumber equ 2 ; drive number 2 is external drive FirstHD20DriveNumber equ 5 ; first HD20 is drive 5 maxHD20Cnt equ 4 ; 4 HD20's allowed NumberOfDrives equ FirstHD20DriveNumber+maxHD20Cnt MaxDriveNumber equ NumberOfDrives-1 ; Disk Drive Kinds noDriveKind equ 0 ; no drive connected unknownDriveKind equ 1 ; unspecified drive kind SSGCRDriveKind equ 2 ; single sided 400K GCR disk drive DSGCRDriveKind equ 3 ; double sided 400K/800K GCR disk drive DSMFMGCRDriveKind equ 4 ; double sided 400K/800K GCR, 720K, 1440K MFM disk drive HD20DriveKind equ 7 ; HD20 20MB hard disk ; Disk Media Kinds NoMediaKind equ 0 ; no disk media in drive unknownMediaKind equ 1 ; unknown disk media HD20MediaKind equ 2 ; HD20 20MB hard disk media LoDenMediaKind equ 3 ; 400K, 800K, 720K Media (Low density) HiDenMediaKind equ 4 ; 1440K Media (High density) ; Disk Format Kinds uncheckedFormat equ 0 ; disk format has not been checked unknownFormat equ 1 ; disk format could not be determined HD20Format equ 2 ; HD20 20MB hard disk GCR400Kformat equ 3 ; single sided 400K GCR disk GCR800Kformat equ 4 ; double sided 800K GCR disk MFM720Kformat equ 5 ; double sided 720K MFM disk MFM1440Kformat equ 6 ; double sided 1440K MFM disk HD media GCRonHDformat equ 7 ; 400K or 800K GCR format on HD media (user error) ; Error codes noErr equ 0 ; no Error (success) openErr equ -23 ; Initialize when already initialized wPrErr equ -44 ; diskette is write protected paramErr equ -50 ; Error in parameter list nsDrvErr equ -56 ; no such drive (tried to mount a bad drive num) noDriveErr equ -64 ; drive not installed offLinErr equ -65 ; r/w requested for an off-line drive noNybErr equ -66 ; couldn't find 5 nybbles in 200 tries noAdrMkErr equ -67 ; couldn't find valid addr mark dataVerErr equ -68 ; read verify compare failed badCksmErr equ -69 ; addr mark checksum didn't check badBtSlpErr equ -70 ; bad addr mark bit slip nibbles noDtaMkErr equ -71 ; couldn't find a data mark header badDCksum equ -72 ; bad data mark checksum badDBtSlp equ -73 ; bad data mark bit slip nibbles wrUnderrun equ -74 ; write underrun occurred cantStepErr equ -75 ; step handshake failed tk0BadErr equ -76 ; track 0 detect doesn't change initIWMErr equ -77 ; Can't initialize disk controller chip spdAdjErr equ -79 ; unable to correctly adjust disk speed seekErr equ -80 ; track number wrong on address mark sectNFErr equ -81 ; sector number never found on a track fmt1Err equ -82 ; can't find sector 0 after track format fmt2Err equ -83 ; can't get enough sync noIndexErr equ fmt2Err ; index pulse not found during MFM format verErr equ -84 ; track failed to verify gcrOnMFMErr equ -400 ; gcr format on high density media error