DECLARE SUB copper ()
DECLARE SUB fadefromcolor (a%, c%, t%, r%, g%, B%)
DECLARE SUB fadetocolor (a%, c%, t%, r%, g%, B%)
DECLARE SUB getpal ()
DECLARE SUB setpal (c1%, c2%, r1%, g1%, b1%, r2%, g2%, b2%)

DECLARE SUB keyaction ()

DECLARE SUB crosfade (r1%(), r2%(), g1%(), g2%(), b1%(), b2%())
DECLARE SUB setcrosfadepal (r1%(), r2%(), g1%(), g2%(), b1%(), b2%())
DECLARE SUB initcrosfadepics (a%, B%)

DECLARE SUB clearscreen (c%)

DECLARE SUB spheremaplasma ()
DECLARE SUB zoomdistort ()
DECLARE SUB loadqbinside ()
DECLARE SUB rgblights ()
DECLARE SUB cycleblobs ()
DECLARE SUB plasmablobs ()

DECLARE SUB actions3d ()

DECLARE SUB loadobject (a$)
DECLARE SUB createobject (a%)

DECLARE SUB animatewavelet (k%)

DECLARE SUB mov3dpos (xp, yp, zp)
DECLARE SUB rotate3d (xr, yr, zr)
DECLARE SUB translate3d ()
DECLARE SUB output3d ()

DECLARE SUB load3drecord ()



DECLARE SUB loadrecord ()
DECLARE SUB precalculations ()
DECLARE SUB getmap (a$)

DECLARE SUB Intersections ()
DECLARE SUB Actions ()
DECLARE SUB saverecord ()

DECLARE SUB Output0 ()

DECLARE SUB deedlinesax (c%)
DECLARE SUB prehistoricode ()
DECLARE SUB sucking ()
DECLARE SUB delay (t%)

DECLARE SUB ffix
'ffix


RANDOMIZE TIMER

IF COMMAND$ = "-COPPER" THEN copper: END

SCREEN 13
deedlinesax 15
delay 140
deedlinesax 0
CLS

prehistoricode
sucking
delay 140



xit% = 0

'$DYNAMIC
DIM SHARED r%(0 TO 255), g%(0 TO 255), B%(0 TO 255)
DIM SHARED r1%(0 TO 255), g1%(0 TO 255), b1%(0 TO 255)
DIM SHARED fpos%(0 TO 255)
fp% = 256 * 86: DIM SHARED fonts%(0 TO fp%)
'$STATIC

'DIM SHARED fsin1%(-48 TO 826), fsin2%(-640 TO 602), fsin3%(-640 TO 715)
DIM SHARED fsin4%(-319 TO 602)

DIM SHARED fsin1%(-48 TO 1083)
DIM SHARED fsin2%(-640 TO 957)
DIM SHARED fsin3%(-640 TO 871)

DIM SHARED mod256128%(-168 TO 168)
DIM SHARED sp%(16384)

DIM SHARED dt%(-192 TO 180)
DIM SHARED dt100%(-180 TO 180)


DIM SHARED cd%(0 TO 1792)


DIM SHARED dsx%(10), dsy%(10), psx%(10), psy%(10), xp1%(10), yp1%(10), yy%(10)
DIM SHARED epi6%(0 TO 5), epi36%(0 TO 5)

DIM SHARED cy%(-100 TO 300)



DIM SHARED dis%(320), sla%(320), slb%(320), slc%(320), sc%(320)
DIM SHARED div2%(255), div4%(320), mul32%(32), mul128%(128)
DIM SHARED fs%(0 TO 199)
'DIM SHARED map%(1024)
DIM SHARED kon%(127)
DIM SHARED ka%(4)



setcrosfadepal r%(), r1%(), g%(), g1%(), B%(), b1%()
getpal
fadetocolor 0, 255, 1, 0, 0, 0

a$ = "fonts16.fnt"
c$ = " "

open ".\programs\samples\pete\optimus\"+a$ FOR BINARY AS #1


FOR i% = 0 TO 255
GET #1, , c$: fpos%(i%) = ASC(c$)
NEXT i%


FOR i% = 0 TO 85

FOR y% = 0 TO 15
FOR x% = 0 TO 15
GET #1, , c$
fonts%(i% * 256 + y% * 16 + x%) = ASC(c$)
NEXT x%
NEXT y%

NEXT i%

CLOSE #1

'$DYNAMIC
DIM SHARED text$(3, 11)
'$STATIC

text$(0, 0) = "   Ok! Let's get    "
text$(0, 1) = "  serious now :)    "
text$(0, 2) = "                    "
text$(0, 3) = " Hopefully you will "
text$(0, 4) = "see a nice demo from"
text$(0, 5) = "my side and not old "
text$(0, 6) = "  prehistoric line  "
text$(0, 7) = " drawing and lame   "
text$(0, 8) = "oldstyle qbasic code"
text$(0, 9) = "                    "
text$(0, 10) = " But let's crosfade "
text$(0, 11) = " some more text now!"

text$(1, 0) = "  Optimus presents  "
text$(1, 1) = "  a demo done in a  "
text$(1, 2) = " hurry by connecting"
text$(1, 3) = "  various older or  "
text$(1, 4) = " newer sources into "
text$(1, 5) = " the main programm. "
text$(1, 6) = "                    "
text$(1, 7) = " All coded in pure  "
text$(1, 8) = "  Quickbasic 4.5    "
text$(1, 9) = "  Use ffix.com for  "
text$(1, 10) = "  maximum pleasure  "
text$(1, 11) = "                    "


text$(2, 0) = "  Featuring effects "
text$(2, 1) = "like Sphere mapping "
text$(2, 2) = "circle blobs,rgb8bpp"
text$(2, 3) = "lights, zoom distort"
text$(2, 4) = "plasma inside blob, "
text$(2, 5) = "hardware raster fx  "
text$(2, 6) = "3d dots and a simple"
text$(2, 7) = "raycaster engine.   "
text$(2, 8) = "    Some are not so "
text$(2, 9) = "optimized as I could"
text$(2, 10) = "and few have several"
text$(2, 11) = "bugs too..          "


text$(3, 0) = "They still run at   "
text$(3, 1) = "full frame rate in  "
text$(3, 2) = "my AMDK6-2/500Mhz,  "
text$(3, 3) = "though I had thought"
text$(3, 4) = "ways to optimize    "
text$(3, 5) = "them even more.     "
text$(3, 6) = "           Anyways.."
text$(3, 7) = "lean back and enjoy!"
text$(3, 8) = "                    "
text$(3, 9) = " Optimus/Dirty Minds"
text$(3, 10) = " Thessaloniki/Greece"
text$(3, 11) = " Saturday 25/05/2002"

CLS
dl% = 840

initcrosfadepics 0, 1
fadefromcolor 0, 255, 256, 0, 0, 0

delay dl%
IF xit% = 1 THEN xit% = 2: getpal: fadetocolor 0, 255, 64, 0, 0, 0: GOTO endfadetext


crosfade r%(), r1%(), g%(), g1%(), B%(), b1%()
IF xit% = 1 THEN xit% = 2: getpal: fadetocolor 0, 255, 64, 0, 0, 0: GOTO endfadetext

initcrosfadepics 1, 1
setcrosfadepal r%(), r1%(), g%(), g1%(), B%(), b1%()
initcrosfadepics 1, 2
delay dl%
IF xit% = 1 THEN xit% = 2: getpal: fadetocolor 0, 255, 64, 0, 0, 0: GOTO endfadetext

crosfade r%(), r1%(), g%(), g1%(), B%(), b1%()
IF xit% = 1 THEN xit% = 2: getpal: fadetocolor 0, 255, 64, 0, 0, 0: GOTO endfadetext


delay dl%
IF xit% = 1 THEN xit% = 2: getpal: fadetocolor 0, 255, 64, 0, 0, 0: GOTO endfadetext

initcrosfadepics 2, 2
setcrosfadepal r%(), r1%(), g%(), g1%(), B%(), b1%()
initcrosfadepics 2, 3
crosfade r%(), r1%(), g%(), g1%(), B%(), b1%()
IF xit% = 1 THEN xit% = 2: getpal: fadetocolor 0, 255, 64, 0, 0, 0: GOTO endfadetext


delay dl%
IF xit% = 1 THEN xit% = 2: getpal: fadetocolor 0, 255, 64, 0, 0, 0: GOTO endfadetext

getpal
fadetocolor 0, 255, 256, 63, 63, 63
IF xit% = 1 THEN xit% = 2: getpal: fadetocolor 0, 255, 64, 0, 0, 0: GOTO endfadetext


endfadetext:
xit% = 0

LINE (0, 0)-(320, 200), 255, BF


spheremaplasma
xit% = 0
zoomdistort
xit% = 0
getpal
fadetocolor 0, 255, 31, 0, 0, 0
CLS


' ------------- RGB Lights ---------------

rgblights
xit% = 0







' ------------- 3D Dots ---------------

'$DYNAMIC
DIM SHARED x(4096), y(4096), z(4096)
DIM SHARED xo%(4096), yo%(4096), zo%(4096)
DIM SHARED xs%(4096, 1), ys%(4096, 1)
'DIM SHARED pl%(8192, 2), ln%(8192, 1)
DIM SHARED ypk&(-100 TO 99)
DIM SHARED zpo%(8)
'$STATIC


CLS

' ------ Precalculations for Wavelet -----


FOR i% = 0 TO 826
fsin1%(i%) = SIN(i% / 50) * 48
NEXT i%


' ------ Precalculations for Poke ------


FOR i& = -100 TO 99
ypk&(i&) = (i& + 100) * 320
NEXT i&

' ---------------------------------------


actions3d

xit% = 0
' -------- Cycleblobs ------------

ERASE fsin2%, fsin3%
cycleblobs
xit% = 0

CLS
plasmablobs
xit% = 0
LINE (0, 0)-(320, 200), 255, BF




'dm% = 16384
'DIM SHARED mapout%(dm%)



setpal 0, 255, 0, 0, 0, 63, 63, 63

getmap "wolfmap0.wad"
precalculations


k$ = " "

a$ = "3rdrec.rec"
gi$ = " ": gg$ = " "
g% = 0: gi% = 0

open ".\samples\pete\optimus\"+a$ FOR BINARY AS #2
GET #2, , gi$: gi% = ASC(gi$): GET #2, , gg$: gg% = ASC(gg$)


WHILE INKEY$ <> "": WEND

' ----------------- Some important data -----------------

ph% = 32: px% = 64 + 32: py% = 64 + 32: pa% = 90: ps% = 3
fv% = 60: ra = fv% / 320: dpp% = 160 / TAN((fv% \ 2) / 57.3)
map% = 0

k% = 0
fps% = 0
filei% = 0

DO WHILE INKEY$ = ""
fps% = fps% + 1
IF fps% = 558 THEN map% = 1
IF fps% = 2148 THEN map% = 0
IF fps% = 3500 THEN map% = 1
IF fps% = 4760 THEN map% = 0

