MODE 7 NUM_RECORDS=0 REPEAT INPUT "Number of records on tape ",NUM_RECORDS IF NUM_RECORDS<2 PRINT "Error. Need 2 or more records"':NUM_RECORDS=0 IF NUM_RECORDS>3000000 PRINT "Error. Must be 3000000 records or fewer"':NUM_RECORDS=0 UNTIL NUM_RECORDS>0 PRINT "Loop the tape? (Y/N)"; IF "Y"=GET$ THEN LOOP=1 MODE 1 PROCINIT(LOOP,NUM_RECORDS,0):REM loop?, number of records on tape, slow mode PROCGO END : DEFPROCINIT(LOOP,NUM_RECORDS,SLOW) LP=LOOP NR=NUM_RECORDS SL=SLOW IF LOOP THEN L=350 ELSE L=500 CX=640:CY=400:REM radius, centre Z=0:REM total tries A=0:REM accumulated distance TX=20:TY=0:REM text pos BY=50:REM Y-offset for line mode PRINT TAB(TX-6,TY);"Tries" PRINT TAB(TX-8,TY+1);"Current" PRINT TAB(TX-5,TY+2);"Next" PRINT TAB(TX-16,TY+3);"Linear Distance" IF LP THEN PRINT TAB(TX-16,TY+4);"Modulo Distance" PRINT TAB(TX-10,TY+6);"Mean Seek" REMPRINT TAB(18,9);"99 0" PRINT TAB(15,19);NR;" records" IF LOOP THEN PROCCIRC ELSE PROCLINE ENDPROC : DEFPROCGO LOCAL R,P,Q P=-1:Q=-1 REPEAT R=FNRAND PROCMARK(Q,1):REM erase PROCMARK(R,1) IF P>-1 THEN PROCDIST(R,P) Q=P:P=R:REM keep two previous values UNTIL FALSE ENDPROC : DEFPROCDIST(G1,G0) LOCAL D Z=Z+1:REM tries PRINT TAB(TX,TY);Z PRINT TAB(TX,TY+1);G0 PRINT TAB(TX,TY+2);G1 D=G1-G0:REM distance between old and new records IF D<0 THEN D=-D:REM absolute value PRINT TAB(TX,TY+3);D;" " IF LP AND D>(NR/2) THEN D=NR-D:PRINT TAB(TX,TY+4);D;" " ELSE PRINT TAB(TX,TY+4);" ":REM modulo for tape loop A=A+D PRINT TAB(TX,TY+6);(A/Z) IF SL THEN TIME=0:REPEAT UNTIL TIME>500 ENDPROC : DEFPROCMARK(G,T) IF G<0 THEN ENDPROC:REM don't erase blank mark GCOL 3,3 IF LOOP THEN PROCMARKCIRC(G,T) ELSE PROCMARKLINE(G,T) ENDPROC : DEFPROCMARKLINE(G,I):REM I is mark type PROCDRAWMARK((CX-L)+(2*L*(G/(NR-1))),CY+BY) ENDPROC : DEFPROCMARKCIRC(G,I):REM I is mark type LOCAL T,X,Y T=FNRADZ(G,NR) X0=CX+L*SIN(T) Y0=CY+L*COS(T) PROCDRAWMARK(X0,Y0) ENDPROC : DEFPROCDRAWMARK(X0,Y0) LOCAL X,Y FOR X=-10 TO 10 STEP 20 FOR Y=-10 TO 10 STEP 20 MOVE X0,Y0 DRAW X0+X,Y0+Y NEXT, ENDPROC : DEFFNRADZ(G,H):=(2*PI*G)/H : DEFPROCCIRC LOCAL G,T,U MOVE CX,CY+L GCOL 0,1 REM U=NR-1 REM IF LOOP THEN U=U+1 FOR G=0 TO 50 T=FNRADZ(G,50) DRAW CX+L*SIN(T),CY+L*COS(T) NEXT ENDPROC : DEF PROCLINE MOVE CX-L,CY+BY GCOL 0,1 DRAW CX+L,CY+BY ENDPROC : DEFFNRAND LOCAL R R=RND(NR)-1 IF R=P THEN =FNRAND:REM if no seek required then try again =R