 ; ****  vector.library V1.66   ©1991 by A.Lippert


 incdir dh0:include/
 include exec/types.i
 include exec/nodes.i
 include exec/libraries.i
 include exec/initializers.i
 include exec/lists.i
 include exec/resident.i
 include libraries/dos.i

wblt MACRO

.\@ btst  #6,$dff002
    bne.s .\@

 ENDM


 STRUCTURE My_Lib,LIB_SIZE
           ULONG ml_SysLib
           ULONG ml_DosLib
           ULONG ml_SegList
           ULONG ml_Flags
           ULONG ml_pad
           LABEL MyLib_SIZE
 
Start:
 moveq  #0,d0
 rts

Version  = 1
Revision = 66
Priority = 0

Resident:
 dc.w RTC_MATCHWORD
 dc.l Resident
 dc.l CodeEnd
 dc.b RTF_AUTOINIT
 dc.b Version
 dc.b NT_LIBRARY
 dc.b Priority
 dc.l LibName
 dc.l IDString
 dc.l Init

LibName:
 dc.b "vector.library",0
IDString:
 dc.b "vector.library V1.66  (16-Sep-91)   Coding by Alexander Lippert",0
dosname:
 dc.b "dos.library",0

 even

CodeEnd:

Init:
 dc.l MyLib_SIZE
 dc.l FuncTab
 dc.l DataTab
 dc.l InitRoutine

FuncTab:
 dc.l Open
 dc.l Close
 dc.l Expunge
 dc.l Nil

 dc.l SetVBI
 dc.l InitVBOBs
 dc.l OpenVScreen
 dc.l CloseVScreen
 dc.l UseJoy
 dc.l DoAnim
 dc.l RotateX
 dc.l RotateY
 dc.l RotateZ
 dc.l FreeVBOBs
 dc.l AutoScaleOn
 dc.l AutoScaleOff
 dc.l FreeJoy
 dc.l SetColors

 dc.l -1

DataTab:
 INITBYTE LH_TYPE,NT_LIBRARY
 INITLONG LN_NAME,LibName
 INITBYTE LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
 INITWORD LIB_VERSION,Version
 INITWORD LIB_REVISION,Revision
 INITLONG LIB_IDSTRING,IDString
 dc.l 0

InitRoutine: 
 move.l a5,-(a7)
 move.l d0,a5
 move.l a6,ml_SysLib(a5)
 move.l a0,ml_SegList(a5)
 lea    dosname(pc),a1
 jsr    -408(a6)
 move.l d0,ml_DosLib(a5)
 move.l d0,dosbase
 move.l a5,d0
 move.l (a7)+,a5
 rts
 
Open:
 addq.w #1,LIB_OPENCNT(a6)
 bclr   #LIBB_DELEXP,ml_Flags(a6)
 move.l a6,d0
 cmp.w  #1,LIB_OPENCNT(a6)
 bne    .end
 movem.l d0-d1/a0-a1/a6,-(a7)
 move.l 4.w,a6
 move.w #1,vbi
 lea    vbistruc(pc),a1
 moveq  #5,d0
 jsr    -168(a6)
 lea    gfxname(pc),a1
 jsr    -408(a6)
 move.l d0,gfxbase
 lea    intname(pc),a1
 jsr    -408(a6)
 move.l d0,intbase
 movem.l (a7)+,d0-d1/a0-a1/a6
 rts
.end:
 subq.w #1,LIB_OPENCNT(a6)
 moveq  #0,d0
 rts

vbistruc:
 dc.l 0,0
 dc.b 2,5
 dc.l 0
 dc.l vbidata
 dc.l vbiserver
vbidata:
 dc.l 5,0

vbiserver:
 movem.l d1-d7/a0-a6,-(a7)
 tst.w  vbi
 bne    .noflip
 movem.l plnh(pc),d0-1
 move.l d0,plns
 move.l d1,plnh
 movem.l bmh(pc),d0-1
 move.l d0,bms
 move.l d1,bmh
 move.l d0,rasinfo+4
 move.l clist1(pc),a0
 move.l (a0),a0
 add.l  delta(pc),a0
 cmp.w  #$e0,-2(a0)
 beq.s  .cok
 bra.s  .noflip
.cok:
 move.w (a0),d0
 swap   d0
 move.w 4(a0),d0
 sub.l  plnh(pc),d0
 cmp.l  #-4,d0
 blt.s  .noflip
 cmp.l  #4,d0
 bgt.s  .noflip
 add.l plns(pc),d0
 move.l d0,d3
 moveq  #1,d2
.colp:
 move.w used(pc),d1
 subq.w #1,d1
.clp:
 move.w d0,4(a0)
 swap   d0
 move.w d0,(a0)
 swap   d0
 add.l  onepln(pc),d0
 addq.l #8,a0
 dbf    d1,.clp
 btst   #2,flags+1
 beq.s  .noflip
 move.w width(pc),d0
 ext.l  d0
 add.l  d3,d0
 move.l clist2(pc),a0
 move.l (a0),a0
 add.l  delta(pc),a0
 dbf    d2,.colp
.noflip:
 lea     jptab(pc),a2
.lp:
 move.l  (a2)+,a3
 cmp.l   #0,a3
 beq.s   .ok
 jsr     (a3)
.ok:
 tst.l   (a2)
 bge.s   .lp
 move.w  #1,vbi
 movem.l (a7)+,d1-d7/a0-a6
 moveq   #0,d0
 rts

jptab:
 dc.l 0
anadr:
 dc.l 0
joyadr:
 dc.l 0
 dc.l -1

move:
 movem.l d2-d3/a2-a3,-(a7)
 move.l strptr(pc),a2
 move.l rootptr(pc),a3
 move.w (a2)+,d2
 subq.w #1,d2
.lab
 move.l (a2)+,a1
 tst.w  16(a3)
 bne    .end
 move.l 4(a3),a0
 subq.w #1,8(a3)
 bge.s  .ok
 lea    14(a0),a0
.ok3:
 cmp.w  #-1,(a0)
 bgt.s  .ok2
 blt.s  .doloop
 move.w #1,16(a3)
 movem.l (a7)+,d2-d3/a2-a3
 rts
.doloop:
 cmp.w  #-2,(a0)
 blt.s  .dlp
 move.l #nilobj,-4(a2)
 move.w #1,16(a3)
 bra    .end
.dlp:
 cmp.w  #-3,(a0)
 blt.s  .bf
 addq.l #2,a0
 move.l a0,10(a3)
 bra.s  .ok3
.bf
 tst.w  14(a3)
 bge.s  .nonewcnt
 move.w 2(a0),14(a3)
.nonewcnt:
 subq.w #1,14(a3)
 blt.s  .endlp
 move.l 10(a3),a0
 bra.s  .ok3
.endlp:
 addq.l #4,a0
 bra.s  .ok3
.ok2:
 move.w (a0),8(a3)
 subq.w #1,8(a3)
 move.l a0,4(a3)
.ok:
 move.l offset(pc),d0
 addq.l #4,d0
 cmp.l  a2,d0
 beq.s  .end
 addq.l #2,a0
 move.w (a0)+,d0
 add.w  d0,14(a1)
 move.w (a0)+,d0
 add.w  d0,16(a1)
 move.w (a0)+,d0
 add.w  d0,18(a1)
 move.w #360,d1
 move.w d1,d3
 neg.w  d3
 move.w (a0)+,d0
 add.w  d0,20(a1)
 cmp.w  20(a1),d3
 blt.s  .okx
 add.w  d1,20(a1)
.okx:
 cmp.w  20(a1),d1
 bgt.s  .ok1x
 sub.w  d1,20(a1)
.ok1x:
 move.w (a0)+,d0
 add.w  d0,22(a1)
 cmp.w  22(a1),d3
 blt.s  .oky
 add.w  d1,22(a1)
.oky:
 cmp.w  22(a1),d1
 bgt.s  .ok1y
 sub.w  d1,22(a1)
.ok1y:
 move.w (a0)+,d0
 add.w  d0,24(a1)
 cmp.w  24(a1),d3
 blt.s  .okz
 add.w  d1,24(a1)
.okz:
 cmp.w  24(a1),d1
 bgt.s  .end
 sub.w  d1,24(a1)
.end:
 lea    18(a3),a3
 dbf    d2,.lab
 movem.l (a7)+,d2-d3/a2-a3
 rts

nilobj:
 dc.l 0
 
joy:                     ; JOYSTICK
 movem.l d2-d3,-(a7)
 move.l offset(pc),a1
 move.l (a1),a1
 move.w #360,d1
 move.w d1,d2
 neg.w  d2
 move.w $dff00c,d3
 btst   #1,d3
 bne.s  right
 btst   #9,d3
 bne.s  left
testud:
 move.w d3,d0
 asr.w  #1,d0
 eor.w  d0,d3
 btst   #0,d3
 bne    bckw
 btst   #8,d3
 bne    forw
 movem.l (a7)+,d2-d3
 rts
right:                   ; rechts
 btst   #7,$bfe001       ; rechts + Feuer ?
 bne.s  nfr
 move.w rsz(pc),d0
 add.w  d0,24(a1)           ; Feuer -> z-rot + 3°
 cmp.w  24(a1),d2
 blt.s  okz1
 add.w  d1,24(a1)
okz1:
 cmp.w  24(a1),d1
 bgt.s  testud
 sub.w  d1,24(a1)
 bra.s  testud
