
maxscrdiv EQU 8
max3ddiv EQU 5
playerheight EQU 12*1024
playercrouched EQU 6*1024
scrheight EQU 80

; k/j/m
; 4/8



; s/x
; b/n

xpos EQU 0	;l
zpos EQU 4	;l
zsinval EQU 8	;w
zcosval EQU 10	;w
ztox EQU 12	;l
xsinval EQU 16	;w
xcosval EQU 18	;w
xspd EQU 20	;w

zspd EQU 22	;wd
mapx EQU 24	;b
mapz EQU 25	;b
whichtile EQU 26 ;b
xofflight EQU 28	;w
zofflight EQU 30	;w
offlight EQU 32		;w
zlinestore EQU 34
zlinedir EQU 38
zposdir EQU 40
zposstore EQU 42
xdiststore EQU 44
xdistdir EQU 46
zwallfound EQU 48

xlinestore EQU 50
xlinedir EQU 54
xposdir EQU 56
xposstore EQU 58
zdiststore EQU 60
zdistdir EQU 62
xwallfound EQU 64


midoffset EQU 104*4*40

 SECTION Scrn,CODE
OpenLib         equ -552
CloseLib        equ -414

INTREQ	equ	$09C
INTENA	equ	$09A
INTENAR	equ	$01C
DMACON	equ	$096

SERPER	equ	$032
SERDATR	equ	$018
SERDAT	equ	$030
vhposr		equ $006	
vhposrl		equ $007 

bltcon0		equ $40 
bltcon1		equ $42
bltcpt		equ $48
bltbpt		equ $4c
bltapt		equ $50
spr0ctl		equ $142
spr1ctl		equ $14a
spr2ctl		equ $152
spr3ctl		equ $15a
spr4ctl		equ $162
spr5ctl		equ $16a
spr6ctl		equ $172
spr7ctl		equ $17a
spr0pos		equ $140
spr1pos		equ $148
spr2pos		equ $150
spr3pos		equ $158
spr4pos		equ $160
spr5pos		equ $168
spr6pos		equ $170
spr7pos		equ $178
bltdpt     	equ $54
bltafwm		equ $44
bltalwm		equ $46
bltsize     	equ $58
bltcmod     	equ $60
bltbmod     	equ $62
bltamod     	equ $64
bltdmod     	equ $66
diwstart        equ $8e         ; Screen hardware registers.
diwstop         equ $90
ddfstart        equ $92
ddfstop         equ $94
bplcon0         equ $100
bplcon1         equ $102
col0            equ $180
col1            equ $182
col2		equ $184
col3		equ $186
col4		equ $188
col5		equ $18a
col6		equ $18c
col7		equ $18e
col8            equ $190
col9            equ $192
col10           equ $194
col11           equ $196
col12           equ $198
col13           equ $19a
dmacon		equ $96
dmaconr		equ $002
intenar		equ $01c
intena		equ $09a
intreq		equ $09c
intreqr		equ $01e
intreqrl	equ $01f
bpl1pth         equ $e0
bpl1ptl         equ $e2
bpl2pth		equ $e4
bpl2ptl		equ $e6
bpl3pth		equ $e8
bpl3ptl		equ $ea
bpl4pth		equ $ec
bpl4ptl		equ $ee
bpl5pth		equ $f0
bpl5ptl		equ $f2
bpl6pth		equ $f4
bpl6ptl		equ $f6
bpl7pth		equ $f8
bpl7ptl		equ $fa
bpl8pth		equ $fc
bpl8ptl		equ $fe
spr0pth		equ $120
spr0ptl		equ $122
spr1pth		equ $124
spr1ptl		equ $126
spr2pth		equ $128
spr2ptl		equ $12a
spr3pth		equ $12c
spr3ptl		equ $12e
spr4pth		equ $130
spr4ptl		equ $132
spr5pth		equ $134
spr5ptl		equ $136
spr6pth		equ $138
spr6ptl		equ $13a
spr7pth		equ $13c
spr7ptl		equ $13e

; move.l #length,d0
; moveq.l #2,d1	; chipmem
; move.l 4.w,a6
; jsr allocmem(a6) = -198

; tst.l d0
; beq.s ohbugger
; move.l d0,memaddr


; move.l 4.w,a6
; move.l memaddr,a1
; move.l #size,d0
; jsr freemem(a6) =-210


** This waits for the blitter to finish before allowing program
** execution to continue.

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

GETREGS MACRO
 movem.l (a7)+,d0-d7/a0-a6
 ENDM


WB MACRO
\@bf:
 btst #6,dmaconr(a6)
 bne.s \@bf
 ENDM

*Another version for when a6 <> dff000

WBSLOW MACRO
\@bf:
 btst #6,$dff000+dmaconr
 bne.s \@bf
 ENDM

WT MACRO
\@bf:
 btst #6,(a3)
 bne.s \@bd
 rts
\@bd: 
 btst #4,(a0)
 beq.s \@bf
 ENDM

WTNOT MACRO
\@bf:
 btst #6,(a3)
 bne.s \@bd
 rts
\@bd: 
 btst #4,(a0)
 bne.s \@bf
 ENDM
 
**

 include "macros.i"
 include "ab3:source/defs.i"

 move.w (a0)+,mors

 move.l #$dff000,a6    ; NB V. IMPORTANT: A6=CUSTOM BASE
 move.w #13,SERPER(a6)	;19200 baud, 8 bits, no parity

 jsr START

 rts

* Load level into buffers.
 clr.b doanything

PLAYTHEGAME:

 jsr INITCOPPERSCRN
 
; Get level memory.

 move.l #1,d1	
 move.l #100000,d0
 move.l 4.w,a6
 jsr -198(a6)
 move.l d0,LEVELDATA
 
 move.l #1,d1
 move.l #50000,d0
 move.l 4.w,a6
 jsr -198(a6)
 move.l d0,LEVELGRAPHICS

 move.l #1,d1
 move.l #50000,d0
 move.l 4.w,a6
 jsr -198(a6)
 move.l d0,LEVELCLIPS

; move.l #LEVELDATAD,LEVELDATA
; move.l #LEVELGRAPHICSD,LEVELGRAPHICS
; move.l #LEVELCLIPSD,LEVELCLIPS


; bra noload

 move.l doslib,a6
 move.l #LDname,d1
 move.l #1005,d2
 jsr -30(a6)
 move.l d0,LDhandle

 move.l doslib,a6
 move.l d0,d1
 move.l LEVELDATA,d2
 move.l #100000,d3
 jsr -42(a6)

 move.l doslib,a6
 move.l LDhandle,d1
 jsr -36(a6)

********

 move.l doslib,a6
 move.l #LGname,d1
 move.l #1005,d2
 jsr -30(a6)
 move.l d0,LGhandle

 move.l doslib,a6
 move.l d0,d1
 move.l LEVELGRAPHICS,d2
 move.l #50000,d3
 jsr -42(a6)

 move.l doslib,a6
 move.l LGhandle,d1
 jsr -36(a6)

********

 move.l doslib,a6
 move.l #LCname,d1
 move.l #1005,d2
 jsr -30(a6)
 move.l d0,LChandle

 move.l doslib,a6
 move.l d0,d1
 move.l LEVELCLIPS,d2
 move.l #50000,d3
 jsr -42(a6)

 move.l doslib,a6
 move.l LChandle,d1
 jsr -36(a6)

*******

noload:

********

 jsr LOADWALLS
 jsr LOAD_SFX
 jsr LOADFLOOR
 jsr LOADOBS

; move.l doslib,a6
; move.l #Prefsname,d1
; move.l #1005,d2
; jsr -30(a6)
; move.l d0,Prefshandle

; move.l doslib,a6
; move.l d0,d1
; move.l #Prefsfile,d2
; move.l #50,d3
; jsr -42(a6)

; move.l doslib,a6
; move.l Prefshandle,d1
; jsr -36(a6)

*******

 cmp.b #'s',Prefsfile+2
 seq STEREO

 move.l doslib,d0
 move.l d0,a1
 move.l 4.w,a6
 jsr CloseLib(a6)

 move.l #$dff000,a6
 move.w #$87c0,dmacon(a6)
 move.w #$8020,dmacon(a6)
 move.w intenar(a6),saveinters
 move.w #$7fff,intena(a6)
 move.w #$00ff,$dff09e

*** Put myself in supervisor mode

 move.l #blag,$80
 trap #0
; move.l $6c,d0
; move.l #blag,$6c
; move.w #$8010,intreq(a6)

 rts
 
saveit: ds.l 10
doslibname: dc.b 'dos.library',0
 even
doslib: dc.l 0

mors: dc.w 0

LDname: dc.b 'ab3:includes/twolev.bin',0
 even
LDhandle: dc.l 0
LGname: dc.b 'ab3:includes/twolev.graph.bin',0
 even
LGhandle: dc.l 0
LCname: dc.b 'ab3:includes/twolev.clips',0
 even
LChandle: dc.l 0

Prefsname: dc.b 'ram:prefs',0
 even
Prefshandle: dc.l 0

Prefsfile:
 dc.b 'k4nx'
 ds.b 50
 
 even

blag:
; move.w #$10,intreq(a6)
; move.l d0,$6c
; move.w #$7fff,intena(a6)

 move.w #$20,$dff1dc

 move.l $6c,saveit
 move.l #Chan0inter,$6c
 
****************************
* Initialize level
****************************
* Poke all clip offsets into
* correct bit of level data.
****************************
 move.l LEVELGRAPHICS,a0
 move.l 12(a0),a1
 add.l a0,a1
 move.l a1,ZoneGraphAdds
 move.l (a0),a1
 add.l a0,a1
 move.l a1,DoorData
 move.l 4(a0),a1
 add.l a0,a1
 move.l a1,LiftData
 move.l 8(a0),a1
 add.l a0,a1
 move.l a1,SwitchData
 adda.w #16,a0
 move.l a0,ZoneAdds

 move.l LEVELDATA,a1
 move.l 16+6(a1),a2
 add.l a1,a2
 move.l a2,Points
 move.w 8+6(a1),d0
 lea 4(a2,d0.w*4),a2
 move.l a2,PointBrights
 
 move.l 20+6(a1),a2
 add.l a1,a2
 move.l a2,FloorLines
 move.l 24+6(a1),a2
 add.l a1,a2
 move.l a2,ObjectData
 move.l 28+6(a1),a2
 add.l a1,a2
 move.l a2,PlayerShotData
 move.l 32+6(a1),a2
 add.l a1,a2
 move.l a2,NastyShotData
 move.l 36+6(a1),a2
 add.l a1,a2
 move.l a2,ObjectPoints  
 move.l 40+6(a1),a2
 add.l a1,a2
 move.l a2,PLR1_Obj
 move.l 44+6(a1),a2
 add.l a1,a2
 move.l a2,PLR2_Obj
 move.w 14+6(a1),NumObjectPoints

; bra noclips
  
 move.l LEVELCLIPS,a2
 moveq #0,d0
 move.w 10+6(a1),d7	;numzones
assignclips:
 move.l (a0)+,a3
 add.l a1,a3	; pointer to a zone
 adda.w #ToListOfGraph,a3 ; pointer to zonelist
dowholezone:
 tst.w (a3)
 blt.s nomorethiszone
 tst.w 2(a3)
 blt.s thisonenull

 move.l d0,d1
 asr.l #1,d1
 move.w d1,2(a3)

findnextclip:
 cmp.w #-2,(a2,d0.l)
 beq.s foundnextclip
 addq.l #2,d0
 bra.s findnextclip
foundnextclip
 addq.l #2,d0

thisonenull:
 addq #8,a3 
 bra.s dowholezone
nomorethiszone:
 dbra d7,assignclips
 
 lea (a2,d0.l),a2
 move.l a2,CONNECT_TABLE
 
noclips:

* Put in addresses of glowything


************************************
 
; cmp.b #'k',Prefsfile
; bne.s nkb
 st PLR1KEYS
 clr.b PLR1PATH
 clr.b PLR1MOUSE
 clr.b PLR1JOY
 st PLR2KEYS
 clr.b PLR2PATH
 clr.b PLR2MOUSE
 clr.b PLR2JOY
 
;nkb:
; cmp.b #'m',Prefsfile
; bne.s nmc
; clr.b PLR1KEYS
; clr.b PLR1PATH
; st PLR1MOUSE
; clr.b PLR1JOY
;nmc:
; cmp.b #'j',Prefsfile
; bne.s njc
; clr.b PLR1KEYS
; clr.b PLR1PATH
; clr.b PLR1MOUSE
; st PLR1JOY
;njc:
 
 clr.b PLR1_StoodInTop
 move.l #playerheight,PLR1s_height
 
 move.l #empty,pos1LEFT
 move.l #empty,pos2LEFT
 move.l #empty,pos1RIGHT
 move.l #empty,pos2RIGHT
 move.l #emptyend,Samp0endLEFT
 move.l #emptyend,Samp1endLEFT
 move.l #emptyend,Samp0endRIGHT
 move.l #emptyend,Samp1endRIGHT
 
 move.l #nullspr,d0
 move.w d0,s4l
 move.w d0,s5l
 move.w d0,s6l
 move.w d0,s7l
 swap d0
 move.w d0,s4h
 move.w d0,s5h
 move.w d0,s6h
 move.w d0,s7h 
 
 move.l #nullline,d0
 move.w d0,n1l
 swap d0
 move.w d0,n1h
 
 move.l #Panel,d0
 move.w d0,p1l
 swap d0
 move.w d0,p1h
 move.l #Panel+40,d0
 move.w d0,p2l
 swap d0
 move.w d0,p2h
 move.l #Panel+40*2,d0
 move.w d0,p3l
 swap d0
 move.w d0,p3h
 move.l #Panel+40*3,d0
 move.w d0,p4l
 swap d0
 move.w d0,p4h
 move.l #Panel+40*4,d0
 move.w d0,p5l
 swap d0
 move.w d0,p5h
 move.l #Panel+40*5,d0
 move.w d0,p6l
 swap d0
 move.w d0,p6h
 move.l #Panel+40*6,d0
 move.w d0,p7l
 swap d0
 move.w d0,p7h
 move.l #Panel+40*7,d0
 move.w d0,p8l
 swap d0
 move.w d0,p8h
 
*******************************
* TIMER SCREEN SETUP
; move.l #TimerScr,d0
; move.w d0,p1l
; swap d0
; move.w d0,p1h
; move.w #$1201,Panelcon

 move.l #borders,d0
 move.w d0,s0l
 swap d0
 move.w d0,s0h
 move.l #borders+2592,d0
 move.w d0,s1l
 swap d0
 move.w d0,s1h
 move.l #borders+2592*2,d0
 move.w d0,s2l
 swap d0
 move.w d0,s2h
 move.l #borders+2592*3,d0
 move.w d0,s3l
 swap d0
 move.w d0,s3h
 
 move.w #52*256+64,borders
 move.w #212*256+0,borders+8
 move.w #52*256+64,borders+2592
 move.w #212*256+128,borders+8+2592
 move.w #52*256+192,borders+2592*2
 move.w #212*256+0,borders+8+2592*2
 move.w #52*256+192,borders+2592*3
 move.w #212*256+128,borders+8+2592*3
 
 move.l #FacePlace,d0
 move.w d0,f1l
 swap d0
 move.w d0,f1h
 move.l #FacePlace+32*24,d0
 move.w d0,f2l
 swap d0
 move.w d0,f2h
 move.l #FacePlace+32*24*2,d0
 move.w d0,f3l
 swap d0
 move.w d0,f3h
 move.l #FacePlace+32*24*3,d0
 move.w d0,f4l
 swap d0
 move.w d0,f4h
 move.l #FacePlace+32*24*4,d0
 move.w d0,f5l
 swap d0
 move.w d0,f5h
  
 
 move.l #bigfield,d0
 move.w d0,ocl
 swap d0
 move.w d0,och

 bset.b #1,$bfe001
 
; jmp stuff
;endstuff:

 move.l #bigfield,$dff080    ; Point the copper at our copperlist.
 move.w #$00ff,$dff09e

; move.l #Blurbfield,$dff080

 move.w #0,d0

 move.l #scrn,d0
 move.w d0,pl1l
 swap d0
 move.w d0,pl1h

 move.l #scrn+40,d0
 move.w d0,pl2l
 swap d0
 move.w d0,pl2h

 move.l #scrn+80,d0
 move.w d0,pl3l
 swap d0
 move.w d0,pl3h

 move.l #scrn+120,d0
 move.w d0,pl4l
 swap d0
 move.w d0,pl4h

 move.l #scrn+160,d0
 move.w d0,pl5l
 swap d0
 move.w d0,pl5h

 move.l #scrn+200,d0
 move.w d0,pl6l
 swap d0
 move.w d0,pl6h

 move.l #scrn+240,d0
 move.w d0,pl7l
 swap d0
 move.w d0,pl7h


****************************
 jsr INITPLAYER
; bsr initobjpos
****************************

 
 move.l #$dff000,a6
 
 move.l #null,$dff0a0
 move.w #100,$dff0a4
 move.w #443,$dff0a6
 move.w #63,$dff0a8

 move.l #null2,$dff0b0
 move.w #100,$dff0b4
 move.w #443,$dff0b6
 move.w #63,$dff0b8

 move.l #null4,$dff0c0
 move.w #100,$dff0c4
 move.w #443,$dff0c6
 move.w #63,$dff0c8

 move.l #null3,$dff0d0
 move.w #100,$dff0d4
 move.w #443,$dff0d6
 move.w #63,$dff0d8

 move.l #tab,a1
 move.w #64,d7
 move.w #0,d6
outerlop
 move.l #pretab,a0
 move.w #255,d5
scaledownlop:
 move.b (a0)+,d0
 ext.w d0
 ext.l d0
 muls d6,d0
 asr.l #6,d0
 move.b d0,(a1)+
 dbra d5,scaledownlop
 addq #1,d6
 dbra d7,outerlop
 
 move.l #$dff000,a6

 move.w #$c018,intena(a6)
 
 move.w #$f,dmacon(a6)
 move.w #$820f,dmacon(a6)
 
; bsr protinit
 
 bsr FullEnergy
 move.w #63,OldAmmo
 move.w #0,Ammo
 bsr AmmoBar
 move.w #0,OldAmmo
 
 move.w #127,PLR1_energy
 move.w #127,PLR2_energy
 move.b #1,PLR1_GunDamage
 move.b #1,PLR2_GunDamage
 move.w #3,PLR1_GunNoise
 move.w #3,PLR2_GunNoise
 
 move.w #80,PLR1_GunData	; 10 shots pistol
 st PLR1_GunData+7
 clr.b PLR1_GunData+32+7
 clr.w PLR1_GunData+32
 move.b #0,PLR1_GunSelected
 
 move.w #80,PLR2_GunData	; 10 shots pistol
 st PLR2_GunData+7
 clr.b PLR2_GunData+32+7
 clr.w PLR2_GunData+32
 move.b #0,PLR2_GunSelected
 
; move.w #$20,$1dc(a6)
 
 move.w #$0,$dff034
 move.w #0,Conditions
 move.l #KeyMap,a5
 clr.b $45(a5)
 
 move.l #ingame,mt_data
 clr.b UseAllChannels

; cmp.b #'b',Prefsfile+3
; bne.s .noback
; jsr mt_init
;.noback:
;
; clr.b CHANNELDATA
; clr.b CHANNELDATA+8
; clr.b CHANNELDATA+16
; clr.b CHANNELDATA+24
;
; cmp.b #'b',Prefsfile+3
; bne.s noreserve
;
; st CHANNELDATA
; st CHANNELDATA+8
; st CHANNELDATA+16
; st CHANNELDATA+24
;noreserve: 
 
; st CHANNELDATA
; st CHANNELDATA+8
 
 move.l SampleList+6*8,pos0LEFT
 move.l SampleList+6*8+4,Samp0endLEFT
 move.l #playerheight,PLR1s_targheight
 move.l #playerheight,PLR1s_height
 move.l #playerheight,PLR2s_targheight
 move.l #playerheight,PLR2s_height

; cmp.b #'n',mors
; beq.s nohandshake
;
; move.b #%11011000,$bfd200
; move.b #%00010000,$bfd000
;waitloop:
; btst.b #4,$bfd000
; bne.s waitloop
; move.b #%11000000,$bfd200
 
;wtmouse:
; btst #6,$bfe001
; bne.s wtmouse
 
;nohandshake:
 st doanything
 
 
; jmp end
 
 move.l COPSCRN1,drawpt
 move.l COPSCRN2,olddrawpt
 
 jsr KInt_Init
 jsr MAKEBACKROUT
 
lop: 

 st READCONTROLS
 move.l #$dff000,a6

 move.w hitcol,d0
 beq.s nofadedownhc
 sub.w #$100,d0
 move.w d0,hitcol
 move.w d0,hitcol2
nofadedownhc:

 move.l drawpt,d0
 move.l olddrawpt,drawpt
 move.l d0,olddrawpt
 move.l d0,$dff084
 move.l drawpt,a3
 adda.w #10,a3
 move.l a3,frompt
 add.l #104*4*40,a3
 move.l a3,midpt

 cmp.b #'s',mors
 beq.s nowaitslave

waitfortop:
 btst.b #0,intreqrl(a6)
 beq waitfortop
 move.w #$1,intreq(a6)
 move.l #PLR1_GunData,GunData
 move.b PLR1_GunSelected,GunSelected
 bra waitmaster
 
nowaitslave:
 move.l #PLR2_GunData,GunData
 move.b PLR2_GunSelected,GunSelected
waitmaster:
 

 move.l waterpt,a0
 move.l (a0)+,watertouse
 cmp.l #endwaterlist,a0
 blt.s okwat
 move.l #waterlist,a0
okwat:
 move.l a0,waterpt

 add.w #640,wtan
 and.w #8191,wtan
 add.w #1,wateroff
 and.w #63,wateroff

 move.l GunData,a6
 moveq #0,d0
 move.b GunSelected,d0
 lsl.w #2,d0
 lea (a6,d0.w*8),a6
 move.w (a6),d0
 asr.w #3,d0
 move.w d0,Ammo

 move.l #$dff000,a6

 cmp.b #'s',mors
 beq ASlaveShouldWaitOnHisMaster

 cmp.b #'n',mors
 bne NotOnePlayer
 
 move.w PLR1_energy,Energy
 move.w FramesToDraw,TempFrames
 move.w #0,FramesToDraw

 move.l PLR1s_xoff,p1_xoff
 move.l PLR1s_zoff,p1_zoff
 move.l PLR1s_yoff,p1_yoff
 move.l PLR1s_height,p1_height
 move.w PLR1s_angpos,p1_angpos
 move.w PLR1_bobble,p1_bobble
 move.b PLR1_clicked,p1_clicked
 move.b PLR1_fire,p1_fire
 clr.b PLR1_clicked
 move.b PLR1_SPCTAP,p1_spctap
 clr.b PLR1_SPCTAP
 move.b PLR1_Ducked,p1_ducked
 move.b PLR1_GunSelected,p1_gunselected

 bsr PLR1_Control

 move.l PLR1_Roompt,a0
 move.l ToZoneRoof(a0),SplitHeight
 move.w p1_xoff,THISPLRxoff
 move.w p1_zoff,THISPLRzoff
 
 
 move.l #$60000,p2_yoff
 move.l PLR2_Obj,a0
 move.w #-1,GraphicRoom(a0)
 move.w #-1,12(a0)
 move.b #0,17(a0)
 move.l #BollocksRoom,PLR2_Roompt
 
 bra donetalking
 
NotOnePlayer:

 move.w PLR1_energy,Energy

 jsr SENDFIRST

 move.w FramesToDraw,TempFrames
 move.w #0,FramesToDraw
 
 move.l PLR1s_xoff,p1_xoff
 move.l PLR1s_zoff,p1_zoff
 move.l PLR1s_yoff,p1_yoff
 move.l PLR1s_height,p1_height
 move.w PLR1s_angpos,p1_angpos
 move.w PLR1_bobble,p1_bobble
 move.b PLR1_clicked,p1_clicked
 clr.b PLR1_clicked
 move.b PLR1_fire,p1_fire
 move.b PLR1_SPCTAP,p1_spctap
 clr.b PLR1_SPCTAP
 move.b PLR1_Ducked,p1_ducked
 move.b PLR1_GunSelected,p1_gunselected
 
 move.l p1_xoff,d0
 jsr SENDFIRST
 move.l d0,p2_xoff
 
 move.l p1_zoff,d0
 jsr SENDFIRST
 move.l d0,p2_zoff 
 
 move.l p1_yoff,d0
 jsr SENDFIRST
 move.l d0,p2_yoff
  
 move.l p1_height,d0
 jsr SENDFIRST
 move.l d0,p2_height
 
 move.w p1_angpos,d0
 swap d0
 move.w p1_bobble,d0
 jsr SENDFIRST
 move.w d0,p2_bobble
 swap d0
 move.w d0,p2_angpos
 
 
 move.w TempFrames,d0
 swap d0
 move.b p1_spctap,d0
 lsl.w #8,d0
 move.b p1_clicked,d0
 jsr SENDFIRST
 move.b d0,p2_clicked
 lsr.w #8,d0
 move.b d0,p2_spctap
 
 
 move.w Rand1,d0
 swap d0
 move.b p1_ducked,d0
 lsl.w #8,d0
 move.b p1_gunselected,d0
 jsr SENDFIRST
 move.b d0,p2_gunselected
 lsr.w #8,d0
 move.b d0,p2_ducked
 
 move.b p1_fire,d0
 jsr SENDFIRST
 move.b d0,p2_fire
 
 bsr PLR2_Control
 bsr PLR1_Control
 move.l PLR1_Roompt,a0
 move.l ToZoneRoof(a0),SplitHeight
 move.w p1_xoff,THISPLRxoff
 move.w p1_zoff,THISPLRzoff
 
 bra donetalking

ASlaveShouldWaitOnHisMaster:

 move.w PLR2_energy,Energy

 jsr RECFIRST

 move.l PLR2s_xoff,p2_xoff
 move.l PLR2s_zoff,p2_zoff
 move.l PLR2s_yoff,p2_yoff
 move.l PLR2s_height,p2_height
 move.w PLR2s_angpos,p2_angpos
 move.w PLR2_bobble,p2_bobble
 move.b PLR2_clicked,p2_clicked
 clr.b PLR2_clicked
 move.b PLR2_fire,p2_fire
 move.b PLR2_SPCTAP,p2_spctap
 clr.b PLR2_SPCTAP
 move.b PLR2_Ducked,p2_ducked
 move.b PLR2_GunSelected,p2_gunselected

 move.l p2_xoff,d0
 jsr RECFIRST
 move.l d0,p1_xoff
 
 move.l p2_zoff,d0
 jsr RECFIRST
 move.l d0,p1_zoff
 
 move.l p2_yoff,d0
 jsr RECFIRST
 move.l d0,p1_yoff
 
 move.l p2_height,d0
 jsr RECFIRST
 move.l d0,p1_height
 
 move.w p2_angpos,d0
 swap d0
 move.w p2_bobble,d0
 jsr RECFIRST
 move.w d0,p1_bobble
 swap d0
 move.w d0,p1_angpos
 
 
 move.b p2_spctap,d0
 lsl.w #8,d0
 move.b p2_clicked,d0
 jsr RECFIRST
 move.b d0,p1_clicked
 lsr.w #8,d0
 move.b d0,p1_spctap
 swap d0
 move.w d0,TempFrames
 
 
 move.b p2_ducked,d0
 lsl.w #8,d0
 move.b p2_gunselected,d0
 jsr RECFIRST
 move.b d0,p1_gunselected
 lsr.w #8,d0
 move.b d0,p1_ducked
 swap d0
 move.w d0,Rand1
 
 move.b p2_fire,d0
 jsr RECFIRST
 move.b d0,p1_fire
 

 bsr PLR1_Control
 bsr PLR2_Control
 move.w p2_xoff,THISPLRxoff
 move.w p2_zoff,THISPLRzoff
 move.l PLR2_Roompt,a0
 move.l ToZoneRoof(a0),SplitHeight

