mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 16:31:01 +00:00
0ba83392d4
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
408 lines
16 KiB
Plaintext
408 lines
16 KiB
Plaintext
;
|
|
; 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
|
|
|