keyaction
loadrecord
Actions
sp%(mul128%(py% \ 16) + px% \ 16) = 64

Intersections
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
Output0


IF filei% = 194 THEN GOTO telos

LOOP

telos:
CLOSE #2

xit% = 0
getpal
fadetocolor 0, 255, 255, 0, 0, 0

SUB Actions

SHARED kb%, px%, py%, pa%, ps%, map%

WHILE kon%(75) = 1
pa% = pa% + 1
IF pa% > 360 THEN pa% = 0 + (pa% - 360)
GOTO 101
WEND

101
WHILE kon%(77) = 1
pa% = pa% - 1
IF pa% < 0 THEN pa% = 360 + pa%
GOTO 102
WEND

102
WHILE kon%(72) = 1
pxd% = COS(pa% / 57.3) * ps%
pyd% = SIN(pa% / 57.3) * ps%
px% = px% + pxd%
IF cd%(mul32%(py% \ 64) + px% \ 64) = 1 THEN px% = px% - pxd%
py% = py% - pyd%
IF cd%(mul32%(py% \ 64) + px% \ 64) = 1 THEN py% = py% + pyd%
GOTO 103
WEND

103
WHILE kon%(80) = 1
pxd% = COS(pa% / 57.3) * ps%
pyd% = SIN(pa% / 57.3) * ps%
px% = px% - pxd%
IF cd%(mul32%(py% \ 64) + px% \ 64) = 1 THEN px% = px% + pxd%
py% = py% + pyd%
IF cd%(mul32%(py% \ 64) + px% \ 64) = 1 THEN py% = py% - pyd%
GOTO 104
WEND

104
WHILE kon%(15) = 1
IF map% = 0 THEN map% = 1 ELSE map% = 0
GOTO 105
WEND

105
WHILE kon%(1) = 1
END
WEND

WHILE INKEY$ <> "": WEND

END SUB

SUB actions3d

SHARED xit%

SHARED ndts%, ndtso%
SHARED xc, yc, zc, rxc, ryc, rzc
SHARED xp, yp, zp
SHARED gi$, gg$
SHARED k%, obj%
SHARED ftype%, filei%
SHARED mtr


CONST pi = 3.1415926#
mtr = pi / 180
k% = 0

gi$ = " "
gg$ = " "
xp = 0: yp = 0: zp = 800

'kyvos 100
'sphere 200
'torus 600
'wavelet 800
'teapot,cow 300

zpo%(1) = 100
zpo%(2) = 200
zpo%(3) = 600
zpo%(4) = 800
zpo%(5) = 300
zpo%(6) = 300




SCREEN 13
COLOR 255



DEF SEG = &HA000
xc = 0: yc = 0: zc = 0
rxc = 0: ryc = 0: rzc = 0


f$ = "3drec.001"
OPEN ".\samples\pete\optimus\"+f$ FOR BINARY AS #2

k% = 0
DO
B$ = INKEY$: IF B$ = "x" THEN END
load3drecord
IF ASC(gg$) = 0 THEN a$ = "" ELSE a$ = gg$


WHILE a$ = "s" OR a$ = "S"
setpal 0, 255, 0, 0, 0, 63, 63, 63
obj% = 1
'zp = zpo%(obj%)
createobject obj%
ndtso% = 64: ndts% = ndtso%
a$ = ""
WEND

WHILE a$ = "d" OR a$ = "D"
setpal 0, 255, 0, 0, 0, 63, 47, 15
obj% = 2
'zp = zpo%(obj%)
createobject obj%
ndtso% = 256: ndts% = ndtso%
a$ = ""
WEND

WHILE a$ = "f" OR a$ = "F"
setpal 0, 255, 0, 0, 0, 31, 63, 47
obj% = 3
'zp = zpo%(obj%)
createobject obj%
ndtso% = 512: ndts% = ndtso%
a$ = ""
WEND

WHILE a$ = "g" OR a$ = "G"
setpal 0, 255, 0, 0, 0, 15, 31, 63
obj% = 4
'zp = zpo%(obj%)
createobject obj%
ndtso% = 64: ndts% = 0
a$ = ""
WEND

WHILE a$ = "h" OR a$ = "H"
setpal 0, 255, 0, 0, 0, 0, 63, 63
obj% = 5
'zp = zpo%(obj%)
loadobject "hiteapot.3do"
ndtso% = 0
a$ = ""
WEND

WHILE a$ = "j" OR a$ = "J"
setpal 0, 255, 0, 0, 0, 63, 31, 47
obj% = 6
'zp = zpo%(obj%)
loadobject "cow.3do"
ndtso% = 0
a$ = ""
WEND


WHILE a$ = "," OR a$ = "<"

clearscreen 0
IF ndts% - ndtso% > 0 THEN ndts% = ndts% - ndtso%
a$ = ""
WEND

WHILE a$ = "." OR a$ = ">"
'clearscreen 0
IF ndts% + ndtso% < 4096 THEN ndts% = ndts% + ndtso%
a$ = ""
WEND


WHILE a$ = "k" OR a$ = "K"
'clearscreen 0
xp = -zpo%(obj%) * 1.5: yp = 0: zp = zpo%(obj%)
xc = 0: yc = 0: zc = 0
a$ = ""
WEND

WHILE a$ = "l" OR a$ = "L"
'clearscreen 0
xp = zpo%(obj%) * 1.5: yp = 0: zp = zpo%(obj%)
xc = 0: yc = 0: zc = 0
a$ = ""
WEND


WHILE a$ = "u" OR a$ = "U"
'clearscreen 0
xp = 0: yp = zpo%(obj%) * 1.5: zp = zpo%(obj%)
xc = 0: yc = 0: zc = 0
a$ = ""
WEND

WHILE a$ = "y" OR a$ = "Y"
'clearscreen 0
xp = 0: yp = -zpo%(obj%) * 1.5: zp = zpo%(obj%)
xc = 0: yc = 0: zc = 0
a$ = ""
WEND

WHILE a$ = "m" OR a$ = "M"
'clearscreen 0
xp = 0: yp = 0: zp = -zpo%(obj%) \ 2
xc = 0: yc = 0: zc = 0
a$ = ""
WEND






WHILE a$ = "a" OR a$ = "A"
yc = yc + .1
a$ = ""
WEND

WHILE a$ = "Q" OR a$ = "q"
yc = yc - .1
a$ = ""
WEND

WHILE a$ = "o" OR a$ = "O"
xc = xc - .1
a$ = ""
WEND

WHILE a$ = "p" OR a$ = "P"
xc = xc + .1
a$ = ""
WEND

WHILE a$ = "-"
zc = zc + .25
a$ = ""
WEND

WHILE a$ = "=" OR a$ = "+"
zc = zc - .25
a$ = ""
WEND

WHILE a$ = "z" OR a$ = "Z"
xr = 0: yr = 0: zr = 0
rxc = 0: ryc = 0: rzc = 0
a$ = ""
WEND



WHILE a$ = "x" OR a$ = "X"
END
WEND

WHILE a$ = "4"
ryc = ryc - .005
a$ = ""
WEND

WHILE a$ = "6"
ryc = ryc + .005
a$ = ""
WEND

WHILE a$ = "8"
rxc = rxc - .005
a$ = ""
WEND

WHILE a$ = "2"
rxc = rxc + .005
a$ = ""
WEND

WHILE a$ = "7"
rzc = rzc - .005
a$ = ""
WEND

WHILE a$ = "9"
rzc = rzc + .005
a$ = ""
WEND


WHILE a$ = "w" OR a$ = "W"
clearscreen 1
ftype% = 0
a$ = ""
WEND

WHILE a$ = "e" OR a$ = "E"
ftype% = 1
a$ = ""
WEND

WHILE a$ = "r" OR a$ = "R"
ftype% = 2
a$ = ""
WEND


xp = xp + xc: yp = yp + yc: zp = zp + zc
xr = xr + rxc: yr = yr + ryc: zr = zr + rzc


IF obj% = 4 THEN animatewavelet k%: k% = k% + 1: IF k% = 314 THEN k% = 0

rotate3d xr, yr, zr
mov3dpos xp, yp, zp
translate3d
output3d

IF filei% = 4446 THEN GOTO telos2

IF xit% = 0 THEN keyaction
IF xit% = 1 THEN GOTO telos2


LOOP


telos2:
filei% = 0

CLOSE #2

END SUB

SUB animatewavelet (k%)


l% = 0
FOR z% = 0 TO 511 STEP 8
FOR x% = 0 TO 511 STEP 8

xo%(l%) = x% - 256: zo%(l%) = z% - 256
yo%(l%) = fsin1%(x% + k%) + fsin1%(z% + k%)


l% = l% + 1
NEXT x%
NEXT z%

END SUB

SUB clearscreen (c%)


FOR y% = 0 TO 199
DEF SEG = &HA000 + y% * 20

FOR x% = 0 TO 319
POKE x%, c%
NEXT x%

NEXT y%

DEF SEG = &HA000


END SUB

SUB copper

CLS

'WHILE INKEY$ <> "": WEND
'SCREEN 0

LOCATE 2, 32: PRINT "Congratulations!"
LOCATE 4, 2: PRINT "You have just found the secret part of the demo, even if I guess it was quite"
LOCATE 5, 2: PRINT "easy, since I use to give away the source of every quickbasic demo of mine ;)"
PRINT
PRINT "   These are supposed to be hardware fx inspired by Amiga, C64, CPC or any other"
PRINT "raster display computer that happens to exist. Quite unstable if you are running"
PRINT "them under windows, so I suggest to boot up in pure DOS and retry there.."
PRINT
PRINT "   What you are just watching are called raster or copper bars. Originally 1st"
PRINT "seen in Amiga demos, giving to the machine the opportunity to display more than"
PRINT "the theoritical maximum number of colors (This is text mode!) in the screen (But"
PRINT "mostly used as horizontal colorfull lines and not per pixel. Do you remember"
PRINT "Shadow of the Beast or Agony, which used to have extra colors upon a colorfull"
PRINT "sky in the background?)"
PRINT "   They are so simple fx, just changing the RGB values of just one color several"
PRINT "times in a frame, synced with the raster beam of the CRT (You can use the &HDA "
PRINT "port address you know from Vsync to use for horizontal syncing too, by checking"
PRINT " the 1st bit, in the similar way you did that for the 4th bit for Vsync!)"

PRINT
PRINT "It seems that I have 2 go, unfortunatelly haven't explained you about the next"
PRINT "effects you are gonna see if you press any key.."
PRINT "                                                     Optimus"



DIM c%(1 TO 32)
DIM xb%(0 TO 319)
DIM ds%(1 TO 32), ps%(1 TO 32)
DIM xp%(32)
DIM rgb%(15, 15)
'DIM b01%(-1024 TO 1024)
'DIM b02%(-1024 TO 1024)
DIM b01%(-640 TO 640)
DIM b02%(-640 TO 640)

DIM y2%(0 TO 399)
DIM lc%(0 TO 399)