nfr:                     ; kein Feuer -> y-rot + 3°
 move.w rsy(pc),d0
 add.w  d0,22(a1)
 cmp.w  22(a1),d2
 blt.s  oky1
 add.w  d1,22(a1)
oky1:
 cmp.w  22(a1),d1
 bgt.s  testud
 sub.w  d1,22(a1)
 bra.s  testud
left:                    ; links
 btst   #7,$bfe001       ; links + Feuer?
 bne.s  nfr1
 move.w rsz(pc),d0
 sub.w  d0,24(a1)           ; Feuer -> z-rot + 3°
 cmp.w  24(a1),d2
 blt.s  okz2
 add.w  d1,24(a1)
okz2:
 cmp.w  24(a1),d1
 bgt    testud
 sub.w  d1,24(a1)
 bra    testud
nfr1:
 move.w rsy(pc),d0
 sub.w  d0,22(a1)        ; kein Feuer -> y-rot - 3°
 cmp.w  22(a1),d2
 blt.s  oky2
 add.w  d1,22(a1)
oky2:
 cmp.w  22(a1),d1
 bgt    testud
 sub.w  d1,22(a1)
 bra    testud
bckw:                    ; zurück
 btst   #7,$bfe001       ; zurück + Feuer?
 bne.s  nfr2
 move.w mtrv(pc),d0
 cmp.w  18(a1),d0     ; Feuer -> 1000 Punkte näher ran
 blt.s  ok22
 move.w msz(pc),d0
 add.w  d0,18(a1)
ok22:
 movem.l (a7)+,d2-d3
 rts
nfr2:                    ; kein Feuer -> x-rot - 3°
 move.w rsx(pc),d0
 sub.w  d0,20(a1)
 cmp.w  20(a1),d2
 blt.s  okx1
 add.w  d1,20(a1)
okx1:
 cmp.w  20(a1),d1
 bgt.s  okx2
 sub.w  d1,20(a1)
okx2:
 movem.l (a7)+,d2-d3
 rts
forw:                    ; vorwärts
 btst   #7,$bfe001       ; vorwärts + Feuer?
 bne.s  nfr3
 move.w mtrh(pc),d0
 cmp.w  18(a1),d0   ; Feuer -> 1000 Punkte weiter weg
 bge.s  ok24
 move.w msz(pc),d0
 sub.w  d0,18(a1)
ok24:
 movem.l (a7)+,d2-d3
 rts
nfr3:                    ; kein Feuer -> x-rot + 3°
 move.w rsx(pc),d0
 add.w  d0,20(a1)
 cmp.w  20(a1),d2
 blt.s  okx3
 add.w  d1,20(a1)
okx3:
 cmp.w  20(a1),d1
 bgt.s  okx4
 sub.w  d1,20(a1)
okx4:
 movem.l (a7)+,d2-d3
 rts

Close:
 moveq  #0,d0 
 subq.w #1,LIB_OPENCNT(a6)
 bne.s  lab1
 btst   #LIBB_DELEXP,ml_Flags(a6)
 beq.s  lab1
 bsr    Expunge
lab1:
 tst.w  LIB_OPENCNT(a6)
 bne.s  .end
 movem.l d0-d1/a0-a1/a6,-(a7)
 move.l 4.w,a6
 lea    vbistruc(pc),a1
 moveq  #5,d0
 jsr    -174(a6)
 move.l intbase(pc),a1
 jsr    -414(a6)
 move.l gfxbase(pc),a1
 jsr    -414(a6)
 movem.l (a7)+,d0-d1/a0-a1/a6
.end:
 rts

Expunge:
 movem.l d2/a5-a6,-(a7)
 move.l a6,a5
 move.l ml_SysLib(a5),a6
 tst.w  LIB_OPENCNT(a5)
 beq.s  lab2
 bset   #LIBB_DELEXP,ml_Flags(a5)
 moveq  #0,d0
 bra.s  Exp_End
lab2:
 move.l ml_SegList(a5),d2
 move.l a5,a1
 jsr    -252(a6)
 move.l ml_DosLib(a5),a1
 jsr    -414(a6)
 moveq  #0,d0
 move.l a5,a1
 move.w LIB_NEGSIZE(a5),d0
 sub.l  d0,a1
 add.w  LIB_POSSIZE(a5),d0
 jsr    -210(a6)
 move.l d2,d0
Exp_End:
 movem.l (a7)+,d2/a5-a6
 rts

Nil:
 moveq  #0,d0
 rts

SetVBI:
 move.l a1,anbuf
 moveq #0,d0
 rts
anbuf:
 dc.l 0

InitVBOBs:
 movem.l d2/a2-a6,-(a7)
 move.w d0,bobdepth
 move.l a1,bobptr
 sub.l  #10,bobptr
 bsr    .loadbobs
 tst.w  d1
 bne    .endinit
 move.w d0,d3
 move.l bobptr(pc),a0
 move.w 10(a0),d0
 move.w d0,d2
 asl.w  #3,d0
 asl.w  #2,d2
 add.w  d0,d2
 ext.l  d2
 add.l  a0,d2
 move.l d2,endbob
 move.l #normsiztab,vsizptr
 cmp.l  #0,a2
 beq.s  .ok
 move.l a2,vsizptr
 move.l (a2)+,d0
 subq.w #1,d0
.mlp:
 move.l (a2),d1
 asl.l  #4,d1
 move.l d1,(a2)+
 dbf    d0,.mlp
.ok:
 move.w (a1)+,d5
 subq.w #1,d5
 move.w d5,d6
 move.l a1,a2
 move.l a1,a3
 move.l 4.w,a6
.allp:
 addq.w #1,(a3)
 moveq  #0,d0
 move.w (a3),d0
 asl.w  #1,d0
 mulu   2(a3),d0
 move.l #$10003,d1
 jsr    -198(a6)
 move.l d0,8(a3)
 beq.s  .endinit
 lea    12(a3),a3
 dbf    d5,.allp
 subq.w #1,d3
.maskloop:
 move.l 4(a2),a0
 move.w d3,d2
.mo:
 move.l 8(a2),a1
 move.w 2(a2),d4
 subq.w #1,d4
.masko:
 move.w (a2),d1
 subq.w #2,d1
.maski:
 move.w (a0)+,d0
 or.w   d0,(a1)+
 dbf    d1,.maski
 move.w #0,(a1)+
 dbf    d4,.masko
 dbf    d2,.mo
 lea    12(a2),a2
 dbf    d6,.maskloop
 movem.l (a7)+,d2/a2-a6
 moveq #0,d0
 rts
.endinit:
 movem.l (a7)+,d2/a2-a6
 moveq #-1,d0
 rts
.loadbobs:
 movem.l d0/a1-a2,-(a7)
 move.l a0,a2
.test:
 tst.b  (a0)
 beq    .endbob
 cmp.b  #"?",(a0)+
 bne.s  .test
 cmp.b  #"?",(a0)
 bne.s  .test
.endtest
 subq.l #1,a0
 move.l a0,a3
 lea    2(a1),a4
 move.w (a1),-(a7)
 moveq  #-1,d6
.lp:
 move.l 4.w,a6
 move.w (a4),d0
 asl.w  #1,d0
 mulu   2(a4),d0
 mulu   bobdepth(pc),d0
 move.l d0,d4
 move.l #$10003,d1
 jsr    -198(a6)
 move.l d0,4(a4)
 beq.s  .endbob
 move.l d0,a5
 move.l dosbase(pc),a6
 addq.w #1,d6
 move.w d6,d0
 move.w d6,d1
 divu   #10,d1
 mulu   #10,d1
 sub.w  d1,d0
 divu   #10,d1
 add.w  #$30,d1
 add.w  #$30,d0
 move.b d1,(a3)
 move.b d0,1(a3)
 move.l a2,d1
 move.w #1005,d2
 jsr    -30(a6)
 move.l d0,d5
 move.l d0,d1
 move.l a5,d2
 move.l d4,d3
 jsr    -42(a6)
 move.l d5,d1
 jsr    -36(a6)
 lea    12(a4),a4
 subq.w #1,(a7)
 bgt.s  .lp
 addq.l #2,a7
 movem.l (a7)+,d0/a1-a2
 moveq  #0,d1
 rts
.endbob
 addq.l #2,a7
 movem.l (a7)+,d0/a1-a2
 moveq  #-1,d1
 rts

bobdepth dc.w 0

FreeVBOBs:
 movem.l d3/a3/a6,-(a7)
 move.l bobptr(pc),a3
 lea    10(a3),a3
 move.w (a3)+,d3
 subq.w #1,d3
 move.l 4.w,a6
.deallp:
 moveq  #0,d0
 move.w (a3),d0
 asl.w  #1,d0
 mulu   2(a3),d0
 move.l 8(a3),a1
 subq.w #1,(a3)
 cmp.l  #0,a1
 beq.s  .notalloc1
 jsr    -210(a6)
.notalloc1
 move.w (a3),d0
 asl.w  #1,d0
 mulu   2(a3),d0
 mulu   bobdepth(pc),d0
 move.l 4(a3),a1
 cmp.l  #0,a1
 beq.s  .notalloc2
 jsr    -210(a6)
.notalloc2
 lea    12(a3),a3
 dbf    d3,.deallp
 movem.l (a7)+,d3/a3/a6
 moveq  #0,d0
 rts

