
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
 blt.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
 swap d2

 muls #320,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 #1,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,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 #1,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,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
 
AUXX: dc.w 0
AUXY: dc.w 0
 
midglass:
 dc.l 0
times128:
val SET 0
 REPT 100
 dc.w val*128
val SET val+1
 ENDR

BRIGHTTOADD: dc.w 0

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 AUXX,d2
 ext.l d2
 asl.l #7,d2
 add.l d2,d0
 addq #2,a0
 move.l #SHADINGTABLE-512,a4
 
 move.w (a0)+,d2	; height
 add.w AUXY,d2
 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 LINKFILE,a6
 lea FrameData(a6),a6
 move.l #Objects,a5
 move.w 2(a0),d7
 neg.w d7
 asl.w #4,d7
 adda.w d7,a5
 asl.w #4,d7
 adda.w d7,a6

 move.w 4(a0),d7
 lea (a6,d7.w*8),a6

 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 (a5)+,WAD_PTR
 move.l (a5)+,PTR_PTR
 
 move.l (a6),d7
 move.w d7,DOWN_STRIP
 move.l PTR_PTR,a5
 swap d7
 asl.w #2,d7
 adda.w d7,a5

 move.w d1,d7
 moveq #0,d6
 move.w 4(a6),d6
 add.w d6,d6
 subq #1,d6
 mulu d6,d7
 moveq #0,d6
 move.b -2(a0),d6
 beq objbehind
 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.w 6(a6),d6
 add.w d6,d6
 subq #1,d6
 mulu d6,d7
 moveq #0,d6
 move.b -1(a0),d6
 beq objbehind
 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


 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 #1,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.b (a4,d0.w*2),(a6)
.dontplotthisoneitsblack:
 adda.w #320,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.b (a4,d0.w*2),(a6)
.dontplotthisoneitsblack:
 adda.w #320,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.b (a4,d0.w*2),(a6)
.dontplotthisoneitsblack:
 adda.w #320,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:
 move.l #0,AUXX

 cmp.b #3,16(a0)
 bne.s .NOTAUX
 
 move.w auxxoff(a0),AUXX
 move.w auxyoff(a0),AUXY
  
.NOTAUX:

 tst.l 8(a0)
 blt glareobj
 
 move.w Facing(a0),FACINGANG
 
 move.w (a0)+,d0	;pt num
 
 move.l ObjectPoints,a4
 
 move.w (a4,d0.w*8),thisxpos
 move.w 4(a4,d0.w*8),thiszpos
 
 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 AUXX,d2
 ext.l d2
 asl.l #7,d2
 add.l d2,d0
 move.w d1,d6
 asr.w #4,d6
 add.w (a0)+,d6
 move.w d6,BRIGHTTOADD
 
 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
 
WHICHLIGHTPAL: dc.w 0
FLIPIT: dc.w 0
FLIPPEDIT: dc.w 0
LIGHTIT: dc.w 0
BASEPAL: dc.l 0
 
pastobjscale:
 
 move.w (a0)+,d2	; height
 add.w AUXY,d2
 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 LINKFILE,a6
 lea FrameData(a6),a6
 move.l #Objects,a5
 move.w 2(a0),d7
 asl.w #4,d7
 adda.w d7,a5
 asl.w #4,d7
 adda.w d7,a6

 clr.b LIGHTIT
 move.b 4(a0),d7
 btst #7,d7
 sne FLIPIT
 and.b #127,d7
 sub.b #2,d7
 blt.s .NOTALIGHT
 
 st LIGHTIT
 move.b d7,WHICHLIGHTPAL
 
.NOTALIGHT:

 moveq #0,d7
 move.b 5(a0),d7
 lea (a6,d7.w*8),a6
 
 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 (a5)+,WAD_PTR
 move.l (a5)+,PTR_PTR
 add.l 4(a5),a4
 move.l 4(a5),BASEPAL
 
 move.l (a6),d7
 move.w d7,DOWN_STRIP
 move.l PTR_PTR,a5
 
 tst.b FLIPIT
 beq.s .nfl1
 
 move.w 4(a6),d6
 add.w d6,d6
 subq #1,d6
 lea (a5,d6.w*4),a5
 