DIM l%(3)
DIM br%(-200 TO 500)

k% = 0
FOR i% = 168 TO 200
IF k% > 63 THEN k% = 63
br%(i%) = k%
k% = k% + 2
NEXT i%

FOR i% = 201 TO 232
k% = k% - 2
IF k% < 0 THEN k% = 0
br%(i%) = k%
NEXT i%


k% = 0
DO WHILE INKEY$ = ""

k% = k% + 1

WAIT &H3DA, 8
WAIT &H3DA, 8, 8

l%(1) = SIN(k% / 25) * 120
l%(2) = SIN(k% / 45) * 110
l%(3) = SIN(k% / 35) * 100


FOR i% = 0 TO 380

WAIT &H3DA, 1, 1: WAIT &H3DA, 1

OUT &H3C8, 0
OUT &H3C9, br%(i% + l%(1))
OUT &H3C9, br%(i% + l%(2))
OUT &H3C9, br%(i% + l%(3))

NEXT i%



LOOP




SCREEN 13

OUT &H3D4, &H13
OUT &H3D5, 0

FOR i% = 1 TO 16
OUT &H3C8, i%
OUT &H3C9, (i% - 1) * 4
OUT &H3C9, 0
OUT &H3C9, 0
NEXT i%

FOR i% = 17 TO 32
OUT &H3C8, i%
OUT &H3C9, 0
OUT &H3C9, (i% - 17) * 4
OUT &H3C9, 0
NEXT i%

FOR i% = 33 TO 48
OUT &H3C8, i%
OUT &H3C9, 0
OUT &H3C9, 0
OUT &H3C9, (i% - 33) * 4
NEXT i%

FOR i% = 49 TO 64
OUT &H3C8, i%
OUT &H3C9, (i% - 49) * 4
OUT &H3C9, (i% - 49) * 4
OUT &H3C9, 0
NEXT i%

FOR i% = 65 TO 80
OUT &H3C8, i%
OUT &H3C9, (i% - 65) * 4
OUT &H3C9, 0
OUT &H3C9, (i% - 65) * 4
NEXT i%

FOR i% = 81 TO 96
OUT &H3C8, i%
OUT &H3C9, 0
OUT &H3C9, (i% - 81) * 4
OUT &H3C9, (i% - 81) * 4
NEXT i%

FOR i% = 97 TO 112
OUT &H3C8, i%
OUT &H3C9, (i% - 97) * 4
OUT &H3C9, (i% - 97) * 2
OUT &H3C9, 0
NEXT i%

FOR i% = 113 TO 128
OUT &H3C8, i%
OUT &H3C9, 0
OUT &H3C9, (i% - 113) * 2
OUT &H3C9, (i% - 113) * 4
NEXT i%






FOR i% = 1 TO 16: c%(i%) = i%: NEXT i%
FOR i% = 17 TO 32: c%(i%) = 33 - i%: NEXT i%



FOR i% = 1 TO 32
ds%(i%) = INT(RND * 63 + 32)
ps%(i%) = INT(RND * 127)
NEXT i%


DEF SEG = &HA000

k% = 0
DO WHILE INKEY$ = ""


k% = k% + 1

FOR i% = 1 TO 8
xp%(i%) = SIN(k% / ds%(i%)) * ps%(i%) + ps%(i%) + (280 - 2 * ps%(i%)) \ 2
NEXT i%

FOR ii% = 1 TO 8
FOR i% = 1 TO 32
xb%(i% + xp%(ii%)) = c%(i%) + 16 * (ii% - 1)
NEXT i%
NEXT ii%


WAIT &H3DA, 8
FOR i% = 0 TO 319
POKE i%, xb%(i%)
POKE i% + 80, xb%(i%)
NEXT i%
WAIT &H3DA, 8, 8




l%(1) = SIN(k% / 25) * 120
l%(2) = SIN(k% / 45) * 110
l%(3) = SIN(k% / 35) * 100


FOR i% = 0 TO 380


WAIT &H3DA, 1, 1: WAIT &H3DA, 1

OUT &H3C8, 0
OUT &H3C9, br%(i% + l%(1))
OUT &H3C9, br%(i% + l%(2))
OUT &H3C9, br%(i% + l%(3))

NEXT i%

FOR i% = 0 TO 319: xb%(i%) = 0: NEXT i%


LOOP





' --------- Translucent copper bars -----------



c% = 0
OUT &H3C8, 0

FOR a% = 0 TO 15
FOR B% = 0 TO 15

OUT &H3C9, a% * 2 + 33
OUT &H3C9, 0
OUT &H3C9, B% * 2 + 33

rgb%(a%, B%) = c%
c% = c% + 1

NEXT B%
NEXT a%


OUT &H3D4, &H13
OUT &H3D5, 0

'DIM fsin1%(0 TO 1083)
'DIM fsin2%(0 TO 957)
'DIM fsin3%(-471 TO 871)

FOR i% = 0 TO 1083: fsin1%(i%) = SIN(i% / 45) * 63 + 92: NEXT i%
FOR i% = 0 TO 957: fsin2%(i%) = SIN(i% / 25) * 31 + 31: NEXT i%
FOR i% = -471 TO 871: fsin3%(i%) = SIN(i% / 75) * 91 + 127: NEXT i%

DIM p16%(0 TO 15)
FOR i% = 0 TO 15
p16%(i%) = i% * 16
NEXT i%


DIM c1%(0 TO 7), c2%(0 TO 7), c3%(0 TO 7)

FOR i% = 0 TO 5: c1%(i%) = i% + 1: c2%(i%) = i% + 7: c3%(i%) = i% + 13: NEXT i%

FOR i% = 0 TO 399: y2%(i%) = i% * 2: NEXT i%


FOR i% = 0 TO 399: lc%(i%) = i% / 6.4: NEXT i%



y1% = 0
fps% = 0
DO WHILE INKEY$ = ""
k% = k% + 3: IF k% >= 283 THEN k% = 0
l% = l% + 2: IF l% >= 157 THEN l% = 0
m% = m% + 1: IF m% >= 471 THEN m% = 0
fps% = fps% + 1

IF fps% < 400 AND y1% < 395 THEN y1% = y1% + 1
IF fps% > 1200 AND y1% <> 0 THEN y1% = y1% - 1
IF y1% = 0 THEN GOTO out1


WAIT &H3DA, 8: WAIT &H3DA, 8, 8


'GOTO 17
OUT &H3C8, 0
OUT &H3C9, 0
OUT &H3C9, 0
OUT &H3C9, 0
17

DEF SEG = &HA000

FOR y% = 0 TO y1%

WAIT &H3DA, 1, 1: WAIT &H3DA, 1




f1% = fsin2%(y2%(y%) + l%) + fsin3%(y% - m%)
f2% = fsin2%(y% + l%) + fsin1%(y2%(y%) + k%)


FOR i% = 1 TO 15

b01%(f1% + i%) = i%
b02%(f2% + i%) = p16%(i%)

POKE f1% + i%, i% OR b02%(f1% + i%)
POKE f2% + i%, p16%(i%) OR b01%(f2% + i%)
NEXT i%


OUT &H3C8, 0
OUT &H3C9, (63 - lc%(y%))
OUT &H3C9, (63 - lc%(y%)) / 2
OUT &H3C9, lc%(y%)


NEXT y%


FOR i% = 0 TO 319: POKE i%, 0: NEXT i%
FOR i% = 0 TO 319: b01%(i%) = 0: b02%(i%) = 0: NEXT i%

LOOP

out1:







' --------- RGB copper bars -----------



CLS

FOR i% = 0 TO 7
OUT &H3C8, i%
OUT &H3C9, i% * 5 + 28
OUT &H3C9, 0
OUT &H3C9, 0
NEXT i%


FOR i% = 8 TO 15
OUT &H3C8, i%
OUT &H3C9, 0
OUT &H3C9, (i% - 8) * 5 + 28
OUT &H3C9, 0
NEXT i%

FOR i% = 16 TO 23
OUT &H3C8, i%
OUT &H3C9, 0
OUT &H3C9, 0
OUT &H3C9, (i% - 16) * 5 + 28
NEXT i%


OUT &H3D4, &H13
OUT &H3D5, 0

FOR i% = 0 TO 7: c1%(i%) = i%: c2%(i%) = i% + 8: c3%(i%) = i% + 16: NEXT i%: c1%(0) = 1





k% = 0
l% = 0
m% = 0
fps% = 0
y1% = 0
DO WHILE INKEY$ = ""
k% = k% + 3: IF k% >= 283 THEN k% = 0
l% = l% + 2: IF l% >= 157 THEN l% = 0
m% = m% + 1: IF m% >= 471 THEN m% = 0

fps% = fps% + 1

IF fps% < 400 AND y1% < 395 THEN y1% = y1% + 1
IF fps% > 1200 AND y1% <> 0 THEN y1% = y1% - 1
IF y1% = 0 THEN GOTO out2


WAIT &H3DA, 8: WAIT &H3DA, 8, 8

DEF SEG = &HA000

FOR y% = 0 TO y1%

WAIT &H3DA, 1

FOR i% = 0 TO 7
POKE fsin2%(y2%(y%) + l%) + fsin3%(y% - m%) + i%, c1%(i%)
POKE fsin2%(y% + l%) + fsin1%(y2%(y%) + k%) + i%, c2%(i%)
POKE fsin1%(y% + k%) + fsin2%(y% + l%) + fsin3%(y% + m%) + i% - 99, c3%(i%)
NEXT i%

OUT &H3C8, 0
OUT &H3C9, lc%(y%)
OUT &H3C9, 63 - lc%(y%)
OUT &H3C9, 63 - lc%(y%)

WAIT &H3DA, 1, 1

NEXT y%


FOR i% = 0 TO 319: POKE i%, 0: NEXT i%

LOOP

out2:


OUT &H3D4, &H28
OUT &H3D5, &H13

SCREEN 13
SCREEN 1

OUT &H3D4, &H28
OUT &H3D5, &H13

END SUB

SUB createobject (a%)


CONST pi = 3.1415926#
rtm = 180 / pi


clearscreen 0

SELECT CASE a%


CASE 1

' ========== Creating object 1 - Cube ==========


FOR i% = 0 TO 4

xo%(i%) = 2 * i% - 5: yo%(i%) = 5: zo%(i%) = 5
xo%(i% + 5) = 2 * i% - 5: yo%(i% + 5) = 5: zo%(i% + 5) = -5
xo%(i% + 10) = 2 * i% - 5: yo%(i% + 10) = -5: zo%(i% + 10) = 5
xo%(i% + 15) = 2 * i% - 5: yo%(i% + 15) = -5: zo%(i% + 15) = -5
xo%(i% + 20) = -5: yo%(i% + 20) = 5: zo%(i% + 20) = 2 * i% - 5
xo%(i% + 25) = 5: yo%(i% + 25) = 5: zo%(i% + 25) = 2 * i% - 5
xo%(i% + 30) = -5: yo%(i% + 30) = -5: zo%(i% + 30) = 2 * i% - 5
xo%(i% + 35) = 5: yo%(i% + 35) = -5: zo%(i% + 35) = 2 * i% - 5
xo%(i% + 40) = 5: yo%(i% + 40) = 2 * i% - 5: zo%(i% + 40) = 5
xo%(i% + 45) = 5: yo%(i% + 45) = 2 * i% - 5: zo%(i% + 45) = -5
xo%(i% + 50) = -5: yo%(i% + 50) = 2 * i% - 5: zo%(i% + 50) = 5
xo%(i% + 55) = -5: yo%(i% + 55) = 2 * i% - 5: zo%(i% + 55) = -5

