'***************************************
'*                                     *
'* Basic-Demo for vector.library V1.6x *
'*                                     *
'* 1991 by Alexander Lippert          *
'*                                     *
'* All object-design done by           *
'*   Oliver Hahn 1991                 *
'*                                     *
'***************************************

LIBRARY "exec.library"
LIBRARY "vector.library"

DECLARE FUNCTION AllocMem& LIBRARY
DECLARE FUNCTION FreeMem& LIBRARY

DECLARE FUNCTION SetVBI& LIBRARY
DECLARE FUNCTION InitVBOBs& LIBRARY
DECLARE FUNCTION OpenVScreen& LIBRARY
DECLARE FUNCTION CloseVScreen& LIBRARY
DECLARE FUNCTION UseJoy& LIBRARY
DECLARE FUNCTION DoAnim& LIBRARY
DECLARE FUNCTION FreeVBOBs& LIBRARY
DECLARE FUNCTION AutoScaleOn& LIBRARY
DECLARE FUNCTION AutoScaleOff& LIBRARY
DECLARE FUNCTION FreeJoy& LIBRARY
DECLARE FUNCTION SetColors& LIBRARY

fmem&=65537&   ' Flags fuer FastMem
cmem&=65539&   ' Flags fuer ChipMem

OPEN "vd_rot.asm" FOR INPUT AS 1  ' Assembler-Code laden  (auf Pfad achten!!)
VBIProg&=AllocMem&(LOF(1),fmem&)
Code$=INPUT$(LOF(1),1)
CLOSE 1
FOR i=1 TO LEN(Code$)-32
  POKE VBIProg&+i-1,ASC(MID$(Code$,i+32,1))
NEXT i

RESTORE NewVScreen ' Zeiger auf NewVScreen
GOSUB OpenVScreen  ' VScreen ffnen

RESTORE ColorTab ' Zeiger auf Farb-Tabelle
GOSUB SetColors  ' Farben setzen

RESTORE BOBList  ' Zeiger auf BOBListe
GOSUB InitVBOBs  ' VBOBs initialisieren

res=AutoScaleOn&(PEEKW(nsm&+12)) ' Entzerrung fuer hhrerr Auflsungen

RESTORE JoyStruct ' Zeiger auf Joystick-Struktur
'GOSUB UseJoy      ' Joystick nicht benutzen

RESTORE PointTab
GOSUB MakePointTab ' Punkt-Tabelle anlegen

res=SetVBI&(VBIProg&)  ' AssemblerCode der Bibliothek bergeben

RESTORE AreaTab
GOSUB MakeAreaTab ' Flchen-Tabelle anlegen

RESTORE MoveTab
GOSUB MakeMoveTab ' Bewegungs-Tabelle anlegen

RESTORE ObjectStruct
GOSUB MakeObjectStruct ' Object-Struktur anlegen

RESTORE WorldStruct
GOSUB MakeWorldStruct ' Welt-Struktur anlegen

res=DoAnim&(world&) ' Animation der Krper


res=CloseVScreen& ' Screen schlieen

'res=FreeJoy&    ' nur, wenn zuvor
'res=FreeMem&(joy&,12&) ' UseJoy& erfolgte

res=FreeVBOBs  ' nur, wenn zuvor
res=FreeMem&(bobs&,bobsize&) ' InitVBOBs& erfolgte

res=FreeMem&(nsm&,34&)  ' von Strukturen belegten
res=FreeMem&(coltab&,8*64+2&) ' Speicher freigeben
res=FreeMem&(world&,wdsize&) ' ...
res=FreeMem&(object&,26&)
res=FreeMem&(movetb&,1000&)
res=FreeMem&(areatb&,arsize&)
res=FreeMem&(pointtb&,ptsize&)
res=FreeMem&(VBIProg&,LEN(Code$))
LIBRARY CLOSE

END


NewVScreen:
  ' Offset von links oben
 DATA 0,0
  ' Ausdehnung des Screen
 DATA 320,256
  ' Tiefe des Screen
 DATA 3
  ' Farben der Titel-Leiste      
 DATA 0,0 
  ' ViewModes (&H8000 HiRes, &H4 Lace)
 DATA 0
  ' Zeiger auf Font und Title
 DATA 0,0
  ' Flags (z.Z. unbelegt)
 DATA 0
  ' Offset der Vektor-Graphik im Screen (z.Z. unbelegt)
 DATA 0,0
  ' Ausdehnung der Vector-Graphik (mu z.Z. Ausdehnung des Screens entsprechen) 
 DATA 320,256
  ' Tife der Vektor-Graphik
 DATA 3
 