donetalking:

 move.l #ZoneBrightTable,a1
 move.l ZoneAdds,a2
 move.l PLR2_ListOfGraphRooms,a0
 move.l PLR2_PointsToRotatePtr,a5
 cmp.b #'s',mors
 beq.s doallz
 move.l PLR1_ListOfGraphRooms,a0
 move.l PLR1_PointsToRotatePtr,a5
 
doallz
 move.w (a0),d0
 blt.s doneallz
 add.w #8,a0
 
 move.l (a2,d0.w*4),a3
 add.l LEVELDATA,a3
 move.w ToZoneBrightness(a3),d2

 blt.s justbright
 move.w d2,d3
 lsr.w #8,d3
 tst.b d3
 beq.s justbright

 move.l #BrightAnimTable,a4
 move.w -2(a4,d3.w*2),d2
 
justbright:
 move.w d2,(a1,d0.w*4)

 move.w ToUpperBrightness(a3),d2

 blt.s justbright2
 move.w d2,d3
 lsr.w #8,d3
 tst.b d3
 beq.s justbright2

 move.l #BrightAnimTable,a4
 move.w -2(a4,d3.w*2),d2
 
justbright2:
 move.w d2,2(a1,d0.w*4)

 bra doallz

doneallz:
 
 move.l PointBrights,a2
 move.l #CurrentPointBrights,a3
justtheone:
 move.w (a5)+,d0
 blt.s whythehell
 move.w (a2,d0.w*4),d2

 tst.b d2
 blt.s .justbright
 move.w d2,d3
 lsr.w #8,d3
 tst.b d3
 beq.s .justbright

 move.w d3,d4
 and.w #$f,d3
 lsr.w #4,d4
 add.w #1,d4

 move.l #BrightAnimTable,a0
 move.w -2(a0,d3.w*2),d3
 ext.w d2
 sub.w d2,d3
 muls d4,d3
 asr.w #4,d3
 add.w d3,d2

.justbright:
 ext.w d2

 move.w d2,(a3,d0.w*4)


 move.w 2(a2,d0.w*4),d2

 tst.b d2
 blt.s .justbright2
 move.w d2,d3
 lsr.w #8,d3
 tst.b d3
 beq.s .justbright2

 move.w d3,d4
 and.w #$f,d3
 lsr.w #4,d4
 add.w #1,d4

 move.l #BrightAnimTable,a0
 move.w -2(a0,d3.w*2),d3
 ext.w d2
 sub.w d2,d3
 muls d4,d3
 asr.w #4,d3
 add.w d3,d2

.justbright2:
 ext.w d2

 move.w d2,2(a3,d0.w*4)

 bra.s justtheone
 
whythehell:

 cmp.b #'n',mors
 beq nosee

 move.l PLR1_Roompt,FromRoom
 move.l PLR2_Roompt,ToRoom
 move.w p1_xoff,Viewerx
 move.w p1_zoff,Viewerz
 move.l p1_yoff,d0
 asr.l #7,d0
 move.w d0,Viewery
 move.w p2_xoff,Targetx
 move.w p2_zoff,Targetz
 move.l p2_yoff,d0
 asr.l #7,d0
 move.w d0,Targety
 move.b PLR1_StoodInTop,ViewerTop
 move.b PLR2_StoodInTop,TargetTop
 jsr CanItBeSeen
 
 move.l PLR1_Obj,a0
 move.b CanSee,d0
 and.b #2,d0
 move.b d0,17(a0)
 move.l PLR2_Obj,a0
 move.b CanSee,d0
 and.b #1,d0
 move.b d0,17(a0)

nosee:

 move.l PLR1_Obj,a0
 move.b #5,16(a0)
 move.l PLR2_Obj,a0
 move.b #11,16(a0)

 move.w TempFrames,d0
 add.w d0,p1_holddown
 cmp.w #30,p1_holddown
 blt.s oklength
 move.w #30,p1_holddown
oklength:

 tst.b p1_fire
 bne.s okstillheld
 sub.w d0,p1_holddown
 bge.s okstillheld
 move.w #0,p1_holddown
 
okstillheld:

 move.w TempFrames,d0
 add.w d0,p2_holddown
 
 cmp.w #30,p2_holddown
 blt.s oklength2
 move.w #30,p2_holddown
oklength2:
 
 
 tst.b p2_fire
 bne.s okstillheld2
 sub.w d0,p2_holddown
 bge.s okstillheld2
 move.w #0,p2_holddown
okstillheld2:

 move.l #PLR1_GunData,a1
 move.w p1_holddown,d0
 move.w d0,10+32*3(a1)
 move.l #PLR2_GunData,a1
 move.w p2_holddown,d0
 move.w d0,10+32*3(a1)

 
******************************************
******************************************
 
 
 cmp.b #'s',mors
 beq.s ImPlayer2OhYesIAm
 bsr USEPLR1
 bra IWasPlayer1
 
ImPlayer2OhYesIAm:
 bsr USEPLR2
IWasPlayer1:
 

 cmp.b #'s',mors
 beq drawplayer2
 
 move.w #0,scaleval
 move.l PLR1_xoff,xoff
 move.l PLR1_yoff,yoff
 move.l PLR1_zoff,zoff
 move.w PLR1_angpos,angpos
 move.w PLR1_cosval,cosval
 move.w PLR1_sinval,sinval
 move.l PLR1_ListOfGraphRooms,ListOfGraphRooms
 move.l PLR1_PointsToRotatePtr,PointsToRotatePtr
 move.l PLR1_Roompt,Roompt

 bsr OrderZones
 jsr objmoveanim
 bsr EnergyBar
 bsr AmmoBar


 move.w #0,leftclip
 move.w #96,rightclip
 move.w #0,deftopclip
 move.w #79,defbotclip
 move.w #0,topclip
 move.w #79,botclip
; sub.l #10*104*4,frompt
; sub.l #10*104*4,midpt

* Subroom loop

 bsr DrawDisplay 



 bra nodrawp2
 
drawplayer2
 
 move.w #0,scaleval
 move.l PLR2_xoff,xoff
 move.l PLR2_yoff,yoff
 move.l PLR2_zoff,zoff
 move.w PLR2_angpos,angpos
 move.w PLR2_cosval,cosval
 move.w PLR2_sinval,sinval
 move.l PLR2_ListOfGraphRooms,ListOfGraphRooms
 move.l PLR2_PointsToRotatePtr,PointsToRotatePtr
 move.l PLR2_Roompt,Roompt

 bsr OrderZones
 jsr objmoveanim
 bsr EnergyBar
 bsr AmmoBar

 move.w #0,leftclip
 move.w #96,rightclip
 move.w #0,deftopclip
 move.w #79,defbotclip
 move.w #0,topclip
 move.w #79,botclip

 bsr DrawDisplay

nodrawp2:
 
 move.l PLR2_Roompt,a0
 move.l #WorkSpace,a1
 clr.l (a1)
 clr.l 4(a1)
 clr.l 8(a1)
 clr.l 12(a1)
 clr.l 16(a1)
 clr.l 20(a1)
 clr.l 24(a1)
 clr.l 28(a1)
 
 cmp.b #'n',mors
 beq.s plr1only
 
 lea ToListOfGraph(a0),a0
.doallrooms:
 move.w (a0),d0
 blt.s .allroomsdone
 addq #8,a0
 move.w d0,d1
 asr.w #3,d0
 bset d1,(a1,d0.w)
 bra .doallrooms
.allroomsdone:

plr1only:

 move.l PLR1_Roompt,a0
 lea ToListOfGraph(a0),a0
.doallrooms2:
 move.w (a0),d0
 blt.s .allroomsdone2
 addq #8,a0
 move.w d0,d1
 asr.w #3,d0
 bset d1,(a1,d0.w)
 bra .doallrooms2
.allroomsdone2:

 move.l ObjectData,a0
 sub.w #64,a0
.doallobs:
 add.w #64,a0
 move.w (a0),d0
 blt.s .allobsdone
 move.w 12(a0),d0
 blt.s .doallobs
 move.w d0,d1
 asr.w #3,d0
 btst d1,(a1,d0.w)
 beq.s .doallobs
 or.b #127,worry(a0)
 bra.s .doallobs
.allobsdone:
 
 
 
; move.l #brightentab,a0
; move.l frompt,a3
; adda.w #(4*33)+(104*4*20),a3
; move.w #20,d7
; move.w #20,d6
;horl:
; move.w d6,d5
; move.l a3,a1
;vertl
; move.w (a1),d0
; move.w (a0,d0.w*2),(a1)
; addq #4,a1
; dbra d5,vertl
; adda.w #104*4,a3
; dbra d7,horl

 move.l #$dff000,a6

; move.w #$300,col0(a6)

 move.l #KeyMap,a5
 tst.b $45(a5)
 beq.s noend
 bra endnomusic
noend:
 
 tst.w PLR1_energy
 ble end
 tst.w PLR2_energy
 ble end

 move.l SwitchData,a0
 tst.b 24+8(a0)
 bne end
  
 JSR STOPTIMER
 
 bra lop

***************************************************************************
***************************************************************************
****************** End of Main Loop here ********************************** 
***************************************************************************
***************************************************************************

putinsmallscr:
 move.l #$1fe0000,statskip
 move.l #$1fe0000,statskip+4

 move.l #healthpal,a5
 move.l COPSCRN1,a0
 move.l COPSCRN2,a2
 move.w #scrheight-1,d0
 move.l #0,d6
 move.w #0,d3
 move.w #$2bdf,startwait
 move.w #$2d01,endwait
.fillcop
 move.w #$180,d1

 move.l a0,a1
 move.l a2,a3
 move.w #$10c,(a1)+
 move.w #$10c,(a3)+
 move.w d3,(a1)+
 move.w d3,(a3)+
 eor.w #$8000,d3

 move.w #$106,(a1)+
 move.w #$106,(a3)+
 move.w #$2c42,d5
 or.w d3,d5
 and.w #$fffe,d5
 move.w d5,(a1)+
 move.w d5,(a3)+
 bsr do32

 move.w #$106,(a1)+
 move.w #$106,(a3)+
 move.w #$4c42,d5
 or.w d3,d5
 and.w #$fffe,d5
 move.w d5,(a1)+
 move.w d5,(a3)+
 bsr do32

 move.w #$106,(a1)+
 move.w #$106,(a3)+
 move.w #$6c42,d5
 or.w d3,d5
 and.w #$fffe,d5
 move.w d5,(a1)+
 move.w d5,(a3)+
 bsr do32
 

 move.l #$1060c42,(a1)+
 move.l #$1060c42,(a3)+
 move.w #$19e,(a1)+
 move.w (a5),(a1)+
 move.w #$19e,(a3)+
 move.w (a5)+,(a3)+

**********************************

 adda.w #104*4,a0
 adda.w #104*4,a2
 dbra d0,.fillcop

 move.w #$48,fetchstart
 move.w #$88,fetchstop
 move.w #$2cb1,winstart
 move.w #$2c91,winstop
 move.w #-24,modulo
 move.w #-24,modulo+4

 move.l #nullspr,d0
 move.w d0,s4l
 move.w d0,s5l
 move.w d0,s6l
 move.w d0,s7l
 swap d0
 move.w d0,s4h
 move.w d0,s5h
 move.w d0,s6h
 move.w d0,s7h 

 move.l #borders,d0
 move.w d0,s0l
 swap d0
 move.w d0,s0h
 move.l #borders+2592,d0
 move.w d0,s1l
 swap d0
 move.w d0,s1h
 move.l #borders+2592*2,d0
 move.w d0,s2l
 swap d0
 move.w d0,s2h
 move.l #borders+2592*3,d0
 move.w d0,s3l
 swap d0
 move.w d0,s3h

 
 move.l #scrn+40,a0
 move.l #scrn+160,a1
 move.l #scrn+280,a2
 move.l #smallscrntab,a3
 move.w #191,d7	; counter
 move.w #0,d1	; xpos
.plotscrnloop:
 move.b (a3)+,d0
 move.w d1,d2
 asr.w #3,d2
 move.b d1,d3
 not.b d3
 bclr.b d3,-40(a0,d2.w)
 bclr.b d3,(a0,d2.w)
 bclr.b d3,40(a0,d2.w)
 bclr.b d3,-40(a1,d2.w)
 bclr.b d3,(a1,d2.w)
 bclr.b d3,40(a1,d2.w)
 bclr.b d3,-40(a2,d2.w)
 btst #0,d0
 beq.s .nobp1
 bset.b d3,-40(a0,d2.w)
.nobp1:
 btst #1,d0
 beq.s .nobp2
 bset.b d3,(a0,d2.w)
.nobp2:
 btst #2,d0
 beq.s .nobp3
 bset.b d3,40(a0,d2.w)
.nobp3:
 btst #3,d0
 beq.s .nobp4
 bset.b d3,-40(a1,d2.w)
.nobp4:
 btst #4,d0
 beq.s .nobp5
 bset.b d3,(a1,d2.w)
.nobp5:
 btst #5,d0
 beq.s .nobp6
 bset.b d3,40(a1,d2.w)
.nobp6:
 btst #6,d0
 beq.s .nobp7
 bset.b d3,-40(a2,d2.w)
.nobp7:

 addq #1,d1

 dbra d7,.plotscrnloop


 rts

putinlargescr:

 move.l #$1000000,statskip
 move.l #$fffffffe,statskip+4

 move.l #healthpal,a5
 move.l COPSCRN1,a0
 move.l COPSCRN2,a2
 move.w #scrheight-1,d0
 move.l #0,d6
 move.w #0,d3
 move.w #$29df,startwait
 move.w #$2b01,endwait
.fillcop
 move.w #$180,d1

 move.l a0,a1
 move.l a2,a3
 move.w #$10c,(a1)+
 move.w #$10c,(a3)+
 move.w d3,(a1)+
 move.w d3,(a3)+
 eor.w #$8000,d3

 move.w #$106,(a1)+
 move.w #$106,(a3)+
 move.w #$2c42,d5
 or.w d3,d5
 and.w #$fffe,d5
 move.w d5,(a1)+
 move.w d5,(a3)+
 bsr do32

 move.w #$106,(a1)+
 move.w #$106,(a3)+
 move.w #$4c42,d5
 or.w d3,d5
 and.w #$fffe,d5
 move.w d5,(a1)+
 move.w d5,(a3)+
 bsr do32

 move.w #$106,(a1)+
 move.w #$106,(a3)+
 move.w #$6c42,d5
 or.w d3,d5
 and.w #$fffe,d5
 move.w d5,(a1)+
 move.w d5,(a3)+
 bsr do32
 
 move.w startwait,(a1)+
 move.w #$fffe,(a1)+
 move.w endwait,(a1)+
 move.w #$ff00,(a1)+
 move.w startwait,(a3)+
 move.w #$fffe,(a3)+
 move.w endwait,(a3)+
 move.w #$ff00,(a3)+
 
 
 add.w #$300,startwait
 add.w #$300,endwait

; move.l #$1060c42,(a1)+
; move.l #$1060c42,(a3)+
; move.w #$19e,(a1)+
; move.w (a5),(a1)+
; move.w #$19e,(a3)+
; move.w (a5)+,(a3)+

**********************************

 adda.w #104*4,a0
 adda.w #104*4,a2
 dbra d0,.fillcop

 move.w #$38,fetchstart
 move.w #$b8,fetchstop
 move.w #$2c81,winstart
 move.w #$2cc1,winstop
 move.w #-40,modulo
 move.w #-40,modulo+4

 move.l #nullspr,d0
 move.w d0,s0l
 move.w d0,s1l
 move.w d0,s2l
 move.w d0,s3l
 move.w d0,s4l
 move.w d0,s5l
 move.w d0,s6l
 move.w d0,s7l
 swap d0
 move.w d0,s0h
 move.w d0,s1h
 move.w d0,s2h
 move.w d0,s3h
 move.w d0,s4h
 move.w d0,s5h
 move.w d0,s6h
 move.w d0,s7h 
 
 move.l #scrn+40,a0
 move.l #scrn+160,a1
 move.l #scrn+280,a2
 move.l #scrntab,a3
 move.w #319,d7	; counter
 move.w #0,d1	; xpos
.plotscrnloop:
 move.b (a3)+,d0
 move.w d1,d2
 asr.w #3,d2
 move.b d1,d3
 not.b d3
 bclr.b d3,-40(a0,d2.w)
 bclr.b d3,(a0,d2.w)
 bclr.b d3,40(a0,d2.w)
 bclr.b d3,-40(a1,d2.w)
 bclr.b d3,(a1,d2.w)
 bclr.b d3,40(a1,d2.w)
 bclr.b d3,-40(a2,d2.w)
 btst #0,d0
 beq.s .nobp1
 bset.b d3,-40(a0,d2.w)
.nobp1:
 btst #1,d0
 beq.s .nobp2
 bset.b d3,(a0,d2.w)
.nobp2:
 btst #2,d0
 beq.s .nobp3
 bset.b d3,40(a0,d2.w)
.nobp3:
 btst #3,d0
 beq.s .nobp4
 bset.b d3,-40(a1,d2.w)
.nobp4:
 btst #4,d0
 beq.s .nobp5
 bset.b d3,(a1,d2.w)
.nobp5:
 btst #5,d0
 beq.s .nobp6
 bset.b d3,40(a1,d2.w)
.nobp6:
 btst #6,d0
 beq.s .nobp7
 bset.b d3,-40(a2,d2.w)
.nobp7:

 addq #1,d1

 dbra d7,.plotscrnloop




 rts

READCONTROLS: dc.w 0

tstststst: dc.w 0

BollocksRoom:
 dc.w -1
 ds.l 50

USEPLR1:

***********************************

 move.l PLR1_Obj,a0 
 move.l ObjectPoints,a1
 move.l #ObjRotated,a2
 move.w (a0),d0
 move.l PLR1_xoff,(a1,d0.w*8)
 move.l PLR1_zoff,4(a1,d0.w*8)
 move.l PLR1_Roompt,a1

 move.b damagetaken(a0),d2
 beq .notbeenshot
 move.w #$f00,hitcol
 move.w #$f00,hitcol2
 ext.w d2
 sub.w d2,PLR1_energy
 movem.l d0-d7/a0-a6,-(a7)
 move.b #$fb,IDNUM
 move.w #19,Samplenum
 clr.b notifplaying
 move.w #0,Noisex
 move.w #0,Noisez
 move.w #100,Noisevol
 jsr MakeSomeNoise
 
 movem.l (a7)+,d0-d7/a0-a6

.notbeenshot
 move.b #0,damagetaken(a0)
 move.b PLR1_energy+1,numlives(a0)

 move.b PLR1_StoodInTop,ObjInTop(a0)
 
 move.w (a1),12(a0)
 move.w (a1),d2
 move.l #ZoneBrightTable,a1
 move.l (a1,d2.w*4),d2
 tst.b PLR1_StoodInTop
 bne.s .okinbott
 swap d2
.okinbott:

 move.w d2,2(a0)
 
 move.l PLR1_yoff,d0
 move.l PLR1_height,d1
 asr.l #1,d1
 add.l d1,d0
 asr.l #7,d0
 move.w d0,4(a0)

***********************************

 move.l PLR2_Obj,a0 
 
 move.w PLR2_angpos,d0
 and.w #8190,d0
 move.w d0,Facing(a0)
 
 jsr ViewpointToDraw
 asl.w #2,d0
 moveq #0,d1
 move.b p2_bobble,d1
 not.b d1
 lsr.b #3,d1
 and.b #$3,d1
 add.w d1,d0
 move.w d0,10(a0)
 
 move.w #10,8(a0)
 
 move.l ObjectPoints,a1
 move.l #ObjRotated,a2
 move.w (a0),d0
 move.l PLR2_xoff,(a1,d0.w*8)
 move.l PLR2_zoff,4(a1,d0.w*8)
 move.l PLR2_Roompt,a1

 move.b damagetaken(a0),d2
 beq .notbeenshot2
 ext.w d2
 sub.w d2,PLR2_energy
.notbeenshot2
 move.b #0,damagetaken(a0)
 move.b PLR2_energy+1,numlives(a0)

 move.b PLR2_StoodInTop,ObjInTop(a0)
 
 move.w (a1),12(a0)
 move.w (a1),d2
 move.l #ZoneBrightTable,a1
 move.l (a1,d2.w*4),d2
 tst.b PLR2_StoodInTop
 bne.s .okinbott2
 swap d2
.okinbott2:

 move.w d2,2(a0)
 
 move.l PLR2_yoff,d0
 move.l PLR2_height,d1
 asr.l #1,d1
 add.l d1,d0
 asr.l #7,d0
 move.w d0,4(a0)

**********************************

 move.l PLR1_Obj,a0
 move.w PLR1_sinval,d4
 muls #100,d4
 move.w PLR1_cosval,d5
 muls #100,d5
 
 move.b PLR1_GunSelected,d0
 asl.b #2,d0
 add.b PLR1_GunFrame,d0
 move.b d0,11+128(a0)
 
 tst.b PLR1_GunFrame
 beq.s .noless
 subq.b #1,PLR1_GunFrame
.noless: 

 move.b ObjInTop(a0),ObjInTop+128(a0)
 
 move.l ObjectPoints,a1
 move.w 128(a0),d0
 move.l PLR1_xoff,d1
 add.l d4,d1
 move.l d1,(a1,d0.w*8)
 move.l PLR1_zoff,d1
 add.l d5,d1
 move.l d1,4(a1,d0.w*8)
 move.w 4(a0),d0
 move.l PLR1_height,d1
 asr.l #8,d1
 sub.w d1,d0
 
 add.w #16,d0
 move.w d0,4+128(a0)
 move.w #$2010,6+128(a0)

 move.w 12(a0),12+128(a0)

 move.w 2(a0),2+128(a0)

 rts

***************************************************
**************************************************

USEPLR2:

***********************************

 move.l PLR2_Obj,a0 
 move.l ObjectPoints,a1
 move.l #ObjRotated,a2
 move.w (a0),d0
 move.l PLR2_xoff,(a1,d0.w*8)
 move.l PLR2_zoff,4(a1,d0.w*8)
 move.l PLR2_Roompt,a1

 move.b damagetaken(a0),d2
 beq .notbeenshot
 move.w #$f00,hitcol
 move.w #$f00,hitcol2
 ext.w d2
 sub.w d2,PLR2_energy
 movem.l d0-d7/a0-a6,-(a7)
 move.w #19,Samplenum
 clr.b notifplaying
 move.b #$fb,IDNUM
 move.w #0,Noisex
 move.w #0,Noisez
 move.w #100,Noisevol
 jsr MakeSomeNoise
 
 movem.l (a7)+,d0-d7/a0-a6

.notbeenshot
 move.b #0,damagetaken(a0)
 move.b PLR2_energy+1,numlives(a0)

 move.b PLR2_StoodInTop,ObjInTop(a0)
 
 move.w (a1),12(a0)
 move.w (a1),d2
 move.l #ZoneBrightTable,a1
 move.l (a1,d2.w*4),d2
 tst.b PLR1_StoodInTop
 bne.s .okinbott
 swap d2
.okinbott:

 move.w d2,2(a0)
 
 move.l PLR2_yoff,d0
 move.l PLR2_height,d1
 asr.l #1,d1
 add.l d1,d0
 asr.l #7,d0
 move.w d0,4(a0)

***********************************

 move.l PLR1_Obj,a0 

 move.w PLR1_angpos,d0
 and.w #8190,d0
 move.w d0,Facing(a0)
 
 jsr ViewpointToDraw
 asl.w #2,d0
 moveq #0,d1
 move.b p1_bobble,d1
 not.b d1
 lsr.b #3,d1
 and.b #$3,d1
 add.w d1,d0
 move.w d0,10(a0)
 move.w #10,8(a0)


 move.l ObjectPoints,a1
 move.l #ObjRotated,a2
 move.w (a0),d0
 move.l PLR1_xoff,(a1,d0.w*8)
 move.l PLR1_zoff,4(a1,d0.w*8)
 move.l PLR1_Roompt,a1

 move.b damagetaken(a0),d2
 beq .notbeenshot2
 ext.w d2
 sub.w d2,PLR1_energy
.notbeenshot2
 move.b #0,damagetaken(a0)
 move.b PLR1_energy+1,numlives(a0)

 move.b PLR1_StoodInTop,ObjInTop(a0)
 
 move.w (a1),12(a0)
 move.w (a1),d2
 move.l #ZoneBrightTable,a1
 move.l (a1,d2.w*4),d2
 tst.b PLR1_StoodInTop
 bne.s .okinbott2
 swap d2
.okinbott2:

 move.w d2,2(a0)
 
 move.l PLR1_yoff,d0
 move.l PLR1_height,d1
 asr.l #1,d1
 add.l d1,d0
 asr.l #7,d0
 move.w d0,4(a0)

**********************************

 move.l PLR2_Obj,a0
 move.w PLR2_sinval,d4
 muls #100,d4
 move.w PLR2_cosval,d5
 muls #100,d5
 
 move.b PLR2_GunSelected,d0
 asl.b #2,d0
 add.b PLR2_GunFrame,d0
 move.b d0,11+64(a0)
 
 tst.b PLR2_GunFrame
 beq.s .noless
 subq.b #1,PLR2_GunFrame
.noless: 
 move.b ObjInTop(a0),ObjInTop+64(a0)
 
 move.l ObjectPoints,a1
 move.w 64(a0),d0
 move.l PLR2_xoff,d1
 add.l d4,d1
 move.l d1,(a1,d0.w*8)
 move.l PLR2_zoff,d1
 add.l d5,d1
 move.l d1,4(a1,d0.w*8)
 move.w 4(a0),d0
 move.l PLR2_height,d1
 asr.l #8,d1
 sub.w d1,d0
 add.w #16,d0
 move.w d0,4+64(a0)
 move.w #$2010,6+64(a0)

 move.w 12(a0),12+64(a0)

 move.w 2(a0),2+64(a0)
 
 rts


GunSelected: dc.b 0
 even

GunData: dc.l 0

PLR1_GunData:
; 0=Pistol 1=Big Gun
; ammoleft,ammopershot(b),gunnoise(b),ammoinclip(b)

; VISIBLE/INSTANT (0/FF)
; damage,gotgun(b)
; Delay (w), Lifetime of bullet (w)
; Click or hold down (0,1)
; BulSpd: (w)

;0
 dc.w 0
;2
 dc.b 8,3
;4
 dc.b 20
;5
 dc.b -1
;6
 dc.b 1,$ff