.nfl1:
 swap d7
 asl.w #2,d7
 adda.w d7,a5
fl1:
 
 move.w d1,d7
 moveq #0,d6
 move.w 4(a6),d6
 add.w d6,d6
 subq #1,d6
 mulu d6,d7
 moveq #0,d6
 move.b -2(a0),d6
 beq objbehind
 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.w 6(a6),d6
 add.w d6,d6
 subq #1,d6
 mulu d6,d7
 moveq #0,d6
 move.b -1(a0),d6
 beq objbehind
 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
 move.w leftclipb,d0
 
 asl.w #2,d1
 tst.b FLIPIT
 beq.s .nfl2
 
 suba.w d1,a5
 suba.w d1,a5

.nfl2:

 adda.w d1,a5 

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

 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),d7
 tst.b FLIPIT
 beq.s .nfl3
 neg.l d7
.nfl3:
 move.l d7,a2
 moveq.l #0,d7
 move.l a5,midobj
 move.l (a3),d2
 swap d2
 
 move.l #0,a1
 
 tst.b LIGHTIT
 bne DRAWITLIGHTED
 

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 #1,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.b (a4,d0.w*2),(a6)
.dontplotthisoneitsblack:
 adda.w #320,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.b (a4,d0.w*2),(a6)
.dontplotthisoneitsblack:
 adda.w #320,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.b (a4,d0.w*2),(a6)
.dontplotthisoneitsblack:
 adda.w #320,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
 
DRAWITLIGHTED:

; Make up lighting values

 movem.l d0-d7/a0-a6,-(a7)

; Need to scan around zone points putting in
; brightnesses.

 move.l #ANGLEBRIGHTS,a2
 move.l #$80808080,(a2)
 move.l #$80808080,4(a2)
 move.l #$80808080,8(a2)
 move.l #$80808080,12(a2)
 move.l #$80808080,16(a2)
 move.l #$80808080,20(a2)
 move.l #$80808080,24(a2)
 move.l #$80808080,28(a2)
 
 move.l #$80808080,32(a2)
 move.l #$80808080,36(a2)
 move.l #$80808080,40(a2)
 move.l #$80808080,44(a2)
 move.l #$80808080,48(a2)
 move.l #$80808080,52(a2)
 move.l #$80808080,56(a2)
 move.l #$80808080,60(a2)


 move.w currzone(pc),d0
 bsr CALCBRIGHTSINZONE

 move.l #ANGLEBRIGHTS+32,a2

; Now do the brightnesses of surrounding
; zones:

 move.l FloorLines,a1
 move.w currzone,d0
 move.l ZoneAdds,a4
 move.l (a4,d0.w*4),a4
 add.l LEVELDATA,a4
 move.l a4,a5
 
 adda.w ToExitList(a4),a5
 
.doallwalls
 move.w (a5)+,d0
 blt .nomorewalls

 asl.w #4,d0
 lea (a1,d0.w),a3
 
 move.w 8(a3),d0
 blt.s .solidwall ; a wall not an exit.
 
 movem.l a1/a4/a5,-(a7) 
 bsr CALCBRIGHTSINZONE
 movem.l (a7)+,a1/a4/a5
 bra .doallwalls

.solidwall:
 move.w 4(a3),d1
 move.w 6(a3),d2
 
 move.w oldx,newx
 move.w oldz,newz
 sub.w d2,newx
 add.w d1,newz

 movem.l d0-d7/a0-a6,-(a7)
 jsr HeadTowardsAng
 movem.l (a7)+,d0-d7/a0-a6
 move.w AngRet,d1
 neg.w d1
 and.w #8191,d1
 asr.w #8,d1
 asr.w #1,d1

 move.b #48,(a2,d1.w)
 move.b #48,16(a2,d1.w)
 bra .doallwalls 

.nomorewalls:


; move.b #0,(a2)
; move.b #20,8(a2)
; move.b #0,16(a2)
; move.b #20,24(a2)

 move.l #ANGLEBRIGHTS,a0
 bsr TWEENBRIGHTS
 move.l #ANGLEBRIGHTS+16,a0
 bsr TWEENBRIGHTS
 move.l #ANGLEBRIGHTS+32,a0
 bsr TWEENBRIGHTS
 move.l #ANGLEBRIGHTS+48,a0
 bsr TWEENBRIGHTS
 
 move.l #ANGLEBRIGHTS,a0
 move.b #15,d0
