home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-11-09 | 42.0 KB | 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
-