979 lines
27 KiB
Plaintext
979 lines
27 KiB
Plaintext
![]() |
*=================================
|
|||
|
* READ/WRITE TRACK/SECTOR (RWTS).
|
|||
|
* (ENTER WITH (Y)/(A) POINTING AT
|
|||
|
* RWTS'S INPUT/OUTPUT BLOCK (IOB).
|
|||
|
*=================================
|
|||
|
|
|||
|
RWTS STY PTR2IOB ;SET UP A Z-PG PTR 2 RWTS'S IOB.
|
|||
|
STA PTR2IOB+1
|
|||
|
LDY #2 ;INITIALIZE CNTR FOR MAXIMUM
|
|||
|
STY RECLBCNT ;NUMBER OF RECALIBRATION TRIES.
|
|||
|
LDY #4 ;INITIALIZE COUNTER FOR MAXIMUM
|
|||
|
STY RSEEKCNT ;# OF RE-SEEKS BTW'N RECALIBS.
|
|||
|
LDY #1 ;(Y) = INDEX TO RWTS'S IOB.
|
|||
|
LDA (PTR2IOB),Y ;GET SLOT*16 FROM IOB IN (X), SO
|
|||
|
TAX ;CAN USE IT TO INDEX BASE ADRS
|
|||
|
;FOR DRIVE FUNCTIONS.
|
|||
|
|
|||
|
* CHK IF WANTED SLOT*16 = LAST SLOT*16?
|
|||
|
|
|||
|
LDY #15 ;INDEX 4 VAL OF LAST SLOT USED.
|
|||
|
CMP (PTR2IOB),Y ;WANTED*16 VS LAST*16.
|
|||
|
BEQ SAMESLOT ;SLOT WANTED=SLOT LAST ACCESSED.
|
|||
|
|
|||
|
* WANT TO USE A DIFFERENT SLOT SO
|
|||
|
* RESET (X) BACK TO INDEX OLD SLOT
|
|||
|
* SO CAN TEST OLD MOTOR.
|
|||
|
|
|||
|
TXA ;SAVE SLOT*16 WANTED ON STK.
|
|||
|
PHA
|
|||
|
LDA (PTR2IOB),Y ;GET OLD SLOT*16 BACK.
|
|||
|
TAX ;PUT IT IN (X) 2 INDEX BASE ADRS.
|
|||
|
PLA ;PUT SLOT*16 WANTED IN (A) AND
|
|||
|
PHA ;KEEP IT SAVED ON STK.
|
|||
|
STA (PTR2IOB),Y ;UPDATE LAST-USED SLOT*16 FOR
|
|||
|
;NEXT TIME AROUND.
|
|||
|
|
|||
|
* CHECK TO SEE IF LAST-USED DRIVE
|
|||
|
* ASSOC WITH LAST-USED SLOT IS
|
|||
|
* STILL SPINNING. IF IT IS, WAIT
|
|||
|
* FOR IT TO STOP.
|
|||
|
|
|||
|
LDA Q7L,X ;PREP LATCH FOR INPUT.
|
|||
|
CKSPIN LDY #8 ;SET CNTR 2 INSURE AT LEAST 8 CKS
|
|||
|
LDA Q6L,X ;STROBE LATCH TO READ.
|
|||
|
CHKCHNG CMP Q6L,X ;READ AGAIN & CMP TO LAST READ.
|
|||
|
BNE CKSPIN ;DATA CHANGED, SO STILL SPINNING.
|
|||
|
DEY ;NO CHANGE, SO CHK WITH SOME
|
|||
|
BNE CHKCHNG ;DELAYS JUST TO MAKE SURE.
|
|||
|
|
|||
|
* GET INDEX FOR SLOT WANTED.
|
|||
|
|
|||
|
PLA ;GET SLOT*16 BAK OFF STK & PUT IT
|
|||
|
TAX ;IN (X) SO WE CAN NDX BASE ADRS.
|
|||
|
|
|||
|
* CHECK TO SEE IF A DRIVE ASSOC
|
|||
|
* WITH SLOT WANTED IS STILL
|
|||
|
* SPINNING. (AS SOON AS GET A
|
|||
|
* CHANGE, KNOW IT IS SPINNING.
|
|||
|
* IF NO CHANGE, CHK AT LEAST 8
|
|||
|
* TIMES TO BE CERTAIN IT IS OFF.)
|
|||
|
|
|||
|
SAMESLOT LDA Q7L,X ;SET READ MODE.
|
|||
|
LDA Q6L,X ;STROBE LATCH TO READ.
|
|||
|
LDY #8 ;SET CNTR FOR 8 CHKS IF NEEDED.
|
|||
|
STRBAGN LDA Q6L,X ;STROBE LATCH AGAIN.
|
|||
|
PHA ;DELAY 14 MACHINE CYCLES.
|
|||
|
PLA
|
|||
|
PHA
|
|||
|
PLA
|
|||
|
STX SLOTPG5 ;SAVE SLOT*16 WANTED IN PAGE5.
|
|||
|
CMP Q6L,X ;HAS DATA CHANGED YET?
|
|||
|
BNE DONETEST ;YES - DATA CHANGED, SO SPINNING.
|
|||
|
DEY ;NO - NO CHANGE, SEE IF CHKD
|
|||
|
;ENOUGH TIMES YET.
|
|||
|
BNE STRBAGN ;CHK AT LEAST 8 TIMES.
|
|||
|
DONETEST PHP ;SAVE TEST RESULTS ON STK SO CAN
|
|||
|
;LATER CHK IF NEED EXTRA DELAY
|
|||
|
;OR NOT.
|
|||
|
|
|||
|
* TURN MOTOR ON IN A DRIVE ASSOC
|
|||
|
* WITH SLOT WANTED (JUST IN CASE
|
|||
|
* IT WASN'T ALREADY SPINNING).
|
|||
|
* NOTE: THIS USES DRIVE WITH SAME
|
|||
|
* # AS LAST DRIVE USED. THIS MAY
|
|||
|
* OR MAY NOT BE THE SPECIFIC DRIVE
|
|||
|
* # WE WANT. HOWEVER, WE MUST USE
|
|||
|
* THIS INSTRUC TO SEND POWER VIA
|
|||
|
* THE CONTROLLER. ONCE SWITCH IS
|
|||
|
* THROWN, WE CAN LATER RE-ROUTE
|
|||
|
* THAT POWER TO WHICHEVER DRIVE WE
|
|||
|
* WANT BY THROWING ANOTHER SWITCH
|
|||
|
* TO SELECT DRIVE1 OR DRIVE2.
|
|||
|
|
|||
|
LDA MTRON,X ;TURN MOTOR ON.
|
|||
|
|
|||
|
* ESTABLISH Z-PAGE POINTERS TO
|
|||
|
* DEVICE CHARACTERISTIC TABLE &
|
|||
|
* RWTS'S I/O BUFFER (SO WE CAN
|
|||
|
* USE Z-PAGE INDIRECT ADDRESSING):
|
|||
|
* IBDCTP --> PTR2DCT (3C,3D).
|
|||
|
* IBBUFP --> PTR2BUF (3E,3F).
|
|||
|
|
|||
|
LDY #6
|
|||
|
MOVPTRS LDA (PTR2IOB),Y ;GET PTRS FROM RWTS'S IOB.
|
|||
|
STA: PTR2DCT-6,Y ;PUT THEM IN Z-PAGE. (":" USED
|
|||
|
INY ;2 FORCE A 3-BYTE ZERO-PAGE ADR.)
|
|||
|
CPY #10 ;4 BYTES TO COPY (6 TO 9).
|
|||
|
BNE MOVPTRS
|
|||
|
|
|||
|
* CHECK DRIVE STATUS.
|
|||
|
|
|||
|
LDY #3 ;SAVE HI BYTE OF MOTOR-ON-TIME
|
|||
|
LDA (PTR2DCT),Y ;COUNT IN Z-PAGE.
|
|||
|
STA MTRTIME+1
|
|||
|
LDY #2 ;GET DRIVE # WANTED.
|
|||
|
LDA (PTR2IOB),Y
|
|||
|
LDY #16 ;SET (Y) = INDEX 2 LAST-USED DRV.
|
|||
|
CMP (PTR2IOB),Y ;DRV# WANTED VS DRV# LAST USED.
|
|||
|
BEQ SAMEDRV
|
|||
|
STA (PTR2IOB),Y ;DESIGNATE DRV# WANTED AS LAST-
|
|||
|
;USED DRV# FOR NEXT TIME AROUND.
|
|||
|
PLP ;GET STATUS BACK OFF STK.
|
|||
|
LDY #0 ;RESET STATUS (Z-FLAG OFF) TO
|
|||
|
;SIGNAL THAT SPECIFIC DRV # WE
|
|||
|
;WANT IN SPECIFIC SLOT WANTED WAS
|
|||
|
;NOT ORIGINALLY SPINNING.
|
|||
|
PHP ;PUSH UPDATED STATUS BACK ON STK.
|
|||
|
SAMEDRV ROR ;PUT LOW BIT OF DRV WNTED IN (C).
|
|||
|
BCC USEDRV2 ;BRANCH IF WANT DRIVE 2.
|
|||
|
LDA SELDRV1,X ;ROUTE POWER TO SELECT DRIVE 1.
|
|||
|
BCS USEDRV1 ;ALWAYS.
|
|||
|
|
|||
|
USEDRV2 LDA SELDRV2,X ;ROUTE POWER TO SELECT DRIVE 2.
|
|||
|
USEDRV1 ROR DRVZPG ;PUT SIGN BIT FOR WHICH DRIVE
|
|||
|
;USING IN Z-PAGE: NEG = DRIVE1.
|
|||
|
; POS = DRIVE2.
|
|||
|
|
|||
|
* CHK TO SEE IF A SPECIFIC DRIVE
|
|||
|
* WANTED IN SPECIFIC SLOT WANTED
|
|||
|
* WAS ORIGINALLY ON OR NOT.
|
|||
|
|
|||
|
PLP ;GET PREVIOUS TEST RESULT.
|
|||
|
PHP ;PUT IT BACK ON STK 4 LATER USE.
|
|||
|
BNE WASON ;ORIG DRV IN ORIG SLOT WAS ON.
|
|||
|
|
|||
|
* SPECIFIC DRIVE WANTED IN SPECIFIC
|
|||
|
* SLOT WANTED WAS ORIGINALLY OFF,
|
|||
|
* SO DELAY A BIT TO AVOID POS'NING
|
|||
|
* HEAD DURING THE PERIOD OF HEAVY
|
|||
|
* CURRENT FLOW THAT OCCURS WHEN
|
|||
|
* MOTOR IS TURNED ON. (THAT IS,
|
|||
|
* GIVE LINE/CAPACITOR TIME TO BLEED
|
|||
|
* DOWN CAUSE MOTOR ON/OFF SWITCH
|
|||
|
* REQUIRES MORE CURRENT THAN THE
|
|||
|
* STEPPER MOTOR.)
|
|||
|
*
|
|||
|
* (AMOUNT OF DELAY IS NOT CONSTANT
|
|||
|
* CAUSE IT DEPENDS ON WHAT IS IN
|
|||
|
* ACCUMULATOR & WE DON'T KNOW
|
|||
|
* CAUSE WE WERE JUST ACCESSING
|
|||
|
* HARDWARE.)
|
|||
|
|
|||
|
LDY #7
|
|||
|
WAIT4MTR JSR DELAY ;STALL.
|
|||
|
DEY
|
|||
|
BNE WAIT4MTR ;GO STALL SOME MORE.
|
|||
|
LDX SLOTPG5 ;RESTORE (X) = SLOT*16.
|
|||
|
WASON LDY #4 ;GET TRK WANTED.
|
|||
|
LDA (PTR2IOB),Y
|
|||
|
JSR SEEKTRK ;GO MOVE ARM TO CORRECT TRK.
|
|||
|
|
|||
|
* CHECK TO SEE IF MOTOR WAS
|
|||
|
* ORIGINALLY ON.
|
|||
|
|
|||
|
PLP ;GET EARLIER RESULT OF MOTOR TEST
|
|||
|
BNE BEGINCMD ;BRANCH IF DRV WAS ORIGINALLY ON.
|
|||
|
LDY MTRTIME+1 ;MOTOR WASN'T ORIGNALLY ON.
|
|||
|
;HOWEVER, WE HAVE SINCE TURNED IT
|
|||
|
;ON. NOW CHECK IF IT HAS BEEN ON
|
|||
|
;LONG ENOUGH.
|
|||
|
BPL BEGINCMD ;YES -NO NEED TO WAIT ANY LONGER.
|
|||
|
|
|||
|
* ALTHOUGH MOTOR IS TURNED ON, IT
|
|||
|
* HASN'T BEEN ON LONG ENOUGH TO DO
|
|||
|
* ACCURATE READING OF BYTES. THERE4
|
|||
|
* DELAY UNTIL MOTOR ON TIME IS ONE
|
|||
|
* SECOND (AT WHICH TIME MTRTIME
|
|||
|
* COUNT IS 0). (PART OF TIME WAS
|
|||
|
* TAKEN UP TO SEEK TRACK.)
|
|||
|
|
|||
|
TIME1 LDY #18
|
|||
|
TIME2 DEY
|
|||
|
BNE TIME2
|
|||
|
INC MTRTIME
|
|||
|
BNE TIME1
|
|||
|
INC MTRTIME+1
|
|||
|
BNE TIME1
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* MOTOR IS UP TO SPEED SO NOW
|
|||
|
* PROCESS COMMAND (SEEK=00,
|
|||
|
* READ=01, WRITE=02, FORMAT=04).
|
|||
|
*---------------------------------
|
|||
|
|
|||
|
* USE THE FOLLOWING COUNTERS:
|
|||
|
* READCNTR = ALLOW UP TO 48 TIMES
|
|||
|
* TO FIND CORRECT ADR
|
|||
|
* PROLOGUE BETWEEN
|
|||
|
* RE-SEEKING.
|
|||
|
* RSEEKCNT = ALLOW UP TO 4 RE-SEEKS
|
|||
|
* BTWN RECALIBRATIONS.
|
|||
|
* RECLBCNT = ALLOW UP TO 2 RECALIBRATIONS.
|
|||
|
*
|
|||
|
* (THERE4, IF NECESSARY, ALLOW UP
|
|||
|
* TO 384 ATTEMPTS TO FIND CORRECT
|
|||
|
* PROLOGUE ADDR.)
|
|||
|
|
|||
|
* BEGIN RWTS COMMAND PROCESSING.
|
|||
|
|
|||
|
BEGINCMD LDY #12 ;GET CMD FROM IOB.
|
|||
|
LDA (PTR2IOB),Y
|
|||
|
BEQ WASEEK ;BRANCH IF CMD WAS "SEEK".
|
|||
|
CMP #4 ;WAS CMD "FORMAT"?
|
|||
|
BEQ FORMDSK ;BRANCH IF CMD WAS "FORMAT".
|
|||
|
|
|||
|
|
|||
|
*---------------------------------
|
|||
|
* COMMAND WAS READ OR WRITE
|
|||
|
* (OPCODES $01 OR $02)
|
|||
|
*---------------------------------
|
|||
|
|
|||
|
ROR ;(C)=1 IF READ (OPCODE %00000001)
|
|||
|
;(C)=0 IF WRIT (OPCODE %00000010)
|
|||
|
PHP ;SAVE (C) DENOTING CMD ON STK.
|
|||
|
BCS RESETCNT ;READING - SO SKIP PRENIBBLING.
|
|||
|
|
|||
|
* COMMAND WAS WRITE
|
|||
|
|
|||
|
WASWRITE JSR PRENIBL ;CONVERT 256 MEMORY BYTES TO 342
|
|||
|
;6-BIT NIBBLES NEEDED FOR WRITING.
|
|||
|
|
|||
|
* COMMON TO READ OR WRITE.
|
|||
|
|
|||
|
RESETCNT LDY #48 ;INIT COUNT TO READ ADR HEADER.
|
|||
|
STY READCNTR
|
|||
|
SETXSLT LDX SLOTPG5 ;SET (X)=SLOT*16.
|
|||
|
JSR RDADDR ;GO READ ADDR HEADER TO FIND SEC
|
|||
|
;THAT WE WANT TO READ OR WRITE.
|
|||
|
BCC RDRIGHT ;ADDR READ WAS GOOD.
|
|||
|
|
|||
|
* BAD ADDRESS (OR DATA) READ.
|
|||
|
|
|||
|
REDUCERD DEC READCNTR ;REDUCE READ COUNT.
|
|||
|
BPL SETXSLT ;TRY AGAIN.
|
|||
|
|
|||
|
* DO A RECALIBRATION CAUSE WE HAVE
|
|||
|
* EXHAUSTED ALL ATTEMPTS TO GET A
|
|||
|
* GOOD READ.
|
|||
|
|
|||
|
DORECALB LDA PRESTRK ;SAVE TRK WANTED ON STK.
|
|||
|
PHA
|
|||
|
LDA #96 ;PRETEND PRESENTLY ON TRK #96 SO
|
|||
|
;WE FORCE HEAD AGAIN STOP.
|
|||
|
;(REPEATEDLY BANGING HEAD AGAINST
|
|||
|
;STOP = FAMILIAR DISK CLATTER.)
|
|||
|
JSR SETTRK ;GO SELECT DRV & PUT TRK WANTED
|
|||
|
;IN MEM LOCATION SPECIFIC 2 DRV.
|
|||
|
DEC RECLBCNT ;REDUCE RECALIBRATION COUNTER.
|
|||
|
BEQ DRVERR ;ERROR -EXHAUSTED RECALIBRATIONS.
|
|||
|
LDA #4 ;INDICATE 4 CHANCES TO RESEEK TRK
|
|||
|
STA RSEEKCNT ;BETWEEN RECALIBRATIONS.
|
|||
|
LDA #0 ;SEEK TRACK 0.
|
|||
|
JSR SEEKTRK ;GO MOVE ARM TO TRK 0.
|
|||
|
PLA ;GET TRK WANTED FROM STK.
|
|||
|
RESEEK JSR SEEKTRK ;NOW, MOVING OUT FROM TRK 0, TRY
|
|||
|
;TO LOCATE TRK WANTED.
|
|||
|
JMP RESETCNT ;GO BACK & TRY TO DO READ AGAIN.
|
|||
|
|
|||
|
* GOT A GOOD READ.
|
|||
|
|
|||
|
RDRIGHT LDY TRKDSK ;(Y) = TRK# FOUND IN HEADER.
|
|||
|
CPY PRESTRK ;TRK FOUND = TRK WANTED?
|
|||
|
BEQ RTTRK ;YES - SEEEKED TO CORRECT TRK.
|
|||
|
|
|||
|
* BAD SEEK (OR ELSE SOME KIND
|
|||
|
* OF PROTECTION SCHEME) CAUSE
|
|||
|
* TRK WANTED < > TRK FOUND.
|
|||
|
|
|||
|
LDA PRESTRK ;SAVE TRK WANTED ON STK.
|
|||
|
PHA
|
|||
|
TYA ;SET (A) =PRESENT TRK =TRK FOUND.
|
|||
|
JSR SETTRK ;GO SELECT DRV & PUT TRK WANTED N
|
|||
|
;MEMORY LOCATION SPECIFIC TO DRV.
|
|||
|
PLA ;GET TRK WANTED BACK OFF STACK.
|
|||
|
DEC RSEEKCNT ;ALLOW 4 ATTEMPTS TO FIND CORRECT
|
|||
|
;TRK BETWEEN RECALIBRATIONS.
|
|||
|
BNE RESEEK ;MORE ATTEMPTS LEFT TO FIND TRK.
|
|||
|
BEQ DORECALB
|
|||
|
|
|||
|
|
|||
|
*---------------------------------
|
|||
|
* GOT A DRIVE ERROR.
|
|||
|
*---------------------------------
|
|||
|
|
|||
|
DRVERR PLA
|
|||
|
LDA #$40 ;ERROR CODE FOR BAD DRIVE.
|
|||
|
TOERRWTS PLP
|
|||
|
JMP RWTSERR
|
|||
|
|
|||
|
|
|||
|
*---------------------------------
|
|||
|
* RWTS COMMAND WAS SEEK (NULL).
|
|||
|
*---------------------------------
|
|||
|
|
|||
|
WASEEK BEQ RWTSEXIT ;IF CMD WAS SEEK, THEN GO EXIT
|
|||
|
;RWTS CAUSE JUST COMPLETED MOVE.
|
|||
|
|
|||
|
|
|||
|
*---------------------------------
|
|||
|
* RWTS COMMAND WAS FORMAT ($04).
|
|||
|
*---------------------------------
|
|||
|
|
|||
|
FORMDSK JMP FORMAT ;GO DO THE FORMAT.
|
|||
|
|
|||
|
|
|||
|
*---------------------------------
|
|||
|
* FOUND CORRECT TRK FOR RWTS'S
|
|||
|
* READ OR WRITE COMMANDS.
|
|||
|
*---------------------------------
|
|||
|
|
|||
|
RTTRK LDY #3 ;GET VOL WANTED FROM IOB.
|
|||
|
LDA (PTR2IOB),Y
|
|||
|
PHA ;SAVE IT ON THE STACK.
|
|||
|
LDA VOLDSK ;GET VOL FOUND AND SAV IT IN IOB.
|
|||
|
LDY #14
|
|||
|
STA (PTR2IOB),Y
|
|||
|
PLA ;RETRIEVE VOL WANTED OFF STK.
|
|||
|
BEQ CRCTVOL ;VOLUME 0 GOOD FOR ALL.
|
|||
|
CMP VOLDSK ;VOL WANTED = VOL FOUND?
|
|||
|
BEQ CRCTVOL ;YES - GOT CORRECT VOL#.
|
|||
|
|
|||
|
* GOT A VOLUME MISMATCH.
|
|||
|
|
|||
|
LDA #$20 ;SET CODE FOR VOL MISMATCH.
|
|||
|
BNE TOERRWTS ;ALWAYS.
|
|||
|
|
|||
|
* FOUND CORRECT VOLUME SO NOW CHK
|
|||
|
* IF THE SECTOR IS ALSO CORRECT.
|
|||
|
|
|||
|
CRCTVOL LDY #5 ;GET LOGICAL SECTOR # WANTED.
|
|||
|
LDA (PTR2IOB),Y
|
|||
|
TAY ;SET (Y) = LOGICAL SECTOR# WANTED.
|
|||
|
LDA PHYSECTR,Y ;(A) = PHYSICAL SECTOR # WANTED.
|
|||
|
CMP SECDSK ;PHYS SEC WANTED=PHYS SEC FOUND?
|
|||
|
BNE REDUCERD ;NO - GO TRY AGAIN.
|
|||
|
PLP ;GET TYPE OF OPERATION FROM STK:
|
|||
|
; (C)=0=WRITE, (C)=1=READ.
|
|||
|
BCC WRITE ;BRANCH IF RWTS OPCODE WAS WRITE.
|
|||
|
|
|||
|
* READ DATA SEC INTO RWTS'S BUFFERS.
|
|||
|
|
|||
|
JSR READATA ;GO READ A SECTOR.
|
|||
|
PHP ;SAVE STATUS OF READ ON STACK JUST
|
|||
|
;IN CASE WE NEED TO RE-READ.
|
|||
|
BCS REDUCERD ;BAD READ - GO TRY AGAIN. LEAVE
|
|||
|
;SET (C) ON STK 2 DENOTE READING.
|
|||
|
;(WE PREVIOUSLY PULLED THE SAVED
|
|||
|
;STATUS OFF THE STK. THERE4, WE
|
|||
|
;BETTER PUT A SET (C) BACK ON STK
|
|||
|
;CAUSE WE ARE READING AND WE ARE
|
|||
|
;ABOUT 2 BRANCH BACK 2 A ROUTINE
|
|||
|
;THAT EXPECTS THE READ (C=1) OR
|
|||
|
;WRITE (C=0) FLAG ON THE STACK.
|
|||
|
PLP ;GOOD READ -NOT BRANCHING BACK SO
|
|||
|
;NO NEED TO PRESERVE FLAG ON STK.
|
|||
|
|
|||
|
* POSTNIBBLE DATA & SHUT DOWN.
|
|||
|
|
|||
|
LDX #0
|
|||
|
STX PROSCRTH
|
|||
|
JSR POSTNB16 ;CONVERT 6- & 2-ENCODED BYTES IN
|
|||
|
;RWTS BUFS TO NORMAL MEMORY BYTES
|
|||
|
;(USUALLY PLACED IN DOS DATA
|
|||
|
;SECTOR BUFFER).
|
|||
|
LDX SLOTPG5 ;SET (X) = SLOT*16 FROM PAGE 5.
|
|||
|
|
|||
|
|
|||
|
*----------------------------------
|
|||
|
* SIGNAL SUCCESS OR FAILURE
|
|||
|
* AND THEN SHUT DOWN.
|
|||
|
*----------------------------------
|
|||
|
|
|||
|
* SEVERAL REFERENCES ERRONEOUSLY
|
|||
|
* STATE THAT THE RETURN CODE IS
|
|||
|
* ZERO IF NO ERRORS OCCURRED.
|
|||
|
* HOWEVER, A LONE SEEK OPERATION
|
|||
|
* ALWAYS SETS THE RTN CODE TO ZERO.
|
|||
|
* EVEN IF A READ OR WRITE OPERATION
|
|||
|
* WAS SUCCESSFUL, THE IOB RTN CODE
|
|||
|
* WILL ACQUIRE A RANDOM VALUE (AS
|
|||
|
* A RESULT OF ACCESSING A HARDWARE
|
|||
|
* SWITCH PRIOR TO ENTERING THIS
|
|||
|
* ROUTINE). THERE4, THE RTN CODE
|
|||
|
* IS ONLY RELEVANT IF AN ERROR IS
|
|||
|
* DENOTED (CARRY SET).
|
|||
|
|
|||
|
RWTSEXIT CLC ;(C)=0, SIGNL SUCCESSFUL OPERAT'N
|
|||
|
HEX 24 ;"BIT $38" 2 IGNORE "SEC" INSTRUC
|
|||
|
RWTSERR SEC ;(C)=1, SIGNL UNSUCCESSFUL OPER'N
|
|||
|
LDY #13 ;STORE RETURN CODE IN IOB.
|
|||
|
STA (PTR2IOB),Y
|
|||
|
LDA MTROFF,X ;TURN MOTOR OFF.
|
|||
|
RTS
|
|||
|
|
|||
|
|
|||
|
*---------------------------------
|
|||
|
* WRITE SECTOR.
|
|||
|
*---------------------------------
|
|||
|
|
|||
|
WRITE JSR WRITESEC ;WRITE SYNC GAP AFTR ADR EPILOGUE
|
|||
|
;& THEN WRITE DATA PROLOGUE, DATA
|
|||
|
;PROPER AND DATA EPILOGUE.
|
|||
|
BCC RWTSEXIT ;GOOD WRITE - GO EXIT.
|
|||
|
LDA #$10 ;WRITE PROTECT ERROR CODE.
|
|||
|
BCS RWTSERR ;BAD WRITE - HANDLE THE ERROR.
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* DETERMINE DRIVE TYPE & MOVE
|
|||
|
* DISK ARM TO DESIRED TRK.
|
|||
|
*=================================
|
|||
|
|
|||
|
SEEKTRK PHA ;SAVE # OF TRK WANTED ON STK.
|
|||
|
LDY #1 ;GET DRIVE TYPE (EVEN VAL=2PHASE,
|
|||
|
LDA (PTR2DCT),Y ;ODD VAL=1PHASE) FROM DCT.
|
|||
|
;(PS. THE "II" IN THE "DISK II"
|
|||
|
;LOGO STAMPED ON APPLE'S DISK
|
|||
|
;DRIVE DENOTES A 2-PHASE MOTOR.)
|
|||
|
ROR ;PUT LOW BYTE OF DRV TYPE IN (C).
|
|||
|
PLA ;GET TRK# WANTED BACK IN (A).
|
|||
|
BCC SEEKIT ;NOT USING STANDARD DRIVE II,
|
|||
|
;USING A ONE-PHASE DRIVE INSTEAD,
|
|||
|
;THERE4 SKIP DOUBLING OF TRK# AND
|
|||
|
;USE SEEKIT AS PART OF ROUTINE
|
|||
|
;INSTEAD OF AS A SEPERATE SUBRTN.
|
|||
|
|
|||
|
* USING A TWO-PHASE DRIVE.
|
|||
|
|
|||
|
ASL ;2*TRK# WANTED=1/2TRACK# WANTED.
|
|||
|
JSR SEEKIT ;MOVE THE DISK ARM 2 DESIRED TRK.
|
|||
|
LSR PRESTRK ;CONVERT HALFTRACK VALUE BACK TO
|
|||
|
RTS ;WHOLE TRACK VALUE.
|
|||
|
|
|||
|
|
|||
|
*=====================================
|
|||
|
* ROUTINE/SUBROUTINE TO MOVE DRIVE
|
|||
|
* ARM TO A SPECIFIC TRK POS'N.
|
|||
|
*=====================================
|
|||
|
|
|||
|
* USED AS A SUBROUTINE WHEN USING
|
|||
|
* APPLE'S DISK DRIVE II. NOTE WHEN
|
|||
|
* SEEKIT IS USED AS A SUBROUTINE,
|
|||
|
* DESTRK, PRESTRK, TRK4DRV1, TRK4DR2,
|
|||
|
* STPSDONE AND HOLDPRES ARE ALL
|
|||
|
* EXPRESSED IN TERMS OF HALFTRACKS:
|
|||
|
* DESTRK = DESTINATION HALF-TRACK POS'N.
|
|||
|
* PRESTRK = PRESENT HALF-TRACK POS'N.
|
|||
|
* HOLDPRES = PRESENT HALF-TRACK POS'N.
|
|||
|
* TRK4DRV1 = BASE ADR (INDEXED BY SLOT*16)
|
|||
|
* TO POINT TO THE ADR THAT
|
|||
|
* CONTAINS THE LAST HALF-
|
|||
|
* TRACK # THAT DRIVE1 WAS
|
|||
|
* ALIGNED ONE.
|
|||
|
* TRK4DRV2 = BASE ADR (INDEXED BY SLOT*16)
|
|||
|
* TO POINT TO THE ADR THAT
|
|||
|
* CONTAINS THE LAST HALF-
|
|||
|
* TRACK # THAT DRIVE2 WAS
|
|||
|
* ALIGNED ON.
|
|||
|
* STPSDONE = NUMBER OF HALFTRACKS
|
|||
|
* MOVED SO FAR.
|
|||
|
* (NOTE: IF NOT USING A II-PHASE
|
|||
|
* DRIVE, CHANGE ALL THE COMMENTS
|
|||
|
* BELOW THAT REFER TO HALFTRACKS
|
|||
|
* TO REFER TO FULLTRACKS INSTEAD.)
|
|||
|
|
|||
|
SEEKIT STA DESTRK ;(A) = HALFTRACK# WANTED.
|
|||
|
JSR SLOTX2Y ;CONVERT (X)=SLOT*16-->(Y)=SLOT.
|
|||
|
LDA TRK4DRV1,Y ;PRES HALFTRK # ASSOC WITH DRV1.
|
|||
|
BIT DRVZPG ;CONTAINS: NEG=DRV1, POS=DRV2.
|
|||
|
BMI SETPRSTK ;BRANCH IF USING DRIVE1.
|
|||
|
LDA TRK4DRV2,Y ;USING DRIVE2 SO GET PRESENT
|
|||
|
;HALFTRACK # ASSOC WITH DRIVE 2.
|
|||
|
SETPRSTK STA PRESTRK ;SAVE PRESENT HALFTRK#.
|
|||
|
|
|||
|
* DESIGNATE HALFTRK WE ARE ABOUT
|
|||
|
* TO SEEK AS PRESENT HALFTRK FOR
|
|||
|
* NEXT TIME AROUND. (PUT HALFTRK
|
|||
|
* INFO IN SLOT-DEPENDENT LOCATIONS.)
|
|||
|
|
|||
|
LDA DESTRK ;HALFTRK WANTED.
|
|||
|
BIT DRVZPG ;CHK WHICH DRIVE WE'RE USING.
|
|||
|
BMI DRV1USG ;BRANCH IF USING DRIVE 1.
|
|||
|
STA TRK4DRV2,Y ;USING DRIVE2 -STORE HALFTRK INFO
|
|||
|
;FOR NEXT TIME AROUND.
|
|||
|
BPL DRV2USG ;ALWAYS.
|
|||
|
|
|||
|
DRV1USG STA TRK4DRV1,Y ;USING DRIVE1. STORE HALFTRK INFO
|
|||
|
;FOR NEXT TIME AROUND.
|
|||
|
DRV2USG JMP SEEKABS ;GO MOVE DRIVE ARM.
|
|||
|
|
|||
|
|
|||
|
*===================================
|
|||
|
* TRANSLATE (X)=SLOT*16 TO (Y)=SLOT.
|
|||
|
*===================================
|
|||
|
|
|||
|
SLOTX2Y TXA ;GET SLOT*16 FROM (X).
|
|||
|
LSR ;DIVIDE IT BY 16.
|
|||
|
LSR
|
|||
|
LSR
|
|||
|
LSR
|
|||
|
TAY ;PUT SLOT# IN (Y).
|
|||
|
RTS
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* GO SELECT DRIVE AND PUT TRACK #
|
|||
|
* WANTED IN MEMORY LOCATION ASSOC
|
|||
|
* WITH THE # OF THE DRIVE WE'RE
|
|||
|
* USING.
|
|||
|
*=================================
|
|||
|
|
|||
|
SETTRK PHA ;SAVE PRESENT TRK # ON STK.
|
|||
|
LDY #2 ;GET DRV # WANTED FROM IOB.
|
|||
|
LDA (PTR2IOB),Y
|
|||
|
ROR ;CONDITION CARRY:
|
|||
|
; (C)=0=DRV1, (C)=1=DRV2.
|
|||
|
ROR DRVZPG ;CONDITION ZERO-PAGE LOCATION:
|
|||
|
; NEG=DRV1, POS=DRV2.
|
|||
|
JSR SLOTX2Y ;USE (X)=SLOT*16 TO GET (Y)=SLOT.
|
|||
|
PLA ;GET TRK # WANTED OFF STK.
|
|||
|
ASL ;TIMES TWO FOR 1/2TRACK # WANTED.
|
|||
|
BIT DRVZPG ;CHK WHICH DRIVE TO USE.
|
|||
|
BMI STORDRV1 ;BRANCH IF USING DRIVE 1.
|
|||
|
STA TRK4DRV2,Y ;SAV HALFTRK # WANTED FOR DRIVE2.
|
|||
|
BPL RTNSETRK ;ALWAYS.
|
|||
|
STORDRV1 STA TRK4DRV1,Y ;SAVE HALFTRK # WANTED 4 DRIVE1.
|
|||
|
RTNSETRK RTS
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* RWTS'S FORMAT COMMAND.
|
|||
|
*=================================
|
|||
|
|
|||
|
* INITIALIZE ZERO-PAGE LOCATIONS.
|
|||
|
|
|||
|
FORMAT LDY #3 ;GET VOL FRM IOB, STORE IN Z-PAGE.
|
|||
|
LDA (PTR2IOB),Y
|
|||
|
STA FRMTVOL
|
|||
|
LDA #$AA ;STORE "AA" AS CONSTANT IN Z-PAGE.
|
|||
|
STA HOLDAA
|
|||
|
LDY #$56 ;INITIALIZE INDEX TO BUFFER.
|
|||
|
LDA #0 ;INITIALIZE TRK COUNTER.
|
|||
|
STA FRMTKCTR ;NOTE: ALWAYS BEGIN FORMATTING
|
|||
|
;WITH TRACK $00.
|
|||
|
|
|||
|
* ZERO OUT THE RWTS BUFFERS.
|
|||
|
* (NOTE: WHEN FORMATTING, THESE
|
|||
|
* "$00" BUFFER BYTES WILL LATER BE
|
|||
|
* TRANSLATED AND WRITTEN TO THE
|
|||
|
* DISK AS "$96" DISK BYTES.)
|
|||
|
|
|||
|
* ZERO OUT RWTS BUFFER THAT NORMALLY
|
|||
|
* CONTAINS 2-ENCODED NIBBLES.
|
|||
|
* (RWTSBUF2, $BC00 <--- $BC55.)
|
|||
|
|
|||
|
ZBUF2 STA RWTSBUF1+$FF,Y ;($BC55 --> $BC00.)
|
|||
|
DEY
|
|||
|
BNE ZBUF2
|
|||
|
|
|||
|
* ZERO OUT RWTS BUFFER THAT NORMALLY
|
|||
|
* CONTAINS 6-ENCODED NIBBLES.
|
|||
|
* (RWTSBUF1, $BB00 ---> $BBFF.)
|
|||
|
|
|||
|
ZBUF1 STA RWTSBUF1,Y
|
|||
|
DEY
|
|||
|
BNE ZBUF1
|
|||
|
|
|||
|
* PREPARE TO DO A RECALIBRATION.
|
|||
|
|
|||
|
LDA #80 ;PRETEND WE'RE ON TRK #80.
|
|||
|
JSR SETTRK ;GO SELECT DRV & PUT HALFTRACK #
|
|||
|
;WANTED IN MEMORY LOCATION ASSOC
|
|||
|
;WITH THE # OF DRV BEING USED.
|
|||
|
LDA #40 ;SET UP FOR 40 SYNCS BTWN SECS
|
|||
|
STA SYNCNTR ;ON TRK0. NOTE THAT THIS # WILL
|
|||
|
;LATER BE REDUCED AS WE WRITE
|
|||
|
;SUBSEQUENT TRKS.(HIGHER NUMBERED
|
|||
|
;TRKS ARE CLOSER TO THE CENTER OF
|
|||
|
;THE DSK & THERE4 ARE REPRESENTED
|
|||
|
;BY SMALLER CIRCLES. WE CAN CROWD
|
|||
|
;ALL THE SECS INTO A SMALLER
|
|||
|
;CIRCUMFERENCE BY REDUCING THE #
|
|||
|
;OF SYNC BYTES BETWEEN SECS.
|
|||
|
|
|||
|
* FORMAT THE NEXT TRACK.
|
|||
|
|
|||
|
FRMNXTRK LDA FRMTKCTR ;USE TRK COUNTER AS TRK TO SEEK.
|
|||
|
JSR SEEKTRK ;POS'N ARM OVER CORRECT TRK.
|
|||
|
|
|||
|
* GO FORMAT A SPECIFIC TRACK.
|
|||
|
|
|||
|
JSR FORMATRK ;FORMAT A TRACK.
|
|||
|
LDA #8 ;SET (A) AS DEFAULT VALUE IN CASE
|
|||
|
;COULDN'T FORMAT. NOTE THAT ANY
|
|||
|
;TYPE OF ERROR ENCOUNTERED WHEN
|
|||
|
;FORMATTING YEILDS AN I/O-ERROR
|
|||
|
;MESSAGE.
|
|||
|
BCS ERRFRMT ;BRANCH IF COULDN'T FORMAT.
|
|||
|
|
|||
|
* DO A READ CHK OF TRK JUST FORMATTED.
|
|||
|
* (EVENTHOUGH TRACK VERIFIED, READ
|
|||
|
* IT AGAIN UNTIL LOCATE TRK0.
|
|||
|
* (PRESUMABLY, THIS (PARTIALLY)
|
|||
|
* DOUBLE CHECKS VERIFICATION AND
|
|||
|
* KEEPS SECTORS IN DIFFERENT TRACKS
|
|||
|
* SOMEWHAT ADJACENT?)
|
|||
|
|
|||
|
LDA #48 ;SET 48 ATTEMPTS TO READ.
|
|||
|
STA READCNTR
|
|||
|
RDAGAIN SEC ;DEFAULT (C)=1 TO SIGNAL ERROR.
|
|||
|
DEC READCNTR ;REDUCE CHANCES TO READ.
|
|||
|
BEQ ERRFRMT ;EXHAUSTED ALL CHANCES.
|
|||
|
JSR RDADDR ;GO READ ADDR HEADER TO FIND SEC
|
|||
|
;THAT WE WANT TO READ OR WRITE.
|
|||
|
BCS RDAGAIN ;BAD READ - TRY AGAIN.
|
|||
|
LDA SECDSK ;WAS IT SECTOR 0?
|
|||
|
BNE RDAGAIN ;NO - TRY AGAIN.
|
|||
|
JSR READATA ;LAST CHANCE TO READ DATA.
|
|||
|
BCS RDAGAIN ;LAST CHANCE BOMBED OUT!!!
|
|||
|
INC FRMTKCTR ;KICK UP TRK COUNTER.
|
|||
|
LDA FRMTKCTR ;SET (A) FOR NEXT TRK COUNT.
|
|||
|
CMP #$23 ;DONE ALL TRACKS YET (#0 TO #34)?
|
|||
|
BCC FRMNXTRK ;NO - GO FORMAT THE NEXT TRACK.
|
|||
|
CLC ;SIGNAL FINISHED ALL TRACKS.
|
|||
|
BCC DONEFRMT ;ALWAYS - ONLY GOOD EXIT.
|
|||
|
|
|||
|
* NOTE: NO MATTER WHAT KIND OF ERROR
|
|||
|
* WE MIGHT HAVE ENCOUNTERED WHEN
|
|||
|
* FORMATTING, THE IOB ERROR CODE IS
|
|||
|
* SET TO $08. THIS IS LATER TRANSLATED
|
|||
|
* TO AN FM ERROR CODE (ALSO $08) WHICH
|
|||
|
* DOS DISPLAYS AS AN I/O ERROR MSG.
|
|||
|
* (THIS IS WHY TRYING TO FORMAT A
|
|||
|
* WRITE-PROTECTED DISK RESULTS IN AN
|
|||
|
* I/O ERROR MSG INSTEAD OF A DISK-
|
|||
|
* WRITE-PROTECTED MSG.)
|
|||
|
* IF NO ERROR OCCURRED, THE IOB RETURN
|
|||
|
* CODE WILL BE SET TO SOME RANDOM
|
|||
|
* NUMBER (FROM REFERENCING A HARD-
|
|||
|
* WARE SWITCH ADDRESS).
|
|||
|
|
|||
|
ERRFRMT LDY #13 ;INDEX TO RETURN CODE IN IOB.
|
|||
|
STA (PTR2IOB),Y ;STORE RETURN CODE.
|
|||
|
SEC ;SIGNAL THAT AN ERROR OCCURRED.
|
|||
|
DONEFRMT LDA MTROFF,X ;TURN THE MOTOR OFF, XIT WITH (C)
|
|||
|
RTS ;DENOTING SUCCESS STATUS.
|
|||
|
|
|||
|
|
|||
|
*------------------------------------
|
|||
|
* SUBROUTINE 2 FORMAT A SPECIFIC TRK.
|
|||
|
*------------------------------------
|
|||
|
|
|||
|
* SECTORS ARE WRITTEN IN ASCENDING
|
|||
|
* ORDER FROM SEC $00 TO SEC $0F.
|
|||
|
* (NOTE THAT THE FORMAT ROUTINE ONLY
|
|||
|
* DEALS WITH PHYSICAL SECTOR NUMBERS.)
|
|||
|
|
|||
|
FORMATRK LDA #0 ;ALWAYS START WITH SEC $00.
|
|||
|
STA FRMTSEC
|
|||
|
LDY #128 ;USE 128 SYNC BYTS BEFORE SEC$00.
|
|||
|
;NOTE: THIS GAP WILL BE PARTIALLY
|
|||
|
;OVERWRITTEN BY SEC $0F.
|
|||
|
BNE DOADDR ;ALWAYS.
|
|||
|
|
|||
|
FRMTASEC LDY SYNCNTR ;SET (Y)= # OF 40-CYCLE SELF-SYNC
|
|||
|
;BYTES TO BE WRITTEN BTWN SECS.
|
|||
|
;(THIS # VARIES DEPENDING ON THE
|
|||
|
;SPEED OF THE SPECIFIC DRV BEING
|
|||
|
;USED & THE # OF THE TRK BEING
|
|||
|
;WRITTEN.)
|
|||
|
DOADDR JSR WRITADR ;WRITE SYNC BYTES & ADDR HEADER.
|
|||
|
|
|||
|
BCS VRFYRTN ;ERROR -DISK WAS WRITE PROTECTED.
|
|||
|
JSR WRITESEC ;WRITE SYNC GAP BTWN ADDR & DATA
|
|||
|
;FIELDS, WRT DATA & WRITE A SYNC
|
|||
|
;BYTE AFTER DATA EPILOGUE.
|
|||
|
BCS VRFYRTN ;IRRELEVANT - NEVER TAKEN BECAUSE
|
|||
|
;WE ALREADY CHECKED THE WRITE-
|
|||
|
;PROTECT SWTCH WHEN WE WROTE ADR.
|
|||
|
INC FRMTSEC ;INCREASE SEC #.
|
|||
|
LDA FRMTSEC
|
|||
|
CMP #$10 ;DONE ALL 16 SECS YET?
|
|||
|
BCC FRMTASEC ;NO - GO DO SOME MORE.
|
|||
|
|
|||
|
|
|||
|
*......................................
|
|||
|
* VERIFY A SINGLE TRACK.
|
|||
|
*......................................
|
|||
|
|
|||
|
* NOTE WE JUST FINISHED FORMATTING
|
|||
|
* SEC $0F. BECAUSE SEC $0F SHOULDN'T
|
|||
|
* OVERWRITE TOO MUCH OF OF THE SYNC GAP
|
|||
|
* (ORIGINALLY 128 SYNC LONG) THAT WAS
|
|||
|
* WAS WRITTEN PRIOR TO SEC $00, AND BECAUSE
|
|||
|
* WE DON'T WASTE TOO MUCH TIME BETWEEN
|
|||
|
* WRITING THE LAST BYTE OF SEC $0F AND
|
|||
|
* LOOKING FOR THE NEXT ADDR HEADER,
|
|||
|
* WE EXPECT TO BEGIN OUR VERIFICATION
|
|||
|
* WITH SEC $00.
|
|||
|
|
|||
|
|
|||
|
* INTIALIZE COUNTERS.
|
|||
|
|
|||
|
LDY #$0F ;SET COUNTER 4 # OF SECS VERIFIED
|
|||
|
STY FRMTSEC
|
|||
|
LDA #48 ;SET COUNTER FOR # OF ATTEMPTS.
|
|||
|
STA READCNTR
|
|||
|
|
|||
|
* FILL SECTOR MAP WITH POSITIVE NUMBERS.
|
|||
|
|
|||
|
FILSECMP STA SECFLGS,Y
|
|||
|
DEY
|
|||
|
BPL FILSECMP
|
|||
|
|
|||
|
* DELAY TO LET SOME SYNCS PASS BY.
|
|||
|
|
|||
|
LDY SYNCNTR ;INITIALIZE (Y).
|
|||
|
BYPSYNCS JSR VRFYRTN ;(12 CYC)
|
|||
|
JSR VRFYRTN ;(12 CYC)
|
|||
|
JSR VRFYRTN ;(12 CYC)
|
|||
|
PHA ;(3 CYC)
|
|||
|
PLA ;(4 CYC)
|
|||
|
NOP ;(2 CYC)
|
|||
|
DEY ;(2 CYC)
|
|||
|
BNE BYPSYNCS ;(3 CYC ON BRNCH, 2 ON FALL THRU)
|
|||
|
|
|||
|
* READ ADDRESS OF FIRST SEC ENCOUNTERED.
|
|||
|
* (THIS BETTER BE SEC $00!!!! IF IT
|
|||
|
* ISN'T, OUR DRIVE IS TOO FAST & WE
|
|||
|
* WILL EVENTUALLY HAVE TO REFORMAT
|
|||
|
* THE TRACK.)
|
|||
|
|
|||
|
JSR RDADDR ;READ ADR OF 1RST SEC ENCOUNTERED
|
|||
|
BCS REREADDR ;BAD READ, TRY AGAIN.
|
|||
|
LDA SECDSK ;WAS SEC READ = SEC00?
|
|||
|
BEQ RDNXTDAT ;YES - GO READ NEXT DATA SEC.
|
|||
|
|
|||
|
* DIDN'T FIND SECTOR $00 WHEN EXPECTED!!!!
|
|||
|
|
|||
|
* DRIVE MUST BE FASTER THAN ANTICIPATED
|
|||
|
* CAUSE SEC $0F OVERLAID TOO MUCH OF
|
|||
|
* THE LONG SYNC GAP (GAP1) THAT WAS
|
|||
|
* ORIGINALLY WRITTEN BEFORE SEC $00.
|
|||
|
* WE WILL EVENTUALLY HAVE TO REFORMAT
|
|||
|
* THIS TRK USING 128 SELF-SYNCS BEFORE
|
|||
|
* SEC $00 (GAP1) AND LESS SYNC BYTES
|
|||
|
* BETWEEN OTHER SECS (GAP3). THIS
|
|||
|
* WILL INSURE THAT LESS GAP-1 SYNCS
|
|||
|
* WILL BE OVERWRITTEN BY SEC $OF.
|
|||
|
* NOTE THAT DEPENDING ON JUST HOW
|
|||
|
* MUCH TOO FAST THE DRIVE IS, WE MAY
|
|||
|
* HAVE TO REFORMAT THIS TRK SEVERAL
|
|||
|
* TIMES BEFORE WE GET IT RIGHT. EACH
|
|||
|
* TIME WE REFORMAT, WE REDUCE THE #
|
|||
|
* OF GAP-3 SYNCS. IF THE SYNC COUNTER
|
|||
|
* IS > = 16, WE WRITE 2 LESS SYNCS.
|
|||
|
* IF THE COUNTER IS < 16, WE ONLY REDUCE
|
|||
|
* GAP-3 BY ONE SYNC. IN ORDER TO GIVE
|
|||
|
* THE MACHINE TIME TO DECODE INFO, WE
|
|||
|
* WON'T ALLOW A GAP LESS THAN 5 SYNCS
|
|||
|
* LONG. (NOTE THAT WE WON'T REFORMAT
|
|||
|
* THE TRACK UNTIL WE FIND THE ADR HEADER
|
|||
|
* FOR SEC $0F. THIS PRESUMABLY KEEPS
|
|||
|
* LIKE-NUMBERED SECS IN ADJACENT TRKS
|
|||
|
* IN SOME SEMBLANCE OF ORDER.)
|
|||
|
|
|||
|
LDA #16
|
|||
|
CMP SYNCNTR ;CONDITION CARRY.
|
|||
|
LDA SYNCNTR ;IF SYNC COUNT < 16, SUBTRACT 1,
|
|||
|
SBC #1 ;ELSE SUBTRACT 2.
|
|||
|
STA SYNCNTR
|
|||
|
CMP #5 ;DO WE HAVE AT LEAST 5 SYNCS?
|
|||
|
BCS REREADDR ;YES.
|
|||
|
SEC ;NO - SIGNAL ERROR CAUSE NEED AT
|
|||
|
RTS ;LEAST 5 SYNCS. DRIVE IS SO FAST
|
|||
|
* === ;THAT IT IS USELESS. WE CAN'T
|
|||
|
;EVEN COMPENSATE 4 IT BY REDUCING
|
|||
|
;THE NUMBER OF GAP-3 SYNCS.
|
|||
|
|
|||
|
* READ THE SEC ADDR & DATA PROPER.
|
|||
|
|
|||
|
RDNXTADR JSR RDADDR ;READ THE ADDR HEADER.
|
|||
|
BCS BADREAD ;BRANCH IF BAD ADDRESS READ.
|
|||
|
RDNXTDAT JSR READATA ;READ THE DATA PROPER.
|
|||
|
BCC CKSECMAP ;READ WAS GOOD -SO GO CHK IF THIS
|
|||
|
;SEC HAS ALREADY BEEN READ.
|
|||
|
|
|||
|
BADREAD DEC READCNTR ;EITHER GOT A BAD READ OR ELSE
|
|||
|
;WE ALREADY VERIFIED THIS SEC.
|
|||
|
;REDUCE THE # OF CHANCES LEFT.
|
|||
|
BNE RDNXTADR ;MORE CHANCES LEFT -GO TRY AGAIN.
|
|||
|
|
|||
|
* DOING A RE-READ. WILL DEFINITELY
|
|||
|
* HAVE TO REFORMAT.
|
|||
|
|
|||
|
REREADDR JSR RDADDR ;READ AN ADDR HEADER.
|
|||
|
BCS NOTLAST ;GOT A BAD READ.
|
|||
|
|
|||
|
* WE WILL REFORMAT BUT WE DON'T WANT
|
|||
|
* TO DO SO UNTIL WE READ SEC $0F.
|
|||
|
|
|||
|
* HAVE WE FOUND SEC $0F YET?
|
|||
|
|
|||
|
LDA SECDSK ;GET PHYS # OF SEC JUST READ.
|
|||
|
CMP #$0F ;WAS IT SEC 15?
|
|||
|
BNE NOTLAST ;NO, SO GO LOOK SOME MORE.
|
|||
|
JSR READATA ;YES - READ THE DATA IN SEC $0F.
|
|||
|
BCC FORMATRK ;GOOD READ ON SEC15 SO NOW TIMING
|
|||
|
;IS RIGHT TO GO REFORMAT THIS TRK
|
|||
|
NOTLAST DEC READCNTR ;BAD READ, CK IF MORE CHANCES LFT
|
|||
|
BNE REREADDR ;YES - GO TRY AGAIN.
|
|||
|
SEC ;EXHAUSTED ALL CHANCES, SO SET
|
|||
|
VRFYRTN RTS ;(C) AS ERROR FLAG & EXIT.
|
|||
|
* ===
|
|||
|
|
|||
|
* CHECK IF THIS SEC WAS PREVIOUSLY
|
|||
|
* VERIFIED. IF NOT, UPDATE SECTOR
|
|||
|
* VERIFICATION MAP. (IF TIMING IS
|
|||
|
* RIGHT, SHOULD NEVER ENCOUNTER AN
|
|||
|
* ALREADY VERIFIED SEC BEFORE FRMTSEC
|
|||
|
* DECREMENTS FROM $0F DOWN TO $FF.)
|
|||
|
|
|||
|
CKSECMAP LDY SECDSK ;USE # OF SEC FOUND AS INDEX TO
|
|||
|
;THE VERIFICATION MAP.
|
|||
|
LDA SECFLGS,Y ;GET MAP BYT (NEG=PREV VERIFIED).
|
|||
|
BMI BADREAD ;OH!OH! ALREADY VERIFIED THIS ONE
|
|||
|
LDA #$FF ;SET BYTE IN MAP TO SIGNAL THAT
|
|||
|
STA SECFLGS,Y ;THIS SEC WAS JUST VERIFIED.
|
|||
|
DEC FRMTSEC ;ANY SECS LEFT TO VERIFY?
|
|||
|
BPL RDNXTADR ;YES - GO DO SOME MORE.
|
|||
|
|
|||
|
* ALL SECS VERIFIED, SO CHECK
|
|||
|
* IF WE JUST DID TRACK $00.
|
|||
|
|
|||
|
LDA FRMTKCTR ;WAS TRK JUST FORMATTED =TRK $00?
|
|||
|
BNE NOTRK0 ;NO - SO EXIT CLEANLY.
|
|||
|
|
|||
|
* JUST FORMATTED & VERIFIED TRK $00.
|
|||
|
* TRK $00 IS THE OUTSIDE TRK AND THERE4
|
|||
|
* HAS THE LARGEST LENGTH IN WHICH TO
|
|||
|
* WRITE BYTES. BECAUSE SUBSEQUENT
|
|||
|
* TRKS HAVE A SMALLER CIRCUMFERENCE,
|
|||
|
* WE MUST REDUCE THE NUMBER OF SYNCS
|
|||
|
* TO WRITE BETWEEN SECS (GAP3) SO WE
|
|||
|
* CAN GET ALL THE NEEDED INFO INTO
|
|||
|
* A SMALLER SPACE.
|
|||
|
|
|||
|
LDA SYNCNTR ;CHECK SYNC COUNT.
|
|||
|
CMP #16 ;LESS THAN 16 SYNCS?
|
|||
|
BCC VRFYRTN ;YES - EXIT CLEANLY.
|
|||
|
;DON'T WANT TO START OFF WITH A
|
|||
|
;SMALLER GAP SO SKIP CODE BELOW.
|
|||
|
|
|||
|
* REDUCE THE SIZE OF GAP3.
|
|||
|
|
|||
|
DEC SYNCNTR ;GAP > = 16 SYNCS LONG, SO CAN
|
|||
|
DEC SYNCNTR ;AFFORD 2 REDUCE IT BY 2 IN ORDER
|
|||
|
NOTRK0 CLC ;TO ACCOMMODATE A TIGHTER TRACK.
|
|||
|
RTS ;EXIT CLENALY.
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* FLAGS FOR SECTOR VERIFICATION.
|
|||
|
* ($BFA8 - $BFB7)
|
|||
|
* - NEG VAL = SECTOR VERIFIED.
|
|||
|
* - TABLE IS INDEXED BY (Y),
|
|||
|
* WHERE (Y) = SECTOR NUMBER.
|
|||
|
*=================================
|
|||
|
|
|||
|
SECFLGS HEX FFFFFFFFFFFFFFFF ;SECS $00 TO $07.
|
|||
|
HEX FFFFFFFFFFFFFFFF ;SECS $08 TO $0F.
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* PHYSICAL SECTOR NUMBERS
|
|||
|
* ($BFB8 - $BFC7)
|
|||
|
* - LISTED IN LOGICAL ORDER.
|
|||
|
*=================================
|
|||
|
|
|||
|
;CORRESPONDING LOGICAL SECTOR#.
|
|||
|
PHYSECTR HEX 00 ; 00
|
|||
|
HEX 0D ; 01
|
|||
|
HEX 0B ; 02
|
|||
|
HEX 09 ; 03
|
|||
|
HEX 07 ; 04
|
|||
|
HEX 05 ; 05
|
|||
|
HEX 03 ; 06
|
|||
|
HEX 01 ; 07
|
|||
|
HEX 0E ; 08
|
|||
|
HEX 0C ; 09
|
|||
|
HEX 0A ; 0A
|
|||
|
HEX 08 ; 0B
|
|||
|
HEX 06 ; 0C
|
|||
|
HEX 04 ; 0D
|
|||
|
HEX 02 ; 0E
|
|||
|
HEX 0F ; 0F
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* CLOBBER THE LANGUAGE CARD.
|
|||
|
* ($BFD9 - $BFDB)
|
|||
|
* - PATCH CALLED BY BOOT2.
|
|||
|
*=================================
|
|||
|
|
|||
|
CLOBCARD JSR SETVID ;SIMULATE A "PR#0" STATEMENT.
|
|||
|
LDA $C081 ;WRITE ENABLE RAM CARD.
|
|||
|
LDA $C081 ;(READ MOTHER/WRITE CARD BANK2.)
|
|||
|
LDA #0 ;SET LANGUAGE IDENTIFYING BYTE ON
|
|||
|
STA BASICCLD ;CARD TO $00 SO IF CARD IS TESTED
|
|||
|
;(DURING AN "FP" CMD), THE
|
|||
|
;MACHINE WILL BE FORCED TO USE
|
|||
|
;MOTHERBOARD VERSION OF FP.
|
|||
|
JSR CONTCLOB ;NOW CLOBBER THE 80-COLUMN CARD.
|
|||
|
JMP BK2BOOT2 ;RTN TO ORIGINAL PART OF BOOT2.
|
|||
|
|
|||
|
|
|||
|
*===================================
|
|||
|
* PATCH TO ZERO ADDED STORAGE BYTES.
|
|||
|
* ($BFDC - $BFE5)
|
|||
|
*===================================
|
|||
|
|
|||
|
ZEROPTCH STA TEMPBYT
|
|||
|
STA BYTPRSD
|
|||
|
STA BYTPRSD+1
|
|||
|
RTS
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* PATCH TO SET CONDITION 0 AND
|
|||
|
* CLEAR THE RUN INTERRUPT FLAG.
|
|||
|
* ($BFE6 - $BFEC)
|
|||
|
*=================================
|
|||
|
|
|||
|
RESTATIN JSR RESTAT0 ;ZERO OUT CONDNFLG & OPUTCOND.
|
|||
|
STY RUNTRUPT ;CLR THE RUN INTERRUPT FLAG.
|
|||
|
RTS
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* DISK-FULL ERROR PATCH.
|
|||
|
* ($BFED - $BFFF)
|
|||
|
*=================================
|
|||
|
|
|||
|
FULLPTCH JSR CPYFMWA ;COPY FM WRK AREA--->FM WRK BUF.
|
|||
|
LDX STKSAV ;RESTORE STACK POINTER.
|
|||
|
TXS
|
|||
|
JSR CLOSEALL ;CLOSE ALL FILES.
|
|||
|
TSX
|
|||
|
STX STKSAV ;SAVE STACK POINTER.
|
|||
|
LDA #9 ;EXIT WITH DISK-FULL ERROR CODE.
|
|||
|
JMP BADFMXIT
|
|||
|
|
|||
|
|
|||
|
**********************************
|
|||
|
* END OF DOS ($BFFF) *
|
|||
|
**********************************
|
|||
|
|