;8
 dc.w 5,-1,1,0
 dc.w 0,0
 
 ds.w 6
 
 dc.w 0
 dc.b 8,1
 dc.b 40
 dc.b 0
 dc.b 4,0
 dc.w 10,-1,0,5
 dc.w 0,0

 ds.w 6

 dc.w 0
 dc.b 8,9
 dc.b 5
 dc.b 0
 dc.b 10,0
 dc.w 50,-1,0,5
 dc.w 0,0
 
 ds.w 6
 
 dc.w 90*8
 dc.b 1,22
 dc.b 40
 dc.b 0
 dc.b 4,$0	
 dc.w 0,0,1,4
 dc.w 0,0
 
 ds.w 6

 dc.w 90*8
 dc.b 1,9
 dc.b 10
 dc.b 0
 dc.b 2,$FF
 dc.w 50,100,0,5
 dc.w 60,1
 dc.w -1000
 
 ds.w 5


PLR2_GunData:
; 0=Pistol 1=Big Gun
; ammoleft,ammopershot(b),gunnoise(b),ammoinclip(b)

; VISIBLE/INSTANT (0/FF)
; damage,gotgun(b)
; Delay (w)

 dc.w 0
 dc.b 8,3
 dc.b 20
 dc.b -1
 dc.b 1,$ff
 dc.w 5,-1,1,0
 dc.w 0,0
 
 ds.w 6
 
 dc.w 0
 dc.b 8,1
 dc.b 40
 dc.b 0
 dc.b 4,0
 dc.w 10,-1,0,5
 dc.w 0,0

 ds.w 6

 dc.w 0
 dc.b 8,9
 dc.b 5
 dc.b 0
 dc.b 10,0
 dc.w 50,-1,0,5
 dc.w 0,0

 ds.w 6

 dc.w 90*8
 dc.b 1,22
 dc.b 40
 dc.b 0
 dc.b 4,0	
 dc.w 0,-1,1,4
 dc.w 0,0

 ds.w 6
 
 dc.w 90*8
 dc.b 1,9
 dc.b 10
 dc.b 0
 dc.b 2,$ff
 dc.w 50,100,0,5
 dc.w 60
 dc.b 64,1
 dc.w -1000
 
 ds.w 5

protA: dc.w 0

Path:
; incbin "testpath"
endpath:
pathpt: dc.l Path


PLR1KEYS: dc.b 0
PLR1PATH: dc.b 0
PLR1MOUSE: dc.b -1
PLR1JOY: dc.b 0
PLR2KEYS: dc.b 0
PLR2PATH: dc.b 0
PLR2MOUSE: dc.b -1
PLR2JOY: dc.b 0
 
 even

PLR1_bobble: dc.w 0
PLR2_bobble: dc.w 0
xwobble: dc.l 0
xwobxoff: dc.w 0
xwobzoff: dc.w 0

PLR1_Control:

; Take a snapshot of everything.

 move.l PLR1_xoff,d2
 move.l d2,PLR1_oldxoff
 move.l d2,oldx
 move.l PLR1_zoff,d3
 move.l d3,PLR1_oldzoff
 move.l d3,oldz
 move.l p1_xoff,d0
 move.l d0,PLR1_xoff
 move.l d0,newx
 move.l p1_zoff,d1
 move.l d1,newz
 move.l d1,PLR1_zoff

 move.l p1_height,PLR1_height
 
 sub.l d2,d0
 sub.l d3,d1
 move.l d0,xdiff
 move.l d1,zdiff
 move.w p1_angpos,d0
 move.w d0,PLR1_angpos
 
 move.l #SineTable,a1
 move.w (a1,d0.w),PLR1_sinval
 add.w #2048,d0
 and.w #8190,d0
 move.w (a1,d0.w),PLR1_cosval

 move.l p1_yoff,d0
 move.w p1_bobble,d1
 move.w (a1,d1.w),d1
 move.w d1,d3
 ble.s notnegative
 neg.w d1
notnegative:
 add.w #16384,d1
 asr.w #4,d1
 add.w d1,d1
 ext.l d1
 add.l d1,d0
 
 asr.w #6,d3
 ext.l d3
 move.l d3,xwobble
 move.w PLR1_sinval,d1
 muls d3,d1
 move.w PLR1_cosval,d2
 muls d3,d2
 swap d1
 swap d2
 asr.w #7,d1
 move.w d1,xwobxoff
 asr.w #7,d2
 neg.w d2
 move.w d2,xwobzoff
 
 
 move.l d0,PLR1_yoff
 move.l d0,newy
 move.l d0,oldy
 move.l PLR1_height,thingheight
 move.l #40*256,StepUpVal
 tst.b PLR1_Ducked
 beq.s .okbigstep
 move.l #10*256,StepUpVal
.okbigstep:
 
 move.l #$1000000,StepDownVal
 
 move.l PLR1_Roompt,a0
 move.w ToTelZone(a0),d0
 blt .noteleport
 
 move.w ToTelX(a0),newx
 move.w ToTelZ(a0),newz
 move.w #-1,CollId
 move.w #%111111111111,CollideFlags
 bsr Collision
 tst.b hitwall
 beq.s .teleport
 
 move.w PLR1_xoff,newx
 move.w PLR1_zoff,newz
 bra .noteleport
 
.teleport:

 move.l PLR1_Roompt,a0
 move.w ToTelZone(a0),d0
 move.w ToTelX(a0),PLR1_xoff
 move.w ToTelZ(a0),PLR1_zoff
 move.l PLR1_yoff,d1
 sub.l ToZoneFloor(a0),d1
 move.l ZoneAdds,a0
 move.l (a0,d0.w*4),a0
 add.l LEVELDATA,a0
 move.l a0,PLR1_Roompt
 add.l ToZoneFloor(a0),d1
 move.l d1,PLR1s_yoff
 move.l d1,PLR1_yoff
 move.l d1,PLR1s_tyoff
 move.l PLR1_xoff,PLR1s_xoff
 move.l PLR1_zoff,PLR1s_zoff
 
 SAVEREGS
 move.w #0,Noisex
 move.w #0,Noisez
 move.w #26,Samplenum
 move.w #100,Noisevol
 move.b #$fa,IDNUM
 jsr MakeSomeNoise
 GETREGS
 
 bra .cantmove
 
.noteleport:
 
 move.l PLR1_Roompt,objroom
 move.w #%100000000,wallflags
 move.b PLR1_StoodInTop,StoodInTop

 move.w #%110111000001,CollideFlags
 move.w #-1,CollId

 bsr Collision
 tst.b hitwall
 beq.s .nothitanything
 move.w oldx,PLR1_xoff
 move.w oldz,PLR1_zoff
 move.l PLR1_xoff,PLR1s_xoff
 move.l PLR1_zoff,PLR1s_zoff
 bra .cantmove
.nothitanything:

 move.w #40,extlen
 move.b #0,awayfromwall

 clr.b exitfirst
 bsr MoveObject
 move.b StoodInTop,PLR1_StoodInTop
 move.l objroom,PLR1_Roompt
 move.w newx,PLR1_xoff
 move.w newz,PLR1_zoff
 move.l PLR1_xoff,PLR1s_xoff
 move.l PLR1_zoff,PLR1s_zoff
 
.cantmove:
 
 move.l PLR1_Roompt,a0
 
 move.l ToZoneFloor(a0),d0
 tst.b PLR1_StoodInTop
 beq.s notintop
 move.l ToUpperFloor(a0),d0
notintop:

 adda.w #ToZonePts,a0
 sub.l PLR1_height,d0
 move.l d0,PLR1s_tyoff
 move.w p1_angpos,tmpangpos

; move.l (a0),a0		; jump to viewpoint list
 * A0 is pointing at a pointer to list of points to rotate
 move.w (a0)+,d1
 ext.l d1
 add.l PLR1_Roompt,d1
 move.l d1,PLR1_PointsToRotatePtr
 tst.w (a0)+
 beq.s nobackgraphics
 move.l a0,-(a7)
 jsr putinbackdrop 
 move.l (a7)+,a0
nobackgraphics:
 adda.w #10,a0
 move.l a0,PLR1_ListOfGraphRooms

*****************************************************
 rts
 
CollId: dc.w 0

PLR2_Control:

; Take a snapshot of everything.

 move.l PLR2_xoff,d2
 move.l d2,PLR2_oldxoff
 move.l d2,oldx
 move.l PLR2_zoff,d3
 move.l d3,PLR2_oldzoff
 move.l d3,oldz
 move.l p2_xoff,d0
 move.l d0,PLR2_xoff
 move.l d0,newx
 move.l p2_zoff,d1
 move.l d1,newz
 move.l d1,PLR2_zoff

 move.l p2_height,PLR2_height
 
 sub.l d2,d0
 sub.l d3,d1
 move.l d0,xdiff
 move.l d1,zdiff
 move.w p2_angpos,d0
 move.w d0,PLR2_angpos
 
 move.l #SineTable,a1
 move.w (a1,d0.w),PLR2_sinval
 add.w #2048,d0
 and.w #8190,d0
 move.w (a1,d0.w),PLR2_cosval
 
 move.l p2_yoff,d0
 move.w p2_bobble,d1
 move.w (a1,d1.w),d1
 move.w d1,d3
 ble.s .notnegative
 neg.w d1
.notnegative:
 add.w #16384,d1
 asr.w #4,d1
 add.w d1,d1
 ext.l d1
 add.l d1,d0
 
 asr.w #6,d3
 ext.l d3
 move.l d3,xwobble
 move.w PLR2_sinval,d1
 muls d3,d1
 move.w PLR2_cosval,d2
 muls d3,d2
 swap d1
 swap d2
 asr.w #7,d1
 move.w d1,xwobxoff
 asr.w #7,d2
 neg.w d2
 move.w d2,xwobzoff
 
 
 move.l d0,PLR2_yoff
 move.l d0,newy
 move.l d0,oldy
 move.l PLR2_height,thingheight
 move.l #40*256,StepUpVal
 tst.b PLR2_Ducked
 beq.s .okbigstep
 move.l #10*256,StepUpVal
.okbigstep:

 move.l #$1000000,StepDownVal

 move.l PLR2_Roompt,a0
 move.w ToTelZone(a0),d0
 blt .noteleport
 
 move.w ToTelX(a0),newx
 move.w ToTelZ(a0),newz
 move.w #-1,CollId
 move.w #%111111111111,CollideFlags
 bsr Collision
 tst.b hitwall
 beq.s .teleport
 
 move.w PLR2_xoff,newx
 move.w PLR2_zoff,newz
 bra .noteleport
 
.teleport:

 move.l PLR2_Roompt,a0
 move.w ToTelZone(a0),d0
 move.w ToTelX(a0),PLR2_xoff
 move.w ToTelZ(a0),PLR2_zoff
 move.l PLR2_yoff,d1
 sub.l ToZoneFloor(a0),d1
 move.l ZoneAdds,a0
 move.l (a0,d0.w*4),a0
 add.l LEVELDATA,a0
 move.l a0,PLR2_Roompt
 add.l ToZoneFloor(a0),d1
 move.l d1,PLR2s_yoff
 move.l d1,PLR2_yoff
 move.l d1,PLR2s_tyoff
 move.l PLR2_xoff,PLR2s_xoff
 move.l PLR2_zoff,PLR2s_zoff
 
 SAVEREGS
 move.w #0,Noisex
 move.w #0,Noisez
 move.w #26,Samplenum
 move.w #100,Noisevol
 move.b #$fa,IDNUM
 jsr MakeSomeNoise
 GETREGS
 
 bra .cantmove
 
.noteleport:

 
 move.l PLR2_Roompt,objroom
 move.w #%100000000000,wallflags
 move.b PLR2_StoodInTop,StoodInTop

 move.w #%010111100001,CollideFlags
 move.w #-1,CollId

 bsr Collision
 tst.b hitwall
 beq.s .nothitanything
 move.w oldx,PLR2_xoff
 move.w oldz,PLR2_zoff
 move.l PLR2_xoff,PLR2s_xoff
 move.l PLR2_zoff,PLR2s_zoff
 bra .cantmove
.nothitanything:

 move.w #40,extlen
 move.b #0,awayfromwall

 clr.b exitfirst
 bsr MoveObject
 move.b StoodInTop,PLR2_StoodInTop
 move.w #0,wallflags
 move.l objroom,PLR2_Roompt
 move.w newx,PLR2_xoff
 move.w newz,PLR2_zoff
 move.l PLR2_xoff,PLR2s_xoff
 move.l PLR2_zoff,PLR2s_zoff
 
.cantmove
 
 move.l PLR2_Roompt,a0
 
 move.l ToZoneFloor(a0),d0
 tst.b PLR2_StoodInTop
 beq.s .notintop
 move.l ToUpperFloor(a0),d0
.notintop:

 adda.w #ToZonePts,a0
 sub.l PLR2_height,d0
 move.l d0,PLR2s_tyoff
 move.w p2_angpos,tmpangpos

; move.l (a0),a0		; jump to viewpoint list
 * A0 is pointing at a pointer to list of points to rotate
 move.w (a0)+,d1
 ext.l d1
 add.l PLR2_Roompt,d1
 move.l d1,PLR2_PointsToRotatePtr
 tst.w (a0)+
 beq.s .nobackgraphics
 move.l a0,-(a7)
 jsr putinbackdrop 
 move.l (a7)+,a0
.nobackgraphics:
 adda.w #10,a0
 move.l a0,PLR2_ListOfGraphRooms

*****************************************************

 rts


KeyMap: ds.b 256


DrawDisplay:

 move.l #SineTable,a0
 move.w angpos,d0
 move.w (a0,d0.w),d6
 adda.w #2048,a0
 move.w (a0,d0.w),d7
 move.w d6,sinval
 move.w d7,cosval

 move.l yoff,d0
 asr.l #8,d0
 move.w d0,d1
 add.w #256-32,d1
 and.w #255,d1
 move.w d1,wallyoff
 asl.w #2,d0
 move.w d0,flooryoff
 
 move.w xoff,d6
 move.w d6,d3
 asr.w #1,d3
 add.w d3,d6
 asr.w #1,d6
 move.w d6,xoff34
 
 move.w zoff,d6
 move.w d6,d3
 asr.w #1,d3
 add.w d3,d6
 asr.w #1,d6
 move.w d6,zoff34

 bsr RotateLevelPts
 bsr RotateObjectPts
 bsr CalcPLR1InLine
 cmp.b #'n',mors
 bne.s doplr2too
 move.l PLR2_Obj,a0
 move.w #-1,12(a0)
 move.w #-1,GraphicRoom(a0)
 bra noplr2either

doplr2too:
 bsr CalcPLR2InLine
noplr2either:

 move.l endoflist,a0
subroomloop:
 move.w -(a0),d7
 blt jumpoutofrooms
 
; bsr setlrclip
; move.w leftclip,d0
; cmp.w rightclip,d0
; bge subroomloop
 move.l a0,-(a7)
 
 move.l ZoneAdds,a0
 move.l (a0,d7.w*4),a0
 add.l LEVELDATA,a0
 move.l ToZoneRoof(a0),SplitHeight
 
 move.l ZoneGraphAdds,a0
 move.l 4(a0,d7.w*8),a2
 move.l (a0,d7.w*8),a0
 
 add.l LEVELGRAPHICS,a0
 add.l LEVELGRAPHICS,a2
 move.l a2,ThisRoomToDraw+4
 move.l a0,ThisRoomToDraw

 move.l ListOfGraphRooms,a1
 
finditit:
 tst.w (a1)
 blt nomoretodoatall
 cmp.w (a1),d7
 beq outoffind
 adda.w #8,a1
 bra finditit
 
outoffind:

 move.l a1,-(a7)

 move.w #0,leftclip
 move.w #96,rightclip
 moveq #0,d7
 move.w 2(a1),d7
 blt.s outofrcliplop
 move.l LEVELCLIPS,a0
 lea (a0,d7.l*2),a0

 tst.w (a0)
 blt outoflcliplop
 
 bsr NEWsetlclip
 
intolcliplop:		; clips
 tst.w (a0)
 blt outoflcliplop
 
 bsr NEWsetlclip 
 bra intolcliplop
 
outoflcliplop:

 addq #2,a0

 tst.w (a0)
 blt outofrcliplop
 
 bsr NEWsetrclip
 
intorcliplop:		; clips
 tst.w (a0)
 blt outofrcliplop
 
 bsr NEWsetrclip 
 bra intorcliplop
 
outofrcliplop:
 
 move.w leftclip,d0
 cmp.w #95,d0
 bge dontbothercantseeit
 move.w rightclip,d1
 blt dontbothercantseeit
 cmp.w d1,d0
 bge dontbothercantseeit
 
 move.l yoff,d0
 cmp.l SplitHeight,d0
 blt.s botfirst
 
 move.l ThisRoomToDraw+4,a0
 cmp.l LEVELGRAPHICS,a0
 beq.s noupperroom
 st DOUPPER
 move.l #CurrentPointBrights+2,PointBrightsPtr
 bsr dothisroom
noupperroom:
 move.l ThisRoomToDraw,a0
 clr.b DOUPPER
 move.l #CurrentPointBrights,PointBrightsPtr
 bsr dothisroom
 
 bra dontbothercantseeit
botfirst:

 move.l ThisRoomToDraw,a0
 clr.b DOUPPER
 move.l #CurrentPointBrights,PointBrightsPtr
 bsr dothisroom
 move.l ThisRoomToDraw+4,a0
 cmp.l LEVELGRAPHICS,a0
 beq.s noupperroom2
 move.l #CurrentPointBrights+2,PointBrightsPtr
 st DOUPPER
 bsr dothisroom
noupperroom2:
 
dontbothercantseeit:
pastemp:

 move.l (a7)+,a1
 move.l ThisRoomToDraw,a0
 move.w (a0),d7
 adda.w #8,a1
 bra finditit
 
nomoretodoatall:
 
 move.l (a7)+,a0
 
 bra subroomloop

jumpoutofrooms:

 rts
 
prot9: dc.w 0
 
TempBuffer: ds.l 100 

ClipTable: ds.l 30
EndOfClipPt: dc.l 0
DOUPPER: dc.w 0

dothisroom

 move.w (a0)+,d0
 move.w d0,currzone
 move.l #ZoneBrightTable,a1
 move.l (a1,d0.w*4),d1
 tst.b DOUPPER
 bne.s .okbot
 swap d1
.okbot:
 move.w d1,ZoneBright

polyloop:
 move.w (a0)+,d0
 blt jumpoutofloop
 beq itsawall
 cmp.w #3,d0
 beq itsasetclip
 blt itsafloor
 cmp.w #4,d0
 beq itsanobject
 cmp.w #5,d0
 beq.s itsanarc
 cmp.w #6,d0
 beq itsalightbeam
 cmp.w #7,d0
 beq.s itswater
 cmp.w #9,d0
 ble itsachunkyfloor
 cmp.w #11,d0
 ble.s itsabumpyfloor
 cmp.w #12,d0
 beq.s itsbackdrop
 cmp.w #13,d0
 beq.s itsaseewall
 
 bra polyloop
 
itsaseewall:
 st seethru
 jsr itsawalldraw
 bra polyloop
 
itsbackdrop:
 jsr putinbackdrop
 bra polyloop
 
itswater:
 move.w #1,d0
 clr.b gourfloor
 move.l #FloorLine,LineToUse
 st usewater
 clr.b usebumps
 jsr itsafloordraw
 bra polyloop
 
itsanarc:
 jsr CurveDraw
 bra polyloop
itsanobject:
 jsr ObjDraw
 bra polyloop
itsalightbeam:
 jsr LightDraw
 bra polyloop
 
itsabumpyfloor:
 sub.w #9,d0
 st usebumps
 st smoothbumps
 clr.b usewater
 move.l #BumpLine,LineToUse
 jsr itsafloordraw
 bra polyloop
 
itsachunkyfloor:
 subq.w #7,d0
 st usebumps
 sub.w #12,topclip
; add.w #10,botclip
 clr.b smoothbumps
 clr.b usewater
 move.l #BumpLine,LineToUse
 jsr itsafloordraw
 add.w #12,topclip
; sub.w #10,botclip
 bra polyloop 
 
itsafloor:

 move.l #FloorLine,LineToUse
* 1,2 = floor/roof
 clr.b usewater
 clr.b usebumps
 st.b gourfloor	
 jsr itsafloordraw
 bra polyloop
itsasetclip:
 bra polyloop
itsawall:
 clr.b seethru
; move.l #stripbuffer,a1
 jsr itsawalldraw
 bra polyloop

jumpoutofloop:
 rts

ThisRoomToDraw: dc.l 0,0
SplitHeight: dc.l 0

 include "ab3:source/OrderZones"

ReadMouse:
 move.l #$dff000,a6
 clr.l d0
 clr.l d1
 move.w $a(a6),d0
 lsr.w #8,d0
 ext.l d0
 move.w d0,d3
 move.w oldmy,d2
 sub.w d2,d0

 cmp.w #127,d0
 blt nonegy
 move.w #255,d1
 sub.w d0,d1
 move.w d1,d0
 neg.w d0
nonegy:

 cmp.w #-127,d0
 bge nonegy2
 move.w #255,d1
 add.w d0,d1
 move.w d1,d0
nonegy2:

 add.b d0,d2
 add.w d0,oldy2
 move.w d2,oldmy
 move.w d2,d0

 move.w oldy2,d0
 move.w d0,ymouse

 clr.l d0
 clr.l d1
 move.w $a(a6),d0
 ext.w d0
 ext.l d0
 move.w d0,d3
 move.w oldmx,d2
 sub.w d2,d0

 cmp.w #127,d0
 blt nonegx
 move.w #255,d1
 sub.w d0,d1
 move.w d1,d0
 neg.w d0
nonegx:

 cmp.w #-127,d0
 bge nonegx2
 move.w #255,d1
 add.w d0,d1
 move.w d1,d0
nonegx2:

 add.b d0,d2
 move.w d0,d1
 move.w d2,oldmx

 move.w #$0,$dff034
 btst #2,$dff016
 beq.s noturn

 add.w d0,oldx2
 move.w oldx2,d0
 and.w #2047,d0
 move.w d0,oldx2
 
 asl.w #2,d0
 sub.w prevx,d0
 add.w d0,prevx
 add.w d0,PLR1s_angpos
 move.w #0,lrs
 rts

noturn:

; got to move lr instead. 

; d1 = speed moved l/r

 move.w d1,lrs

 rts
 
lrs: dc.w 0
prevx: dc.w 0
 
mang: dc.w 0
oldymouse: dc.w 0
xmouse: dc.w 0
ymouse: dc.w 0
oldx2: dc.w 0
oldmx: dc.w 0
oldmy: dc.w 0
oldy2: dc.w 0

RotateLevelPts:

 move.w sinval,d6
 swap d6
 move.w cosval,d6

 move.l PointsToRotatePtr,a0
 move.l Points,a3
 move.l #Rotated,a1
 move.l #OnScreen,a2
 move.w xoff,d4
 move.w zoff,d5
 
; move.w #$c40,$dff106
; move.w #$f00,$dff180
 
pointrotlop:
 move.w (a0)+,d7
 blt.s outofpointrot
 
 move.w (a3,d7*4),d0
 sub.w d4,d0
 move.w d0,d2
 move.w 2(a3,d7*4),d1
 sub.w d5,d1
 muls d6,d2
 swap d6
 move.w d1,d3
 muls d6,d3
 sub.l d3,d2
 add.l d2,d2
 swap d2
 ext.l d2
 asl.l #7,d2
 add.l xwobble,d2
 move.l d2,(a1,d7*8)

 muls d6,d0
 swap d6
 muls d6,d1
 add.l d0,d1
 asl.l #2,d1
 swap d1
 move.l d1,4(a1,d7*8)

 tst.w d1
 bgt.s ptnotbehind
 tst.w d2
 bgt.s onrightsomewhere
 move.w #0,d2
 bra putin
onrightsomewhere:
 move.w #96,d2
 bra putin
ptnotbehind:

 divs d1,d2
 add.w #47,d2
putin:
 move.w d2,(a2,d7*2)
 
 bra pointrotlop
outofpointrot:

; move.w #$c40,$dff106
; move.w #$ff0,$dff180

 rts

PLR1_ObjDists
 ds.w 200
PLR2_ObjDists
 ds.w 200

CalcPLR1InLine:

 move.w PLR1_sinval,d5
 move.w PLR1_cosval,d6
 move.l ObjectData,a4
 move.l ObjectPoints,a0
 move.w NumObjectPoints,d7
 move.l #PLR1_ObsInLine,a2
 move.l #PLR1_ObjDists,a3

.objpointrotlop:
 
 move.w (a0),d0
 sub.w PLR1_xoff,d0
 move.w 4(a0),d1
 addq #8,a0
 
 tst.w 12(a4)
 blt .noworkout
 
 sub.w PLR1_zoff,d1
 move.w d0,d2
 muls d6,d2
 move.w d1,d3
 muls d5,d3
 sub.l d3,d2
 add.l d2,d2
 swap d2
 
 muls d5,d0
 muls d6,d1
 add.l d0,d1
 asl.l #2,d1
 swap d1
 moveq #0,d3
 
 ext.l d2
 tst.w d1
 ble.s .notinline
 cmp.w #40,d2
 bgt.s .notinline
 cmp.w #-40,d2
 blt.s .notinline
 

 st d3
.notinline
 move.b d3,(a2)+

 move.w d1,(a3)+

 add.w #64,a4
 dbra d7,.objpointrotlop

 rts
 
.noworkout:
 move.b #0,(a2)+
 move.w #0,(a3)+
 add.w #64,a4
 dbra d7,.objpointrotlop
 rts
 

CalcPLR2InLine:

 move.w PLR2_sinval,d5
 move.w PLR2_cosval,d6
 move.l ObjectData,a4
 move.l ObjectPoints,a0
 move.w NumObjectPoints,d7
 move.l #PLR2_ObsInLine,a2
 move.l #PLR2_ObjDists,a3

.objpointrotlop:
 
 move.w (a0),d0
 sub.w PLR2_xoff,d0
 move.w 4(a0),d1
 addq #8,a0
 
 tst.w 12(a4)
 blt .noworkout
 
 sub.w PLR2_zoff,d1
 move.w d0,d2
 muls d6,d2
 move.w d1,d3
 muls d5,d3
 sub.l d3,d2
 add.l d2,d2
 swap d2
 
 muls d5,d0
 muls d6,d1
 add.l d0,d1
 asl.l #2,d1
 swap d1
 moveq #0,d3
 
 ext.l d2
 asl.l #7,d2
 tst.w d1
 ble.s .notinline

 divs d1,d2
 cmp.w #20,d2
 bgt.s .notinline
 cmp.w #-20,d2
 blt.s .notinline
 st d3
.notinline
 move.b d3,(a2)+

 move.w d1,(a3)+

 add.w #64,a4
 dbra d7,.objpointrotlop

 rts
 
.noworkout:
 move.w #0,(a3)+
 move.b #0,(a2)+
 add.w #64,a4
 dbra d7,.objpointrotlop
 rts
 

RotateObjectPts:

 move.w sinval,d5
 move.w cosval,d6

 move.l ObjectData,a4
 move.l ObjectPoints,a0
 move.w NumObjectPoints,d7
 move.l #ObjRotated,a1
 
 