ADDBRIGHTS

 moveq #0,d3
 moveq #0,d4
 move.b 32(a0),d3
 move.b 48(a0),d4
 neg.w d3
 add.w #48,d3
 neg.w d4
 add.w #48,d4
 asr.w #1,d4
 asr.w #1,d3
 sub.b 16(a0),d4
 ble.s .ok2
 moveq #0,d4
.ok2:
 sub.b (a0),d3
 ble.s .ok1
 moveq #0,d3
.ok1:
 neg.b d3
 neg.b d4
 
 move.b d4,16(a0)
 move.b d3,(a0)+ 

 dbra d0,ADDBRIGHTS
 
; move.w PLR1_xoff,newx
; move.w PLR1_zoff,newz
; move.w thisxpos,oldx
; move.w thiszpos,oldz
; movem.l d0-d7/a0-a6,-(a7)
; jsr HeadTowardsAng
; movem.l (a7)+,d0-d7/a0-a6

 
; move.w #0,d0
; move.w AngRet,d0
 move.w p1_angpos,d0
 neg.w d0
 add.w #4096,d0
 and.w #8191,d0
 asr.w #8,d0
 asr.w #1,d0
 
 sub.b #6,d0
 and.b #15,d0
 move.l #ANGLEBRIGHTS,a1
 
 move.l #willy,a0
 moveq #6,d1
.across:
 moveq #0,d3
 moveq #0,d4
 move.b (a1,d0.w),d4
 bge.s .okp1
 moveq #0,d4
.okp1
 
 move.b 16(a1,d0.w),d3
 bge.s .okp2
 moveq #0,d3
.okp2
 sub.w d3,d4
 swap d3
 swap d4
 divs.l #7,d4
 moveq #6,d2
 moveq #0,d5
.down:
 swap d3
 move.w d3,(a0,d5.w*2)
 swap d3
 addq #7,d5
 add.l d4,d3
 dbra d2,.down
 addq #2,d0
 and.w #15,d0
 addq #2,a0
 dbra d1,.across


 move.w BRIGHTTOADD,d0
 move.l #willy,a0
 move.l #willybright,a1
 move.w #48,d1
ADDITIN:

 move.w d0,d2
 add.w (a1)+,d2
 ble.s .nopos
 
 moveq #0,d2
 
.nopos:

 add.w d2,(a0)+

 dbra d1,ADDITIN



 tst.b FLIPIT
 beq.s LEFTTORIGHT

 move.l #Brights2,a0
 bra DONERIGHTTOLEFT

LEFTTORIGHT:

 move.l #Brights,a0
DONERIGHTTOLEFT:
 move.l #willy,a2
 move.l BASEPAL,a1
 move.b WHICHLIGHTPAL,d0
 asl.w #8,d0
 add.w d0,a1 
 move.l #PALS,a3
 move.w #28,d0
makepals:

 move.w (a0)+,d1
 move.w (a2,d1.w*2),d1
 bge.s .okpos
 moveq #0,d1
.okpos: 
 cmp.w #31,d1
 blt.s .okneg
 move.w #31,d1
.okneg:
 
 move.l (a1,d1.w*8),(a3)+
 move.b #0,-4(a3)
 move.l 4(a1,d1.w*8),(a3)+

 dbra d0,makepals
 
 movem.l (a7)+,d0-d7/a0-a6
 
 move.l #PALS,a4

drawlightlop
 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 #1,a1
 move.l (a5),d1
 beq .blankstrip
 
 add.l d1,a0

 move.l d5,d6
 move.l d5,d1
 move.w d4,-(a7)
.drawavertstrip
 move.b (a0,d1.w),d0
 beq.s .dontplotthisoneitsblack
 move.b (a4,d0.w),(a6)
.dontplotthisoneitsblack:
 adda.w #320,a6
 add.l d2,d6
 addx.w d2,d1
 dbra d4,.drawavertstrip
 move.w (a7)+,d4