NEXT i%

xo%(60) = 5: yo%(60) = 5: zo%(60) = 5
xo%(61) = 5: yo%(61) = 5: zo%(61) = 5
xo%(62) = 5: yo%(62) = 5: zo%(62) = 5
xo%(63) = 5: yo%(63) = 5: zo%(63) = 5



' ========== Random copier for object 1 ==========

FOR j% = 1 TO 63
metx% = INT(RND * 64 - 32)
mety% = INT(RND * 64 - 32)
metz% = INT(RND * 64 - 32)

FOR i% = 0 TO 63
xo%(i% + j% * 64) = xo%(i%) + metx%
yo%(i% + j% * 64) = yo%(i%) + mety%
zo%(i% + j% * 64) = zo%(i%) + metz%
NEXT i%

NEXT j%

' =================================



CASE 2


' ========== Creating object 2 - Sphere ==========


j% = 0
FOR i% = 90 TO 270 STEP 11.25
c = i% / rtm
xo%(j%) = COS(c) * 63: yo%(j%) = SIN(c) * 63: zo%(j%) = 0
j% = j% + 1
NEXT i%



yr = 0
FOR i% = 1 TO 15

yr = yr + 22.5

c = yr / rtm

cosyr = COS(c)
sinyr = SIN(c)

FOR j% = 0 TO 15
xo%(j% + i% * 16) = cosyr * xo%(j%) - sinyr * zo%(j%)
zo%(j% + i% * 16) = sinyr * xo%(j%) + cosyr * zo%(j%)
yo%(j% + i% * 16) = yo%(j%)
NEXT j%

NEXT i%



' ========== Random copier for object 2 ==========

FOR j% = 1 TO 15
metx% = INT(RND * 512 - 256)
mety% = INT(RND * 512 - 256)
metz% = INT(RND * 512 - 256)

FOR i% = 0 TO 255
xo%(i% + j% * 256) = xo%(i%) + metx%
yo%(i% + j% * 256) = yo%(i%) + mety%
zo%(i% + j% * 256) = zo%(i%) + metz%
NEXT i%

NEXT j%


CASE 3

' ========== Creating object 3 - Torus ==========

j% = 0
FOR i% = 0 TO 359 STEP 22.5
c = i% / rtm
xo%(j%) = COS(c) * 64: yo%(j%) = SIN(c) * 64: zo%(j%) = 0
j% = j% + 1
NEXT i%


i% = 90
c = i% / rtm
cosyr = COS(c)
sinyr = SIN(c)

FOR i% = 0 TO 15
xp = xo%(i%)
xo%(i%) = cosyr * xp - sinyr * zo%(i%)
zo%(i%) = sinyr * xp + cosyr * zo%(i%)
yo%(i%) = yo%(i%) - 192
NEXT i%


zr = 0

FOR j% = 1 TO 31
zr = zr + 11.25
c = zr / rtm

coszr = COS(c)
sinzr = SIN(c)

FOR i% = 0 TO 15
xo%(i% + j% * 16) = coszr * xo%(i%) - sinzr * yo%(i%)
yo%(i% + j% * 16) = sinzr * xo%(i%) + coszr * yo%(i%)
zo%(i% + j% * 16) = zo%(i%)
NEXT i%

NEXT j%



' ========== Random copier for object 3 ==========

FOR j% = 1 TO 7

xr = (INT(RND * 180) - 90) / rtm
yr = (INT(RND * 180) - 90) / rtm
zr = (INT(RND * 180) - 90) / rtm
cosxr = COS(xr)
cosyr = COS(yr)
coszr = COS(zr)
sinxr = SIN(xr)
sinyr = SIN(yr)
sinzr = SIN(zr)

metx% = INT(RND * 1024 - 512)
mety% = INT(RND * 1024 - 512)
metz% = INT(RND * 1024 - 512)


FOR i% = 0 TO 511

x(i%) = cosyr * xo%(i%) - sinyr * zo%(i%)
z(i%) = sinyr * xo%(i%) + cosyr * zo%(i%)

y(i%) = cosxr * yo%(i%) - sinxr * z(i%)
z(i%) = sinxr * yo%(i%) + cosxr * z(i%)

nx = x(i%)
x(i%) = coszr * nx - sinzr * y(i%)
y(i%) = sinzr * nx + coszr * y(i%)

xo%(i% + j% * 512) = x(i%) + metx%
yo%(i% + j% * 512) = y(i%) + mety%
zo%(i% + j% * 512) = z(i%) + metz%
NEXT i%
NEXT j%

CASE ELSE


END SELECT


END SUB

SUB crosfade (r1%(), r2%(), g1%(), g2%(), b1%(), b2%())

SHARED xit%

FOR k% = 0 TO 63
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF xit% = 0 THEN keyaction
IF xit% = 1 THEN GOTO endcrosfade


OUT &H3C8, 0
    FOR c% = 0 TO 255
      IF r1%(c%) < r2%(c%) THEN r1%(c%) = r1%(c%) + 1 ELSE IF r1%(c%) > r2%(c%) THEN r1%(c%) = r1%(c%) - 1
      IF g1%(c%) < g2%(c%) THEN g1%(c%) = g1%(c%) + 1 ELSE IF g1%(c%) > g2%(c%) THEN g1%(c%) = g1%(c%) - 1
      IF b1%(c%) < b2%(c%) THEN b1%(c%) = b1%(c%) + 1 ELSE IF b1%(c%) > b2%(c%) THEN b1%(c%) = b1%(c%) - 1
     OUT &H3C9, r1%(c%)
     OUT &H3C9, g1%(c%)
     OUT &H3C9, b1%(c%)
    NEXT c%
NEXT k%

endcrosfade:
END SUB

SUB cycleblobs

SHARED xit%

n% = 7

FOR i% = 0 TO 127
OUT &H3C8, i%
OUT &H3C9, 0
OUT &H3C9, 0
OUT &H3C9, 0
NEXT i%


FOR y% = 0 TO 99
FOR x% = 0 TO 159
sp%(p%) = 16384 \ SQR((160 - x%) ^ 2 + (100 - y%) ^ 2) ^ 1.5
IF sp%(p%) > 255 THEN sp%(p%) = 255
p% = p% + 1
NEXT x%
NEXT y%

FOR i% = 0 TO 319
IF i% < 160 THEN fsin2%(i%) = i% ELSE fsin2%(i%) = 319 - i%
NEXT i%

FOR i% = 0 TO 199
IF i% > 99 THEN fsin3%(i%) = (199 - i%) * 160 ELSE fsin3%(i%) = i% * 160
NEXT i%

FOR i% = 0 TO 1792
IF i% > 255 THEN cd%(i%) = 255 ELSE cd%(i%) = i%
NEXT i%

FOR i% = 1 TO n%
dsx%(i%) = INT(RND * 35 + 25)
dsy%(i%) = INT(RND * 35 + 25)
psx%(i%) = INT(RND * 64 + 64)
psy%(i%) = INT(RND * 50 + 50)
NEXT i%

m% = 0: q% = 32: r%(1) = 1: g%(1) = 1: B%(1) = 1

fps% = 0
DO
fps% = fps% + 1
k% = k% + 1
m% = m% + 1
IF fps% < 1600 AND m% = q% THEN m% = 0: q% = INT(RND * 255 + 5): r%(1) = r%(2): g%(1) = g%(2): B%(1) = B%(2): r%(2) = INT(RND * 63) + 1: g%(2) = INT(RND * 63) + 1: B%(2) = INT(RND * 63) + 1
IF fps% > 1600 AND fps% < 1855 AND m% = q% THEN sq% = 1: m% = 0: q% = 255: r%(1) = r%(2): g%(1) = g%(2): B%(1) = B%(2): r%(2) = 0: g%(2) = 0: B%(2) = 0
IF fps% > 1856 AND sq% = 1 AND m% >= q% THEN GOTO gout4
IF fps% > 2100 THEN GOTO gout4
r% = r%(1) + (r%(2) - r%(1)) / q% * m%
g% = g%(1) + (g%(2) - g%(1)) / q% * m%
B% = B%(1) + (B%(2) - B%(1)) / q% * m%
IF r% = 0 THEN r% = 1
IF g% = 0 THEN g% = 1
IF B% = 0 THEN B% = 1

FOR c% = 128 TO 255
OUT &H3C8, c%
IF c% < 192 THEN OUT &H3C9, (c% - 128) / (63 / r%): OUT &H3C9, (c% - 128) / (63 / g%): OUT &H3C9, (c% - 128) / (63 / B%) ELSE OUT &H3C9, (255 - c%) / (63 / r%): OUT &H3C9, (255 - c%) / (63 / g%): OUT &H3C9, (255 - c%) / (63 / B%)
NEXT c%

FOR i% = 1 TO n%
xp1%(i%) = SIN(k% / dsx%(i%)) * psx%(i%)
yp1%(i%) = SIN(k% / dsy%(i%)) * psy%(i%)
NEXT i%

yp% = 0
FOR y% = 0 TO 199
DEF SEG = &HA000 + yp%
yp% = yp% + 20

yy%(1) = fsin3%(y% - yp1%(1))
yy%(2) = fsin3%(y% - yp1%(2))
yy%(3) = fsin3%(y% - yp1%(3))
yy%(4) = fsin3%(y% - yp1%(4))
yy%(5) = fsin3%(y% - yp1%(5))
yy%(6) = fsin3%(y% - yp1%(6))
yy%(7) = fsin3%(y% - yp1%(7))

FOR x% = 24 TO 295
dn% = sp%(yy%(1) + fsin2%(x% - xp1%(1))) + sp%(yy%(2) + fsin2%(x% - xp1%(2))) + sp%(yy%(3) + fsin2%(x% - xp1%(3))) + sp%(yy%(4) + fsin2%(x% - xp1%(4))) + sp%(yy%(5) + fsin2%(x% - xp1%(5))) + sp%(yy%(6) + fsin2%(x% - xp1%(6))) + sp%(yy%(7) + fsin2%( _
x% - xp1%(7)))
POKE x%, cd%(dn%)

NEXT x%
NEXT y%

WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF xit% = 0 THEN keyaction
IF xit% = 1 THEN GOTO gout4

LOOP
gout4:

END SUB

SUB deedlinesax (c%)

SHARED xit%

LINE (20, 20)-(25, 80), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (25, 80)-(60, 70), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (60, 70)-(55, 30), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (55, 30)-(20, 20), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

