10 REM > ClockSp4 2.01 - Calibrated against BASIC IV
   20 REM Calculate CPU clock speed
   30 PRINT"BBC BASIC IV CPU Timing Program"
   40 A%=0:T%=TIME:REPEATA%=A%+1:UNTILTIME>T%+50
   50 Z=0:Z%=0:B=1:B%=1:F=1/10:C=100:C%=100:D=510:D%=510:F%=3
   60 REPEAT:C=C*10:C%=C%*10:D=D*10:D%=D%*10:F%=F%*10:F=F*10:A%=A%DIV10:UNTILA%<50
   70 PRINT"Real REPEAT loop    ";:T%=TIME:A=Z:REPEATA=A+B:UNTILA>C:T%=TIME-T%:PROCp(F*35700/T%)
   80 PRINT"Integer REPEAT loop ";:T%=TIME:A%=Z%:REPEATA%=A%+B%:UNTILA%>C%:T%=TIME-T%:PROCp(F*21200/T%)
   90 PRINT"Real FOR loop       ";:T%=TIME:FORA=Z TO D STEP B:NEXT:T%=TIME-T%:PROCp(F*43800/T%)
  100 PRINT"Integer FOR loop    ";:T%=TIME:FORA%=Z% TO D% STEP B%:NEXT:T%=TIME-T%:PROCp(F*16200/T%)
  110 PRINT"Trig/Log test       ";:IFCOS0=0:PRINTSPC4"<none>"
  120 IFCOS0<>0:A=1:T%=TIME:FORJ%=1 TO F%:A=TAN(ATN(EXP(LN(SQR(A*A)))))+1:NEXT:T%=TIME-T%:PROCp(F*30500/T%)
  130 REM PRINT"Ackermann Recursion ";
  140 REM M%=3:T%=TIME:FORN%=1 TO 3:Z%=FNAck(M%,N%):NEXT:T%=TIME-T%:PROCp(F*255400/T%)
  150 PRINT"String manipulation ";
  160 T%=TIME:A$="STRINGMANIPULATIONTEST":FORA%=0TOF%*4:A$=RIGHT$(MID$(A$,LENA$/2,LENA$/4+1)+RIGHT$(A$,LENA$/4)+MID$(A$,LENA$/2,2)+LEFT$(A$,LENA$/4)+MID$(A$,LENA$/4,LENA$/4+1),LENA$):NEXT:T%=TIME-T%:PROCp(F*56400/T%)
  170 PRINT"Procedure call      ";:T%=TIME:FORA%=Z% TO D%:PROCtest:NEXT:T%=TIME-T%:PROCp(F*75750/T%)
  180 PRINT"GOSUB call          ";:T%=TIME:FORA%=Z% TO D%:GOSUB300:NEXT:T%=TIME-T%:PROCp(F*86400/T%)
  190 PRINT"Combined Average    ";:PROCp(FNspeed)
  200 PRINT'"Compared to a 2.00MHz BBC Master"
  210 END
  220 :
  230 DEFFNAck(M%,N%)
  240 IF M%=0:=N%+1
  250 IF N%=0:=FNAck(M%-1,1)
  260 =FNAck(M%-1,FNAck(M%,N%-1))
  270 :
  280 DEFPROCtest:ENDPROC
  290 :
  300 RETURN
  310 :
  320 DEFPROCp(T%):PRINTRIGHT$("     "+STR$(T%DIV100),6);".";RIGHT$("0"+STR$(T%),2);"MHz";CHR$8:ENDPROC
  330 :
  340 REM This is calibrated against a
  350 REM BBC Master 128 with no second
  360 REM processor, running BASIC IV
  370 REM and with almost all interupts
  380 REM turned off using:
  390 REM ?&FE4E=&3F
  400 REM This gives 2.00MHz.
  410 :
  420 REM Savage Floating Point test and
  430 REM Ackermann Recursion test added
  440 REM -Mar-1993, based on A&B Jan 90.
  450 :
  460 REM Version 2.00 recalibrates
  470 REM itself for faster systems
  480 REM 15-Mar-2002
  490 :
  500 DEFFNspeed:LOCAL A,B,C,D,F,Z,A%,B%,C%,D%,F%,Q%,R%,S%,U%,V%,W%,X%,Y%,Z%
  510 A%=0:T%=TIME:REPEATA%=A%+1:UNTILTIME>T%+50
  520 Z=0:Z%=0:B=1:B%=1:F=1/10:C=100:C%=100:D=510:D%=510:F%=3
  530 REPEAT:C=C*10:C%=C%*10:D=D*10:D%=D%*10:F%=F%*10:F=F*10:A%=A%DIV10:UNTILA%<50
  540 T%=TIME:A=Z:REPEATA=A+B:UNTILA>C:T%=TIME-T%:U%=F*35700/T%
  550 T%=TIME:A%=Z%:REPEATA%=A%+B%:UNTILA%>C%:T%=TIME-T%:V%=F*21200/T%
  560 T%=TIME:FORA=Z TO D STEPB:NEXT:T%=TIME-T%:W%=F*43800/T%
  570 T%=TIME:FORA%=Z% TO D% STEPB%:NEXT:T%=TIME-T%:X%=F*16200/T%
  580 Y%=X%:IFCOS0<>0:A=1:T%=TIME:FORJ%=1 TO F%:A=TAN(ATN(EXP(LN(SQR(A*A)))))+1:NEXT:T%=TIME-T%:Y%=F*30500/T%
  590 T%=TIME:A$="STRINGMANIPULATIONTEST":FORA%=0TOF%*4:A$=RIGHT$(MID$(A$,LENA$/2,LENA$/4+1)+RIGHT$(A$,LENA$/4)+MID$(A$,LENA$/2,2)+LEFT$(A$,LENA$/4)+MID$(A$,LENA$/4,LENA$/4+1),LENA$):NEXT:T%=TIME-T%:S%=F*56400/T%
  600 T%=TIME:FORA%=Z% TO D%:PROCtest:NEXT:T%=TIME-T%:R%=F*75750/T%
  610 T%=TIME:FORA%=Z% TO D%:GOSUB300:NEXT:T%=TIME-T%:Q%=F*86400/T%
  620 =INT((Q%+R%+S%+U%+V%+W%+X%+Y%)/(777/100))
  630 REM Returns CPU speed*100