home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga ACS 1997 #2
/
amigaacscoverdisc
/
games
/
alienbreed3d2
/
source_4000
/
hiresgourwall.s
< prev
next >
Wrap
Text File
|
1997-01-31
|
22KB
|
1,651 lines
***********************************
* 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
bra scrdrawlopG
thislinedoneG:
add.w #4+4+4+4+4+4,a0
dbra d7,scrdrawlopG
rts
scrdrawlopG:
move.w (a0)+,d0
cmp.w LASTSTIRRUP,d0
beq.s thislinedoneG
move.w d0,LASTSTIRRUP
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
cmp.w LASTSTIRRUP,d0
beq.s itsoddy
move.w d0,LASTSTIRRUP
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 #16,d7
move.w #2,d6
tst.b GOODRENDER
beq.s .notgood
move.w #64,d7
move.w #4,d6
bra .ISGOOD
.notgood:
move.l a2,d0
sub.l a0,d0
bge.s .okpos
neg.l d0
.okpos:
cmp.l #256*128,d0
blt.s .ISGOOD
add.w d7,d7
addq #1,d6
cmp.l #512*128,d0
blt.s .ISGOOD
add.w d7,d7
addq #1,d6
.ISGOOD
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
tst.b GOODRENDER
beq.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 #32,d0
bgt.s ndd0G
addq #1,d6
add.w d7,d7
ndd0G:
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 nh4G
cmp.w #256,d0
blt.s nh3G
asr.w #1,d7
subq #1,d6
blt.s nh4G
nh3G:
cmp.w #512,d0
blt.s nh4G
asr.w #1,d7
subq #1,d6
nh4G:
cmp.w #128,d7
ble.s .okokok
move.w #128,d7
move.w #5,d6
.okokok:
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
ext.l d0
divs.l d0,d1
moveq #0,d5
move.w MIDDLEX,d5
add.l d5,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
ext.l d2
divs.l d2,d3
moveq #0,d5
move.w MIDDLEX,d5
add.l d5,d3
move.w 8(a1),d5
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.l d3,(a1)
cmp.l leftclip-2(pc),d3
blt .alloffleft
cmp.l rightclip-2(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:
ext.l d2
move.l #store,a0
move.l (a1),d3
divs.l d2,d3
moveq #0,d5
move.w MIDDLEX,d5
add.l d5,d3
move.w 8(a1),d5
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.l d3,(a1)
cmp.w leftclip(pc),d3
blt.s alloffleft2G
cmp.w rightclip(pc),d1
; cmp.w #95,d1
bge 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