  100 PROGRAM "BENCH.BAS"
  110 !
  120 !*******************************
  130 ! Routine to cure ALLOCATE bug
  140 !*******************************
  150 !
  160 LET UNIQUE$="SCREEN$"
  170 LET DESIRED_SPACE=100
  180 LET SYZE=DESIRED_SPACE+LEN(UNIQUE$)
  190 IF VERNUM=2THEN
  200   LET T=PEEK(544)+256*PEEK(545)-SYZE
  210   FOR X=1TOLEN(UNIQUE$)
  220     IF PEEK(X+T-1)<>ORD(UNIQUE$(X:X))THEN
  230       ALLOCATE SYZE
  240       POKE 542,PEEK(544)
  250       POKE 543,PEEK(545)
  260       CODE ="SCREEN$"
  270       RUN 
  280     END IF 
  290   NEXT 
  300   LET X=X+T
  310   POKE 540,XBAND255
  320   POKE 541,X/256
  330 ELSE 
  340   ALLOCATE DESIRED_SPACE
  350 END IF 
  360 !
  370 !*******************************
  380 ! Find video memory for test 4
  390 !*******************************
  400 !
  410 CODE FINDMEM=HEX$("7d,6,3,f7,b,21,0,80,eb,b7,ed,52,c9")
  420 !
  430 !*******************************
  440 ! Set up variables etc
  450 !*******************************
  460 !
  470 TEXT 40
  480 LET A$=""
  490 LET SYZE=999
  500 LET PRIME=0
  510 DIM FL(2001),PR(1000)
  520 STRING *10S$(50)
  530 !
  540 !*******************************
  550 ! Select benchmark test
  560 !*******************************
  570 !
  580 CLEAR SCREEN
  590 PRINT AT3,15:"BENCH-MARKS"
  600 PRINT AT4,15:"___________"
  610 PRINT :PRINT 
  620 PRINT "                          64K BASIC"
  630 PRINT 
  640 PRINT "1 - prime numbers       ( 72 seconds )"
  650 PRINT "2 - number sort         (348    -    )"
  660 PRINT "3 - string sort         ( 61    -    )"
  670 PRINT "4 - alphabet display    (306    -    )"
  680 PRINT :PRINT 
  684 PRINT "Timing between the pings"
  686 PRINT :PRINT 
  690 PRINT "Enter test number ( 0 to exit )  ";
  700 GET A$
  710 IF A$=""THEN 700
  720 PRINT A$
  730 LET A=ORD(A$)-48
  740 PRINT :PRINT :PING 
  750 SELECT A
  760 CASE 0
  770   END 
  780 CASE 1
  790   GOTO  940
  800 CASE 2
  810   GOTO  1260
  820 CASE 3
  830   GOTO  1630
  840 CASE 4
  850   GOTO  2030
  860 CASE ELSE
  870   GOTO  690
  880 END SELECT 
  890 !
  900 !*******************************
  910 ! Test 1 - Prime Numbers
  920 !*******************************
  930 !
  940 LET COUNT=2
  950 FOR I=0TOSYZE
  960   LET FL(I),PR(I)=1
  970 NEXT I
  980 FOR I=0TOSYZE
  990   IF FL(I)=0THEN 1080
 1000   LET PRIME=I+I+3
 1010   LET K=I+PRIME
 1020   IF K>SYZETHEN 1060
 1030   LET FL(K)=0
 1040   LET K=K+PRIME
 1050   GOTO  1020
 1060   LET COUNT=COUNT+1
 1070   LET PR(COUNT)=PRIME
 1080 NEXT 
 1090 PING 
 1100 PRINT "There are";
 1110 PRINT COUNT;"prime numbers"
 1120 PRINT "between 1 and 2000"
 1130 GOSUB  2190
 1140 IF A=0THEN 580
 1150 PRINT :PRINT 1,2,
 1160 FOR I=3TOCOUNT
 1170   PRINT PR(I),
 1180 NEXT 
 1190 WAIT 4
 1200 GOTO  580
 1210 !
 1220 !*******************************
 1230 ! Test 2 - Number Sort
 1240 !*******************************
 1250 !
 1260 LET X=17
 1270 FOR I=1TO100
 1280   LET X=X*37
 1290   LET X=X-100*INT(X/100)
 1300   LET FL(I)=X
 1310 NEXT I
 1320 LET FL(101),FL(0)=0
 1330 LET N=I
 1340 LET S=0
 1350 FOR I=2TON
 1360   IF FL(I)>=FL(I-1)THEN 1430
 1370   LET Z=FL(I-1)
 1380   LET I=I-1
 1390   LET FL(I)=FL(I+1)
 1400   LET I=I+1
 1410   LET FL(I)=Z
 1420   LET S=1
 1430 NEXT I
 1440 IF S=1THEN 1340
 1450 PING 
 1460 GOSUB  2190
 1470 IF A=0THEN 580
 1480 LET K=0
 1490 FOR I=1TON
 1500   PRINT TAB(12*K+1);FL(I);
 1510   LET K=K+1
 1520   IF K<3THEN 1550
 1530   LET K=0
 1540   PRINT 
 1550 NEXT 
 1560 WAIT 4
 1570 GOTO  580
 1580 !
 1590 !*******************************
 1600 ! Test 3 - String sort
 1610 !*******************************
 1620 !
 1630 RESTORE 
 1640 FOR I=1TO50
 1650   READ S$(I)
 1660   IF S$(I)="ZZZ"THENEXIT FOR
 1670 NEXT 
 1680 LET N=I-1
 1690 LET S=0
 1700 FOR I=2TON
 1710   IF S$(I-1)<=S$(I)THEN 1760
 1720   LET Z$=S$(I-1)
 1730   LET S$(I-1)=S$(I)
 1740   LET S$(I)=Z$
 1750   LET S=1
 1760 NEXT 
 1770 IF S=1THEN 1690
 1780 PING 
 1790 GOSUB  2190
 1800 IF A=0THEN 580
 1810 LET K=0
 1820 FOR I=1TON
 1830   PRINT S$(I);" ";
 1840 NEXT 
 1850 WAIT 4
 1860 GOTO  580
 1870 DATA NOTE,THAT,THE,ORDER,OF
 1880 DATA SORT,CAN,BE,CHANGED,FROM
 1890 DATA ASCENDING,DESCENDING,BY
 1900 DATA MAKING,GREATER,THEN,TEST
 1910 DATA IN,LINE,LESS,ALSO,SAYS
 1920 DATA REPEAT,LOOP,FOUR,TIMES
 1930 DATA FIVE,DUE,FACT,LOOKS,AHEAD
 1940 DATA ONE,STEP
 1950 DATA WHY,NOT,ADD,A,FEW,MORE
 1960 DATA WORDS,TO,MAKE,UP,THE
 1970 DATA NUMBERS,ZZZ
 1980 !
 1990 !*******************************
 2000 ! Test 4 - Alphabet display
 2010 !*******************************
 2020 !
 2030 TEXT 40
 2040 LET SCREEN_MEM=REM(USR(FINDMEM,102),16384)
 2045 LET INK_COLOUR=GREEN
 2050 FOR CHAR=65TO90
 2060   FOR POSITION=0TO959
 2070     SPOKE 255,SCREEN_MEM+POSITION,CHAR
 2080   NEXT 
 2082   LET INK_COLOUR=(INK_COLOUR+25)BAND255
 2084   SET #102:PALETTE0,INK_COLOUR
 2090 NEXT 
 2100 PING 
 2110 WAIT 4
 2120 TEXT 40
 2130 GOTO  580
 2140 !
 2150 !*******************************
 2160 ! Ask if list wanted
 2170 !*******************************
 2180 !
 2190 PRINT :PRINT 
 2200 LET A$=""
 2210 PRINT "Do you want a list ? (Y/N) ";
 2220 GET A$
 2230 IF A$=""THEN 2220
 2240 LET A=UCASE$(A$(1:1))="Y"
 2250 PRINT :PRINT 
 2260 RETURN 