LINE (25, 25)-(30, 60), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (30, 60)-(50, 65), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (50, 65)-(25, 25), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

IF c% = 15 THEN f% = INT(RND * 255) ELSE f% = 0
PAINT (23, 23), f%, c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

LINE (65, 20)-(100, 24), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (100, 24)-(70, 34), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (70, 34)-(85, 44), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (85, 44)-(75, 54), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (75, 54)-(75, 64), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (75, 64)-(85, 64), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (85, 64)-(70, 70), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (70, 70)-(65, 20), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

IF c% = 15 THEN f% = INT(RND * 255) ELSE f% = 0
PAINT (66, 21), f%, c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

LINE (110, 30)-(130, 30), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (130, 30)-(110, 40), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (110, 40)-(110, 50), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (110, 50)-(125, 50), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (125, 50)-(125, 55), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (125, 55)-(110, 55), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (110, 55)-(110, 65), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (110, 65)-(120, 65), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (120, 65)-(120, 70), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (120, 70)-(100, 70), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (100, 70)-(110, 30), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

IF c% = 15 THEN f% = INT(RND * 255) ELSE f% = 0
PAINT (111, 31), f%, c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

LINE (150, 40)-(130, 20), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (130, 20)-(140, 70), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (140, 70)-(150, 40), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

LINE (135, 30)-(140, 60), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (140, 60)-(145, 40), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (145, 40)-(135, 30), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

IF c% = 15 THEN f% = INT(RND * 255) ELSE f% = 0
PAINT (133, 25), f%, c%: delay 10


LINE (160, 30)-(165, 70), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (165, 70)-(190, 70), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (190, 70)-(175, 65), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (175, 65)-(160, 30), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

IF c% = 15 THEN f% = INT(RND * 255) ELSE f% = 0
PAINT (164, 40), f%, c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

LINE (180, 20)-(190, 60), c%, BF: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

LINE (195, 20)-(195, 70), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (195, 70)-(200, 40), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (200, 40)-(220, 65), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (220, 65)-(220, 35), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (220, 35)-(215, 55), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (215, 55)-(195, 20), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

IF c% = 15 THEN f% = INT(RND * 255) ELSE f% = 0
PAINT (196, 30), f%, c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax


LINE (245, 20)-(225, 20), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (225, 20)-(225, 60), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (225, 60)-(250, 60), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (250, 60)-(250, 50), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (250, 50)-(230, 50), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (230, 50)-(230, 40), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (230, 40)-(240, 40), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (240, 40)-(240, 35), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (240, 35)-(228, 35), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (228, 35)-(230, 25), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (230, 25)-(245, 20), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

IF c% = 15 THEN f% = INT(RND * 255) ELSE f% = 0
PAINT (227, 24), f%, c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

LINE (300, 5)-(260, 8), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (260, 8)-(290, 58), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (290, 58)-(250, 68), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (250, 68)-(305, 64), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (305, 64)-(270, 18), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax
LINE (270, 18)-(300, 5), c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax

IF c% = 15 THEN f% = INT(RND * 255) ELSE f% = 0
PAINT (265, 10), f%, c%: delay 10: IF xit% = 1 THEN GOTO enddeedlinesax


COLOR c% \ 15
LOCATE 1, 1: PRINT "SAX!"
delay 70: IF xit% = 1 THEN GOTO enddeedlinesax

FOR y% = 0 TO 63
FOR x% = 0 TO 255
a% = POINT(x% \ 8, y% \ 8) * (SIN(y% / 45) * c% + COS(x% / 45) * c% + 2 * c%)
PSET (x% + 40, y% + 100), a%
NEXT x%
NEXT y%
delay 140: IF xit% = 1 THEN GOTO enddeedlinesax

COLOR c%
LOCATE 22, 10: PRINT "Not so serious side :)": PRINT "Just for fun or boredom to draw anything"

enddeedlinesax:

END SUB

SUB delay (t%)

SHARED xit%

FOR i% = 1 TO t%
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
keyaction
IF xit% = 1 THEN GOTO endelay
NEXT i%

endelay:
END SUB

SUB fadefromcolor (a%, c%, t%, r%, g%, B%)

SHARED xit%

FOR s% = 1 TO t%

OUT &H3C8, a%
FOR k% = a% TO c%
OUT &H3C9, r% + s% * ((r%(k%) - r%) / t%)
OUT &H3C9, g% + s% * ((g%(k%) - g%) / t%)
OUT &H3C9, B% + s% * ((B%(k%) - B%) / t%)
NEXT k%

WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF xit% = 0 THEN keyaction
IF xit% = 1 THEN GOTO endfadefromcolor
NEXT s%


endfadefromcolor:
END SUB

SUB fadetocolor (a%, c%, t%, r%, g%, B%)

SHARED xit%

FOR s% = 1 TO t%

OUT &H3C8, a%
FOR k% = a% TO c%
OUT &H3C9, r%(k%) + s% * ((r% - r%(k%)) / t%)
OUT &H3C9, g%(k%) + s% * ((g% - g%(k%)) / t%)
OUT &H3C9, B%(k%) + s% * ((B% - B%(k%)) / t%)
NEXT k%

WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF xit% = 0 THEN keyaction
IF xit% = 1 THEN GOTO endfadetocolor

NEXT s%

endfadetocolor:
END SUB

SUB getmap (a$)

' ------------------ Get Map --------------------

open ".\samples\pete\optimus\"+a$ FOR BINARY AS #1

GET #1, 1, a$
xg% = ASC(a$)
GET #1, 2, a$
yg% = ASC(a$)

k% = 2
FOR y% = 0 TO yg% - 1
FOR x% = 0 TO xg% - 1

k% = k% + 1
GET #1, k%, a$
cd%(y% * 32 + x%) = ASC(a$)

NEXT x%
NEXT y%
CLOSE

END SUB

SUB getpal

OUT &H3C7, 0
FOR k% = 0 TO 255
r%(k%) = INP(&H3C9)
g%(k%) = INP(&H3C9)
B%(k%) = INP(&H3C9)
NEXT k%

END SUB

SUB initcrosfadepics (a%, B%)

FOR l% = 0 TO 11

FOR g% = 0 TO 19
c$ = MID$(text$(a%, l%), g% + 1, 1)
d$ = MID$(text$(B%, l%), g% + 1, 1)

yp% = 0
FOR y% = 0 TO 15
DEF SEG = &HA000 + yp% + l% * 320
yp% = yp% + 20

FOR x% = 0 TO 15
POKE x% + g% * 16, fonts%(fpos%(ASC(c$)) * 256 + y% * 16 + x%) OR (fonts%(fpos%(ASC(d$)) * 256 + y% * 16 + x%)) * 16
NEXT x%
NEXT y%

NEXT g%

NEXT l%

END SUB

SUB Intersections

SHARED px%, py%, pa%, ps%
SHARED va%, ra, dpp%


va = pa% + 32.2
IF va > 360 THEN va = 32.2 - (360 - pa%)

FOR sl% = 0 TO 319
va = va - ra
IF va < 0 THEN va = 358.8
va% = va

IF va% = 0 OR va% = 180 OR va% = 360 THEN GOTO 112


' ---------- Horizontal intersection ----------------

IF va% > 0 AND va% < 180 THEN ay% = (py% \ 64) * 64 - 1 ELSE IF va% > 180 AND va% < 360 THEN ay% = (py% \ 64) * 64 + 64
ax% = px% + (py% - ay%) / TAN(va / 57.3)

bx% = ax% \ 64
by% = ay% \ 64
IF bx% < 0 THEN bx% = 0
IF bx% > 31 THEN bx% = 31
IF by% < 0 THEN by% = 0
IF by% > 31 THEN by% = 31

IF cd%(mul32%(by%) + bx%) = 1 THEN cx% = ax%: cy% = ay%: GOTO 112

IF va% > 0 AND va% < 180 THEN yd% = -64 ELSE IF va% > 180 AND va% < 360 THEN yd% = 64

xd% = (-yd%) / TAN(va / 57.3)
IF xd% > 2048 THEN xd% = 2048
IF xd% < -2048 THEN xd% = -2048
cx% = ax%: cy% = ay%

DO
cx% = cx% + xd%: IF cx% > 2048 OR cx% < -2048 THEN GOTO 112
cy% = cy% + yd%: IF cy% > 2048 OR cy% < -2048 THEN GOTO 112
bx% = cx% \ 64: by% = cy% \ 64
IF bx% < 0 THEN bx% = 0
IF bx% > 31 THEN bx% = 31
IF by% < 0 THEN by% = 0
IF by% > 31 THEN by% = 31

LOOP UNTIL cd%(mul32%(by%) + bx%) = 1 OR bx% = 31 OR by% = 31


112
cxa% = cx%: cya% = cy%

IF va% = 90 OR va% = 270 THEN GOTO 113


' ---------- Vertical intersection ----------------

IF va% > 270 OR va% < 90 THEN ax% = (px% \ 64) * 64 + 64 ELSE IF va% > 90 OR va% < 270 THEN ax% = (px% \ 64) * 64 - 1
ay% = py% - (ax% - px%) * TAN(va / 57.3)

bx% = ax% \ 64
by% = ay% \ 64
IF bx% < 0 THEN bx% = 0
IF bx% > 31 THEN bx% = 31
IF by% < 0 THEN by% = 0
IF by% > 31 THEN by% = 31

IF cd%(mul32%(by%) + bx%) = 1 THEN cx% = ax%: cy% = ay%: GOTO 113

IF va% > 270 OR va% < 90 THEN xd% = 64 ELSE IF va% > 90 OR va% < 270 THEN xd% = -64

yd% = (-xd%) * TAN(va / 57.3)
cx% = ax%: cy% = ay%


DO
cx% = cx% + xd%: cy% = cy% + yd%
bx% = cx% \ 64: by% = cy% \ 64
IF bx% < 0 OR bx% > 31 THEN bx% = 31
IF by% < 0 OR by% > 31 THEN by% = 31

LOOP UNTIL cd%(mul32%(by%) + bx%) = 1 OR bx% = 31 OR by% = 31

113



cxb% = cx%: cyb% = cy%

wdisa% = SQR((px% - cxa%) ^ 2 + (py% - cya%) ^ 2)
wdisb% = SQR((px% - cxb%) ^ 2 + (py% - cyb%) ^ 2)

IF wdisa% < wdisb% THEN wdis% = wdisa% ELSE wdis% = wdisb%

dis%(sl%) = wdis% * COS((pa% - va) / 57.3)
slc%(sl%) = 64 * (dpp% / dis%(sl%))
IF slc%(sl%) > 200 THEN slc%(sl%) = 200
sc%(sl%) = 254 - dis%(sl%) \ 2: IF sc%(sl%) < 0 THEN sc%(sl%) = 0


sla%(sl%) = (200 - slc%(sl%)) \ 2: slb%(sl%) = sla%(sl%) + slc%(sl%)



NEXT sl%

117

