VAR
.PAGE
;---
; ZERO PAGE MAPPING
;
; The following equates are for dividing RAM into logical areas;
; however, as the code grew, this convention was not strictly adhered
; to and therefore one will find both "LOCAL" and "GLOBAL" variables
; scattered throughout the RAM area
;+++
IOB .Equ 00 ; INPUT OUTPUT BLOCK
SHARERAM .Equ 10 ; READ/WRITE SHARED RAM, INITIALIZED BY 6504 ON BOOT
STATUS .Equ 20 ; READ ONLY STATUS FROM THE 6504
IIOB .Equ 30 ; INTERNAL IOB
GLOBALS .Equ 40 ; 6504 INTERNAL GLOBALS
LOCALS .Equ 68 ; LOCAL VARIABLES
;; THESE APPEAR, FROM THE LISTING PROVIDED, TO BE HEX NUMBERS UNLESS FOLLOWED BY A DECIMAL
;; 1/6/89 ARS
.PAGE
;---
;
; IOB
;
; THE IOB IS ALWAYS COPIED INTO THE INTERNAL IOB (IIOB) AREA BEFORE USAGE
; SO THAT THE 68K CAN START TO BUILD A NEW COMMAND INTO THE IOB AS SOON AS
; POSSIBLE. ALL REFERENMCES TO THE IOB OF IIOB ARE DONE IN THE FOLLOWING
; FORMAT:
; IOB IIOB
; -------- --------
; GOBYTE IOB+GOBYTE IIOB+GOBYTE
; DRIVE IOB+DRIVE IIOB+DRIVE
;
;+++
IOBSIZE .Equ 07 ; SIZE OF IOB BLOCK USED FOR PARAMETER PASSING
GOBYTE .Equ 00 ; COMMAND BYTER FROM 68K
; 00 COMMAND ACCEPTED BY THE 6504, 68K MAY ISSUE A NEW COMMAND
; 80-89 COMMAND FROM 68K TO 6504
; 80 NULL, TESTS HANDSHAKE
; 81 RWTS COMMAND, COMMAND CODE IN 'COMMAND'
; 83 SEEK
; 84 CALL ADDRESS IN 6504
; 85 CLEAR STATUS
; 86 SET MASK
; 87 CLEAR MASK
; 88 WAIT IN ROM
; 89 Go jump to self forever (Their case change ARS)
;
; 01-7f,82,90-ff *** RESERVED ***
COMMAND .Equ 01 ; RWTS COMMAND CODE
; 00 READ Read Read the Data @ Drive/Side/Track/Sector
; 01 WRITE Write Read the Data @ Drive/Side/Track/Sector
; 02 UNCLAMP Unclamp the disk in Drive
; 03 FORMAT Format the disk in Drive
; 04 VERIFY Verify the disk in Drive
; 05 FORMAT TRACK Format single Track on the disk in Drive
; 06 VERIFY TRACK Verify single Track on the disk in Drive
; 07 READBF Read w/o checksum verification
; 08 WRITEBF Write w/o checksum creation
; 09 CLAMP Clamp the disk in Drive
; 0A-FF *** RESERVED ***
MASK .Equ COMMAND ; MASK FOR SETTING AND RESETTING IMSK & IST
; 08 SET OR CLEAR INTERRUPT MASK FOR UPPER DRIVE
; 80 SET OR CLEAR INTERRUPT MASK FOR LOWER DRIVE
; 01 CLEAR DISK INSERTED INTERRUPT FOR UPPER DRIVE
; 10 CLEAR DISK INSERTED INTERRUPT FOR LOWER DRIVE
; 02 CLEAR BUTTOM PRESSED INTERRUPT FOR UPPER DRIVE
; 20 CLEAR BUTTOM PRESSED INTERRUPT FOR LOWER DRIVE
; 04 CLEAR R/W COMMAND COMPLETED INTERRUPT FOR UPPER DRIVE
; 40 CLEAR R/W COMMAND COMPLETED INTERRUPT FOR LOWER DRIVE
ADRL .Equ COMMAND ; LOW BYTE OF ADDRESS FOR 6504 CALL
ADRH .Equ ADRL+1 ; HIGH BYTE OF ADDRESS FOR 6504 CALL
; A call to "1FFB" will reset the 65404
DRIVE .Equ 02 ; DRIVE NUMBER
; 00 DRIVE 0 UPPER DRIVE
; 80 DRIVE 80 LOWER DRIVE
SIDE .Equ 03 ; SIDE NUMBER
; 00 SIDE 0 UPPER SIDE OF MEDIA
; 01 SIDE 1 LOWER SIDE OF MEDIA
SECTOR .Equ 04 ; SECTOR NUMBER
; 00-15 MAXIMUM DEPENDES ON TRACK NUMBER
TRACK .Equ 05 ; TRACK NUMBER
; 00-2D 46 TRACKS TOTAL
SPEED .Equ 06 ; SPEED OVERRIDE
; 00 NOOVERRIDE, SPEED IN DEPENDING ON TRACK NUMBER
; 01-FF Modifier value added to nominal speed
FMTCNFN .Equ 07 ; Format configuration byte
; Used to ensure format is not executed by mistake
; FF FMTCNFM must be = FF for foramt/format track to work
ERRSTAT .Equ 08 ; ERROR STATUS, RETURNED AFTER R/W COMMANDS
; See constants for current error code values
DISKID .Equ 09 ; Current id of the disk last accessed
; 00 UIniFile/DuoFile disk
; 01 Lisa disk
; 02 Macintosh disk
NoSides .Equ 0A ; Number of sides of disk drive
DrvError .Equ 0B ; Hard errors get returned throught his byte
HostSeek .Equ 0C ; When moving the head this location = 'FF'
SekErr .Equ 0D ; When seek does not handshake then = '0F'
.Page
;--
; Shared RAM
;
; SHARED RAM COMES IN TWO FLAVOERS: 'READ/WRITE' AND 'READ ONLY'. THE 68K CAN,
; OF COURSE, READ AND WRITE TO ANY BYTE IN THE RAM AT ANY TIME BUT THIS IS NOT
; VERY WISE, (ONE MIGHT SAY VERY FOOLISH...), SO THE BY 'READ ONLY' WE MEAN
; MEMORY THAT NEVER SHOULD BE WRITTEN TO BY THE 68K BUT IS VALID TO READ AT
; ANY TIME. TYPICAL 'READ ONY' VARIABLES ARE THE STATUS FLAGS CLMED0 AND
; CLMPED80 THAT TELLS THE 68K THAT A DISK IS CLAMPED IN DRIVE 0 OR 80
;
; 'READ/WRITE' SHARED MEMORY IS, FOR EXAMPLE, THE IOB BUT IN THIS CASE IT IS
; A FAMILY OF 'CONSTANTS' SET UP ON COLD START BY THE 6504 TO THEIR DEFAULT
; VALUES, BUT THEY CAN BE CHANGED AT ANY TIME BY THE 68K TO ANY VALUE. THERE
; IS NO CHECKING OF THE RANGE OF THESE VALUES O THE NEW ONE BETTER MAKE SENSE
; OR THE 6504 MIGHT GO OF TO NEVER, NEVER LAND...
;
; SHARED: READ/RWITE
;++
MSpdTbl .Equ ShareRam
SCDLY .Equ SHARERAM+5. ; Speed change delay in 5 ms intervals
HEADELAY .Equ SHARERAM+6. ; Head settling time in 5 ms intervals
MAXDDLY .Equ SHARERAM+7. ; Timer value in 2/3 second before motor off
ROMIDNUM .Equ SHARERAM+8. ; ROM identification number ( 0018/FCC031 )
MAXRETRY .Equ SHARERAM+9. ; Maximum number of retries during a read/rwite
MAXRECAL .Equ SHARERAM+10. ; Maximum number of recalibrations during a r/w
StpDly .Equ SHARERAM+11. ; Step dely time in 100 usec intervals
MONDLY .Equ SHARERAM+12. ; Motor on delay time in 5 ms intervals
.Page
;++
; SHARED: READ ONLY
;--
Clamped .Equ Status ; Disk in Place (=0 EMPYT, =FF CLAMPED)
MtrOn .Equ Clamped+1 ; DRIVE MOTOR SELECT (0=OFF, FF=ON)
CurTrack .Equ Status+2 ; value of current track
CurClass .Equ CurTrack+1 ; Current track class (0: 4)
DrvConn .Equ Status+4 ; Will be 'FF' if a drive is physically there
FmtType .Equ DrvConn+1 ; '2' for single, '22' for double sideed
RetryCnt .Equ Status+6 ; RETRY COUNT
RecalCnt .Equ RetryCnt+1 ; RECALIBRATION COUNT
ImAlive .Equ Status+8 ; THIS VARIABLE SPINNS AS LONG AS THE MAIN LOOP IS EXECUTING
Counter .Equ Status+9. ; GENERAL COUNTER
HoldInx .Equ Counter+1 ; Holds command index temporarily
FmtGap .Equ Counter+2 ; Amt * 5 of 20 usec 'FF's to write as selfsync
Imsk .Equ Status+12. ; Bits 7 & 3 are mask; if set the drive enabled
DipIntr .Equ Imsk+1 ; Flag reflects DIP interrupt
OkToGo .Equ Imsk+2 ; REFLECTS FDIR (=0, FDIRL; <>0, FDIRH)
IST .Equ Imsk+3 ; INTERRUPT STATUS
; Bits of IST are numbered for LSb (0) to MSb (7)
;
; Bit Meaning
; --- -------
; 0 Drive 0 disk inserted
; 1 Drive 0 button pressed
; 2 Drive 0 R/W completed
; 3 Logical OR of bit 0,1 & 2
; 4 Drive 80 disk inserted
; 5 Drive 80 button pressed
; 6 Drive 80 R/W completed
; 7 Logical OR of bit 4,5 & 6
AdrMk1 .Equ IIob+8 ; 5 values that indicate start and end of address field
AdrMk2 .Equ AdrMk1+1
AdrMk3 .Equ AdrMk1+2
AdrMk4 .Equ AdrMk1+3
AdrMk5 .Equ AdrMk1+4
.Page
; Following 3 byte counter controls both testing
; for DIP and shutting off teh motors. When
WtLow .Equ Globals ; the low 2 bytes = 0 then test for DIP. When
WtMid .Equ WtLow+1 ; the third byte becomes 0 the heads are parked
WtHih .Equ WTLow+2 ; and the motors are turned off
; For timing and space purposes during writeg
; of data, an indexed by "y" through zero
INXPTRL .Equ Globals+3 ; pge instruction is used. The two bytes
INXPTRH .Equ INXPTRL+1 ; hold the base address for the index\.
; Some constants for timing purposes
K000 .Equ Globals+5 ; A constant '00'
K0FF .Equ K000+1 ; A constant 'FF'
; Following 8 locations hold error counters for
; various read errors. The first three are for
; error w/ reading data and the last five are
; for errors associated w/ the header.
STSLP .Equ GLOBALS+8. ; Read Data Starting Bitslip
BSCNT .Equ StSlp+1 ; Read Data ending Bitslip
CSERROR .Equ StSlp+2 ; Read data Checksum error
RASTRT .Equ StSlp+3 ; Read Address Starting Bitslip
RAEND .Equ StSlp+4 ; Read Address Ending Bitslip
RASCTR .Equ StSlp+5 ; Read Address wrong sector
RATRK .Equ StSlp+6 ; Read Address wrong track
RACSUM .Equ StSlp+7 ; Read Address Checksum error
ERRLEN .Equ 7 ; 8 bytes, zero based
CSMFND .Equ Globals+16. ; CHECKSUM read from disk
VOLFND .Equ CsmFnd+1 ; 0 = UniFile/DuoFile, 1 = Lisa, 2 = Mac
SDFND .Equ CsmFnd+2 ; SIDE FOUND
SECFND .Equ CsmFnd+3 ; SECTOR FOUND
TRKFND .Equ CsmFnd+4 ; TRACK FOUND
CSUM .Equ CsmFnd+5 ; Checksum calculated from ADDRESS data
ADRSLEN .Equ 4 ; LENGTH OF ADDRESS HEADER - 1
TrkFlg .Equ Globals+22.
MtrFlg .Equ TrkFlg+1
StpAmt .Equ TrkFlg+2
Direct .Equ TrkFlg+3
IndexL .Equ Globals+26.
IndexH .Equ IndexL+1
RangeL .Equ IndexL+2
RangeH .Equ IndexL+3
CPBY01 .Equ Globals+30. ; Composite byte formed from BUFFER[ 2FF:301 ]
CPBY02 .EQY CPBY01+1 ; [ 3FE:3FF ]
CPCKSUM .Equ Globals+32. ; Composite byte formed from 3 checksum bytes
CKSUM1 .Equ CPCKSUM+1 ; First checksum byte
CKSUM2 .Equ CPCKSUM+2 ; Second shecksum byte
CKSUM3 .Equ CPCKSUM+3 ; Third checksum byte
TCKSM1 .Equ Globals+36. ; During a read of data, the checksum is read
TCKSM2 .Equ TCKSM1+1 ; into "CKSM1..3". A new checksum is created
TCKSM3 .Equ TCKSM1+2 ; and stored in these 3 bytes to verify matters
TEMPSEC .Equ Globals+39. ; TEMPRARY SECTOR COUNTER USED BY FORMAT
.Page
;--
; LOCAL VARIABLES USED IN ONE OR SEVERAL ROUTINES
;++
RWCSMFLG .Equ LOCALS ; Flag fro usage of host supplied checksum
DELAY .Equ LOCALS+1 ; COMPUTED DELAY FOR TOTAL SEEK
Sv1 .Equ LOCALS+2 ; storage during Write16
Sv2 .Equ Sv1+1
Sv3 .Equ Sv1+2
Sv4 .Equ Sv1+3
TEMP1 .Equ Locals+6. ; 2 Locations for temporary by many routines
TEMP2 .Equ TEMP1+1
DatMk1 .Equ Locals+8 ; 5 values that indicate start and end of Data field
DatMk2 .Equ DatMk1+1
DatMk3 .Equ DatMk1+2
DatMk4 .Equ DatMk1+3
DatMk5 .Equ DatMk1+4
LOWCNT .Equ LOCALS+13. ; Holds value for physiacl interleave count
HIHCNT .Equ LOWCNT+1. ; Same but opposite/complimentary value
CNTPTR .Equ LOWCNT+2. ; Pointer to which cnt to use ( high or low )
TOTCNT .Equ LOWCNT+3. ; Total count of sectors written
TEMP3 .Equ Locals+17.
TEMP4 .Equ TEMP3+1
RtyFlg .Equ Locals+19. ; flag for use in BadAddr error handling
Uu6 .Equ Locals+20. ; 2 unused locations
Cmdx .Equ Locals+21.
SaveL .Equ Locals+22.
SaveH .Equ Locals+23.
CmdLeng .Equ 3F ; 64 byte ring buffer of 8 byte IOB's
SavIndex .Equ 80
; *** NOTE -- Ram from 'C0' to 'FF' is used by the 68K as parameter memory ***
LSTUSED .Equ 0BF ; last used location in the ZERO PARE RAM
.Page
;--
;
; CONSTANTS
;
;++
BUFR12SZ .Equ 0B ; LENGTH OF 12 BYTE BLOCK HEADER - 1
NIBLRETR .Equ 20 ; THE NUMBER OF NIBBLES READ SEARCHING FOR THE
; FIRST ADDRESS MARK DURING A READ
MAXTRACK .Equ 4F ; MAXIMUM TRACK NUMBER: 79.
MINTRACK .Equ 0 ; MIMIMUM TRACK NUMBER: 0
MAXCLASS .Equ 04 ; Maximum track class value -- range from 0..4
MINSECNT .Equ 08 ; Minimum sector count
MAXSECNT .Equ 0C ; Maximum sector count
MINSPEED .Equ 0D4 ; Minimum speed value
MAXSPEED .Equ 038 ; Maximum speed value -- Low # = high speed
OkDly .Equ 28.
CNFMVAL .Equ 0FF ; Format configuration check byte
LOW6 .Equ 3F ; mask for low 6 bit
MaxCmd .Equ 09 ; 10 commands return FDirH ( -1 )
CmdNumb .Equ 07 ; Seven commands nao accessed through '81'
NullCmd .Equ 080 ; Null/Handshake command
RwtsCmd .Equ 091 ; Read/Write Track/Sector command value
LwCmdNo .Equ 083 ; Lowest command number ( not including '81' )
ClStsCmd .Equ 085 ; Command to clear interrupt status
WrtCmd .Equ 01 ; Value of command to write data to disk
WrtBfCmd .Equ 08 ; Write data, brute force method
FrmtDsk .Equ 03 ; Value of command host to to format disk
VrfyDsk .Equ 04 ; Value of command host to to verify disk
FrmtTrk .Equ 05 ; Value of command from host to format a track
VrfyTrk .Equ 06 ; Value opf command from host to verify a track
ADM1 .Equ 0D5 ; Address mark one
ADM2 .Equ 0AA ; Address mark two
ADM3 .Equ 096 ; Address mark three
DDM3 .Equ 0AD ; Data mark three
BitSlp1 .Equ 0DE ; Bit slip mark one
BitSlp2 .Equ 0AA ; Bit slip mark two
RclStep .Equ 4. ; # of steps to take away from Trk00 during recal
OneScc .Equ 200. ; constant for a one second wait
TmOutRcl .Equ 100. ; Timeout for recal wait
RdAdrTmt .Equ 08. ; Tiomeout for looking for address header
IWMMode .Equ 01F ; constant to setup IWM modes
TurnRound .Equ 08. ; 5*8=40 msec turn around time for changing directions
Lrge .Equ 05.
Smal .Equ 01.
TblJmp .Equ 09.
WHih .Equ 17. ; '11' hex
WLow .Equ 00.
tLow .Equ 20.
; ERROR NUMBERS
GErrCmd .Equ 01 ; Gobyte error: Invalid command
GErrDrv .Equ 02 ; Gobyte error: Invalid drive number
GErrSid .Equ 03 ; GoByte error: Invalid side number
GErrSec .Equ 04 ; Gobyte error: Invalid Sector number
GErrTrk .Equ 05 ; Gobyte error: Invalid Track number
GErrMsk .Equ 06 ; Gobyte error: Invalid mask
GErrClm .Equ 07 ; Gobyte error: No clamped disk in drive
GErrEna .Equ 08 ; Gobyte error: Drive not enabled
GErrIntr .Equ 09 ; Gobyte error: Pending interrupts not cleared
GErrFmPr .Equ 10. ; Gobyte error: Invalid format parameter
PErrROM .Equ 11. ; Program error: ROM test failed
PErrInt .Equ 12. ; Program error: Random IRQ, NMI or BRK
DErrCal .Equ 13. ; Drive error: time out while looking for track zero
IWMError .Equ 14. ; Fatal error: IWM doesn't respond to commands
StepErr .Equ 15. ; Handshake diod not occur when stepping
DErrTk0 .Equ 16. ; Drive Error: Unable to leave track zero location
SErrProt .Equ 20. ; Errstat error: Write protect error
SErrFrmt .Equ 21. ; Errstat error: Can't verify disk
SErrClmp .Equ 22. ; Errstat error: Unable to clamp disk
SErrRd .Equ 23. ; Errstat error: Read error
SErrWr .Equ 24. ; Errstat error: Write error
SErrUclmp .Equ 25. ; Errstat error: Unable to unclamp diskette
SErrNoA9 .Equ 26. ; Errstat error: Cannot find A9's during chkspd
SErrTmt .Equ 27. ; Errstat error: Unable to adjust speed w/in timeout
SErrM1Tk .Equ 28. ; Errstat error: Cannot write speed track
ErrHdr .Equ 30. ; UnderRun while writing header
ErrWrt .Equ 31. ; UnderRun while writing data fields
.Page
;++
;
; Data Buffer equates and Bad Block equates
;
;--
StackSt .Equ 0CF ; Init stack to "01CF" -- push down stack
SctrCnt .Equ 01D0 ; During VERIFY, will no. of bad sectors
TrkNumb .Equ SctrCnt+1 ; Track number where bad sector occurred
SidNumb .Equ SctrCnt+2 ; Side number where bad sector occurred
SctrSav .Equ SctrCnt+3 ; Start of buffer where sector numbers are saved
Page01 .Equ 100 ; last 12 bytes of data are for read/write
Bufr12 .Equ 1F4 ; last 12 bytes of data for raed/write
Page02 .Equ 200 ; 256 bytes of data for read/write
Page03 .Equ 300 ; "
Pg2Len .Equ 0FF ; # of bytes to read during Wrbf02 loop
Pg3Len .Equ 0FE ; # of bytes to read during Wrbf03 loop
.Page
;--
; I/O Space
;++
IOSpace .Equ 800 ; name for beginning of I/O space offsets
Off .Equ 00 ; Offset to switch a phase off
On .Equ 01 ; Offset to switch a phase on
Zero .Equ 00 ; Offset to drive zero
Eighty .Equ 01 ; Offset to drive eighty
Low .Equ 00 ; PwmEna + Low enables output of PWMReg
High .Equ 01
InWard .Equ 00 ; direction offsets
OutWard .Equ 01
CA0 .Equ IOSpace ; Control signal 0 for MCI PAL in Sony drive
CA1 .Equ IOSpace+2 ; signal 1
CA2 .Equ IOSpace+4 ; signal 2
LStrb .Equ IOSpace+6 ; Load strobe -- 0 to 1 to 0 will strobe PAL
MtEna .Equ IOSpace+8 ; Enables output of DrvEna
DrEna .Equ IOSpace+10. ; = 0 --> drive 0, = 1 ==> drive 80
Q6L .Equ IOSpace+12. ; Low = Read or Write
Q6H .Equ Q6L+1 ; High = Sense or Write Load
Q7L .Equ IOSpace+14. ; Low disables writing to disk
Q7H .Equ Q7L+1 ; Enables /WrReq output of IWM
CntEna .Equ IOSpace+16. ; low enables PWM counter/comparator
PwmEna .Equ IOSpace+22. ; High enables pulses to Sony, else always low
DisL .Equ IOSpace+24. ; Memory enable for the 68K
DisH .Equ DisL+1 ; Memory disable for the 68K
Side0Sel .Equ IOSpace+26. ; Selects side 0
Side1Sel .Equ Side0Sel+1 ; Selects side 1
BootL .Equ IOSpace+28. ; Disk Diag Line; when High then I'm listening
BootH .Equ BootL+1
FDirL .Equ IOSpace+30. ; Deselects the interrupts to the 68K
FDirH .Equ FDirL+1 ; Selects the interrupts to the 68K
PWMReg .Equ IOSpace+32. ; Selects the PWM register for writing
;