OpenVScreen:
 movem.l d2-d3/a2-a3/a6,-(a7)
 lea    newscreen(pc),a3
 move.w (a1)+,(a3)
 move.w (a1)+,2(a3)
 move.w (a1)+,4(a3)
 move.w (a1)+,6(a3)
 move.w (a1),depth
 move.w (a1)+,8(a3)
 move.w (a1)+,10(a3)
 move.w (a1),flags
 move.w (a1)+,12(a3)
 move.l (a1)+,16(a3)
 move.l (a1)+,20(a3)
 move.w (a1)+,d0
 move.w (a1)+,d0
 move.w (a1)+,d0
 move.w (a1)+,d0
 move.w d0,pwidth
 subq.w #1,pwidth
 asr.w  #3,d0
 move.w d0,width
 asr.w  #1,d0
 move.w d0,wwidth
 move.w (a1)+,height
 move.w (a1)+,used
 move.l a1,-(a7)
 movem.w width(pc),d0-d1
 mulu   d0,d1
 move.l d1,d3
 move.l d1,d0
 move.l #$10003,d1
 move.l 4.w,a6
 jsr    -198(a6)
 move.l d0,tmpadr
 beq    .endinit
 mulu   depth(pc),d3
 move.l d3,d0
 move.l #$10003,d1
 jsr    -198(a6)
 move.l d0,plnh
 beq    .endinit
 move.l d3,d0
 move.l #$10003,d1
 jsr    -198(a6)
 move.l d0,plns
 beq    .endinit
 lea    bm1(pc),a0
 lea    bm2(pc),a1
 move.l a0,bms
 move.l a1,bmh
 move.w width(pc),(a0)
 move.w width(pc),(a1)
 move.w height(pc),2(a0)
 move.w height(pc),2(a1)
 move.b depth+1(pc),5(a0)
 move.b depth+1(pc),5(a1)
 move.w width(pc),d1
 mulu   height(pc),d1
 addq.l #8,a0
 addq.l #8,a1
 move.l plnh(pc),d3
 move.w used(pc),d2
 moveq  #4,d4
 btst   #2,flags
 beq.s  .nodpf
 moveq  #8,d4
.nodpf:
 subq.w #1,d2
.ulp:
 move.l d0,(a0)
 move.l d3,(a1)
 add.l  d1,d0
 add.l  d1,d3
 add.l  d4,a0
 add.l  d4,a1
 dbf    d2,.ulp
 btst   #2,flags
 beq.s  .nodpf2
 lea    bm1+12(pc),a0
 lea    bm2+12(pc),a1
.nodpf2:
 move.w depth(pc),d2
 sub.w  used(pc),d2
 beq.s  .erlp
 subq.w #1,d2
.rlp:
 move.l d0,(a0)
 move.l d0,(a1)
 add.l  d1,d0
 add.l  d4,a0
 add.l  d4,a1
 dbf    d2,.rlp
.erlp:
 lea    newscreen(pc),a0
 move.w width(pc),d0
 asl.w  #3,d0
 move.w d0,pwidth
 subq.w #1,pwidth
 move.w d0,d1
 asr.w  #1,d1
 asl.w  #4,d1
 move.w d1,midx
 move.w height,d1
 subq.w #1,d1
 move.w d1,heightm1
 addq.w #1,d1
 asr.w  #1,d1
 asl.w  #4,d1
 move.w d1,midy
 move.l (a7)+,a1
 move.l #bm1,28(a0)
 move.l intbase(pc),a6
 jsr    -198(a6)
 move.l d0,screen
 beq    .endinit
 move.l d0,a0
 move.l 80(a0),oldras
 move.l #rasinfo,80(a0)
 move.l intbase(pc),a6
 jsr    -294(a6)
 move.l d0,view
 beq    .endinit
 move.w width(pc),d0
 asr.w  #1,d0
 move.w d0,wwidth
 move.l #clrnorm,clrroutine
 move.w used(pc),d1
 mulu   height(pc),d1
 cmp.w  #1024,d1
 blt.s  .ok
 move.w d0,clrx
 move.w d1,clry
 move.l #clrbig,clrroutine
.ok:
 asl.w  #6,d1
 add.w  d1,d0
 move.w d0,clrsize
 move.w width(pc),d0
 mulu   height(pc),d0
 move.l d0,onepln
 move.l screen(pc),a0
 move.l a0,userback
 lea    44(a0),a0
 move.l a0,userback+4
 lea    40(a0),a0
 move.l a0,userback+8
 move.l userback+4(pc),a0
 move.l 8(a0),a0
 lea    20(a0),a0
 move.l a0,clist1
 move.l a0,clist2
 addq.l #4,clist2
 bsr    findcop
 move.l #userback,d0
 movem.l (a7)+,d2-d3/a2-a3/a6
 rts
.endinit:
 movem.l (a7)+,d2-d3/a2-a3/a6
 moveq  #0,d0
 rts

findcop:
 move.l clist1(pc),a0
 move.l (a0),a0
 move.l a0,a1
 moveq  #100,d0
.search:
 cmp.w  #$e0,(a0)
 beq.s  .found
 addq.l #4,a0
 dbf    d0,.search
.found:
 cmp.w  #$e2,4(a0)
 beq.s  .ok
 sub.l  a0,a0
 rts
.ok:
 addq.l #2,a0
 sub.l  a1,a0
 move.l a0,delta
 rts
 
screen     dc.l 0
width      dc.w 0
height     dc.w 0
heightm1   dc.w 0
depth      dc.w 0
used       dc.w 0
flags      dc.w 0
view       dc.l 0
bmh        dc.l 0
bms        dc.l 0
clrsize    dc.w 0
wwidth     dc.w 0
pwidth     dc.w 0
midx       dc.w 0
midy       dc.w 0
userback   dc.l 0,0,0
onepln     dc.l 0
clrroutine dc.l 0
clrx       dc.w 0
clry       dc.w 0
clist1     dc.l 0
clist2     dc.l 0
delta      dc.l 0
oldras     dc.l 0

bm1:
 dc.w 0,0,0,0
 dc.l 0,0,0,0,0,0,0,0,0

bm2:
 dc.w 0,0,0,0
 dc.l 0,0,0,0,0,0,0,0,0

rasinfo:
 dc.l 0
 dc.l bm1
 dc.w 0,0

newscreen:
 dc.w 0,0, 0,0, 0
 dc.b 0,0
 dc.w 0,$4f
 dc.l 0
 dc.l 0
 dc.l 0
 dc.l 0

rp2:
 dcb.b 100

CloseVScreen:
 movem.l d2-d7/a2-a6,-(a7)
 move.l intbase(pc),a6
 move.l screen(pc),a0
 move.l oldras(pc),80(a0)
 jsr    -66(a6)
 move.l 4.w,a6
 move.w width(pc),d3
 mulu   height(pc),d3
 move.l tmpadr,a1
 move.l d3,d0
 jsr    -210(a6)
 mulu   depth(pc),d3
 move.l plnh,a1
 move.l d3,d0
 jsr    -210(a6)
 move.l plns,a1
 move.l d3,d0
 jsr    -210(a6)
 movem.l (a7)+,d2-d7/a2-a6
 moveq  #0,d0
 rts
.endinit:
 movem.l (a7)+,d2-d7/a2-a6
 moveq  #-1,d0
 rts
 
DoAnim:
 movem.l d2-d7/a2-a6,-(a7)
 move.w (a1)+,objflg
 move.l #dline,linrout
 btst   #0,objflg+1
 beq.s  .ok
 move.l #oline,linrout
.ok:
 move.l a1,strptr
 bsr    allocstrucs
 bne    endanimerr
 move.l strptr(pc),a1
 move.l rootptr(pc),a2
 move.w (a1)+,d0
 subq.w #1,d0
.lp:
 move.l (a1)+,a0
 cmp.l  #nilobj,a0
 beq    endanimerrm2
 move.l 8(a0),a3
 lea    -14(a3),a3
 move.l a3,4(a2)
 move.w #0,8(a2)
 lea    18(a2),a2
 dbf    d0,.lp
 bsr    move
 move.l #move,jptab
 move.l anbuf(pc),anadr
 move.l strptr(pc),d0
 add.l  d0,offset
 move.l joybuf(pc),joyadr
vcloop:
 move.w #0,vbi
.wvbi:
 tst.w  vbi
 beq.s  .wvbi
 move.l clrroutine(pc),a0
 jsr    (a0)
 move.l zorgptr(pc),ztabptr
 move.l dtorgptr(pc),dttabptr
 move.w #-1,drawnum
 move.l rootptr(pc),a2
 move.l (a2),tmom
 move.l strptr(pc),a1
 move.w (a1)+,d0
 subq.w #1,d0
.ok:
 move.l (a1)+,a0
 cmp.l  #nilobj,a0
 beq.s  .nocalc
 movem.l d0/a1-a2,-(a7)
 move.l (a0)+,pdptr
 move.l (a0)+,atabptr
 lea    addx(pc),a1
 addq.l #6,a0
 movem.w (a0),d0-d5
 add.w  d3,d3
 bge.s  .ok1
 add.w  #720,d3
.ok1:
 add.w  d4,d4
 bge.s  .ok2
 add.w  #720,d4
.ok2:
 add.w  d5,d5
 bge.s  .ok3
 add.w  #720,d5
