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