10
20
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:
150 :
160
170 IF test%:IF M%=3:MODE 0:VDU 28,0,31,79,7:txW%=80:txH%=25:gap%=0:
180 IF test%:IF M%=6:MODE 1:VDU 28,0,31,39,7:txW%=40:txH%=25:gap%=0:
190 IF test%:IF M%=7:MODE 1:VDU 28,0,31,31,8:txW%=32:txH%=24:gap%=0:
200 :
210 COLOUR &BF:PRINT'SPC1;:cols%=ABSPOINT(0,0)+1:
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%) :
290 gfW%=txW%*8
300 gfY%=gfH%:REPEAT:gfY%=gfY%*2:UNTIL gfY%>=&300:
310 gfX%=gfW%:REPEAT:gfX%=gfX%*2:UNTIL gfX%>=&400
320
330
340 :
350
360 IF bbfw%:gfY%=gfH%*4 :
370 IF bbfw%:gfX%=gfW%:REPEAT:gfX%=gfX%*2:UNTIL gfX%>=gfY%:
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