.blankstrip:
 dbra d3,drawlightlop
 bra objbehind

TWEENBRIGHTS:

 moveq #0,d0
.backinto:
 cmp.b #-128,(a0,d0.w)
 bne.s .okbr
 addq #1,d0
 bra.s .backinto

.okbr:

 move.b d0,d7 ;starting pos
 move.b d0,d1 ;previous pos

; tween to next value
.findnext
 addq #1,d0
 and.w #15,d0
 cmp.b #-128,(a0,d0.w)
 beq.s .findnext

 moveq #0,d2
 moveq #0,d3
 move.b (a0,d1.w),d2
 move.b (a0,d0.w),d3
 sub.w d2,d3
 
 move.w d0,d4
 sub.w d1,d4
 bgt.s .okpos
 add.w #16,d4
.okpos:

 swap d2
 swap d3
 ext.l d4
 divs.l d4,d3

 subq #1,d4 ; number of tweens

.putintween
 swap d2
 move.b d2,(a0,d1.w)
 swap d2
 add.l d3,d2
 addq #1,d1
 and.w #15,d1
 dbra d4,.putintween
 
 cmp.b d0,d7
 beq.s .doneall
 
 move.w d0,d1
 bra .findnext
 
.doneall

 rts


*************************************
CALCBRIGHTSINZONE:
 move.w d0,d1
 muls #20,d1
 move.l ZoneBorderPts,a1
 add.l d1,a1
 move.l #CurrentPointBrights,a0
 lea (a0,d1.l*4),a0
; A0 points at the brightnesses of the zone points.
; a1 points at the border points of the zone.
; list is terminated with -1.

 move.l Points,a3


 move.w thisxpos,oldx
 move.w thiszpos,oldz
 move.w #10,speed
 move.w #0,Range
 
DOPTBR
 move.w (a1)+,d0	;pt number
 blt DONEPTBR
 
 move.w (a3,d0.w*4),newx
 move.w 2(a3,d0.w*4),newz

 movem.l d0-d7/a0-a6,-(a7)
 jsr HeadTowardsAng
 movem.l (a7)+,d0-d7/a0-a6
 
 move.w AngRet,d1
 neg.w d1
 and.w #8191,d1
 asr.w #8,d1
 asr.w #1,d1
 
 move.w (a0),d0
 bge.s .okpos
 add.w #332,d0
 asr.w #2,d0
 neg.w d0
 add.w #332,d0
 
.okpos
 sub.w #300,d0
 bge.s .okpos3
 move.w #0,d0
.okpos3:
 move.b d0,d2
 asr.b #1,d2
 add.b d2,d0
 move.b d0,(a2,d1.w)
 move.w 2(a0),d0
 bge.s .okpos2
 add.w #332,d0
 asr.w #2,d0
 neg.w d0
 add.w #332,d0
.okpos2
 sub.w #300,d0
 bge.s .okpos4
 move.w #0,d0
.okpos4:
 
 move.b d0,d2
 asr.b #1,d2
 add.b d2,d0
 move.b d0,16(a2,d1.w)
 adda.w #8,a0

 bra DOPTBR
DONEPTBR
 rts

thisxpos: dc.w 0
thiszpos: dc.w 0
FACINGANG: dc.w 0

ANGLEBRIGHTS: ds.l 8*2

Brights:
 dc.w 3
 dc.w 8,9,10,11,12
 dc.w 15,16,17,18,19
 dc.w 21,22,23,24,25,26,27
 dc.w 29,30,31,32,33
 dc.w 36,37,38,39,40
 dc.w 45

Brights2:
 dc.w 3
 dc.w 12,11,10,9,8
 dc.w 19,18,17,16,15
 dc.w 27,26,25,24,23,22,21
 dc.w 33,32,31,30,29
 dc.w 40,39,38,37,36
 dc.w 45


PALS:
 ds.l 2*49

willy:
 dc.w 0,0,0,0,0,0,0
 dc.w 5,5,5,5,5,5,5
 dc.w 10,10,10,10,10,10,10
 dc.w 15,15,15,15,15,15,15
 dc.w 20,20,20,20,20,20,20
 dc.w 25,25,25,25,25,25,25
 dc.w 30,30,30,30,30,30,30

