NEWコマンドを入力すればプログラムを消去できるので、ES-BASICを再起動せずに次々とコピペでデモが動かせます。
1000 OPENWIN 256,160
1010 ARY INT NEW VERTX[8]; ARY INT VERTX[0...]={ 2,2,2,2,0,0,0,0 }
1020 ARY INT NEW VERTY[8]; ARY INT VERTY[0...]={ 2,2,0,0,2,2,0,0 }
1030 ARY INT NEW VERTZ[8]; ARY INT VERTZ[0...]={ 2,0,2,0,2,0,2,0 }
1040 ARY INT NEW VX[8]; ARY INT NEW VY[8]; ARY INT NEW VZ[8]
1050 ARY INT NEW CENTERZ4[6]
1060 ARY INT NEW SCX[8]; ARY INT NEW SCY[8]
1070 ARY INT NEW BUF0[160]; ARY INT NEW BUF1[160]
1080 ARY INT NEW SQUAR[24]
1090 ARY INT SQUAR[0...]={ 0,4,6,2, 1,3,7,5, 0,2,3,1, 0,1,5,4, 4,5,7,6, 6,7,3,2 }
1100 FOR I=0,7
1110 X=VERTX[I]; VERTX[I]=(X-1)*50
1120 Y=VERTY[I]; VERTY[I]=(Y-1)*50
1130 Z=VERTZ[I]; VERTZ[I]=(Z-1)*50
1140 NEXT
1150 ARY INT NEW COL[6]; ARY INT COL[0...]={ 4,2,6,1,5,3 }
1160 THX=0; THY=0; THZ=0
1170 DOLOOP
1180 THX=(THX+182)&65535
1190 THY=(THY+273)&65535
1200 THZ=(THZ+364)&65535
1210 XP=FF16COS(THX); XA=FF16SIN(THX)
1220 YP=FF16COS(THY); YA=FF16SIN(THY)
1230 ZP=FF16COS(THZ); ZA=FF16SIN(THZ)
1240 FOR I=0,7
1250 S=VERTZ[I]*XP; T=VERTY[I]*XA; ZT=S+T
1260 S=VERTY[I]*XP; T=VERTZ[I]*XA; YT=S-T
1270 S=VERTX[I]*YP; T=YA*:ZT>>16; XT=S+T
1280 S=YP*:ZT>>16; T=VERTX[I]*YA; VZ[I]=S-T
1290 S=ZP*:XT>>16; T=ZA*:YT>>16; VX[I]=S-T
1300 S=ZP*:YT>>16; T=ZA*:XT>>16; VY[I]=S+T
1310 NEXT
1320 L=0; FOR I=0,5
1330 K=SQUAR[L]; S=VZ[K]
1340 K=SQUAR[L+1]; T=VZ[K]; S=S+T
1350 K=SQUAR[L+2]; T=VZ[K]; S=S+T
1360 K=SQUAR[L+3]; T=VZ[K]
1370 CENTERZ4[I]=S+T+0X70000000
1380 L=L+4
1390 NEXT
1400 FILLRECT0 160,160,48,0,0
1410 GOSUB DRAWOBJ
1420 IF EINKEY!=0 THEN END; FI
1430 EWAIT 50
1440 ENDDO
1450 //
1460 DRAWOBJ:
1470 FOR I=0,7
1480 T=(VZ[I]+13107200)>>16; // 400<<16?
1490 T=4915200/T; // 150<<16
1500 S=VX[I]*:T>>16; SCX[I]=(S>>15)+128
1510 S=VY[I]*:T>>16; SCY[I]=(S>>15)+80
1520 NEXT
1530 DOLOOP
1540 MAX=0
1550 FOR K=0,5
1560 T=CENTERZ4[K]
1570 IF MAX<T THEN MAX=T; J=K; FI
1580 NEXT
1590 IF MAX==0 THEN RETURN; FI
1600 I=J*4; CENTERZ4[J]=0
1610 K0=SQUAR[I]
1620 K1=SQUAR[I+1]
1630 K2=SQUAR[I+2]
1640 V0X=VX[K0]; V0Y=VY[K0]
1650 V1X=VX[K1]; V1Y=VY[K1]
1660 V2X=VX[K2]; V2Y=VY[K2]
1670 E0X=V1X-V0X
1680 E0Y=V1Y-V0Y
1690 E1X=V2X-V1X
1700 E1Y=V2Y-V1Y
1710 S=E0X*:E1Y>>16; T=E0Y*:E1X>>16
1720 IF S<=T THEN
1730 GOSUB DRAWPOLY
1740 FI
1750 ENDDO
1760 //
1770 DRAWPOLY:; // obj(j, i:brk)
1780 I1=I+3; K=SQUAR[I1]
1790 P0X=SCX[K]; P0Y=SCY[K]
1800 YMIN=99999; YMAX=0
1810 FOR I=I,I1
1820 K=SQUAR[I]
1830 P1X=SCX[K]; P1Y=SCY[K]
1840 IF YMIN>P1Y THEN YMIN=P1Y; FI
1850 IF YMAX<P1Y THEN YMAX=P1Y; FI
1860 IF P0Y!=P1Y THEN
1870 IF P0Y<P1Y THEN
1880 BUF=BUF0; Y0=P0Y; Y1=P1Y; DX=P1X-P0X; X=P0X
1890 ELSE
1900 BUF=BUF1; Y0=P1Y; Y1=P0Y; DX=P0X-P1X; X=P1X
1910 FI
1920 X=X<<16
1930 DX=DX<<16
1940 T=Y1-Y0; DX=DX/T
1950 IF DX>=0 THEN X=X+0X8000; ELSE X=X-0X8000; FI
1960 FOR Y=Y0,Y1
1970 BUF[Y]=X>>16
1980 X=X+DX
1990 NEXT
2000 FI
2010 P0X=P1X; P0Y=P1Y
2020 NEXT
2030 C=COL[J]
2040 FOR Y=YMIN,YMAX
2050 P0X=BUF0[Y]
2060 P1X=BUF1[Y]
2070 IF P0X<=P1X THEN
2080 FILLRECT0 P1X-P0X+1,1,P0X,Y,C
2090 ELSE
2100 FILLRECT0 P0X-P1X+1,1,P1X,Y,C
2110 FI
2120 NEXT
2130 RETURN