.objpointrotlop:
 
 move.w (a0),d0
 sub.w xoff,d0
 move.w 4(a0),d1
 addq #8,a0
 
 tst.w 12(a4)
 blt .noworkout
 
 sub.w zoff,d1
 move.w d0,d2
 muls d6,d2
 move.w d1,d3
 muls d5,d3
 sub.l d3,d2
 add.l d2,d2
 swap d2
 move.w d2,(a1)+
 
 muls d5,d0
 muls d6,d1
 add.l d0,d1
 asl.l #2,d1
 swap d1
 moveq #0,d3
 
 move.w d1,(a1)+
 ext.l d2
 asl.l #7,d2
 add.l xwobble,d2
 move.l d2,(a1)+
 sub.l xwobble,d2

 add.w #64,a4
 dbra d7,.objpointrotlop

 rts
 
.noworkout:
  move.l #0,(a1)+
  move.l #0,(a1)+
  add.w #64,a4
  dbra d7,.objpointrotlop
  rts

LightDraw:

 move.w (a0)+,d0
 move.w (a0)+,d1
 move.l #Rotated,a1
 move.w 6(a1,d0.w*8),d2
 ble.s oneendbehind
 move.w 6(a1,d1.w*8),d3
 bgt.s bothendsinfront

oneendbehind:
 rts
bothendsinfront:
 
 move.l #OnScreen,a2
 move.w (a2,d0.w*2),d0
 bge.s okleftend
 moveq #0,d0
okleftend:
 move.w (a2,d1.w*2),d1
 bgt.s somevis
 rts
somevis:
 cmp.w #95,d0
 ble.s somevis2
 rts
somevis2:
 cmp.w #95,d1
 ble.s okrightend
 move.w #95,d1
okrightend:

 sub.w d0,d1
 blt.s wrongbloodywayround
 move.l #brightentab,a4
 move.l #objintocop,a1
 lea (a1,d0.w*2),a1
 
 move.l frompt,a3
 move.w #104*4,d6
 move.w #79,d2
lacross:
 move.w d2,d3
 move.l a3,a2
 adda.w (a1)+,a2
ldown:
 add.w d6,a2
 move.w (a2),d7
 move.w (a4,d7.w*2),(a2)
 dbra d3,ldown
 dbra d1,lacross
 
wrongbloodywayround:
 
 rts

FaceToPlace: dc.w 0

Cheese:
 dc.w 4,15

FacesList:
 dc.w 0,4*4
 dc.w 1,2*4
 dc.w 0,2*4
 dc.w 2,2*4
 dc.w 0,2*4
 dc.w 1,3*4
 dc.w 0,2*4
 dc.w 2,3*4
 dc.w 0,5*4
 dc.w 1,2*4
 dc.w 0,2*4
 dc.w 2,2*4
 dc.w 0,2*4
 dc.w 1,2*4
 dc.w 0,2*4
 dc.w 2,3*4
 dc.w 0,1*4
 dc.w 1,3*4
 dc.w 0,1*4
 dc.w 2,3*4
 dc.w 0,1*4

EndOfFacesList:

FacesPtr:
 dc.l FacesList
FacesCounter:
 dc.w 0
Expression:
 dc.w 0

PlaceFace:

 move.w FacesCounter,d0
 subq #1,d0
 bgt.s NoNewFace

 move.l FacesPtr,a0
 
 move.w 2(a0),d0
 move.w (a0),Expression
 addq #4,a0
 cmp.l #EndOfFacesList,a0
 blt.s NotFirstFace

 move.l #FacesList,a0

NotFirstFace
 move.l a0,FacesPtr

NoNewFace:

 move.w d0,FacesCounter

 Move.w FaceToPlace,d0
 muls #5,d0
 add.w Expression,d0
 move.l #FacePlace+10,a0
 move.l #Faces,a1
 muls #(4*32*5),d0
 adda.w d0,a1
 move.w #4,d0
 move.w #24,d1
 
 move.w #4,d3
bitplaneloop:
 move.w #31,d2
PlaceFaceToPlaceInFacePlaceLoop:
 move.l (a1),(a0)
 adda.w d0,a1
 adda.w d1,a0
 dbra d2,PlaceFaceToPlaceInFacePlaceLoop
 dbra d3,bitplaneloop
 
 rts
 
Energy:
 dc.w 191
OldEnergy:
 dc.w 191
Ammo: dc.w 63
OldAmmo: dc.w 63

FullEnergy:
 move.w #127,Energy
 move.w #127,OldEnergy
 move.l #health,a0
 move.l #borders,a1
 add.l #25*8*2+6,a1
 lea 2592(a1),a2
 move.w #127,d0
PutInFull:
 move.b (a0)+,(a1)
 move.b (a0)+,8(a1)
 add.w #16,a1
 move.b (a0)+,(a2)
 move.b (a0)+,8(a2)
 add.w #16,a2
 dbra d0,PutInFull
 
 rts
 
EnergyBar:

 move.w Energy,d0
 cmp.w OldEnergy,d0
 bne.s gottochange
 
NoChange
 rts
 
gottochange:
  
 blt LessEnergy
 cmp.w #127,Energy
 blt.s NotMax
 move.w #127,Energy
NotMax:

 move.w Energy,d0
 move.w OldEnergy,d2
 sub.w d0,d2
 beq.s NoChange	
 neg.w d2
 
 move.w #127,d3
 sub.w d0,d3
 
 move.l #health,a0
 lea (a0,d3.w*4),a0
 move.l #borders+25*16+6,a1
 lsl.w #4,d3
 add.w d3,a1
 lea 2592(a1),a2
 
EnergyRise:
 move.b (a0)+,(a1)
 move.b (a0)+,8(a1)
 add.w #16,a1
 move.b (a0)+,(a2)
 move.b (a0)+,8(a2)
 add.w #16,a2
 subq #1,d2
 bgt.s EnergyRise

 move.w Energy,OldEnergy

 rts 

LessEnergy: 
 move.w OldEnergy,d2
 sub.w d0,d2
 
 move.w #127,d3
 sub.w OldEnergy,d3
 
 move.l #borders+25*16+6,a1
 asl.w #4,d3
 add.w d3,a1
 lea 2592(a1),a2

EnergyDrain:
 move.b #0,(a1)
 move.b #0,8(a1)
 move.b #0,(a2)
 move.b #0,8(a2)
 add.w #16,a1
 add.w #16,a2
 subq #1,d2
 bgt.s EnergyDrain

 move.w Energy,OldEnergy

 rts 

AmmoBar:

 move.w Ammo,d0
 cmp.w OldAmmo,d0
 bne.s .gottochange
 
.NoChange
 rts
 
.gottochange:
  
 blt LessAmmo
 cmp.w #63,Ammo
 blt.s .NotMax
 move.w #63,Ammo
.NotMax:

 move.w Ammo,d0
 move.w OldAmmo,d2
 sub.w d0,d2
 beq.s .NoChange
 neg.w d2
 
 move.w #63,d3
 sub.w d0,d3
 
 move.l #Ammunition,a0
 lea (a0,d3.w*8),a0
 move.l #borders+5184+25*16+1,a1
 lsl.w #5,d3
 add.w d3,a1
 lea 2592(a1),a2
 
AmmoRise:
 move.b (a0)+,(a1)
 move.b (a0)+,8(a1)
 add.w #16,a1
 move.b (a0)+,(a2)
 move.b (a0)+,8(a2)
 add.w #16,a2
 move.b (a0)+,(a1)
 move.b (a0)+,8(a1)
 add.w #16,a1
 move.b (a0)+,(a2)
 move.b (a0)+,8(a2)
 add.w #16,a2
 subq #1,d2
 bgt.s AmmoRise

 move.w Ammo,OldAmmo

 rts 


LessAmmo: 
 move.w OldAmmo,d2
 sub.w d0,d2
 
 move.w #63,d3
 sub.w OldAmmo,d3
 
 move.l #borders++5184+25*16+1,a1
 asl.w #5,d3
 add.w d3,a1
 lea 2592(a1),a2

AmmoDrain:
 move.b #0,(a1)
 move.b #0,8(a1)
 move.b #0,(a2)
 move.b #0,8(a2)
 add.w #16,a1
 add.w #16,a2
 move.b #0,(a1)
 move.b #0,8(a1)
 move.b #0,(a2)
 move.b #0,8(a2)
 add.w #16,a1
 add.w #16,a2
 subq #1,d2
 bgt.s AmmoDrain

 move.w Ammo,OldAmmo

 rts 

nulop:
 move.w #$0010,$dff000+intreq
 rte
 
doanything: dc.w 0
 
end:

 move.l drawpt,d0
 move.l olddrawpt,drawpt
 move.l d0,olddrawpt
 move.l d0,$dff084

 clr.b doanything
 cmp.b #'b',Prefsfile+3
 bne.s .noback
 jsr mt_end
.noback
 tst.w Energy
 bgt.s wevewon

 move.l #gameover,mt_data
 st UseAllChannels
 clr.b reachedend
 jsr mt_init
playgameover:
 move.l #$dff000,a6
waitfortop2:
 btst.b #0,intreqrl(a6)
 beq waitfortop2
 move.w #$1,intreq(a6)

 jsr mt_music

 tst.b reachedend
 beq.s playgameover
 
 bra wevelost
 
 
wevewon:
 move.l #welldone,mt_data
 st UseAllChannels
 clr.b reachedend
 jsr mt_init
playwelldone:
 move.l #$dff000,a6
waitfortop3:
 btst.b #0,intreqrl(a6)
 beq waitfortop3
 move.w #$1,intreq(a6)

 jsr mt_music

 tst.b reachedend
 beq.s playwelldone

wevelost:
 jmp closeeverything 

endnomusic
 clr.b doanything
 cmp.b #'b',Prefsfile+3
 bne.s .noback
 jsr mt_end
.noback

 jmp closeeverything

do32:
 move.w #31,d7
 move.w #$180,d1
across:
 move.w d1,(a1)+
 move.w d1,(a3)+
 move.w #0,(a1)+
 move.w #0,(a3)+
 add.w #2,d1
 dbra d7,across
 rts


 
*************************************
* Set left and right clip values
*************************************
 
 

NEWsetlclip:
 move.l #OnScreen,a1
 move.l #Rotated,a2
 move.l CONNECT_TABLE,a3
 
 move.w (a0),d0
 bge.s .notignoreleft
 
; move.l #0,(a6)
 
 bra .leftnotoktoclip
.notignoreleft:

 move.w 6(a2,d0*8),d3	; left z val
 bgt.s .leftclipinfront
 addq #2,a0
 rts

 tst.w 6(a2,d0*8)
 bgt.s .leftnotoktoclip
.ignoreboth:
; move.l #0,(a6)
; move.l #96*65536,4(a6)
 move.w #0,leftclip
 move.w #96,rightclip
 addq #8,a6
 addq #2,a0
 rts

.leftclipinfront:
 move.w (a1,d0*2),d1	; left x on screen
 move.w (a0),d2
 move.w 2(a3,d2.w*4),d2
 move.w (a1,d2.w*2),d2
 cmp.w d1,d2
 bgt.s .leftnotoktoclip

; move.w d1,(a6)
; move.w d3,2(a6)
 cmp.w leftclip,d1
 ble.s .leftnotoktoclip
 move.w d1,leftclip
.leftnotoktoclip:

 addq #2,a0

 rts

NEWsetrclip
 move.l #OnScreen,a1
 move.l #Rotated,a2
 move.l CONNECT_TABLE,a3
 move.w (a0),d0
 bge.s .notignoreright
; move.w #96,4(a6)
; move.w #0,6(a6)
 move.w #0,d4
 bra .rightnotoktoclip
.notignoreright:
 move.w 6(a2,d0*8),d4	; right z val
 bgt.s .rightclipinfront
; move.w #96,4(a6)
; move.w #0,6(a6)
 bra.s .rightnotoktoclip

.rightclipinfront:
 move.w (a1,d0*2),d1	; right x on screen
 move.w (a0),d2
 move.w (a3,d2.w*4),d2
 move.w (a1,d2.w*2),d2
 cmp.w d1,d2
 blt.s .rightnotoktoclip
; move.w d1,4(a6)
; move.w d4,6(a6)

 cmp.w rightclip,d1
 bge.s .rightnotoktoclip
 addq #1,d1
 move.w d1,rightclip
.rightnotoktoclip:
 addq #8,a6
 addq #2,a0
 rts

FIRSTsetlrclip:
 move.l #OnScreen,a1
 move.l #Rotated,a2
 
 move.w (a0)+,d0
 bge.s .notignoreleft
 bra .leftnotoktoclip
.notignoreleft:

 move.w 6(a2,d0*8),d3	; left z val
 bgt.s .leftclipinfront

 move.w (a0),d0
 blt.s .ignoreboth
 tst.w 6(a2,d0*8)
 bgt.s .leftnotoktoclip
.ignoreboth
 move.w #96,rightclip
 move.w #0,leftclip
 addq #2,a0
 rts

.leftclipinfront:
 move.w (a1,d0*2),d1	; left x on screen
 cmp.w leftclip,d1
 ble.s .leftnotoktoclip
 move.w d1,leftclip
.leftnotoktoclip:

 move.w (a0)+,d0
 bge.s .notignoreright
 move.w #0,d4
 bra .rightnotoktoclip
.notignoreright:
 move.w 6(a2,d0*8),d4	; right z val
 ble.s .rightnotoktoclip

.rightclipinfront:
 move.w (a1,d0*2),d1	; right x on screen
 cmp.w rightclip,d1
 bge.s .rightnotoktoclip
 addq #1,d1
 move.w d1,rightclip
.rightnotoktoclip:

; move.w leftclip,d0
; move.w rightclip,d1
; cmp.w d0,d1
; bge.s .noswap
; move.w #96,rightclip
; move.w #0,leftclip
;.noswap:

 rts


leftclip2: dc.w 0
rightclip2: dc.w 0
ZoneBright: dc.w 0
 
npolys: dc.w 0

PLR1_fire: dc.b 0
PLR2_fire: dc.b 0

*****************************************************

 include "ab3:source/ObjectMove"

pastdata:
***********************************
* This routine animates brightnesses.

 
liftpt: dc.l liftanimtab

brightpt:
 dc.l brightanimtab


liftanim:
 rts

******************************
 include "ab3:source/Anims"
******************************
startpass:
; include "ab3:source/password_reloc.s"
endpass:

rotanimpt: dc.w 0
xradd: dc.w 5
yradd: dc.w 8
xrpos: dc.w 320
yrpos: dc.w 320

rotanim:
 rts
 
option:
 dc.l 0,0

********** WALL STUFF *******************************

 include "AB3:source/wallroutine3.chipmem"

*****************************************************

******************************************
* floor polygon

numsidestd: dc.w 0
bottomline: dc.w 0

NewCornerBuff:
 ds.l 100

itsafloordraw:

* If D0 =1 then its a floor otherwise (=2) it's
* a roof.

 move.w #0,above
 move.w (a0)+,d6	; ypos of poly
 
 move.w leftclip(pc),d7
 cmp.w rightclip(pc),d7
 bge.s dontdrawreturn
 
 move.w botclip,d7
 sub.w #40,d7
 ble.s dontdrawreturn
 sub.w flooryoff,d6
 bgt.s below
 blt.s aboveplayer
dontdrawreturn:
 move.w (a0)+,d6	; sides-1
 add.w d6,d6
 add.w d6,a0
 add.w #4+6,a0
 rts
aboveplayer:
 cmp.w #2,d0
 bne.s dontdrawreturn
 move.w #40,d7
 sub.w topclip,d7 
 blt.s dontdrawreturn
 move.w #1,d0
 move.w d0,above
 neg.w d6
below:
 cmp.w #1,d0
 bne.s dontdrawreturn
 move.w d6,distaddr
 muls #64,d6
 move.l d6,ypos
 divs d7,d6		; zpos of bottom
			; visible line
 move.w d6,minz
 move.w d7,bottomline

; Go round each point finding out
; if it should be visible or not.

 move.l a0,-(a7)

 move.w (a0)+,d7	; number of sides
 move.l #Rotated,a1
 move.l #OnScreen,a2
 move.l #NewCornerBuff,a3
 moveq #0,d4
 moveq #0,d5
 moveq #0,d6
 clr.b anyclipping
 
cornerprocessloop:

 move.w (a0)+,d0
 move.w 6(a1,d0.w*8),d1
 ble  .canttell
 
 move.w (a2,d0.w*2),d3
 cmp.w leftclip,d3
 bgt.s .nol
 st d4
 st anyclipping
 bra.s .nos
.nol:
 cmp.w rightclip,d3
 blt.s .nor
 st d6
 st anyclipping
 bra.s .nos
.nor:
 st d5
.nos:
 bra .cantell

.canttell:
 st d5
 st anyclipping

.cantell:


 dbra d7,cornerprocessloop
 
 move.l (a7)+,a0
 tst.b d5
 bne.s somefloortodraw
 eor.b d4,d6
 bne dontdrawreturn

somefloortodraw:

 tst.b gourfloor
 bne goursides

 move.w #80,top
 move.w #-1,bottom
 move.w #0,drawit
 move.l #Rotated,a1
 move.l #OnScreen,a2
 move.w (a0)+,d7	; no of sides
sideloop:
 move.w minz,d6
 move.w (a0)+,d1
 move.w (a0),d3
 move.w 6(a1,d1*8),d4	;first z
 cmp.w d6,d4
 bgt firstinfront
 move.w 6(a1,d3*8),d5	; sec z
 cmp.w d6,d5
 ble bothbehind
** line must be on left and partially behind.
 sub.w d5,d4
 move.l (a1,d1*8),d0
 sub.l (a1,d3*8),d0
 asr.l #7,d0
 sub.w d5,d6
 muls d6,d0	; new x coord
 divs d4,d0
 ext.l d0
 asl.l #7,d0

 add.l (a1,d3*8),d0
 move.w minz,d4
 move.w (a2,d3*2),d2
 divs d4,d0
 add.w #47,d0
 move.l ypos,d3
 divs d5,d3
 move.w bottomline,d1 
 bra lineclipped

firstinfront:
 move.w 6(a1,d3*8),d5	; sec z
 cmp.w d6,d5
 bgt bothinfront
** line must be on right and partially behind.
 sub.w d4,d5	; dz
 move.l (a1,d3*8),d2
 sub.l (a1,d1*8),d2	; dx
 sub.w d4,d6
 asr.l #7,d2
 muls d6,d2	; new x coord
 divs d5,d2
 ext.l d2
 asl.l #7,d2
 add.l (a1,d1*8),d2
 move.w minz,d5
 move.w (a2,d1*2),d0
 divs d5,d2
 add.w #47,d2
 move.l ypos,d1
 divs d4,d1
 move.w bottomline,d3 
 bra lineclipped

bothinfront:

* Also, usefully enough, both are on-screen
* so no bottom clipping is needed.

 move.w (a2,d1*2),d0	; first x
 move.w (a2,d3*2),d2	; second x
 move.l ypos,d1
 move.l d1,d3
 divs d4,d1		; first y
 divs d5,d3		; second y
lineclipped:
 move.l #rightsidetab,a3
 cmp.w d1,d3
 beq lineflat
 st drawit
 bgt lineonright
 move.l #leftsidetab,a3
 exg d1,d3
 exg d0,d2
 
 lea (a3,d1*2),a3
 
 cmp.w top(pc),d1
 bge.s .nonewtop
 move.w d1,top
.nonewtop:
 cmp.w bottom(pc),d3
 ble.s .nonewbot
 move.w d3,bottom
.nonewbot:

 sub.w d1,d3	; dy
 sub.w d0,d2	; dx
 
 blt .linegoingleft
 sub.w #1,d0

 ext.l d2
 divs d3,d2
 move.w d2,d6
 swap d2

; moveq #0,d6
; sub.w d3,d2
; blt.s .noco
;.makeco
; addq #1,d6
; sub.w d3,d2
; bge.s .makeco
;.noco
; add.w d3,d2
 
 move.w d3,d4
 move.w d3,d5
 subq #1,d5
 move.w d6,d1
 addq #1,d1

.pixlopright:
 move.w d0,(a3)+
 sub.w d2,d4
 bge.s .nobigstep
 add.w d1,d0
 add.w d3,d4
 dbra d5,.pixlopright
 bra lineflat
.nobigstep
 add.w d6,d0
 dbra d5,.pixlopright
 bra lineflat

.linegoingleft:

 sub.w #1,d0
 
 neg.w d2

 ext.l d2
 divs d3,d2
 move.w d2,d6
 swap d2


; moveq #0,d6
; sub.w d3,d2
; blt.s .nocol
;.makecol
; addq #1,d6
; sub.w d3,d2
; bge.s .makecol
;.nocol
; add.w d3,d2


 
 move.w d3,d4
 move.w d3,d5
 subq #1,d5

 move.w d6,d1
 addq #1,d1

.pixlopleft:
 sub.w d2,d4
 bge.s .nobigstepl
 sub.w d1,d0
 add.w d3,d4
 move.w d0,(a3)+
 dbra d5,.pixlopleft
 bra lineflat
 
.nobigstepl
 sub.w d6,d0
 move.w d0,(a3)+
 dbra d5,.pixlopleft
 bra lineflat
 
lineonright:

 lea (a3,d1*2),a3
 
 cmp.w top(pc),d1
 bge.s .nonewtop
 move.w d1,top
.nonewtop:
 cmp.w bottom(pc),d3
 ble.s .nonewbot
 move.w d3,bottom
.nonewbot:

 sub.w d1,d3	; dy
 sub.w d0,d2	; dx
 blt .linegoingleft
; addq #1,d0
 ext.l d2
 divs d3,d2
 move.w d2,d6
 swap d2

; moveq #0,d6
; sub.w d3,d2
; blt.s .noco
;.makeco
; addq #1,d6
; sub.w d3,d2
; bge.s .makeco
;.noco
; add.w d3,d2
 
 move.w d3,d4
 move.w d3,d5
 subq #1,d5
 move.w d6,d1
 addq #1,d1

.pixlopright:
 sub.w d2,d4
 bge.s .nobigstep
 add.w d1,d0
 add.w d3,d4
 move.w d0,(a3)+
 dbra d5,.pixlopright
 bra lineflat
 
.nobigstep
 add.w d6,d0
 move.w d0,(a3)+
 dbra d5,.pixlopright
 bra lineflat

.linegoingleft:
; addq #1,d0
 neg.w d2

 ext.l d2
 divs d3,d2
 move.w d2,d6
 swap d2


; moveq #0,d6
; sub.w d3,d2
; blt.s .nocol
;.makecol
; addq #1,d6
; sub.w d3,d2
; bge.s .makecol
;.nocol
; add.w d3,d2

 move.w d3,d4
 move.w d3,d5
 subq #1,d5
 move.w d6,d1
 addq #1,d1

.pixlopleft:
 move.w d0,(a3)+
 sub.w d2,d4
 bge.s .nobigstepl
 sub.w d1,d0
 add.w d3,d4
 dbra d5,.pixlopleft
 bra lineflat
 
.nobigstepl
 sub.w d6,d0
 dbra d5,.pixlopleft

lineflat:
 
bothbehind:
 dbra d7,sideloop
 bra pastsides
 
fbr: dc.w 0
sbr: dc.w 0

goursides:

 move.w #80,top
 move.w #-1,bottom
 move.w #0,drawit
 move.l #Rotated,a1
 move.l #OnScreen,a2
 move.w (a0)+,d7	; no of sides
sideloopGOUR:
 move.w minz,d6
 move.w (a0)+,d1
 move.w (a0),d3

 move.l PointBrightsPtr,a4
 move.w (a4,d1.w*4),fbr
 move.w (a4,d3.w*4),sbr
 
 move.w 6(a1,d1*8),d4	;first z
 cmp.w d6,d4
 bgt firstinfrontGOUR
 move.w 6(a1,d3*8),d5	; sec z
 cmp.w d6,d5
 ble bothbehindGOUR
** line must be on left and partially behind.
 sub.w d5,d4
 
 move.w fbr,d0
 sub.w sbr,d0
 sub.w d5,d6
 muls d6,d0
 divs d4,d0
 add.w sbr,d0
 move.w d0,fbr
 
 move.l (a1,d1*8),d0
 sub.l (a1,d3*8),d0
 asr.l #7,d0
 muls d6,d0	; new x coord
 divs d4,d0
 ext.l d0
 asl.l #7,d0

 add.l (a1,d3*8),d0
 move.w minz,d4
 move.w (a2,d3*2),d2
 divs d4,d0
 add.w #47,d0
 move.l ypos,d3
 divs d5,d3
 
 move.w bottomline,d1 
 bra lineclippedGOUR

firstinfrontGOUR:
 move.w 6(a1,d3*8),d5	; sec z
 cmp.w d6,d5
 bgt bothinfrontGOUR
** line must be on right and partially behind.
 sub.w d4,d5	; dz

 move.w sbr,d2
 sub.w fbr,d2
 sub.w d4,d6
 muls d6,d2
 divs d5,d2
 add.w fbr,d2
 move.w d2,sbr

 move.l (a1,d3*8),d2
 sub.l (a1,d1*8),d2	; dx
 asr.l #7,d2
 muls d6,d2	; new x coord
 divs d5,d2
 ext.l d2
 asl.l #7,d2
 add.l (a1,d1*8),d2
 move.w minz,d5
 move.w (a2,d1*2),d0
 divs d5,d2
 add.w #47,d2
 move.l ypos,d1
 divs d4,d1
 move.w bottomline,d3 
 bra lineclippedGOUR

bothinfrontGOUR:

* Also, usefully enough, both are on-screen
* so no bottom clipping is needed.

 move.w (a2,d1*2),d0	; first x
 move.w (a2,d3*2),d2	; second x
 move.l ypos,d1
 move.l d1,d3
 divs d4,d1		; first y
 divs d5,d3		; second y
lineclippedGOUR:
 move.l #rightsidetab,a3
 cmp.w d1,d3
 bne linenotflatGOUR
 
; move.w fbr,d4
; move.w sbr,d5
; cmp.w d0,d2
; bgt.s .nsw
; exg d4,d5
;.nsw:

; move.l #leftbrighttab,a3
; move.w d4,(a3,d3.w)
; move.l #rightbrighttab,a3
; move.w d5,(a3,d3.w) 
 bra lineflatGOUR
 
linenotflatGOUR
 st drawit
 bgt lineonrightGOUR
 move.l #leftsidetab,a3
 exg d1,d3
 exg d0,d2
 
 lea (a3,d1*2),a3
 lea leftbrighttab-leftsidetab(a3),a4
 
 cmp.w top(pc),d1
 bge.s .nonewtop
 move.w d1,top
.nonewtop:
 cmp.w bottom(pc),d3
 ble.s .nonewbot
 move.w d3,bottom
.nonewbot:

 sub.w d1,d3	; dy
 sub.w d0,d2	; dx
 
 blt .linegoingleft
 sub.w #1,d0

 ext.l d2
 divs d3,d2
 move.w d2,d6
 swap d2
 move.w d2,a5

; moveq #0,d6
; sub.w d3,d2
; blt.s .noco
;.makeco
; addq #1,d6
; sub.w d3,d2
; bge.s .makeco
;.noco
; add.w d3,d2
 
 move.w d3,d4
 move.w d3,d5
 subq #1,d5
 move.w d6,d1
 addq #1,d1
 move.w d1,a6

 moveq #0,d1
 move.w sbr,d1
 move.w fbr,d2
 sub.w d1,d2
 ext.l d2
 asl.w #8,d2
 asl.w #3,d2
 divs d3,d2 
 ext.l d2
 asl.l #5,d2
 swap d1
 
