02A2 C9 RET ;-------------------------------------------------------------------- ;SHORT-LONG-SHORT? ; 1) THE SEEK ROUTINE RETURNS THE CARRY (ERROR_FLAG) CLEAR IF ; THE SEEK WAS SUCCESSFUL, SET IF THERE WAS AN ERROR. 02A3 7A PAT1: MOV A,D ;D STARTS AT HIGHEST TRACK NUMBER 02A4 CD1603 CALL SEEK ;SEEKS TO TRACK IN A 02A7 D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 02A8 7B MOV A,E ;E STARTS AT TRACK 0 02A9 CD1603 CALL SEEK 02AC D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 02AD 15 DCR D ;COUNT DOWN 02AE FAB602 JM REVERSE ;NO TRACKS LEFT 02B1 1C INR E ;COUNT UP 02B2 BE CMP M ;NUMBER OF TRACKS 02B3 C2A302 JNZ PAT1 02B6 14 REVERSE:INR D ;COUNT UP 02B7 7A MOV A,D 02B8 BE CMP M ;M HAS NUMBER OF TRACKS 02B9 C8 RZ 02BA CD1603 CALL SEEK ;ELSE SEEK 02BD D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 02BE 1D DCR E 02BF F8 RM ;NO TRACKS LEFT 02C0 7B MOV A,E 02C1 CD1603 CALL SEEK 02C4 D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 02C5 C3B602 JMP REVERSE ;-------------------------------------------------------------------- ;LONG-SHORT-LONG? ; 1) THE SEEK ROUTINE RETURNS THE CARRY (ERROR_FLAG) CLEAR IF ; THE SEEK WAS SUCCESSFUL, SET IF THERE WAS AN ERROR. 02C8 7A PAT2: MOV A,D ;D STARTS AT HIGHEST TRACK NUMBER 02C9 1F RAR ;DIVIDE BY 2 02CA 57 MOV D,A ;RESET D 02CB 5F MOV E,A ;SET E=D AT START 02CC 7A PAT2LP: MOV A,D ;START AT MIDDLE TRACK 02CD CD1603 CALL SEEK ;SEEKS TO TRACK IN A 02D0 D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 02D1 1D DCR E ;COUNT E DOWN, D UP 02D2 FADF02 JM PHASE2 ;REVERSE DIRECTION 02D5 7B MOV A,E ;ELSE READ IT 02D6 CD1603 CALL SEEK 02D9 D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 02DA 14 INR D ;COUNT UP IN FIRST PHASE 02DB BE CMP M ;NUMBER OF TRACKS 02DC C2CC02 JNZ PAT2LP 02DF 1C PHASE2: INR E ;COUNT UP 02E0 7B MOV A,E 02E1 CD1603 CALL SEEK 02E4 D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 02E5 15 DCR D ;COUNT DOWN 02E6 7A MOV A,D ;TO CHECK 02E7 BB CMP E ;LOOKING FOR CROSSING POINT 02E8 F8 RM ;FINISHED 02E9 CD1603 CALL SEEK ;ELSE CONTINUE 02EC D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 02ED C3DF02 JMP PHASE2 ;LOOP ;-------------------------------------------------------------------- ;BUTTERFLY (+2-1 OUT, THEN -2+1 BACK) ; 1) THE SEEK ROUTINE RETURNS THE CARRY (ERROR_FLAG) CLEAR IF ; THE SEEK WAS SUCCESSFUL, SET IF THERE WAS AN ERROR. 02F0 7A PAT3: MOV A,D ;D STARTS AT 0 02F1 CD1603 CALL SEEK ;TAKES DRIVE BACK ONE IN LOOP 02F4 D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 02F5 7A MOV A,D 02F6 C602 ADI 2 ;JUMP AHEAD TWO 02F8 BE CMP M ;NUMBER OF TRACKS 02F9 CA0403 JZ PHAZE2 ;REVERSE PATTERN 02FC CD1603 CALL SEEK 02FF D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 0300 14 INR D ;AND BACK ONE 0301 C3F002 JMP PAT3 ;REPEAT 0304 3D PHAZE2: DCR A ;FOR FIRST SHOT ONLY 0305 CD1603 PHLP: CALL SEEK 0308 D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 0309 7A MOV A,D 030A DE02 SBI 2 ;IN TWO 030C F8 RM 030D CD1603 CALL SEEK 0310 D8 RC ;IF (ERROR_FLAG = SET) THEN RETURN 0311 15 DCR D ;AND BACK ONE 0312 7A MOV A,D 0313 C30503 JMP PHLP ;-------------------------------------------------------------------- ;SEEK TO THE TRACK IN THE ACCM. ; 1) IF THERE ARE ANY ERRORS ENCOUNTERED THEN THEY ARE REPORTED ; TO THE CONSOLE AND THE ERROR_FLAG (THE CARRY BIT) IS SET. ; 2) IF THERE WERE NO ERRORS THEN THE ERROR_FLAG IS RESET. 0316 32FA06 SEEK: STA RDTKTK ;START AT TRACK INDICATED BY A 0319 323F07 STA TRACK ;KEEP RECORD 031C D5 PUSH D ;SAVE DE 031D E5 PUSH H ;SAVE HL 031E 4F MOV C,A ;SAVE TRACK IN C 031F 2A4207 LHLD LOGPNT ;GET LOG POINTER 0322 23 INX H ;ADVANCE LOG POINTER TO SIDES BYTE 0323 7E MOV A,M ;LOAD BYTE 0324 2B DCX H ;RETURN POINTER 0325 E680 ANI 80H ;SEE IF DBLESIDED BIT IS ON 0327 CA2F03 JZ ONESID ;IF NOT, FORGET IT 032A