;
;	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