.pixlopright:
 move.w d0,(a3)+
 swap d1
 move.w d1,(a4)+
 swap d1
 add.l d2,d1

 sub.w a5,d4
 bge.s .nobigstep
 add.w a6,d0
 add.w d3,d4
 dbra d5,.pixlopright
 bra lineflatGOUR
.nobigstep

 add.w d6,d0
 dbra d5,.pixlopright
 bra lineflatGOUR

.linegoingleft:

 sub.w #1,d0
 
 neg.w d2

 ext.l d2
 divs d3,d2
 move.w d2,d6
 swap d2


; moveq #0,d6
; sub.w d3,d2
; blt.s .nocol
;.makecol
; addq #1,d6
; sub.w d3,d2
; bge.s .makecol
;.nocol
; add.w d3,d2
 
 move.w d3,d4
 move.w d3,d5
 subq #1,d5

 move.w d6,d1
 addq #1,d1
 move.w d1,a6
 move.w d2,a5

 moveq #0,d1
 move.w sbr,d1
 move.w fbr,d2
 sub.w d1,d2
 ext.l d2
 asl.w #8,d2
 asl.w #3,d2
 divs d3,d2 
 ext.l d2
 asl.l #5,d2
 swap d1

.pixlopleft:

 swap d1
 move.w d1,(a4)+
 swap d1
 add.l d2,d1

 sub.w a5,d4
 bge.s .nobigstepl
 sub.w a6,d0
 add.w d3,d4
 move.w d0,(a3)+
 dbra d5,.pixlopleft
 bra lineflatGOUR
 
.nobigstepl
 sub.w d6,d0
 move.w d0,(a3)+
 dbra d5,.pixlopleft
 bra lineflatGOUR
 
lineonrightGOUR:

 lea (a3,d1*2),a3
 
 lea rightbrighttab-rightsidetab(a3),a4
 
 cmp.w top(pc),d1
 bge.s .nonewtop
 move.w d1,top
.nonewtop:
 cmp.w bottom(pc),d3
 ble.s .nonewbot
 move.w d3,bottom
.nonewbot:

 sub.w d1,d3	; dy
 sub.w d0,d2	; dx
 blt .linegoingleft
; addq #1,d0
 ext.l d2
 divs d3,d2
 move.w d2,d6
 swap d2

; moveq #0,d6
; sub.w d3,d2
; blt.s .noco
;.makeco
; addq #1,d6
; sub.w d3,d2
; bge.s .makeco
;.noco
; add.w d3,d2
 
 move.w d3,d4
 move.w d3,d5
 subq #1,d5
 move.w d6,d1
 addq #1,d1

 move.w d1,a6
 move.w d2,a5

 moveq #0,d1
 move.w fbr,d1
 move.w sbr,d2
 sub.w d1,d2
 ext.l d2
 asl.w #8,d2
 asl.w #3,d2
 divs d3,d2 
 ext.l d2
 asl.l #5,d2
 swap d1

.pixlopright:

 swap d1
 move.w d1,(a4)+
 swap d1
 add.l d2,d1

 sub.w a5,d4
 bge.s .nobigstep
 add.w a6,d0
 add.w d3,d4
 move.w d0,(a3)+
 dbra d5,.pixlopright
 bra lineflatGOUR
 
.nobigstep
 add.w d6,d0
 move.w d0,(a3)+
 dbra d5,.pixlopright
 bra lineflatGOUR

.linegoingleft:
; addq #1,d0
 neg.w d2

 ext.l d2
 divs d3,d2
 move.w d2,d6
 swap d2


; moveq #0,d6
; sub.w d3,d2
; blt.s .nocol
;.makecol
; addq #1,d6
; sub.w d3,d2
; bge.s .makecol
;.nocol
; add.w d3,d2

 move.w d3,d4
 move.w d3,d5
 subq #1,d5
 move.w d6,d1
 addq #1,d1
 move.w d1,a6
 move.w d2,a5

 moveq #0,d1
 move.w fbr,d1
 move.w sbr,d2
 sub.w d1,d2
 ext.l d2
 asl.w #8,d2
 asl.w #3,d2
 divs d3,d2 
 ext.l d2
 asl.l #5,d2
 swap d1

.pixlopleft:

 swap d1
 move.w d1,(a4)+
 swap d1
 add.l d2,d1

 move.w d0,(a3)+
 sub.w a5,d4
 bge.s .nobigstepl
 sub.w a6,d0
 add.w d3,d4
 dbra d5,.pixlopleft
 bra lineflatGOUR
 
.nobigstepl
 sub.w d6,d0
 dbra d5,.pixlopleft

lineflatGOUR:
 
bothbehindGOUR:
 dbra d7,sideloopGOUR

pastsides:


 addq #2,a0
 
 move.w #104*4,linedir
 move.l frompt,a6
 add.l #104*4*41,a6
 move.w (a0)+,scaleval
 move.w (a0)+,whichtile
 move.w (a0)+,d6
 add.w ZoneBright,d6
 move.w d6,lighttype
 move.w above(pc),d6
 beq groundfloor
* on ceiling:
 move.w #-104*4,linedir
 suba.w #104*4,a6
groundfloor:

 move.w xoff,d6
 move.w zoff,d7
 add.w xwobxoff,d7
 add.w xwobzoff,d6
 swap d6
 swap d7
 clr.w d6
 clr.w d7
 move.w scaleval(pc),d3
 beq.s .samescale
 bgt.s .scaledown
 neg.w d3
 asr.l d3,d7
 asr.l d3,d6
 bra.s .samescale
.scaledown:
 asl.l d3,d6
 asl.l d3,d7
.samescale
 move.l d6,sxoff
 move.l d7,szoff
 bra pastscale 

 asr.l #3,d1
 asr.l #3,d2
 asr.l #2,d1
 asr.l #2,d2
 asr.l #1,d1
 asr.l #1,d2
scaleprogfrom
 nop
 nop
 asl.l #1,d1
 asl.l #1,d2
 asl.l #2,d1
 asl.l #2,d2
 asl.l #3,d1
 asl.l #3,d2

top: dc.w 0
bottom: dc.w 0
ypos: dc.l 0
nfloors: dc.w 0
lighttype: dc.w 0
above: dc.w 0 
linedir: dc.w 0
distaddr: dc.w 0
 
minz: dc.w 0
leftsidetab:
 ds.w 180
rightsidetab:
 ds.w 180
leftbrighttab:
 ds.w 180
rightbrighttab:
 ds.w 180
 
PointBrights:
 dc.l 0
CurrentPointBrights:
 ds.l 1000

movespd: dc.w 0
largespd: dc.l 0

pastscale:

 tst.b drawit(pc)
 beq dontdrawfloor

 move.l a0,-(a7)

 move.l #leftsidetab,a4
 move.w top(pc),d1
 move.w bottom(pc),d7
 tst.w above
 beq.s clipfloor
 
 move.w #40,d3
 move.w d3,d4
 sub.w topclip,d3
 sub.w botclip,d4
 cmp.w d3,d1
 bge predontdrawfloor
 cmp.w d4,d7
 blt predontdrawfloor
 cmp.w d4,d1
 bge.s .nocliptoproof
 move.w d4,d1
.nocliptoproof
 cmp.w d3,d7
 blt doneclip
 move.w d3,d7
 bra doneclip
 
clipfloor:
 move.w botclip,d4
 sub.w #40,d4
 cmp.w d4,d1
 bge predontdrawfloor
 move.w topclip,d3
 sub.w #40,d3
 cmp.w d3,d1
 bge.s .nocliptopfloor
 move.w d3,d1
.nocliptopfloor 
 cmp.w d3,d7
 ble predontdrawfloor
 cmp.w d4,d7
 blt.s .noclipbotfloor
 move.w d4,d7
.noclipbotfloor:

doneclip:

 lea (a4,d1*2),a4
; move.l #dists,a2
 move.w distaddr,d0
 muls #64,d0
 move.l d0,a2
; muls #25,d0
; adda.w d0,a2
; lea (a2,d1*2),a2
 sub.w d1,d7
 ble predontdrawfloor 
 move.w d1,d0
 bne.s .notzero
 moveq #1,d0
.notzero
 muls linedir,d1
 add.l d1,a6
 move.l #floorscalecols,a1
 move.l LineToUse,a5
 
 tst.b gourfloor
 bne dogourfloor
 
 tst.b anyclipping
 beq dofloornoclip
 
dofloor:
; move.w (a2)+,d0
 move.w leftclip(pc),d3
 move.w rightclip(pc),d4
 move.w rightsidetab-leftsidetab(a4),d2
 
 addq #1,d2
 cmp.w d3,d2
 ble.s nodrawline
 cmp.w d4,d2
 ble.s noclipright
 move.w d4,d2
noclipright:
 move.w (a4),d1
 cmp.w d4,d1
 bge.s nodrawline
 cmp.w d3,d1
 bge.s noclipleft
 move.w d3,d1
noclipleft:
 cmp.w d1,d2
 ble.s nodrawline

 move.w d1,leftedge
 move.w d2,rightedge
 
; moveq #0,d1
; moveq #0,d3
; move.w leftbrighttab-leftsidetab(a4),d1
; bge.s .okbl
; moveq #0,d1
;.okbl:
 
; move.w rightbrighttab-leftsidetab(a4),d3
; bge.s .okbr
; moveq #0,d3
;.okbr:
 
; sub.w d1,d3
; asl.w #8,d1
; move.l d1,leftbright
; swap d3
; asr.l #5,d3
; divs d5,d3
; move.w d3,d5
; muls.w d6,d5
; asr.l #3,d5
; clr.b d5
; add.w d5,leftbright+2
 
; ext.l d3
; asl.l #5,d3
; swap d3
; asl.w #8,d3
; move.l d3,brightspd
 
 move.l a6,a3
 movem.l d0/d7/a2/a4/a5/a6,-(a7)
 move.l a2,d7
 divs d0,d7
 move.w d7,d0
 jsr (a5)
 movem.l (a7)+,d0/d7/a2/a4/a5/a6
nodrawline
 adda.w linedir(pc),a6
 addq #2,a4
 addq #1,d0
 subq #1,d7
 bgt dofloor

predontdrawfloor
 move.l (a7)+,a0

dontdrawfloor:

 CACHE_FREEZE_OFF d2
 rts

anyclipping: dc.w 0

dofloornoclip:
; move.w (a2)+,d0
 move.w rightsidetab-leftsidetab(a4),d2
 addq #1,d2
 move.w (a4)+,d1
 move.w d1,leftedge
 move.w d2,rightedge

; sub.w d1,d2

; moveq #0,d1
; moveq #0,d3
; move.w leftbrighttab-leftsidetab(a4),d1
; bge.s .okbl
; moveq #0,d1
;.okbl:
 
; move.w rightbrighttab-leftsidetab(a4),d3
; bge.s .okbr
; moveq #0,d3
;.okbr:
 
; sub.w d1,d3
; asl.w #8,d1
; move.l d1,leftbright
; swap d3
; asr.l #5,d3
; divs d2,d3
; ext.l d3
; asl.l #5,d3
; swap d3
; asl.w #8,d3
; move.l d3,brightspd

 move.l a6,a3
 movem.l d0/d7/a2/a4/a5/a6,-(a7)
 move.l a2,d7
 divs d0,d7
 move.w d7,d0
 jsr (a5)
 movem.l (a7)+,d0/d7/a2/a4/a5/a6
 adda.w linedir(pc),a6
 addq #1,d0
 subq #1,d7
 bgt dofloornoclip

 bra predontdrawfloor

dogourfloor:
 tst.b anyclipping
 beq dofloornoclipGOUR
 
dofloorGOUR:
; move.w (a2)+,d0
 move.w leftclip(pc),d3
 move.w rightclip(pc),d4
 move.w rightsidetab-leftsidetab(a4),d2
 
 move.w d2,d5
 sub.w (a4),d5
 addq #1,d5
 moveq #0,d6
 
 addq #1,d2
 cmp.w d3,d2
 ble nodrawlineGOUR
 cmp.w d4,d2
 ble.s nocliprightGOUR
 move.w d4,d2
nocliprightGOUR:
 move.w (a4),d1
 cmp.w d4,d1
 bge nodrawlineGOUR
 cmp.w d3,d1
 bge.s noclipleftGOUR
 move.w d3,d6
 subq #1,d6
 sub.w d1,d6
 move.w d3,d1
noclipleftGOUR:
 cmp.w d1,d2
 ble nodrawlineGOUR

 move.w d1,leftedge
 move.w d2,rightedge

 move.l a2,d2
 divs d0,d2
 move.w d2,dst
 asr.w #7,d2
; addq #5,d2
; add.w lighttype,d2
 
 moveq #0,d1
 moveq #0,d3
 move.w leftbrighttab-leftsidetab(a4),d1
 add.w d2,d1
 bge.s .okbl
 moveq #0,d1
.okbl:
 asr.w #1,d1
 cmp.w #14,d1
 ble.s .okdl
 move.w #14,d1
.okdl:
 
 move.w rightbrighttab-leftsidetab(a4),d3
 add.w d2,d3
 bge.s .okbr
 moveq #0,d3
.okbr:
 asr.w #1,d3
 cmp.w #14,d3
 ble.s .okdr
 move.w #14,d3
.okdr:
 
 sub.w d1,d3
 asl.w #8,d1
 move.l d1,leftbright
 swap d3
 add.w #16,d3
 asr.l #5,d3
 divs d5,d3
 muls d3,d6
 add.w #256*7,d6
 asr.w #3,d6
 clr.b d6
 add.w d6,leftbright+2
 
 ext.l d3
 asl.l #5,d3
 swap d3
 asl.w #8,d3
 move.l d3,brightspd
 
 move.l a6,a3
 movem.l d0/d7/a2/a4/a5/a6,-(a7)
 move.w dst,d0
 lea floorscalecols,a1
 move.l floortile,a0
 adda.w whichtile,a0
 jsr pastfloorbright
 movem.l (a7)+,d0/d7/a2/a4/a5/a6
nodrawlineGOUR
 adda.w linedir(pc),a6
 addq #2,a4
 addq #1,d0
 subq #1,d7
 bgt dofloorGOUR

predontdrawfloorGOUR
 move.l (a7)+,a0

dontdrawfloorGOUR:

 CACHE_FREEZE_OFF d2
 rts

dofloornoclipGOUR:
; move.w (a2)+,d0
 move.w rightsidetab-leftsidetab(a4),d2
 addq #1,d2
 move.w (a4),d1
 move.w d1,leftedge
 move.w d2,rightedge

 sub.w d1,d2

 move.l a2,d6
 divs d0,d6
 move.w d6,d5
 asr.w #7,d5
; addq #5,d5
; add.w lighttype,d5

 moveq #0,d1
 moveq #0,d3
 move.w leftbrighttab-leftsidetab(a4),d1
 add.w d5,d1
 bge.s .okbl
 moveq #0,d1
.okbl:
 asr.w #1,d1
 cmp.w #14,d1
 ble.s .okdl
 move.w #14,d1
.okdl:
 
 move.w rightbrighttab-leftsidetab(a4),d3
 add.w d5,d3
 bge.s .okbr
 moveq #0,d3
.okbr:
 asr.w #1,d3
 cmp.w #14,d3
 ble.s .okdr
 move.w #14,d3
.okdr:
 
 sub.w d1,d3
 asl.w #8,d1
 move.l d1,leftbright
 swap d3
 asr.l #5,d3
 divs d2,d3
 ext.l d3
 asl.l #5,d3
 swap d3
 asl.w #8,d3
 move.l d3,brightspd


 move.l a6,a3
 movem.l d0/d7/a2/a4/a5/a6,-(a7)
 move.w d6,d0
 move.w d0,dst
 lea floorscalecols,a1
 move.l floortile,a0
 adda.w whichtile,a0
 jsr pastfloorbright
 movem.l (a7)+,d0/d7/a2/a4/a5/a6
 adda.w linedir(pc),a6
 addq #2,a4
 addq #1,d0
 subq #1,d7
 bgt dofloornoclipGOUR

 bra predontdrawfloorGOUR



dists:
; incbin "floordists"
drawit: dc.w 0

LineToUse: dc.l 0

***************************
* Right then, time for the floor
* routine...
* For test purposes, give it
* a3 = point to screen
* d0= z distance away
* and sinval+cosval must be set up.
***************************

leftedge: dc.w 0
rightedge: dc.w 0

rndpt: dc.l rndtab

WaterFloorLine:

 CACHE_OFF d2

 move.l rndpt,a2
 move.w (a2)+,d1
 move.w (a2)+,d2
 move.w (a2)+,d3
 cmp.l #endrnd-4,a2
 blt.s okrnd
 suba.w #98,a2
okrnd: 
 move.l a2,rndpt

 asr.w #7,d0
 move.w d0,d1
 move.w d0,d2
 move.w d0,d3
 move.l clipd(pc,d1.w*4),d1
 move.l clipd(pc,d2.w*4),d2
 move.l clipd(pc,d3.w*4),d3
 bra pcli

 dc.l 0
clipd:
 dc.l 0
 dc.l 512
 dc.l 512*2
 dc.l 512*3
 dc.l 512*4
 dc.l 512*5
 dc.l 512*6
 dc.l 512*7
 dc.l 512*8
 dc.l 512*9
 dc.l 512*10
 dc.l 512*11
 dc.l 512*12
 dc.l 512*13
 dc.l 512*14
 dc.l 512*15
 dc.l 512*15
 dc.l 512*15
 dc.l 512*15
 dc.l 512*15
 dc.l 512*15
 dc.l 512*15
 dc.l 512*15
 dc.l 512*15
 dc.l 512*15
 dc.l 512*15
 dc.l 512*15

pcli:

 move.l #brightentab,a2
 move.l a2,a4
 move.l a4,a5
 add.l d1,a2
 add.l d2,a4
 add.l d3,a5

 move.l #doacrossline,a1
 move.w leftedge(pc),d1
 move.w rightedge(pc),d2
 sub.w d1,d2
 move.w time(pc,d1.w*2),d1
 move.w time(pc,d2.w*2),d2
 lea (a1,d1.w),a1
 move.w (a1,d2.w),d4
 move.w #$4e75,(a1,d2.w)

 moveq #0,d0
 jsr (a1)
 move.w d4,(a1,d2.w)

 CACHE_ON d2

 rts
 
time:
val SET 0
 REPT 100
 dc.w val
val SET val+10
 ENDR
 
storeit: dc.l 0

doacrossline:
; incbin "Doacrossline"
 rts

dst: dc.w 0

FloorLine:

 move.l floortile,a0
 adda.w whichtile,a0
 move.w lighttype,d1
 
 move.w d0,dst
 
 move.w d0,d2
*********************
* Old version
 asr.w #8,d2
 add.w #5,d1
*********************
; asr.w #3,d2
; sub.w #4,d2
; cmp.w #6,d2
; blt.s flbrbr
; move.w #6,d2
;flbrbr:
*********************
 add.w d2,d1
 bge.s .fixedbright
 moveq #0,d1
.fixedbright:
 cmp.w #28,d1
 ble.s .smallbright
 move.w #28,d1
.smallbright:
 lea floorscalecols,a1
 add.l floorbright(pc,d1.w*4),a1
 bra pastfloorbright
 
ConstCol: dc.w 0
 
BumpLine:

 tst.b smoothbumps
 beq.s Chunky
 
 move.l #SmoothTile,a0
 lea Smoothscalecols,a1
 bra pastast
 
Chunky:

 moveq #0,d2
 move.l #Bumptile,a0
 move.w whichtile,d2
 adda.w d2,a0
 ror.l #2,d2
 lsr.w #6,d2
 rol.l #2,d2
 and.w #15,d2
 move.l #ConstCols,a1
 move.w (a1,d2.w*2),ConstCol
 lea Bumpscalecols,a1
 
pastast:
 move.w lighttype,d1
 
 move.w d0,dst
 
 move.w d0,d2
*********************
* Old version
 asr.w #8,d2
 add.w #5,d1
*********************
; asr.w #3,d2
; sub.w #4,d2
; cmp.w #6,d2
; blt.s flbrbr
; move.w #6,d2
;flbrbr:
*********************
 add.w d2,d1
 bge.s .fixedbright
 moveq #0,d1
.fixedbright:
 cmp.w #28,d1
 ble.s .smallbright
 move.w #28,d1
.smallbright:
 add.l floorbright(pc,d1.w*4),a1
 bra pastfloorbright
 

floorbright:
 dc.l 512*0
 dc.l 512*1
 dc.l 512*1
 dc.l 512*2
 dc.l 512*2
 
 dc.l 512*3
 dc.l 512*3
 dc.l 512*4
 dc.l 512*4
 dc.l 512*5
 
 dc.l 512*5
 dc.l 512*6
 dc.l 512*6
 dc.l 512*7
 dc.l 512*7
 
 dc.l 512*8
 dc.l 512*8
 dc.l 512*9
 dc.l 512*9
 dc.l 512*10
 
 dc.l 512*10
 dc.l 512*11
 dc.l 512*11
 dc.l 512*12
 dc.l 512*12
 
 dc.l 512*13
 dc.l 512*13
 dc.l 512*14
 dc.l 512*14

widthleft: dc.w 0
scaleval: dc.w 0
sxoff: dc.l 0
szoff: dc.l 0
xoff34: dc.w 0
zoff34: dc.w 0
scosval: dc.w 0
ssinval: dc.w 0


floorsetbright:
 move.l #walltiles,a0

pastfloorbright


 move.w d0,d1
 muls cosval,d1	; change in x across whole width
 move.w d0,d2
 muls sinval,d2	; change in z across whole width
 neg.l d2
scaleprog:
 move.w scaleval(pc),d3
 beq.s .samescale
 bgt.s .scaledown
 neg.w d3
 asr.l d3,d1
 asr.l d3,d2
 bra.s .samescale
.scaledown:
 asl.l d3,d1
 asl.l d3,d2
.samescale

 move.l d1,d3 ;	z cos
 move.l d3,d6
 move.l d3,d5
 asr.l #1,d6
 add.l d6,d3
 asr.l #1,d3

 move.l d2,d4	; z sin
 move.l d4,d6
 asr.l #1,d6
 add.l d4,d6
 add.l d3,d4
 neg.l d4	; start x
 
 asr.l #1,d6	; zsin/2
 sub.l d6,d5	; start z
 
 add.l sxoff,d4
 add.l szoff,d5

 moveq #0,d6
 move.w leftedge(pc),d6
 beq.s nomultleft
 
 move.l d1,a4
 move.l d2,a5
 
 muls.l d6,d3:d1
 asr.l #6,d1
 add.l d1,d4

 muls.l d6,d3:d2
 asr.l #6,d2
 add.l d2,d5
 move.l a4,d1
 move.l a5,d2
 
nomultleft:

 move.w d4,startsmoothx
 move.w d5,startsmoothz

 swap d4
 asr.l #8,d5
; add.w szoff,d5
; add.w sxoff,d4
 and.w #63,d4
 and.w #63*256,d5
 move.b d4,d5

 asr.l #6,d1
 asr.l #6,d2
 move.w d1,a4
 move.w d2,a5
 asr.l #8,d2
 and.w #%0011111100000000,d2
 swap d1
 add.w d1,d2
 move.w #%11111100111111,d1
 and.w d1,d5
 swap d5
 move.w startsmoothz,d5
 swap d5
 swap d2
 move.w a5,d2
 swap d2
 
***********************************
 
 move.w d6,a2
 move.l d2,d6
 add.w #256,d6
 
 moveq #0,d0

 tst.w a2
 beq startatleftedge
 
 move.w widthleft(pc),d4
 
 move.w rightedge(pc),d3
 
 cmp.w #31,a2
 bgt.s notinfirststrip
 lea (a3,a2.w*4),a3
 cmp.w #32,d3
 ble.s allinfirststrip
 move.w #32,d7
 sub.w d7,d3
 sub.w a2,d7
 bra intofirststrip

allinfirststrip
 sub.w a2,d3
 move.w d3,d7
 move.w #0,d4
 bra allintofirst

notinfirststrip:
 sub.w #32,a2
 sub.w #32,d3
 adda.w #33*4,a3
 cmp.w #31,a2
 bgt.s notstartinsec
 lea (a3,a2.w*4),a3
 cmp.w #32,d3
 ble.s allinsecstrip
 move.w #32,d7
 sub.w d7,d3
 sub.w a2,d7
 move.w d3,d4
 bra allintofirst

allinsecstrip
 sub.w a2,d3
 move.w d3,d7
 move.w #0,d4
 bra allintofirst
 rts
 
prot8: dc.w 0
 
notstartinsec:
 sub.w #32,a2
 sub.w #32,d3
 adda.w #33*4,a3
 lea (a3,a2.w*4),a3
 cmp.w #32,d3
 ble.s allinthirdstrip
 move.w #32,d7
 sub.w d7,d3
 sub.w a2,d7
 move.w d3,d4
 bra allintofirst
 rts

allinthirdstrip
 sub.w a2,d3
 move.w d3,d7
 move.w #0,d4
 bra allintofirst
 rts

startatleftedge:

 move.w rightedge(pc),d3
 sub.w a2,d3
 
 move.w d3,d7
 cmp.w #32,d7
 ble.s .notoowide
 move.w #32,d7
.notoowide:
 sub.w d7,d3
intofirststrip:

 move.w d3,d4
allintofirst:

 move.w startsmoothx,d3

tstwat:

 tst.b gourfloor
 bne gouraudfloor

 tst.b usewater
 bne texturedwater
 
 
******************************
* BumpMap the floor/ceiling! *
 tst.b usebumps
 bne.s BumpMap
******************************
 
ordinary:
 moveq #0,d0

 dbra d7,acrossscrn
 rts
 
usebumps: dc.w $0
smoothbumps: dc.w $0
gourfloor: dc.w 0
 
 include "ab3:source/bumpmap.s"

 CNOP 0,4
backbefore:
 and.w d1,d5
 move.b (a0,d5.w*4),d0
 add.w a4,d3
 move.w (a1,d0.w*2),(a3)
 addq #4,a3
 addx.l d6,d5
 dbcs d7,acrossscrn
 dbcc d7,backbefore
 bra.s past1
 
acrossscrn:
 and.w d1,d5
 move.b (a0,d5.w*4),d0
 add.w a4,d3
 move.w (a1,d0.w*2),(a3)
 addq #4,a3
 addx.l d2,d5
 dbcs d7,acrossscrn
 dbcc d7,backbefore
past1:
 bcc.s gotoacross

 move.w d4,d7
 bne.s .notdoneyet
 CACHE_FREEZE_ON d2
 rts
.notdoneyet:

 cmp.w #32,d7
 ble.s .notoowide
 move.w #32,d7
.notoowide
 sub.w d7,d4  
 addq #4,a3
 
 dbra d7,backbefore
 CACHE_FREEZE_ON d2
 rts


gotoacross:

 move.w d4,d7
 bne.s .notdoneyet
 CACHE_FREEZE_ON d2
 rts
.notdoneyet:

 cmp.w #32,d7
 ble.s .notoowide
 move.w #32,d7
.notoowide
 sub.w d7,d4  
 addq #4,a3
 
 dbra d7,acrossscrn
 CACHE_FREEZE_ON d2
 rts

leftbright: dc.l 0
brightspd: dc.l 0