WorldStruct:
  ' Flags (1 fuer Drahtgitter), Anzahl der Objekte
 DATA 0,1
  ' Zeiger auf Objekte (werden von MakeWorldStruct eingetragen)
 DATA 0


ObjectStruct: ' Fuer jedes Objekt eine eigene!
  ' Zeiger auf Punk-Tabelle, Flchen-Tabelle, Bewegungs-Tabelle (werden von MakeObjectStruct eingetragen)
 DATA 0,0,0
  ' Flags (z.Z. unbelegt)
 DATA 0
  ' Start-Position
 DATA 0,0,-14500
  ' Start-Rotation
 DATA 0,0,0


MoveTab:
  ' Ticks, movx,movy,movz, rotx,roty,rotz
 DATA 210,0,0,60,2,1,0
  ' label
 DATA -3
 DATA 90,0,0,0,2,1,0
  ' goto label  8 mal
 DATA -4,8
 DATA 210,0,0,-60,2,1,0
 DATA -1


ColorTab:
 ' Register, Rot, Gruen, Blau
 DATA 0, 0,0,0
 DATA 1, 0,10,0
 DATA 2, 0,8,0
 DATA 3, 0,0,12
 DATA 4, 0,0,10
 DATA 5, 10,0,10
 DATA 6, 8,0,8
 DATA 7, 0,0,15
 DATA -1


JoyStruct:
  ' Z-Geschwindigkeit, Vordere Grenze, Hintere Grenze
 DATA 20,-300,-16000
  ' Rotations-Geschwindigkeit um x,y,z-Achse
 DATA 1,1,1


BOBList:
  ' Anzahl der VBOBs
 DATA 16
  ' Breite in Worten, Hhe, Reserved, Reserved
 DATA 2,31,0,0
 DATA 2,29,0,0
 DATA 2,27,0,0
 DATA 2,25,0,0
 DATA 2,23,0,0
 DATA 2,21,0,0
 DATA 2,19,0,0
 DATA 2,17,0,0
 DATA 1,15,0,0
 DATA 1,13,0,0
 DATA 1,11,0,0
 DATA 1,9,0,0
 DATA 1,7,0,0
 DATA 1,5,0,0
 DATA 1,3,0,0
 DATA 1,1,0,0
  

PointTab: ' Punkt-Tabelle, wird vom Assembler-Programm
          ' ergnzt und mutiert
  ' Anzahl der Punkte eines Objekts
 DATA 48
  ' x,y,z-Koordinate, Eigengre fuer VBOBs
 DATA -30,192,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA -60,120,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA -192,24,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA -192,-24,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA -60,-120,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA -30,-192,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0
 DATA 0,0,0,0

 
