mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-29 20:49:19 +00:00
657 lines
25 KiB
Plaintext
657 lines
25 KiB
Plaintext
|
;
|
|||
|
; File: SonyEqu.a
|
|||
|
;
|
|||
|
; Contains: xxx put contents here xxx
|
|||
|
;
|
|||
|
; Written by: xxx put writers here xxx
|
|||
|
;
|
|||
|
; Copyright: © 1991-1993 by Apple Computer, Inc., all rights reserved.
|
|||
|
;
|
|||
|
; Change History (most recent first):
|
|||
|
;
|
|||
|
; <SM5> 8/3/93 BH Added drive queue flag (dqManEjBit) for manually ejectable
|
|||
|
; device.
|
|||
|
; <SM4> 12/7/92 rab Roll in Horror changes. Comments follow…
|
|||
|
; <H6> 8/4/92 SWC Increased the maximum head settling time to 100ms so
|
|||
|
; slower-stepping drives won't try to read/write data before
|
|||
|
; they're really ready.
|
|||
|
; <H5> 2/25/92 CMP Added new status code to support speed check status call.
|
|||
|
; <H4> 2/13/92 CMP Added a new control code for enabling/disabling retries and a
|
|||
|
; global flag to indicate if retries are enabled.
|
|||
|
; <H3> 1/21/92 CMP Added support for 32Mhz clock to SWIM2.
|
|||
|
; <SM3> 5/17/92 kc Turn off onMac if undefined.
|
|||
|
; <SM2> 4/16/92 JSM Roll-in change from Reality:
|
|||
|
; <5> 4/14/92 DTY Fix up conditionals so the right offsets get generated for the
|
|||
|
; System build. Moved extra stuff that was in the internal
|
|||
|
; version of SonyEqu.a into this file, so we can get rid of the
|
|||
|
; internal version.
|
|||
|
; <4> 10/1/91 JSM Don’t use onMvMac conditional, Modern Victorian never existed.
|
|||
|
; <3> 1/30/91 gbm sab, #38: Change the ‘already including this file’ variable to
|
|||
|
; all uppercase (for security reasons)
|
|||
|
;
|
|||
|
|
|||
|
; Version: 3.23
|
|||
|
; Created: Friday, October 20, 1989 at 9:52:02 PM
|
|||
|
;
|
|||
|
; File: SonyEqu.a
|
|||
|
;
|
|||
|
; Assembler Interface to the Macintosh Libraries
|
|||
|
; Copyright Apple Computer, Inc. 1984-1990
|
|||
|
; All Rights Reserved
|
|||
|
;
|
|||
|
;--------------------------------------------------------------------
|
|||
|
;
|
|||
|
; The following information was formerly in "private" files that were
|
|||
|
; not released to the general developer community.
|
|||
|
;
|
|||
|
; The information in this file is not needed for normal application
|
|||
|
; development. These equates and macros were necessary for development
|
|||
|
; of the Macintosh ToolBox and Operating System, and are likely to be
|
|||
|
; dependent on their current implementation. Use of any information
|
|||
|
; in this file is likely to cause your software to fail on future
|
|||
|
; versions of Macintosh system software or hardware.
|
|||
|
;
|
|||
|
; Apple Developer Support will not support any use of the following
|
|||
|
; information.
|
|||
|
;
|
|||
|
; In order to prevent any "accidental" use of this information, it has
|
|||
|
; been disabled using the conditional-assembly variable defined below.
|
|||
|
; If you change this to a non-zero value, you're on your own.
|
|||
|
;--------------------------------------------------------------------
|
|||
|
|
|||
|
IF &TYPE('__INCLUDINGSONYEQU__') = 'UNDEFINED' THEN
|
|||
|
__INCLUDINGSONYEQU__ SET 1
|
|||
|
|
|||
|
; If SonyNonPortable is defined to be non-zero, Then a machine type must be specified!
|
|||
|
|
|||
|
IF (&TYPE('SonyNonPortable') = 'UNDEFINED') THEN
|
|||
|
SonyNonPortable EQU 0
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF (&TYPE('onMac') = 'UNDEFINED') THEN
|
|||
|
onMac EQU 0 ; <SM3>
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF (&TYPE('onMacPP') = 'UNDEFINED') THEN
|
|||
|
onMacPP EQU 0
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF (&TYPE('onNuMac') = 'UNDEFINED') THEN
|
|||
|
onNuMac EQU 0
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF (&TYPE('onHcMac') = 'UNDEFINED') THEN
|
|||
|
onHcMac EQU 0
|
|||
|
ENDIF
|
|||
|
|
|||
|
; forDiskDup should be set to 0 for most uses
|
|||
|
|
|||
|
IF (&TYPE('forDiskDup') = 'UNDEFINED') THEN
|
|||
|
forDiskDup EQU forROM ; Only significant for ROM builds.
|
|||
|
ENDIF
|
|||
|
|
|||
|
; Note: supportsDCD means support for pass-thru connector as well.
|
|||
|
; If this is 1, firstDCD and maxDCDcnt equates are needed as well.
|
|||
|
; GetDrive must be adjusted for number of drives, as well!
|
|||
|
|
|||
|
IF onMac THEN
|
|||
|
supportsPWM EQU 1 ; set to 1 if PWM supported
|
|||
|
maxDrvNum EQU 4
|
|||
|
supportsDCD EQU 1 ; set to 1 to include DCD code
|
|||
|
firstDCD EQU 3
|
|||
|
maxDCDcnt EQU 2
|
|||
|
iwmMode EQU $1F
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF onMacPP THEN
|
|||
|
supportsPWM EQU 1 ; set to 1 if PWM supported
|
|||
|
maxDrvNum EQU 5
|
|||
|
supportsDCD EQU 1 ; set to 1 to include DCD code
|
|||
|
firstDCD EQU 4
|
|||
|
maxDCDcnt EQU 2
|
|||
|
iwmMode EQU $17 ; changed for Brian Howard to set half speed
|
|||
|
; <?? same as Mac ??>
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF (&TYPE('onNuMacDCD') = 'UNDEFINED') THEN
|
|||
|
onNuMacDCD EQU 0
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF onNuMac THEN
|
|||
|
supportsPWM EQU 0 ; set to 1 if PWM supported
|
|||
|
IF onNuMacDCD THEN
|
|||
|
maxDrvNum EQU 4
|
|||
|
supportsDCD EQU 1 ; set to 1 to include DCD code
|
|||
|
firstDCD EQU 3
|
|||
|
maxDCDcnt EQU 2
|
|||
|
ELSE
|
|||
|
maxDrvNum EQU 2
|
|||
|
supportsDCD EQU 0 ; set to 1 to include DCD code
|
|||
|
ENDIF
|
|||
|
iwmMode EQU $17
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF onHcMac THEN
|
|||
|
supportsPWM EQU 0 ; set to 1 if PWM supported
|
|||
|
maxDrvNum EQU 5
|
|||
|
supportsDCD EQU 1 ; set to 1 to include DCD code
|
|||
|
firstDCD EQU 4
|
|||
|
maxDCDcnt EQU 2
|
|||
|
iwmMode EQU $17
|
|||
|
ENDIF
|
|||
|
|
|||
|
|
|||
|
IF SonyNonPortable THEN
|
|||
|
|
|||
|
IF (&TYPE('supportsMFM') = 'UNDEFINED') THEN
|
|||
|
supportsMFM EQU 0
|
|||
|
ENDIF
|
|||
|
|
|||
|
; SonyVars Data Structure (offsets):
|
|||
|
; (1) Driver local vars.
|
|||
|
; (2) Drive-specific vars.
|
|||
|
; (3) More driver local vars.
|
|||
|
; (4) Direct-connect driver locals.
|
|||
|
;
|
|||
|
; Drive Constants:
|
|||
|
; (1) Floppy drive constants (tuneable).
|
|||
|
; (2) Floppy drive sense/control constants.
|
|||
|
; (3) Floppy drive formatting constants.
|
|||
|
; (4) Direct-connect drive constants.
|
|||
|
;
|
|||
|
; Driver Constants:
|
|||
|
; (1) Driver Control codes.
|
|||
|
;
|
|||
|
; Driver Vectors:
|
|||
|
; (1) Location of disk routine vectors.
|
|||
|
;
|
|||
|
;_______________________________________________________________________
|
|||
|
|
|||
|
;_______________________________________;
|
|||
|
; ;
|
|||
|
; SonyVars Data Structure (offsets): ;
|
|||
|
;_______________________________________;
|
|||
|
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; (1) Driver local vars. ; * = known to be used in a copy-
|
|||
|
; protection scheme.
|
|||
|
; +---------------------+ DiskUnitPtr <-----+
|
|||
|
; | | |
|
|||
|
; | "driver local vars" | |
|
|||
|
; | | EjectWait |
|
|||
|
; +---------------------+ <----+ |
|
|||
|
; | | Track | |
|
|||
|
; | drive1 | DrvLclLth |
|
|||
|
; | | DriveMisc | |
|
|||
|
; +---------------------+ <----+ |
|
|||
|
; | | Track |
|
|||
|
; | drive2 | Sony disk driver
|
|||
|
; | | DriveMisc vars, plus
|
|||
|
; +---------------------+ locals for each
|
|||
|
; | | Track diskette drive
|
|||
|
; | driveX | |
|
|||
|
; | | DriveMisc |
|
|||
|
; +---------------------+ |
|
|||
|
; | | FloppyLclEnd |
|
|||
|
; | "more driver vars" | |
|
|||
|
; | | SonyVarEnd <-----+
|
|||
|
; +---------------------+ <-----+
|
|||
|
; | | Track |
|
|||
|
; | driveN | |
|
|||
|
; | | DriveMisc |
|
|||
|
; +---------------------+
|
|||
|
; | | DCD driver vars
|
|||
|
; | driveN | plus locals for
|
|||
|
; | | each DCD drive
|
|||
|
; +---------------------+ |
|
|||
|
; | | DCDCmd |
|
|||
|
; | DCD driver locals | |
|
|||
|
; | | DiskVarLth <-----+
|
|||
|
; +---------------------+
|
|||
|
;
|
|||
|
;_______________________________________________________________________
|
|||
|
;
|
|||
|
|
|||
|
IF supportsMFM THEN
|
|||
|
mfmSectTime EQU 75 ;7.5msec sector time
|
|||
|
maxMFMSectors EQU 18 ;18 MFM sectors/track side (@1440K)
|
|||
|
ENDIF
|
|||
|
|
|||
|
maxGCRSectors EQU 12 ;12 GCR sectors/track side (max)
|
|||
|
diskUnitPtr EQU 0 ; pointer to device control entry
|
|||
|
diskQVE EQU diskUnitPtr+4 ; disk VBL task control block
|
|||
|
drive EQU diskQVE+14 ; * 0001 = int drive, 0002 = ext drive
|
|||
|
wait EQU drive+2 ; extra wait time for speed changes
|
|||
|
sideTrack EQU wait+2 ; destination side/track
|
|||
|
oneToOne EQU sideTrack+2 ; open up rupts flg (no longer used)
|
|||
|
active EQU oneToOne+1 ; * non-zero when driver is active
|
|||
|
timeOut EQU active+1 ; * power time out
|
|||
|
diskBuffer EQU timeOut+2 ; pointer to track data buffer
|
|||
|
firstSect EQU diskBuffer+4 ; low sector number needed on a track
|
|||
|
sectMap EQU firstSect+2 ; bit map of sectors needed on a track
|
|||
|
firstFSeq EQU sectMap+4 ; first file seq # for current r/w request
|
|||
|
fBlksDone EQU firstFSeq+2 ; file blocks done previous to this track
|
|||
|
readErrInit EQU fBlksDone+2 ; init value, read error countdown cntr
|
|||
|
readErrCnt EQU readErrInit+1 ; read error countdown cntr
|
|||
|
recalInit EQU readErrCnt+1 ; init value, recal count
|
|||
|
recalCnt EQU recalInit+1 ; recal count
|
|||
|
wrgSectInit EQU recalCnt+1 ; init value, wrong sector countdown cnt
|
|||
|
wrgSectCnt EQU wrgSectInit+1 ; wrong sector countdown cnt
|
|||
|
badSpdInit EQU wrgSectCnt+1 ; init value, bad speed
|
|||
|
badSpdCnt EQU badSpdInit+1 ; bad speed countdown value
|
|||
|
command EQU badSpdCnt+1 ; I/O command
|
|||
|
headSettle EQU command+2 ; disk head settle time (@100usec)
|
|||
|
spdChgTime EQU headSettle+2 ; motor speed change time (@100usec)
|
|||
|
pwrOnTime EQU spdChgTime+2 ; * power-on wait time (@100usec)
|
|||
|
pwrOffTime EQU pwrOnTime+2 ; * power down time (@1/2sec)
|
|||
|
seekTime EQU pwrOffTime+2 ; seek wait time (@100usec)
|
|||
|
sectTime EQU seekTime+2 ; * sector time (@100usec)
|
|||
|
dskVBLTime EQU sectTime+2 ; VBL task time (@16ms)
|
|||
|
ejectTime EQU dskVBLTime+2 ; Eject time (@100usec)
|
|||
|
ckDelta EQU ejectTime+2 ; delta time before speed recheck
|
|||
|
ejectWait EQU ckDelta+4 ; VBL times after eject to ignore DIP
|
|||
|
|
|||
|
; Format/Verify code reuses some of these fields as follows:
|
|||
|
|
|||
|
gapSync EQU sectMap ; (2) start with 7 groups of intersector sync
|
|||
|
twoSided EQU command ; (1) set non-zero for 2-sided format
|
|||
|
sectSave EQU firstSect ; (2) SectMpSave must follow
|
|||
|
sectMapSave EQU sectMap ; (8) uses SectMap, FirstFSeq, FBlksDone
|
|||
|
sectCnt EQU firstSect ; (2) loop counter . . .
|
|||
|
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; (2) Drive-specific vars.
|
|||
|
|
|||
|
drvLclLth EQU 66
|
|||
|
drive1 EQU ejectWait+2 ; * internal drive variables
|
|||
|
drive2 EQU drive1+drvLclLth ; * external drive variables
|
|||
|
|
|||
|
IF onMacPP | onHcMac THEN
|
|||
|
drive3 EQU drive2+drvLclLth ; * real external for MacPP
|
|||
|
floppyLclEnd EQU drive3+drvLclLth
|
|||
|
ELSEIF onMac | onNuMac | onMac32 THEN
|
|||
|
floppyLclEnd EQU drive2+drvLclLth
|
|||
|
ENDIF
|
|||
|
|
|||
|
track EQU 0 ; current track location (used for spd)
|
|||
|
writeProt EQU 2 ; * bit7=1=write-protected
|
|||
|
diskInPlace EQU 3 ; * $FC-$FF= just ejected,
|
|||
|
; 0=no disk in place,1=DIP,2=clamped
|
|||
|
installed EQU 4 ; * 0=don't know, 1=inst., $FF=not inst.
|
|||
|
sides EQU 5 ; * bit7=0=1 sided
|
|||
|
dqel EQU 6 ; drive queue element for this drive
|
|||
|
driveQLink EQU 6
|
|||
|
driveQVers EQU 10
|
|||
|
driveSize EQU 18 ; drive block size (DCD only!)
|
|||
|
twoSideFmt EQU 18 ; * non-zero if 2-sided format
|
|||
|
newIntf EQU 19 ; $FF if new interface, $00 for old
|
|||
|
driveErrs EQU 20 ; drive soft errs
|
|||
|
driveS1 EQU 20 ; drive block size (high word)
|
|||
|
driveType EQU 22 ; old OffSpeed (no longer supported)
|
|||
|
driveManf EQU 24
|
|||
|
driveChar EQU 26
|
|||
|
|
|||
|
IF supportsMFM THEN
|
|||
|
mfmDrive EQU 22 ;$FF=SuperDrive, $00=400K or 800K GCR
|
|||
|
mfmDisk EQU 23 ;$FF=MFM, $00=GCR or unformatted
|
|||
|
twoMegFmt EQU 24 ;$FF=2 meg MFM (1440K), $00=1 meg (720K)
|
|||
|
ENDIF
|
|||
|
|
|||
|
driveMisc EQU 27
|
|||
|
spdAdjCnt EQU 24 ; speed adjust count this drive
|
|||
|
trkSpeedTbl EQU 26 ; 5-entry track speed table
|
|||
|
tSTblCode EQU 0 ; first is speed code
|
|||
|
tSTblDelta EQU 2 ; 2% speed code delta
|
|||
|
tSTblTicks EQU 4 ; longword last time checked tick cnt
|
|||
|
trkSTEnd EQU 66 ; end of drive vars
|
|||
|
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; (3) More driver local vars.
|
|||
|
|
|||
|
wakeTimeCnt EQU floppyLclEnd ; WakeUp remainder count
|
|||
|
saveRegs EQU wakeTimeCnt+2 ; * wakeup routine saves D3-D7,A3-A6 here
|
|||
|
tagBufPtr EQU saveRegs+36 ; if non-zero, pointer to separate
|
|||
|
; buffer for file tags . . .
|
|||
|
tagBufOS EQU tagBufPtr+4 ; temp offset into buffer
|
|||
|
diskErrs EQU tagBufOS+2 ; global soft errors
|
|||
|
passThru EQU diskErrs+2 ; 0 if pass thru on external port
|
|||
|
IF supportsMFM THEN
|
|||
|
hasSuperDrives EQU passThru+1 ; $FF if at least 1 SuperDrive connected
|
|||
|
curSector EQU hasSuperDrives+1 ; current sector being read/written
|
|||
|
ELSE
|
|||
|
sonyExtra EQU passThru+1 ; extra byte
|
|||
|
curSector EQU sonyExtra+1 ; current sector being read/written
|
|||
|
ENDIF
|
|||
|
|
|||
|
tcRdEnable EQU curSector+2 ; (byte) set non-zero to activate reads into cache
|
|||
|
tcInstalled EQU tcRdEnable+1 ; (byte) non-zero when caching is installed and on
|
|||
|
tcDrive EQU tcInstalled+1 ; (word) drive number of cache blks (zero to inval)
|
|||
|
tcSideTrack EQU tcDrive+2 ; (word) side/track of cache blocks
|
|||
|
tcSectMap EQU tcSideTrack+2 ; (long) bitmap of sectors currently cached
|
|||
|
tcBuffer EQU tcSectMap+4 ; (long) pointer to track cache buffer (512+12)*12
|
|||
|
tcNumCached EQU tcBuffer+4 ; (word) number read into cache
|
|||
|
tcNumUsed EQU tcNumCached+2 ; (word actual number used
|
|||
|
lastDrive EQU tcNumUsed+2 ; (word) set at CkDrvNum to previous value of Drive
|
|||
|
timeOutDrive EQU lastDrive+4 ; (word) set at PowerDown to value of Drive
|
|||
|
; Above value should have been +2 since lastDrive is a word.
|
|||
|
timeQEl EQU timeOutDrive+2 ; a time queue element
|
|||
|
|
|||
|
IF onMac | (onMac32 and (NOT(onMacPP | onHcMac | forROM))) THEN
|
|||
|
nextGZProc EQU timeQEl+tmQSize-2 ; (long) saved old GZ proc
|
|||
|
; Above had been +tmQSize, but that changed from $C to $E.
|
|||
|
sonyVarEnd SET nextGZProc+4 ; end of sony vars excluding DCD
|
|||
|
ELSE
|
|||
|
nextGZProc EQU timeQEl+tmQSize ; (long) saved old GZ proc
|
|||
|
driveXlat EQU nextGZProc + 4 ; drive translate table (GetDrive,DiskOpen)
|
|||
|
drvTblPtr EQU driveXlat+((maxDrvNum+1)*2)
|
|||
|
; (long) pointer to DrvTbl to use
|
|||
|
sonyVarEnd SET drvTblPtr+4
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF supportsMFM THEN
|
|||
|
isSWIM EQU sonyVarEnd ;FDC type: $FF=SWIM, $00=IWM
|
|||
|
mfmMode EQU isSWIM+1 ;Current register set selected: $FF=SWIM, $00=IWM
|
|||
|
sonyVarEnd SET mfmMode+1 ; end of sony vars excluding DCD
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF onHcMac THEN
|
|||
|
chipState EQU sonyVarEnd ; Byte holds flag to indicate IWM on or off
|
|||
|
sonyVarEnd SET chipState+2 ; end of sony vars excluding DCD
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF hasPwrControls | hasPowerMgr THEN ; <1.1>
|
|||
|
chipState EQU sonyVarEnd ; Bit7 - saved VIA dir, 6..0 - pmgr enables <1.1>
|
|||
|
diskSleepQEL EQU chipState+2 ; sleep/wakeup queue element
|
|||
|
sonyVarEnd SET diskSleepQEL+SleepqRec.SleepqSize ; end of sony vars excluding DCD
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF forDiskDup THEN
|
|||
|
fmtParams EQU sonyVarEnd ;pointer to parameters for special format command
|
|||
|
gcrFmtByte EQU fmtParams+4 ; saved GCR format byte for duplicator
|
|||
|
clock32Mhz EQU gcrFmtByte+2 ; ( 1) Clock speed: $FF=32Mhz, $00=16Mhz <H3><SM4>
|
|||
|
DisableRetries EQU clock32Mhz+1 ; ( 1) $FF=Don't perform retries, $00=normal <H4><SM4>
|
|||
|
sonyVarEnd SET DisableRetries+1
|
|||
|
ENDIF
|
|||
|
|
|||
|
|
|||
|
IF onMac|onNuMacDCD THEN
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; (4) Direct-connect driver locals.
|
|||
|
|
|||
|
tagSize EQU 20 ; 20 bytes tags/block
|
|||
|
dcdLclLth EQU 28 ; (use fields through DriveMisc)
|
|||
|
drive3 EQU sonyVarEnd ; first DCD
|
|||
|
drive4 EQU drive3+dcdLclLth ; second DCD
|
|||
|
drive5 EQU drive4+dcdLclLth ; third DCD
|
|||
|
drive6 EQU drive5+dcdLclLth ; fourth DCD
|
|||
|
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF onMacPP|onHcMac THEN
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; (4) Direct-connect driver locals.
|
|||
|
|
|||
|
tagSize EQU 20 ; 20 bytes tags/block
|
|||
|
dcdLclLth EQU 28 ; (use fields through DriveMisc)
|
|||
|
drive4 EQU sonyVarEnd ; first DCD
|
|||
|
drive5 EQU drive4+dcdLclLth ; second DCD
|
|||
|
drive6 EQU drive5+dcdLclLth ; third DCD
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF onMac|onMacPP|onHcMac|onNuMacDCD THEN
|
|||
|
|
|||
|
|
|||
|
stsRtnAddr EQU drive6+dcdLclLth ; DCD status call return address
|
|||
|
dcdCmd EQU stsRtnAddr+4 ; command byte to DCD
|
|||
|
response EQU dcdCmd ; response byte (command+$80)
|
|||
|
seqNum EQU response+1 ; mb sequence number (sys commands only)
|
|||
|
status EQU seqNum+1 ; returned status bytes
|
|||
|
startBlock EQU status ; starting block # (in commands)
|
|||
|
driveOut EQU startBlock+3 ; we send drive number in this field
|
|||
|
driveIn EQU status+2 ; low 6 bits
|
|||
|
tagBytes EQU status+4 ; tag bytes get stuffed here temporarily
|
|||
|
devType EQU tagBytes ; first 20 bytes of status are written
|
|||
|
devManufctr EQU devType+2 ; in the 20-byte tag buffer
|
|||
|
devChar EQU devManufctr+2
|
|||
|
devBlks EQU devChar ; low 3 bytes of this longword
|
|||
|
devSpares EQU devChar+4
|
|||
|
devBadBlks EQU devSpares+2
|
|||
|
devMisc EQU devBadBlks+2 ; 8 bytes misc
|
|||
|
bufSize EQU tagBytes+tagSize ; number of bytes/block
|
|||
|
lastStatus EQU bufSize+4 ; last status returned
|
|||
|
lastResult EQU lastStatus+4 ; error type
|
|||
|
dcdFlags EQU lastResult+1 ; flag of whether we've done a reset
|
|||
|
chkTime EQU dcdFlags+1 ; 100usec check ready count
|
|||
|
maxTime EQU chkTime+2 ; maximum number of checks
|
|||
|
stsBuffer EQU maxTime+2 ; 512 bytes of status
|
|||
|
devReserve EQU stsBuffer
|
|||
|
devIcon EQU devReserve+44
|
|||
|
devFiller EQU devIcon+256 ; 32 bytes for optional name
|
|||
|
diskVarLth EQU devFiller+32
|
|||
|
stsBufSize EQU diskVarLth-stsBuffer
|
|||
|
|
|||
|
ELSE ;
|
|||
|
diskVarLth EQU sonyVarEnd ;
|
|||
|
ENDIF ;
|
|||
|
|
|||
|
; device characteristics byte:
|
|||
|
|
|||
|
devChEject EQU 4 ; ejectable if 1
|
|||
|
devChWP EQU 3 ; write protected if 1
|
|||
|
devChIcon EQU 2 ; icon available if 1
|
|||
|
|
|||
|
|
|||
|
;_______________________________________;
|
|||
|
; ;
|
|||
|
; Drive Constants: ;
|
|||
|
;_______________________________________;
|
|||
|
|
|||
|
|
|||
|
dqSides EQU -1 ; Bit 7 of this byte: 0=single-sided Sony, 1=double sided
|
|||
|
dqInstall EQU -2 ; 0=unknown, 1=installed, FF=no disk
|
|||
|
dqDIP EQU -3 ; $FC-$FF = disk just ejected,
|
|||
|
; 0 = no disk in place
|
|||
|
; 1 = disk in place
|
|||
|
; 2 = disk has been read
|
|||
|
; >8 = non-ejectable disk
|
|||
|
dqWrPrt EQU -4 ; Bit 7 of this byte: 1=disk is write protected.
|
|||
|
|
|||
|
dqManEjBit EQU 5 ; bit 5 of the dqInstall byte is set after <SM5> <BH 03Aug93>
|
|||
|
; installation for a manual-eject drive
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; (1) Floppy drive constants (tuneable).
|
|||
|
|
|||
|
kSeekTime EQU 120 ; 12 ms trk-to-trk
|
|||
|
kHdSetTime EQU 100*10 ; 100 ms head settle time <H6><SM4>
|
|||
|
kEjectTime EQU 7500 ; .75 seconds eject time
|
|||
|
kEjectWait EQU -4 ; - number of VBL calls after eject before dip check
|
|||
|
kSectTime EQU 100 ; minimum sector time in 100 us increments (10 ms)
|
|||
|
kPowerOn EQU 4000 ; read/write powerup time in 100 us increments
|
|||
|
kRWPOff EQU 5 ; read/write power off time (in 1/2 seconds)
|
|||
|
kDskVBLTime EQU 30 ; happens every 1/2 second
|
|||
|
kSpdChgTime EQU 1500 ; speed change wait time = 150ms
|
|||
|
kCkDelta EQU 14400 ; speed check delta time (in 1/60 sec) (4 min)
|
|||
|
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; (2) Floppy drive sense/control constants.
|
|||
|
; (ca1-ca0-sel-ca2).
|
|||
|
|
|||
|
dirLAdr EQU 0 ; dirtn low
|
|||
|
dirHAdr EQU 1
|
|||
|
rdDtaAdr EQU 1 ; side 0 read data
|
|||
|
rdDta1Adr EQU 3 ; side 1 read data
|
|||
|
stepLAdr EQU 4 ; step low and step sense address
|
|||
|
stepHAdr EQU 5
|
|||
|
IF supportsMFM THEN
|
|||
|
mfmModeAdr EQU 6 ;Switch drive into MFM (constant) mode
|
|||
|
gcrModeAdr EQU 7 ;Switch drive into GCR (variable) mode
|
|||
|
ENDIF
|
|||
|
mtrOnAdr EQU 8
|
|||
|
mtrOffAdr EQU 9
|
|||
|
ejectLAdr EQU 12
|
|||
|
ejectHAdr EQU 13
|
|||
|
dipAdr EQU 2 ; disk in place sense address
|
|||
|
mfmDrvAdr EQU 5 ;1=SuperDrive, 0=400K or 800K GCR
|
|||
|
wrProtAdr EQU 6 ; write protect sense address
|
|||
|
sidesAdr EQU 9 ; sense for number of sides
|
|||
|
tk0Adr EQU 10 ; track 0 sense address
|
|||
|
readyAdr EQU 11 ; /Ready sense address
|
|||
|
drvExstAdr EQU 13 ; sense=0 when a drive is connected
|
|||
|
tachAdr EQU 14 ; tach feedback sense address
|
|||
|
newIntfAdr EQU 15 ; implements ready handshake if 1
|
|||
|
IF supportsMFM THEN
|
|||
|
twoMegAdr EQU 15 ;0=1 meg disk, 1=2 meg disk
|
|||
|
ENDIF
|
|||
|
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; (3) Floppy drive formatting constants.
|
|||
|
|
|||
|
fmtByte EQU $02 ; 2-1 interleave, single-sided
|
|||
|
fmt2Byte EQU $22 ; 2-1 interleave, double-sided
|
|||
|
mustFindCt EQU 1500
|
|||
|
minSync EQU 4 ; min number of inter-sector sync groups
|
|||
|
IF supportsMFM THEN
|
|||
|
|
|||
|
numSDFmts EQU 3 ; 2 GCR + 1 MFM single-density
|
|||
|
numDDFmts EQU 1 ; 1 MFM double-density format
|
|||
|
ELSE
|
|||
|
numSDFmts EQU 2 ; 2 GCR single density formats
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF onMac|onMacPP|onHcMac|onNuMacDCD THEN
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; (4) Direct-connect drive constants.
|
|||
|
|
|||
|
blkSize EQU 512 ; 512 bytes data/block
|
|||
|
syncByte EQU $AA ; Sync byte for start of transmission
|
|||
|
nonZerStat EQU 1
|
|||
|
comErr EQU 2
|
|||
|
|
|||
|
; New HD20 error codes
|
|||
|
|
|||
|
wrtHsLw EQU $10 ; HSHK low before starting
|
|||
|
wrtHSLwTO EQU $11 ; Time out waiting for HSHK to go low
|
|||
|
wrtHSHighTO EQU $13 ; Time out waiting for HSHK to go high
|
|||
|
rdHsHi EQU $20 ; HSHK high before starting
|
|||
|
rdSyncTO EQU $21 ; Time out waiting for sync ($AA) bye
|
|||
|
rdGroupTO EQU $22 ; Time out waiting for group
|
|||
|
rdHoffSyncTO EQU $24 ; Time out waiting for sync after holdoff
|
|||
|
rdHsHiTO EQU $25 ; Time out waiting for HSHK high
|
|||
|
rdChksumErr EQU $26 ; Checksum error on response packet
|
|||
|
invalidResp EQU $30 ; First byte in response packet was wrong
|
|||
|
sqncNumErr EQU $31 ; Sequence number in response packet was wrong
|
|||
|
dNumberErr EQU $32 ; Drive number in response packet was wrong
|
|||
|
noResp EQU $40 ; No response packet ever received
|
|||
|
|
|||
|
; LastStatus
|
|||
|
|
|||
|
opFailed EQU 24 ; bit to test for operation failed
|
|||
|
bChksum EQU 30 ; bit number for checksum error
|
|||
|
|
|||
|
; DCDFlags
|
|||
|
|
|||
|
resetonce EQU 0
|
|||
|
retryonce EQU 1
|
|||
|
maxTries EQU 4 ; max # times to try command
|
|||
|
tSeekChk EQU 10 ; check during a seek every 1 ms
|
|||
|
tSeekMax EQU 10000 ; max time for seek = 10 secs
|
|||
|
tStsChk EQU 10 ; check during a status every 1 ms
|
|||
|
tStsMax EQU 10000 ; max time for status = 10 secs
|
|||
|
tQuickTime EQU 100
|
|||
|
tNextChk EQU 7 ; check for next block after 700 µsec
|
|||
|
tNextMax EQU 10000 ; max time for next block = 7 secs
|
|||
|
tFVChk EQU 100 ; check during fmt/vfy every 10 ms
|
|||
|
tFVMax EQU 18000 ; max time for fmt/vfy = 3 minutes
|
|||
|
tRstAssert EQU 1000 ; assert reset for 100 msec
|
|||
|
tRstSettle EQU 20000 ; 2 sec wait for busy to settle
|
|||
|
tRstChk EQU 100 ; check during reset every 10 ms
|
|||
|
tRstMax EQU 1600 ; max time for reset = 16 seconds
|
|||
|
|
|||
|
; DCD sense/cntl addr (ca1-ca0-sel-ca2)
|
|||
|
|
|||
|
dcdExist EQU 5 ; /Exist (/Sides=/DrvIn=1 also)
|
|||
|
dcdReset EQU 1 ; for 1ms resets DCD controller
|
|||
|
ENDIF ;
|
|||
|
|
|||
|
;_______________________________________;
|
|||
|
; ;
|
|||
|
; Driver Constants: ;
|
|||
|
;_______________________________________;
|
|||
|
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; (1) Driver Control codes.
|
|||
|
|
|||
|
verifyCC EQU 5 ; 'verify' control code
|
|||
|
formatCC EQU 6 ; 'format' control code
|
|||
|
tagBufCC EQU 8 ; 'set tag buffer' control code
|
|||
|
tCacheCC EQU 9 ; 'track cache' control
|
|||
|
iconIDCC EQU 20 ; 'get icon id' control code
|
|||
|
iconCC EQU 21 ; 'get icon' control code
|
|||
|
iconLogCC EQU 22 ; 'get logical icon' code
|
|||
|
infoCC EQU 23 ; 'get drive info' code
|
|||
|
RetriesCC EQU 17232 ; 'Enable/Disable Retries' code <H4><SM4>
|
|||
|
IF forDiskDup THEN
|
|||
|
FmtCopyCC EQU $5343 ;one-pass format/copy/verify for disk duplicator
|
|||
|
ENDIF
|
|||
|
GetRawDataCC EQU 18244 ; 'get raw track data' code <1.5>
|
|||
|
|
|||
|
; (2) Driver Status codes.
|
|||
|
|
|||
|
fmtLstCode EQU 6 ;Returns a list of disk formats
|
|||
|
IF supportsMFM THEN
|
|||
|
mfmStsCode EQU 10 ;'Get MFM status' status code
|
|||
|
ENDIF
|
|||
|
SpdChkSts EQU 17232 ; Checks disk speed at a given track <H5><SM4>
|
|||
|
IF forDiskDup THEN
|
|||
|
DupVerSts EQU $4456 ;disk duplicator version supported (to match features)
|
|||
|
FmtByteSts EQU $5343 ;return address header format byte
|
|||
|
ENDIF ; for disk duplicator
|
|||
|
|
|||
|
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; Driver Vectors: ;
|
|||
|
;_______________________________________;
|
|||
|
|
|||
|
;_______________________________________;
|
|||
|
;
|
|||
|
; (1) Location of disk routine vectors.
|
|||
|
|
|||
|
jFigTrkSpd EQU DiskVars
|
|||
|
jDiskPrime EQU jFigTrkSpd+4
|
|||
|
jRdAddr EQU jDiskPrime+4
|
|||
|
jRdData EQU jRdAddr+4
|
|||
|
jWrData EQU jRdData+4
|
|||
|
jSeek EQU jWrData+4
|
|||
|
jSetUpPoll EQU jSeek+4
|
|||
|
jRecal EQU jSetUpPoll+4
|
|||
|
jControl EQU jRecal+4
|
|||
|
jWakeUp EQU jControl+4
|
|||
|
jReSeek EQU jWakeUp+4
|
|||
|
jMakeSpdTbl EQU jReSeek+4
|
|||
|
jAdrDisk EQU jMakeSpdTbl+4
|
|||
|
jSetSpeed EQU jAdrDisk+4
|
|||
|
niblTbl EQU jSetSpeed+4
|
|||
|
jDiskSel EQU $B40 ; (long) vector to .Sony DiskSelect routine
|
|||
|
jSendCmd EQU $B44 ; (long) vector to .Sony DCD SendCmd routine
|
|||
|
jDCDReset EQU $B48 ; (long) vector to .Sony DCD DCDReset routine
|
|||
|
|
|||
|
IF supportsMFM THEN
|
|||
|
jMRdAddr EQU $680 ; (long) vector to MFM MRdAddr
|
|||
|
jMRdData EQU jMRdAddr+4 ; (long) vector to MFM MRdData
|
|||
|
jMWrData EQU jMRdData+4 ; (long) vector to MFM MWrData
|
|||
|
ENDIF
|
|||
|
|
|||
|
ENDIF ;end exclusion of private information
|
|||
|
|
|||
|
ENDIF ; ...already included
|