gouraudfloor:
 move.l leftbright,d0
 move.l brightspd,d1
 dbra d7,acrossscrngour
 rts

 CNOP 0,4
backbeforegour:
 and.w #63*256+63,d5
 move.b (a0,d5.w*4),d0
 add.l d1,d0
 bcc.s .nomoreb
 add.w #256,d0
.nomoreb:
 add.w a4,d3
 move.w (a1,d0.w*2),(a3)
 addq #4,a3 
 addx.l d6,d5
 dbcs d7,acrossscrngour
 dbcc d7,backbeforegour
 bra.s past1gour
 
acrossscrngour:
 and.w #63*256+63,d5
 move.b (a0,d5.w*4),d0
 add.l d1,d0
 bcc.s .nomoreb
 add.w #256,d0
.nomoreb:
 add.w a4,d3
 move.w (a1,d0.w*2),(a3)
 addq #4,a3
 addx.l d2,d5
 dbcs d7,acrossscrngour
 dbcc d7,backbeforegour
past1gour:
 bcc.s gotoacrossgour

 move.w d4,d7
 bne.s .notdoneyet
 move.l d0,leftbright
 
 CACHE_FREEZE_ON d2
 rts
.notdoneyet:

 cmp.w #32,d7
 ble.s .notoowide
 move.w #32,d7
.notoowide
 sub.w d7,d4  
 addq #4,a3
 
 dbra d7,backbeforegour
 CACHE_FREEZE_ON d2
 rts


gotoacrossgour:

 move.w d4,d7
 bne.s .notdoneyet
 CACHE_FREEZE_ON d2
 rts
.notdoneyet:

 cmp.w #32,d7
 ble.s .notoowide
 move.w #32,d7
.notoowide
 sub.w d7,d4  
 addq #4,a3
 
 dbra d7,acrossscrngour
 CACHE_FREEZE_ON d2
 rts

 
waterpt: dc.l waterlist

waterlist:
 dc.l waterfile
 dc.l waterfile+2
 dc.l waterfile+256
 dc.l waterfile+256+2
 dc.l waterfile+512
 dc.l waterfile+512+2
 dc.l waterfile+768
 dc.l waterfile+768+2
; dc.l waterfile+768
; dc.l waterfile+512+2
; dc.l waterfile+512
; dc.l waterfile+256+2
; dc.l waterfile+256
; dc.l waterfile+2
endwaterlist:
 
watertouse: dc.l waterfile
 
wtan: dc.w 0
wateroff: dc.w 0
 
texturedwater:

 add.w wateroff,d5

 move.l #brightentab,a1
 move.w dst,d0
 clr.b d0
 add.w d0,d0
 adda.w d0,a1

 move.w dst,d0
 asl.w #7,d0
 add.w wtan,d0
 and.w #8191,d0
 move.l #SineTable,a0
 move.w (a0,d0.w),d0
 ext.l d0
 move.w dst,d3
 add.w #300,d3
 divs d3,d0
 asr.w #6,d0
 add.w #2,d0
 
 move.w dst,d3
 asr.w #7,d3
 add.w d3,d0
 
 muls #104*4,d0
 move.w d0,a6

 move.l watertouse,a0

 move.w startsmoothx,d3
 dbra d7,acrossscrnw
 rts

backbeforew:
 and.w d1,d5
 move.w (a0,d5.w*4),d0
 move.b 1(a3,a6.w),d0
 move.w (a1,d0.w*2),(a3)
 addq #4,a3
 add.w a4,d3
 addx.l d6,d5
 dbcs d7,acrossscrnw
 dbcc d7,backbeforew
 bcc.s past1w
 add.w #256,d5 
 bra.s past1w
 
acrossscrnw:
 and.w d1,d5
 move.w (a0,d5.w*4),d0
 move.b 1(a3,a6.w),d0
 move.w (a1,d0.w*2),(a3)
 addq #4,a3
 add.w a4,d3
 addx.l d2,d5
 dbcs d7,acrossscrnw
 dbcc d7,backbeforew
 bcc.s past1w
 add.w #256,d5 
past1w:

 move.w d4,d7
 bne.s .notdoneyet
 rts
.notdoneyet:

 cmp.w #32,d7
 ble.s .notoowide
 move.w #32,d7
.notoowide
 sub.w d7,d4  
 addq #4,a3
 
 dbra d7,acrossscrnw
 CACHE_FREEZE_ON d2
 rts

usewater: dc.w 0
 dc.w 0
startsmoothx: dc.w 0
 dc.w 0
startsmoothz: dc.w 0

********************************
*
 include "AB3:source/ObjDraw3.chipram"
*
********************************

numframes:
 dc.w 0

alframe: dc.l Objects+4096
 
alan:
 dcb.l 8,0
 dcb.l 8,1
 dcb.l 8,2
 dcb.l 8,3
endalan:

alanptr: dc.l alan

Time2: dc.l 0
dispco:
 dc.w 0

KInt_Init	;VBR Assumed $0
		move.l $68.w,OLDKINT
		Move.l	#KInt_Main,$68.w	Install Interrupt 
		And.b	#$3f,$bfe201		Set Timers
		Move.b	#$7f,$bfed01
		Move.b	$bfed01,d0
		Move.b	#$88,$bfed01
		St.b	KInt_CCode		
		Move.b	#$a0,$bfee01		Start Timey Thing
		Rts				And return

OLDKINT: dc.l 0


KInt_Main	
		Movem.l	d0/d1/a0/a1/a6,-(a7)	Stack everything
		Move.w	#8,$dff09a		Temp Disable Int.
		Move.w	$dff01e,d0		Intreqr
		And.w	#8,d0			Mask Out All X^ K_Int
	Beq	KInt_End			Not Keyboard Interrupt
		Lea	$bfed01,a6
		Move.w	#$8,$dff09c		Clear Int.Request
		Move.b	-$100(a6),d0		Move Raw Keyboard value
		Ror.b	#1,d0			Roll to correct
		Not.b	d0			
		Move.b	d0,KInt_CCode		Save Corrected Keycode
.HandShake	Move.b	#8,(a6)
		Move.b	#7,-$900(a6)
		Move.b	#0,-$800(a6)
		Move.b	#0,-$100(a6)
		Move.b	#$d1,$100(a6)		
		Tst.b	(a6)	
.wait		Btst	#0,(a6)
	Beq.s	.wait
		Move.b	#$a0,$100(a6)		
		Move.b	(a6),d0		
		Move.b	#$88,(a6)
		Lea	KeyMap,a1
		Moveq.w	#0,d0
		Move.b	KInt_CCode(pc),d0
	Bmi.s	KInt_KeyUp			neg if up 

KInt_KeyDown
		st (a1,d0.w)
	Bra	KInt_End

KInt_KeyUp
		And.w	#$7f,d0			Make code Positive
		clr.b (a1,d0.w)
KInt_End	Movem.l	(a7)+,d0/d1/a0/a1/a6	Unstack Everything
	
		Move.w	#$8008,$dff09a		Re-enable Int.
		Rte

KInt_CCode	Ds.b	1
KInt_Askey	Ds.b	1
KInt_OCode	Ds.w	1

 
OldSpace: dc.b 0
SpaceTapped: dc.b 0
PLR1_SPCTAP: dc.b 0
PLR2_SPCTAP: dc.b 0
PLR1_Ducked: dc.b 0
PLR2_Ducked: dc.b 0
 even

 include "ab3:source/PLR1CONTROL.s"
 include "ab3:source/PLR2CONTROL.s"
 include "ab3:source/FALL.s"

prot7: dc.w 0
 
GOTTOSEND: dc.w 0

OtherInter:
 move.w #$0010,$dff000+intreq
 movem.l d0-d7/a0-a6,-(a7)
 bra.s justshake

Chan0inter:

 move.w #$0010,$dff000+intreq

 tst.b doanything
 bne.s dosomething
 rte
 
dosomething:


 addq.w #1,FramesToDraw
 movem.l d0-d7/a0-a6,-(a7)
 
; jsr INITREC
; jsr RECEIVE
 
; tst.l BUFFER
; beq.s justshake
; st GOTTOSEND
; move.l #OtherInter,$6c

justshake:
 
 cmp.b #'b',Prefsfile+3
 bne.s .noback
 jsr mt_music
.noback:
 
 bra dontshowtime
 
 tst.b oktodisplay
 beq dontshowtime
 clr.b oktodisplay
 subq.w #1,dispco
 bgt dontshowtime
 move.w #10,dispco
 
 move.l #TimerScr+10,a0
 move.l TimeCount,d0
 bge.s timenotneg
 move.l #1111*256,d0
timenotneg:
 asr.l #8,d0
 move.l #digits,a1
 move.w #7,d2
digitlop
 divs #10,d0
 swap d0
 lea (a1,d0.w*8),a2
 move.b (a2)+,(a0)
 move.b (a2)+,24(a0)
 move.b (a2)+,24*2(a0)
 move.b (a2)+,24*3(a0)
 move.b (a2)+,24*4(a0)
 move.b (a2)+,24*5(a0)
 move.b (a2)+,24*6(a0)
 move.b (a2)+,24*7(a0)
 subq #1,a0
 swap d0
 ext.l d0
 dbra d2,digitlop

 move.l #TimerScr+10+24*10,a0
 move.l NumTimes,d0
 move.l #digits,a1
 move.w #3,d2
digitlop2
 divs #10,d0
 swap d0
 lea (a1,d0.w*8),a2
 move.b (a2)+,(a0)
 move.b (a2)+,24(a0)
 move.b (a2)+,24*2(a0)
 move.b (a2)+,24*3(a0)
 move.b (a2)+,24*4(a0)
 move.b (a2)+,24*5(a0)
 move.b (a2)+,24*6(a0)
 move.b (a2)+,24*7(a0)
 subq #1,a0
 swap d0
 ext.l d0
 dbra d2,digitlop2

 move.l #TimerScr+10+24*20,a0
 moveq #0,d0
 move.w FramesToDraw,d0
 move.l #digits,a1
 move.w #2,d2
digitlop3
 divs #10,d0
 swap d0
 lea (a1,d0.w*8),a2
 move.b (a2)+,(a0)
 move.b (a2)+,24(a0)
 move.b (a2)+,24*2(a0)
 move.b (a2)+,24*3(a0)
 move.b (a2)+,24*4(a0)
 move.b (a2)+,24*5(a0)
 move.b (a2)+,24*6(a0)
 move.b (a2)+,24*7(a0)
 subq #1,a0
 swap d0
 ext.l d0
 dbra d2,digitlop3

dontshowtime:

 
 move.l alanptr,a0
 move.l (a0)+,alframe
 cmp.l #endalan,a0
 blt.s nostartalan
 move.l #alan,a0
nostartalan:
 move.l a0,alanptr
 

 tst.b READCONTROLS
 beq.s nocontrols

 cmp.b #'s',mors
 beq.s control2

 tst.b PLR1MOUSE
 beq.s PLR1_nomouse
 bsr PLR1_mouse_control
PLR1_nomouse:
 tst.b PLR1KEYS
 beq.s PLR1_nokeys
 bsr PLR1_keyboard_control
PLR1_nokeys:
; tst.b PLR1PATH
; beq.s PLR1_nopath
; bsr PLR1_follow_path
;PLR1_nopath:
 tst.b PLR1JOY
 beq.s PLR1_nojoy
 bsr PLR1_JoyStick_control
PLR1_nojoy: 
 bra.s nocontrols

control2:
 tst.b PLR2MOUSE
 beq.s PLR2_nomouse
 bsr PLR2_mouse_control
PLR2_nomouse:
 tst.b PLR2KEYS
 beq.s PLR2_nokeys
 bsr PLR2_keyboard_control
PLR2_nokeys:
; tst.b PLR2PATH
; beq.s PLR2_nopath
; bsr PLR1_follow_path
;PLR2_nopath:
 tst.b PLR2JOY
 beq.s PLR2_nojoy
 bsr PLR2_JoyStick_control
PLR2_nojoy: 


nocontrols:

 move.l #$dff000,a6

 cmp.b #'4',Prefsfile+1
 bne.s nomuckabout
 
 move.w #$0,d0 
 tst.b NoiseMade0LEFT
 beq.s noturnoff0
 move.w #1,d0
noturnoff0:
 tst.b NoiseMade0RIGHT
 beq.s noturnoff1
 or.w #2,d0
noturnoff1:
 tst.b NoiseMade1RIGHT
 beq.s noturnoff2
 or.w #4,d0
noturnoff2:
 tst.b NoiseMade1LEFT
 beq.s noturnoff3
 or.w #8,d0
noturnoff3:
 move.w d0,dmacon(a6)
 
nomuckabout:

 
; tst.b PLR2_fire
; beq.s firenotpressed2
; fire was pressed last time.
; btst #7,$bfe001
; bne.s firenownotpressed2
; fire is still pressed this time.
; st PLR2_fire
; bra dointer
 
firenownotpressed2:
; fire has been released.
; clr.b PLR2_fire
; bra dointer
 
firenotpressed2

; fire was not pressed last frame...

; btst #7,$bfe001
; if it has still not been pressed, go back above
; bne.s firenownotpressed2
; fire was not pressed last time, and was this time, so has
; been clicked.
; st PLR2_clicked
; st PLR2_fire
 
dointer
 
 cmp.b #'4',Prefsfile+1
 beq fourchannel
 
 btst #1,$dff000+intreqr
 bne.s newsampbitl

 movem.l (a7)+,d0-d7/a0-a6
 
 rte
 
 
swappedem: dc.w 0
 
newsampbitl:

 move.w #$820f,$dff000+dmacon

 move.w #$200,$dff000+intreq
 
; tst.b CHANNELDATA
; bne nochannel0
 
 move.l pos0LEFT,a0
 move.l pos2LEFT,a1

 move.l #tab,a2
 
 moveq #0,d0
 moveq #0,d1
 move.b vol0left,d0
 move.b vol2left,d1
 cmp.b d1,d0
 slt swappedem
 bge.s fbig0

; d1 is bigger so scale d0 and use d1
; as audiochannel volume.

 exg a0,a1
 asl.w #6,d0
 divs d1,d0
 lsl.w #8,d0
 adda.w d0,a2
 move.w d1,$dff0a8
 bra.s donechan0

fbig0:
 tst.w d0
 beq.s donechan0
 asl.w #6,d1
 divs d0,d1
 lsl.w #8,d1
 adda.w d1,a2
 move.w d0,$dff0a8

donechan0:
 
 move.l Aupt0,a3
 move.l a3,$dff0a0
 move.l Auback0,Aupt0
 move.l a3,Auback0
 
 move.l Auback0,a3
 
 moveq #0,d0
 moveq #0,d1
 moveq #0,d2
 moveq #0,d3
 moveq #0,d4
 moveq #0,d5
 move.w #49,d7
loop:
 move.l (a0)+,d0
 move.b (a1)+,d1
 move.b (a1)+,d2
 move.b (a1)+,d3
 move.b (a1)+,d4
 move.b (a2,d3.w),d5
 swap d5
 move.b (a2,d1.w),d5
 asl.l #8,d5
 move.b (a2,d2.w),d5
 swap d5
 move.b (a2,d4.w),d5
 add.l d5,d0
 move.l d0,(a3)+
 dbra d7,loop

 tst.b swappedem
 beq.s .ok23
 exg a0,a1
.ok23:
 
 cmp.l Samp0endLEFT,a0
 blt.s .notoffendsamp1
 move.l SampleList+6*8,a0
 move.l SampleList+6*8+4,Samp0endLEFT
 move.b #63,vol0left
 st LEFTCHANDATA+1
 move.w #0,LEFTCHANDATA+2
.notoffendsamp1:

 cmp.l Samp2endLEFT,a1
 blt.s .notoffendsamp2
 move.l #empty,a1
 move.l #emptyend,Samp2endLEFT
 move.b #0,vol2left
 st LEFTCHANDATA+1+8
 move.w #0,LEFTCHANDATA+2+8
.notoffendsamp2:
 
 move.l a0,pos0LEFT
 move.l a1,pos2LEFT

nochannel0:

 tst.b CHANNELDATA+16
 bne nochannel1

 
 move.l pos0RIGHT,a0
 move.l pos2RIGHT,a1

 move.l Aupt1,a3
 move.l a3,$dff0b0
 move.l Auback1,Aupt1
 move.l a3,Auback1

 move.l #tab,a2
 
 moveq #0,d0
 moveq #0,d1
 move.b vol0right,d0
 move.b vol2right,d1
 cmp.b d1,d0
 slt swappedem
 bge.s fbig1

; d1 is bigger so scale d0 and use d1
; as audiochannel volume.

 exg a0,a1
 asl.w #6,d0
 divs d1,d0
 lsl.w #8,d0
 adda.w d0,a2
 move.w d1,$dff0b8
 bra.s donechan1

fbig1:
 tst.w d0
 beq.s donechan1
 asl.w #6,d1
 divs d0,d1
 lsl.w #8,d1
 adda.w d1,a2
 move.w d0,$dff0b8

donechan1:
 moveq #0,d0
 moveq #0,d1
 moveq #0,d2
 moveq #0,d3
 moveq #0,d4
 moveq #0,d5
 move.w #49,d7
loop2:
 move.l (a0)+,d0
 move.b (a1)+,d1
 move.b (a1)+,d2
 move.b (a1)+,d3
 move.b (a1)+,d4
 move.b (a2,d3.w),d5
 swap d5
 move.b (a2,d1.w),d5
 asl.l #8,d5
 move.b (a2,d2.w),d5
 swap d5
 move.b (a2,d4.w),d5
 add.l d5,d0
 move.l d0,(a3)+
 dbra d7,loop2
 
 tst.b swappedem
 beq.s ok01
 exg a0,a1
ok01:
 
 cmp.l Samp0endRIGHT,a0
 blt.s .notoffendsamp1
 move.l #empty,a0
 move.l #emptyend,Samp0endRIGHT
 move.b #0,vol0right
 st RIGHTCHANDATA+1
 move.w #0,RIGHTCHANDATA+2
.notoffendsamp1:

 cmp.l Samp2endRIGHT,a1
 blt.s .notoffendsamp2
 move.l #empty,a1
 move.l #emptyend,Samp2endRIGHT
 move.b #0,vol2right
 st RIGHTCHANDATA+1+8
 move.w #0,RIGHTCHANDATA+2+8
.notoffendsamp2:

 move.l a0,pos0RIGHT
 move.l a1,pos2RIGHT

nochannel1:

******************* Other two channels

 move.l pos1LEFT,a0
 move.l pos3LEFT,a1

 move.l #tab,a2
 
 moveq #0,d0
 moveq #0,d1
 move.b vol1left,d0
 move.b vol3left,d1
 cmp.b d1,d0
 slt swappedem
 bge.s fbig2

; d1 is bigger so scale d0 and use d1
; as audiochannel volume.

 exg a0,a1
 asl.w #6,d0
 divs d1,d0
 lsl.w #8,d0
 adda.w d0,a2
 move.w d1,$dff0d8
 bra.s donechan2

fbig2:
 tst.w d0
 beq.s donechan2
 asl.w #6,d1
 divs d0,d1
 lsl.w #8,d1
 adda.w d1,a2
 move.w d0,$dff0d8

donechan2:

 move.l Aupt2,a3
 move.l a3,$dff0d0
 move.l Auback2,Aupt2
 move.l a3,Auback2
 
 moveq #0,d0
 moveq #0,d1
 moveq #0,d2
 moveq #0,d3
 moveq #0,d4
 moveq #0,d5
 move.w #49,d7
loop3:
 move.l (a0)+,d0
 move.b (a1)+,d1
 move.b (a1)+,d2
 move.b (a1)+,d3
 move.b (a1)+,d4
 move.b (a2,d3.w),d5
 swap d5
 move.b (a2,d1.w),d5
 asl.l #8,d5
 move.b (a2,d2.w),d5
 swap d5
 move.b (a2,d4.w),d5
 add.l d5,d0
 move.l d0,(a3)+
 dbra d7,loop3

 tst.b swappedem
 beq.s .ok23
 exg a0,a1
.ok23:

 cmp.l Samp1endLEFT,a0
 blt.s .notoffendsamp3
 move.l #empty,a0
 move.l #emptyend,Samp1endLEFT
 move.b #0,vol1left
 st LEFTCHANDATA+1+4
 move.w #0,LEFTCHANDATA+2+4
.notoffendsamp3:

 cmp.l Samp3endLEFT,a1
 blt.s .notoffendsamp4
 move.l #empty,a1
 move.l #emptyend,Samp3endLEFT
 move.b #0,vol3left
 st LEFTCHANDATA+1+12
 move.w #0,LEFTCHANDATA+2+12
.notoffendsamp4:

 move.l a0,pos1LEFT
 move.l a1,pos3LEFT
 
 move.l pos1RIGHT,a0
 move.l pos3RIGHT,a1

 move.l Aupt3,a3
 move.l a3,$dff0c0
 move.l Auback3,Aupt3
 move.l a3,Auback3

 move.l #tab,a2
 
 moveq #0,d0
 moveq #0,d1
 move.b vol1right,d0
 move.b vol3right,d1
 cmp.b d1,d0
 slt.s swappedem
 bge.s fbig3

 exg a0,a1
 asl.w #6,d0
 divs d1,d0
 lsl.w #8,d0
 adda.w d0,a2
 move.w d1,$dff0c8
 bra.s donechan3

fbig3:
 tst.w d0
 beq.s donechan3
 asl.w #6,d1
 divs d0,d1
 lsl.w #8,d1
 adda.w d1,a2
 move.w d0,$dff0c8
donechan3:

 moveq #0,d0
 moveq #0,d1
 moveq #0,d2
 moveq #0,d3
 moveq #0,d4
 moveq #0,d5
 move.w #49,d7
loop4:
 move.l (a0)+,d0
 move.b (a1)+,d1
 move.b (a1)+,d2
 move.b (a1)+,d3
 move.b (a1)+,d4
 move.b (a2,d3.w),d5
 swap d5
 move.b (a2,d1.w),d5
 asl.l #8,d5
 move.b (a2,d2.w),d5
 swap d5
 move.b (a2,d4.w),d5
 add.l d5,d0
 move.l d0,(a3)+
 dbra d7,loop4
 
 tst.b swappedem
 beq.s .ok23
 exg a0,a1
.ok23:
 
 cmp.l Samp1endRIGHT,a0
 blt.s notoffendsamp3
 move.l #empty,a0
 move.l #emptyend,Samp1endRIGHT
 move.b #0,vol1right
 st RIGHTCHANDATA+1+4
 move.w #0,RIGHTCHANDATA+2+4
notoffendsamp3:

 cmp.l Samp3endRIGHT,a1
 blt.s notoffendsamp4
 move.l #empty,a1
 move.l #emptyend,Samp3endRIGHT
 move.b #0,vol3right
 st RIGHTCHANDATA+1+12
 move.w #0,RIGHTCHANDATA+2+12
notoffendsamp4:

 move.l a0,pos1RIGHT
 move.l a1,pos3RIGHT

 movem.l (a7)+,d0-d7/a0-a6
 tst.b counting
 beq .nostartcounter
 JSR STARTCOUNT
.nostartcounter:

 rte
 
***********************************
* 4 channel sound routine
***********************************

fourchannel:

 move.l #$dff000,a6

 btst #7,intreqrl(a6)
 beq.s nofinish0
; move.w #0,LEFTCHANDATA+2
; st LEFTCHANDATA+1
 move.l #null,$a0(a6)
 move.w #100,$a4(a6) 
 move.w #$0080,intreq(a6)
nofinish0:
 
 tst.b NoiseMade0pLEFT
 beq.s NoChan0sound

 move.l Samp0endLEFT,d0
 move.l pos0LEFT,d1
 sub.l d1,d0
 lsr.l #1,d0
 move.w d0,$a4(a6)
 move.l d1,$a0(a6)
 move.w #$8201,dmacon(a6)
 moveq #0,d0
 move.b vol0left,d0
 move.w d0,$a8(a6)

NoChan0sound:

*****************************************
*****************************************

 btst #0,intreqr(a6)
 beq.s nofinish1
 move.l #null,$b0(a6)
 move.w #100,$b4(a6)
 move.w #$0100,intreq(a6)
nofinish1:

 tst.b NoiseMade0pRIGHT
 beq.s NoChan1sound

 move.l Samp0endRIGHT,d0
 move.l pos0RIGHT,d1
 sub.l d1,d0
 lsr.l #1,d0
 move.w d0,$b4(a6)
 move.l d1,$b0(a6)
 move.w d0,playnull1
 move.w #$8202,dmacon(a6)
 moveq #0,d0
 move.b vol0right,d0
 move.w d0,$b8(a6)

NoChan1sound:

*****************************************
*****************************************

 btst #1,intreqr(a6)
 beq.s nofinish2
 move.l #null,$c0(a6)
 move.w #100,$c4(a6)
 move.w #$0200,intreq(a6)
nofinish2:

 tst.b NoiseMade1pRIGHT
 beq.s NoChan2sound

 move.l Samp1endRIGHT,d0
 move.l pos1RIGHT,d1
 sub.l d1,d0
 lsr.l #1,d0
 move.w d0,$c4(a6)
 move.w d0,playnull2
 
 move.l d1,$c0(a6)
 move.w #$8204,dmacon(a6)
 moveq #0,d0
 move.b vol1right,d0
 move.w d0,$c8(a6)

NoChan2sound:

*****************************************
*****************************************

 btst #2,intreqr(a6)
 beq.s nofinish3
 move.l #null,$d0(a6)
 move.w #100,$d4(a6)
 move.w #$0400,intreq(a6)
nofinish3:

 tst.b NoiseMade1pLEFT
 beq.s NoChan3sound

 move.l Samp1endLEFT,d0
 move.l pos1LEFT,d1
 sub.l d1,d0
 lsr.l #1,d0
 move.w d0,$d4(a6)
 move.w d0,playnull3
 move.l d1,$d0(a6)
 move.w #$8208,dmacon(a6)
 moveq #0,d0
 move.b vol1left,d0
 move.w d0,$d8(a6)
 
NoChan3sound:
 
nomorechannels:

 move.l NoiseMade0LEFT,NoiseMade0pLEFT
 move.l #0,NoiseMade0LEFT
 move.l NoiseMade0RIGHT,NoiseMade0pRIGHT
 move.l #0,NoiseMade0RIGHT


; tst.b playnull0
; beq.s .nnul
; sub.b #1,playnull0
; bra.s chan0still
;.nnul:
; 
;chan0still:

 tst.b NoiseMade0pLEFT
 bne.s chan0still
 tst.w playnull0
 beq.s nnul0
 sub.w #100,playnull0
 bra.s chan0still
nnul0:
 move.w #0,LEFTCHANDATA+2
 st LEFTCHANDATA+1
chan0still:

 tst.b NoiseMade0pRIGHT
 bne.s chan1still
 tst.w playnull1
 beq.s nnul1
 sub.w #100,playnull1
 bra.s chan1still
nnul1:
 move.w #0,RIGHTCHANDATA+2
 st RIGHTCHANDATA+1
chan1still:

 tst.b NoiseMade1pRIGHT
 bne.s chan2still
 tst.w playnull2
 beq.s nnul2
 sub.w #100,playnull2
 bra.s chan2still
nnul2:
 move.w #0,RIGHTCHANDATA+2+4
 st RIGHTCHANDATA+1+4