AreaTab:  ' Flchen-Tabelle
  ' Anzahl der Flchen eines Objekts
 DATA 42
  ' Eckenzahl oder Kennung, Farb-Nummer, Eckpunkte (max. 8)
 DATA 8,7,0*4,1*4,2*4,3*4,4*4,5*4,6*4,7*4,0*4
 DATA 8,7,47*4,46*4,45*4,44*4,43*4,42*4,41*4,40*4,47*4

 DATA 4,3,40*4,41*4,33*4,32*4,40*4,0,0,0,0
 DATA 4,4,41*4,42*4,34*4,33*4,41*4,0,0,0,0
 DATA 4,3,42*4,43*4,35*4,34*4,42*4,0,0,0,0
 DATA 4,4,43*4,44*4,36*4,35*4,43*4,0,0,0,0
 DATA 4,3,44*4,45*4,37*4,36*4,44*4,0,0,0,0
 DATA 4,4,45*4,46*4,38*4,37*4,45*4,0,0,0,0
 DATA 4,3,46*4,47*4,39*4,38*4,46*4,0,0,0,0
 DATA 4,4,47*4,40*4,32*4,39*4,47*4,0,0,0,0

 DATA 4,3,8*4,9*4,1*4,0*4,8*4,0,0,0,0
 DATA 4,4,9*4,10*4,2*4,1*4,9*4,0,0,0,0
 DATA 4,3,10*4,11*4,3*4,2*4,10*4,0,0,0,0
 DATA 4,4,11*4,12*4,4*4,3*4,11*4,0,0,0,0
 DATA 4,3,12*4,13*4,5*4,4*4,12*4,0,0,0,0
 DATA 4,4,13*4,14*4,6*4,5*4,13*4,0,0,0,0
 DATA 4,3,14*4,15*4,7*4,6*4,14*4,0,0,0,0
 DATA 4,4,15*4,8*4,0*4,7*4,15*4,0,0,0,0

 DATA 4,2,16*4,17*4,9*4,8*4,16*4,0,0,0,0
 DATA 4,1,17*4,18*4,10*4,9*4,17*4,0,0,0,0
 DATA 4,2,18*4,19*4,11*4,10*4,18*4,0,0,0,0
 DATA 4,1,19*4,20*4,12*4,11*4,19*4,0,0,0,0
 DATA 4,2,20*4,21*4,13*4,12*4,20*4,0,0,0,0
 DATA 4,1,21*4,22*4,14*4,13*4,21*4,0,0,0,0
 DATA 4,2,22*4,23*4,15*4,14*4,22*4,0,0,0,0
 DATA 4,1,23*4,16*4,8*4,15*4,23*4,0,0,0,0

 DATA 4,5,24*4,25*4,17*4,16*4,24*4,0,0,0,0
 DATA 4,6,25*4,26*4,18*4,17*4,25*4,0,0,0,0
 DATA 4,5,26*4,27*4,19*4,18*4,26*4,0,0,0,0
 DATA 4,6,27*4,28*4,20*4,19*4,27*4,0,0,0,0
 DATA 4,5,28*4,29*4,21*4,20*4,28*4,0,0,0,0
 DATA 4,6,29*4,30*4,22*4,21*4,29*4,0,0,0,0
 DATA 4,5,30*4,31*4,23*4,22*4,30*4,0,0,0,0
 DATA 4,6,31*4,24*4,16*4,23*4,31*4,0,0,0,0

 DATA 4,2,32*4,33*4,25*4,24*4,32*4,0,0,0,0
 DATA 4,1,33*4,34*4,26*4,25*4,33*4,0,0,0,0
 DATA 4,2,34*4,35*4,27*4,26*4,34*4,0,0,0,0
 DATA 4,1,35*4,36*4,28*4,27*4,35*4,0,0,0,0
 DATA 4,2,36*4,37*4,29*4,28*4,36*4,0,0,0,0
 DATA 4,1,37*4,38*4,30*4,29*4,37*4,0,0,0,0
 DATA 4,2,38*4,39*4,31*4,30*4,38*4,0,0,0,0
 DATA 4,1,39*4,32*4,24*4,31*4,39*4,0,0,0,0
 

OpenVScreen:
nsm&=AllocMem&(34&,fmem&)

READ leftedge,topedge,widt,height,depth,detailpen
READ blockpen,viewmodes,a,a
READ vwflags,vwleftedge,vwtopedge,vwwidt
READ vwheight,vwdepth

POKEW nsm&,leftedge  ' NewVScreen-Struktur anlegen
POKEW nsm&+2,topedge
POKEW nsm&+4,widt
POKEW nsm&+6,height
POKEW nsm&+8,depth
POKE  nsm&+10,detailpen
POKE  nsm&+11,blockpen
POKEW nsm&+12,viewmodes
POKEL nms&+14,font
POKEL nsm&+18,SADD("vector.library V1.67 91 by A.Lippert"+CHR$(0))
POKEW nsm&+22,vwflags
POKEW nsm&+24,vwleftedge
POKEW nsm&+26,vwtopedge
POKEW nsm&+28,vwwidt
POKEW nsm&+30,vwheight
POKEW nsm&+32,vwdepth

viewstruct&=OpenVScreen&(nsm&) ' Bibliothek aufrufen

RETURN


SetColors:
coltab&=AllocMem&(8*64+2&,fmem&) ' fuer max. 64 Farben speicher allokieren
ct=coltab&

READ reg

WHILE reg<>-1 ' Farb-Tabelle anlegen
 READ r,g,b
 POKEW ct,reg
 POKEW ct+2,r
 POKEW ct+4,g
 POKEW ct+6,b
 READ reg
 ct=ct+8
WEND
POKEW ct,-1

res=SetColors&(viewstruct&,coltab&) ' Bibliothek aufrufen

RETURN


MakePointTab:
READ ptnum
ptsize&=ptnum*8+2
pointtb&=AllocMem&(ptsize&,fmem&)

pt=pointtb&

POKEW pt,ptnum
pt=pt+2

FOR i=1 TO ptnum ' Punkt-Tabelle anlegen
 READ x,y,z,ps
 POKEW pt,x
 POKEW pt+2,y
 POKEW pt+4,z
 POKEW pt+6,ps
 pt=pt+8
