10 REM > Pixels
   20 REM Test correct number of logical pixels for screen size
   30 :
   40 ON ERROR PRINTLEFT$(CHR$10+CHR$13,?(TOP-3)=0);:REPORT:IF ERR=25:RUN ELSE END
   50 :
   60 test%=FALSE
   70 bbfw%=FALSE:IF PAGE>&FFFF:bbfw%=(INKEY-256 AND &DB)=&53
   80 :       :gap$=CHR$3+CHR$6+CHR$7+CHR$11+CHR$14+CHR$17
   90 IF bbfw%:gap$=CHR$3+CHR$6+CHR$7+CHR$20+CHR$21+CHR$28+CHR$29
  100 FOR M%=0 TO 127
  110   MODE M%
  120   REPEAT:txH%=VPOS+1:PRINT:UNTILtxH%=VPOS+1:PRINTCHR$8;:txW%=POS+1
  130   :       :gap%=INSTR(gap$,CHR$M%)<>0 AND (txH%=22 OR txH%=25)
  140   IF bbfw%:gap%=INSTR(gap$,CHR$M%)<>0:REM Slightly different for BBFW
  150   :
  160   REM test:
  170   IF test%:IF M%=3:MODE 0:VDU 28,0,31,79,7:txW%=80:txH%=25:gap%=0:REM US
  180   IF test%:IF M%=6:MODE 1:VDU 28,0,31,39,7:txW%=40:txH%=25:gap%=0:REM US
  190   IF test%:IF M%=7:MODE 1:VDU 28,0,31,31,8:txW%=32:txH%=24:gap%=0:REM Spectrum
  200   :
  210   COLOUR &BF:PRINT'SPC1;:cols%=ABSPOINT(0,0)+1:REM cols%=cols%-192*(cols%=64)
  220   IF cols%<3:IF M%=7:cols%=8
  230   COLOUR &C1:COLOUR &84:COLOUR 7:GCOL 0,&84:GCOL 0,7
  235   VDU 19,-1,0,255,0,0,19,24,0,255,0,0
  240   VDU 19,4,4,0,0,255, 19,7,7,255,255,255
  250   VDU 19,0,4,0,0,255, 23,1,0;0;0;0;
  260   :
  270   CLS
  280   gfH%=txH%*(8-2*gap%)                         :REM Physical pixels
  290   gfW%=txW%*8
  300   gfY%=gfH%:REPEAT:gfY%=gfY%*2:UNTIL gfY%>=&300:REM Logical pixels
  310   gfX%=gfW%:REPEAT:gfX%=gfX%*2:UNTIL gfX%>=&400
  320   REM Doesn't work for MODE 22
  330   REM Doesn't work for some DOS MODEs
  340   :
  350   REM Subtly different for BBFW
  360   IF bbfw%:gfY%=gfH%*4                                  :REM Fixed EigenY
  370   IF bbfw%:gfX%=gfW%:REPEAT:gfX%=gfX%*2:UNTIL gfX%>=gfY%:REM width always > height
  380   :
  390   PRINTTAB((txW%-LENSTR$M%-5)/2,1);"MODE ";M%
  400   PRINTTAB(FNpos(txW%/2-9),2);txW%;" x ";txH%;" characters"
  410   PRINTTAB(FNpos(txW%/2-6-LENSTR$gfW%-LENSTR$gfH%),3);gfW%;" x ";gfH%;" physical ";LEFT$("pixels",txW%>20)
  420   PRINTTAB(FNpos(txW%/2-5-LENSTR$gfX%-LENSTR$gfY%),4);gfX%;" x ";gfY%;" logical ";LEFT$("pixels",txW%>20)
  430   IFcols%>1:PRINTTAB((txW%-LENSTR$cols%-8)/2,5);cols%;" colours"
  440   :
  450   PRINTTAB(0,txH%-4+2*(txW%<80)+2*(txW%<40)+8*(txW%<20));
  460   PROCc("In graphics modes",txW%):PRINT
  470   PROCc("there should be a diagonal crossing from each corner.",txW%):PRINT
  480   PROCc("If they do not the logical-to-physical pixel mapping is wrong.",txW%)
  490   :
  500   MOVE 0,0:GCOL 0,7:FOR A%=1 TO 7
  510     x%=VALMID$("1100101",A%,1)*(gfX%-1)
  520     y%=VALMID$("0110110",A%,1)*(gfY%-1)
  530   DRAW x%,y%:NEXT A%
  540   T%=TIME+500:REPEATA%=INKEY(64):UNTILTIME>T% OR A%>-1:IF A%=8 OR A%=127:M%=M%-2
  550 NEXT M%
  560 RUN
  570 :
  580 DEFFNpos(A%)=A%AND(A%>0)
  590 DEFPROCc(A$,W%):A$=A$+" ":REPEAT
  600   A%=W%+1:REPEAT:A%=A%-1:UNTIL MID$(A$,A%,1)=" " OR A%<0:IF A%<0:A%=W%+1
  610   PRINTSTRING$(W%DIV2-A%DIV2,CHR$9);LEFT$(A$,A%-1);:IF A%>W%:VDU 8:A%=A%-1
  620   A$=MID$(A$,A%+1):IF A$<>"":PRINT
  630 UNTIL A$="":ENDPROC