chan2still:

 tst.b NoiseMade1pLEFT
 bne.s chan3still
 tst.w playnull3
 beq.s nnul3
 sub.w #100,playnull3
 bra.s chan3still
nnul3:
 move.w #0,LEFTCHANDATA+2+4
 st LEFTCHANDATA+1+4
 
chan3still:


 movem.l (a7)+,d0-d7/a0-a6
 tst.b counting
 beq .nostartcounter
 JSR STARTCOUNT
.nostartcounter:

 rte
 
backbeat: dc.w 0

playnull0: dc.w 0
playnull1: dc.w 0
playnull2: dc.w 0
playnull3: dc.w 0

Samp0endRIGHT: dc.l emptyend
Samp1endRIGHT: dc.l emptyend
Samp2endRIGHT: dc.l emptyend
Samp3endRIGHT: dc.l emptyend
Samp0endLEFT: dc.l emptyend
Samp1endLEFT: dc.l emptyend
Samp2endLEFT: dc.l emptyend
Samp3endLEFT: dc.l emptyend

Aupt0: dc.l null
Auback0: dc.l null+500
Aupt2: dc.l null3
Auback2: dc.l null3+500
Aupt3: dc.l null4
Auback3: dc.l null4+500
Aupt1: dc.l null2
Auback1: dc.l null2+500

NoiseMade0LEFT: dc.b 0
NoiseMade1LEFT: dc.b 0
NoiseMade2LEFT: dc.b 0
NoiseMade3LEFT: dc.b 0
NoiseMade0pLEFT: dc.b 0
NoiseMade1pLEFT: dc.b 0
NoiseMade2pLEFT: dc.b 0
NoiseMade3pLEFT: dc.b 0
NoiseMade0RIGHT: dc.b 0
NoiseMade1RIGHT: dc.b 0
NoiseMade2RIGHT: dc.b 0
NoiseMade3RIGHT: dc.b 0
NoiseMade0pRIGHT: dc.b 0
NoiseMade1pRIGHT: dc.b 0
NoiseMade2pRIGHT: dc.b 0
NoiseMade3pRIGHT: dc.b 0

empty: ds.l 100
emptyend:
 
**************************************
* I want a routine to calculate all the
* info needed for the sound player to
* work, given say position of noise, volume
* and sample number.

Samplenum: dc.w 0
Noisex: dc.w 0
Noisez: dc.w 0
Noisevol: dc.w 0
chanpick: dc.w 0
IDNUM: dc.w 0
needleft: dc.b 0
needright: dc.b 0
STEREO: dc.b $0
even
prot6: dc.w 0

 even
 
CHANNELDATA:
LEFTCHANDATA:
 dc.l $00000000
 dc.l $00000000
 dc.l $FF000000
 dc.l $FF000000
RIGHTCHANDATA:
 dc.l $00000000
 dc.l $00000000
 dc.l $FF000000
 dc.l $FF000000
 
RIGHTPLAYEDTAB: ds.l 20
LEFTPLAYEDTAB: ds.l 20
 
MakeSomeNoise:

; Plan for new sound handler:
; It is sent a sample number,
; a position relative to the
; player, an id number and a volume.
; Also notifplaying.

; indirect inputs are the available
; channel flags and whether or not
; stereo sound is selected.

; the algorithm must decide
; whether the new sound is more
; important than the ones already
; playing. Thus an 'importance'
; must be calculated, probably
; using volume.

; The output needs to be:

; Write the pointers and volumes of
; the sound channels


 tst.b notifplaying
 beq.s dontworry

; find if we are already playing

 move.b IDNUM,d0
 move.w #7,d1
 lea CHANNELDATA,a3
findsameasme
 tst.b (a3)
 bne.s notavail
 cmp.b 1(a3),d0
 beq SameAsMe
notavail:
 add.w #4,a3
 dbra d1,findsameasme
 bra dontworry
SameAsMe
 rts

dontworry:

; Ok its fine for us to play a sound.
; So calculate left/right volume.

 move.w Noisex,d1
 muls d1,d1
 move.w Noisez,d2
 muls d2,d2
 move.w #64,d3
 moveq #1,d0
 add.l d1,d2
 beq pastcalc

 move.w #31,d0
.findhigh
 btst d0,d2
 bne .foundhigh
 dbra d0,.findhigh
.foundhigh
 asr.w #1,d0
 clr.l d3
 bset d0,d3
 move.l d3,d0

 move.w d0,d3
 muls d3,d3	; x*x
 sub.l d2,d3	; x*x-a
 asr.l #1,d3	; (x*x-a)/2
 divs d0,d3	; (x*x-a)/2x
 sub.w d3,d0	; second approx
 bgt .stillnot0
 move.w #1,d0
.stillnot0

 move.w d0,d3
 muls d3,d3
 sub.l d2,d3
 asr.l #1,d3
 divs d0,d3
 sub.w d3,d0	; second approx
 bgt .stillnot02
 move.w #1,d0
.stillnot02
 
 move.w #64,d3
 muls Noisevol,d3
 asr.w #1,d0
 addq #1,d0
 divs d0,d3

 cmp.w #64,d3
 ble.s notooloud
 move.w #64,d3
notooloud:

pastcalc:

	; d3 contains volume of noise.
	
 move.w d3,d4
 
 move.w d3,d2
 muls Noisex,d2
 add.w d0,d0
 divs d0,d2
 
 bgt.s quietleft
 add.w d2,d4
 bge.s donequiet
 move.w #0,d4
 bra.s donequiet
quietleft:
 sub.w d2,d3
 bge.s donequiet
 move.w #0,d3
donequiet:

; d3=leftvol?
; d4=rightvol?

 clr.w needleft

 cmp.b d3,d4
 bgt.s RightLouder
 
; Left is louder; is it MUCH louder?

 st needleft
 move.w d3,d2
 sub.w d4,d2
 cmp.w #32,d2
 slt needright
 bra aboutsame
 
RightLouder:
 st needright
 move.w d4,d2
 sub.w d3,d2
 cmp.w #32,d2
 slt needleft
 
aboutsame:

 tst.b STEREO
 beq NOSTEREO

; Find least important sound on left

 move.l #0,a2
 move.l #0,d5
 move.w #10000,d2
 move.b IDNUM,d0
 lea LEFTCHANDATA,a3
 move.w #3,d1
FindLeftChannel
 tst.b (a3)
 bne.s .notactive
 cmp.b 1(a3),d0
 beq.s FOUNDLEFT
 cmp.w 2(a3),d2
 blt.s .notactive
 move.w 2(a3),d2
 move.l a3,a2
 move.w d5,d6

.notactive:
 add.w #4,a3
 add.w #1,d5
 dbra d1,FindLeftChannel
 move.l a2,a3
 bra.s gopastleft
FOUNDLEFT:
 move.w d5,d6
gopastleft:
 tst.l a3
 bne.s FOUNDALEFT
 rts
FOUNDALEFT:

; d6 = channel number
 move.b d0,1(a3)
 move.w d3,2(a3)

 move.w Samplenum,d5
 move.l #SampleList,a3
 move.l (a3,d5.w*8),a1
 move.l 4(a3,d5.w*8),a2

 tst.b d6
 seq NoiseMade0LEFT
 beq.s .chan0
 cmp.b #2,d6
 slt NoiseMade1LEFT
 blt .chan1
 seq NoiseMade2LEFT
 beq .chan2
 st NoiseMade3LEFT

 move.b d5,LEFTPLAYEDTAB+9
 move.b d3,LEFTPLAYEDTAB+1+9
 move.b d4,LEFTPLAYEDTAB+2+9
 move.b d3,vol3left
 move.l a1,pos3LEFT
 move.l a2,Samp3endLEFT
 bra dorightchan
 
.chan0: 
 move.b d5,LEFTPLAYEDTAB
 move.b d3,LEFTPLAYEDTAB+1
 move.b d4,LEFTPLAYEDTAB+2
 move.l a1,pos0LEFT
 move.l a2,Samp0endLEFT
 move.b d3,vol0left
 bra dorightchan
 
.chan1:
 move.b d5,LEFTPLAYEDTAB+3
 move.b d3,LEFTPLAYEDTAB+1+3
 move.b d4,LEFTPLAYEDTAB+2+3
 move.b d3,vol1left
 move.l a1,pos1LEFT
 move.l a2,Samp1endLEFT
 bra dorightchan

.chan2: 
 move.b d5,LEFTPLAYEDTAB+6
 move.b d3,LEFTPLAYEDTAB+1+6
 move.b d4,LEFTPLAYEDTAB+2+6
 move.l a1,pos2LEFT
 move.l a2,Samp2endLEFT
 move.b d3,vol2left
 
dorightchan:

; Find least important sound on right

 move.l #0,a2
 move.l #0,d5
 move.w #10000,d2
 move.b IDNUM,d0
 lea RIGHTCHANDATA,a3
 move.w #3,d1
FindRightChannel
 tst.b (a3)
 bne.s .notactive
 cmp.b 1(a3),d0
 beq.s FOUNDRIGHT
 cmp.w 2(a3),d2
 blt.s .notactive
 move.w 2(a3),d2
 move.l a3,a2
 move.w d5,d6

.notactive:
 add.w #4,a3
 add.w #1,d5
 dbra d1,FindRightChannel
 move.l a2,a3
 bra.s gopastright
FOUNDRIGHT:
 move.w d5,d6
gopastright:
 tst.l a3
 bne.s FOUNDARIGHT
 rts
FOUNDARIGHT:

; d6 = channel number
 move.b d0,1(a3)
 move.w d3,2(a3)

 move.w Samplenum,d5
 move.l #SampleList,a3
 move.l (a3,d5.w*8),a1
 move.l 4(a3,d5.w*8),a2

 tst.b d6
 seq NoiseMade0RIGHT
 beq.s .chan0
 cmp.b #2,d6
 slt NoiseMade1RIGHT
 blt .chan1
 seq NoiseMade2RIGHT
 beq .chan2
 st NoiseMade3RIGHT

 move.b d5,RIGHTPLAYEDTAB+9
 move.b d3,RIGHTPLAYEDTAB+1+9
 move.b d4,RIGHTPLAYEDTAB+2+9
 move.b d4,vol3right
 move.l a1,pos3RIGHT
 move.l a2,Samp3endRIGHT
 rts
 
.chan0: 
 move.b d5,RIGHTPLAYEDTAB
 move.b d3,RIGHTPLAYEDTAB+1
 move.b d4,RIGHTPLAYEDTAB+2
 move.l a1,pos0RIGHT
 move.l a2,Samp0endRIGHT
 move.b d4,vol0right
 rts
 
.chan1:
 move.b d5,RIGHTPLAYEDTAB+3
 move.b d3,RIGHTPLAYEDTAB+1+3
 move.b d4,RIGHTPLAYEDTAB+2+3
 move.b d3,vol1right
 move.l a1,pos1RIGHT
 move.l a2,Samp1endRIGHT
 rts

.chan2: 
 move.b d5,RIGHTPLAYEDTAB+6
 move.b d3,RIGHTPLAYEDTAB+1+6
 move.b d4,RIGHTPLAYEDTAB+2+6
 move.l a1,pos2RIGHT
 move.l a2,Samp2endRIGHT
 move.b d3,vol2right
 rts

NOSTEREO:
 move.l #0,a2
 move.l #0,d5
 move.w #10000,d2
 move.b IDNUM,d0
 lea CHANNELDATA,a3
 move.w #7,d1
FindChannel
 tst.b (a3)
 bne.s .notactive
 cmp.b 1(a3),d0
 beq.s FOUNDCHAN
 cmp.w 2(a3),d2
 blt.s .notactive
 move.w 2(a3),d2
 move.l a3,a2
 move.w d5,d6

.notactive:
 add.w #4,a3
 add.w #1,d5
 dbra d1,FindChannel
 move.l a2,a3
 bra.s gopastchan
FOUNDCHAN:
 move.w d5,d6
gopastchan:
 tst.l a3
 bne.s FOUNDACHAN
tooquiet:
 rts
FOUNDACHAN:

; d6 = channel number

 cmp.w d2,d3
 blt.s tooquiet

 move.b d0,1(a3)
 move.w d3,2(a3)

 move.w Samplenum,d5
 move.l #SampleList,a3
 move.l (a3,d5.w*8),a1
 move.l 4(a3,d5.w*8),a2

 tst.b d6
 seq NoiseMade0LEFT
 beq .chan0
 cmp.b #2,d6
 slt NoiseMade1LEFT
 blt .chan1
 seq NoiseMade2LEFT
 beq .chan2
 cmp.b #4,d6
 slt NoiseMade3LEFT
 blt .chan3
 seq NoiseMade0RIGHT
 beq .chan4
 cmp.b #6,d6
 slt NoiseMade1RIGHT
 blt .chan5
 seq NoiseMade2RIGHT
 beq .chan6
 st NoiseMade3RIGHT

 move.b d5,RIGHTPLAYEDTAB+9
 move.b d3,RIGHTPLAYEDTAB+1+9
 move.b d4,RIGHTPLAYEDTAB+2+9
 move.b d4,vol3right
 move.l a1,pos3RIGHT
 move.l a2,Samp3endRIGHT
 rts

.chan3:
 move.b d5,LEFTPLAYEDTAB+9
 move.b d3,LEFTPLAYEDTAB+1+9
 move.b d4,LEFTPLAYEDTAB+2+9
 move.b d3,vol3left
 move.l a1,pos3LEFT
 move.l a2,Samp3endLEFT
 bra dorightchan
 
.chan0: 
 move.b d5,LEFTPLAYEDTAB
 move.b d3,LEFTPLAYEDTAB+1
 move.b d4,LEFTPLAYEDTAB+2
 move.l a1,pos0LEFT
 move.l a2,Samp0endLEFT
 move.b d3,vol0left
 rts
 
.chan1:
 move.b d5,LEFTPLAYEDTAB+3
 move.b d3,LEFTPLAYEDTAB+1+3
 move.b d4,LEFTPLAYEDTAB+2+3
 move.b d3,vol1left
 move.l a1,pos1LEFT
 move.l a2,Samp1endLEFT
 rts

.chan2: 
 move.b d5,LEFTPLAYEDTAB+6
 move.b d3,LEFTPLAYEDTAB+1+6
 move.b d4,LEFTPLAYEDTAB+2+6
 move.l a1,pos2LEFT
 move.l a2,Samp2endLEFT
 move.b d3,vol2left
 rts
 
.chan4: 
 move.b d5,RIGHTPLAYEDTAB
 move.b d3,RIGHTPLAYEDTAB+1
 move.b d4,RIGHTPLAYEDTAB+2
 move.l a1,pos0RIGHT
 move.l a2,Samp0endRIGHT
 move.b d4,vol0right
 rts
 
.chan5:
 move.b d5,RIGHTPLAYEDTAB+3
 move.b d3,RIGHTPLAYEDTAB+1+3
 move.b d4,RIGHTPLAYEDTAB+2+3
 move.b d3,vol1right
 move.l a1,pos1RIGHT
 move.l a2,Samp1endRIGHT
 rts

.chan6: 
 move.b d5,RIGHTPLAYEDTAB+6
 move.b d3,RIGHTPLAYEDTAB+1+6
 move.b d4,RIGHTPLAYEDTAB+2+6
 move.l a1,pos2RIGHT
 move.l a2,Samp2endRIGHT
 move.b d3,vol2right
 rts

SampleList:
 dc.l Scream,EndScream
 dc.l Shoot,EndShoot
 dc.l Munch,EndMunch
 dc.l PooGun,EndPooGun
 dc.l Collect,EndCollect
;5
 dc.l DoorNoise,EndDoorNoise
 dc.l 0,0
 dc.l Stomp,EndStomp
 dc.l LowScream,EndLowScream
 dc.l BaddieGun,EndBaddieGun
;10
 dc.l SwitchNoise,EndSwitch
 dc.l Reload,EndReload
 dc.l NoAmmo,EndNoAmmo
 dc.l Splotch,EndSplotch
 dc.l SplatPop,EndSplatPop
;15
 dc.l Boom,EndBoom
 dc.l Hiss,EndHiss
 dc.l Howl1,EndHowl1
 dc.l Howl2,EndHowl2
 dc.l Pant,EndPant
;20
 dc.l Whoosh,EndWhoosh
 dc.l ROAR,EndROAR
 dc.l whoosh,Endwhoosh
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 ds.l 40

 include "ab3:source/wallchunk.s"
 include "ab3:source/loadfromdisk.s"
 include "ab3:source/screensetup.s"
 include "ab3:source/CONTROLLOOP.s"

saveinters:  
 dc.w 0

z: dc.w 10

notifplaying:
 dc.w 0

audpos1: dc.w 0
audpos1b: dc.w 0
audpos2: dc.w 0
audpos2b: dc.w 0
audpos3: dc.w 0
audpos3b: dc.w 0
audpos4: dc.w 0
audpos4b: dc.w 0

vol0left: dc.w 0
vol0right: dc.w 0
vol1left: dc.w 0
vol1right: dc.w 0
vol2left: dc.w 0
vol2right: dc.w 0
vol3left: dc.w 0
vol3right: dc.w 0

pos: dc.l 0

pos0LEFT: dc.l empty
pos1LEFT: dc.l empty
pos2LEFT: dc.l empty
pos3LEFT: dc.l empty
pos0RIGHT: dc.l empty
pos1RIGHT: dc.l empty
pos2RIGHT: dc.l empty
pos3RIGHT: dc.l empty

numtodo dc.w 0

npt: dc.w 0

pretab:
val SET 0
 REPT 128
 dc.b val
val SET val+1
 ENDR
val SET -128
 REPT 128
 dc.b val
val SET val+1
 ENDR 

tab:
 ds.b 256*65


test: dc.l 0
 ds.l 30

 even
ConstCols:
; incbin "ConstCols"
 even
Smoothscalecols:
; incbin "smoothbumppalscaled"
 even
SmoothTile:
; incbin "smoothbumptile"
 even
Bumpscalecols:
; incbin "Bumppalscaled"
 even
Bumptile:
; incbin "bumptile"
 even
scalecols: ;incbin "bytepixpalscaled"
 even
floorscalecols:
 incbin "floorpalscaled"
 ds.w 256*4

 even
PaletteAddr: dc.l 0
ChunkAddr: dc.l 0
;walltiles:
; dc.l GreenMechanicWALL
; dc.l BlueGreyMetalWALL
; dc.l TechnoDetailWALL
; dc.l BlueStoneWALL
; dc.l RedAlertWALL
; dc.l RockWALL
;
;GreenMechanicWALL: incbin "ab3:includes/walls/greenmechanic.wad"
;BlueGreyMetalWALL: incbin "ab3:includes/walls/BlueGreyMetal.wad"
;TechnoDetailWALL: incbin "ab3:includes/walls/TechnoDetail.wad"
;BlueStoneWALL: incbin "ab3:includes/walls/bluestone.wad"
;RedAlertWALL: incbin "ab3:includes/walls/redalert.wad"
;RockWALL: incbin "ab3:includes/walls/rock.wad"
 
floortile:
 dc.l 0
; incbin "floortile" 
 even
wallrouts:
; incbin "2x2WallDraw" 
 CNOP 0,64
BackPicture:
 incbin "backfile"
EndBackPicture:

drawpt: dc.l 0
olddrawpt: dc.l 0
frompt: dc.l 0 
 
SineTable:
 incbin "bigsine"

angpos: dc.w 0
angspd: dc.w 0
flooryoff: dc.w 0
xoff: dc.l 0
yoff: dc.l 0
yvel: dc.l 0
zoff: dc.l 0
tyoff: dc.l 0
xspdval: dc.l 0
zspdval: dc.l 0
Zone: dc.w 0

PLR1: dc.b $ff
 even
PLR1_energy: dc.w 191
PLR1_GunSelected: dc.w 0
PLR1_cosval: dc.w 0
PLR1_sinval: dc.w 0
PLR1_angpos: dc.w 0
PLR1_angspd: dc.w 0
PLR1_xoff: dc.l 0
PLR1_yoff: dc.l 0
PLR1_yvel: dc.l 0
PLR1_zoff: dc.l 0
PLR1_tyoff: dc.l 0
PLR1_xspdval: dc.l 0
PLR1_zspdval: dc.l 0
PLR1_Zone: dc.w 0
PLR1_Roompt: dc.l 0
PLR1_OldRoompt: dc.l 0
PLR1_PointsToRotatePtr: dc.l 0
PLR1_ListOfGraphRooms: dc.l 0
PLR1_oldxoff: dc.l 0
PLR1_oldzoff: dc.l 0
PLR1_StoodInTop: dc.b 0
 even
PLR1_height: dc.l 0

 ds.w 4

PLR1s_cosval: dc.w 0
PLR1s_sinval: dc.w 0
PLR1s_angpos: dc.w 0
PLR1s_angspd: dc.w 0
PLR1s_xoff: dc.l 0
PLR1s_yoff: dc.l 0
PLR1s_yvel: dc.l 0
PLR1s_zoff: dc.l 0
PLR1s_tyoff: dc.l 0
PLR1s_xspdval: dc.l 0
PLR1s_zspdval: dc.l 0
PLR1s_Zone: dc.w 0
PLR1s_Roompt: dc.l 0
PLR1s_OldRoompt: dc.l 0
PLR1s_PointsToRotatePtr: dc.l 0
PLR1s_ListOfGraphRooms: dc.l 0
PLR1s_oldxoff: dc.l 0
PLR1s_oldzoff: dc.l 0
PLR1s_height: dc.l 0
PLR1s_targheight: dc.l 0

p1_xoff: dc.l 0
p1_zoff: dc.l 0
p1_yoff: dc.l 0
p1_height: dc.l 0
p1_angpos: dc.w 0
p1_bobble: dc.w 0
p1_clicked: dc.b 0
p1_spctap: dc.b 0
p1_ducked: dc.b 0
p1_gunselected: dc.b 0
p1_fire: dc.b 0
 even
p1_holddown: dc.w 0

 ds.w 4

PLR2: dc.b $ff
 even
PLR2_GunSelected: dc.w 0
PLR2_energy: dc.w 191
PLR2_cosval: dc.w 0
PLR2_sinval: dc.w 0
PLR2_angpos: dc.w 0
PLR2_angspd: dc.w 0
PLR2_xoff: dc.l 0
PLR2_yoff: dc.l 0
PLR2_yvel: dc.l 0
PLR2_zoff: dc.l 0
PLR2_tyoff: dc.l 0
PLR2_xspdval: dc.l 0
PLR2_zspdval: dc.l 0
PLR2_Zone: dc.w 0
PLR2_Roompt: dc.l 0
PLR2_OldRoompt: dc.l 0
PLR2_PointsToRotatePtr: dc.l 0
PLR2_ListOfGraphRooms: dc.l 0
PLR2_oldxoff: dc.l 0
PLR2_oldzoff: dc.l 0
PLR2_StoodInTop: dc.b 0
 even
PLR2_height: dc.l 0

 ds.w 4

PLR2s_cosval: dc.w 0
PLR2s_sinval: dc.w 0
PLR2s_angpos: dc.w 0
PLR2s_angspd: dc.w 0
PLR2s_xoff: dc.l 0
PLR2s_yoff: dc.l 0
PLR2s_yvel: dc.l 0
PLR2s_zoff: dc.l 0
PLR2s_tyoff: dc.l 0
PLR2s_xspdval: dc.l 0
PLR2s_zspdval: dc.l 0
PLR2s_Zone: dc.w 0
PLR2s_Roompt: dc.l 0
PLR2s_OldRoompt: dc.l 0
PLR2s_PointsToRotatePtr: dc.l 0
PLR2s_ListOfGraphRooms: dc.l 0
PLR2s_oldxoff: dc.l 0
PLR2s_oldzoff: dc.l 0
PLR2s_height: dc.l 0
PLR2s_targheight: dc.l 0

 ds.w 4

p2_xoff: dc.l 0
p2_zoff: dc.l 0
p2_yoff: dc.l 0
p2_height: dc.l 0
p2_angpos: dc.w 0
p2_bobble: dc.w 0
p2_clicked: dc.b 0
p2_spctap: dc.b 0
p2_ducked: dc.b 0
p2_gunselected: dc.b 0
p2_fire: dc.b 0
 even
p2_holddown: dc.w 0


liftanimtab:


endliftanimtab:
 
glassball:
; incbin "glassball.inc"
endglass
glassballpt: dc.l glassball
 
rndtab: ; incbin "randfile"
endrnd: 
 
brightanimtab:
 dcb.w 200,20
 dc.w 5
 dc.w 10,20
 dc.w 5
 dcb.w 30,20
 dc.w 7,10,10,5,10,0,5,6,5,6,5,6,5,6,0
 dcb.w 40,0
 dc.w 1,2,3,2,3,2,3,2,3,2,3,2,3,0
 dcb.w 300,0
 dc.w 1,0,1,0,2,2,2,5,5,5,5,5,5,5,5,5,6,10
 dc.w -1

Roompt: dc.l 0
OldRoompt: dc.l 0

*****************************************************************
 *
 include "AB3:source/LevelData2"
 *
*****************************************************************


wallpt: dc.l 0
floorpt: dc.l 0

Rotated:
 ds.l 2000 
ObjRotated:
 ds.l 2000

OnScreen:
 ds.l 2000 
 
startwait: dc.w 0
endwait: dc.w 0

Faces:; incbin "faces2raw"

*******************************************************************

consttab:
 incbin "constantfile"

*******************************************************************
 
darkentab: incbin "darkenedcols"
brightentab: incbin "brightenfile"
WorkSpace:
 ds.l 8192 
waterfile: incbin "waterfile"

 SECTION ffff,CODE_C

nullspr: dc.l 0
 
 cnop 0,8
borders:
 incbin "leftbord"
 incbin "rightbord"

health: incbin "healthstrip"
Ammunition: incbin "ammostrip"
healthpal: incbin "healthpal"
PanelKeys: incbin "greenkey"
 incbin "redkey"
 incbin "yellowkey"
 incbin "bluekey"

null: ds.w 500
null2: ds.w 500
null3: ds.w 500
null4: ds.w 500


Blurbfield:

 dc.w bpl1ptl
bl1l: dc.w 0
 dc.w bpl1pth
bl1h: dc.w 0

 dc.w diwstart,$2c81
 dc.w diwstop,$1cc1
 dc.w ddfstart,$38
 dc.w ddfstop,$b8
 dc.w bplcon0,$9201
 dc.w bplcon1,0
 dc.w $106,$c40
blcols:
 dc.w col0,0
 dc.w col1,$fff

 dc.w $108,0
 dc.w $10a,0

 dc.w $ffff,$fffe
 dc.w $ffff,$fffe

nullline:
 ds.b 80	

 include "ab3:source/titlecop.s"

bigfield:    
                ; Start of our copper list.

 dc.w dmacon,$8020
 dc.w intreq,$8011
 dc.w $1fc,$f
 dc.w diwstart
winstart: dc.w $2cb1
 dc.w diwstop
winstop: dc.w $2c91
 dc.w ddfstart
fetchstart: dc.w $48
 dc.w ddfstop
fetchstop: dc.w $88

bordercols:
 incbin "borderpal"

 dc.w spr0ptl
s0l:
 dc.w 0
 dc.w spr0pth
s0h:
 dc.w 0
 dc.w spr1ptl
s1l:
 dc.w 0
 dc.w spr1pth
s1h:
 dc.w 0
 dc.w spr2ptl
