{Recalibrate.mc debugging hack for Initial.mc last edit by Jarvis October 15, 1980 3:09 PM}

SetTask[0];

RegDef[stepCount, U, 1];

{control bits, high byte}
Set[driveSelectBit, 4], Set[faultClearBit, 2];
{useful combinations}
Set[faultClearCmd, Or[driveSelectBit, faultClearBit]];

recal:
rE← 20,c1;
stepCount← rE,c2;
Noop,c3;
rE← faultClearCmd,c1;
KCtl← rE LRot8,c2;
KCtl← 0,c3;

recal0:
Xbus← KStatus, XRefBr,c1;
rE← driveSelectBit, BRANCH[$, recal1],c2; {check for drive ready}
rE← KCtl← rE LRot8, GOTO[recal0],c3;

{disk is ready}
recal1:
rE← driveSelectBit,c3; {step out first}
rE← rE LRot8,c1;
rE← rE or inBit,c2;
KCtl← rE LRot0,c3;

{Step bit must be high for at least one microsecond and then low for at least one microsecond. Since a click is 411 ns, stepBit can change only once every third click.}

check00:
rD← ~KStatus, CANCELBR[$, 1],c1, at[0B, 10, check00];
rD← rD LRot8, XDisp,c2; {pick up status}
[]← rD and 2, ZeroBr, DISP4[check00, 0B],c3; {check for seek complete}

seekComplete:
rE← rE or stepBit, BRANCH[at00, $],c1, at[0F, 10, check00];
KCtl← rE LRot0,c2;
rD← 3,c3;
seekWait:
rE← rE and ~stepBit,c1;
rD← rD-1, ZeroBr,c2;
BRANCH[seekWait, $],c3;
rD← stepCount, ZeroBr,c1;
KCtl← rE LRot0, BRANCH[$, countedOut],c2;
rD← rD-1,c3;
stepCount← rD,c1;
Noop,c2;
GOTO[check00],c3;

countedOut:
Noop,c3;
rD← rE and inBit,c1;
[]← rD, ZeroBr,c2;
rE← rE xor inBit, BRANCH[$, recalLost],c3;
rD← 0FF+1, {max is 256 cylinders for SA1000}c1;
rD← LShift1 rD,c2;
stepCount← rD, GOTO[check00],c3;

recalLost:
Noop,c1;
Noop,c2;
GOTO[recalLost],c3;

at00:
Noop,c2;
Noop,c3;
GOTO[at00],c1;