10 REM > ModeDemo
   20 REM Demonstrate software and hardware display mode extensions
   30 :
   40 mode$="MODE ":MODE 10:VDU 8:IFPOS>20:mode$="|"
   50 ON ERROR mode$="|"
   60 OSCLImode$+"8":ON ERROR OFF
   70 REPEAT:RESTORE:FOR loop%=0 TO 31
   80     IF(loop%AND7)=0:PROCfont
   90     mode%=loop%+(loop%AND16)*5:READ flag
  100     IFflag:MODEmode%:OSCLImode$+STR$(mode%):PROCdemo(mode%)
  110 NEXT:UNTIL FALSE:END
  120 :
  130 DEFPROCfont:FOR A%=163 TO 175:VDU 23,A%
  140   VDU(A%AND8)*3,(A%AND8)*3,(A%AND8)*3,((A%AND2)*3.5)OR((A%AND4)*60)OR24
  150 VDU(A%AND1)*24,(A%AND1)*24,(A%AND1)*24,(A%AND1)*24:NEXT A%:ENDPROC
  160 :
  170 DATA 1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,0
  180 DATA 1,1,0,1,1,0,1,0,1,0,0,1,1,0,1,0
  190 :
  200 DEFPROCdemo(mode%)
  210 base=(mode%AND7)+1
  220 IF(mode%AND7)=3 OR (mode%AND6)=6:VDU 19,0,4,0,0,0
  230 columns=20*2^(2-((mode%AND7)MOD3)):IF(mode%AND7)=6:columns=40
  240 colours=VALMID$("0204160202040208041616040416040805131605051305080904160909040908",(((mode%DIV2)AND16)OR(mode%AND15))*2+1,2)
  250 A%=135:disp%=((USR&FFF4)AND&FF0000)DIV65536
  260 clrs%=colours:IFmode%<96:A%=160:X%=96:clrs%=((USR&FFF4)AND&FF00)DIV256+1
  270 :
  280 IFcolours=2 :back=128:fore=1:white=7:num$="two"
  290 IFcolours=4 :back=129:fore=3:white=3:num$="four"
  300 IFcolours=5 :back=129:fore=0:white=4:num$="five"
  310 IFcolours=8 :back=128:fore=7:white=7:num$="eight"
  320 IFcolours=9 :back=128:fore=7:white=7:num$="nine"
  330 IFcolours=13:back=130:fore=0:white=7:num$="13"
  340 IFcolours=16:back=130:fore=0:white=7:num$="16"
  350 colmax=colours-1
  360 IFcolmax<2 OR clrs%<>colours:colmax=3:back=128+clrs%-2:fore=back EOR 131:white=7
  370 IFcolmax>13:colmax=7
  380 :
  390 COLOUR back:COLOUR fore
  400 PRINT"£"STRING$(columns-2,"¦")"¥©";
  410 IFmode%<8:IFcolumns=80:PRINTSPC(21);
  420 IFcolumns=20:PRINTSPC(6);
  430 IFcolumns>20:PRINTSPC((7-LEN(STR$mode%+num$))/2);
  440 IFmode%=11:PRINTSPC(9);
  450 IFmode%>95:IFcolumns=80:PRINTSPC(3);
  460 PRINT"MODE ";mode%;
  470 IFcolumns=20:PRINTSPC(columns-POS-1);"©©";SPC(2-LENnum$/2)columns;" cols, ";num$;
  480 IFcolumns>20:PRINT" ";STRING$(2-(LEN(num$+STR$mode%)AND1),"-");" ";columns;" columns and ";num$;
  490 IFPOS>columns-8:PRINT" clrs"ELSE PRINT" colours";
  500 IFmode%<8 OR columns<80:PRINTSPC(columns-POS-1);"©";
  510 IFmode%>7:IFcolumns<80:PRINT"©";SPC(-(mode%=9));
  520 IFmode%>7:IFcolumns=80:PRINT" - ";
  530 IFmode%=12:PRINT"Small-memory MODE 1";
  540 IFmode%=13:PRINT"Small-mem'y MODE 2©© ";
  550 IF(mode%AND&FE)=14:PRINTSPC(10);
  560 IFmode%>95:IFcolumns<80:PRINTSPC(4);
  570 IFmode%>7:IFmode%<>12:PRINTnum$;"-colour MODE ";mode%AND7;
  580 IF(mode%AND&78)=8:IFmode%<11 OR mode%=12:PRINT" ";STRING$(1-(mode%=9),"-");" ";columns;"-column MODE ";base;
  590 IFmode%>95:PRINT" - MODE &";~mode%AND&68;"+";mode%AND7;
  600 IFmode%>7:PRINTSPC(columns-POS-1);"©";
  610 IF((mode%EORdisp%)AND&F0) OR clrs%<>colours:PRINT"©"SPC((columns-20)/2);"Dropping to MODE ";disp%;SPC(columns-POS-1);"©";
  620 PRINT"«"STRING$(columns-2,"¦")"­";
  630 :
  640 width=columns DIV colmax
  650 FOR A=0 TO colmax:PRINT"©";
  660   IFwidth=26:PRINTSPC(11);
  670   IFwidth=20:PRINTSPC(4);
  680   IFwidth=13:PRINTSPC((columns DIV 4)-1);
  690   IFwidth=10:PRINTSPC((columns DIV 4)-4);
  700   IFwidth=6 :PRINTSPC(3);
  710   IFwidth=5 :PRINTSPC(7);
  720   IFwidth=3 :PRINTSPC(1);
  730   IFwidth=2 :PRINTSPC(5);
  740   FOR B=0-(colmax>8) TO colmax
  750     C=(A+B) MOD colours
  760     IFcolours=9:COLOUR 0
  770     IFmode%<96:COLOUR 128+(C AND 7):COLOUR (colours-C-1) AND 7 ELSE COLOUR 128+C
  780     IFwidth>19:PRINT"   COLOUR ";C;SPC3;
  790     IFwidth<20:PRINTSPC(SQR(width+1)-1);~C;SPC(SQR(width+1)-1);
  800   NEXT:COLOUR back:COLOUR fore
  810   PRINTSPC(columns-POS-1);"©";
  820 NEXT:PRINT"ª"STRING$(columns-2,"¦")"¬";
  830 COLOUR 128:COLOUR white
  840 IFcolumns>20:*.
  850 PRINT">*BMPSave MODE";mode%;"/bmp";CHR$8
  860 PROCpr(LEFT$("Press SPACE...  Press SPACE...  Press SPACE...",columns/5*4-2),colmax+2*(clrs%=2))
  870 COLOUR white
  880 IFINKEY(500)=83:OSCLI"BMPSave MODE"+STR$mode%+"/bmp"
  890 ENDPROC
  900 :
  910 DEFPROCpr(A$,N):FOR A=1 TO LEN A$:COLOUR A MOD N+1:PRINTMID$(A$,A,1);:NEXT:ENDPROC