*********************************** * The screendivide routine is simpler * using a0=left pixel * a2= right pixel * d0= left dist * d2= right dist * d4 = left strip * d5 = right strip * (a0)=leftx * 2(a0)=rightx * 4(a0)=leftbm * 6(a0)=rightbm * 8(a0)=leftdist * 10(a0)=rightdist * 12(a0)=lefttop * 14(a0)=righttop * 16(a0)=leftbot * 18(a0)=rightbot DoleftendGOUR: move.w leftclip,d0 sub.w #1,d0 move.w d0,leftclipandlast move.w (a0),d0 move.w 2(a0),d1 sub.w d0,d1 bge.s sometodrawG rts sometodrawG: move.w itertabG(pc,d1.w*4),d7 swap d0 move.w itertabG+2(pc,d1.w*4),d6 clr.w d0 swap d1 clr.w d1 asr.l d6,d1 move.l d1,(a0) bra pstitG itertabG: incbin "ab3:includes/iterfile" pstitG: moveq #0,d1 move.w 4(a0),d1 moveq #0,d2 move.w 6(a0),d2 sub.w d1,d2 swap d1 swap d2 asr.l d6,d2 move.l d2,4(a0) moveq #0,d2 move.w 8(a0),d2 moveq #0,d3 move.w 10(a0),d3 sub.w d2,d3 swap d2 swap d3 asr.l d6,d3 move.l d3,8(a0) moveq #0,d3 move.w 12(a0),d3 moveq #0,d4 move.w 14(a0),d4 sub.w d3,d4 swap d3 swap d4 asr.l d6,d4 move.l d4,12(a0) moveq #0,d4 move.w 16(a0),d4 moveq #0,d5 move.w 18(a0),d5 sub.w d4,d5 swap d4 swap d5 asr.l d6,d5 move.l d5,16(a0) *** Gouraud shading *** moveq #0,d5 move.w 26(a0),d5 sub.w 24(a0),d5 add.w d5,d5 swap d5 asr.l d6,d5 move.l d5,28(a0) moveq #0,d5 move.w 24(a0),d5 add.w d5,d5 swap d5 move.l d5,24(a0) *** Extra Gouraud Shading *** moveq #0,d5 move.w 34(a0),d5 sub.w 32(a0),d5 add.w d5,d5 swap d5 asr.l d6,d5 move.l d5,36(a0) moveq #0,d5 move.w 32(a0),d5 add.w d5,d5 swap d5 move.l d5,32(a0) bra screendivideGOUR TOPBRCOUNT: dc.l 0 BOTBRCOUNT: dc.l 0 screendivideGOUR: or.l #$ffff0000,d7 move.w leftclipandlast(pc),d6 move.l #WorkSpace,a2 move.l (a0),a3 move.l 4(a0),a4 move.l 8(a0),a5 move.l 12(a0),a6 move.l 16(a0),a1 scrdivlopG: swap d0 cmp.w d6,d0 bgt scrnotoffleftG swap d0 add.l a4,d1 add.l a5,d2 add.l a6,d3 add.l a1,d4 add.l a3,d0 move.l 28(a0),d5 add.l d5,24(a0) move.l 36(a0),d5 add.l d5,32(a0) dbra d7,scrdivlopG rts scrnotoffleftG: move.w d0,d6 cmp.w rightclip(pc),d0 bge.s outofcalcG scrnotoffrightG: move.w d0,(a2)+ move.l d1,(a2)+ move.l d2,(a2)+ move.l d3,(a2)+ move.l d4,(a2)+ move.l 24(a0),(a2)+ move.l 32(a0),(a2)+ swap d0 add.l a3,d0 add.l a4,d1 add.l a5,d2 add.l a6,d3 add.l a1,d4 move.l 28(a0),d5 add.l d5,24(a0) move.l 36(a0),d5 add.l d5,32(a0) add.l #$10000,d7 dbra d7,scrdivlopG outofcalcG: swap d7 tst.w d7 bge.s .somethingtodraw rts .somethingtodraw: move.l #consttab,a1 move.l #WorkSpace,a0 ; tst.b seethru ; bne screendividethru tst.b FULLSCR bne scrdrawlopGB tst.b DOUBLEWIDTH bne scrdrawlopGDOUB scrdrawlopG: move.w (a0)+,d0 move.l FASTBUFFER,a3 lea (a3,d0.w),a3 move.l (a0)+,d1 ; bra pastscrinto ; ; ;pastscrinto swap d1 move.w d1,d6 and.w HORAND,d6 move.l (a0)+,d2 swap d2 add.w fromtile(pc),d6 add.w d6,d6 move.w d6,a5 move.l (a0)+,d3 swap d3 add.l #divthreetab,a5 move.w (a5),StripData move.l ChunkAddr,a5 moveq #0,d6 move.b StripData,d6 add.w d6,d6 move.w VALSHIFT,d4 asl.l d4,d6 add.l d6,a5 move.l (a0)+,d4 swap d4 addq #1,d4 move.w d2,d6 *************************** * old version asr.w #7,d6 *************************** ; asr.w #3,d6 ; sub.w #4,d6 ; cmp.w #6,d6 ; blt.s tstbrbr ; move.w #6,d6 ;tstbrbr: *************************** move.l (a0)+,d5 swap d5 move.w d7,-(a7) ext.w d5 move.w d6,d7 add.w d5,d7 bge.s .brnotneg moveq #0,d7 .brnotneg cmp.w #62,d7 blt.s .brnotpos move.w #62,d7 .brnotpos move.l (a0)+,d5 swap d5 ext.w d5 add.w d5,d6 bge.s .brnotneg2 moveq #0,d6 .brnotneg2 cmp.w #62,d6 blt.s .brnotpos2 move.w #62,d6 .brnotpos2 asr.w #1,d6 asr.w #1,d7 sub.w d6,d7 move.l PaletteAddr,a4 ; move.l a2,a4 ; add.w ffscrpickhowbright(pc,d6*2),a2 ; and.b #$fe,d6 ; add.w ffscrpickhowbright(pc,d6*2),a4 ; btst #0,d0 ; beq .nobrightswap ; exg a2,a4 ;.nobrightswap: bsr ScreenWallstripdrawGOUR move.w (a7)+,d7 toosmallG: dbra d7,scrdrawlopG rts itsoddy: add.w #4+4+4+4+4+4,a0 dbra d7,scrdrawlopGDOUB rts scrdrawlopGDOUB: move.w (a0)+,d0 btst #0,d0 bne.s itsoddy move.l FASTBUFFER,a3 lea (a3,d0.w),a3 move.l (a0)+,d1 ; bra pastscrinto ; ; ;pastscrinto swap d1 move.w d1,d6 and.w HORAND,d6 move.l (a0)+,d2 swap d2 add.w fromtile(pc),d6 add.w d6,d6 move.w d6,a5 move.l (a0)+,d3 swap d3 add.l #divthreetab,a5 move.w (a5),StripData move.l ChunkAddr,a5 moveq #0,d6 move.b StripData,d6 add.w d6,d6 move.w VALSHIFT,d4 asl.l d4,d6 add.l d6,a5 move.l (a0)+,d4 swap d4 addq #1,d4 move.w d2,d6 *************************** * old version asr.w #7,d6 *************************** ; asr.w #3,d6 ; sub.w #4,d6 ; cmp.w #6,d6 ; blt.s tstbrbr ; move.w #6,d6 ;tstbrbr: *************************** move.l (a0)+,d5 swap d5 move.w d7,-(a7) ext.w d5 move.w d6,d7 add.w d5,d7 bge.s .brnotneg moveq #0,d7 .brnotneg cmp.w #62,d7 blt.s .brnotpos move.w #62,d7 .brnotpos move.l (a0)+,d5 swap d5 ext.w d5 add.w d5,d6 bge.s .brnotneg2 moveq #0,d6 .brnotneg2 cmp.w #62,d6 blt.s .brnotpos2 move.w #62,d6 .brnotpos2 asr.w #1,d6 asr.w #1,d7 sub.w d6,d7 move.l PaletteAddr,a4 ; move.l a2,a4 ; add.w ffscrpickhowbright(pc,d6*2),a2 ; and.b #$fe,d6 ; add.w ffscrpickhowbright(pc,d6*2),a4 ; btst #0,d0 ; beq .nobrightswap ; exg a2,a4 ;.nobrightswap: bsr ScreenWallstripdrawGOUR move.w (a7)+,d7 dbra d7,scrdrawlopGDOUB rts scrdrawlopGB: move.w (a0)+,d0 move.l FASTBUFFER,a3 lea (a3,d0.w),a3 move.l (a0)+,d1 ; bra pastscrinto ; ; ;pastscrinto swap d1 move.w d1,d6 and.w HORAND,d6 move.l (a0)+,d2 swap d2 add.w fromtile(pc),d6 add.w d6,d6 move.w d6,a5 move.l (a0)+,d3 swap d3 add.l #divthreetab,a5 move.w (a5),StripData move.l ChunkAddr,a5 moveq #0,d6 move.b StripData,d6 add.w d6,d6 move.w VALSHIFT,d4 asl.l d4,d6 add.l d6,a5 move.l (a0)+,d4 swap d4 addq #1,d4 move.w d2,d6 *************************** * old version asr.w #7,d6 *************************** ; asr.w #3,d6 ; sub.w #4,d6 ; cmp.w #6,d6 ; blt.s tstbrbr ; move.w #6,d6 ;tstbrbr: *************************** move.l (a0)+,d5 swap d5 move.w d7,-(a7) ext.w d5 move.w d6,d7 add.w d5,d7 bge.s .brnotneg moveq #0,d7 .brnotneg cmp.w #62,d7 blt.s .brnotpos move.w #62,d7 .brnotpos move.l (a0)+,d5 swap d5 ext.w d5 add.w d5,d6 bge.s .brnotneg2 moveq #0,d6 .brnotneg2 cmp.w #62,d6 blt.s .brnotpos2 move.w #62,d6 .brnotpos2 asr.w #1,d6 asr.w #1,d7 sub.w d6,d7 move.l PaletteAddr,a4 ; move.l a2,a4 ; add.w ffscrpickhowbright(pc,d6*2),a2 ; and.b #$fe,d6 ; add.w ffscrpickhowbright(pc,d6*2),a4 ; btst #0,d0 ; beq .nobrightswap ; exg a2,a4 ;.nobrightswap: bsr ScreenWallstripdrawGOURB move.w (a7)+,d7 dbra d7,scrdrawlopGB rts itsbilloddy: add.w #4+4+4+4+4+4,a0 dbra d7,scrdrawlopGDOUB rts scrdrawlopGBDOUB: move.w (a0)+,d0 btst #0,d0 bne.s itsbilloddy move.l FASTBUFFER,a3 lea (a3,d0.w),a3 move.l (a0)+,d1 ; bra pastscrinto ; ; ;pastscrinto swap d1 move.w d1,d6 and.w HORAND,d6 move.l (a0)+,d2 swap d2 add.w fromtile(pc),d6 add.w d6,d6 move.w d6,a5 move.l (a0)+,d3 swap d3 add.l #divthreetab,a5 move.w (a5),StripData move.l ChunkAddr,a5 moveq #0,d6 move.b StripData,d6 add.w d6,d6 move.w VALSHIFT,d4 asl.l d4,d6 add.l d6,a5 move.l (a0)+,d4 swap d4 addq #1,d4 move.w d2,d6 *************************** * old version asr.w #7,d6 *************************** ; asr.w #3,d6 ; sub.w #4,d6 ; cmp.w #6,d6 ; blt.s tstbrbr ; move.w #6,d6 ;tstbrbr: *************************** move.l (a0)+,d5 swap d5 move.w d7,-(a7) ext.w d5 move.w d6,d7 add.w d5,d7 bge.s .brnotneg moveq #0,d7 .brnotneg cmp.w #62,d7 blt.s .brnotpos move.w #62,d7 .brnotpos move.l (a0)+,d5 swap d5 ext.w d5 add.w d5,d6 bge.s .brnotneg2 moveq #0,d6 .brnotneg2 cmp.w #62,d6 blt.s .brnotpos2 move.w #62,d6 .brnotpos2 asr.w #1,d6 asr.w #1,d7 sub.w d6,d7 move.l PaletteAddr,a4 ; move.l a2,a4 ; add.w ffscrpickhowbright(pc,d6*2),a2 ; and.b #$fe,d6 ; add.w ffscrpickhowbright(pc,d6*2),a4 ; btst #0,d0 ; beq .nobrightswap ; exg a2,a4 ;.nobrightswap: bsr ScreenWallstripdrawGOURB move.w (a7)+,d7 dbra d7,scrdrawlopGBDOUB rts walldrawGOUR: tst.w d1 bgt.s oneinfront1G tst.w d3 bgt.s oneinfrontG rts oneinfront1G tst.w d3 ble.s oneinfrontG ; Bothinfront! nop oneinfrontG move.w #64,d7 move.w #4,d6 move.w d3,d0 sub.w d1,d0 bge.s notnegzdiffG neg.w d0 notnegzdiffG ; cmp.w #1024,d0 ; blt.s nd01G ; add.w d7,d7 ; add.w #1,d6 ;nd01G: cmp.w #512,d0 blt.s nd0G add.w d7,d7 add.w #1,d6 bra nhaG nd0G: cmp.w #256,d0 bgt.s nh1G asr.w #1,d7 subq #1,d6 nh1G: cmp.w #128,d0 bgt.s nh2G asr.w #1,d7 subq #1,d6 nh2G: nhaG: move.w d3,d0 cmp.w d1,d3 blt.s rightnearestG move.w d1,d0 rightnearestG: cmp.w #64,d0 bgt.s nd1G addq #1,d6 add.w d7,d7 nd1G: cmp.w #128,d0 blt.s nh3G asr.w #1,d7 subq #1,d6 blt.s nh3G cmp.w #256,d0 blt.s nh3G asr.w #1,d7 subq #1,d6 nh3G: move.w d6,iters subq #1,d7 move.w d7,multcount move.l #databuffer,a3 move.l a0,d0 move.l a2,d2 move.l d0,(a3)+ add.l d2,d0 move.w d1,(a3)+ move.w leftwallTOPbright,d7 move.w d7,(a3)+ asr.l #1,d0 move.w d4,(a3)+ move.w leftwallbright,d6 move.w d6,(a3)+ add.w d5,d4 move.l d0,(a3)+ add.w d3,d1 asr.w #1,d1 move.w d1,(a3)+ add.w rightwallTOPbright,d7 asr.w #1,d7 move.w d7,(a3)+ asr.w #1,d4 move.w d4,(a3)+ add.w rightwallbright,d6 asr.w #1,d6 move.w d6,(a3)+ move.l d2,(a3)+ move.w d3,(a3)+ move.w rightwallTOPbright,(a3)+ move.w d5,(a3)+ move.w rightwallbright,(a3)+ ; We now have the two endpoints and the midpoint ; so we need to perform 1 iteration of the inner ; loop, the first time. * Decide how often to subdivide by how far away the wall is, and * how perp. it is to the player. move.l #databuffer,a0 move.l #databuffer2,a1 swap d7 move.w iters,d7 blt noitersG move.l #1,a2 iterloopG: move.l a0,a3 move.l a1,a4 swap d7 move.w a2,d7 exg a0,a1 move.l (a3)+,d0 move.l (a3)+,d1 move.l (a3)+,d2 middleloopG: move.l d0,(a4)+ move.l (a3)+,d3 add.l d3,d0 move.l d1,(a4)+ asr.l #1,d0 move.l (a3)+,d4 add.l d4,d1 move.l d2,(a4)+ asr.l #1,d1 and.w #$7fff,d1 move.l (a3)+,d5 add.l d5,d2 move.l d0,(a4)+ asr.l #1,d2 move.l d1,(a4)+ move.l d2,(a4)+ move.l d3,(a4)+ move.l (a3)+,d0 add.l d0,d3 move.l d4,(a4)+ asr.l #1,d3 move.l (a3)+,d1 add.l d1,d4 move.l d5,(a4)+ asr.l #1,d4 and.w #$7fff,d4 move.l (a3)+,d2 add.l d2,d5 move.l d3,(a4)+ asr.l #1,d5 move.l d4,(a4)+ move.l d5,(a4)+ subq #1,d7 bgt.s middleloopG move.l d0,(a4)+ move.l d1,(a4)+ move.l d2,(a4)+ add.w a2,a2 swap d7 dbra d7,iterloopG noitersG: CalcAndDrawG: ; CACHE_ON d2 move.l a0,a1 move.w multcount,d7 .findfirstinfront: move.l (a1)+,d1 move.w (a1)+,d0 bgt.s .foundinfront move.l (a1)+,d4 move.w (a1)+,d4 dbra d7,.findfirstinfront rts ; no two points were in front .foundinfront: move.w (a1)+,tlbr move.w (a1)+,d4 move.w (a1)+,lbr ; d1=left x, d4=left end, d0=left dist divs d0,d1 add.w MIDDLEX,d1 move.l topofwall(pc),d5 divs d0,d5 add.w MIDDLEY,d5 move.w d5,strtop move.l botofwall(pc),d5 divs d0,d5 add.w MIDDLEY,d5 move.w d5,strbot .computeloop: move.w 4(a1),d2 bgt.s .infront rts .infront: move.l #store,a0 move.l (a1),d3 divs d2,d3 move.w 8(a1),d5 add.w MIDDLEX,d3 move.w strtop(pc),12(a0) move.l topofwall(pc),d6 divs d2,d6 move.w strbot(pc),16(a0) add.w MIDDLEY,d6 move.w d6,strtop move.w d6,14(a0) move.l botofwall(pc),d6 divs d2,d6 add.w MIDDLEY,d6 move.w d6,strbot move.w d6,18(a0) move.w d3,2(a1) cmp.w leftclip(pc),d3 blt .alloffleft cmp.w rightclip(pc),d1 ; cmp.w #95,d1 bge .alloffright movem.l d0/d1/d2/d3/a0,-(a7) moveq #0,d0 move.b WALLIDENT,d0 blt.s .noputinmap move.b d0,d3 and.b #15,d0 move.l COMPACTPTR,a0 moveq #0,d1 move.w d0,d2 add.w d0,d0 add.w d2,d0 bset d0,d1 btst #4,d3 beq.s .nodoor addq #2,d0 bset d0,d1 .nodoor: or.l d1,(a0) move.l BIGPTR,a0 move.w wallleftpt,(a0,d2.w*4) move.w wallrightpt,2(a0,d2.w*4) .noputinmap movem.l (a7)+,d0/d1/d2/d3/a0 bra OTHERHALFG .alloffleft: move.l (a1)+,d1 move.w (a1)+,d0 move.w (a1)+,tlbr move.w (a1)+,d4 move.w (a1)+,lbr dbra d7,.computeloop rts .alloffright: rts computeloop2G: move.w 4(a1),d2 bgt.s .infront rts .infront: move.l #store,a0 move.l (a1),d3 divs d2,d3 move.w 8(a1),d5 add.w MIDDLEX,d3 move.w strtop(pc),12(a0) move.l topofwall(pc),d6 divs d2,d6 move.w strbot(pc),16(a0) add.w MIDDLEY,d6 move.w d6,strtop move.w d6,14(a0) move.l botofwall(pc),d6 divs d2,d6 add.w MIDDLEY,d6 move.w d6,strbot move.w d6,18(a0) move.w d3,2(a1) cmp.w leftclip(pc),d3 blt.s alloffleft2G cmp.w rightclip(pc),d1 ; cmp.w #95,d1 bge.s alloffright2G OTHERHALFG: move.w d1,(a0) move.w d3,2(a0) move.w d4,4(a0) move.w d5,6(a0) move.w d0,8(a0) move.w d2,10(a0) move.w lbr,d5 sub.w #300,d5 ext.w d5 move.w d5,24(a0) move.w 10(a1),d5 sub.w #300,d5 ext.w d5 move.w d5,26(a0) move.w tlbr,d5 sub.w #300,d5 ext.w d5 move.w d5,32(a0) move.w 6(a1),d5 sub.w #300,d5 ext.w d5 move.w d5,34(a0) movem.l d7/a1,-(a7) move.w #maxscrdiv,d7 bsr DoleftendGOUR movem.l (a7)+,d7/a1 alloffleft2G: move.l (a1)+,d1 move.w (a1)+,d0 move.w (a1)+,tlbr move.w (a1)+,d4 move.w (a1)+,lbr dbra d7,computeloop2G rts alloffright2G: rts *********************************** * Need a routine which takes...? * Top Y (3d) * Bottom Y (3d) * distance * height of each tile (number and routine addr) * And produces the appropriate strip on the * screen. nostripqG: rts STARTGOUR: dc.l 0 ScreenWallstripdrawGOUR: swap d6 clr.w d6 move.l d6,STARTGOUR swap d7 clr.w d7 move.w d4,d6 sub.w d3,d6 beq.s nostripqG ext.l d6 divs.l d6,d7 ; speed through gouraud table. move.w d4,d6 cmp.w topclip(pc),d6 blt.s nostripqG cmp.w botclip(pc),d3 bgt.s nostripqG cmp.w botclip(pc),d6 ble.s noclipbotG move.w botclip(pc),d6 noclipbotG: move.w d3,d5 cmp.w topclip(pc),d5 bge.s nocliptopG sub.w topclip(pc),d5 neg.w d5 ext.l d5 move.l d7,d0 muls.l d5,d0 add.l d0,STARTGOUR move.w topclip(pc),d5 ; bra gotoendG ; nocliptopG: ; bra gotoendG CNOP 0,128 drawwallPACK0G: swap d4 and.w d7,d4 move.l d3,d2 swap d2 move.b 1(a5,d4.w*2),d1 and.w #%1111111111100000,d2 swap d4 and.b #31,d1 add.w d1,d2 move.b (a4,d2.w*2),(a3) adda.w d0,a3 add.l d5,d3 add.l a2,d4 dbra d6,drawwallPACK0G nostripG: rts CNOP 0,4 drawwallPACK1G: swap d4 and.w d7,d4 move.l d3,d2 swap d2 move.w (a5,d4.w*2),d1 and.w #%1111111111100000,d2 swap d4 lsr.w #5,d1 and.w #31,d1 add.b d1,d2 move.b (a4,d2.w*2),(a3) adda.w d0,a3 add.l d5,d3 add.l a2,d4 dbra d6,drawwallPACK1G rts CNOP 0,4 drawwallPACK2G: swap d4 and.w d7,d4 move.l d3,d2 swap d2 move.b (a5,d4.w*2),d1 and.w #%1111111111100000,d2 swap d4 lsr.b #2,d1 and.w #31,d1 add.b d1,d2 move.b (a4,d2.w*2),(a3) adda.w d0,a3 add.l d5,d3 add.l a2,d4 dbra d6,drawwallPACK2G rts usesimpleG: mulu d3,d4 add.l d0,d4 swap d4 add.w totalyoff(pc),d4 cliptopusesimpleG move.w VALAND,d7 move.w #320,d0 moveq #0,d1 swap d2 ifne CHEESEY asr.l #1,d2 endc move.l d2,a2 swap d4 ifne CHEESEY asr.l #1,d4 endc move.l GOURSPEED,d5 asl.l #5,d5 move.l STARTGOUR,d3 asl.l #5,d3 cmp.b #1,StripData+1 dbge d6,simplewalliPACK0G dbne d6,simplewalliPACK1G dble d6,simplewalliPACK2G rts CNOP 0,4 simplewalliPACK0G: swap d4 and.w d7,d4 move.l d3,d2 swap d2 move.b 1(a5,d4.w*2),d1 and.w #%1111111111100000,d2 swap d4 and.b #31,d1 add.b d1,d2 move.b (a2,d2.w*2),d3 simplewallPACK0G: move.b d3,(a3) adda.w d0,a3 add.l a2,d4 bcc.s .noread addq #1,d4 and.w d7,d4 move.b 1(a5,d4.w*2),d1 and.b #31,d1 move.b (a2,d1.w*2),d3 .noread: dbra d6,simplewallPACK0G rts CNOP 0,4 simplewalliPACK1G: swap d4 and.w d7,d4 move.l d3,d2 swap d2 move.w (a5,d4.w*2),d1 lsr.w #5,d1 and.w #31,d1 move.b (a2,d1.w*2),d3 simplewallPACK1G: move.b d3,(a3) adda.w d0,a3 add.l d5,d4 bcc.s .noread addq #1,d4 and.w d7,d4 move.w (a5,d4.w*2),d1 lsr.w #5,d1 and.w #31,d1 move.b (a2,d1.w*2),d3 .noread: dbra d6,simplewallPACK1G rts CNOP 0,4 simplewalliPACK2G: move.b (a5,d4.w*2),d1 lsr.b #2,d1 and.b #31,d1 move.b (a2,d1.w*2),d3 simplewallPACK2G: move.b d3,(a3) adda.w d0,a3 add.l d5,d4 bcc.s .noread addq #1,d4 and.w d7,d4 move.b (a5,d4.w*2),d1 lsr.b #2,d1 move.b (a2,d1.w*2),d3 .noread: dbra d6,simplewallPACK2G rts ;gotoendnomult: ; movem.l d0/d1/d2/d3/d4/d7,-(a7) ; add.l timeslarge(pc,d5.w*4),a3 ; move.w d5,d4 ; move.l 4(a1,d2.w*8),d0 ; move.l (a1,d2.w*8),d2 ; moveq #0,d3 ; move.w d2,d3 ; swap d2 ; tst.w d2 ; move.w wallyoff(pc),d4 ; add.w #44,d4 ; bne.s .notsimple ; cmp.l #$b000,d3 ; ble cliptopusesimple ;.notsimple: ; bra cliptop GOURSPEED: dc.l 0 gotoendG: tst.b DOUBLEHEIGHT bne doubwallGOUR sub.w d5,d6 ; height to draw. ble nostripqG move.l d7,GOURSPEED add.l timeslargeG(pc,d5.w*4),a3 add.w d2,d2 move.l 4(a1,d2.w*8),d0 add.w TOPOFFSET(pc),d5 move.w d5,d4 move.l (a1,d2.w*4),d2 moveq #0,d3 ; move.w d2,d3 ; swap d2 ; tst.w d2 ; bne.s .notsimple ; cmp.l #$b000,d3 ; ble usesimple ;.notsimple: ext.l d5 move.l d2,d4 muls.l d5,d4 ; mulu d3,d4 ; muls d2,d5 add.l d0,d4 ifne CHEESEY asr.l #1,d4 endc swap d4 ; add.w d5,d4 add.w totalyoff(pc),d4 cliptopG move.w VALAND,d7 and.w d7,d4 move.w #320,d0 moveq #0,d1 ifne CHEESEY asr.l #1,d2 endc move.l d2,a2 swap d4 move.l GOURSPEED,d5 asl.l #5,d5 move.l STARTGOUR,d3 asl.l #5,d3 cmp.b #1,StripData+1 dbge d6,drawwallPACK0G dbne d6,drawwallPACK1G dble d6,drawwallPACK2G rts timeslargeG: val SET 0 REPT 256 dc.l val val SET val+320 ENDR doubwallGOUR: moveq #0,d0 asr.w #1,d5 addx.w d0,d5 add.w d5,d5 sub.w d5,d6 ; height to draw. asr.w #1,d6 ble nostripqG move.l d7,GOURSPEED add.l timeslargeGDOUB(pc,d5.w*4),a3 add.w d2,d2 move.l 4(a1,d2.w*8),d0 add.w TOPOFFSET(pc),d5 move.w d5,d4 move.l (a1,d2.w*4),d2 moveq #0,d3 ; move.w d2,d3 ; swap d2 ; tst.w d2 ; bne.s .notsimple ; cmp.l #$b000,d3 ; ble usesimple ;.notsimple: ext.l d5 move.l d2,d4 muls.l d5,d4 ; mulu d3,d4 ; muls d2,d5 add.l d0,d4 ifne CHEESEY asr.l #1,d4 endc swap d4 ; add.w d5,d4 add.w totalyoff(pc),d4 move.w VALAND,d7 and.w d7,d4 move.w #640,d0 moveq #0,d1 ifeq CHEESEY add.l d2,d2 endc move.l d2,a2 swap d4 move.l GOURSPEED,d5 asl.l #6,d5 move.l STARTGOUR,d3 asl.l #5,d3 cmp.b #1,StripData+1 dbge d6,drawwallPACK0G dbne d6,drawwallPACK1G dble d6,drawwallPACK2G rts timeslargeGDOUB: val SET 0 REPT 256 dc.l val val SET val+320 ENDR ScreenWallstripdrawGOURB: swap d6 clr.w d6 move.l d6,STARTGOUR swap d7 clr.w d7 move.w d4,d6 sub.w d3,d6 beq nostripqG ext.l d6 divs.l d6,d7 ; speed through gouraud table. move.w d4,d6 cmp.w topclip(pc),d6 blt nostripqG cmp.w botclip(pc),d3 bgt nostripqG cmp.w botclip(pc),d6 ble.s noclipbotGb move.w botclip(pc),d6 noclipbotGb: move.w d3,d5 cmp.w topclip(pc),d5 bge.s nocliptopGB sub.w topclip(pc),d5 neg.w d5 ext.l d5 move.l d7,d0 muls.l d5,d0 add.l d0,STARTGOUR move.w topclip(pc),d5 nocliptopGB: gotoendGB: tst.b DOUBLEHEIGHT bne doubwallGOURBIG sub.w d5,d6 ; height to draw. ble nostripqG move.l d7,GOURSPEED add.l timeslargeGB(pc,d5.w*4),a3 move.w d2,d4 add.w d2,d2 add.w d2,d4 move.l 4(a1,d4.w*8),d0 add.w TOPOFFSET(pc),d5 move.w d5,d4 move.l (a1,d2.w*4),d2 moveq #0,d3 ; move.w d2,d3 ; swap d2 ; tst.w d2 ; bne.s .notsimple ; cmp.l #$b000,d3 ; ble usesimple ;.notsimple: ext.l d5 move.l d2,d4 muls.l d5,d4 ; mulu d3,d4 ; muls d2,d5 add.l d0,d4 ifne CHEESEY asr.l #1,d4 endc swap d4 ; add.w d5,d4 add.w totalyoff(pc),d4 move.w VALAND,d7 and.w d7,d4 move.w #320,d0 moveq #0,d1 ifne CHEESEY asr.l #1,d2 endc move.l d2,a2 swap d4 move.l GOURSPEED,d5 asl.l #5,d5 move.l STARTGOUR,d3 asl.l #5,d3 cmp.b #1,StripData+1 dbge d6,drawwallPACK0G dbne d6,drawwallPACK1G dble d6,drawwallPACK2G rts timeslargeGB: val SET 0 REPT 256 dc.l val val SET val+320 ENDR doubwallGOURBIG: moveq #0,d0 asr.w #1,d5 addx.w d0,d5 add.w d5,d5 sub.w d5,d6 ; height to draw. asr.w #1,d6 ble nostripqG move.l d7,GOURSPEED add.l timeslargeGBDOUB(pc,d5.w*4),a3 move.w d2,d4 add.w d2,d2 add.w d2,d4 move.l 4(a1,d4.w*8),d0 add.w TOPOFFSET(pc),d5 move.w d5,d4 move.l (a1,d2.w*4),d2 moveq #0,d3 ; move.w d2,d3 ; swap d2 ; tst.w d2 ; bne.s .notsimple ; cmp.l #$b000,d3 ; ble usesimple ;.notsimple: ext.l d5 move.l d2,d4 muls.l d5,d4 ; mulu d3,d4 ; muls d2,d5 add.l d0,d4 ifne CHEESEY asr.l #1,d4 endc swap d4 ; add.w d5,d4 add.w totalyoff(pc),d4 move.w VALAND,d7 and.w d7,d4 move.w #640,d0 moveq #0,d1 ifeq CHEESEY add.l d2,d2 endc move.l d2,a2 swap d4 move.l GOURSPEED,d5 asl.l #6,d5 move.l STARTGOUR,d3 asl.l #5,d3 cmp.b #1,StripData+1 dbge d6,drawwallPACK0G dbne d6,drawwallPACK1G dble d6,drawwallPACK2G rts timeslargeGBDOUB: val SET 0 REPT 256 dc.l val val SET val+320 ENDR