maxscrdiv EQU 8 max3ddiv EQU 5 xpos EQU 0 ;l zpos EQU 4 ;l zsinval EQU 8 ;w zcosval EQU 10 ;w ztox EQU 12 ;l xsinval EQU 16 ;w xcosval EQU 18 ;w xspd EQU 20 ;w zspd EQU 22 ;w mapx EQU 24 ;b mapz EQU 25 ;b whichtile EQU 26 ;b xofflight EQU 28 ;w zofflight EQU 30 ;w offlight EQU 32 ;w zlinestore EQU 34 zlinedir EQU 38 zposdir EQU 40 zposstore EQU 42 xdiststore EQU 44 xdistdir EQU 46 zwallfound EQU 48 xlinestore EQU 50 xlinedir EQU 54 xposdir EQU 56 xposstore EQU 58 zdiststore EQU 60 zdistdir EQU 62 xwallfound EQU 64 midoffset EQU 104*4*40 SECTION Scrn,CODE_C OpenLib equ -552 ; Offset for OpenLibrary. CloseLib equ -414 ; Offset for CloseLibrary. vhposr equ $006 vhposrl equ $007 bltcon0 equ $40 bltcon1 equ $42 bltcpt equ $48 bltbpt equ $4c bltapt equ $50 spr0ctl equ $142 spr1ctl equ $14a spr2ctl equ $152 spr3ctl equ $15a spr4ctl equ $162 spr5ctl equ $16a spr6ctl equ $172 spr7ctl equ $17a spr0pos equ $140 spr1pos equ $148 spr2pos equ $150 spr3pos equ $158 spr4pos equ $160 spr5pos equ $168 spr6pos equ $170 spr7pos equ $178 bltdpt equ $54 bltafwm equ $44 bltalwm equ $46 bltsize equ $58 bltcmod equ $60 bltbmod equ $62 bltamod equ $64 bltdmod equ $66 diwstart equ $8e ; Screen hardware registers. diwstop equ $90 ddfstart equ $92 ddfstop equ $94 bplcon0 equ $100 bplcon1 equ $102 col0 equ $180 col1 equ $182 col2 equ $184 col3 equ $186 col4 equ $188 col5 equ $18a col6 equ $18c col7 equ $18e col8 equ $190 col9 equ $192 col10 equ $194 dmacon equ $96 dmaconr equ $002 intenar equ $01c intena equ $09a intreq equ $09c intreqr equ $01e intreqrl equ $01f bpl1pth equ $e0 bpl1ptl equ $e2 bpl2pth equ $e4 bpl2ptl equ $e6 bpl3pth equ $e8 bpl3ptl equ $ea bpl4pth equ $ec bpl4ptl equ $ee bpl5pth equ $f0 bpl5ptl equ $f2 bpl6pth equ $f4 bpl6ptl equ $f6 bpl7pth equ $f8 bpl7ptl equ $fa ** This waits for the blitter to finish before allowing program ** execution to continue. WB MACRO \@bf: btst #6,dmaconr(a6) bne.s \@bf ENDM *Another version for when d6 <> dff000 WBSLOW MACRO \@bf: btst #6,$dff000+dmaconr bne.s \@bf ENDM ** include "macros.i" include "ab3:source/defs.i" move.w (a0),option jmp stuff endstuff: move.l #$dff000,a6 ; NB V. IMPORTANT: A6=CUSTOM BASE move.w #$87c0,dmacon(a6) move.w #$0020,dmacon(a6) move.w intenar(a6),saveinters move.w #$7fff,intena(a6) move.w #$00ff,$dff09e *** Put myself in supervisor mode move.l #blag,$80 trap #0 ; move.l $6c,d0 ; move.l #blag,$6c ; move.w #$8010,intreq(a6) rts saveit: ds.l 10 blag: ; move.w #$10,intreq(a6) ; move.l d0,$6c ; move.w #$7fff,intena(a6) move.l $6c,saveit move.l #Chan0inter,$6c move.l #empty,pos1 move.l #empty,pos2 move.l #emptyend,Samp0end move.l #emptyend,Samp1end move.l #Panel,d0 move.w d0,p1l swap d0 move.w d0,p1h move.l #Panel+64*24,d0 move.w d0,p2l swap d0 move.w d0,p2h move.l #Panel+64*24*2,d0 move.w d0,p3l swap d0 move.w d0,p3h move.l #Panel+64*24*3,d0 move.w d0,p4l swap d0 move.w d0,p4h move.l #FacePlace,d0 move.w d0,f1l swap d0 move.w d0,f1h move.l #FacePlace+32*24,d0 move.w d0,f2l swap d0 move.w d0,f2h move.l #FacePlace+32*24*2,d0 move.w d0,f3l swap d0 move.w d0,f3h move.l #FacePlace+32*24*3,d0 move.w d0,f4l swap d0 move.w d0,f4h move.l #FacePlace+32*24*4,d0 move.w d0,f5l swap d0 move.w d0,f5h move.l #PanelCop,d0 move.w d0,pcl1 move.w d0,pcl2 swap d0 move.w d0,pch1 move.w d0,pch2 move.l #bigfield,d0 move.w d0,ocl swap d0 move.w d0,och bset.b #1,$bfe001 move.l #bigfield,$dff080 ; Point the copper at our copperlist. move.l #$dff000,a6 ; a6 points at the first custom chip register. move.w #$00ff,$dff09e move.w #0,d0 move.l #scrn,d0 move.w d0,pl1l swap d0 move.w d0,pl1h move.l #scrn+40,d0 move.w d0,pl2l swap d0 move.w d0,pl2h move.l #scrn+80,d0 move.w d0,pl3l swap d0 move.w d0,pl3h move.l #scrn+120,d0 move.w d0,pl4l swap d0 move.w d0,pl4h move.l #scrn+160,d0 move.w d0,pl5l swap d0 move.w d0,pl5h move.l #scrn+200,d0 move.w d0,pl6l swap d0 move.w d0,pl6h move.l #scrn+240,d0 move.w d0,pl7l swap d0 move.w d0,pl7h move.l #colbars,a0 move.l #colbars2,a2 move.w #81,d0 move.l #0,d6 move.w #0,d3 move.w #$2bdf,startwait move.w #$2d01,endwait fillcop move.w #$180,d1 move.l a0,a1 move.l a2,a3 move.w #$10c,(a1)+ move.w #$10c,(a3)+ move.w d3,(a1)+ move.w d3,(a3)+ eor.w #$8000,d3 move.w #$106,(a1)+ move.w #$106,(a3)+ move.w #$2c40,d5 or.w d3,d5 move.w d5,(a1)+ move.w d5,(a3)+ bsr do32 move.w #$106,(a1)+ move.w #$106,(a3)+ move.w #$4c40,d5 or.w d3,d5 move.w d5,(a1)+ move.w d5,(a3)+ bsr do32 move.w #$106,(a1)+ move.w #$106,(a3)+ move.w #$6c40,d5 or.w d3,d5 move.w d5,(a1)+ move.w d5,(a3)+ bsr do32 ********************************** cmp.b #'s',option beq.s smallscrn move.w startwait,(a1)+ move.w #$fffe,(a1)+ move.w endwait,(a1)+ move.w #$ff00,(a1)+ move.w startwait,(a3)+ move.w #$fffe,(a3)+ move.w endwait,(a3)+ move.w #$ff00,(a3)+ add.w #$300,startwait add.w #$300,endwait smallscrn: ********************************** adda.w #104*4,a0 adda.w #104*4,a2 dbra d0,fillcop ********************************** cmp.b #'s',option beq smallnotlarge move.w #$38,fetchstart move.w #$b8,fetchstop move.w #$2c81,winstart move.w #$2cc1,winstop move.w #-40,modulo move.w #-40,modulo+4 move.l #scrn+40,a0 move.l #scrn+160,a1 move.l #scrn+280,a2 move.l #scrntab,a3 move.w #319,d7 ; counter move.w #0,d1 ; xpos plotscrnloop: move.b (a3)+,d0 move.w d1,d2 asr.w #3,d2 move.b d1,d3 not.b d3 bclr.b d3,-40(a0,d2.w) bclr.b d3,(a0,d2.w) bclr.b d3,40(a0,d2.w) bclr.b d3,-40(a1,d2.w) bclr.b d3,(a1,d2.w) bclr.b d3,40(a1,d2.w) bclr.b d3,-40(a2,d2.w) btst #0,d0 beq.s nobp1 bset.b d3,-40(a0,d2.w) nobp1: btst #1,d0 beq.s nobp2 bset.b d3,(a0,d2.w) nobp2: btst #2,d0 beq.s nobp3 bset.b d3,40(a0,d2.w) nobp3: btst #3,d0 beq.s nobp4 bset.b d3,-40(a1,d2.w) nobp4: btst #4,d0 beq.s nobp5 bset.b d3,(a1,d2.w) nobp5: btst #5,d0 beq.s nobp6 bset.b d3,40(a1,d2.w) nobp6: btst #6,d0 beq.s nobp7 bset.b d3,-40(a2,d2.w) nobp7: addq #1,d1 dbra d7,plotscrnloop smallnotlarge: ********************************** **************************** jsr INITPLAYER ; bsr initobjpos **************************** move.l #null,$dff0a0 move.w #100,$dff0a4 move.w #443,$dff0a6 move.w #63,$dff0a8 move.l #null2,$dff0b0 move.w #100,$dff0b4 move.w #443,$dff0b6 move.w #63,$dff0b8 move.l #null4,$dff0c0 move.w #100,$dff0c4 move.w #443,$dff0c6 move.w #63,$dff0c8 move.l #null3,$dff0d0 move.w #100,$dff0d4 move.w #443,$dff0d6 move.w #63,$dff0d8 move.l #tab+256,a1 move.w #63,d7 outerlop move.l #tab,a0 move.w #255,d6 scaledownlop: move.b (a0)+,d0 ext.w d0 ext.l d0 muls d7,d0 asr.l #6,d0 move.b d0,(a1)+ dbra d6,scaledownlop subq #1,d7 bgt.s outerlop move.l #$dff000,a6 move.w #$c010,intena(a6) move.w #$f,dmacon(a6) move.w #$820f,dmacon(a6) bsr FullEnergy move.b #1,GunDamage move.w #3,GunNoise lop: move.l #$dff000,a6 waitfortop: btst.b #0,intreqrl(a6) beq waitfortop move.w #$1,intreq(a6) move.l drawpt,d0 move.l olddrawpt,drawpt move.l d0,olddrawpt move.l d0,$dff084 move.l drawpt,a3 adda.w #10,a3 move.l a3,frompt add.l #104*4*40,a3 move.l a3,midpt ****************************************** bsr PlaceFace bsr EnergyBar jsr objmoveanim ****************************************** move.l #SineTable,a0 move.w angspd,d1 move.w angpos,d0 btst #7,$bfe001 sne d6 tst.b d6 seq clicked move.b fire,d7 and.b d7,clicked move.b d6,fire bsr turnleftright move.w (a0,d0.w),d6 adda.w #2048,a0 move.w (a0,d0.w),d7 move.w d6,sinval move.w d7,cosval move.l xspdval,d6 move.l zspdval,d7 move.w xoff,oldxoff move.w zoff,oldzoff neg.l d6 ble.s nobug1 asr.l #1,d6 add.l #1,d6 bra.s bug1 nobug1 asr.l #1,d6 bug1: ; beq.s goinnowhere ; blt.s goinfor ; cmp.l #4*65536,d6 ; ble.s goinnowhere ; move.l #4*65536,d6 ;goinfor: ; cmp.l #-4*65536,d6 ; bge.s goinnowhere ; move.l #-4*65536,d6 ;goinnowhere: neg.l d7 ble.s nobug2 asr.l #1,d7 add.l #1,d7 bra.s bug2 nobug2 asr.l #1,d7 bug2: ; beq.s goinnowhere2 ; blt.s goinfor2 ; cmp.l #4*65536,d7 ; ble.s goinnowhere2 ; move.l #4*65536,d7 ;goinfor2: ; cmp.l #-4*65536,d7 ; bge.s goinnowhere2 ; move.l #-4*65536,d7 ;goinnowhere2: move.w sinval,d1 move.w cosval,d2 ext.l d1 ext.l d2 asl.l #5,d1 asl.l #5,d2 tst.b fire bra.s nomovelrposs btst #1,$d(a6) sne d3 beq.s notleft2 add.l d2,d6 sub.l d1,d7 notleft2 btst #1,$c(a6) sne d4 beq.s notright2 sub.l d2,d6 add.l d1,d7 notright2 nomovelrposs: btst #0,$dff00c sne d5 eor.b d4,d5 beq.s notup add.l d1,d6 add.l d2,d7 notup: btst #0,$dff00d sne d5 eor.b d3,d5 beq.s notdown sub.l d1,d6 sub.l d2,d7 notdown: add.l d6,xspdval add.l d7,zspdval move.l xspdval,d6 move.l zspdval,d7 add.l d6,xoff add.l d7,zoff ************************************* jsr putinbackdrop ************************************* move.w xoff,newx move.w zoff,newz move.w oldxoff,oldx move.w oldzoff,oldz move.l xspdval,xdiff move.l zspdval,zdiff move.l Roompt,objroom bsr MoveObject move.l objroom,Roompt move.w newx,xoff move.w newz,zoff move.l Roompt,a0 addq #2,a0 move.l (a0)+,tyoff addq #2,a0 findneg: tst.w (a0)+ bge.s findneg findneg2: tst.w (a0)+ bge.s findneg2 findneg3: tst.w (a0)+ bge.s findneg3 ; move.l (a0),a0 ; jump to viewpoint list * A0 is pointing at a pointer to list of points to rotate move.l (a0)+,PointsToRotatePtr move.l a0,ListOfGraphRooms ***************************************************** move.l tyoff,d0 move.l yoff,d1 move.l yvel,d2 add.l d2,d1 add.l #1024,d2 sub.l d1,d0 bgt.s shouldfall move.l d0,d2 cmp.l #-2048,d2 bge.s shouldfall move.l #-2048,d2 shouldfall: move.l d2,yvel move.l d1,yoff move.l yoff,d0 asr.l #8,d0 move.w d0,d1 and.w #63,d1 move.w d1,wallyoff and.b #%11111100,d0 move.w d0,flooryoff move.w xoff,d6 move.w d6,d3 asr.w #1,d3 add.w d3,d6 asr.w #1,d6 move.w d6,xoff34 move.w zoff,d6 move.w d6,d3 asr.w #1,d3 add.w d3,d6 asr.w #1,d6 move.w d6,zoff34 bsr RotateLevelPts bsr RotateObjectPts move.w #0,scaleval move.w #0,leftclip move.w #96,rightclip * Subroom loop move.l ListOfGraphRooms,a0 subroomloop: move.l (a0)+,d7 blt jumpoutofrooms bsr setlrclip ; move.w leftclip,d0 ; cmp.w rightclip,d0 ; bge subroomloop move.l a0,-(a7) move.l d7,a0 move.w (a0)+,d0 move.w d0,currzone move.l #ZoneAdds,a1 move.l (a1,d0.w*4),a1 move.w 6(a1),ZoneBright polyloop: move.w (a0)+,d0 blt jumpoutofloop beq.s itsawall cmp.w #3,d0 beq.s itsasetclip cmp.w #4,d0 beq.s itsanobject cmp.w #5,d0 bne.s itsafloor itsanarc: jsr CurveDraw bra polyloop itsanobject: jsr ObjDraw bra polyloop itsafloor: * 1,2 = floor/roof jsr itsafloordraw bra polyloop itsasetclip: bsr setlrclip bra polyloop itsawall: bsr itsawalldraw bra.s polyloop jumpoutofloop: jsr ObjDraw move.l (a7)+,a0 bra subroomloop jumpoutofrooms: move.l #$dff000,a6 ; move.w #$300,col0(a6) btst #6,$bfe001 beq end tst.w Energy ble end bra lop *************************************************************************** *************************************************************************** ****************** End of Main Loop here ********************************** *************************************************************************** *************************************************************************** RotateLevelPts: move.w sinval,d5 move.w cosval,d6 move.l PointsToRotatePtr,a0 move.l #Points,a3 move.l #Rotated,a1 move.l #OnScreen,a2 pointrotlop: move.w (a0)+,d7 blt.s outofpointrot move.w (a3,d7*4),d0 sub.w xoff,d0 move.w 2(a3,d7*4),d1 sub.w zoff,d1 move.w d0,d2 muls d6,d2 move.w d1,d3 muls d5,d3 sub.l d3,d2 add.l d2,d2 swap d2 ext.l d2 asl.l #7,d2 move.l d2,(a1,d7*8) muls d5,d0 muls d6,d1 add.l d0,d1 asl.l #2,d1 swap d1 move.l d1,4(a1,d7*8) tst.w d1 bgt.s ptnotbehind move.w #-1,d2 bra putin ptnotbehind: divs d1,d2 add.w #47,d2 putin: move.w d2,(a2,d7*2) bra pointrotlop outofpointrot: rts RotateObjectPts: move.w sinval,d5 move.w cosval,d6 move.l #ObjectPoints,a0 move.w NumObjectPoints,d7 move.l #ObjRotated,a1 objpointrotlop: move.w (a0)+,d0 sub.w xoff,d0 move.w (a0)+,d1 sub.w zoff,d1 move.w d0,d2 muls d6,d2 move.w d1,d3 muls d5,d3 sub.l d3,d2 add.l d2,d2 swap d2 move.w d2,(a1)+ ext.l d2 asl.l #7,d2 muls d5,d0 muls d6,d1 add.l d0,d1 asl.l #2,d1 swap d1 move.w d1,(a1)+ move.l d2,(a1)+ dbra d7,objpointrotlop rts FaceToPlace: dc.w 0 Cheese: dc.w 4,25 FacesList: dc.w 0,4*4 dc.w 2,2*4 dc.w 0,2*4 dc.w 3,2*4 dc.w 0,2*4 dc.w 2,3*4 dc.w 0,2*4 dc.w 3,3*4 dc.w 0,5*4 dc.w 1,2*4 dc.w 0,2*4 dc.w 1,2*4 dc.w 0,2*4 dc.w 1,2*4 dc.w 0,2*4 dc.w 2,3*4 dc.w 0,1*4 dc.w 3,3*4 dc.w 0,1*4 dc.w 2,3*4 dc.w 0,1*4 EndOfFacesList: FacesPtr: dc.l FacesList FacesCounter: dc.w 0 Expression: dc.w 0 PlaceFace: move.w FacesCounter,d0 subq #1,d0 bgt.s NoNewFace move.l FacesPtr,a0 move.w 2(a0),d0 move.w (a0),Expression addq #4,a0 cmp.l #EndOfFacesList,a0 blt.s NotFirstFace move.l #FacesList,a0 NotFirstFace move.l a0,FacesPtr NoNewFace: move.w d0,FacesCounter Move.w FaceToPlace,d0 muls #5,d0 add.w Expression,d0 move.l #FacePlace+10,a0 move.l #Faces,a1 muls #(4*32*5),d0 adda.w d0,a1 move.w #4,d0 move.w #24,d1 move.w #4,d3 bitplaneloop: move.w #31,d2 PlaceFaceToPlaceInFacePlaceLoop: move.l (a1),(a0) adda.w d0,a1 adda.w d1,a0 dbra d2,PlaceFaceToPlaceInFacePlaceLoop dbra d3,bitplaneloop rts Energy: dc.w 191 OldEnergy: dc.w 191 FullEnergy: move.w #191,Energy move.w #191,OldEnergy move.l #Panel+41*24,a0 move.w #6*6-1,d0 fillbar: move.l #$fefefefe,(a0)+ dbra d0,fillbar rts EnergyBar: move.w Energy,d0 move.w #192,d1 sub.w d0,d1 ext.l d1 divs #48,d1 move.w d1,FaceToPlace cmp.w OldEnergy,d0 bne.s gottochange NoChange rts gottochange: blt LessEnergy cmp.w #191,Energy blt.s NotMax move.w #191,Energy NotMax: move.w Energy,d0 move.w OldEnergy,d2 sub.w d0,d2 beq.s NoChange neg.w d2 move.w OldEnergy,d3 move.l #Panel+41*24,a0 EnergyRise: move.w d3,d0 move.b d0,d1 not.b d1 and.b #7,d1 beq.s noplot asr.w #3,d0 lea (a0,d0.w),a1 bset.b d1,(a1) bset.b d1,24(a1) bset.b d1,24*2(a1) bset.b d1,24*3(a1) bset.b d1,24*4(a1) bset.b d1,24*5(a1) noplot: addq #1,d3 subq #1,d2 bgt.s EnergyRise move.w Energy,OldEnergy rts LessEnergy: move.w OldEnergy,d2 sub.w d0,d2 move.w OldEnergy,d3 move.l #Panel+41*24,a0 EnergyDrain: move.w d3,d0 move.b d0,d1 not.b d1 asr.w #3,d0 lea (a0,d0.w),a1 bclr.b d1,(a1) bclr.b d1,24(a1) bclr.b d1,24*2(a1) bclr.b d1,24*3(a1) bclr.b d1,24*4(a1) bclr.b d1,24*5(a1) subq #1,d3 subq #1,d2 bgt.s EnergyDrain move.w Energy,OldEnergy rts end: jmp closeeverything do32: move.w #31,d7 move.w #$180,d1 across: move.w d1,(a1)+ move.w d1,(a3)+ move.w #0,(a1)+ move.w #0,(a3)+ add.w #2,d1 dbra d7,across rts ************************************* * Set left and right clip values ************************************* xspdval: dc.l 0 zspdval: dc.l 0 setlrclip: move.l #OnScreen,a1 move.l #Rotated,a2 move.w (a0)+,d0 bge.s notdefaultleft move.w #0,leftclip bra leftnotoktoclip notdefaultleft: move.w 6(a2,d0*8),d1 ; left z val bgt.s leftclipinfront move.w (a0),d0 tst.w 6(a2,d0*8) bgt.s leftnotoktoclip move.w #95,leftclip move.w #0,rightclip addq #2,a0 rts leftclipinfront: move.w (a1,d0*2),d1 ; left x on screen cmp.w leftclip(pc),d1 ble.s leftnotoktoclip cmp.w #95,d1 ble.s leftclipnotoffright move.w #95,d1 leftclipnotoffright: move.w d1,leftclip leftnotoktoclip: move.w (a0)+,d0 bge.s notdefaultright move.w #96,rightclip bra rightnotoktoclip notdefaultright: move.w 6(a2,d0*8),d1 ; right z val ble.s rightnotoktoclip rightclipinfront: move.w (a1,d0*2),d1 ; right x on screen cmp.w rightclip(pc),d1 bge.s rightnotoktoclip tst.w d1 bge.s rightclipnotoffleft moveq #0,d1 rightclipnotoffleft: addq #1,d1 move.w d1,rightclip rightnotoktoclip: rts leftclip2: dc.w 0 rightclip2: dc.w 0 ZoneBright: dc.w 0 npolys: dc.w 0 fire: dc.w 0 turnleftright: move.w d1,d2 neg.w d2 ; cmp.w #128,d2 ; ble.s okslow1 ; move.w #128,d2 ;okslow1 ; cmp.w #-128,d2 ; bge.s okslow2 ; move.w #-128,d2 ;okslow2 ; tst.b fire ; beq.s noturnposs btst #1,$d(a6) sne d3 beq.s notleft move.w #80,d2 tst.w d1 bge.s notleft moveq #0,d1 notleft btst #1,$c(a6) sne d4 beq.s notright move.w #-80,d2 tst.w d1 ble.s notright moveq #0,d1 notright noturnposs: add.w d2,d1 move.w d1,angspd add.w d1,d0 and.w #8191,d0 move.w d0,angpos rts ***************************************************** ********** WALL STUFF ******************************* include "AB3:source/wallroutine3" ***************************************************** include "ab3:source/ObjectMove" pastdata: *********************************** * This routine animates brightnesses. liftpt: dc.l liftanimtab brightpt: dc.l brightanimtab liftanim: rts ****************************** include "ab3:level1/Anims" ****************************** rotanimpt: dc.w 0 xradd: dc.w 5 yradd: dc.w 8 xrpos: dc.w 320 yrpos: dc.w 320 rotanim: rts option: dc.w 0 ****************************************** * floor polygon itsafloordraw: * If D0 =1 then its a floor otherwise (=2) it's * a roof. move.w #0,above move.w (a0)+,d6 ; ypos of poly move.w leftclip(pc),d7 cmp.w rightclip(pc),d7 bge.s dontdrawreturn sub.w flooryoff,d6 bgt.s below blt.s aboveplayer dontdrawreturn: move.w (a0)+,d6 ; sides-1 add.w d6,d6 add.w d6,a0 add.w #4+6,a0 rts aboveplayer: cmp.w #2,d0 bne.s dontdrawreturn move.w #1,d0 move.w d0,above neg.w d6 below: cmp.w #1,d0 bne.s dontdrawreturn move.w d6,distaddr muls #256,d6 move.l d6,ypos divs #40,d6 ; zpos of bottom ; visible line move.w d6,minz move.w #80,top move.w #-1,bottom move.w #0,drawit move.l #Rotated,a1 move.l #OnScreen,a2 move.w (a0)+,d7 ; no of sides sideloop: move.w minz,d6 move.w (a0)+,d1 move.w (a0),d3 move.w 6(a1,d1*8),d4 ;first z cmp.w d6,d4 bgt firstinfront move.w 6(a1,d3*8),d5 ; sec z cmp.w d6,d5 ble bothbehind ** line must be on left and partially behind. sub.w d5,d4 move.l (a1,d1*8),d0 sub.l (a1,d3*8),d0 sub.w d5,d6 divs d4,d0 muls d6,d0 ; new x coord add.l (a1,d3*8),d0 move.w minz,d4 move.w (a2,d3*2),d2 divs d4,d0 add.w #47,d0 move.l ypos,d3 divs d5,d3 move.w #40,d1 bra lineclipped firstinfront: move.w 6(a1,d3*8),d5 ; sec z cmp.w d6,d5 bgt bothinfront ** line must be on right and partially behind. sub.w d4,d5 ; dz move.l (a1,d3*8),d2 sub.l (a1,d1*8),d2 ; dx sub.w d4,d6 divs d5,d2 muls d6,d2 ; new x coord add.l (a1,d1*8),d2 move.w minz,d5 move.w (a2,d1*2),d0 divs d5,d2 add.w #47,d2 move.l ypos,d1 divs d4,d1 move.w #40,d3 bra lineclipped bothinfront: * Also, usefully enough, both are on-screen * so no bottom clipping is needed. move.w (a2,d1*2),d0 ; first x move.w (a2,d3*2),d2 ; second x move.l ypos,d1 move.l d1,d3 divs d4,d1 ; first y divs d5,d3 ; second y lineclipped: move.l #rightsidetab,a3 cmp.w d1,d3 beq lineflat bgt lineonright move.l #leftsidetab,a3 exg d1,d3 exg d0,d2 st drawit lea (a3,d1*2),a3 cmp.w top(pc),d1 bge.s .nonewtop move.w d1,top .nonewtop: cmp.w bottom(pc),d3 ble.s .nonewbot move.w d3,bottom .nonewbot: sub.w d1,d3 ; dy sub.w d0,d2 ; dx blt .linegoingleft sub.w #1,d0 moveq #0,d6 sub.w d3,d2 blt.s .noco .makeco addq #1,d6 sub.w d3,d2 bge.s .makeco .noco add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 .pixlopright: move.w d0,(a3)+ sub.w d2,d4 bge.s .nobigstep add.w d1,d0 add.w d3,d4 dbra d5,.pixlopright bra lineflat .nobigstep add.w d6,d0 dbra d5,.pixlopright bra lineflat .linegoingleft: sub.w #1,d0 neg.w d2 moveq #0,d6 sub.w d3,d2 blt.s .nocol .makecol addq #1,d6 sub.w d3,d2 bge.s .makecol .nocol add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 .pixlopleft: sub.w d2,d4 bge.s .nobigstepl sub.w d1,d0 add.w d3,d4 move.w d0,(a3)+ dbra d5,.pixlopleft bra lineflat .nobigstepl sub.w d6,d0 move.w d0,(a3)+ dbra d5,.pixlopleft bra lineflat lineonright: st drawit lea (a3,d1*2),a3 cmp.w top(pc),d1 bge.s .nonewtop move.w d1,top .nonewtop: cmp.w bottom(pc),d3 ble.s .nonewbot move.w d3,bottom .nonewbot: sub.w d1,d3 ; dy sub.w d0,d2 ; dx blt .linegoingleft addq #1,d0 moveq #0,d6 sub.w d3,d2 blt.s .noco .makeco addq #1,d6 sub.w d3,d2 bge.s .makeco .noco add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 .pixlopright: sub.w d2,d4 bge.s .nobigstep add.w d1,d0 add.w d3,d4 move.w d0,(a3)+ dbra d5,.pixlopright bra lineflat .nobigstep add.w d6,d0 move.w d0,(a3)+ dbra d5,.pixlopright bra lineflat .linegoingleft: addq #1,d0 neg.w d2 moveq #0,d6 sub.w d3,d2 blt.s .nocol .makecol addq #1,d6 sub.w d3,d2 bge.s .makecol .nocol add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 .pixlopleft: move.w d0,(a3)+ sub.w d2,d4 bge.s .nobigstepl sub.w d1,d0 add.w d3,d4 dbra d5,.pixlopleft bra lineflat .nobigstepl sub.w d6,d0 dbra d5,.pixlopleft lineflat: bothbehind: dbra d7,sideloop pastsides: addq #2,a0 move.w #104*4,linedir move.l frompt,a6 add.l #104*4*41,a6 move.w (a0)+,scaleval move.w (a0)+,whichtile move.w (a0)+,d6 add.w ZoneBright,d6 move.w d6,lighttype move.w above(pc),d6 beq groundfloor * on ceiling: move.w #-104*4,linedir suba.w #104*4,a6 groundfloor: move.w xoff,d6 move.w zoff,d7 move.w scaleval,d3 move.l scaleprogfrom(pc,d3.w*4),scaleprog tst.w d3 beq.s .samescale bgt.s .scaledown neg.w d3 asr.l d3,d7 asr.l d3,d6 bra.s .samescale .scaledown: asl.l d3,d6 asl.l d3,d7 .samescale asl.w #8,d7 move.w d6,sxoff move.w d7,szoff bra pastscale asr.l #3,d1 asr.l #3,d2 asr.l #2,d1 asr.l #2,d2 asr.l #1,d1 asr.l #1,d2 scaleprogfrom nop nop asl.l #1,d1 asl.l #1,d2 asl.l #2,d1 asl.l #2,d2 asl.l #3,d1 asl.l #3,d2 drawit: dc.w 0 top: dc.w 0 bottom: dc.w 0 ypos: dc.l 0 nfloors: dc.w 0 lighttype: dc.w 0 above: dc.w 0 linedir: dc.w 0 distaddr: dc.w 0 minz: dc.w 0 leftsidetab: ds.w 80 rightsidetab: ds.w 80 leftsideclip: ds.w 80 rightsideclip: ds.w 80 movespd: dc.w 0 largespd: dc.l 0 pastscale: tst.b drawit(pc) beq dontdrawfloor move.l a0,-(a7) move.l #leftsidetab,a4 move.w top(pc),d1 lea (a4,d1*2),a4 move.l #dists,a2 move.w distaddr,d0 asl.w #5,d0 adda.w d0,a2 lea (a2,d1*2),a2 move.w bottom(pc),d7 sub.w d1,d7 blt predontdrawfloor muls linedir,d1 add.l d1,a6 move.l #floorscalecols,a1 dofloor: move.w (a2)+,d0 move.w leftclip(pc),d3 move.w rightclip(pc),d4 move.w rightsidetab-leftsidetab(a4),d2 addq #1,d2 cmp.w d3,d2 ble.s nodrawline cmp.w d4,d2 ble.s noclipright move.w d4,d2 noclipright: move.w (a4),d1 cmp.w d4,d1 bge.s nodrawline cmp.w d3,d1 bge.s noclipleft move.w d3,d1 noclipleft: cmp.w d1,d2 ble.s nodrawline move.w d1,leftedge move.w d2,rightedge move.l a6,a3 movem.l d7/a2/a4,-(a7) ***************************************** * Use Floorline for patterned floor, SimpleFloorLine for plain+fast. ; cmp.b #'t',option+1 ; beq.s texturedfloor ; bsr SimpleFloorLine ; bra simplefloor ;texturedfloor: bsr FloorLine ;simplefloor: ***************************************** movem.l (a7)+,d7/a2/a4 nodrawline adda.w linedir(pc),a6 addq #2,a4 subq #1,d7 bgt dofloor predontdrawfloor move.l (a7)+,a0 dontdrawfloor: rts dists: incbin "floordists" *************************** * Right then, time for the floor * routine... * For test purposes, give it * a3 = point to screen * d0= z distance away * and sinval+cosval must be set up. *************************** leftedge: dc.w 0 rightedge: dc.w 0 SimpleFloorLine: move.w lighttype,d1 move.w d0,d2 asr.w #6,d2 add.w d2,d1 add.w #20,d1 move.l simplefloorbright(pc,d1.w*4),a1 bra pastsimplefloorbright dc.l floorscalecols dc.l floorscalecols dc.l floorscalecols dc.l floorscalecols dc.l floorscalecols dc.l floorscalecols dc.l floorscalecols dc.l floorscalecols dc.l floorscalecols dc.l floorscalecols dc.l floorscalecols simplefloorbright: dc.l floorscalecols+8192*0 dc.l floorscalecols+8192*1 dc.l floorscalecols+8192*1 dc.l floorscalecols+8192*2 dc.l floorscalecols+8192*2 dc.l floorscalecols+8192*3 dc.l floorscalecols+8192*3 dc.l floorscalecols+8192*4 dc.l floorscalecols+8192*4 dc.l floorscalecols+8192*5 dc.l floorscalecols+8192*5 dc.l floorscalecols+8192*6 dc.l floorscalecols+8192*6 dc.l floorscalecols+8192*7 dc.l floorscalecols+8192*7 dc.l floorscalecols+8192*8 dc.l floorscalecols+8192*8 dc.l floorscalecols+8192*9 dc.l floorscalecols+8192*9 dc.l floorscalecols+8192*10 dc.l floorscalecols+8192*10 dc.l floorscalecols+8192*11 dc.l floorscalecols+8192*11 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 dc.l floorscalecols+8192*12 simplepals: dc.w $af dc.w $ff dc.w $ddd dc.w $8f0 dc.w $ff0 dc.w $0 pastsimplefloorbright: CACHE_OFF d2 move.w whichtile,d1 move.w d1,d0 and.w #2,d0 asr.w #6,d1 or.w d1,d0 move.w simplepals(pc,d0.w),d0 move.w (a1,d0.w*2),d0; colour on this line move.w leftedge(pc),d1 move.l #doacrossline,a1 move.w rightedge(pc),d2 sub.w d1,d2 lea (a1,d1.w*4),a1 move.w (a1,d2.w*4),d4 move.w #$4e75,(a1,d2.w*4) jsr (a1) move.w d4,(a1,d2.w*4) CACHE_ON d2 rts storeit: dc.l 0 doacrossline: val SET 0 REPT 32 move.w d0,val(a3) val SET val+4 ENDR val SET val+4 REPT 32 move.w d0,val(a3) val SET val+4 ENDR val SET val+4 REPT 32 move.w d0,val(a3) val SET val+4 ENDR rts FloorLine: move.l #floortile,a0 adda.w whichtile,a0 move.w lighttype,d1 move.w d0,d2 asr.w #6,d2 add.w d2,d1 add.w #5,d1 bge.s fixedbright moveq #0,d1 fixedbright: cmp.w #28,d1 ble.s smallbright move.w #28,d1 smallbright: move.l floorbright(pc,d1*4),a1 bra pastfloorbright floorbright: dc.l floorscalecols+512*0 dc.l floorscalecols+512*1 dc.l floorscalecols+512*1 dc.l floorscalecols+512*2 dc.l floorscalecols+512*2 dc.l floorscalecols+512*3 dc.l floorscalecols+512*3 dc.l floorscalecols+512*4 dc.l floorscalecols+512*4 dc.l floorscalecols+512*5 dc.l floorscalecols+512*5 dc.l floorscalecols+512*6 dc.l floorscalecols+512*6 dc.l floorscalecols+512*7 dc.l floorscalecols+512*7 dc.l floorscalecols+512*8 dc.l floorscalecols+512*8 dc.l floorscalecols+512*9 dc.l floorscalecols+512*9 dc.l floorscalecols+512*10 dc.l floorscalecols+512*10 dc.l floorscalecols+512*11 dc.l floorscalecols+512*11 dc.l floorscalecols+512*12 dc.l floorscalecols+512*12 dc.l floorscalecols+512*13 dc.l floorscalecols+512*13 dc.l floorscalecols+512*14 dc.l floorscalecols+512*14 widthleft: dc.w 0 scaleval: dc.w 0 sxoff: dc.w 0 szoff: dc.w 0 xoff34: dc.w 0 zoff34: dc.w 0 scosval: dc.w 0 ssinval: dc.w 0 floorsetbright: move.l #walltiles,a0 pastfloorbright move.w d0,d1 muls cosval(PC),d1 ; change in x across whole width move.w d0,d2 muls sinval(PC),d2 ; change in z across whole width neg.l d2 scaleprog: asr.l #1,d1 asr.l #1,d2 move.l d1,d3 ; z cos move.l d3,d6 move.l d3,d5 asr.l #1,d6 add.l d6,d3 ; asr.l #1,d3 ; *3/4 asr.l #1,d3 move.l d2,d4 ; z sin move.l d4,d6 asr.l #1,d6 add.l d4,d6 ; asr.l #1,d6 add.l d3,d4 neg.l d4 ; start x asr.l #1,d6 ; zsin/2 sub.l d6,d5 ; start z add.l d1,d1 add.l d2,d2 move.w d4,startsmoothx move.w d5,startsmoothz swap d4 asr.l #8,d5 move.w szoff,d6 add.w d6,d5 move.w sxoff,d6 add.w d6,d4 and.w #63,d4 and.w #63*256,d5 move.b d4,d5 ext.l d5 and.b #63,d5 lsl.w #2,d5 ; position in block asr.l #7,d1 asr.l #7,d2 move.w leftedge(pc),d6 beq.s nomultleft move.l d1,d3 asr.l #6,d3 muls d6,d3 asl.l #6,d3 swap d3 asl.w #2,d3 add.b d3,d5 move.l d2,d3 asr.l #6,d3 muls d6,d3 asl.l #6,d3 swap d3 lsl.w #8,d3 lsl.w #2,d3 add.w d3,d5 nomultleft: move.w d1,a4 move.w d2,a5 asr.l #6,d2 and.w #%1111110000000000,d2 swap d1 asl.w #2,d1 *********************************** asr.w #2,d1 asr.w #2,d2 add.w d1,d2 move.w #%11111100111111,d1 asr.w #2,d5 and.w d1,d5 swap d5 move.w startsmoothz,d5 swap d5 swap d2 move.w a5,d2 swap d2 *********************************** move.w d6,a2 move.l d2,d6 add.w #256,d6 moveq #0,d0 tst.w a2 beq startatleftedge move.w widthleft(pc),d4 move.w rightedge(pc),d3 cmp.w #31,a2 bgt.s notinfirststrip lea (a3,a2.w*4),a3 cmp.w #32,d3 ble.s allinfirststrip move.w #32,d7 sub.w a2,d7 sub.w #32,d3 bra intofirststrip allinfirststrip sub.w a2,d3 move.w d3,d7 move.w #0,d4 bra allintofirst notinfirststrip: sub.w #32,a2 sub.w #32,d3 adda.w #33*4,a3 cmp.w #31,a2 bgt.s notstartinsec lea (a3,a2.w*4),a3 cmp.w #32,d3 ble.s allinsecstrip move.w #32,d7 sub.w a2,d7 sub.w #32,d3 move.w d3,d4 dbra d7,acrossscrn2 allinsecstrip sub.w a2,d3 move.w d3,d7 move.w #0,d4 dbra d7,acrossscrn2 rts notstartinsec: sub.w #32,a2 sub.w #32,d3 adda.w #33*4,a3 lea (a3,a2.w*4),a3 cmp.w #32,d3 ble.s allinthirdstrip move.w #32,d7 sub.w a2,d7 sub.w #32,d3 move.w d3,d4 dbra d7,acrossscrn3 rts allinthirdstrip sub.w a2,d3 move.w d3,d7 move.w #0,d4 dbra d7,acrossscrn3 rts startatleftedge: move.w rightedge(pc),d3 sub.w a2,d3 move.w d3,d7 cmp.w #32,d7 ble.s .notoowide move.w #32,d7 .notoowide: sub.w d7,d3 intofirststrip: move.w d3,d4 allintofirst: move.w startsmoothx,d3 dbra d7,acrossscrn rts backbefore: and.w d1,d5 move.b (a0,d5.w*4),d0 move.w (a1,d0.w*2),(a3) addq #4,a3 add.w a4,d3 addx.l d6,d5 dbcs d7,acrossscrn dbcc d7,backbefore bra.s past1 acrossscrn: and.w d1,d5 move.b (a0,d5.w*4),d0 move.w (a1,d0.w*2),(a3) addq #4,a3 add.w a4,d3 addx.l d2,d5 dbcs d7,acrossscrn dbcc d7,backbefore past1: move.w d4,d7 bne.s .notdoneyet rts .notdoneyet: cmp.w #32,d7 ble.s .notoowide move.w #32,d7 .notoowide sub.w d7,d4 addq #4,a3 dbra d7,acrossscrn2 rts backbefore2: and.w d1,d5 move.b (a0,d5.w*4),d0 move.w (a1,d0.w*2),(a3) addq #4,a3 add.w a4,d3 addx.l d6,d5 dbcs d7,acrossscrn2 dbcc d7,backbefore2 bra.s past2 acrossscrn2: and.w d1,d5 move.b (a0,d5.w*4),d0 move.w (a1,d0.w*2),(a3) addq #4,a3 add.w a4,d3 addx.l d2,d5 dbcs d7,acrossscrn2 dbcc d7,backbefore2 past2: move.w d4,d7 bne.s .notdoneyet rts .notdoneyet: cmp.w #32,d7 ble.s .notoowide move.w #32,d7 .notoowide sub.w d7,d4 addq #4,a3 dbra d7,acrossscrn3 rts backbefore3: and.w d1,d5 move.b (a0,d5.w*4),d0 move.w (a1,d0.w*2),(a3) addq #4,a3 add.w a4,d3 addx.l d6,d5 dbcs d7,acrossscrn3 dbcc d7,backbefore3 rts acrossscrn3: and.w d1,d5 move.b (a0,d5.w*4),d0 move.w (a1,d0.w*2),(a3) addq #4,a3 add.w a4,d3 addx.l d2,d5 dbcs d7,acrossscrn3 dbcc d7,backbefore3 past3: timetodie: rts startsmoothx: dc.w 0 startsmoothz: dc.w 0 ******************************** * include "AB3:source/ObjDraw2" * ******************************** numframes: dc.w 0 Chan0inter: move.w #$0010,$dff000+intreq btst #7,$dff000+intreqrl bne.s newsampbitl noneed: rte newsampbitl: movem.l d0-d7/a0-a6,-(a7) move.w #$820f,$dff000+dmacon move.w #$80,$dff000+intreq move.l pos1,a0 move.l pos2,a1 move.l #tab,a2 adda.w audpos1,a2 move.l Aupt0,a3 move.l a3,$dff0a0 move.l Auback0,Aupt0 move.l a3,Auback0 move.l Auback0,a3 moveq #0,d0 moveq #0,d1 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.w #49,d7 loop: move.l (a0)+,d0 move.b (a1)+,d1 move.b (a1)+,d2 move.b (a1)+,d3 move.b (a1)+,d4 move.b (a2,d3.w),d5 swap d5 move.b (a2,d1.w),d5 asl.l #8,d5 move.b (a2,d2.w),d5 swap d5 move.b (a2,d4.w),d5 add.l d5,d0 move.l d0,(a3)+ dbra d7,loop move.l pos1,a0 move.l pos2,a1 move.l Aupt1,a3 move.l a3,$dff0b0 move.l Auback1,Aupt1 move.l a3,Auback1 move.l #tab,a2 adda.w audpos2,a2 moveq #0,d0 moveq #0,d1 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.w #49,d7 loop2: move.l (a0)+,d0 move.b (a1)+,d1 move.b (a1)+,d2 move.b (a1)+,d3 move.b (a1)+,d4 move.b (a2,d3.w),d5 swap d5 move.b (a2,d1.w),d5 asl.l #8,d5 move.b (a2,d2.w),d5 swap d5 move.b (a2,d4.w),d5 add.l d5,d0 move.l d0,(a3)+ dbra d7,loop2 cmp.l Samp0end,a0 blt.s notoffendsamp1 move.l #bass,a0 move.l #bassend,Samp0end tst.b backbeat bne.s playbeat move.l #empty,a0 move.l #emptyend,Samp0end playbeat: notoffendsamp1: cmp.l Samp1end,a1 blt.s notoffendsamp2 move.l #empty,a1 move.l #emptyend,Samp1end notoffendsamp2: move.l a0,pos1 move.l a1,pos2 ******************* Other two channels move.l pos3,a0 move.l pos4,a1 move.l #tab,a2 adda.w audpos3,a2 move.l Aupt2,a3 move.l a3,$dff0d0 move.l Auback2,Aupt2 move.l a3,Auback2 moveq #0,d0 moveq #0,d1 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.w #49,d7 loop3: move.l (a0)+,d0 move.b (a1)+,d1 move.b (a1)+,d2 move.b (a1)+,d3 move.b (a1)+,d4 move.b (a2,d3.w),d5 swap d5 move.b (a2,d1.w),d5 asl.l #8,d5 move.b (a2,d2.w),d5 swap d5 move.b (a2,d4.w),d5 add.l d5,d0 move.l d0,(a3)+ dbra d7,loop3 move.l pos3,a0 move.l pos4,a1 move.l Aupt3,a3 move.l a3,$dff0c0 move.l Auback3,Aupt3 move.l a3,Auback3 move.l #tab,a2 adda.w audpos4,a2 moveq #0,d0 moveq #0,d1 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.w #49,d7 loop4: move.l (a0)+,d0 move.b (a1)+,d1 move.b (a1)+,d2 move.b (a1)+,d3 move.b (a1)+,d4 move.b (a2,d3.w),d5 swap d5 move.b (a2,d1.w),d5 asl.l #8,d5 move.b (a2,d2.w),d5 swap d5 move.b (a2,d4.w),d5 add.l d5,d0 move.l d0,(a3)+ dbra d7,loop4 cmp.l Samp2end,a0 blt.s notoffendsamp3 move.l #empty,a0 move.l #emptyend,Samp2end notoffendsamp3: cmp.l Samp3end,a1 blt.s notoffendsamp4 move.l #empty,a1 move.l #emptyend,Samp3end notoffendsamp4: move.l a0,pos3 move.l a1,pos4 movem.l (a7)+,d0-d7/a0-a6 rte backbeat: dc.w 0 Samp0end: dc.l emptyend Samp1end: dc.l emptyend Samp2end: dc.l emptyend Samp3end: dc.l emptyend Aupt0: dc.l null Auback0: dc.l null+500 Aupt2: dc.l null3 Auback2: dc.l null3+500 Aupt3: dc.l null4 Auback3: dc.l null4+500 Aupt1: dc.l null2 Auback1: dc.l null2+500 empty: ds.l 100 emptyend: ************************************** * I want a routine to calculate all the * info needed for the sound player to * work, given say position of noise, volume * and sample number. Samplenum: dc.w 0 Noisex: dc.w 0 Noisez: dc.w 0 Noisevol: dc.w 0 chanpick: dc.w 0 MakeSomeNoise: move.w Noisex,d1 muls d1,d1 move.w Noisez,d2 muls d2,d2 move.w #64,d3 moveq #1,d0 add.l d1,d2 beq pastcalc move.w #31,d0 .findhigh btst d0,d2 bne .foundhigh dbra d0,.findhigh .foundhigh asr.w #1,d0 clr.l d3 bset d0,d3 move.l d3,d0 move.w d0,d3 muls d3,d3 ; x*x sub.l d2,d3 ; x*x-a asr.l #1,d3 ; (x*x-a)/2 divs d0,d3 ; (x*x-a)/2x sub.w d3,d0 ; second approx bgt .stillnot0 move.w #1,d0 .stillnot0 move.w d0,d3 muls d3,d3 sub.l d2,d3 asr.l #1,d3 divs d0,d3 sub.w d3,d0 ; second approx bgt .stillnot02 move.w #1,d0 .stillnot02 move.w #64,d3 muls Noisevol,d3 divs d0,d3 cmp.w #64,d3 ble.s notooloud move.w #64,d3 notooloud: pastcalc: ; d3 contains volume of noise. move.w d3,d4 move.w d3,d2 muls Noisex,d2 divs d0,d2 bgt quietleft add.w d2,d4 bra donequiet quietleft: sub.w d2,d3 donequiet: ; d3=leftvol? ; d4=rightvol? neg.w d3 add.w #64,d3 neg.w d4 add.w #64,d4 move.l #SampleList,a3 tst.b chanpick beq.s chan0 cmp.b #1,chan0 beq.s chan1 cmp.b #2,chanpick beq chan2 move.w Samplenum,d0 move.l (a3,d0.w*8),a1 move.l 4(a3,d0.w*8),a2 tst.b notifplaying beq.s .play cmp.l Samp3end,a2 bne.s .play rts .play move.b d3,audpos3 move.b d4,audpos4 move.l a1,pos4 move.l a2,Samp3end rts chan0: move.w Samplenum,d0 move.l (a3,d0.w*8),a1 move.l 4(a3,d0.w*8),a2 tst.b notifplaying beq.s .play cmp.l Samp0end,a2 bne.s .play rts .play move.l a1,pos1 move.l a2,Samp0end rts chan1: move.w Samplenum,d0 move.l (a3,d0.w*8),a1 move.l 4(a3,d0.w*8),a2 tst.b notifplaying beq.s .play cmp.l Samp1end,a2 bne.s .play rts .play move.b d3,audpos1 move.b d4,audpos2 move.l a1,pos2 move.l a2,Samp1end rts chan2: move.w Samplenum,d0 move.l (a3,d0.w*8),a1 move.l 4(a3,d0.w*8),a2 tst.b notifplaying beq.s .play cmp.l Samp1end,a2 bne.s .play rts .play move.l a1,pos3 move.l a2,Samp2end rts SampleList dc.l Scream,EndScream dc.l Shoot,EndShoot dc.l Munch,EndMunch dc.l PooGun,EndPooGun dc.l Collect,EndCollect saveinters: dc.w 0 z: dc.w 10 notifplaying: dc.w 0 audpos1: dc.w 0 audpos2: dc.w 0 audpos3: dc.w 0 audpos4: dc.w 0 pos: dc.l 0 pos1: dc.l Scream pos2: dc.l Scream pos3: dc.l empty pos4: dc.l empty Scream: incbin "ab3:sounds/Scream" ds.w 100 EndScream: bass: incbin "ab3:sounds/backbass+drum" bassend: Shoot: incbin "ab3:sounds/fire!" EndShoot: Munch: incbin "ab3:sounds/munch" EndMunch: PooGun: incbin "ab3:sounds/poogun" EndPooGun: Collect: incbin "ab3:sounds/collect" EndCollect: numtodo dc.w 0 npt: dc.w 0 tab: val SET 0 REPT 128 dc.b val val SET val+1 ENDR val SET -128 REPT 128 dc.b val val SET val+1 ENDR ds.b 256*64 test: dc.l 0 ds.l 30 even scalecols: incbin "ab3:level1/bytepixpalscaled" even floorscalecols: incbin "ab3:level1/floorpalscaled" even walltiles: incbin "ab3:level1/bytepixfile" even floortile: incbin "ab3:level1/floortile" even wallrouts: incbin "2x2WallDraw" ObjDrawRouts: incbin "ObjDrawRoutstst" BackPicture: incbin "backfile" EndBackPicture: drawpt: dc.l colbars2 olddrawpt: dc.l colbars frompt: dc.l 0 SineTable: incbin "bigsine" angpos: dc.w 0 angspd: dc.w 0 wallyoff: dc.w 0 flooryoff: dc.w 0 xoff: dc.l 0 yoff: dc.l 0 yvel: dc.l 0 zoff: dc.l 0 tyoff: dc.l 0 liftanimtab: endliftanimtab: brightanimtab: dcb.w 200,20 dc.w 5 dc.w 10,20 dc.w 5 dcb.w 30,20 dc.w 7,10,10,5,10,0,5,6,5,6,5,6,5,6,0 dcb.w 40,0 dc.w 1,2,3,2,3,2,3,2,3,2,3,2,3,0 dcb.w 300,0 dc.w 1,0,1,0,2,2,2,5,5,5,5,5,5,5,5,5,6,10 dc.w -1 Roompt: dc.l 0 OldRoompt: dc.l 0 ***************************************************************** * include "AB3:level1/Level1.s" * ***************************************************************** wallpt: dc.l 0 floorpt: dc.l 0 Rotated: ds.l 800 ObjRotated: ds.l 800 OnScreen: ds.l 800 startwait: dc.w 0 endwait: dc.w 0 Faces: incbin "faces2raw" SECTION ffff,CODE_C null: ds.w 500 null2: ds.w 500 null3: ds.w 500 null4: ds.w 500 bigfield: ; Start of our copper list. dc.w intreq,$8011 dc.w $1fc,$3 dc.w diwstart winstart: dc.w $2cb1 dc.w diwstop winstop: dc.w $2c91 dc.w ddfstart fetchstart: dc.w $48 dc.w ddfstop fetchstop: dc.w $88 dc.w bplcon0,$7201 dc.w bplcon1 smoff: dc.w $0 dc.w col0,0 dc.w $108 modulo: dc.w -24 dc.w $10a,-24 dc.w bpl1pth pl1h dc.w 0 dc.w bpl1ptl pl1l dc.w 0 dc.w bpl2pth pl2h dc.w 0 dc.w bpl2ptl pl2l dc.w 0 dc.w bpl3pth pl3h dc.w 0 dc.w bpl3ptl pl3l dc.w 0 dc.w bpl4pth pl4h dc.w 0 dc.w bpl4ptl pl4l dc.w 0 dc.w bpl5pth pl5h dc.w 0 dc.w bpl5ptl pl5l dc.w 0 dc.w bpl6pth pl6h dc.w 0 dc.w bpl6ptl pl6l dc.w 0 dc.w bpl7pth pl7h dc.w 0 dc.w bpl7ptl pl7l dc.w 0 dc.w $1001,$ff00 dc.w intreq,$11 yposcop: dc.w $2a11,$fffe dc.w $8a,0 colbars: val SET $2a dcb.l 104*82,$1fe0000 dc.w $106,$c40 dc.w $80 pch1: dc.w 0 dc.w $82 pcl1: dc.w 0 dc.w $88,0 dc.w $ffff,$fffe ; End copper list. old dc.l 0 colbars2: val SET $2a dcb.l 104*82,$1fe0000 dc.w $106,$c40 dc.w $80 pch2: dc.w 0 dc.w $82 pcl2: dc.w 0 dc.w $88,0 dc.w $ffff,$fffe ; End copper list. dc.w $0 PanelCop: dc.w bplcon0,0 dc.w $106,$c40 dc.w $10c,0 dc.w $10e,0 incbin "Panelcopcols" dc.w $108,0 dc.w $10a,0 dc.w bpl1pth p1h dc.w 0 dc.w bpl1ptl p1l dc.w 0 dc.w bpl2pth p2h dc.w 0 dc.w bpl2ptl p2l dc.w 0 dc.w bpl3pth p3h dc.w 0 dc.w bpl3ptl p3l dc.w 0 dc.w bpl4pth p4h dc.w 0 dc.w bpl4ptl p4l dc.w 0 dc.w $80 och: dc.w 0 dc.w $82 ocl: dc.w 0 dc.w $cf01,$ff00 dc.w bplcon0,$4200 dc.w $f801,$ff00 dc.w col1,$50 dc.w $f901,$ff00 dc.w col1,$90 dc.w $fa01,$ff00 dc.w col1,$f0 dc.w $fb01,$ff00 dc.w col1,$f0 dc.w $fc01,$ff00 dc.w col1,$90 dc.w $fd01,$ff00 dc.w col1,$50 dc.w $fe01,$ff00 dc.w col1,$fff dc.w $ffdf,$fffe dc.w $a01,$ff00 dc.w bplcon0,$0 incbin "faces2cols" dc.w bpl1pth f1h dc.w 0 dc.w bpl1ptl f1l dc.w 0 dc.w bpl2pth f2h dc.w 0 dc.w bpl2ptl f2l dc.w 0 dc.w bpl3pth f3h dc.w 0 dc.w bpl3ptl f3l dc.w 0 dc.w bpl4pth f4h dc.w 0 dc.w bpl4ptl f4l dc.w 0 dc.w bpl5pth f5h dc.w 0 dc.w bpl5ptl f5l dc.w 0 dc.w $0c01,$ff00 dc.w bplcon0,$5200 dc.w $ffff,$fffe cnop 0,64 FacePlace: ds.l 6*32*5 ******************************************** * Stuff you don't have to worry about yet. * ******************************************** closeeverything: move.l old,$dff080 ; Restore old copper list. move.l old,d0 move.w d0,ocl swap d0 move.w d0,och move.w #$8020,dmacon(a6) move.w #$f,dmacon(a6) move.l saveit,$6c move.w saveinters,d0 or.w #$c000,d0 move.w d0,intena(a6) clr.w $dff0a8 clr.w $dff0b8 clr.w $dff0c8 clr.w $dff0d8 rte stuff: move.l 4.w,a6 ; Get EXECBASE. lea gfxname(PC),a1 ; Point to 'graphics.library' string. moveq #0,d0 ; Ignore version number. jsr OpenLib(a6) ; Open the library. move.l d0,a1 ; Store library address. move.l 38(a1),old ; Store workbench copper address. move.l 4.w,a6 ; Get EXECBASE again. jsr CloseLib(a6) ; Close the library. jmp endstuff gfxname dc.b "graphics.library",0 cnop 0,64 Panel: incbin "PanelRaw" scrntab: ds.b 16 val SET 32 REPT 96 dc.b val,val,val val SET val+1 ENDR ds.b 16 cnop 0,64 scrn: dcb.l 8,$33333333 dc.l 0 dc.l 0 dcb.l 8,$0f0f0f0f dc.l 0 dc.l 0 dcb.l 8,$00ff00ff dc.l 0 dc.l 0 dcb.l 8,$0000ffff dc.l 0 dc.l 0 dc.l 0,-1,0,-1,0,-1,0,-1 dc.l 0 dc.l 0 dc.l -1,-1,0,0,-1,-1,0,0 dc.l 0 dc.l 0 dc.l 0,0,-1,-1,-1,-1,-1,-1 dc.l 0 dc.l 0