s2l:
 dc.w 0
 dc.w spr2pth
s2h:
 dc.w 0
 dc.w spr3ptl
s3l:
 dc.w 0
 dc.w spr3pth
s3h:
 dc.w 0
 dc.w spr4ptl
s4l:
 dc.w 0
 dc.w spr4pth
s4h:
 dc.w 0
 dc.w spr5ptl
s5l:
 dc.w 0
 dc.w spr5pth
s5h:
 dc.w 0
 dc.w spr6ptl
s6l:
 dc.w 0
 dc.w spr6pth
s6h:
 dc.w 0
 dc.w spr7ptl
s7l:
 dc.w 0
 dc.w spr7pth
s7h:
 dc.w 0


 dc.w $106,$c42
 incbin "borderpal"

 dc.w $106,$8c42
 dc.w col0
hitcol: dc.w $0
 dc.w $106,$c42
 dc.w col0
hitcol2: dc.w 0

 dc.w bplcon0,$7201
 dc.w bplcon1
smoff:
 dc.w $0

 dc.w $108
modulo: dc.w -24
 dc.w $10a,-24

 dc.w bpl1pth
pl1h
 dc.w 0

 dc.w bpl1ptl
pl1l
 dc.w 0

 dc.w bpl2pth
pl2h
 dc.w 0

 dc.w bpl2ptl
pl2l
 dc.w 0

 dc.w bpl3pth
pl3h
 dc.w 0

 dc.w bpl3ptl
pl3l
 dc.w 0

 dc.w bpl4pth
pl4h
 dc.w 0

 dc.w bpl4ptl
pl4l
 dc.w 0

 dc.w bpl5pth
pl5h
 dc.w 0

 dc.w bpl5ptl
pl5l
 dc.w 0

 dc.w bpl6pth
pl6h
 dc.w 0

 dc.w bpl6ptl
pl6l
 dc.w 0

 dc.w bpl7pth
pl7h
 dc.w 0

 dc.w bpl7ptl
pl7l
 dc.w 0


 dc.w $1001,$ff00
 dc.w intreq,$11
yposcop:
 dc.w $2a11,$fffe
 dc.w $8a,0
 
; ds.l 104*12
 
;colbars:
;val SET $2a
; dcb.l 104*80,$1fe0000
; dc.w $106,$c42
; 
; dc.w $80
;pch1:
; dc.w 0
; dc.w $82
;pcl1:
; dc.w 0 
; 
; dc.w $88,0
; 
; dc.w $ffff,$fffe       ; End copper list.

; ds.l 104*12

;colbars2:
;val SET $2a
; dcb.l 104*80,$1fe0000
; 
; dc.w $106,$c42
; 
; dc.w $80
;pch2:
; dc.w 0
; dc.w $82
;pcl2:
; dc.w 0
; 
; dc.w $88,0
; 
; dc.w $ffff,$fffe       ; End copper list.

; ds.l 104*10

NullCopper:
 dc.w $ffff,$fffe

old: dc.l 0

prot5: dc.w 0
PanelCop:

 dc.w $80
och:
 dc.w 0
 dc.w $82
ocl:
 dc.w 0

statskip:
 dc.w $1fe,0
 dc.w $1fe,0

 dc.w $10c,0
 dc.w bplcon0,$1201
 dc.w bpl1ptl
n1l:
 dc.w 0
 dc.w bpl1pth
n1h:
 dc.w 0
 dc.w $108,-24
 incbin "Panelpal"

 dc.w bpl2pth
p2h
 dc.w 0

 dc.w bpl2ptl
p2l
 dc.w 0

 dc.w bpl3pth
p3h
 dc.w 0

 dc.w bpl3ptl
p3l
 dc.w 0

 dc.w bpl4pth
p4h
 dc.w 0
 dc.w bpl4ptl
p4l
 dc.w 0
 dc.w bpl5pth
p5h
 dc.w 0
 dc.w bpl5ptl
p5l
 dc.w 0
 dc.w bpl6pth
p6h
 dc.w 0
 dc.w bpl6ptl
p6l
 dc.w 0
 dc.w bpl7pth
p7h
 dc.w 0
 dc.w bpl7ptl
p7l
 dc.w 0
 dc.w bpl8pth
p8h
 dc.w 0
 dc.w bpl8ptl
p8l
 dc.w 0
 

 dc.w ddfstart,$38
 dc.w ddfstop,$b8
 dc.w diwstart,$2c81
 dc.w diwstop,$2cc1
 
 dc.w bplcon0
Panelcon: dc.w $0211
 dc.w bpl1pth
p1h
 dc.w 0

 dc.w bpl1ptl
p1l
 dc.w 0


 dc.w $108,40*7
 dc.w $10a,40*7

 dc.w $ffff,$fffe

 dc.w $180,$fff


 dc.w $f801,$ff00
 dc.w col1,$50
 dc.w $f901,$ff00
 dc.w col1,$90
 dc.w $fa01,$ff00
 dc.w col1,$f0
 dc.w $fb01,$ff00
 dc.w col1,$f0
 dc.w $fc01,$ff00
 dc.w col1,$90
 dc.w $fd01,$ff00
 dc.w col1,$50

 dc.w $fe01,$ff00
 dc.w col1,$fff
 
 dc.w $ffdf,$fffe
 dc.w $a01,$ff00
 dc.w bplcon0,$201
 
 incbin "faces2cols"
 dc.w bpl1pth
f1h
 dc.w 0

 dc.w bpl1ptl
f1l
 dc.w 0

 dc.w bpl2pth
f2h
 dc.w 0

 dc.w bpl2ptl
f2l
 dc.w 0

 dc.w bpl3pth
f3h
 dc.w 0

 dc.w bpl3ptl
f3l
 dc.w 0

 dc.w bpl4pth
f4h
 dc.w 0
 dc.w bpl4ptl
f4l
 dc.w 0

 dc.w bpl5pth
f5h
 dc.w 0
 dc.w bpl5ptl
f5l
 dc.w 0
 
 dc.w $0c01,$ff00
 dc.w bplcon0,$5201
  
 dc.w $ffff,$fffe

 cnop 0,64
FacePlace:
; ds.l 6*32*5



********************************************
* Stuff you don't have to worry about yet. *
********************************************

closeeverything:


 jsr mt_end

 move.l #$dff000,a6
 move.l old,$dff080     ; Restore old copper list.
 move.l old,d0
 move.w d0,ocl
 swap d0
 move.w d0,och
 move.w #$8020,dmacon(a6)
 move.w #$f,dmacon(a6)
 move.l saveit,$6c.w
 move.l OLDKINT,$68.w
 move.w saveinters,d0
 or.w #$c000,d0
 move.w d0,intena(a6)
 clr.w $dff0a8
 clr.w $dff0b8
 clr.w $dff0c8
 clr.w $dff0d8

; move.w #3,d0
;nonewvbl
; btst #5,intreqrl(a6)
; beq.s nonewvbl
; move.w #$20,intreq(a6)
; dbra d0,nonewvbl

; move.l oldview,a1
; move.l a1,d0
; move.l gfxbase,a6
; jsr -$de(a6)
 
; cmp.b #'s',mors
; beq.s leaveold
 move.w #$f8e,$dff1dc
;leaveold:
 
 jsr RELEASEWALLMEM
 jsr RELEASESAMPMEM
 jsr RELEASELEVELMEM
 jsr RELEASEFLOORMEM
 jsr RELEASESCRNMEM
 jsr RELEASEOBJMEM
 
 move.l #0,d0
 
 rte

intbase: dc.l 0
gfxbase: dc.l 0
oldview: dc.l 0

stuff:

	Lea	gfxname(pc),a1	
	Moveq.l	#0,d0
	Move.l	$4.w,a6	
	Jsr	-$228(a6)
	Move.l 	d0,gfxbase
	Move.l	d0,a6				Use As Base Reg
	Move.l	34(a6),oldview
	move.l 38(a6),old
	rts

gfxname dc.b "graphics.library",0
 even
INTUNAME	dc.b	"intuition.library",0

 even


 cnop 0,64

Panel:
 incbin "PanelRaw"

TimerScr: 
;ds.b 40*64

scrntab:
 ds.b 16
val SET 32
 REPT 96
 dc.b val,val,val
val SET val+1
 ENDR
 ds.b 16
 
smallscrntab:
val SET 32
 REPT 96
 dc.b val,val
val SET val+1
 ENDR

 cnop 0,64
scrn:

 dcb.l 8,$33333333
 dc.l 0
 dc.l 0
 
 dcb.l 8,$0f0f0f0f
 dc.l 0
 dc.l 0

 dcb.l 8,$00ff00ff
 dc.l 0
 dc.l 0
 
 dcb.l 8,$0000ffff
 dc.l 0
 dc.l 0
 
 dc.l 0,-1,0,-1,0,-1,0,-1
 dc.l 0
 dc.l 0
 
 dc.l -1,-1,0,0,-1,-1,0,0
 dc.l 0
 dc.l 0
 
 dc.l 0,0,-1,-1,-1,-1,-1,-1
 dc.l 0
 dc.l 0
 
NumTimes: dc.l 0
TimeCount: dc.l 0
oldtime: dc.l 0
counting: dc.b 0
oktodisplay: dc.b 0

INITTIMER:
 move.l #0,TimeCount
 move.l #0,NumTimes
 rts
 
STARTCOUNT:
 move.l d0,-(a7)
 move.l $dff004,d0
 and.l #$1ffff,d0
 move.l d0,oldtime
 st counting
 move.l (a7)+,d0
 rts

STOPCOUNT:
 move.l d0,-(a7)
 move.l $dff004,d0
 and.l #$1ffff,d0
 
 sub.l oldtime,d0
 cmp.l #-256,d0
 bge.s okcount
 add.l #313*256,d0
okcount:
 add.l d0,TimeCount
 addq.l #1,NumTimes
 clr.b counting
 move.l (a7)+,d0
 rts

STOPCOUNTNOADD:
 move.l d0,-(a7)
 move.l $dff004,d0
 and.l #$1ffff,d0
 
 sub.l oldtime,d0
 cmp.l #-256,d0
 bge.s okcount2
 add.l #313*256,d0
okcount2:
 add.l d0,TimeCount
 clr.b counting
 move.l (a7)+,d0
 rts

maxbot: dc.w 0
tstneg: dc.l 0

STOPTIMER:
 st oktodisplay
 rts
 
digits: incbin "numbers.inc"

 
 Section Sounds,CODE_C

Scream:
; incbin "ab3:sounds/Scream"
; ds.w 100
EndScream:
LowScream:
; incbin "ab3:sounds/LowScream"
; ds.w 100
EndLowScream:
BaddieGun:
; incbin "ab3:sounds/BaddieGun"
EndBaddieGun:
bass:
; incbin "ab3:sounds/backbass+drum"
bassend:
Shoot:
; incbin "ab3:sounds/fire!"
EndShoot:
Munch:
; incbin "ab3:sounds/munch"
EndMunch:
PooGun:
; incbin "ab3:sounds/shoot.dm"
EndPooGun:
Collect:
; incbin "ab3:sounds/collect"
EndCollect:
DoorNoise:
; incbin "ab3:sounds/newdoor"
EndDoorNoise:
Stomp:
; incbin "ab3:sounds/footstep3"
EndStomp:
SwitchNoise:
; incbin "ab3:sounds/switch"
EndSwitch:
Reload:
; incbin "ab3:sounds/switch1.SFX"
EndReload:
NoAmmo:
; incbin "ab3:sounds/noammo"
EndNoAmmo:
Splotch:
; incbin "ab3:sounds/splotch"
EndSplotch:
SplatPop:
; incbin "ab3:sounds/splatpop"
EndSplatPop:
Boom:
; incbin "ab3:sounds/boom"
EndBoom:
Hiss:
; incbin "ab3:sounds/newhiss"
EndHiss:
Howl1:
; incbin "ab3:sounds/howl1"
EndHowl1:
Howl2:
; incbin "ab3:sounds/howl2"
EndHowl2:
Pant:
; incbin "ab3:sounds/pant"
EndPant:
Whoosh:
; incbin "ab3:sounds/whoosh"
EndWhoosh:
ROAR:
; incbin "ab3:sounds/bigscream"
EndROAR
whoosh:
; incbin "ab3:sounds/flame"
Endwhoosh:
 SECTION music,code_c

UseAllChannels: dc.w 0

mt_init:move.l	mt_data,a0
	move.l	a0,a1
	add.l	#$3b8,a1
	moveq	#$7f,d0
	moveq	#0,d1
mt_loop:move.l	d1,d2
	subq.w	#1,d0
mt_lop2:move.b	(a1)+,d1
	cmp.b	d2,d1
	bgt.s	mt_loop
	dbf	d0,mt_lop2
	addq.b	#1,d2

	lea	mt_samplestarts(pc),a1
	asl.l	#8,d2
	asl.l	#2,d2
	add.l	#$43c,d2
	add.l	a0,d2
	move.l	d2,a2
	moveq	#$1e,d0
mt_lop3:clr.l	(a2)
	move.l	a2,(a1)+
	moveq	#0,d1
	move.w	42(a0),d1
	asl.l	#1,d1
	add.l	d1,a2
	add.l	#$1e,a0
	dbf	d0,mt_lop3

	or.b	#$2,$bfe001
	move.b	#$6,mt_speed
	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	clr.b	mt_songpos
	clr.b	mt_counter
	clr.w	mt_pattpos
	rts

mt_end:	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	move.w	#$f,$dff096
	rts

mt_music:
	movem.l	d0-d4/a0-a3/a5-a6,-(a7)
	move.l	mt_data,a0
	addq.b	#$1,mt_counter
	move.b	mt_counter,D0
	cmp.b	mt_speed,D0
	blt.s	mt_nonew
	clr.b	mt_counter
	bra	mt_getnew

mt_nonew:
	lea	mt_voice1(pc),a6
	lea	$dff0a0,a5
	bsr	mt_checkcom
	lea	mt_voice2(pc),a6
	lea	$dff0b0,a5
	bsr	mt_checkcom
	tst.b UseAllChannels
	beq mt_endr
 	lea	mt_voice3(pc),a6
	lea	$dff0c0,a5
	bsr	mt_checkcom
	lea	mt_voice4(pc),a6
	lea	$dff0d0,a5
	bsr	mt_checkcom
	bra	mt_endr

mt_arpeggio:
	moveq	#0,d0
	move.b	mt_counter,d0
	divs	#$3,d0
	swap	d0
	cmp.w	#$0,d0
	beq.s	mt_arp2
	cmp.w	#$2,d0
	beq.s	mt_arp1

	moveq	#0,d0
	move.b	$3(a6),d0
	lsr.b	#4,d0
	bra.s	mt_arp3
mt_arp1:moveq	#0,d0
	move.b	$3(a6),d0
	and.b	#$f,d0
	bra.s	mt_arp3
mt_arp2:move.w	$10(a6),d2
	bra.s	mt_arp4
mt_arp3:asl.w	#1,d0
	moveq	#0,d1
	move.w	$10(a6),d1
	lea	mt_periods(pc),a0
	moveq	#$24,d7
mt_arploop:
	move.w	(a0,d0.w),d2
	cmp.w	(a0),d1
	bge.s	mt_arp4
	addq.l	#2,a0
	dbf	d7,mt_arploop
	rts
mt_arp4:move.w	d2,$6(a5)
	rts

mt_getnew:
	move.l	mt_data,a0
	move.l	a0,a3
	move.l	a0,a2
	add.l	#$c,a3
	add.l	#$3b8,a2
	add.l	#$43c,a0

	moveq	#0,d0
	move.l	d0,d1
	move.b	mt_songpos,d0
	move.b	(a2,d0.w),d1
	asl.l	#8,d1
	asl.l	#2,d1
	add.w	mt_pattpos,d1
	clr.w	mt_dmacon

	lea	$dff0a0,a5
	lea	mt_voice1(pc),a6
	bsr.s	mt_playvoice
	lea	$dff0b0,a5
	lea	mt_voice2(pc),a6
	bsr.s	mt_playvoice
	tst.b UseAllChannels
	beq mt_setdma
	lea	$dff0c0,a5
	lea	mt_voice3(pc),a6
	bsr.s	mt_playvoice
	lea	$dff0d0,a5
	lea	mt_voice4(pc),a6
	bsr.s	mt_playvoice
	bra	mt_setdma

mt_playvoice:
	move.l	(a0,d1.l),(a6)
	addq.l	#4,d1
	moveq	#0,d2
	move.b	$2(a6),d2
	and.b	#$f0,d2
	lsr.b	#4,d2
	move.b	(a6),d0
	and.b	#$f0,d0
	or.b	d0,d2
	tst.b	d2
	beq.s	mt_setregs
	moveq	#0,d3
	lea	mt_samplestarts(pc),a1
	move.l	d2,d4
	subq.l	#$1,d2
	asl.l	#2,d2
	mulu	#$1e,d4
	move.l	(a1,d2.l),$4(a6)
	move.w	(a3,d4.l),$8(a6)
	move.w	$2(a3,d4.l),$12(a6)
	move.w	$4(a3,d4.l),d3
	tst.w	d3
	beq.s	mt_noloop
	move.l	$4(a6),d2
	asl.w	#1,d3
	add.l	d3,d2
	move.l	d2,$a(a6)
	move.w	$4(a3,d4.l),d0
	add.w	$6(a3,d4.l),d0
	move.w	d0,8(a6)
	move.w	$6(a3,d4.l),$e(a6)
	move.w	$12(a6),d0
	asr.w #2,d0
	move.w d0,$8(a5)
	bra.s	mt_setregs
mt_noloop:
	move.l	$4(a6),d2
	add.l	d3,d2
	move.l	d2,$a(a6)
	move.w	$6(a3,d4.l),$e(a6)
	move.w	$12(a6),d0
	asr.w #2,d0
	move.w d0,$8(a5)
mt_setregs:
	move.w	(a6),d0
	and.w	#$fff,d0
	beq	mt_checkcom2
	move.b	$2(a6),d0
	and.b	#$F,d0
	cmp.b	#$3,d0
	bne.s	mt_setperiod
	bsr	mt_setmyport
	bra	mt_checkcom2
mt_setperiod:
	move.w	(a6),$10(a6)
	and.w	#$fff,$10(a6)
	move.w	$14(a6),d0
	move.w	d0,$dff096
	clr.b	$1b(a6)

	move.l	$4(a6),(a5)
	move.w	$8(a6),$4(a5)
	move.w	$10(a6),d0
	and.w	#$fff,d0
	move.w	d0,$6(a5)
	move.w	$14(a6),d0
	or.w	d0,mt_dmacon
	bra	mt_checkcom2

mt_setdma:
 	move.w #250,d0
mt_wait:
 	add.w #1,testchip
 	dbra d0,mt_wait
	move.w	mt_dmacon,d0
	or.w	#$8000,d0
	and.w #%1111111111110011,d0
	move.w	d0,$dff096
	move.w #250,d0
mt_wait2:
	add.w #1,testchip
	dbra	d0,mt_wait2
	lea	$dff000,a5
	tst.b UseAllChannels
	beq.s noall
	lea	mt_voice4(pc),a6
	move.l	$a(a6),$d0(a5)
	move.w	$e(a6),$d4(a5)
	lea	mt_voice3(pc),a6
	move.l	$a(a6),$c0(a5)
	move.w	$e(a6),$c4(a5)
noall:
	lea	mt_voice2(pc),a6
	move.l	$a(a6),$b0(a5)
	move.w	$e(a6),$b4(a5)
	lea	mt_voice1(pc),a6
	move.l	$a(a6),$a0(a5)
	move.w	$e(a6),$a4(a5)

	add.w	#$10,mt_pattpos
	cmp.w	#$400,mt_pattpos
	bne.s	mt_endr
mt_nex:	clr.w	mt_pattpos
	clr.b	mt_break
	addq.b	#1,mt_songpos
	and.b	#$7f,mt_songpos
	move.b	mt_songpos,d1
;	cmp.b	mt_data+$3b6,d1
;	bne.s	mt_endr
;	move.b	mt_data+$3b7,mt_songpos
mt_endr:tst.b	mt_break
	bne.s	mt_nex
	movem.l	(a7)+,d0-d4/a0-a3/a5-a6
	rts

mt_setmyport:
	move.w	(a6),d2
	and.w	#$fff,d2
	move.w	d2,$18(a6)
	move.w	$10(a6),d0
	clr.b	$16(a6)
	cmp.w	d0,d2
	beq.s	mt_clrport
	bge.s	mt_rt
	move.b	#$1,$16(a6)
	rts
mt_clrport:
	clr.w	$18(a6)
mt_rt:	rts

CODESTORE: dc.l 0

mt_myport:
	move.b	$3(a6),d0
	beq.s	mt_myslide
	move.b	d0,$17(a6)
	clr.b	$3(a6)
mt_myslide:
	tst.w	$18(a6)
	beq.s	mt_rt
	moveq	#0,d0
	move.b	$17(a6),d0
	tst.b	$16(a6)
	bne.s	mt_mysub
	add.w	d0,$10(a6)
	move.w	$18(a6),d0
	cmp.w	$10(a6),d0
	bgt.s	mt_myok
	move.w	$18(a6),$10(a6)
	clr.w	$18(a6)
mt_myok:move.w	$10(a6),$6(a5)
	rts
mt_mysub:
	sub.w	d0,$10(a6)
	move.w	$18(a6),d0
	cmp.w	$10(a6),d0
	blt.s	mt_myok
	move.w	$18(a6),$10(a6)
	clr.w	$18(a6)
	move.w	$10(a6),$6(a5)
	rts

mt_vib:	move.b	$3(a6),d0
	beq.s	mt_vi
	move.b	d0,$1a(a6)

mt_vi:	move.b	$1b(a6),d0
	lea	mt_sin(pc),a4
	lsr.w	#$2,d0
	and.w	#$1f,d0
	moveq	#0,d2
	move.b	(a4,d0.w),d2
	move.b	$1a(a6),d0
	and.w	#$f,d0
	mulu	d0,d2
	lsr.w	#$6,d2
	move.w	$10(a6),d0
	tst.b	$1b(a6)
	bmi.s	mt_vibmin
	add.w	d2,d0
	bra.s	mt_vib2
mt_vibmin:
	sub.w	d2,d0
mt_vib2:move.w	d0,$6(a5)
	move.b	$1a(a6),d0
	lsr.w	#$2,d0
	and.w	#$3c,d0
	add.b	d0,$1b(a6)
	rts

mt_nop:	move.w	$10(a6),$6(a5)
	rts


mt_checkcom:
	move.w	$2(a6),d0
	and.w	#$fff,d0
	beq.s	mt_nop
	move.b	$2(a6),d0
	and.b	#$f,d0
	tst.b	d0
	beq	mt_arpeggio
	cmp.b	#$1,d0
	beq.s	mt_portup
	cmp.b	#$2,d0
	beq	mt_portdown
	cmp.b	#$3,d0
	beq	mt_myport
	cmp.b	#$4,d0
	beq	mt_vib
	move.w	$10(a6),$6(a5)
	cmp.b	#$a,d0
	beq.s	mt_volslide
	rts

mt_volslide:
	moveq	#0,d0
	move.b	$3(a6),d0
	lsr.b	#4,d0
	tst.b	d0
	beq.s	mt_voldown
	add.w	d0,$12(a6)
	cmp.w	#$40,$12(a6)
	bmi.s	mt_vol2
	move.w	#$40,$12(a6)
mt_vol2:move.w	$12(a6),d0
	asr.w #2,d0
	move.w d0,$8(a5)
	rts

mt_voldown:
	moveq	#0,d0
	move.b	$3(a6),d0
	and.b	#$f,d0
	sub.w	d0,$12(a6)
	bpl.s	mt_vol3
	clr.w	$12(a6)
mt_vol3:move.w	$12(a6),d0
	asr.w #2,d0
	move.w d0,$8(a5)
	rts

mt_portup:
	moveq	#0,d0
	move.b	$3(a6),d0
	sub.w	d0,$10(a6)
	move.w	$10(a6),d0
	and.w	#$fff,d0
	cmp.w	#$71,d0
	bpl.s	mt_por2
	and.w	#$f000,$10(a6)
	or.w	#$71,$10(a6)
mt_por2:move.w	$10(a6),d0
	and.w	#$fff,d0
	move.w	d0,$6(a5)
	rts

mt_portdown:
	clr.w	d0
	move.b	$3(a6),d0
	add.w	d0,$10(a6)
	move.w	$10(a6),d0
	and.w	#$fff,d0
	cmp.w	#$358,d0
	bmi.s	mt_por3
	and.w	#$f000,$10(a6)
	or.w	#$358,$10(a6)
mt_por3:move.w	$10(a6),d0
	and.w	#$fff,d0
	move.w	d0,$6(a5)
	rts

mt_checkcom2:
	move.b	$2(a6),d0
	and.b	#$f,d0
	cmp.b	#$e,d0
	beq.s	mt_setfilt
	cmp.b	#$d,d0
	beq.s	mt_pattbreak
	cmp.b	#$b,d0
	beq.s	mt_posjmp
	cmp.b	#$c,d0
	beq.s	mt_setvol
	cmp.b	#$f,d0
	beq.s	mt_setspeed
	rts

mt_setfilt:
	move.b	$3(a6),d0
	and.b	#$1,d0
	asl.b	#$1,d0
	and.b	#$fd,$bfe001
	or.b	d0,$bfe001
	rts
mt_pattbreak:
	not.b	mt_break
	rts
mt_posjmp:
	st reachedend
	move.b	$3(a6),d0
	subq.b	#$1,d0
	move.b	d0,mt_songpos
	not.b	mt_break
	rts
mt_setvol:
	cmp.b	#$40,$3(a6)
	ble.s	mt_vol4
	move.b	#$40,$3(a6)
mt_vol4:move.b	$3(a6),d0
	asr.w #2,d0
	move.w d0,$8(a5)
	rts
mt_setspeed:
	cmp.b	#$1f,$3(a6)
	ble.s	mt_sets
	move.b	#$1f,$3(a6)
mt_sets:move.b	$3(a6),d0
	beq.s	mt_rts2
	move.b	d0,mt_speed
	clr.b	mt_counter
mt_rts2:rts

mt_sin:
 DC.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
 DC.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18

mt_periods:
 DC.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a,$01fc,$01e0
 DC.w $01c5,$01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d,$010d,$00fe
 DC.w $00f0,$00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f,$0087
 DC.w $007f,$0078,$0071,$0000,$0000

reachedend: dc.b 0
mt_speed:	DC.b	6
mt_songpos:	DC.b	0
mt_pattpos:	DC.w	0
mt_counter:	DC.b	0

mt_break:	DC.b	0
mt_dmacon:	DC.w	0
mt_samplestarts:DS.L	$1f
mt_voice1:	DS.w	10
		DC.w	1
		DS.w	3
mt_voice2:	DS.w	10
		DC.w	2
		DS.w	3
mt_voice3:	DS.w	10
		DC.w	4
		DS.w	3
mt_voice4:	DS.w	10
		DC.w	8
		DS.w	3

testchip: dc.w 0

;/* End of File */
mt_data: dc.l 0
tstchip: dc.l 0
 include "SERIAL_NIGHTMARE"


ingame:
; incbin "ab3:includes/ingame"
gameover: incbin "ab3:includes/gameover"
welldone: incbin "ab3:includes/welldone"