END SUB

SUB keyaction

SHARED xit%

kb% = INP(&H60)
IF kb% = 1 THEN xit% = 1
END SUB

SUB load3drecord

SHARED gi$, gg$, ggi%, gi%, filei%, gg%

IF ggi% < gi% THEN ggi% = ggi% + 1 ELSE GET #2, , gi$: gi% = ASC(gi$): GET #2, , gg$: gg% = ASC(gg$): ggi% = 1: filei% = filei% + 2


END SUB

SUB loadobject (a$)

SHARED ndts%, nlns%, npls%

clearscreen 0

open ".\samples\pete\optimus\"+a$ FOR BINARY AS #1

GET #1, , ndts%
GET #1, , nlns%
GET #1, , npls%

a$ = " "

FOR i% = 0 TO ndts% - 1
GET #1, , a$: xo%(i%) = ASC(a$) - 128
GET #1, , a$: yo%(i%) = ASC(a$) - 128
GET #1, , a$: zo%(i%) = ASC(a$) - 128
NEXT i%

FOR i% = 0 TO nlns% - 1
'GET #1, , ln%(i%, 0)
'GET #1, , ln%(i%, 1)
NEXT i%

FOR i% = 0 TO npls% - 1
'GET #1, , pl%(i%, 0)
'GET #1, , pl%(i%, 1)
'GET #1, , pl%(i%, 2)
NEXT i%

CLOSE #1

END SUB

SUB loadqbinside

' ------------ Load Quickbasic inside Big --------------

a$ = "qbrules.spr"
c$ = " "
open ".\samples\pete\optimus\"+a$ FOR BINARY AS #1

OUT &H3C8, 128
FOR i% = 0 TO 383
GET #1, , c$: OUT &H3C9, ASC(c$)
NEXT i%


xg% = 100
yg% = 100

i% = 0
FOR y% = 1 TO yg%
FOR x% = 1 TO xg%
GET #1, , c$: sp%(i%) = ASC(c$)
i% = i% + 1
NEXT x%
NEXT y%
CLOSE #1


END SUB

SUB loadrecord

SHARED k$, gi$, gg$, ggi%, gi%, filei%, gg%

IF ggi% < gi% THEN ggi% = ggi% + 1 ELSE GET #2, , gi$: gi% = ASC(gi$): GET #2, , gg$: gg% = ASC(gg$): ggi% = 1: filei% = filei% + 2
pushgg% = gg%
FOR i% = 4 TO 1 STEP -1
IF gg% - 2 ^ (i% - 1) >= 0 THEN gg% = gg% - 2 ^ (i% - 1): ka%(i%) = 1 ELSE ka%(i%) = 0
NEXT i%
gg% = pushgg%

kon%(75) = ka%(1)
kon%(77) = ka%(2)
kon%(72) = ka%(3)
kon%(80) = ka%(4)

END SUB

SUB mov3dpos (xp, yp, zp)

SHARED ndts%

FOR i% = 0 TO ndts% - 1
x(i%) = x(i%) + xp
y(i%) = y(i%) + yp
z(i%) = z(i%) + zp
NEXT i%

END SUB

SUB Output0

SHARED map%, px%, py%

' -------------- Output ------------------

cx% = px% \ 64
cy% = py% \ 64

SELECT CASE map%

CASE 0

yp% = 0
FOR y% = 0 TO 199
DEF SEG = &HA000 + yp%
yp% = yp% + 20

FOR x% = 0 TO 319

IF y% > sla%(x%) AND y% < slb%(x%) THEN POKE x%, sc%(x%) ELSE POKE x%, fs%(y%)

NEXT x%
NEXT y%

sp%(mul128%(py% \ 16) + px% \ 16) = 24


CASE 1

yp% = 0
FOR y% = 0 TO 199
DEF SEG = &HA000 + yp%
yp% = yp% + 20

FOR x% = 0 TO 319

IF y% > sla%(x%) AND y% < slb%(x%) THEN c% = sc%(x%) ELSE c% = fs%(y%)
IF x% > 127 OR y% > 127 THEN POKE x%, c% ELSE POKE x%, div2%(c%) + sp%(mul128%(y%) + x%)

NEXT x%
NEXT y%

sp%(mul128%(py% \ 16) + px% \ 16) = 24


CASE ELSE
END SELECT


END SUB

SUB output3d

SHARED ftype%, ndts%, nlns%, obj%
SHARED filei%

zp% = zpo%(obj%)
SELECT CASE ftype%

CASE IS = 0

FOR i% = 0 TO ndts% - 1

xak% = xs%(i%, 1) + 160
IF xak% > -1 AND xak% < 320 AND ys%(i%, 1) > -101 AND ys%(i%, 1) < 100 THEN POKE ypk&(ys%(i%, 1)) + xak%, 0

xsk% = xs%(i%, 0) + 160
c% = 256 - z(i%) * (80 / zp%): IF c% < 80 THEN c% = 80
IF xsk% > -1 AND xsk% < 320 AND ys%(i%, 0) > -101 AND ys%(i%, 0) < 100 THEN POKE ypk&(ys%(i%, 0)) + xsk%, c%


NEXT i%


SELECT CASE filei%

CASE 0 TO 10, 780 TO 936, 1320 TO 1440, 2162 TO 2400, 3520 TO 3640, 4180 TO 4230

CASE ELSE
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
END SELECT


CASE ELSE

'FOR i% = 0 TO nlns% - 1
'LINE (xs%(ln%(i%, 0), 1) + 160, ys%(ln%(i%, 0), 1) + 100)-(xs%(ln%(i%, 1), 1) + 160, ys%(ln%(i%, 1), 1) + 100), 1
'NEXT i%
clearscreen 1

OUT &H3C8, 0
OUT &H3C9, 0
OUT &H3C9, 0
OUT &H3C9, 0

WAIT &H3DA, 8: WAIT &H3DA, 8, 8

OUT &H3C8, 0
OUT &H3C9, 63
OUT &H3C9, 0
OUT &H3C9, 0


FOR i% = 0 TO nlns% - 1
'LINE (xs%(ln%(i%, 0), 0) + 160, ys%(ln%(i%, 0), 0) + 100)-(xs%(ln%(i%, 1), 0) + 160, ys%(ln%(i%, 1), 0) + 100), 15
NEXT i%

END SELECT


END SUB

SUB plasmablobs

SHARED xit%

meg = 1.3
n% = 3



OUT &H3C8, 0
FOR i% = 0 TO 127
OUT &H3C9, 0
OUT &H3C9, 0
OUT &H3C9, 0
NEXT i%

FOR i% = 128 TO 159
OUT &H3C9, 0
OUT &H3C9, (i% - 128) * 2
OUT &H3C9, 0
NEXT i%

FOR i% = 160 TO 191
OUT &H3C9, 0
OUT &H3C9, (191 - i%) * 2
OUT &H3C9, 0
NEXT i%

FOR i% = 192 TO 255
OUT &H3C9, i% - 192
OUT &H3C9, i% - 192
OUT &H3C9, i% - 192
NEXT i%

getpal

OUT &H3C8, 0
FOR i% = 0 TO 255
OUT &H3C9, 0
OUT &H3C9, 0
OUT &H3C9, 0
NEXT i%


FOR i% = -157 TO 518
IF i% > -1 AND i% < 519 THEN fsin1%(i%) = SIN(i% / 45) * 63: fsin2%(i%) = SIN(i% / 35) * 127
IF i% > -158 AND i% < 476 THEN fsin3%(i%) = SIN(i% / 25) * 31
NEXT i%


rc% = -1

FOR i% = -1 TO -156 STEP -1
dt100%(i%) = 63 - (i% - ((i% - 63) \ 64) * 64)
IF rc% = 1 THEN dt100%(i%) = 63 - dt100%(i%)
IF dt100%(i%) = 0 AND rc% = 1 THEN rc% = -1
IF dt100%(i%) = 63 AND rc% = -1 THEN rc% = 1
NEXT i%

rc% = 1

FOR i% = 0 TO 156
dt100%(i%) = i% - ((i%) \ 64) * 64
IF rc% = -1 THEN dt100%(i%) = 63 - dt100%(i%)
IF dt100%(i%) = 63 AND rc% = 1 THEN rc% = -1
IF dt100%(i%) = 0 AND rc% = -1 THEN rc% = 1
NEXT i%




DIM cf%(0 TO 4095)

l% = 0
FOR i% = 0 TO 63
FOR k% = 0 TO 63
cf%(l%) = i% * (k% / 63)
l% = l% + 1
NEXT k%
NEXT i%


i% = 0
FOR y% = 0 TO 99
FOR x% = 0 TO 159
IF x% = 159 AND y% = 99 THEN sp%(i%) = 255 ELSE sp%(i%) = 16384 \ SQR((159 - x%) ^ 2 + (99 - y%) ^ 2) ^ meg
IF sp%(i%) > 255 THEN sp%(i%) = 255
i% = i% + 1
NEXT x%
NEXT y%



FOR i% = -160 TO 479
IF i% < 0 OR i% > 319 THEN fsin4%(i%) = 0 ELSE IF i% < 160 THEN fsin4%(i%) = i% ELSE fsin4%(i%) = 319 - i%
NEXT i%

FOR i% = -100 TO 300
IF i% < 0 OR i% > 199 THEN cy%(i%) = 0 ELSE IF i% > 99 THEN cy%(i%) = 199 - i% ELSE cy%(i%) = i%
cy%(i%) = cy%(i%) * 160
NEXT i%

FOR i% = 0 TO 767
IF i% > 255 THEN cd%(i%) = 255 ELSE cd%(i%) = i%
NEXT i%

FOR i% = -192 TO 63
dt%(i%) = i% * 64
NEXT i%




FOR i% = 1 TO n%
dsx%(i%) = INT(RND * 45 + 45)
dsy%(i%) = INT(RND * 30 + 30)
psx%(i%) = INT(RND * 80 + 80)
psy%(i%) = INT(RND * 50 + 50)
NEXT i%

k% = 0
l% = 0


ax = TIMER


s% = 0: t% = 256
s1% = 0: t1% = 256
k0% = 128: k1% = 191
l0% = 128: l1% = 191
r1% = 0: g1% = 0: b1% = 0
fps% = 0
DO
fps% = fps% + 1
k% = k% + 2
IF k% > 156 THEN k% = 0

l% = l% + 1
FOR i% = 1 TO n%
xp1%(i%) = SIN(l% / dsx%(i%)) * psx%(i%)
yp1%(i%) = SIN(l% / dsy%(i%)) * psy%(i%)
NEXT i%

IF fps% = 512 THEN k0% = 192: k1% = 255: s% = 0
IF fps% = 1512 THEN fadeout% = 1
IF fps% = 2500 THEN getpal: s1% = 0: l0% = 0: l1% = 255: r1% = 63: g1% = 63: b1% = 63
IF fps% = 2800 THEN GOTO gout7

IF s% < t% THEN s% = s% + 1 ELSE GOTO endfadepal1