.ok3:
 ext.l d0
 asl.l #4,d0
 ext.l d1
 asl.l #4,d1
 ext.l d2
 asl.l #4,d2
 movem.l d0-d2,(a1)
 lea   12(a1),a1
 movem.w d3-d5,(a1)
 bsr    vector1
 movem.l (a7)+,d0/a1-a2
.nocalc:
 lea    18(a2),a2
 move.l (a2),tmom
 dbf    d0,.ok
 bsr    vector2
 move.l strptr(pc),a1
 move.w (a1),d2
 subq.w #1,d2
 move.l rootptr(pc),a3
endlp:
 tst.w  16(a3)
 beq    vcloop
 lea    18(a3),a3
 dbf    d2,endlp
endanim
 move.w #0,vbi
.wvbi2:
 tst.w  vbi
 beq.s  .wvbi2
 move.l #0,jptab
 move.l #0,anadr
 move.l #0,joyadr
 bsr    deallocstrucs
 movem.l (a7)+,d2-d7/a2-a6
 moveq  #0,d0
 rts
endanimerr:
 bsr    deallocstrucs
 movem.l (a7)+,d2-d7/a2-a6
 moveq  #-1,d0
 rts
endanimerrm2:
 bsr    deallocstrucs
 movem.l (a7)+,d2-d7/a2-a6
 moveq  #-2,d0
 rts
allocstrucs:
 move.l 4.w,a6
 move.l a1,a2
 move.w (a2)+,d7
 move.w d7,d0
 mulu   #18,d0
 move.l #$10001,d1
 jsr    -198(a6)
 move.l d0,rootptr
 beq    .enderr
 move.l d0,a3
 move.w d7,d2
 moveq  #0,d6
 moveq  #0,d3
 subq.w #1,d2
.lp:
 move.l (a2)+,a1
 move.l (a1)+,a0
 move.w (a0),d0
 cmp.w  d0,d3
 bge.s  .ok
 move.w d0,d3
.ok:
 move.l (a1),a0
 add.w  (a0),d6
 mulu   #4,d0
 move.l #$10001,d1
 jsr    -198(a6)
 move.l d0,(a3)
 beq.s  .enderr
 move.w #-1,14(a3)
 lea    18(a3),a3
 dbf    d2,.lp
 move.w d3,d0
 mulu   #4,d0
 move.l #$10001,d1
 jsr    -198(a6)
 move.l d0,z2orgptr
 beq.s  .enderr
 move.w d6,d0
 mulu   #4,d0
 move.l #$10001,d1
 jsr    -198(a6)
 move.l d0,lrtabptr
 beq.s  .enderr
 move.w d6,d0
 mulu   #14,d0
 move.l #$10001,d1
 jsr    -198(a6)
 move.l d0,dtorgptr
 beq.s  .enderr
 move.w d6,d0
 mulu   #4,d0
 move.l #$10001,d1
 jsr    -198(a6)
 move.l d0,zorgptr
 beq.s  .enderr
 moveq  #0,d0
 rts
.enderr:
 moveq  #-1,d0
 rts
deallocstrucs:
 move.l 4.w,a6
 move.l strptr(pc),a1
 move.l a1,a2
 move.w (a2)+,d7
 move.l rootptr(pc),a3
 move.w d7,d2
 moveq  #0,d6
 moveq  #0,d3
 subq.w #1,d2
.lp:
 move.l (a2)+,a1
 move.l (a1)+,a0
 move.w (a0),d0
 cmp.w  d0,d3
 bge.s  .ok
 move.w d0,d3
.ok:
 move.l (a1),a0
 add.w  (a0),d6
 mulu   #4,d0
 move.l (a3),a1
 jsr    -210(a6)
 lea    18(a3),a3
 dbf    d2,.lp
 move.w d3,d0
 mulu   #4,d0
 move.l z2orgptr(pc),a1
 jsr    -210(a6)
 move.w d7,d0
 mulu   #18,d0
 move.l rootptr(pc),a1
 jsr    -210(a6)
 move.w d6,d0
 mulu   #4,d0
 move.l lrtabptr(pc),a1
 jsr    -210(a6)
 move.w d6,d0
 mulu   #14,d0
 move.l dtorgptr(pc),a1
 jsr    -210(a6)
 move.w d6,d0
 mulu   #4,d0
 move.l zorgptr(pc),a1
 jsr    -210(a6)
 rts
 

clrnorm:
 move.l gfxbase(pc),a6
 jsr    -456(a6)
 move.l chipbase(pc),a6
 wblt          
 moveq  #-1,d0
 move.l d0,$44(a6)
 move.w #0,$66(a6)
 move.l #$1000000,$40(a6)  ; Trotz voller Priorität des Blitters
 move.l plnh(pc),$54(a6)         ; kaum Einschränkung des 68000, da
 move.w clrsize(pc),$58(a6) ; nur DMA-Kanal D genutzt wird!
 move.l gfxbase(pc),a6
 jsr    -462(a6)
 rts

clrbig:
 move.l gfxbase(pc),a6
 jsr    -456(a6)
 move.l chipbase(pc),a6
 wblt  
 moveq  #-1,d0
 move.l d0,$44(a6)
 move.w #0,$66(a6)  
 move.l #$1000000,$40(a6)  ; Trotz voller Priorität des Blitters
 move.l plnh(pc),$54(a6)         ; kaum Einschränkung des 68000, da
 move.w clry(pc),$5c(a6)
 move.w clrx(pc),$5e(a6) ; nur DMA-Kanal D genutzt wird!
 move.l gfxbase(pc),a6
 jsr    -462(a6)
 rts

drawb:
 move.l bobptr(pc),a0
 move.w 10(a0),d1
 move.l (a5)+,d5
 move.w (a5)+,d6
 move.l endbob(pc),d2
eigenlp:
 lea    12(a0),a0
 cmp.l  a0,d2
 beq.s  ok
 dbf    d6,eigenlp
 move.l vsizptr(pc),a1
 subq.w #1,d1
sizelp:
 move.l (a1)+,d0
 cmp.l  d5,d0
 ble.s  ok
 lea    12(a0),a0
 cmp.l  a0,d2
 beq.s  ok
 dbf    d1,sizelp
ok:
 move.w (a0),d5            ; Ball-Breite in Worten
 move.w 2(a0),d6           ; Ball-Höhe in Pixel (= Ball-Breite)
 movem.l 4(a0),a0-a1
 move.w d6,d2
 asr.w  #1,d2
 sub.w  d2,d3              ; angegebene Ball-Koordinaten in d3/d4 von
 sub.w  d2,d4              ; "oben rechts" in die Ball-Mitte schieben
 move.w d3,d2
 and.w  #15,d3
 sub.w  d3,d2
 ror.w  #4,d3
 movem.l a0-a1,-(a7)
 move.l gfxbase(pc),a6
 jsr    -456(a6)
 move.l chipbase(pc),a6
 movem.l (a7)+,a0-a1
 asr.w  #4,d2
 blt    nodraw
 move.w d2,d0
 add.w  d5,d0
 cmp.w  wwidth(pc),d0
 bgt    nodraw
 tst.w  d4
 blt    nodraw
 move.w d4,d0
 add.w  d6,d0
 cmp.w  height(pc),d0
 bge    nodraw
 asl.w  #1,d2
 mulu   width(pc),d4
 add.w  d2,d4
 add.l  plnh(pc),d4
 move.w d6,d2              ; Blitter-Fenster berechnen
 asl.w  #6,d2
 add.w  d5,d2
 move.w width(pc),d0             ; Modulo berechnen
 asl.w  #1,d5
 sub.w  d5,d0
 wblt
 move.l #$0000fffe,$62(a6)
 move.l #$ffff0000,$44(a6)
 move.w d0,$60(a6)
 move.w d0,$66(a6)
 move.l #$0fc20000,d0      ; A-Shift u. B-Shift für Reg. $40/42
 or.w   d3,d0
 swap   d0
 or.w   d3,d0
 swap   d0
 move.l d0,$40(a6)
 move.l a0,$50(a6)
 move.l d4,a0              ; Startadressen ausrechnen
 move.w used(pc),d1        ; Blit-Schleife für 3 Planes
 subq.w #1,d1
blitlp:
 wblt
 move.l a0,$48(a6)
 move.l a1,$4c(a6)
 move.l a0,$54(a6)
 move.w d2,$58(a6)
 add.l  onepln(pc),a0
 dbf    d1,blitlp
nodraw:
 rts

quicksort:                 ; üblicher Quicksort-Algorithmus
 moveq  #0,d4
 move.l zorgptr(pc),d5
 move.l lrtabptr(pc),a0
 move.l dtorgptr(pc),a1
 move.l d5,0(a0,d4.w)
 move.l zend(pc),a5
 move.l a5,4(a0,d4.w)
l20:
 move.l 0(a0,d4.w),d5
 move.l 4(a0,d4.w),a5
 subq.w #8,d4
l30:
 move.l d5,a2
 move.l a5,a3
 move.l a2,d1
 sub.l  zorgptr(pc),d1
 move.w d1,d3
 add.w  d1,d1
 add.w  d3,d1
 asr.w  #1,d3
 add.w  d3,d1
 move.l a3,d2
 sub.l  zorgptr(pc),d2
 move.w d2,d3
 add.w  d2,d2
 add.w  d3,d2
 asr.w  #1,d3
 add.w  d3,d2
 move.l d5,d0
 add.l  a5,d0
 asr.l  #3,d0
 asl.l  #2,d0
 move.l d0,a6
 move.l (a6),d3
