Home » Personal collection » Commodore disks » disk42a_unlabelled.d64 » basic
basic
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
| Tape/disk: | Home » Personal collection » Commodore disks » disk42a_unlabelled.d64 | 
| Filename: | basic | 
| Read OK: | ✔ | 
| File size: | 06CE bytes | 
| Load address: | 0801 | 
| Exec address: | 0000 | 
Duplicates
There is 1 duplicate copy of this file in the archive:
- Personal collection » Commodore disks » disk42a_unlabelled.d64 » basic
- Personal collection » Commodore disks » disk50a2_progs1.d64 » cube render
File contents
    10 REM CUBE RENDER - BY D.FORD
    20 :
   100 XM=39:YM=24:CA=42
   102 PRINT"<clr><red>"
   103 FORR=$0400 TO $07F8:POKER,160:NEXT
   104 FORR=$D800 TO $DC00:POKER,2:NEXT
   110 FOR X=0 TO XM
   120 FOR Y=0 TO YM
   125 LS=0:SO=0:OM=0
   130 XP=0:YP=0:ZP=0:THETA=20+X*50/XM
   140 ALPHA=20+Y*50/YM
   150 GOSUB 2000:REM CO-ORDS
   155 POKE214,23:POKE211,0:SYS 58732
   157 PRINT"<white>                                        ";
   158 POKE214,23:POKE211,0:SYS 58732
   159 PRINTXN;YN;ZN;
   160 GOSUB 50000
   170 IF RI<>OM THEN GOSUB 500
   175 OM=RI
   180 IF INT(ZN)=40 AND INT((YN+XN)/2)=(YN+XN)/2 THEN LS=1
   185 IF XN>40 OR XN<0 OR YN<0 OR YN>40 OR ZN<0 OR ZN>40 THEN SO=1000
   187 XP=XN:YP=YN:ZP=ZN
   190 SO=SO+1:IF SO<750AND LS<>1THEN 150
   200 C=0
   210 IF LS=1 THEN C=1
   220 POKE $D800+X+Y*40,C
   230 NEXT:NEXT
   240 GOTO 240
   490 :
   500 REM LEAVE GLASS BLOCK
   505 IF RI<>0 THEN 3000
   510 GOSUB 1000
   520 IF IT>CA THEN GOTO 6000
   530 GOTO 5000
   990 :
  1000 REM GET ANGLE I
  1010 XP=INT(X)
  1020 IF XP=85 OR XP=170 THEN 1050
  1030 IT=TH:IA=AL:SR=0
  1035 TS=TH:AS=AL
  1040 RETURN
  1050 IT=90-TH:SR=1:IA=90-AL
  1060 IF IT<0 THEN IT=IT+360
  1070 IF AL<0 THEN AL=AL+360
  1080 TS=TH:AS=AL
  1090 RETURN
  1990 :
  2000 REM UPDATE CO-ORDINATES
  2010 XN=XP+COS(π*TH/180)*SQR(1-SIN(π*AL/180)^2)
  2020 YN=YP+SIN(π*AL/180)
  2030 ZN=ZP+SIN(π*TH/180)*SQR(1-SIN(π*AL/180)^2)
  2040 RETURN
  2990 :
  3000 REM REFRACTION
  3005 POKE 53280,0
  3010 GOSUB 1000
  3030 IT=(SIN(π*IT/180)/RI)
  3040 IT=ATN(IT/SQR(-IT*IT+1))/π*180
  3050 IA=(SIN(π*IA/180)/RI)
  3060 IA=ATN(IA/SQR(-IA*IA+1))/π*180
  3070 GOSUB 4000
  3080 RETURN
  3990 :
  4000 REM RESET ANGLE
  4010 IF SR=0 THEN TH=IT:AL=IA
  4020 IF SR=1 THEN TH=90-IT:AL=90-IA
  4030 IF TH<0 THEN TH=TH+360
  4040 IF AL<0 THEN AL=AL+360
  4045 XN=INT(XN):YN=INT(YN):ZN=INT(ZN)
  4050 RETURN
  4990 :
  5000 REM REFRACT NO MORE!
  5005 POKE 53280,2
  5010 TH=TS:AL=AS
  5015 XN=INT(XN):YN=INT(YN):ZN=INT(ZN)
  5020 RETURN
  5990 :
  6000 REM TOTAL INTERNAL REFLECTION
  6005 POKE 53281,15
  6010 TH=180-TH:AL=180-AL
  6015 XN=INT(XN):YN=INT(YN):ZN=INT(ZN)
  6020 RETURN
  6990 :
 50000 REM GET REFRACTIVE INDEX
 50010 RI=0
 50020 IF XN>15 AND XN<25 AND YN>15 AND YN<25 AND ZN>15 AND ZN<25 THEN RI=1.47
 50030 RETURN
 59990 :
                � CUBE RENDER - BY D.FORD % : ;d XM�39:YM�24:CA�42 Ef �"�"