FOR kk% = k0% TO k1%
OUT &H3C8, kk%
OUT &H3C9, 0 + s% * ((r%(kk%) - 0) / t%)
OUT &H3C9, 0 + s% * ((g%(kk%) - 0) / t%)
OUT &H3C9, 0 + s% * ((B%(kk%) - 0) / t%)
NEXT kk%

endfadepal1:


IF fadeout% = 0 THEN GOTO nofadeout1
IF s1% < t1% THEN s1% = s1% + 1

FOR kk% = l0% TO l1%
OUT &H3C8, kk%
OUT &H3C9, r%(kk%) + s1% * ((r1% - r%(kk%)) / t1%)
OUT &H3C9, g%(kk%) + s1% * ((g1% - g%(kk%)) / t1%)
OUT &H3C9, B%(kk%) + s1% * ((b1% - B%(kk%)) / t1%)
NEXT kk%


nofadeout1:




yp% = 0

FOR y% = 0 TO 199
DEF SEG = &HA000 + yp%
yp% = yp% + 20

yy%(1) = cy%(y% - yp1%(1))
yy%(2) = cy%(y% - yp1%(2))
yy%(3) = cy%(y% - yp1%(3))

FOR x% = 0 TO 319

dyn% = cd%(sp%(yy%(1) + fsin4%(x% - xp1%(1))) + sp%(yy%(2) + fsin4%(x% - xp1%(2))) + sp%(yy%(3) + fsin4%(x% - xp1%(3))))
IF dyn% < 192 THEN POKE x%, dyn% ELSE pls% = dt100%(fsin3%(x% + k%) + fsin3%(y%) + fsin1%(x% + y%) + fsin3%(fsin3%(y% - k%) + fsin2%(x%) + k%)): POKE x%, cf%(dt%(dyn% - 192) + pls%) + 192

NEXT x%
NEXT y%


WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF xit% = 0 THEN keyaction
IF xit% = 1 THEN GOTO gout7



LOOP

gout7:

END SUB

SUB precalculations



REM --------- Div2 -----------

FOR i% = 0 TO 255
div2%(i%) = i% \ 2
NEXT i%


REM --------- Div4 -----------

FOR i% = 0 TO 320
div4%(i%) = i% \ 4
NEXT i%

REM ----------- Mul32 -------------
FOR i% = 0 TO 32
mul32%(i%) = i% * 32
NEXT i%

REM ----------- Nul128 ------------
FOR i% = 0 TO 127
mul128%(i%) = i% * 128
NEXT i%


REM --------- Map Output buffer precalc ---------


i% = 0
FOR y% = 0 TO 127
FOR x% = 0 TO 127
sp%(i%) = cd%((y% \ 4) * 32 + x% \ 4) * 128

i% = i% + 1
NEXT x%
NEXT y%


REM ----------- Floor&Ceiling Shades -------------

ast = 32 / 100
ang = 0

FOR i% = 0 TO 99

IF ang = 0 THEN ang = .01
dist = 24 / SIN(ang / 57.3)
fs = (255 - dist)
IF fs < 0 THEN fs%(99 - i%) = 0 ELSE fs%(99 - i%) = fs
fs%(i% + 100) = fs%(99 - i%)

ang = ang + ast
NEXT i%


END SUB

SUB prehistoricode

SHARED xit%

l% = 15
SCREEN 12

1
keyaction
IF xit% = 1 THEN GOTO prehistoricodend
COLOR 15: LOCATE 15, 18: PRINT "Press the" + CHR$(34) + "any key" + CHR$(34) + " button to continue.. ;-)"


c% = INT(RND * 63 + 1)
FOR i% = 1 TO 640 STEP 15
LINE (i%, 480)-(640, 480 - i%), i% / c%
NEXT i%
cc% = cc% + 1
CIRCLE (cx%, cy%), cc%, l%
IF cc% = 30 THEN cc% = 0: l% = 0: k% = 1: GOTO 1
IF k% = 1 AND cc% = 29 THEN cc% = 0: l% = 15: cx% = INT(RND * 640): cy% = INT(RND * 480): k% = 0
a$ = INKEY$

WHILE a$ = ""
GOTO 1
a$ = "z"
WEND

FOR z% = 1 TO 480
keyaction
IF xit% = 1 THEN GOTO prehistoricodend
t% = 31 - z% / 16
CIRCLE (320, 240), z%, t%
FOR i& = 0 TO 16383: NEXT i&
NEXT z%
FOR z% = 1 TO 640
keyaction
IF xit% = 1 THEN GOTO prehistoricodend
CIRCLE (320, 240), z%, 0
FOR i& = 0 TO 16383: NEXT i&
NEXT z%


prehistoricodend:

END SUB

SUB rgblights

SHARED xit%

meg = 2.2
n% = 3


FOR i% = 0 TO 127
OUT &H3C8, i%
OUT &H3C9, 0
OUT &H3C9, 0
OUT &H3C9, 0
NEXT i%



i% = 0
OUT &H3C8, 0

FOR a% = 0 TO 5
FOR B% = 0 TO 5
FOR c% = 0 TO 5

OUT &H3C9, a% * 12.6
OUT &H3C9, B% * 12.6
OUT &H3C9, c% * 12.6

r1%(i%) = i%
i% = i% + 1

NEXT c%
NEXT B%
NEXT a%


FOR i% = 0 TO 5
epi6%(i%) = i% * 6
epi36%(i%) = i% * 36
NEXT i%


i% = 0
FOR y% = 0 TO 99
FOR x% = 0 TO 159
IF x% = 159 AND y% = 99 THEN sp%(i%) = 255 ELSE sp%(i%) = 16384 \ SQR((159 - x%) ^ 2 + (99 - y%) ^ 2) ^ meg
IF sp%(i%) > 255 THEN sp%(i%) = 255
i% = i% + 1
NEXT x%
NEXT y%



FOR i% = -320 TO 639
IF i% < 0 OR i% > 319 THEN fsin3%(i%) = 0 ELSE IF i% < 160 THEN fsin3%(i%) = i% ELSE fsin3%(i%) = 319 - i%
NEXT i%

FOR i% = -300 TO 500
IF i% < 0 OR i% > 199 THEN fsin4%(i%) = 0 ELSE IF i% > 99 THEN fsin4%(i%) = 199 - i% ELSE fsin4%(i%) = i%
fsin4%(i%) = fsin4%(i%) * 160
NEXT i%

FOR i% = 0 TO 1792
IF i% > 5 THEN cd%(i%) = 5 ELSE cd%(i%) = i%
NEXT i%




FOR i% = 1 TO n%
dsx%(i%) = INT(RND * 35 + 15)
dsy%(i%) = INT(RND * 35 + 15)
psx%(i%) = INT(RND * 80 + 80)
psy%(i%) = INT(RND * 50 + 50)
NEXT i%

k% = 40
plx = 8: ply = 8
ax = TIMER
DO
k% = k% + 1
IF plx > 1 AND k% < 1024 THEN plx = plx - .025
IF ply > 1 AND k% < 1024 THEN ply = ply - .025
IF k% > 1024 THEN plx = plx + .01: ply = ply + .01
IF k% = 1220 THEN GOTO gout3


FOR i% = 1 TO n%
psx% = psx%(i%) * plx
psy% = psy%(i%) * ply
IF psx% > 320 THEN psx% = 320
IF psy% > 300 THEN psy% = 300
xp1%(i%) = SIN(k% / dsx%(i%)) * psx%
yp1%(i%) = SIN(k% / dsy%(i%)) * psy%
NEXT i%


yp% = 0

FOR y% = 0 TO 199
DEF SEG = &HA000 + yp%
yp% = yp% + 20

yy%(1) = fsin4%(y% - yp1%(1))
yy%(2) = fsin4%(y% - yp1%(2))
yy%(3) = fsin4%(y% - yp1%(3))

FOR x% = 0 TO 319

ca% = cd%(sp%(yy%(1) + fsin3%(x% - xp1%(1))))
cb% = cd%(sp%(yy%(2) + fsin3%(x% - xp1%(2))))
cc% = cd%(sp%(yy%(3) + fsin3%(x% - xp1%(3))))

POKE x%, r1%(ca% + epi6%(cb%) + epi36%(cc%))
NEXT x%
NEXT y%

WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF xit% = 0 THEN keyaction
IF xit% = 1 THEN GOTO gout3

LOOP

gout3:


END SUB

SUB rotate3d (xr, yr, zr)

SHARED ndts%

cosxr = COS(xr)
cosyr = COS(yr)
coszr = COS(zr)
sinxr = SIN(xr)
sinyr = SIN(yr)
sinzr = SIN(zr)

FOR i% = 0 TO ndts% - 1

x(i%) = cosyr * xo%(i%) - sinyr * zo%(i%)
z(i%) = sinyr * xo%(i%) + cosyr * zo%(i%)

y(i%) = cosxr * yo%(i%) - sinxr * z(i%)
z(i%) = sinxr * yo%(i%) + cosxr * z(i%)

nx = x(i%)
x(i%) = coszr * nx - sinzr * y(i%)
y(i%) = sinzr * nx + coszr * y(i%)

NEXT i%


END SUB

SUB saverecord

SHARED k$

k$ = CHR$(kon%(75)): PUT #2, , k$
k$ = CHR$(kon%(77)): PUT #2, , k$
k$ = CHR$(kon%(72)): PUT #2, , k$
k$ = CHR$(kon%(80)): PUT #2, , k$

END SUB

SUB setcrosfadepal (r1%(), r2%(), g1%(), g2%(), b1%(), b2%())

OUT &H3C8, 0

FOR j% = 0 TO 15
FOR i% = 0 TO 15
OUT &H3C9, i% * 4: r1%(j% * 16 + i%) = i% * 4
OUT &H3C9, i% * 4: g1%(j% * 16 + i%) = i% * 4
OUT &H3C9, i% * 4: b1%(j% * 16 + i%) = i% * 4
NEXT i%
NEXT j%

FOR i% = 0 TO 255
r2%(i%) = (i% \ 16) * 4
g2%(i%) = (i% \ 16) * 4
b2%(i%) = (i% \ 16) * 4
NEXT i%

END SUB

SUB setpal (c1%, c2%, r1%, g1%, b1%, r2%, g2%, b2%)

dc% = c2% - c1%
r = r1%: g = g1%: B = b1%


OUT &H3C8, c1%

FOR i% = c1% TO c2%

OUT &H3C9, r
OUT &H3C9, g
OUT &H3C9, B

r = r + (r2% - r1%) / dc%
g = g + (g2% - g1%) / dc%
B = B + (b2% - b1%) / dc%

NEXT i%


END SUB

SUB spheremaplasma

SHARED xit%

' ------------- Sphere mapped plasma ------------



setpal 0, 31, 0, 0, 0, 63, 0, 0
setpal 32, 63, 63, 0, 0, 63, 0, 63
setpal 64, 95, 63, 0, 63, 0, 63, 63
setpal 96, 127, 0, 63, 63, 0, 0, 0