NEXT i

POKEL VBIProg&+176,pointtb&+2  ' AssemblerCode einen Zeiger bergeben

RETURN


MakeAreaTab:
READ arnum
arsize&=arnum*22+2
areatb&=AllocMem&(arsize&,fmem&)

ar=areatb&

POKEW ar,arnum
ar=ar+2

FOR i=1 TO arnum ' Flchen-Tabelle anlegen
 READ ptnum,col,pt1$,pt2$,pt3$,pt4$,pt5$,pt6$,pt7$,pt8$,pt9$
 POKEW ar,ptnum
 POKEW ar+2,col
 POKEW ar+4,VAL(pt1$)*4
 POKEW ar+6,VAL(pt2$)*4
 POKEW ar+8,VAL(pt3$)*4
 POKEW ar+10,VAL(pt4$)*4
 POKEW ar+12,VAL(pt5$)*4
 POKEW ar+14,VAL(pt6$)*4
 POKEW ar+16,VAL(pt7$)*4
 POKEW ar+18,VAL(pt8$)*4
 POKEW ar+20,VAL(pt9$)*4
 ar=ar+22
NEXT i

RETURN


MakeMoveTab:
movetb&=AllocMem&(1000&,fmem&) ' 1000 Bytes fr Bewegungs-Tabelle allokieren (mehr als ausreichend)

mv=movetb&

mvtabbeg:
READ ticks

WHILE ticks => 0 ' Bewegungs-Tabelle anlegen
 POKEW mv,ticks
 READ movx,movy,movz,rotx,roty,rotz
 POKEW mv+2,movx
 POKEW mv+4,movy
 POKEW mv+6,movz
 POKEW mv+8,rotx
 POKEW mv+10,roty
 POKEW mv+12,rotz
 READ ticks
 mv=mv+14 
WEND

IF ticks=-1 OR ticks = -2 THEN POKEW mv,ticks : GOTO mvtabend

IF ticks=-3 THEN POKEW mv,ticks : mv=mv+2 : GOTO mvtabbeg
IF ticks=-4 THEN POKEW mv,ticks : READ count : POKEW mv+2,count : mv=mv+4 : GOTO mvtabbeg

mvtabend:
RETURN


MakeObjectStruct:
READ a,a,a

object&=AllocMem&(26&,fmem&)

READ flags,posx,posy,posz,rotx,roty,rotz

POKEL object&,pointtb&  ' Object-Struktur anlegen
POKEL object&+4,areatb&
POKEL object&+8,movetb&
POKEW object&+12,flags
POKEW object&+14,posx
POKEW object&+16,posy
POKEW object&+18,posz
POKEW object&+20,rotx
POKEW object&+22,roty
POKEW object&+24,rotz

RETURN


MakeWorldStruct:
READ flags
READ obnum

wdsize&=obnum*4+4
world&=AllocMem&(wdsize&,fmem&)

wd=world&

POKEW wd,flags ' Welt-Struktur anlegen
POKEW wd+2,obnum

wd=wd+4

READ a           ' Diese Sequenz mu fr jedes
POKEL wd,object& ' Objekt erfolgen

RETURN


UseJoy:
joy&=AllocMem&(12&,fmem&)
READ movz,borderfront,borderback,rotx,roty,rotz

POKEW joy&,movz  ' Joystick-Struktur poken
POKEW joy&+2,borderfront
POKEW joy&+4,borderback
POKEW joy&+6,rotx
POKEW joy&+8,roty
POKEW joy&+10,rotz

res=UseJoy&(0&,joy&) ' Bibliothek aufrufen

RETURN


InitVBOBs:
READ bobnum

bobsize&=bobnum*12+2
bobs&=AllocMem&(bobsize&,fmem&)

bb=bobs&

POKEW bb,bobnum

bb=bb+2

FOR i=1 TO bobnum ' BOBListe anlegen
 READ widt,height,a,a
 POKEW bb,widt
 POKEW bb+2,height
 POKEL bb+4,a
 POKEL bb+8,a
 bb=bb+12
NEXT

' Im folgenden Bibliotheksaufruf ist der Name des VBOB-Satzes enthalten (Pfad nicht vergessen!)
nam$="VBOBs:bs1lo3_??.gfx"+CHR$(0)
res=InitVBOBs&(PEEKW(nsm&+32),SADD(nam$),bobs&,0&)

RETURN