l40:
 cmp.l  (a2),d3
 ble.s  l41
 addq.l #4,a2
 add.w  #14,d1
 bra.s  l40
l41:
 cmp.l  (a3),d3
 bge.s  l42
 subq.l #4,a3
 sub.w  #14,d2
 bra.s  l41
l42:
 cmp.l  a3,a2
 bgt.s  l50
 move.l (a3),d0
 move.l (a2),(a3)
 move.l d0,(a2)
 exg.l  d0,d5
 movem.l 0(a1,d1.w),d5-d7
 move.l 0(a1,d2.w),0(a1,d1.w)
 move.l 4(a1,d2.w),4(a1,d1.w)
 move.l 8(a1,d2.w),8(a1,d1.w)
 movem.l d5-d7,0(a1,d2.w)
 move.w 12(a1,d1.w),d5
 move.w 12(a1,d2.w),12(a1,d1.w)
 move.w d5,12(a1,d2.w)
 exg.l  d0,d5
 addq.l #4,a2
 subq.l #4,a3
 add.w  #14,d1
 sub.w  #14,d2
 cmp.l  a3,a2
 ble.s  l40
l50:
 cmp.l  a5,a2
 blt.s  l52
l51:
 move.l a3,a5
 cmp.l  a5,d5
 blt    l30
 tst.w  d4
 bge    l20
 rts
l52:
 addq.w #8,d4
 move.l a2,0(a0,d4.w)
 move.l a5,4(a0,d4.w)
 bra.s  l51



vector1:
 bsr    transform     ; Rotation + 3D-Projektion
 btst   #0,objflg+1
 bne.s  .wire
 bsr    backs
 rts
.wire:
 bsr    wrbacks
 rts
vector2:
 tst.w  drawnum        ; keine Fläche zu sehen?
 blt    end           ; dann raus
 bsr    quicksort     ; klar
 move.l dtorgptr(pc),a5   ; Sortierte Nummern der zu verbleibenden Flächen
 move.w drawnum(pc),d7
lp:
 move.l (a5)+,a3       ; Flächen-Info-Adresse holen, da Infos jeder Fläche 22 Bytes lang ist
 move.l 6(a5),a2
vp4:
 move.l linrout(pc),liner
 move.w (a3)+,d5       ; Eckenzahl holen
 blt    vballd
 bne.s  nolin
 move.l #oline,liner
 moveq  #1,d5
nolin:
 lea    10(a5),a5
 subq.w #1,d5
 move.w (a3)+,-(a7)    ; Farbe auf Stägg
 moveq  #-1,d0
 lea    hix(pc),a1
 move.w #640,2(a1)       ; Ausmaße für Füll- und Kopier-Fenster reseten
 move.w d0,(a1)
 move.w #640,6(a1)
 move.w d0,4(a1)
 move.w #0,line
 lea    scx1(pc),a4
 move.l d0,(a4)
 move.l d0,4(a4)
 move.l a1,-(a7)
 move.l gfxbase(pc),a6
 jsr    -456(a6)
 move.l chipbase(pc),a6
 move.l (a7)+,a1
.lnlp:
 move.w (a3)+,d6       ; Eckpunkt holen
 movem.w (a2,d6),d0-d1 ; 2D-Punkt-Koordinaten aus ttab
 move.w (a3),d6
 movem.w (a2,d6),d2-d3
 asr.w  #4,d0
 asr.w  #4,d1
 asr.w  #4,d2
 asr.w  #4,d3
 bsr    drawl           ; klar ...
 dbf    d5,.lnlp
 cmp.l  #dline,liner
 bne.s  nodr
 tst.w  scx1
 blt.s  noclip
 tst.w  scx2
 blt.s  noclip
 lea    scx1(pc),a4
 movem.w (a4),d0-d3
 bsr.s  drawl          ; zeichnen
noclip:               ; kein Rechter Rand
 tst.w  line
 beq.s  nodr
 bsr    csize          ; erhaltene Füll-/Copy-Fenster Maße umrechnen
 move.w (a7),d4        ; Farbe holen
 bsr    copy           ; Füllen, Copy, Fenster löschen
nodr:
 addq.l #2,a7         ; Farbe holen
vok:
 move.l gfxbase(pc),a6
 jsr    -462(a6)
 dbf    d7,lp         ; alle Flächen?
end
 move.l chipbase(pc),a6
 rts
vballd:
 move.w 2(a3),d6
 movem.w (a2,d6),d3-d4
 asr.w  #4,d3
 asr.w  #4,d4
 bsr    drawb
 addq.l #4,a5
 bra.s  vok
 
drawl:                      ; Linie clippen + zeichnen
 movem.l d4-d7/a5-a6,-(a7)
 cmp.w  d1,d3
 bge.s  .ec
 exg.l  d0,d2
 exg.l  d1,d3
.ec
 cmp.w  6(a1),d1             ; hiy,loy,hix,lox für Window-Maße
 bge.s  .lyk
 move.w d1,6(a1)
.lyk:
 cmp.w  4(a1),d3             ; hiy,loy,hix,lox für Window-Maße
 ble.s  .hyk
 move.w d3,4(a1)
.hyk:
 move.w d0,d4
 move.w d2,d5
 cmp.w  d4,d5
 bge.s  .ok
 exg.l  d4,d5
.ok
 cmp.w  2(a1),d4             ; hiy,loy,hix,lox für Window-Maße
 bge.s  .lxk0
 move.w d4,2(a1)
.lxk0:
 cmp.w  (a1),d5             ; hiy,loy,hix,lox für Window-Maße
 ble.s  chky
 move.w d5,(a1)

chky:                      ; Clipping, rechts zuerst
 move.w pwidth(pc),d6
 cmp.w  d6,d0              ; p1 rechts von rechter Kante
 bgt.s  ctx21
 cmp.w  d6,d2              ; p2 rechts von rechter Kante
 bgt.s  ctx22
 moveq  #0,d6
 tst.w  d1
 bmi.s  cty11              ; p1 über Oberkante ?
 tst.w  d3
 bmi.s  cty12              ; p2 über Oberkante ?
 move.w heightm1(pc),d6
 cmp.w  d6,d1              ; p1 unter Unterkante ?
 bgt.s  cty21
 cmp.w  d6,d3              ; p2 unter Unterkante ?
 bgt.s  cty22
chkx:
 moveq  #0,d6
 tst.w  d0                 ; p1 links von linker Kante ?
 bmi.s  ctx11
 tst.w  d2                 ; p2 links von linker Kante ?
 bmi.s  ctx12
 move.l liner(pc),a0
 jmp    (a0)
cty11:                     ; Clip Oberkante
 tst.w  d3                 ; auch p2 über Oberkante (-> Line
 bmi.s  clpend             ; unsichtbar) ?
 bsr.s  clipy
 move.w d4,d0              ; berechnete x-Koordinate
 moveq  #0,d1              ; y logischerweise = 0
 bra.s  chky
cty12:
 bsr.s  clipy              ; s.o.
 move.w d4,d2
 moveq  #0,d3
 bra.s  chky
cty21:                     ; Clip Unterkante
 cmp.w  d6,d3              ; auch p2 unter Unterkante ?
 bgt.s  clpend
 bsr.s  clipy
 move.w d4,d0              ; berechnete x-Koordinate
 move.w d6,d1              ; y=255
 bra.s  chky
cty22:
 bsr.s  clipy              ; s.o.
 move.w d4,d2
 move.w d6,d3
 bra.s  chky
ctx11:                     ; Clip linke Kante
 tst.w  d2                 ; auch p2 links von
 bmi.s  clpend             ; linker Kante ?
 bsr.s  clipx
 move.w d4,d1              ; berechnete y-Koordinate
 moveq  #0,d0              ; x logischerweise = 0
 bra.s  chky               ; noch einmal überprüfen
ctx12:                     ; s.o.
 bsr.s  clipx
 move.w d4,d3
 moveq  #0,d2
 bra.s  chky               ; noch einmal überprüfen
ctx21:                     ; Clip rechte Kante
 cmp.w  d6,d2              ; auch p2 rechts davon ?
 bgt.s  clpend
 bsr.s  clipx
 move.w d4,d1              ; berechnete y-Koordinate
 move.w d6,d0              ; x=319
 cmp.l  #endsc,a4
 beq.s  .ok
 movem.w d0-1,(a4)
 addq.l #4,a4
.ok:
 bra    chky               ; noch einmal überprüfen
ctx22:                     ; s.o.
 bsr.s  clipx
 move.w d4,d3
 move.w d6,d2
 cmp.l  #endsc,a4
 beq.s  .ok
 movem.w d2-3,(a4)
 addq.l #4,a4
.ok:
 bra    chky               ; noch einmal überprüfen
clpend:
 movem.l (a7)+,d4-d7/a5-a6
 rts
clipy:                     ; y-Koord. bekannt, x berechnen
 move.w d0,d4
 sub.w  d2,d4
 move.w d3,d5
 move.w d3,d7
 sub.w  d6,d7
 muls   d7,d4              ; d4=(x2-x1) * (y bek. - y2)
 sub.w  d1,d5
 divs   d5,d4              ; d4=d4 / (y2-y1)
 add.w  d2,d4              ; d4=d4 + y2
 rts