willybright:
 dc.w 30,30,30,30,30,30,30
 dc.w 30,20,20,20,20,20,30
 dc.w 30,20,6,3,6,20,30
 dc.w 30,20,6,0,6,20,30
 dc.w 30,20,6,6,6,20,30
 dc.w 30,20,20,20,20,20,30
 dc.w 30,30,30,30,30,30,30

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 "ab3:includes/XTOCOPX"
 ds.w 100

   *********************************
***************************************
   ********************************* 
tstddd: dc.l 0 
 
polybehind:
 rts
 
SORTIT: dc.w 0
 
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
 blt polybehind
 bgt.s .okinfront
 
 move.l a0,a3
 sub.l PLR1_Obj,a3
 cmp.l #130,a3
 bne polybehind
 
 move.w #10,d1
 
.okinfront:

 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.w (a3)+,SORTIT

 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
 swap d4
 move.w d4,(a4)+

 add.w #20,d4
 asr.w #1,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
 
 tst.w SORTIT
 bne.s PutinParts
 
putinunsorted:

 move.w (a1)+,d7
 
 blt doneallparts
 move.w (a1)+,d6
 move.l #0,(a0)+
 move.w d7,(a0)
 addq #4,a0
 
 bra putinunsorted
 
 
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 (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 #boxrot,a3
 move.w (a1),d0
 move.w d0,d1
 asl.w #2,d0
 add.w d1,d0
 move.w 4(a1),d1
 move.l d1,d2
 asl.w #2,d1
 add.w d2,d1
 move.w 8(a1),d2
 move.w d2,d3
 asl.w #2,d2
 add.w d3,d2
 move.l 4(a3,d0.w*2),d3
 move.l 4(a3,d1.w*2),d4
 move.l 4(a3,d2.w*2),d5
 move.l (a3,d0.w*2),d0
 move.l (a3,d1.w*2),d1
 move.l (a3,d2.w*2),d2

 sub.l d1,d0	;x1
 sub.l d1,d2	;x2
 sub.l d4,d3	;y1
 sub.l d4,d5	;y2

 asr.l #7,d0
 asr.l #7,d2
 asr.l #7,d3
 asr.l #7,d5

 muls d3,d2
 muls d5,d0
 sub.l d0,d2
 
 move.l d2,polybright
 move.l #boxonscr,a3

 clr.b drawit

 tst.b Gouraud(pc)
 bne.s usegour
 bsr putinlines
 bra.s dontusegour
usegour:
 bsr putingourlines
dontusegour:

 move.w #320,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

 add.w d1,d1 
 lea (a4,d1.w*8),a4
 asr.w #1,d1
 sub.w d1,d7
 ble polybehind
 move.w d1,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
 divs (a1)+,d1
 
 tst.b Holes
 bne gotholesin
 tst.b Gouraud(pc)
 bne gotlurvelyshading
 
 move.l #objscalecols,a1
 neg.w d1
 add.w #31,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 #1,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.l 2+PolyBotTab-PolyTopTab(a4),d3
 move.l 6+PolyBotTab-PolyTopTab(a4),d4
	
 move.l 2(a4),d5
 move.l 6(a4),d6
 
 sub.l d5,d3
 sub.l 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
 ext.l d0	
 muls.l offtopby-2,d3
 muls.l offtopby-2,d4
 divs.l d0,d3
 divs.l d0,d4

 add.l d3,d5
 add.l d4,d6

 move.l (a7)+,d4
 move.l (a7)+,d3
.notofftop: 
 ext.l d0

 divs.l d0,d3
 divs.l d0,d4

 add.l ontoscr(pc,d1.w*4),a3
 move.l #$3fffff,d1
 move.l d3,a5
 moveq #0,d3
 subq #1,d2
drawpol:
 and.l d1,d5
 and.l d1,d6

 move.l d6,d0
 asr.l #8,d0
 swap d5
 move.b d5,d0
 
 move.b (a0,d0.w*4),d3
 swap d5
 add.l a5,d5
 add.l d4,d6
 move.b (a1,d3.w*2),(a3)
 adda.w #320,a3
 dbra d2,drawpol

; 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,a3
 add.w a5,d3
 addx.l d4,d5
 dbcs d2,drawpol2
 dbcc d2,drawpol

pastit:

nodl:
 adda.w #16,a4
 dbra d7,dopoly

 rts
 
ontoscr:
val SET 0
 REPT 256
 dc.l val
val SET val+320
 ENDR
 
tstdca: dc.l 0
 dc.w 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 #1,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
 ENDR
 
drawpolg: 
 and.w #63*256+63,d5
 move.b (a0,d5.w*4),d0
 move.b (a1,d0.w*2),(a3)
 adda.w #320,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.b (a1,d0.w*2),(a3)
 adda.w #320,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:
 add.w #16,a4
 dbra d7,dopolyg

 rts
 


gotholesin:
 move.l #objscalecols,a1
 neg.w d1
 add.w #14,d1
 move.w objbright(pc),d0
 add.w d0,d1
 bge.s toobrighth
 move.w #0,d1
toobrighth:
 move.w (a1,d1.w*2),d1
 asl.w #3,d1
 move.l TexturePal,a1
 add.w d1,a1

dopolyh:
 move.w #0,offtopby
 move.l a6,a3
 adda.w a2,a3
 addq #1,a2
 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,d3
 sub.w d1,d3
 move.w d3,offtopby
 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.l 2+PolyBotTab-PolyTopTab(a4),d3
 move.l 6+PolyBotTab-PolyTopTab(a4),d4
	
 move.l 2(a4),d5
 move.l 6(a4),d6
 
 sub.l d5,d3
 sub.l 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

 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
 ext.l d0
 muls.l offtopby-2,d3
 muls.l offtopby-2,d4
 divs.l d0,d3
 divs.l d0,d4
 
 add.l d3,d5
 add.l d4,d6
 
 move.l (a7)+,d4
 move.l (a7)+,d3
.notofftop:
 ext.l d0
 
 divs.l d0,d3
 divs.l d0,d4
 
 add.l ontoscrh(pc,d1.w*4),a3
 move.l #$3fffff,d1
 move.l d3,a5
 moveq #0,d3
 subq #1,d2
drawpolh:
 and.l d1,d5
 and.l d1,d6
 
 move.l d6,d0
 asr.l #8,d0
 swap d5
 move.b d5,d0
 
 swap d5
 add.l a5,d5
 add.l d4,d6
 move.b (a0,d0.w*4),d3
 beq.s .dontplot
 move.b (a1,d3.w*2),(a3)
.dontplot
 adda.w #320,a3
 dbra d2,drawpolh

pastith:

nodlh:
 adda.w #16,a4
 dbra d7,dopolyh

 rts

ontoscrh:
val SET 0
 REPT 256
 dc.l val
val SET val+320
 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
 
; d2=x1 d3=y1 d4=x2 d5=y2
 
 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
 add.w d6,d6
 lea (a4,d6.w*8),a4
 asr.w #1,d6
 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
 ext.l d4
 swap d5
 clr.w d5
; asr.l #8,d5
 divs.l d4,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.l 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.l 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
 move.l d6,(a4)+
 move.l d2,(a4)+
 addq #6,a4

 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
 add.w d6,d6
 lea (a4,d6.w*8),a4
 asr.w #1,d6
 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
 ext.l d4
 swap d5
 clr.w d5
; asr.l #8,d5
 divs.l 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.l 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.l 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
 move.l d6,(a4)+
 move.l d2,(a4)+
 addq #6,a4

 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:
 ds.l 40
; 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"
 incbin "ab3:vectobj/walllamp"

;Medi_des:
; incbin "ab3:vectobj/testgrill"
;Exit_des:
; incbin "ab3:vectobj/exitsign
;Crate_des:
; incbin "ab3:vectobj/droid"
;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*8
 ds.w 320*4
PolyTopTab: ds.w 320*8
 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
 ds.l 4*20

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:
 dc.l 0
; incbin "ab3:includes/newTexturemaps"
TexturePal:
 dc.l 0
; incbin "ab3:includes/texture256pal"
 
testval: dc.l 0