setpal 128, 159, 0, 0, 31, 31, 0, 31
setpal 160, 191, 31, 0, 31, 31, 0, 63
setpal 192, 223, 31, 0, 63, 0, 47, 63
setpal 224, 254, 0, 47, 63, 0, 0, 31

getpal
r%(255) = 0: g%(255) = 0: B%(255) = 31

setpal 0, 255, 63, 63, 63, 63, 63, 63

delay 210



a$ = "sphrprec.dat"

fp& = -1
open ".\samples\pete\optimus\"+a$ FOR BINARY AS #1

FOR i% = 0 TO 16383

fp& = fp& + 2
GET #1, fp&, a$
xp% = ASC(a$)
GET #1, fp& + 1, a$
yp% = ASC(a$)

sp%(i%) = yp% * 128 + xp%
IF i% = 64 * 128 + 64 THEN sp%(i%) = sp%(i%) + 1

NEXT i%

CLOSE



dg% = 99

FOR i% = -180 TO -1
dt%(i%) = i% - ((i% - dg% + 1) \ dg%) * dg%
dt100%(i%) = (i% - ((i% - dg% + 1) \ dg%) * dg%) * 100
NEXT i%

FOR i% = 0 TO 180
dt%(i%) = i% - ((i% - 1) \ dg%) * dg%
dt100%(i%) = (i% - ((i% - 1) \ dg%) * dg%) * 100
NEXT i%



FOR i% = -640 TO 518
fsin2%(i%) = SIN(i% / 16) * 31
NEXT i%

FOR i% = -640 TO 715
fsin3%(i%) = SIN(i% / 63) * 75
NEXT i%


FOR i% = -168 TO 168
mod256128%(i%) = ((i% + 512) MOD 256) \ 2
NEXT i%







xs = 91: vxs = 1: ys = -96: vys = 0: fs = 0
yys% = 134


WHILE INKEY$ <> "": WEND

s% = 0: t% = 256
s1% = 0: t1% = 256
fps% = 0


k% = 0: l% = 0
DO
fps% = fps% + 1
k% = k% + 1: l% = l% + 1
IF k% = 101 THEN k% = 0
IF l% = 396 THEN l% = 0
m% = -1

IF fps% = 256 THEN fs = .02
IF fps% = 256 + 768 THEN yys% = 654
IF fps% = 256 + 1024 THEN fadeout% = 1


IF s% < t% THEN s% = s% + 1 ELSE GOTO endfadepal

OUT &H3C8, 0
FOR n% = 0 TO 255
OUT &H3C9, 63 + s% * ((r%(n%) - 63) / t%)
OUT &H3C9, 63 + s% * ((g%(n%) - 63) / t%)
OUT &H3C9, 63 + s% * ((B%(n%) - 63) / t%)
NEXT n%

endfadepal:


IF fadeout% = 0 THEN GOTO nofadeout
IF s1% < t1% THEN s1% = s1% + 1 ELSE GOTO gout

OUT &H3C8, 0
FOR n% = 0 TO 255
OUT &H3C9, r%(n%) + s1% * ((0 - r%(n%)) / t1%)
OUT &H3C9, g%(n%) + s1% * ((0 - g%(n%)) / t1%)
OUT &H3C9, B%(n%) + s1% * ((0 - B%(n%)) / t1%)
NEXT n%


nofadeout:


xs = xs + vxs: IF xs > 254 OR xs < 65 THEN vxs = -vxs
vys = vys + fs
ys = ys + vys
IF ys > yys% THEN ys = ys - vys: vys = -vys * .8

xs% = xs: ys% = ys
sy% = ys% - 63
sx% = xs% - 63
IF sy% < 0 AND sy% > -128 THEN m% = sy% * (-128) - 1

yw1% = -1 + sy%: yw2% = 128 + sy%
xw1% = -1 + sx%: xw2% = 128 + sx%

FOR y% = 0 TO 199
DEF SEG = &HA000 + y% * 20


IF y% > yw1% AND y% < yw2% THEN GOTO 111

FOR x% = 0 TO 319
c% = fsin2%(x%) + fsin3%(y% + l%) + fsin2%(x% + y%) + fsin2%(fsin3%(x% + l%) - fsin2%(x% - y% - k%))
POKE x%, mod256128%(c%)
NEXT x%

GOTO 1121

111
FOR x% = 0 TO 319
IF x% > xw1% AND x% < xw2% THEN m% = m% + 1: yn% = sp%(m%) \ 128: xn% = sp%(m%) - yn% * 128 + sx%: yn% = yn% + sy%: spp% = 128 ELSE xn% = x%: yn% = y%
IF xn% = x% AND yn% = y% THEN spp% = 0

c% = fsin2%(xn%) + fsin3%(yn% + l%) + fsin2%(xn% + yn%) + fsin2%(fsin3%(xn% + l%) - fsin2%(xn% - yn% - k%))
POKE x%, mod256128%(c%) + spp%
NEXT x%

1121

NEXT y%

'OUT &H3C8, 0
'OUT &H3C9, 0
'OUT &H3C9, 0
'OUT &H3C9, 0

WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF xit% = 0 THEN keyaction
IF xit% = 1 THEN GOTO gout

'OUT &H3C8, 0
'OUT &H3C9, 63
'OUT &H3C9, 0
'OUT &H3C9, 0

LOOP

gout:



END SUB

SUB sucking

SHARED xit%

SCREEN 13
COLOR 15

LOCATE 1, 1: PRINT "Still Sucking?"


FOR y% = 7 TO 0 STEP -1
FOR x% = 14 * 8 - 1 TO 0 STEP -1

c% = POINT(x%, y%) * (y% + 1) * SIN((x% + y%) / 45)
LINE (x% * 2.8, y% * 16 + 32)-((x% + 1) * 2.8, (y% + 1) * 16 + 32), c%, BF

NEXT x%
NEXT y%

END SUB

SUB translate3d

SHARED ndts%, obj%

IF obj% = 1 THEN zpr% = 1
IF obj% = 2 OR obj% = 3 THEN zpr% = 4
IF obj% = 4 THEN zpr% = 16
IF obj% > 4 THEN zpr% = 8

FOR i% = 0 TO ndts% - 1

xs%(i%, 1) = xs%(i%, 0)
ys%(i%, 1) = ys%(i%, 0)

IF z(i%) <= zpr% THEN GOTO 10

xs%(i%, 0) = (x(i%) * 256) / z(i%)
ys%(i%, 0) = (y(i%) * 256) / z(i%)

10

NEXT i%

END SUB

SUB zoomdistort

SHARED xit%

WHILE INKEY$ <> "": WEND

CLS



FOR i% = -640 TO 518
fsin2%(i%) = SIN(i% / 16) * 31
NEXT i%

FOR i% = -640 TO 715
fsin3%(i%) = SIN(i% / 63) * 75
NEXT i%

FOR i% = -48 TO 539
fsin1%(i%) = SIN(i% / 35) * 24
NEXT i%

FOR i% = -319 TO 602
fsin4%(i%) = SIN(i% / 45) * 24
NEXT i%

'$DYNAMIC
DIM dr%(-160 TO 160, -48 TO 48)
'$STATIC

FOR ii% = -48 TO 48
FOR i% = -160 TO 160
dva = ii% / 64 + 2
IF dva <> 0 THEN dr%(i%, ii%) = i% / dva ELSE dr%(i%, ii%) = i%
NEXT i%
NEXT ii%


' ------------ Load Quickbasic inside --------------

a$ = "qbinside.spr"
c$ = " "
open ".\samples\pete\optimus\"+a$ FOR BINARY AS #1

OUT &H3C8, 128
FOR i% = 0 TO 383
GET #1, , c$: OUT &H3C9, ASC(c$)
NEXT i%


xg% = 100
yg% = 100

i% = 0
FOR y% = 1 TO yg%
FOR x% = 1 TO xg%
GET #1, , c$: sp%(i%) = ASC(c$)
i% = i% + 1
NEXT x%
NEXT y%
CLOSE #1



setpal 0, 31, 0, 0, 0, 0, 31, 63
setpal 32, 63, 0, 31, 63, 31, 0, 63
setpal 64, 95, 31, 0, 63, 0, 63, 0
setpal 96, 127, 0, 63, 0, 0, 0, 0



FOR l% = 15 TO 305
LINE (14, 6)-(l%, 7), 27, B
LINE (13, 5)-(l% + 1, 8), 31, B
LINE (12, 4)-(l% + 2, 9), 27, B
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF xit% = 0 THEN keyaction
IF xit% = 1 THEN GOTO gout2
NEXT l%

FOR n% = 7 TO 193
IF n% > 7 AND n% < 194 THEN LINE (15, n% - 1)-(304, n% - 1), 0, B
LINE (14, 6)-(305, n%), 27, B
LINE (13, 5)-(306, n% + 1), 31, B
LINE (12, 4)-(307, n% + 2), 27, B
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF xit% = 0 THEN keyaction
IF xit% = 1 THEN GOTO gout2
NEXT n%


' ----------- Quickbasic Inside ------------


k0% = k%
l0% = l%
k% = 0
l% = 0

kxy0% = 0

fps% = 0
DO
fps% = fps% + 1
IF fps% > 1400 AND kxy0% > -100 THEN kxy0% = kxy0% - 100 ELSE IF fps% <= 1000 AND kxy0% < 10000 THEN kxy0% = kxy0% + 100
IF kxy0% = -100 THEN GOTO gout2

k% = k% + 1: IF k% = 220 THEN k% = 0
l% = l% + 1: IF l% = 283 THEN l% = 0

k0% = k0% + 1: IF k0% = 101 THEN k0% = 0
l0% = l0% + 1: IF l0% = 396 THEN l0% = 0


xp% = SIN(k% / 35) * 48
yp% = SIN(l% / 45) * 64


ypp% = 160
FOR y% = 8 TO 191
DEF SEG = &HA000 + ypp%
ypp% = ypp% + 20
sx% = fsin4%(y% + l%) + fsin1%(fsin1%(y%) + fsin4%(y% + l%))

FOR x% = 16 TO 303

sy% = fsin1%(x% + k%) + fsin4%(y% - x%)

kxy% = dt100%(dr%(y% - 100, sy%) + yp%) + dt%(dr%(x% - 160, sx%) + xp%)
IF kxy% > kxy0% THEN c% = 0 ELSE IF sp%(kxy%) = 129 THEN c% = mod256128%(fsin3%(x%) + fsin2%(x% + k0%) + fsin2%(y%)) ELSE c% = sp%(kxy%)

POKE x%, c%

NEXT x%
NEXT y%

'OUT &H3C8, 0
'OUT &H3C9, 0
'OUT &H3C9, 0
'OUT &H3C9, 0

WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF xit% = 0 THEN keyaction
IF xit% = 1 THEN GOTO gout2

'OUT &H3C8, 0
'OUT &H3C9, 63
'OUT &H3C9, 0
'OUT &H3C9, 0

LOOP

gout2:

END SUB

