home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
594b.lha
/
VectorLibrary
/
vector.s
< prev
Wrap
Text File
|
1991-11-09
|
43KB
|
2,344 lines
; **** 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