clipx:                     ; x-Koordinate bek., y berechnen
 move.w d1,d4
 sub.w  d3,d4
 move.w d2,d5
 move.w d2,d7
 sub.w  d6,d7
 muls   d7,d4              ; d4=(y2-y1) * (x bek. -x2)
 sub.w  d0,d5
 divs   d5,d4              ; d4=d4 / (x2-x1)
 add.w  d3,d4              ; d4=d4 + y2
 rts

dline:                  ; hier wird gezeichnet
 cmp.w  d1,d3
 beq    drawend
 move.w d1,d5         ; übliche Linien-Sache
 mulu   width(pc),d5
 move.l tmpadr(pc),a5
 add.l  d5,a5
 move.w d0,d4
 asr.w  #4,d4
 add.w  d4,d4
 lea    0(a5,d4.w),a5
 sub.w  d0,d2
 sub.w  d1,d3
 moveq  #15,d5
 and.l  d5,d0
 move.w d0,d4
 ror.l  #4,d0
 eor.w  d5,d4
 moveq  #0,d5
 bset   d4,d5
 move.w #4,d0
 tst.w  d2
 bpl.s  .l1
 addq.w #1,d0
 neg.w  d2
.l1:
 cmp.w  d2,d3
 ble.s  .l2
 exg.l  d2,d3
 subq.w #4,d0
 add.w  d0,d0
.l2:
 move.w d3,d4
 sub.w  d2,d4
 add.w  d4,d4
 add.w  d4,d4
 add.w  d3,d3
 moveq  #0,d6
 move.w d3,d6
 sub.w  d2,d6
 bpl.s  .l3
 or.w   #16,d0
.l3:
 add.w  d3,d3
 add.w  d0,d0
 add.w  d0,d0
 addq.w #1,d2
 asl.w  #6,d2
 addq.w #2,d2
 swap   d3
 move.w d4,d3
 or.l   #$b4a0003,d0
 move.w width(pc),d1
 wblt
 move.w d1,$60(a6)
 move.w d1,$66(a6)
 moveq  #-1,d1
 move.l d1,$44(a6)
 move.w d1,$72(a6)
 move.w #$8000,$74(a6)
 move.l d3,$62(a6)
 eor.w  d5,(a5)
 move.l a5,$48(a6)
 move.l a5,$54(a6)
 move.w d6,$52(a6)
 move.l d0,$40(a6)
 move.w d2,$58(a6)
 addq.w #1,line
drawend:
 movem.l (a7)+,d4-d7/a5-a6
 rts

oline:                  ; hier wird gezeichnet
 move.w d1,d5         ; übliche Linien-Sache
 mulu   width(pc),d5
 move.l plnh(pc),a5
 add.l  d5,a5
 move.w d0,d4
 asr.w  #4,d4
 add.w  d4,d4
 lea    0(a5,d4.w),a5
 sub.w  d0,d2
 sub.w  d1,d3
 moveq  #15,d5
 and.l  d5,d0
 ror.l  #4,d0
 move.w #4,d0
 tst.w  d2
 bpl.s  .l1
 addq.w #1,d0
 neg.w  d2
.l1:
 cmp.w  d2,d3
 ble.s  .l2
 exg.l  d2,d3
 subq.w #4,d0
 add.w  d0,d0
.l2:
 move.w d3,d4
 sub.w  d2,d4
 add.w  d4,d4
 add.w  d4,d4
 add.w  d3,d3
 moveq  #0,d6
 move.w d3,d6
 sub.w  d2,d6
 bpl.s  .l3
 or.w   #16,d0
.l3:
 add.w  d3,d3
 add.w  d0,d0
 add.w  d0,d0
 addq.w #1,d2
 asl.w  #6,d2
 addq.w #2,d2
 swap   d3
 move.w d4,d3
 or.l   #$bca0001,d0
 move.w width(pc),d1
 wblt
 move.w d1,$60(a6)
 move.w d1,$66(a6)
 moveq  #-1,d1
 move.l d1,$44(a6)
 move.w d1,$72(a6)
 move.w #$8000,$74(a6)
 move.l d3,$62(a6)
 move.w 28(a7),d1
 moveq  #0,d3
.lp:
 btst   d3,d1
 bne.s  .ok
 and.l  #$ff0fffff,d0
.ok:
 wblt
 move.l a5,$48(a6)
 move.l a5,$54(a6)
 move.w d6,$52(a6)
 move.l d0,$40(a6)
 move.w d2,$58(a6)
 or.l   #$00c00000,d0
 add.l  onepln(pc),a5
 addq.w #1,d3
 cmp.w  used(pc),d3
 blt.s  .lp
 addq.w #1,line
 movem.l (a7)+,d4-d7/a5-a6
 rts



csize:           ; Window-Maße in Adressen u. Modulo umrechnen
 move.w pwidth(pc),d0
 cmp.w  (a1),d0
 bge.s  .ok1
 move.w d0,(a1)
.ok1:
 tst.w  2(a1)
 bge.s  .ok2
 move.w #0,2(a1)
.ok2:
 move.w heightm1(pc),d0
 cmp.w  4(a1),d0
 bge.s  .ok3
 move.w d0,4(a1)
.ok3:
 tst.w  6(a1)
 bge.s  .ok4
 move.w #0,6(a1)
.ok4:
 move.w (a1),d0
 asr.w  #4,d0
 asl.w  #1,d0
 move.w d0,woffx
 asr.w  #1,d0
 move.w 2(a1),d1
 asr.w  #4,d1
 sub.w  d1,d0
 addq.w #1,d0
 move.w d0,wsizex
 asl.w  #1,d0
 move.w width(pc),d1
 sub.w  d0,d1
 move.w d1,tmpmod
 move.w 4(a1),d0
 sub.w  6(a1),d0
 addq.w #1,d0
 move.w d0,wsizey
 move.w 4(a1),d0
 mulu   width(pc),d0
 move.w d0,woffy
 rts
 

transform:              ; Transformation
 move.l pdptr(pc),a2     ; 3D-Eckpunt-Daten
 move.l tmom(pc),a3     ; Platz für 2D-Daten
 lea    sintab(pc),a0
 lea    costab(pc),a1
 move.l z2orgptr(pc),a4    ; Tabelle für 3D-Z-Koords der Punkte
 move.w (a2)+,d5
 subq.w #1,d5
.lp:
 movem.w (a2)+,d0-d2
 moveq  #4,d4
 asl.w  d4,d0
 asl.w  d4,d1
 asl.w  d4,d2
 move.w rx(pc),d3
 move.w d1,d4
 move.w d2,d7
 muls   0(a1,d3.w),d1       ; neu_y=y*cos(al)
 muls   0(a0,d3.w),d2       ; neu_z=z*sin(al)
 sub.l  d2,d1               ; fertig_y=neu_y-neu_z
 add.l  d1,d1
 swap   d1
 muls   0(a0,d3.w),d4          ; neu_y=y*sin(al)
 muls   0(a1,d3.w),d7          ; neu_z=z*cos(al)
 add.l  d7,d4               ; fertig_z=neu_y-neu_z
 add.l  d4,d4
 swap   d4
 move.w d4,d2               ; d2=z

 move.w ry(pc),d3
 move.w d0,d4
 move.w d2,d7
 muls   0(a1,d3.w),d0          ; nx=x*cos(be)
 muls   0(a0,d3.w),d2          ; nz=z*sin(be)
 add.l  d2,d0               ; fx=nx+nz
 add.l  d0,d0
 swap   d0
 neg.w  d4                  ; d4=-x
 muls   0(a0,d3.w),d4          ; nx=-x*sin(be)
 muls   0(a1,d3.w),d7          ; ny=y*cos(be)
 add.l  d7,d4               ; fz=nx+ny
 add.l  d4,d4
 swap   d4
 move.w d4,d2

 move.w rz(pc),d3
 move.w d0,d4
 move.w d1,d7
 muls   0(a1,d3.w),d0          ; nx=x*cos(ga)
 muls   0(a0,d3.w),d1          ; ny=y*sin(ga)
 sub.l  d1,d0                  ; fx=nx-ny
 add.l  d0,d0
 swap   d0
 muls   0(a0,d3.w),d4          ; nx=x*sin(ga)
 muls   0(a1,d3.w),d7          ; ny=y*cos(ga)
 add.l  d7,d4               ; fy=nx+ny
 add.l  d4,d4
 swap   d4
 move.w d4,d1       ; *************

 move.w d2,(a4)+    ; 3D-Z von Punkten nach z2tab
 ext.l  d0
 ext.l  d1
 ext.l  d2
 add.l  addx(pc),d0
 add.l  addy(pc),d1
 add.l  addz(pc),d2
 moveq  #10,d3
 asl.l  d3,d0
 asl.l  d3,d1
 asr.l  #3,d2
 beq.s  .pjtend
 divs   d2,d0
 divs   d2,d1
 neg.w  d0
 move.w xscale(pc),d2
 asl.w  d2,d0
 move.w yscale(pc),d2
 asl.w  d2,d1
 add.w  midx(pc),d0            ; Zentrieren
 add.w  midy(pc),d1
.pjtend:
 movem.w d0-d1,(a3)
 move.w (a2)+,(a4)+
 addq.l #4,a3
 dbf    d5,.lp
 rts

backs:               ; Promax
 move.l atabptr(pc),a2
 move.l tmom(pc),a3
 move.l z2orgptr(pc),a1
 move.l ztabptr(pc),a0
 move.l dttabptr(pc),a4
 move.w (a2)+,d7
 subq.w #1,d7
