
*********************************** 
 
* 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
