currzone: dc.w 0 ty3d: dc.l -100*1024 by3d: dc.l 1*1024 TOPOFROOM: dc.l 0 BOTOFROOM: dc.l 0 AFTERWATTOP: dc.l 0 AFTERWATBOT: dc.l 0 BEFOREWATTOP: dc.l 0 BEFOREWATBOT: dc.l 0 ROOMBACK: dc.l 0 objclipt: dc.w 0 objclipb: dc.w 0 rightclipb: dc.w 0 leftclipb: dc.w 0 ObjDraw: move.w (a0)+,d0 cmp.w #1,d0 blt.s beforewat beq.s afterwat bgt.s fullroom beforewat: move.l BEFOREWATTOP,ty3d move.l BEFOREWATBOT,by3d bra.s donetopbot afterwat: move.l AFTERWATTOP,ty3d move.l AFTERWATBOT,by3d bra.s donetopbot fullroom: move.l TOPOFROOM(pc),ty3d move.l BOTOFROOM(pc),by3d donetopbot: ; move.l (a0)+,by3d ; move.l (a0)+,ty3d movem.l d0-d7/a1-a6,-(a7) move.w rightclip,d0 sub.w leftclip,d0 subq #1,d0 ble doneallinfront ; CACHE_ON d6 move.l ObjectData,a1 move.l #ObjRotated,a2 move.l #depthtable,a3 move.l a3,a4 move.w #79,d7 emptytab: move.l #$80010000,(a3)+ dbra d7,emptytab moveq #0,d0 insertanobj move.w (a1),d1 blt sortedall move.w GraphicRoom(a1),d2 cmp.w currzone(pc),d2 beq.s itsinthiszone notinthiszone: adda.w #64,a1 addq #1,d0 bra insertanobj itsinthiszone: move.b DOUPPER,d4 move.b ObjInTop(a1),d3 eor.b d4,d3 bne.s notinthiszone move.w 2(a2,d1.w*8),d1 ; zpos move.l #depthtable-4,a4 stillinfront: addq #4,a4 cmp.w (a4),d1 blt stillinfront move.l #enddepthtab-4,a5 finishedshift move.l -(a5),4(a5) cmp.l a4,a5 bgt.s finishedshift move.w d1,(a4) move.w d0,2(a4) adda.w #64,a1 addq #1,d0 bra insertanobj sortedall: move.l #depthtable,a3 gobackanddoanother move.w (a3)+,d0 ble.s doneallinfront move.w (a3)+,d0 bsr DrawtheObject bra gobackanddoanother doneallinfront movem.l (a7)+,d0-d7/a1-a6 rts depthtable: ds.l 80 enddepthtab: DrawtheObject: movem.l d0-d7/a0-a6,-(a7) move.l ObjectData,a0 move.l #ObjRotated,a1 asl.w #6,d0 adda.w d0,a0 move.w (a0),d0 move.w 2(a1,d0.w*8),d1 ; z pos ; Go through clip pts to see which ; apply. ; move.w #0,d2 ; leftclip ; move.w #96,d3 ; rightclip ; move.l EndOfClipPt,a6 ;checkclips: ; subq #8,a6 ; cmp.l #ClipTable,a6 ; blt outofcheckclips ; cmp.w 2(a6),d1 ; bgt.s cantleft ; move.w (a6),d4 ; cmp.w d4,d2 ; bgt.s cantleft ; move.w d4,d2 ;cantleft: ; cmp.w 6(a6),d1 ; bgt.s cantright ; move.w 4(a6),d4 ; cmp.w d4,d3 ; blt.s cantright ; move.w d4,d3 ;cantright: ;outofcheckclips: ; move.w d2,leftclipb ; move.w d3,rightclipb move.w leftclip,leftclipb move.w rightclip,rightclipb cmp.b #$ff,6(a0) bne BitMapObj bsr PolygonObj movem.l (a7)+,d0-d7/a0-a6 rts glassobj: move.w (a0)+,d0 ;pt num move.w 2(a1,d0.w*8),d1 cmp.w #25,d1 ble objbehind move.w topclip,d2 move.w botclip,d3 move.l ty3d,d6 sub.l yoff,d6 divs d1,d6 add.w MIDDLEY,d6 cmp.w d3,d6 bge objbehind cmp.w d2,d6 bge.s .okobtc move.w d2,d6 .okobtc: move.w d6,objclipt move.l by3d,d6 sub.l yoff,d6 divs d1,d6 add.w MIDDLEY,d6 cmp.w d2,d6 ble objbehind cmp.w d3,d6 ble.s .okobbc move.w d3,d6 .okobbc: move.w d6,objclipb move.l 4(a1,d0.w*8),d0 move.l (a0)+,d2 ; height ext.l d2 asl.l #7,d2 sub.l yoff,d2 divs d1,d2 add.w MIDDLEY,d2 divs d1,d0 add.w #MIDDLEX,d0 ;x pos of middle ; Need to calculate: ; Width of object in pixels ; height of object in pixels ; horizontal constants ; vertical constants. move.l #consttab,a3 moveq #0,d3 moveq #0,d4 move.b (a0)+,d3 move.b (a0)+,d4 asl.w #7,d3 asl.w #7,d4 divs d1,d3 ;width in pixels divs d1,d4 ;height in pixels sub.w d4,d2 sub.w d3,d0 cmp.w rightclipb,d0 bge objbehind add.w d3,d3 cmp.w objclipb,d2 bge objbehind add.w d4,d4 move.w d3,realwidth move.w d4,realheight * OBTAIN POINTERS TO HORIZ AND VERT * CONSTANTS FOR MOVING ACROSS AND * DOWN THE OBJECT GRAPHIC. move.w d1,d7 moveq #0,d6 move.b 6(a0),d6 add.w d6,d6 mulu d6,d7 move.b -2(a0),d6 divu d6,d7 swap d7 clr.w d7 swap d7 lea (a3,d7.l*8),a2 ; pointer to ; horiz const move.w d1,d7 move.b 7(a0),d6 add.w d6,d6 mulu d6,d7 move.b -1(a0),d6 divu d6,d7 swap d7 clr.w d7 swap d7 lea (a3,d7.l*8),a3 ; pointer to ; vertical c. * CLIP OBJECT TO TOP AND BOTTOM * OF THE VISIBLE DISPLAY moveq #0,d7 cmp.w objclipt,d2 bge.s .objfitsontop sub.w objclipt,d2 add.w d2,d4 ;new height in ;pixels ble objbehind ; nothing to draw move.w d2,d7 neg.w d7 ; factor to mult. ; constants by ; at top of obj. move.w objclipt,d2 .objfitsontop: move.w objclipb,d6 sub.w d2,d6 cmp.w d6,d4 ble.s .objfitsonbot move.w d6,d4 .objfitsonbot: subq #1,d4 blt objbehind move.l #ontoscr,a6 move.l (a6,d2.w*4),d2 add.l FASTBUFFER,d2 move.l d2,toppt move.l #WorkSpace,a5 move.l #glassball,a4 cmp.w leftclipb,d0 bge.s .okonleft sub.w leftclipb,d0 add.w d0,d3 ble objbehind move.w (a2),d1 move.w 2(a2),d2 neg.w d0 muls d0,d1 mulu d0,d2 swap d2 add.w d2,d1 asl.w #7,d1 lea (a5,d1.w),a5 lea (a4,d1.w),a4 move.w leftclipb,d0 .okonleft: move.w d0,d6 add.w d3,d6 sub.w rightclipb,d6 blt.s .okrightside sub.w #1,d3 sub.w d6,d3 .okrightside: move.l #objintocop,a1 sub.l a1,a1 move.w d0,a1 add.w a1,a1 move.w (a3),d5 move.w 2(a3),d6 muls d7,d5 mulu d7,d6 swap d6 add.w d6,d5 ; add.w 2(a0),d5 ;d5 contains ;top offset into ;each strip. add.l #$80000000,d5 move.l (a2),d6 moveq.l #0,d7 move.l a5,midobj move.l a4,midglass move.l (a3),d2 swap d2 move.l #times128,a0 movem.l d0-d7/a0-a6,-(a7) move.w d3,d1 ext.l d1 swap d1 move.w d4,d2 ext.l d2 swap d2 asr.l #6,d1 asr.l #6,d2 move.w d1,d5 move.w d2,d6 swap d1 add.w d1,d1 swap d2 muls #320*2,d2 move.l #WorkSpace,a0 move.w #63,d0 .readinto: swap d0 move.w #63,d0 move.l toppt(pc),a6 adda.w a1,a6 add.w d1,a1 add.w d5,d7 bcc.s .noadmoreh addq #2,a1 .noadmoreh: swap d7 move.w #0,d7 .readintodown: move.w (a6),d3 move.w d3,(a0)+ add.w d2,a6 add.w d6,d7 bcc.s .noadmore adda.w #320*2,a6 .noadmore: dbra d0,.readintodown swap d0 swap d7 dbra d0,.readinto ; Want to zoom an area d3*d4 ; in size up to 64*64 in size. ; move.l #WorkSpace,a0 ; move.l frompt,a2 ; move.w #104*4,d3 ; move.w #1,d6 ;.ribl ; move.w #31,d0 ;.readinto ; move.w #15,d1 ; move.l a2,a1 ;.readintodown ; move.w (a1),(a0)+ ; adda.w d3,a1 ; move.w (a1),(a0)+ ; adda.w d3,a1 ; move.w (a1),(a0)+ ; adda.w d3,a1 ; move.w (a1),(a0)+ ; adda.w d3,a1 ; dbra d1,.readintodown ;; add.w #256-128,a0 ; addq #4,a2 ; dbra d0,.readinto ; addq #4,a2 ; dbra d6,.ribl movem.l (a7)+,d0-d7/a0-a6 move.l #darkentab,a2 move.l toppt,d1 add.l a1,d1 move.l d1,toppt move.l d6,a1 moveq #0,d6 .drawrightside: swap d7 move.l midglass(pc),a4 adda.w (a0,d7.w*2),a4 swap d7 add.l a1,d7 move.l toppt(pc),a6 addq.l #2,toppt move.l d5,d1 move.w d4,-(a7) swap d3 .drawavertstrip move.w (a4,d1.w*2),d3 blt.s .itsbackground move.b (a5,d3.w*2),d6 move.b (a2,d6.w),(a6) .itsbackground adda.w #320*2,a6 addx.l d2,d1 dbra d4,.drawavertstrip swap d3 move.w (a7)+,d4 dbra d3,.drawrightside movem.l (a7)+,d0-d7/a0-a6 rts realwidth: dc.w 0 realheight: dc.w 0 midglass: dc.l 0 times128: val SET 0 REPT 100 dc.w val*128 val SET val+1 ENDR glareobj: move.w (a0)+,d0 ;pt num move.w 2(a1,d0.w*8),d1 cmp.w #25,d1 ble objbehind move.w topclip,d2 move.w botclip,d3 move.l ty3d,d6 sub.l yoff,d6 divs d1,d6 add.w MIDDLEY,d6 cmp.w d3,d6 bge objbehind cmp.w d2,d6 bge.s .okobtc move.w d2,d6 .okobtc: move.w d6,objclipt move.l by3d,d6 sub.l yoff,d6 divs d1,d6 add.w MIDDLEY,d6 cmp.w d2,d6 ble objbehind cmp.w d3,d6 ble.s .okobbc move.w d3,d6 .okobbc: move.w d6,objclipb move.l 4(a1,d0.w*8),d0 addq #2,a0 move.l #SHADINGTABLE-512,a4 move.w (a0)+,d2 ; height ext.l d2 asl.l #7,d2 sub.l yoff,d2 divs d1,d2 add.w MIDDLEY,d2 divs d1,d0 add.w #MIDDLEX,d0 ;x pos of middle ; Need to calculate: ; Width of object in pixels ; height of object in pixels ; horizontal constants ; vertical constants. move.l #consttab,a3 moveq #0,d3 moveq #0,d4 move.b (a0)+,d3 move.b (a0)+,d4 lsl.l #7,d3 lsl.l #7,d4 divs d1,d3 ;width in pixels divs d1,d4 ;height in pixels sub.w d4,d2 sub.w d3,d0 cmp.w rightclipb,d0 bge objbehind add.w d3,d3 cmp.w objclipb,d2 bge objbehind add.w d4,d4 * OBTAIN POINTERS TO HORIZ AND VERT * CONSTANTS FOR MOVING ACROSS AND * DOWN THE OBJECT GRAPHIC. move.l #Objects,a5 move.w (a0),d7 neg.w d7 asl.w #4,d7 adda.w d7,a5 ; ptr to object data. move.l (a5)+,WAD_PTR move.l (a5)+,PTR_PTR add.l 4(a5),a4 move.l (a5),a5 move.w 2(a0),d7 **************************************** ; add.w #1,2(a0) ; and.w #3,2(a0) **************************************** move.l (a5,d7.w*4),d7 move.l d7,tstddd move.w d7,DOWN_STRIP move.l PTR_PTR,a5 swap d7 adda.w d7,a5 move.w d1,d7 moveq #0,d6 move.b 6(a0),d6 add.w d6,d6 mulu d6,d7 moveq #0,d6 move.b -2(a0),d6 divu d6,d7 swap d7 clr.w d7 swap d7 lea (a3,d7.l*8),a2 ; pointer to ; horiz const move.w d1,d7 move.b 7(a0),d6 add.w d6,d6 mulu d6,d7 moveq #0,d6 move.b -1(a0),d6 divu d6,d7 swap d7 clr.w d7 swap d7 lea (a3,d7.l*8),a3 ; pointer to ; vertical c. * CLIP OBJECT TO TOP AND BOTTOM * OF THE VISIBLE DISPLAY moveq #0,d7 cmp.w objclipt,d2 bge.s objfitsontopGLARE sub.w objclipt,d2 add.w d2,d4 ;new height in ;pixels ble objbehind ; nothing to draw move.w d2,d7 neg.w d7 ; factor to mult. ; constants by ; at top of obj. move.w objclipt,d2 objfitsontopGLARE: move.w objclipb,d6 sub.w d2,d6 cmp.w d6,d4 ble.s objfitsonbotGLARE move.w d6,d4 objfitsonbotGLARE: subq #1,d4 blt objbehind move.l #ontoscr,a6 move.l (a6,d2.w*4),d2 add.l FASTBUFFER,d2 move.l d2,toppt cmp.w leftclipb,d0 bge.s okonleftGLARE sub.w leftclipb,d0 add.w d0,d3 ble objbehind move.w (a2),d1 move.w 2(a2),d2 neg.w d0 muls d0,d1 mulu d0,d2 swap d2 add.w d2,d1 lea (a5,d1.w*4),a5 move.w leftclipb,d0 okonleftGLARE: move.w d0,d6 add.w d3,d6 sub.w rightclipb,d6 blt.s okrightsideGLARE sub.w #1,d3 sub.w d6,d3 okrightsideGLARE: ext.l d0 add.l d0,toppt add.l d0,toppt move.w (a3),d5 move.w 2(a3),d6 muls d7,d5 mulu d7,d6 swap d6 add.w d6,d5 add.w DOWN_STRIP(PC),d5 ;d5 contains ;top offset into ;each strip. add.l #$80000000,d5 move.l (a2),a2 moveq.l #0,d7 move.l a5,midobj move.l (a3),d2 swap d2 move.l #0,a1 drawrightsideGLARE: swap d7 move.l midobj(pc),a5 lea (a5,d7.w*4),a5 swap d7 add.l a2,d7 move.l WAD_PTR(PC),a0 move.l toppt(pc),a6 adda.w a1,a6 addq #2,a1 move.l (a5),d1 beq blankstripGLARE and.l #$ffffff,d1 add.l d1,a0 move.b (a5),d1 cmp.b #1,d1 bgt.s ThirdThirdGLARE beq.s SecThirdGLARE move.l d5,d6 move.l d5,d1 move.w d4,-(a7) .drawavertstrip move.b 1(a0,d1.w*2),d0 and.b #%00011111,d0 beq.s .dontplotthisoneitsblack lsl.w #8,d0 move.b (a6),d0 move.w (a4,d0.w*2),(a6) .dontplotthisoneitsblack: adda.w #320*2,a6 add.l d2,d6 addx.w d2,d1 dbra d4,.drawavertstrip move.w (a7)+,d4 blankstripGLARE: dbra d3,drawrightsideGLARE bra objbehind SecThirdGLARE: move.l d5,d1 move.l d5,d6 move.w d4,-(a7) .drawavertstrip move.w (a0,d1.w*2),d0 lsr.w #5,d0 and.w #%11111,d0 beq.s .dontplotthisoneitsblack lsl.w #8,d0 move.b (a6),d0 move.w (a4,d0.w*2),(a6) .dontplotthisoneitsblack: adda.w #320*2,a6 add.l d2,d6 addx.w d2,d1 dbra d4,.drawavertstrip move.w (a7)+,d4 dbra d3,drawrightsideGLARE bra objbehind ThirdThirdGLARE: move.l d5,d1 move.l d5,d6 move.w d4,-(a7) .drawavertstrip move.b (a0,d1.w*2),d0 lsr.b #2,d0 and.b #%11111,d0 beq.s .dontplotthisoneitsblack lsl.w #8,d0 move.b (a6),d0 move.w (a4,d0.w*2),(a6) .dontplotthisoneitsblack: adda.w #320*2,a6 add.l d2,d6 addx.w d2,d1 dbra d4,.drawavertstrip move.w (a7)+,d4 dbra d3,drawrightsideGLARE movem.l (a7)+,d0-d7/a0-a6 rts BitMapObj tst.l 8(a0) blt glareobj move.w (a0)+,d0 ;pt num move.w 2(a1,d0.w*8),d1 cmp.w #25,d1 ble objbehind move.w topclip,d2 move.w botclip,d3 move.l ty3d,d6 sub.l yoff,d6 divs d1,d6 add.w MIDDLEY,d6 cmp.w d3,d6 bge objbehind cmp.w d2,d6 bge.s .okobtc move.w d2,d6 .okobtc: move.w d6,objclipt move.l by3d,d6 sub.l yoff,d6 divs d1,d6 add.w MIDDLEY,d6 cmp.w d2,d6 ble objbehind cmp.w d3,d6 ble.s .okobbc move.w d3,d6 .okobbc: move.w d6,objclipb move.l 4(a1,d0.w*8),d0 move.w d1,d6 asr.w #5,d6 add.w (a0)+,d6 bge.s brighttoonot moveq #0,d6 brighttoonot sub.l a4,a4 move.w objscalecols(pc,d6.w*2),a4 bra pastobjscale objscalecols: dcb.w 1,64*0 dcb.w 2,64*1 dcb.w 2,64*2 dcb.w 2,64*3 dcb.w 2,64*4 dcb.w 2,64*5 dcb.w 2,64*6 dcb.w 2,64*7 dcb.w 2,64*8 dcb.w 2,64*9 dcb.w 2,64*10 dcb.w 2,64*11 dcb.w 2,64*12 dcb.w 2,64*13 dcb.w 2,64*14 dcb.w 2,64*15 dcb.w 2,64*16 dcb.w 2,64*17 dcb.w 2,64*18 dcb.w 2,64*19 dcb.w 2,64*20 dcb.w 2,64*21 dcb.w 2,64*22 dcb.w 2,64*23 dcb.w 2,64*24 dcb.w 2,64*25 dcb.w 2,64*26 dcb.w 2,64*27 dcb.w 2,64*28 dcb.w 2,64*29 dcb.w 2,64*30 dcb.w 20,64*31 pastobjscale: move.w (a0)+,d2 ; height ext.l d2 asl.l #7,d2 sub.l yoff,d2 divs d1,d2 add.w MIDDLEY,d2 divs d1,d0 add.w #MIDDLEX,d0 ;x pos of middle ; Need to calculate: ; Width of object in pixels ; height of object in pixels ; horizontal constants ; vertical constants. move.l #consttab,a3 moveq #0,d3 moveq #0,d4 move.b (a0)+,d3 move.b (a0)+,d4 lsl.l #7,d3 lsl.l #7,d4 divs d1,d3 ;width in pixels divs d1,d4 ;height in pixels sub.w d4,d2 sub.w d3,d0 cmp.w rightclipb,d0 bge objbehind add.w d3,d3 cmp.w objclipb,d2 bge objbehind add.w d4,d4 * OBTAIN POINTERS TO HORIZ AND VERT * CONSTANTS FOR MOVING ACROSS AND * DOWN THE OBJECT GRAPHIC. move.l #Objects,a5 move.w (a0),d7 asl.w #4,d7 adda.w d7,a5 ; ptr to object data. move.l (a5)+,WAD_PTR move.l (a5)+,PTR_PTR add.l 4(a5),a4 move.l (a5),a5 move.w 2(a0),d7 move.l (a5,d7.w*4),d7 move.l d7,tstddd move.w d7,DOWN_STRIP move.l PTR_PTR,a5 swap d7 adda.w d7,a5 move.w d1,d7 moveq #0,d6 move.b 6(a0),d6 add.w d6,d6 mulu d6,d7 moveq #0,d6 move.b -2(a0),d6 divu d6,d7 swap d7 clr.w d7 swap d7 lea (a3,d7.l*8),a2 ; pointer to ; horiz const move.w d1,d7 move.b 7(a0),d6 add.w d6,d6 mulu d6,d7 moveq #0,d6 move.b -1(a0),d6 divu d6,d7 swap d7 clr.w d7 swap d7 lea (a3,d7.l*8),a3 ; pointer to ; vertical c. * CLIP OBJECT TO TOP AND BOTTOM * OF THE VISIBLE DISPLAY moveq #0,d7 cmp.w objclipt,d2 bge.s objfitsontop sub.w objclipt,d2 add.w d2,d4 ;new height in ;pixels ble objbehind ; nothing to draw move.w d2,d7 neg.w d7 ; factor to mult. ; constants by ; at top of obj. move.w objclipt,d2 objfitsontop: move.w objclipb,d6 sub.w d2,d6 cmp.w d6,d4 ble.s objfitsonbot move.w d6,d4 objfitsonbot: subq #1,d4 blt objbehind move.l #ontoscr,a6 move.l (a6,d2.w*4),d2 add.l FASTBUFFER,d2 move.l d2,toppt cmp.w leftclipb,d0 bge.s okonleft sub.w leftclipb,d0 add.w d0,d3 ble objbehind move.w (a2),d1 move.w 2(a2),d2 neg.w d0 muls d0,d1 mulu d0,d2 swap d2 add.w d2,d1 lea (a5,d1.w*4),a5 move.w leftclipb,d0 okonleft: move.w d0,d6 add.w d3,d6 sub.w rightclipb,d6 blt.s okrightside sub.w #1,d3 sub.w d6,d3 okrightside: ext.l d0 add.l d0,toppt add.l d0,toppt move.w (a3),d5 move.w 2(a3),d6 muls d7,d5 mulu d7,d6 swap d6 add.w d6,d5 add.w DOWN_STRIP(PC),d5 ;d5 contains ;top offset into ;each strip. add.l #$80000000,d5 move.l (a2),a2 moveq.l #0,d7 move.l a5,midobj move.l (a3),d2 swap d2 move.l #0,a1 drawrightside: swap d7 move.l midobj(pc),a5 lea (a5,d7.w*4),a5 swap d7 add.l a2,d7 move.l WAD_PTR(PC),a0 move.l toppt(pc),a6 adda.w a1,a6 addq #2,a1 move.l (a5),d1 beq blankstrip and.l #$ffffff,d1 add.l d1,a0 move.b (a5),d1 cmp.b #1,d1 bgt.s ThirdThird beq.s SecThird move.l d5,d6 move.l d5,d1 move.w d4,-(a7) .drawavertstrip move.b 1(a0,d1.w*2),d0 and.b #%00011111,d0 beq.s .dontplotthisoneitsblack move.w (a4,d0.w*2),(a6) .dontplotthisoneitsblack: adda.w #320*2,a6 add.l d2,d6 addx.w d2,d1 dbra d4,.drawavertstrip move.w (a7)+,d4 blankstrip: dbra d3,drawrightside bra.s objbehind SecThird: move.l d5,d1 move.l d5,d6 move.w d4,-(a7) .drawavertstrip move.w (a0,d1.w*2),d0 lsr.w #5,d0 and.w #%11111,d0 beq.s .dontplotthisoneitsblack move.w (a4,d0.w*2),(a6) .dontplotthisoneitsblack: adda.w #320*2,a6 add.l d2,d6 addx.w d2,d1 dbra d4,.drawavertstrip move.w (a7)+,d4 dbra d3,drawrightside bra.s objbehind ThirdThird: move.l d5,d1 move.l d5,d6 move.w d4,-(a7) .drawavertstrip move.b (a0,d1.w*2),d0 lsr.b #2,d0 and.b #%11111,d0 beq.s .dontplotthisoneitsblack move.w (a4,d0.w*2),(a6) .dontplotthisoneitsblack: adda.w #320*2,a6 add.l d2,d6 addx.w d2,d1 dbra d4,.drawavertstrip move.w (a7)+,d4 dbra d3,drawrightside objbehind: movem.l (a7)+,d0-d7/a0-a6 rts midx: dc.w 0 objpixwidth: dc.w 0 tmptst: dc.l 0 toppt: dc.l 0 doneit: dc.w 0 replaceend: dc.w 0 saveend: dc.w 0 midobj: dc.l 0 obadd: dc.l 0 DOWN_STRIP: dc.w 0 WAD_PTR: dc.l 0 PTR_PTR: dc.l 0 ds.w 100 objintocop: incbin "XTOCOPX" ds.w 100 ********************************* *************************************** ********************************* tstddd: dc.l 0 polybehind: rts objbright: dc.w 0 ObjAng: dc.w 0 PolygonObj: ************************ ; move.w 4(a0),d0 ; ypos ; move.w 2(a0),d1 ; add.w #2,d1 ; add.w d1,d0 ; cmp.w #-48,d0 ; blt nobounce ; neg.w d1 ; add.w d1,d0 ;nobounce: ; move.w d1,2(a0) ; move.w d0,4(a0) ; add.w #80*2,boxang ; and.w #8191,boxang ************************ move.w Facing(a0),ObjAng move.w (a0)+,d0 move.w 2(a1,d0.w*8),d1 ; zpos of mid ble polybehind move.w (a0),d2 move.w d1,d3 asr.w #7,d3 add.w d3,d2 move.w d2,objbright move.w topclip,d2 move.w botclip,d3 move.w d2,objclipt move.w d3,objclipb ; dont use d1 here. move.w 6(a0),d5 move.l #POLYOBJECTS,a3 move.l (a3,d5.w*4),a3 move.l a3,START_OF_OBJ ******************************************************************* *************************************************************** ***************************************************************** move.w (a3)+,num_points move.w (a3)+,d6 ; num_frames move.l a3,POINTER_TO_POINTERS lea (a3,d6.w*2),a3 move.l a3,LinesPtr moveq #0,d5 move.w 8(a0),d5 ************************************************ * Just for charles (animate automatically) ; add.w #1,d5 ; cmp.w d6,d5 ; blt.s okless ; moveq #0,d5 ;okless: ; move.w d5,8(a0) ************************************************ move.l POINTER_TO_POINTERS,a4 move.w (a4,d5.w*2),d5 add.l START_OF_OBJ,d5 move.l d5,PtsPtr move.l d5,a3 move.w num_points,d5 subq #1,d5 move.l #boxrot,a4 move.w ObjAng,d2 sub.w #2048,d2 sub.w angpos,d2 and.w #8191,d2 move.l #SineTable,a2 lea (a2,d2.w),a5 move.l #boxbrights,a6 move.w (a5),d6 move.w 2048(a5),d7 rotobj: move.w (a3),d2 ; xpt move.w 2(a3),d3 ; ypt move.w 4(a3),d4 ; zpt add.w d2,d2 add.w d3,d3 add.w d4,d4 ; first rotate around z axis. ; move.w d2,d6 ; move.w d3,d7 ; muls 2048(a2),d3 ; muls (a2),d2 ; sub.l d3,d2 ; newx ; muls (a2),d7 ; muls 2048(a2),d6 ; add.l d7,d6 ; newy ; add.l d6,d6 ; swap d6 ; add.l d2,d2 ; swap d2 ; move.w d6,d3 ; newy muls d7,d4 muls d6,d2 sub.l d4,d2 asr.l #8,d2 move.l d2,(a4)+ ext.l d3 asl.l #7,d3 move.l d3,(a4)+ move.w (a3),d2 move.w 4(a3),d4 muls d6,d4 muls d7,d2 add.l d2,d4 add.l d4,d4 add.l d4,d4 swap d4 move.w d4,(a4)+ add.w #20,d4 asr.w #2,d4 move.w d4,(a6)+ addq #6,a3 dbra d5,rotobj move.l 4(a1,d0.w*8),d0 ; xpos of mid move.w num_points,d7 move.l #boxrot,a2 move.l #boxonscr,a3 move.l #boxbrights,a6 move.w 2(a0),d2 subq #1,d7 ext.l d2 asl.l #7,d2 sub.l yoff,d2 convtoscr move.l (a2),d3 add.l d0,d3 move.l d3,(a2)+ move.l (a2),d4 add.l d2,d4 move.l d4,(a2)+ move.w (a2),d5 add.w d1,d5 ble polybehind move.w d5,(a2)+ divs d5,d3 divs d5,d4 add.w #MIDDLEX,d3 add.w MIDDLEY,d4 move.w d3,(a3)+ move.w d4,(a3)+ move.w (a6),d3 cmp.w #31,d3 ble.s okdark move.w #31,d3 okdark: cmp.w #0,d3 bge.s okbr move.w #0,d3 okbr: move.w d3,(a6)+ dbra d7,convtoscr move.l LinesPtr,a1 ; Now need to sort parts of object ; into order. move.l #PartBuffer,a0 move.l a0,a2 move.w #31,d0 clrpartbuff: move.w #$8001,(a2) addq #4,a2 dbra d0,clrpartbuff move.l #boxrot,a2 PutinParts move.w (a1)+,d7 blt doneallparts move.w (a1)+,d6 move.l (a2,d6.w),d0 asr.l #7,d0 muls d0,d0 move.l 4(a2,d6.w),d2 asr.l #7,d2 muls d2,d2 add.l d2,d0 move.w 8(a2,d6.w),d2 muls d2,d2 add.l d2,d0 move.l #PartBuffer-8,a0 stillfront addq #8,a0 cmp.l (a0),d0 blt stillfront move.l #endparttab-8,a5 domoreshift: move.l -8(a5),(a5) move.l -4(a5),4(a5) subq #8,a5 cmp.l a0,a5 bgt.s domoreshift move.l d0,(a0) move.w d7,4(a0) bra PutinParts doneallparts: move.l #PartBuffer,a0 Partloop: move.l (a0)+,d7 blt nomoreparts moveq #0,d0 move.w (a0),d0 addq #4,a0 add.l START_OF_OBJ,d0 move.l d0,a1 move.w #0,firstpt polyloo: tst.w (a1) blt.s nomorepolys movem.l a0/a1/d7,-(a7) bsr doapoly movem.l (a7)+,a0/a1/d7 move.w (a1),d0 lea 18(a1,d0.w*4),a1 bra.s polyloo nomorepolys bra Partloop nomoreparts: rts firstpt: dc.w 0 PartBuffer: ds.w 2*32 endparttab: polybright: dc.l 0 doapoly: move.w #960,Left move.w #-10,Right move.w (a1)+,d7 ; lines to draw move.w (a1)+,preholes move.w 12(a1,d7.w*4),pregour move.l #boxonscr,a3 move.w firstpt(pc),d0 lea (a3,d0.w*4),a3 move.w (a1),d0 move.w 4(a1),d1 move.w 8(a1),d2 move.w 2(a3,d0.w*4),d3 move.w 2(a3,d1.w*4),d4 move.w 2(a3,d2.w*4),d5 move.w (a3,d0.w*4),d0 move.w (a3,d1.w*4),d1 move.w (a3,d2.w*4),d2 sub.w d1,d0 ;x1 sub.w d1,d2 ;x2 sub.w d4,d3 ;y1 sub.w d4,d5 ;y2 muls d3,d2 muls d5,d0 sub.l d0,d2 ble polybehind move.l d2,polybright clr.b drawit tst.b Gouraud(pc) bne.s usegour bsr putinlines bra.s dontusegour usegour: bsr putingourlines dontusegour: move.w #320*2,linedir move.l FASTBUFFER,a6 tst.b drawit(pc) beq polybehind move.l #PolyTopTab,a4 move.w Left(pc),d1 move.w Right(pc),d7 move.w leftclipb,d3 move.w rightclipb,d4 cmp.w d3,d7 ble polybehind cmp.w d4,d1 bge polybehind cmp.w d3,d1 bge .notop move.w d3,d1 .notop cmp.w d4,d7 ble .nobot move.w d4,d7 .nobot lea (a4,d1.w*8),a4 sub.w d1,d7 ble polybehind move.w d1,a2 add.w a2,a2 ; move.l #objintocop,a2 ; lea (a2,d1.w*2),a2 moveq #0,d0 move.w (a1)+,a0 add.l #TextureMaps,a0 move.l polybright,d1 asl.l #4,d1 divs (a1)+,d1 tst.b Holes bne gotholesin tst.b Gouraud(pc) bne gotlurvelyshading move.l #objscalecols,a1 neg.w d1 add.w #14,d1 move.w objbright(pc),d0 add.w d0,d1 bge.s toobright move.w #0,d1 toobright: move.w (a1,d1.w*2),d1 asl.w #3,d1 move.l #TexturePal,a1 add.w d1,a1 dopoly: move.w #0,offtopby move.l a6,a3 adda.w a2,a3 addq #2,a2 move.w (a4),d1 cmp.w objclipb,d1 bge nodl move.w PolyBotTab-PolyTopTab(a4),d2 cmp.w objclipt,d2 ble nodl cmp.w objclipt,d1 bge.s nocl move.w objclipt,d3 sub.w d1,d3 move.w d3,offtopby move.w objclipt,d1 nocl: move.w d2,d0 cmp.w objclipb,d2 ble.s nocr move.w objclipb,d2 nocr: ; d1=top end ; d2=bot end move.w 2+PolyBotTab-PolyTopTab(a4),d3 move.w 4+PolyBotTab-PolyTopTab(a4),d4 moveq #0,d5 move.w 2(a4),d5 move.w 4(a4),d6 sub.w d5,d3 sub.w d6,d4 asl.w #8,d3 asl.w #8,d4 ext.l d3 ext.l d4 and.b #63,d5 and.b #63,d6 lsl.w #8,d6 move.b d5,d6 ; starting pos moveq.l #0,d5 move.w d6,d5 sub.w d1,d2 ble nodl move.w #0,tstdca sub.w d1,d0 tst.w offtopby beq.s .notofftop move.l d3,-(a7) move.l d4,-(a7) add.w offtopby,d0 muls offtopby,d3 muls offtopby,d4 divs d0,d3 divs d0,d4 asl.l #8,d3 asl.l #8,d4 move.w d3,tstdca swap d3 swap d4 and.w #63,d3 and.w #63,d4 asl.w #8,d4 move.b d3,d4 add.l d4,d5 move.l (a7)+,d4 move.l (a7)+,d3 .notofftop: divs d0,d3 divs d0,d4 ext.l d3 ext.l d4 asl.l #8,d3 asl.l #8,d4 move.w d3,a5 swap d3 swap d4 asl.w #8,d4 move.b d3,d4 move.l d4,d6 add.w #256,d6 move.w tstdca,d3 add.l ontoscr(pc,d1.w*4),a3 move.w #63*256+63,d1 and.w d1,d4 and.w d1,d6 moveq #0,d0 subq #1,d2 drawpol: and.w d1,d5 move.b (a0,d5.w*4),d0 move.w (a1,d0.w*2),(a3) adda.w #320*2,a3 add.w a5,d3 addx.l d6,d5 dbcs d2,drawpol2 dbcc d2,drawpol bra.s pastit drawpol2: and.w d1,d5 move.b (a0,d5.w*4),d0 move.w (a1,d0.w*2),(a3) adda.w #320*2,a3 add.w a5,d3 addx.l d4,d5 dbcs d2,drawpol2 dbcc d2,drawpol pastit: nodl: addq #8,a4 dbra d7,dopoly rts ontoscr: val SET 0 REPT 256 dc.l val val SET val+320*2 ENDR tstdca: dc.l 0 offtopby: dc.w 0 LinesPtr: dc.l 0 PtsPtr: dc.l 0 gotlurvelyshading: move.l #TexturePal,a1 ; neg.w d1 ; add.w #14,d1 ; bge.s toobrightg ; move.w #0,d1 ;toobrightg: ; asl.w #8,d1 ; lea (a1,d1.w*2),a1 dopolyg: move.l a6,a3 move.w #0,offtopby adda.w a2,a3 addq #2,a2 move.w (a4),d1 cmp.w objclipb,d1 bge nodlg moveq #0,d2 move.w PolyBotTab-PolyTopTab(a4),d2 cmp.w objclipt(pc),d2 ble nodlg cmp.w objclipt(pc),d1 bge.s noclg move.w objclipt,d3 sub.w d1,d3 move.w d3,offtopby move.w objclipt(pc),d1 noclg: move.w d2,d0 cmp.w objclipb(pc),d2 ble.s nocrg move.w objclipb(pc),d2 nocrg: ; d1=top end ; d2=bot end move.w 2+PolyBotTab-PolyTopTab(a4),d3 move.w 4+PolyBotTab-PolyTopTab(a4),d4 moveq #0,d5 move.w 2(a4),d5 move.w 4(a4),d6 sub.w d5,d3 sub.w d6,d4 asl.w #8,d3 asl.w #8,d4 ext.l d3 ext.l d4 and.b #63,d5 and.b #63,d6 lsl.w #8,d6 move.b d5,d6 ; starting pos moveq.l #0,d5 move.w d6,d5 sub.w d1,d2 ble nodlg move.w #0,tstdca sub.w d1,d0 tst.w offtopby beq.s .notofftop move.l d3,-(a7) move.l d4,-(a7) add.w offtopby,d0 muls offtopby,d3 muls offtopby,d4 divs d0,d3 divs d0,d4 asl.l #8,d3 asl.l #8,d4 move.w d3,tstdca swap d3 swap d4 and.w #63,d3 and.w #63,d4 asl.w #8,d4 move.b d3,d4 add.l d4,d5 move.l (a7)+,d4 move.l (a7)+,d3 .notofftop divs d0,d3 divs d0,d4 ext.l d3 ext.l d4 asl.l #8,d3 asl.l #8,d4 add.l ontoscrg(pc,d1.w*4),a3 move.w 6+PolyBotTab-PolyTopTab(a4),d1 move.w 6(a4),d6 sub.w d6,d1 swap d1 clr.w d1 asr.l #8,d1 divs d0,d1 asl.l #8,d1 swap d1 asl.w #8,d1 move.w d3,d0 swap d0 move.w d1,d0 move.w d2,d1 move.l d1,d2 move.l d0,a5 move.w tstdca,d0 swap d0 move.w d6,d0 asl.w #8,d0 swap d3 swap d4 asl.w #8,d4 move.b d3,d4 move.l d4,d6 add.w #256,d6 moveq #0,d1 move.w #63*256+63,d1 and.w d1,d4 and.w d1,d6 dbra d2,drawpolg ontoscrg: val SET 0 REPT 256 dc.l val val SET val+320*2 ENDR drawpolg: and.w #63*256+63,d5 move.b (a0,d5.w*4),d0 move.w (a1,d0.w*2),(a3) adda.w #320*2,a3 add.l d2,d1 bcc.s nonewb add.w #256,d0 nonewb: add.l a5,d0 addx.l d6,d5 dbcs d2,drawpol2g dbcc d2,drawpolg bra.s pastitg drawpol2g: and.w #63*256+63,d5 move.b (a0,d5.w*4),d0 move.w (a1,d0.w*2),(a3) adda.w #320*2,a3 add.l d2,d1 bcc.s nonewb2 add.w #256,d0 nonewb2: add.l a5,d0 addx.l d4,d5 dbcs d2,drawpol2g dbcc d2,drawpolg pastitg: nodlg: addq #8,a4 dbra d7,dopolyg rts gotholesin: move.l #TexturePal,a1 neg.w d1 add.w #14,d1 bge.s toobrighth move.w #0,d1 toobrighth: asl.w #8,d1 lea (a1,d1.w*2),a1 dopolyh: move.l a6,a3 adda.w (a2)+,a3 move.w (a4),d1 cmp.w objclipb,d1 bge nodlh move.w PolyBotTab-PolyTopTab(a4),d2 cmp.w objclipt,d2 ble nodlh cmp.w objclipt,d1 bge.s noclh move.w objclipt,d1 noclh: move.w d2,d0 cmp.w objclipb,d2 ble.s nocrh move.w objclipb,d2 nocrh: ; d1=top end ; d2=bot end move.w 2+PolyBotTab-PolyTopTab(a4),d3 move.w 4+PolyBotTab-PolyTopTab(a4),d4 moveq #0,d5 move.w 2(a4),d5 move.w 4(a4),d6 sub.w d5,d3 sub.w d6,d4 asl.w #8,d3 asl.w #8,d4 ext.l d3 ext.l d4 and.b #63,d5 and.b #63,d6 lsl.w #8,d6 move.b d5,d6 ; starting pos moveq #-1,d5 lsr.l #1,d5 move.w d6,d5 sub.w d1,d2 ble nodlh sub.w d1,d0 divs d0,d3 divs d0,d4 ext.l d3 ext.l d4 asl.l #8,d3 asl.l #8,d4 move.w d3,a5 swap d3 swap d4 asl.w #8,d4 move.b d3,d4 move.l d4,d6 add.w #256,d6 moveq #-1,d3 lsr.w #1,d3 add.l ontoscrh(pc,d1.w*4),a3 move.w #63*256+63,d1 and.w d1,d4 and.w d1,d6 moveq #0,d0 subq #1,d2 drawpolh: and.w d1,d5 move.b (a0,d5.w*4),d0 beq.s dontplot move.w (a1,d0.w*2),(a3) dontplot: adda.w #104*4,a3 add.w a5,d3 addx.l d6,d5 dbcs d2,drawpol2h dbcc d2,drawpolh bra.s pastith drawpol2h: and.w d1,d5 move.b (a0,d5.w*4),d0 beq.s dontplot2 move.w (a1,d0.w*2),(a3) dontplot2: adda.w #104*4,a3 add.w a5,d3 addx.l d4,d5 dbcs d2,drawpol2h dbcc d2,drawpolh pastith: nodlh: addq #8,a4 dbra d7,dopolyh rts ontoscrh: val SET 0 REPT 160 dc.l val val SET val+192*4 ENDR EVEN pregour: dc.b 0 Gouraud: dc.b 0 preholes: dc.b 0 Holes: dc.b 0 putinlines: move.w (a1),d0 move.w 4(a1),d1 move.w (a3,d0.w*4),d2 move.w 2(a3,d0.w*4),d3 move.w (a3,d1.w*4),d4 move.w 2(a3,d1.w*4),d5 cmp.w d2,d4 beq thislineflat bgt thislineontop move.l #PolyBotTab,a4 exg d2,d4 exg d3,d5 cmp.w rightclipb,d2 bge thislineflat cmp.w leftclipb,d4 ble thislineflat move.w rightclipb,d6 sub.w d4,d6 ble.s .clipr move.w #0,-(a7) cmp.w Right(pc),d4 ble.s .nonewbot move.w d4,Right bra.s .nonewbot .clipr move.w d6,-(a7) move.w rightclipb,Right sub.w #1,Right .nonewbot: move.w #0,offleftby move.w d2,d6 cmp.w leftclipb,d6 bge .okt move.w leftclipb,d6 sub.w d2,d6 move.w d6,offleftby add.w d2,d6 .okt: st drawit lea (a4,d6.w*8),a4 cmp.w Left(pc),d6 bge.s .nonewtop move.w d6,Left .nonewtop sub.w d3,d5 ; dy swap d3 clr.w d3 ; d2=xpos sub.w d2,d4 ; dx > 0 swap d5 clr.w d5 asr.l #8,d5 divs d4,d5 ext.l d5 asl.l #8,d5 ; dx constant moveq #0,d2 move.b 2(a1),d2 moveq #0,d6 move.b 6(a1),d6 sub.w d6,d2 swap d2 swap d6 clr.w d2 clr.w d6 ; d6=xbitpos asr.l #8,d2 divs d4,d2 ext.l d2 asl.l #8,d2 ; d3=xbitconst move.l d5,a5 ; a5=dy constant move.l d2,a6 ; a6=xbitconst moveq #0,d5 move.b 3(a1),d5 moveq #0,d2 move.b 7(a1),d2 sub.w d2,d5 swap d2 swap d5 clr.w d2 ; d3=ybitpos clr.w d5 asr.l #8,d5 divs d4,d5 ext.l d5 asl.l #8,d5 ; d4=ybitconst add.w (a7)+,d4 sub.w offleftby(pc),d4 blt thislineflat tst.w offleftby(pc) beq.s .noneoffleft move.w d4,-(a7) move.w offleftby(pc),d4 dbra d4,.calcnodraw bra .nodrawoffleft .calcnodraw add.l a5,d3 add.l a6,d6 add.l d5,d2 dbra d4,.calcnodraw .nodrawoffleft: move.w (a7)+,d4 .noneoffleft: .putinline: swap d3 move.w d3,(a4)+ swap d3 swap d6 move.w d6,(a4)+ swap d6 swap d2 move.w d2,(a4) addq #4,a4 swap d2 add.l a5,d3 add.l a6,d6 add.l d5,d2 dbra d4,.putinline bra thislineflat thislineontop: move.l #PolyTopTab,a4 cmp.w rightclipb,d2 bge thislineflat cmp.w leftclipb,d4 ble thislineflat move.w rightclipb,d6 sub.w d4,d6 ble.s .clipr move.w #0,-(a7) cmp.w Right(pc),d4 ble.s .nonewbot move.w d4,Right bra.s .nonewbot .clipr move.w d6,-(a7) move.w rightclipb,Right sub.w #1,Right .nonewbot: move.w #0,offleftby move.w d2,d6 cmp.w leftclipb,d6 bge .okt move.w leftclipb,d6 sub.w d2,d6 move.w d6,offleftby add.w d2,d6 .okt: st drawit lea (a4,d6.w*8),a4 cmp.w Left(pc),d6 bge.s .nonewtop move.w d6,Left .nonewtop sub.w d3,d5 ; dy swap d3 clr.w d3 ; d2=xpos sub.w d2,d4 ; dx > 0 swap d5 clr.w d5 asr.l #8,d5 divs d4,d5 ext.l d5 asl.l #8,d5 ; dx constant moveq #0,d2 move.b 6(a1),d2 moveq #0,d6 move.b 2(a1),d6 sub.w d6,d2 swap d2 swap d6 clr.w d2 clr.w d6 ; d6=xbitpos asr.l #8,d2 divs d4,d2 ext.l d2 asl.l #8,d2 ; d3=xbitconst move.l d5,a5 ; a5=dy constant move.l d2,a6 ; a6=xbitconst moveq #0,d5 move.b 7(a1),d5 moveq #0,d2 move.b 3(a1),d2 sub.w d2,d5 swap d2 swap d5 clr.w d2 ; d3=ybitpos clr.w d5 asr.l #8,d5 divs d4,d5 ext.l d5 asl.l #8,d5 ; d4=ybitconst add.w (a7)+,d4 sub.w offleftby(pc),d4 blt.s thislineflat tst.w offleftby(pc) beq.s .noneoffleft move.w d4,-(a7) move.w offleftby(pc),d4 dbra d4,.calcnodraw bra .nodrawoffleft .calcnodraw add.l a5,d3 add.l a6,d6 add.l d5,d2 dbra d4,.calcnodraw .nodrawoffleft: move.w (a7)+,d4 .noneoffleft: .putinline: swap d3 move.w d3,(a4)+ swap d3 swap d6 move.w d6,(a4)+ swap d6 swap d2 move.w d2,(a4) addq #4,a4 swap d2 add.l a5,d3 add.l a6,d6 add.l d5,d2 dbra d4,.putinline thislineflat: addq #4,a1 dbra d7,putinlines addq #4,a1 rts putingourlines: move.l #boxbrights,a2 move.w firstpt,d0 lea (a2,d0.w*2),a2 piglloop: move.w (a1),d0 move.w 4(a1),d1 move.w (a3,d0.w*4),d2 move.w 2(a3,d0.w*4),d3 move.w (a3,d1.w*4),d4 move.w 2(a3,d1.w*4),d5 cmp.w d2,d4 beq thislineflatgour bgt thislineontopgour move.l #PolyBotTab,a4 exg d2,d4 exg d3,d5 cmp.w rightclipb,d2 bge thislineflatgour cmp.w leftclipb,d4 ble thislineflatgour move.w rightclipb,d6 sub.w d4,d6 ble.s .clipr move.w #0,-(a7) cmp.w Right(pc),d4 ble.s .nonewbot move.w d4,Right bra.s .nonewbot .clipr move.w d6,-(a7) move.w rightclipb,Right sub.w #1,Right .nonewbot: move.w #0,offleftby move.w d2,d6 cmp.w leftclipb,d6 bge .okt move.w leftclipb,d6 sub.w d2,d6 move.w d6,offleftby add.w d2,d6 .okt: st drawit lea (a4,d6.w*8),a4 cmp.w Left(pc),d6 bge.s .nonewtop move.w d6,Left .nonewtop sub.w d3,d5 ; dy swap d3 clr.w d3 ; d2=xpos sub.w d2,d4 ; dx > 0 swap d5 clr.w d5 asr.l #8,d5 divs d4,d5 ext.l d5 asl.l #8,d5 ; dx constant moveq #0,d2 move.b 2(a1),d2 moveq #0,d6 move.b 6(a1),d6 sub.w d6,d2 swap d2 swap d6 clr.w d2 clr.w d6 ; d6=xbitpos asr.l #8,d2 divs d4,d2 ext.l d2 asl.l #8,d2 ; d3=xbitconst move.l d5,a5 ; a5=dy constant move.l d2,a6 ; a6=xbitconst moveq #0,d5 move.b 3(a1),d5 moveq #0,d2 move.b 7(a1),d2 sub.w d2,d5 swap d2 swap d5 clr.w d2 ; d3=ybitpos clr.w d5 asr.l #8,d5 divs d4,d5 ext.l d5 asl.l #8,d5 ; d4=ybitconst move.w (a2,d1.w*2),d1 move.w (a2,d0.w*2),d0 sub.w d1,d0 swap d0 swap d1 clr.w d0 clr.w d1 asr.l #8,d0 divs d4,d0 ext.l d0 asl.l #8,d0 add.w (a7)+,d4 sub.w offleftby(pc),d4 blt thislineflatgour tst.w offleftby(pc) beq.s .noneoffleft move.w d4,-(a7) move.w offleftby(pc),d4 dbra d4,.calcnodraw bra .nodrawoffleft .calcnodraw add.l d0,d1 add.l a5,d3 add.l a6,d6 add.l d5,d2 dbra d4,.calcnodraw .nodrawoffleft: move.w (a7)+,d4 .noneoffleft: .putinline: swap d3 move.w d3,(a4)+ swap d3 swap d6 move.w d6,(a4)+ swap d6 swap d2 move.w d2,(a4)+ swap d2 swap d1 move.w d1,(a4)+ swap d1 add.l d0,d1 add.l a5,d3 add.l a6,d6 add.l d5,d2 dbra d4,.putinline bra thislineflatgour thislineontopgour: move.l #PolyTopTab,a4 cmp.w rightclipb,d2 bge thislineflatgour cmp.w leftclipb,d4 ble thislineflatgour move.w rightclipb,d6 sub.w d4,d6 ble.s .clipr move.w #0,-(a7) cmp.w Right(pc),d4 ble.s .nonewbot move.w d4,Right bra.s .nonewbot .clipr move.w d6,-(a7) move.w rightclipb,Right sub.w #1,Right .nonewbot: move.w #0,offleftby move.w d2,d6 cmp.w leftclipb,d6 bge .okt move.w leftclipb,d6 sub.w d2,d6 move.w d6,offleftby add.w d2,d6 .okt: st drawit lea (a4,d6.w*8),a4 cmp.w Left(pc),d6 bge.s .nonewtop move.w d6,Left .nonewtop sub.w d3,d5 ; dy swap d3 clr.w d3 ; d2=xpos sub.w d2,d4 ; dx > 0 swap d5 clr.w d5 asr.l #8,d5 divs d4,d5 ext.l d5 asl.l #8,d5 ; dx constant moveq #0,d2 move.b 6(a1),d2 moveq #0,d6 move.b 2(a1),d6 sub.w d6,d2 swap d2 swap d6 clr.w d2 clr.w d6 ; d6=xbitpos asr.l #8,d2 divs d4,d2 ext.l d2 asl.l #8,d2 ; d3=xbitconst move.l d5,a5 ; a5=dy constant move.l d2,a6 ; a6=xbitconst moveq #0,d5 move.b 7(a1),d5 moveq #0,d2 move.b 3(a1),d2 sub.w d2,d5 swap d2 swap d5 clr.w d2 ; d3=ybitpos clr.w d5 asr.l #8,d5 divs d4,d5 ext.l d5 asl.l #8,d5 ; d4=ybitconst move.w (a2,d1.w*2),d1 move.w (a2,d0.w*2),d0 sub.w d0,d1 swap d0 swap d1 clr.w d0 clr.w d1 asr.l #8,d1 divs d4,d1 ext.l d1 asl.l #8,d1 add.w (a7)+,d4 sub.w offleftby(pc),d4 blt.s thislineflatgour tst.w offleftby(pc) beq.s .noneoffleft move.w d4,-(a7) move.w offleftby(pc),d4 dbra d4,.calcnodraw bra .nodrawoffleft .calcnodraw add.l d1,d0 add.l a5,d3 add.l a6,d6 add.l d5,d2 dbra d4,.calcnodraw .nodrawoffleft: move.w (a7)+,d4 .noneoffleft: .putinline: swap d3 move.w d3,(a4)+ swap d3 swap d6 move.w d6,(a4)+ swap d6 swap d2 move.w d2,(a4)+ swap d2 swap d0 move.w d0,(a4)+ swap d0 add.l d1,d0 add.l a5,d3 add.l a6,d6 add.l d5,d2 dbra d4,.putinline thislineflatgour: addq #4,a1 dbra d7,piglloop addq #4,a1 rts offleftby: dc.w 0 Left: dc.w 0 Right: dc.w 0 POINTER_TO_POINTERS: dc.l 0 START_OF_OBJ: dc.l 0 num_points: dc.w 0 POLYOBJECTS: dc.l Spider_des dc.l Medi_des dc.l Exit_des dc.l Crate_des dc.l Terminal_des dc.l Blue_des dc.l Green_des dc.l Red_des dc.l Yellow_des dc.l Gas_des dc.l Torch_des Spider_des: incbin "ab3:vectobj/robot" Medi_des: incbin "ab3:includes/medipac.vec" Exit_des: incbin "ab3:vectobj/exitsign Crate_des: incbin "ab3:vectobj/mug" Terminal_des: incbin "ab3:includes/terminal.vec" Blue_des: incbin "ab3:vectobj/blueind" Green_des: incbin "ab3:vectobj/Greenind" Red_des: incbin "ab3:vectobj/Redind" Yellow_des: incbin "ab3:vectobj/yellowind" Gas_des: incbin "ab3:vectobj/gaspipe" Torch_des: incbin "ab3:vectobj/torch" boxonscr: ds.l 250*2 boxrot: ds.l 3*250 boxbrights: dc.w 0 dc.w 12 dc.w 12 dc.w 12 dc.w 12 dc.w 0 ds.w 50 boxang: dc.w 0 ds.w 320*4 PolyBotTab: ds.w 320*4 ds.w 320*4 PolyTopTab: ds.w 320*4 ds.w 320*4 offset: dc.w 0 timer: dc.w 0 Objects: ; Lookup table for OBJECT GRAPHIC TYPE ; in object data (offset 8) ;0 dc.l ALIEN_WAD,ALIEN_PTR,ALIEN_FRAMES,ALIEN_PAL ;1 dc.l PICKUPS_WAD,PICKUPS_PTR,PICKUPS_FRAMES,PICKUPS_PAL ;2 dc.l BIGBULLET_WAD,BIGBULLET_PTR,BIGBULLET_FRAMES,BIGBULLET_PAL ;3 dc.l UGLYMONSTER_WAD,UGLYMONSTER_PTR,UGLYMONSTER_FRAMES,UGLYMONSTER_PAL ;4 dc.l FLYINGMONSTER_WAD,FLYINGMONSTER_PTR,FLYINGMONSTER_FRAMES,FLYINGMONSTER_PAL ;5 dc.l KEYS_WAD,KEYS_PTR,KEYS_FRAMES,KEYS_PAL ;6 dc.l ROCKETS_WAD,ROCKETS_PTR,ROCKETS_FRAMES,ROCKETS_PAL ;7 dc.l BARREL_WAD,BARREL_PTR,BARREL_FRAMES,BARREL_PAL ;8 dc.l BIGBULLET_WAD,BIGBULLET_PTR,EXPLOSION_FRAMES,EXPLOSION_PAL ;9 dc.l GUNS_WAD,GUNS_PTR,GUNS_FRAMES,GUNS_PAL ;10: dc.l MARINE_WAD,MARINE_PTR,MARINE_FRAMES,MARINE_PAL ;11: dc.l BIGALIEN_WAD,BIGALIEN_PTR,BIGALIEN_FRAMES,BIGALIEN_PAL ;12: dc.l 0,0,LAMPS_FRAMES,LAMPS_PAL ;13: dc.l 0,0,WORM_FRAMES,WORM_PAL ;14: dc.l 0,0,BIGCLAWS_FRAMES,BIGCLAWS_PAL ;15: dc.l 0,0,TREE_FRAMES,TREE_PAL ;16: dc.l 0,0,TOUGHMARINE_FRAMES,TOUGHMARINE_PAL ;17: dc.l 0,0,FLAMEMARINE_FRAMES,FLAMEMARINE_PAL ;18: dc.l 0,0,GLARE_FRAMES,0 GLARE_FRAMES: dc.w 0,0 dc.w 32*4,0 dc.w 32*4*2,0 dc.w 32*4*3,0 dc.w 0,32 dc.w 32*4,32 dc.w 32*4*2,32 dc.w 32*4*3,32 ALIEN_WAD: ; incbin "ALIEN2.wad" ALIEN_PTR: ; incbin "ALIEN2.ptr" ALIEN_FRAMES: ; walking=0-3 dc.w 0,0 dc.w 64*4,0 dc.w 64*4*2,0 dc.w 64*4*3,0 dc.w 64*4*4,0 dc.w 64*4*5,0 dc.w 64*4*6,0 dc.w 64*4*7,0 dc.w 64*4*8,0 dc.w 64*4*9,0 dc.w 64*4*10,0 dc.w 64*4*11,0 dc.w 64*4*12,0 dc.w 64*4*13,0 dc.w 64*4*14,0 dc.w 64*4*15,0 ;Exploding=16-31 dc.w 4*(64*16),0 dc.w 4*(64*16+16),0 dc.w 4*(64*16+32),0 dc.w 4*(64*16+48),0 dc.w 4*(64*16),16 dc.w 4*(64*16+16),16 dc.w 4*(64*16+32),16 dc.w 4*(64*16+48),16 dc.w 4*(64*16),32 dc.w 4*(64*16+16),32 dc.w 4*(64*16+32),32 dc.w 4*(64*16+48),32 dc.w 4*(64*16),48 dc.w 4*(64*16+16),48 dc.w 4*(64*16+32),48 dc.w 4*(64*16+48),48 ;dying=32-33 dc.w 64*4*17,0 dc.w 64*4*18,0 ALIEN_PAL: incbin "alien2.256pal" PICKUPS_WAD: ; incbin "Pickups.wad" PICKUPS_PTR: ; incbin "PICKUPS.ptr" PICKUPS_FRAMES: ; medikit=0 dc.w 0,0 ; big gun=1 dc.w 0,32 ; bullet=2 dc.w 64*4,32 ; Ammo=3 dc.w 32*4,0 ;battery=4 dc.w 64*4,0 ;Rockets=5 dc.w 192*4,0 ;gunpop=6-16 dc.w 128*4,0 dc.w (128+16)*4,0 dc.w (128+32)*4,0 dc.w (128+48)*4,0 dc.w 128*4,16 dc.w (128+16)*4,16 dc.w (128+32)*4,16 dc.w (128+48)*4,16 dc.w 128*4,32 dc.w (128+16)*4,32 dc.w (128+32)*4,32 dc.w (64+16)*4,32 dc.w (64*4),48 dc.w (64+16)*4,48 ; RocketLauncher=20 dc.w (64+32)*4,0 ;grenade = 21-24 dc.w 64*4,32 dc.w (64+16)*4,32 dc.w (64+16)*4,48 dc.w 64*4,48 ; shotgun = 25 dc.w 128*4,32 ; grenade launcher =26 dc.w 256*4,0 ; shotgun shells*4=27 dc.w 64*3*4,32 ; shotgun shells*20=28 dc.w (64*3+32)*4,0 ; grenade clip=29 dc.w (64*3+32)*4,32 PICKUPS_PAL: incbin "PICKUPS.256pal" BIGBULLET_WAD: ; incbin "bigbullet.wad" BIGBULLET_PTR: ; incbin "bigbullet.ptr" BIGBULLET_FRAMES: dc.w 0,0 dc.w 0,32 dc.w 32*4,0 dc.w 32*4,32 dc.w 64*4,0 dc.w 64*4,32 dc.w 96*4,0 dc.w 96*4,32 dc.w 128*4,0 dc.w 128*4,32 dc.w 32*5*4,0 dc.w 32*5*4,32 dc.w 32*6*4,0 dc.w 32*6*4,32 dc.w 32*7*4,0 dc.w 32*7*4,32 dc.w 32*8*4,0 dc.w 32*8*4,32 dc.w 32*9*4,0 dc.w 32*9*4,32 BIGBULLET_PAL incbin "bigbullet.256pal" EXPLOSION_FRAMES: dc.w 0,0 dc.w 64*4,0 dc.w 64*4*2,0 dc.w 64*4*3,0 dc.w 64*4*4,0 dc.w 64*4*5,0 dc.w 64*4*6,0 dc.w 64*4*7,0 dc.w 64*4*8,0 EXPLOSION_PAL incbin "explosion.256pal" UGLYMONSTER_WAD: ; incbin "uglymonster.wad" UGLYMONSTER_PTR: ; incbin "uglymonster.ptr" UGLYMONSTER_FRAMES: dc.w 0,0 UGLYMONSTER_PAL: incbin "uglymonster.pal" FLYINGMONSTER_WAD: ; incbin "FLYINGalien.wad" FLYINGMONSTER_PTR: ; incbin "FLYINGalien.ptr" FLYINGMONSTER_FRAMES: dc.w 0,0 dc.w 64*4,0 dc.w 64*4*2,0 dc.w 64*4*3,0 dc.w 64*4*4,0 dc.w 64*4*5,0 dc.w 64*4*6,0 dc.w 64*4*7,0 dc.w 64*4*8,0 dc.w 64*4*9,0 dc.w 64*4*10,0 dc.w 64*4*11,0 dc.w 64*4*12,0 dc.w 64*4*13,0 dc.w 64*4*14,0 dc.w 64*4*15,0 dc.w 64*4*16,0 dc.w 64*4*17,0 dc.w 64*4*18,0 dc.w 64*4*19,0 dc.w 64*4*20,0 FLYINGMONSTER_PAL: incbin "FLYINGalien.256pal" KEYS_WAD: ; incbin "keys.wad" KEYS_PTR: ; incbin "KEYS.PTR" KEYS_FRAMES: dc.w 0,0 dc.w 0,32 dc.w 32*4,0 dc.w 32*4,32 KEYS_PAL: incbin "keys.256pal" ROCKETS_WAD: ; incbin "ROCKETS.wad" ROCKETS_PTR: ; incbin "ROCKETS.ptr" ROCKETS_FRAMES: ;rockets=0 to 3 dc.w 0,0 dc.w 32*4,0 dc.w 0,32 dc.w 32*4,32 ;Green bullets = 4 to 7 dc.w 64*4,0 dc.w (64+32)*4,0 dc.w 64*4,32 dc.w (64+32)*4,32 ;Blue Bullets = 8 to 11 dc.w 128*4,0 dc.w (128+32)*4,0 dc.w 128*4,32 dc.w (128+32)*4,32 ROCKETS_PAL: incbin "ROCKETS.256pal" BARREL_WAD: ; incbin "BARREL.wad" BARREL_PTR: ; incbin "BARREL.ptr" BARREL_FRAMES: dc.w 0,0 BARREL_PAL: incbin "BARREL.256pal" GUNS_WAD: ; incbin "guns.wad" GUNS_PTR: ; incbin "GUNS.PTR" GUNS_FRAMES: dc.w 96*4*20,0 dc.w 96*4*21,0 dc.w 96*4*22,0 dc.w 96*4*23,0 dc.w 96*4*4,0 dc.w 96*4*5,0 dc.w 96*4*6,0 dc.w 96*4*7,0 dc.w 96*4*16,0 dc.w 96*4*17,0 dc.w 96*4*18,0 dc.w 96*4*19,0 dc.w 96*4*12,0 dc.w 96*4*13,0 dc.w 96*4*14,0 dc.w 96*4*15,0 dc.w 96*4*24,0 dc.w 96*4*25,0 dc.w 96*4*26,0 dc.w 96*4*27,0 dc.w 0,0 dc.w 0,0 dc.w 0,0 dc.w 0,0 dc.w 0,0 dc.w 0,0 dc.w 0,0 dc.w 0,0 dc.w 96*4*0,0 dc.w 96*4*1,0 dc.w 96*4*2,0 dc.w 96*4*3,0 GUNS_PAL: incbin "newgunsinhand.256pal" MARINE_WAD: ; incbin "newMarine.wad" MARINE_PTR: ; incbin "newMARINE.ptr" MARINE_FRAMES: dc.w 0,0 dc.w 64*4,0 dc.w (64*2)*4,0 dc.w (64*3)*4,0 dc.w (64*4)*4,0 dc.w (64*5)*4,0 dc.w (64*6)*4,0 dc.w (64*7)*4,0 dc.w (64*8)*4,0 dc.w (64*9)*4,0 dc.w (64*10)*4,0 dc.w (64*11)*4,0 dc.w (64*12)*4,0 dc.w (64*13)*4,0 dc.w (64*14)*4,0 dc.w (64*15)*4,0 dc.w (64*16)*4,0 dc.w (64*17)*4,0 dc.w (64*18)*4,0 MARINE_PAL: incbin "newmarine.256pal" TOUGHMARINE_FRAMES: dc.w 0,0 dc.w 64*4,0 dc.w (64*2)*4,0 dc.w (64*3)*4,0 dc.w (64*4)*4,0 dc.w (64*5)*4,0 dc.w (64*6)*4,0 dc.w (64*7)*4,0 dc.w (64*8)*4,0 dc.w (64*9)*4,0 dc.w (64*10)*4,0 dc.w (64*11)*4,0 dc.w (64*12)*4,0 dc.w (64*13)*4,0 dc.w (64*14)*4,0 dc.w (64*15)*4,0 dc.w (64*16)*4,0 dc.w (64*17)*4,0 dc.w (64*18)*4,0 TOUGHMARINE_PAL: incbin "toughmutant.256pal" FLAMEMARINE_FRAMES: dc.w 0,0 dc.w 64*4,0 dc.w (64*2)*4,0 dc.w (64*3)*4,0 dc.w (64*4)*4,0 dc.w (64*5)*4,0 dc.w (64*6)*4,0 dc.w (64*7)*4,0 dc.w (64*8)*4,0 dc.w (64*9)*4,0 dc.w (64*10)*4,0 dc.w (64*11)*4,0 dc.w (64*12)*4,0 dc.w (64*13)*4,0 dc.w (64*14)*4,0 dc.w (64*15)*4,0 dc.w (64*16)*4,0 dc.w (64*17)*4,0 dc.w (64*18)*4,0 FLAMEMARINE_PAL: incbin "flamemutant.256pal" BIGALIEN_WAD: ; incbin "BIGSCARYALIEN.wad" BIGALIEN_PTR: ; incbin "BIGSCARYALIEN.ptr" BIGALIEN_FRAMES: ; walking=0-3 dc.w 0,0 dc.w 128*4,0 dc.w 128*4*2,0 dc.w 128*4*3,0 BIGALIEN_PAL: incbin "BIGSCARYALIEN.256pal" LAMPS_FRAMES: dc.w 0,0 LAMPS_PAL: incbin "LAMPS.256pal" WORM_FRAMES: dc.w 0,0 dc.w 90*4,0 dc.w 90*4*2,0 dc.w 90*4*3,0 dc.w 90*4*4,0 dc.w 90*4*5,0 dc.w 90*4*6,0 dc.w 90*4*7,0 dc.w 90*4*8,0 dc.w 90*4*9,0 dc.w 90*4*10,0 dc.w 90*4*11,0 dc.w 90*4*12,0 dc.w 90*4*13,0 dc.w 90*4*14,0 dc.w 90*4*15,0 dc.w 90*4*16,0 dc.w 90*4*17,0 dc.w 90*4*18,0 dc.w 90*4*19,0 dc.w 90*4*20,0 WORM_PAL: incbin "worm.256pal" BIGCLAWS_FRAMES: dc.w 0,0 dc.w 128*4,0 dc.w 128*4*2,0 dc.w 128*4*3,0 dc.w 128*4*4,0 dc.w 128*4*5,0 dc.w 128*4*6,0 dc.w 128*4*7,0 dc.w 128*4*8,0 dc.w 128*4*9,0 dc.w 128*4*10,0 dc.w 128*4*11,0 dc.w 128*4*12,0 dc.w 128*4*13,0 dc.w 128*4*14,0 dc.w 128*4*15,0 dc.w 128*4*16,0 dc.w 128*4*17,0 BIGCLAWS_PAL: incbin "bigclaws.256pal" TREE_FRAMES: dc.w 0,0 dc.w 64*4,0 dc.w 64*2*4,0 dc.w 64*3*4,0 dc.w 0,0 dc.w 64*4,0 dc.w 64*2*4,0 dc.w 64*3*4,0 dc.w 0,0 dc.w 64*4,0 dc.w 64*2*4,0 dc.w 64*3*4,0 dc.w 0,0 dc.w 64*4,0 dc.w 64*2*4,0 dc.w 64*3*4,0 dc.w 0,0 dc.w 0,0 dc.w 32*8*4,0 dc.w 32*9*4,0 dc.w 32*10*4,0 dc.w 32*11*4,0 TREE_PAL: incbin "tree.256pal" even ObAdds: ; incbin "ALIEN1.ptr" objpal: ; incbin "ALIEN1.256pal" TextureMaps: incbin "Texturemaps" TexturePal: incbin "texture256pal" testval: dc.l 0