lpb:
 tst.w  (a2)
 blt    vballb
 beq    olinb
vp3:
 move.w 4(a2),d5
 movem.w 0(a3,d5.w),d0-d1
 move.w 6(a2),d5
 movem.w 0(a3,d5.w),d2-d3
 move.w 8(a2),d5
 movem.w 0(a3,d5.w),d4-d5
 sub.w  d0,d2
 sub.w  d1,d3
 sub.w  d0,d4
 sub.w  d1,d5
 muls   d2,d5
 muls   d3,d4
 sub.l  d4,d5
 bmi.s  notvisib               
visib:
 move.w (a2),d6    ; von gültiger Fläche Z's aus z2tab addieren,
 subq.w #1,d6      ; Durchschnitt berechnen und nach ztab -> Quicksort
 moveq  #4,d5
 moveq  #0,d1
.slp:
 move.w (a2,d5),d0
 add.w  (a1,d0),d1
 addq.w #2,d5
 dbf    d6,.slp
 addq.w #1,drawnum
 ext.l  d1
 divs   (a2),d1
 ext.l  d1
 add.l  addz(pc),d1
 move.l d1,(a0)+
 move.l a2,(a4)+
 addq.l #6,a4
 move.l a3,(a4)+
notvisib:
 lea    22(a2),a2
 dbf    d7,lpb     ; alle Flächen
 move.l a0,ztabptr
 move.l a4,dttabptr
 subq.l #4,a0
 move.l a0,zend    ; Ende von ztab (für Quicksort)
 rts
vballb:
 move.w 4(a2),d0
 movem.w (a1,d0),d0-d1
 move.l a2,(a4)+
 ext.l  d0
 add.l  addz(pc),d0
 move.l d0,(a0)+
 move.l d0,(a4)+
 move.w d1,(a4)+
 move.l a3,(a4)+
 addq.w #1,drawnum
 bra.s  notvisib
olinb:
 move.w 4(a2),d0
 move.w (a1,d0),d1
 move.w 6(a2),d0
 add.w  (a1,d0),d1
 asr.w  #1,d1
 ext.l  d1
 add.l  addz(pc),d1
 move.l d1,(a0)+
 move.l a2,(a4)+
 addq.l #6,a4
 move.l a3,(a4)+
 addq.w #1,drawnum
 bra    notvisib
wrbacks:
 move.l atabptr(pc),a2
 move.l tmom(pc),a3
 move.l z2orgptr(pc),a1
 move.l ztabptr(pc),a0
 move.l dttabptr(pc),a4
 move.w (a2)+,d7
 subq.w #1,d7
.lpb:
 tst.w  (a2)
 blt    vballb
 beq    olinb
.vp3:
 move.w (a2),d6    ; von gültiger Fläche Z's aus z2tab addieren,
 subq.w #1,d6      ; Durchschnitt berechnen und nach ztab -> Quicksort
 moveq  #4,d5
 moveq  #0,d1
.slp:
 move.w (a2,d5),d0
 add.w  (a1,d0),d1
 addq.w #2,d5
 dbf    d6,.slp
 addq.w #1,drawnum
 ext.l  d1
 divs   (a2),d1
 ext.l  d1
 add.l  addz(pc),d1
 move.l d1,(a0)+
 move.l a2,(a4)+
 addq.l #6,a4
 move.l a3,(a4)+
 lea    22(a2),a2
 dbf    d7,.lpb     ; alle Flächen
 move.l a0,ztabptr
 move.l a4,dttabptr
 subq.l #4,a0
 move.l a0,zend    ; Ende von ztab (für Quicksort)
 rts

copy:              ; klar
 move.l tmpadr(pc),a0
 move.l plnh(pc),a1
 moveq  #0,d2
 move.w woffx(pc),d2
 add.w  woffy(pc),d2
 add.l  d2,a0
 add.l  d2,a1
 move.w wsizey(pc),d2
 asl.w  #6,d2
 add.w  wsizex(pc),d2
 move.w tmpmod(pc),d0
 moveq  #-1,d1
 wblt
 move.w d0,$62(a6)
 move.w d0,$64(a6)
 move.w d0,$66(a6)
 move.l d1,$44(a6)
 move.l a0,$50(a6)
 move.l a0,$54(a6)
 move.l #$9f00012,$40(a6)
 move.w d2,$58(a6)        ; Füllen
 move.l #$dfc0002,d1
 moveq  #0,d0
 move.l #$f00000,d3
.loop:
 btst   d0,d4
 bne.s  .ok
 sub.l  d3,d1
.ok:
 wblt
 move.l d1,$40(a6)
 move.l a0,$50(a6)
 move.l a1,$4c(a6)
 move.l a1,$54(a6)
 move.w d2,$58(a6)     ; nach Farb-Werten kopieren
 or.l   d3,d1
 add.l  onepln(pc),a1
 addq.w #1,d0
 cmp.w  used(pc),d0
 blt.s  .loop
 wblt
 move.l #$1000002,$40(a6)
 move.l a0,$54(a6)
 move.w d2,$58(a6)   ; Window löschen
 rts

RotateX:
 movem.l d5/d7,-(a7)
 asl.w  #1,d6
 bge.s  .ok
 add.w  #720,d6
.ok:
 sub.w  d3,d0
 sub.w  d4,d1
 sub.w  d5,d2
 lea    sintab(pc),a0
 lea    costab(pc),a1
 move.w d1,d5
 move.w d2,d7
 muls   0(a1,d6.w),d1       ; neu_y=y*cos(al)
 muls   0(a0,d6.w),d2       ; neu_z=z*sin(al)
 sub.l  d2,d1               ; fertig_y=neu_y-neu_z
 add.l  d1,d1
 swap   d1
 muls   0(a0,d6.w),d5          ; neu_y=y*sin(al)
 muls   0(a1,d6.w),d7          ; neu_z=z*cos(al)
 add.l  d7,d5               ; fertig_z=neu_y-neu_z
 add.l  d5,d5
 swap   d5
 move.w d5,d2               ; d2=z
 movem.l (a7)+,d5/d7
 add.w  d3,d0
 add.w  d4,d1
 add.w  d5,d2
 rts

RotateY: 
 movem.l d5/d7,-(a7)
 asl.w  #1,d6
 bge.s  .ok
 add.w  #720,d6
.ok:
 sub.w  d3,d0
 sub.w  d4,d1
 sub.w  d5,d2
 lea    sintab(pc),a0
 lea    costab(pc),a1
 move.w d0,d5
 move.w d2,d7
 muls   0(a1,d6.w),d0          ; nx=x*cos(be)
 muls   0(a0,d6.w),d2          ; nz=z*sin(be)
 add.l  d2,d0               ; fx=nx+nz
 add.l  d0,d0
 swap   d0
 neg.w  d5                  ; d5=-x
 muls   0(a0,d6.w),d5          ; nx=-x*sin(be)
 muls   0(a1,d6.w),d7          ; ny=y*cos(be)
 add.l  d7,d5               ; fz=nx+ny
 add.l  d5,d5
 swap   d5
 move.w d5,d2
 movem.l (a7)+,d5/d7
 add.w  d3,d0
 add.w  d4,d1
 add.w  d5,d2
 rts
 
RotateZ:
 movem.l d5/d7,-(a7)
 asl.w  #1,d6
 bge.s  .ok
 add.w  #720,d6
.ok:
 sub.w  d3,d0
 sub.w  d4,d1
 sub.w  d5,d2
 lea    sintab(pc),a0
 lea    costab(pc),a1
 move.w d0,d5
 move.w d1,d7
 muls   0(a1,d4.w),d0          ; nx=x*cos(ga)
 muls   0(a0,d4.w),d1          ; ny=y*sin(ga)
 sub.l  d1,d0                  ; fx=nx-ny
 add.l  d0,d0
 swap   d0
 muls   0(a0,d4.w),d5          ; nx=x*sin(ga)
 muls   0(a1,d4.w),d7          ; ny=y*cos(ga)
 add.l  d7,d5               ; fy=nx+ny
 add.l  d5,d5
 swap   d5
 move.w d5,d1       ; *************
 movem.l (a7)+,d5/d7
 add.w  d3,d0
 add.w  d4,d1
 add.w  d5,d2
 rts

UseJoy:
 tst.l  offset
 bne.s  .err
 asl.w  #2,d0
 addq.w #2,d0
 ext.l  d0
 move.l d0,offset
 move.w #3,rsx
 move.w #3,rsy
 move.w #3,rsz
 move.w #50,msz
 move.w #-300,mtrv
 move.w #-16000,mtrh
 move.l #joy,joybuf
 cmp.l  #0,a1
 bne.s  .tab
 moveq  #0,d0
 rts
.err:
 moveq  #-1,d0
 rts
.tab:
 move.w (a1)+,msz
 move.w (a1)+,mtrv
 move.w (a1)+,mtrh
 move.w (a1)+,rsx
 move.w (a1)+,rsy
 move.w (a1)+,rsz
 moveq  #0,d0
 rts

FreeJoy:
 move.l #0,offset
 move.l #0,joyadr
 move.l #0,joybuf
 move.l #0,offset
 moveq  #0,d0
 rts

offset dc.l 0
rsx    dc.w 0
rsy    dc.w 0
rsz    dc.w 0
msz    dc.w 0
mtrv   dc.w 0
mtrh   dc.w 0
joybuf dc.l 0

KillSystem:
 moveq #0,d0
 rts

AutoScaleOn:
 move.w #0,xscale
 btst   #15,d0
 beq.s  .nohires
 move.w #1,xscale
.nohires
 move.w #0,yscale
 btst   #2,d0
 beq.s  .nolace
 move.w #1,yscale
.nolace
 moveq  #0,d0
 rts

AutoScaleOff:
 move.w #0,xscale
 move.w #0,yscale
 moveq  #0,d0
 rts

SetColors:
 movem.l a2-a3/a6,-(a7)
 move.l 4(a0),a2
 move.l a1,a3
 move.l gfxbase(pc),a6
.lab:
 move.w (a3)+,d0
 move.w (a3)+,d1
 move.w (a3)+,d2
 move.w (a3)+,d3
 move.l a2,a0
 jsr    -288(a6)
 tst.w  (a3)
 bge.s  .lab
 movem.l (a7)+,a2-a3/a6
 moveq   #0,d0
 rts

plnh     dc.l 0
plns     dc.l 0
tmpadr   dc.l 0
vbi      dc.w 0
moveptr  dc.l 0
addx     dc.l 0
addy     dc.l 0
addz     dc.l 0
rx       dc.w 0
ry       dc.w 0
rz       dc.w 0
         dc.w 0
objflg   dc.w 0
vcnt     dc.l 0
movecnt  dc.w 0
pdptr    dc.l 0
anptr    dc.l 0
mvptr    dc.l 0
atabptr  dc.l 0
zend     dc.l 0
hix      dc.w 0
lox      dc.w 0
hiy      dc.w 0
loy      dc.w 0
wsizex   dc.w 1
wsizey   dc.w 1
woffx    dc.w 0
woffy    dc.w 0
tmpmod   dc.w 0
scx1     dc.w 0
scy1     dc.w 0
scx2     dc.w 0
scy2     dc.w 0
endsc
drawnum  dc.w 0
line     dc.w 0
liner    dc.l 0
linrout  dc.l 0
ana0     dc.l 0
ana1     dc.l 0
ana2     dc.l 0
ana3     dc.l 0
ana4     dc.l 0
animcnt  dc.w 0
dttabptr dc.l 0
ztabptr  dc.l 0
zorgptr  dc.l 0
z2orgptr dc.l 0
rootptr  dc.l 0
dtorgptr dc.l 0
lrtabptr dc.l 0
bobptr   dc.l 0
endbob   dc.l 0
vsizptr  dc.l 0
strptr   dc.l 0
starptr  dc.l 0
tmom     dc.l 0
gfxbase  dc.l 0
intbase  dc.l 0
dosbase  dc.l 0
chipbase dc.l $dff000
xscale   dc.w 0
yscale   dc.w 0

normsiztab:
 dc.l -1188*16,-1281*16,-1375*16,-1531*16,-1688*16,-1938*16,-2188*16,-2656*16,-3125*16,-3750*16,-4375*16,-5000*16,-5625*16,-6563*16,-7500*16,-17000*16

 
sintab	DC.W	0,$23B,$477,$6B2,$8ED,$B27,$D61,$F99
	DC.W	$11D0,$1405,$1639,$186C,$1A9C,$1CCA,$1EF7,$2120
	DC.W	$2347,$256C,$278D,$29AB,$2BC6,$2DDE,$2FF2,$3203
	DC.W	$340F,$3617,$381C,$3A1B,$3C17,$3E0D,$3FFF,$41EC
	DC.W	$43D3,$45B6,$4793,$496A,$4B3B,$4D07,$4ECD,$508C
	DC.W	$5246,$53F9,$55A5,$574B,$58E9,$5A81,$5C12,$5D9C
	DC.W	$5F1E,$6099,$620C,$6378,$64DC,$6638,$678D,$68D9
	DC.W	$6A1D,$6B58,$6C8C,$6DB6,$6ED9,$6FF2,$7103,$720B
	DC.W	$730A,$7400,$74EE,$75D2,$76AD,$777E,$7846,$7905
	DC.W	$79BB,$7A67,$7B09,$7BA2,$7C31,$7CB7,$7D32,$7DA4
	DC.W	$7E0D,$7E6B,$7EC0,$7F0A,$7F4B,$7F82,$7FAF,$7FD2
	DC.W	$7FEB,$7FFA
costab	DC.W    $7FFF,$7FFA,$7FEB,$7FD2,$7FAF,$7F82
	DC.W	$7F4B,$7F0A,$7EC0,$7E6B,$7E0D,$7DA4,$7D32,$7CB7
	DC.W	$7C31,$7BA2,$7B09,$7A67,$79BB,$7905,$7846,$777E
	DC.W	$76AD,$75D2,$74EE,$7400,$730A,$720B,$7103,$6FF2
	DC.W	$6ED9,$6DB6,$6C8B,$6B58,$6A1D,$68D9,$678D,$6638
	DC.W	$64DC,$6378,$620C,$6099,$5F1E,$5D9C,$5C12,$5A81
	DC.W	$58E9,$574B,$55A5,$53F9,$5246,$508C,$4ECD,$4D07
	DC.W	$4B3B,$496A,$4793,$45B6,$43D3,$41EC,$3FFF,$3E0D
	DC.W	$3C17,$3A1B,$381C,$3618,$340F,$3203,$2FF2,$2DDE
	DC.W	$2BC7,$29AB,$278D,$256C,$2347,$2120,$1EF7,$1CCB
	DC.W	$1A9C,$186C,$163A,$1406,$11D0,$F99,$D61,$B27
	DC.W	$8ED,$6B3,$477,$23C,0,$FDC5,$FB89,$F94E
	DC.W	$F713,$F4D9,$F2A0,$F067,$EE30,$EBFB,$E9C7,$E794
	DC.W	$E564,$E336,$E10A,$DEE0,$DCB9,$DA95,$D873,$D655
	DC.W	$D43A,$D222,$D00E,$CDFE,$CBF1,$C9E9,$C7E5,$C5E5
	DC.W	$C3EA,$C1F3,$C001,$BE14,$BC2D,$BA4B,$B86E,$B696
	DC.W	$B4C5,$B2F9,$B133,$AF74,$ADBB,$AC08,$AA5B,$A8B6
	DC.W	$A717,$A57F,$A3EE,$A264,$A0E2,$9F67,$9DF4,$9C88
	DC.W	$9B24,$99C8,$9874,$9728,$95E4,$94A8,$9375,$924A
	DC.W	$9128,$900E,$8EFD,$8DF5,$8CF6,$8C00,$8B13,$8A2E
	DC.W	$8954,$8882,$87BA,$86FB,$8645,$8599,$84F7,$845E
	DC.W	$83CF,$8349,$82CE,$825C,$81F3,$8195,$8140,$80F6
	DC.W	$80B5,$807E,$8051,$802E,$8015,$8006,$8001,$8006
	DC.W	$8015,$802E,$8051,$807E,$80B5,$80F6,$8140,$8195
	DC.W	$81F3,$825B,$82CD,$8349,$83CF,$845E,$84F7,$8599
	DC.W	$8645,$86FB,$87B9,$8882,$8953,$8A2E,$8B12,$8BFF
	DC.W	$8CF5,$8DF5,$8EFD,$900E,$9127,$9249,$9374,$94A7
	DC.W	$95E3,$9727,$9873,$99C7,$9B23,$9C87,$9DF3,$9F67
	DC.W	$A0E1,$A264,$A3ED,$A57E,$A716,$A8B5,$AA5B,$AC07
	DC.W	$ADBA,$AF73,$B133,$B2F8,$B4C4,$B696,$B86D,$BA4A
	DC.W	$BC2C,$BE14,$C000,$C1F2,$C3E9,$C5E4,$C7E4,$C9E8
	DC.W	$CBF0,$CDFD,$D00D,$D221,$D439,$D654,$D872,$DA94
	DC.W	$DCB8,$DEDF,$E109,$E335,$E563,$E794,$E9C6,$EBFA
	DC.W	$EE30,$F066,$F29F,$F4D8,$F712,$F94D,$FB88,$FDC4
sinend	DC.W	0,$23B,$477,$6B2,$8ED,$B27,$D61,$F99
	DC.W	$11D0,$1405,$1639,$186C,$1A9C,$1CCA,$1EF7,$2120
	DC.W	$2347,$256C,$278D,$29AB,$2BC6,$2DDE,$2FF2,$3203
	DC.W	$340F,$3617,$381C,$3A1B,$3C17,$3E0D,$3FFF,$41EC
	DC.W	$43D3,$45B6,$4793,$496A,$4B3B,$4D07,$4ECD,$508C
	DC.W	$5246,$53F9,$55A5,$574B,$58E9,$5A81,$5C12,$5D9C
	DC.W	$5F1E,$6099,$620C,$6378,$64DC,$6638,$678D,$68D9
	DC.W	$6A1D,$6B58,$6C8C,$6DB6,$6ED9,$6FF2,$7103,$720B
	DC.W	$730A,$7400,$74EE,$75D2,$76AD,$777E,$7846,$7905
	DC.W	$79BB,$7A67,$7B09,$7BA2,$7C31,$7CB7,$7D32,$7DA4
	DC.W	$7E0D,$7E6B,$7EC0,$7F0A,$7F4B,$7F82,$7FAF,$7FD2
	DC.W	$7FEB,$7FFA
cosend

gfxname dc.b "graphics.library",0
intname dc.b "intuition.library",0
