
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	;w
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

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


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

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

*Another version for when d6 <> 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"

* Load level into buffers.
 clr.b doanything
 move.l 4.w,a6
 move.l #doslibname,a1
 moveq #0,d0
 jsr -552(a6)
 move.l d0,doslib

; bra noload

 move.l d0,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 #70000,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 #30000,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:

********

; 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)

 jmp stuff
endstuff:

 move.l #$dff000,a6    ; NB V. IMPORTANT: A6=CUSTOM BASE
 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

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

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

Prefsfile:
 dc.b 'k8nx'
 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
 jsr KInt_Init
 

 
****************************
* Initialize level
****************************
* Poke all clip offsets into
* correct bit of level data.
****************************
 lea.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

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

; bra noclips
  
 lea.l LEVELCLIPS,a2
 moveq #0,d0
 move.w 10(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

 move.l red_des,a0
 move.w (a0),d0
 addq #1,d0
 muls #6,d0
 lea 2(a0,d0.w),a1
 move.l red_des+4,a0
 move.l a1,(a0)
 move.w #0,(a1)

 move.l yellow_des,a0
 move.w (a0),d0
 addq #1,d0
 muls #6,d0
 lea 2(a0,d0.w),a1
 move.l yellow_des+4,a0
 move.l a1,(a0)
 move.w #0,(a1)
 
 move.l green_des,a0
 move.w (a0),d0
 addq #1,d0
 muls #6,d0
 lea 2(a0,d0.w),a1
 move.l green_des+4,a0
 move.l a1,(a0)
 move.w #0,(a1)
 
 move.l blue_des,a0
 move.w (a0),d0
 addq #1,d0
 muls #6,d0
 lea 2(a0,d0.w),a1
; move.l #protinit-750000,a6
 move.l blue_des+4,a0
 move.l a1,(a0)
 move.w #0,(a1)


************************************
 
 cmp.b #'k',Prefsfile
 bne.s nkb
 st PLR1KEYS
 clr.b PLR1PATH
 clr.b PLR1MOUSE
 clr.b PLR1JOY
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 #PanelCop,d0
 move.w d0,pcl1
 move.w d0,pcl2
 swap d0
 move.w d0,pch1
 move.w d0,pch2
 
 move.l #bigfield,d0
 move.w d0,ocl
 swap d0
 move.w d0,och

 bset.b #1,$bfe001

 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

 move.l #healthpal,a5
 move.l #colbars,a0
 move.l #colbars2,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
 
**********************************

 cmp.b #'s',option
 bra.s smallscrn

 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
 
smallscrn: 

 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

**********************************
 cmp.b #'s',option
 bra smallnotlarge
 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 #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

smallnotlarge:

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

****************************
 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.b #1,PLR1_GunDamage
 move.b #1,PLR2_GunDamage
 move.w #3,PLR1_GunNoise
 move.w #3,PLR2_GunNoise
 
 move.w #10,GunData	; 10 shots pistol
 st GunData+7
 clr.b GunData+16+7
 clr.w GunData+16
 move.b #0,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 #bass,pos0LEFT
 move.l #bassend,Samp0endLEFT
 move.l #playerheight,PLR1s_targheight
 move.l #playerheight,PLR1s_height

 move.b #%11011000,$bfd200
 move.b #%00010000,$bfd000
waitloop:
 btst.b #4,$bfd000
 bne.s waitloop
 move.b #%11000000,$bfd200
 
 st doanything
lop: 

 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

; clr.b OKTOPROCEED

;waitfortop:
; btst.b #0,intreqrl(a6)
; beq waitfortop
; move.w #$1,intreq(a6)

 JSR INITREC
 JSR RECEIVE


;waitforok:
; tst.b OKTOPROCEED
; beq.s waitforok

; move.l #Chan0inter,$6c

 move.b SpaceTapped,SPCTAP
 clr.b SpaceTapped

 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.w FramesToDraw,TempFrames
 move.w #0,FramesToDraw

 lea GunData,a6
 moveq #0,d0
 move.b GunSelected,d0
 add.w d0,d0
 lea (a6,d0.w*8),a6
 move.w (a6),Ammo

 JSR INITTIMER

 bsr PLR1_Control


; bsr PLR2_Control


 move.l ObjectData,a5
 move.l ObjectPoints,a1
 move.l #BUFFER+12,a2
 moveq #0,d7
putinobj:
 move.l (a2)+,d0
 cmp.l #$80000000,d0
 beq.s donelastobj
 move.w d7,(a5)
 move.w d0,4(a1)
 swap d0
 move.w d0,(a1)
 addq #8,a1
 move.w (a2)+,4(a5)
 moveq #0,d0
 move.b (a2)+,d0
 move.w d0,12(a5)
 move.b (a2)+,ObjInTop(a5)
 move.w (a2)+,6(a5)
 move.w (a2)+,14(a5)
 move.l (a2)+,8(a5)
 st worry(a5)
 adda.w #64,a5
 addq #1,d7
 bra.s putinobj

donelastobj:
 move.w #-1,(a5)

******************************************
; jsr SLAVEANIM
 bsr EnergyBar
 bsr AmmoBar
 clr.b PLR1_clicked
 clr.b PLR2_clicked
******************************************

 move.l ObjectPoints,a1
 move.l PLR1_Obj,a0
 move.b damagetaken(a0),d2
 beq notbeenshot
 move.w #$f00,hitcol
 move.w #$f00,hitcol2
 ext.w d2
 sub.w d2,Energy
 move.b #0,damagetaken(a0)
 move.l #Cheese,FacesPtr
 move.w #3,Cheese
 move.w #-1,FacesCounter
 
 movem.l d0-d7/a0-a6,-(a7)
 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 Energy+1,numlives(a0)
 
 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.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+128(a0)
 
 move.l PLR1_yoff,d0
 asr.l #7,d0
 move.w d0,4(a0)
 
 move.b PLR1_StoodInTop,ObjInTop+128(a0)
 
 move.w PLR1_sinval,d4
 muls #100,d4
 move.w PLR1_cosval,d5
 muls #100,d5
 
 move.b GunSelected,d0
 asl.b #2,d0
 add.b GunFrame,d0
 move.b d0,11+128(a0)
 
 tst.b GunFrame
 beq.s .noless
 subq.b #1,GunFrame
.noless: 
 
 move.l ObjectPoints,a1
 move.w 128(a0),d0
 move.w 12(a0),12+128(a0)
 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
 add.w #16,d0
 move.w d0,4+128(a0)
 move.w #$2010,6+128(a0)

 

 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.l PLR1_ListOfGraphRooms,ListOfGraphRooms
 move.l PLR1_PointsToRotatePtr,PointsToRotatePtr
 move.l PLR1_Roompt,Roompt

 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 noglass
 
************************************
* Test glass routine:
************************************

 move.l #WorkSpace,a0
 move.l frompt,a2
 move.w #104*4,d3
 move.w #1,d6
ribl
 move.w #31,d0
readinto
 move.w #15,d1
 move.l a2,a1
readintodown
 move.w (a1),(a0)+
 adda.w d3,a1
 move.w (a1),(a0)+
 adda.w d3,a1
 move.w (a1),(a0)+
 adda.w d3,a1
 move.w (a1),(a0)+
 adda.w d3,a1
 dbra d1,readintodown
; add.w #256-128,a0
 addq #4,a2
 dbra d0,readinto
 addq #4,a2
 dbra d6,ribl
 
* We now have the screen in a buffer
* for squidging.

 move.l frompt,a2
 move.l #WorkSpace,a0
 move.l glassballpt,a3
 move.w #$fff,d7
 move.w #1,d6 
rfbl:
 move.w #31,d0
readoutfrom:
 move.w #15,d1
 move.l a2,a1
 moveq.w #0,d5
readoutfromdown:
 move.w (a3)+,d2
 beq.s nono1
; add.w d5,d2
 move.w (a0,d2.w*2),d2
 and.w d7,d2
 move.w d2,(a1)
nono1:
 addq #1,d5
 add.w d3,a1
 move.w (a3)+,d2
 beq.s nono2
; add.w d5,d2
 move.w (a0,d2.w*2),d2
 and.w d7,d2
 move.w d2,(a1)
nono2:
 addq #1,d5
 add.w d3,a1
 move.w (a3)+,d2
 beq.s nono3
; add.w d5,d2
 move.w (a0,d2.w*2),d2
 and.w d7,d2
 move.w d2,(a1)
nono3:
 addq #1,d5
 add.w d3,a1
 move.w (a3)+,d2
 beq.s nono4
; add.w d5,d2
 move.w (a0,d2.w*2),d2
 and.w d7,d2
 move.w d2,(a1)
nono4:
 addq #1,d5
 add.w d3,a1
 dbra d1,readoutfromdown
 addq #4,a2
; adda.w #128,a0
 dbra d0,readoutfrom
 addq #4,a2
 dbra d6,rfbl
 
 move.l glassballpt,d0
 add.l #64*64*2,d0
 cmp.l #endglass,d0
 blt notoffglass
 move.l #glassball,d0
notoffglass
 move.l d0,glassballpt
 
noglass:
 

; 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 Energy
; bgt .noend
; cmp.b #'i',option+4
; bne end
; move.w #10,Energy
;.noend:

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

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

 include "SERIAL_NIGHTMARE"

GunSelected: dc.b 0
 even
 


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 1,3
 dc.b 20
 dc.b -1
 dc.b 1,$ff
 dc.w 5,0,0,0
 
 dc.w 0
 dc.b 1,1
 dc.b 40
 dc.b 0
 dc.b 4,0
 dc.w 10,0,0,0

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

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
 
 even

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 PLR1s_xoff,d0
; move.l d0,PLR1_xoff
; move.l d0,newx
; move.l PLR1s_zoff,d1
; move.l d1,newz
; move.l d1,PLR1_zoff

 move.w BUFFER,PLR1_xoff
 move.w BUFFER+2,PLR1_zoff
 move.l BUFFER+4,PLR1_yoff
 move.b BUFFER+8,PLR1_StoodInTop
 moveq #0,d0
 move.b BUFFER+9,d0
 move.l ZoneAdds,a0
 move.l (a0,d0.w*4),a0
 add.l #LEVELDATA,a0
 move.l a0,PLR1_Roompt
 move.w BUFFER+10,d0
 move.w d0,PLR1_angpos
 move.l #SineTable,a2
 move.w (a2,d0.w),PLR1_sinval
 lea 2048(a2),a2
 move.w (a2,d0.w),PLR1_cosval

 move.l PLR1s_height,PLR1_height
 
; sub.l d2,d0
; sub.l d3,d1
; move.l d0,xdiff
; move.l d1,zdiff
; move.w PLR1s_sinval,PLR1_sinval
; move.w PLR1s_cosval,PLR1_cosval
; move.w PLR1s_angpos,PLR1_angpos
; move.l PLR1s_yoff,d0
; move.l #SineTable,a1
; move.w 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 #5,d1
; move.w d1,d2
; add.w d1,d1
; add.w d2,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
; move.l #$1000000,StepDownVal
 
; move.l PLR1_Roompt,objroom
; move.w #%100000000,wallflags
; move.b PLR1_StoodInTop,StoodInTop

; bsr MoveObject
; move.b StoodInTop,PLR1_StoodInTop
; move.w #0,wallflags
; 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
 
 move.l PLR1_Roompt,a0
 
 move.l ToZoneFloor(a0),d0
 tst.b PLR1_StoodInTop
 beq.s notintop
 move.l ToUpperFloor(a0),d0
notintop:

 move.l ToZoneRoof(a0),SplitHeight

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

; 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:
 move.l a0,PLR1_ListOfGraphRooms

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

 rts

KeyMap: ds.b 256

PLR2_Control:
 move.l #SineTable,a0

 bsr turnleftright

 move.w PLR2_angspd,d1
 move.w PLR2_angpos,d0
 move.w (a0,d0.w),PLR2_sinval
 adda.w #2048,a0
 move.w (a0,d0.w),PLR2_cosval

 move.l PLR2_xspdval,d6
 move.l PLR2_zspdval,d7

 move.w PLR2_xoff,oldxoff
 move.w PLR2_zoff,oldzoff

 neg.l d6
 ble.s .nobug1
 asr.l #1,d6
 add.l #1,d6
 bra.s .bug1
.nobug1
 asr.l #1,d6
.bug1:

; beq.s goinnowhere
; blt.s goinfor
; cmp.l #4*65536,d6
; ble.s goinnowhere
; move.l #4*65536,d6
;goinfor:
; cmp.l #-4*65536,d6
; bge.s goinnowhere
; move.l #-4*65536,d6
;goinnowhere:

 neg.l d7
 ble.s .nobug2
 asr.l #1,d7
 add.l #1,d7
 bra.s .bug2
.nobug2
 asr.l #1,d7
.bug2: 
 
; beq.s goinnowhere2
; blt.s goinfor2
; cmp.l #4*65536,d7
; ble.s goinnowhere2
; move.l #4*65536,d7
;goinfor2:
; cmp.l #-4*65536,d7
; bge.s goinnowhere2
; move.l #-4*65536,d7
;goinnowhere2:

 move.w PLR2_sinval,d1
 move.w PLR2_cosval,d2
 move.w PLR2_ForwardSpd,d3
 
 muls d3,d2
 muls d3,d1

 sub.l d1,d6
 sub.l d2,d7
 add.l PLR2_pushx,d6
 add.l PLR2_pushz,d7 
 add.l d6,PLR2_xspdval
 add.l d7,PLR2_zspdval
 move.l PLR2_xspdval,d6
 move.l PLR2_zspdval,d7
 add.l d6,PLR2_xoff
 add.l d7,PLR2_zoff

 move.w PLR2_xoff,newx
 move.w PLR2_zoff,newz
 move.w oldxoff,oldx
 move.w oldzoff,oldz
 move.l PLR2_xspdval,xdiff
 move.l PLR2_zspdval,zdiff
 move.l PLR2_Roompt,objroom
 move.w #%100000000,wallflags
 bsr MoveObject
 move.w #0,wallflags
 move.l objroom,PLR2_Roompt
 move.w newx,PLR2_xoff
 move.w newz,PLR2_zoff
 
 move.l PLR2_xoff,d0
 move.l PLR2_zoff,d1
 sub.l oldxoff,d0
 sub.l oldzoff,d1
 move.l #0,PLR2_pushx
 move.l #0,PLR2_pushz
 move.l d0,PLR2_opushx
 move.l d1,PLR2_opushz

 move.l PLR2_Roompt,a0
 move.l 2(a0),d0
 sub.l #playerheight,d0
 move.l d0,PLR2_tyoff
 adda.w #22,a0

; move.l (a0),a0		; jump to viewpoint list
 * A0 is pointing at a pointer to list of points to rotate
 move.l (a0)+,PLR2_PointsToRotatePtr
 move.l a0,PLR2_ListOfGraphRooms

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

 move.l PLR2_tyoff,d0
 move.l PLR2_yoff,d1
 move.l PLR2_yvel,d2
 add.l d2,d1
 add.l #1024,d2
 sub.l d1,d0
 bgt.s .shouldfall
 move.l #0,d2
 add.l d0,d1
.shouldfall:
 move.l d2,PLR2_yvel
 move.l d1,PLR2_yoff
 rts


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
 and.w #63,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 OrderZones

 move.l ListOfGraphRooms,a0

 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 PLR1_yoff,d0
 cmp.l SplitHeight,d0
 blt.s botfirst
 
 move.l ThisRoomToDraw+4,a0
 cmp.l #LEVELGRAPHICS,a0
 beq.s noupperroom
 st DOUPPER
 bsr dothisroom
noupperroom:
 move.l ThisRoomToDraw,a0
 clr.b DOUPPER
 bsr dothisroom
 
 bra dontbothercantseeit
botfirst:

 move.l ThisRoomToDraw,a0
 clr.b DOUPPER
 bsr dothisroom
 move.l ThisRoomToDraw+4,a0
 cmp.l #LEVELGRAPHICS,a0
 beq.s noupperroom2
 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
 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
 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:
 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

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
 move.l #ObsInLine,a2
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
 tst.w d1
 ble.s notinline


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

 add.w #64,a4
 dbra d7,objpointrotlop

 rts
 
noworkout:
  clr.b (a2)+
  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(pc),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(pc),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(pc),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(pc),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

turnleftright:

 move.w PLR2_angspd,d1
 move.w PLR2_angpos,d0

 move.w #120,d7
 muls TempFrames,d7

 move.w d1,d2
 neg.w d2
 cmp.w d7,d2
 ble.s okslow
 move.w d7,d2
okslow
 neg.w d7
 cmp.w d7,d2
 bge.s okslo
 move.w d7,d2
okslo:

 asr.w #1,d7

 btst #1,$d(a6)
 sne d3
 beq.s notleft
 move.w d7,d2
 neg.w d2
; tst.w d1
; bge.s notleft
; moveq #0,d1
notleft

 btst #1,$c(a6)
 sne d4
 beq.s notright
 move.w d7,d2
; tst.w d1
; ble.s notright
; moveq #0,d1
notright

 move.w #0,PLR2_ForwardSpd

 btst #0,$dff00c
 sne d5
 eor.b d4,d5
 beq.s notup
 move.w TempFrames,d7
 neg.w d7
 asl.w #2,d7
 move.w d7,PLR2_ForwardSpd
notup:

 btst #0,$dff00d
 sne d5
 eor.b d3,d5
 beq.s notdown
 move.w TempFrames,d7
 asl.w #2,d7
 move.w d7,PLR2_ForwardSpd
notdown:

 add.w d2,d1
 cmp.w #-360,d1
 bge.s okspdlft
 move.w #-360,d1
okspdlft:
 cmp.w #360,d1
 ble.s okspdrgt
 move.w #360,d1
okspdrgt:

 move.w d1,PLR2_angspd
 add.w d1,d0
 and.w #8191,d0
 move.w d0,PLR2_angpos
 rts

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

 include "ab3:source/ObjectMove"

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

 
liftpt: dc.l liftanimtab

brightpt:
 dc.l brightanimtab


liftanim:
 rts

******************************
 include "ab3:source/SlaveAnims"
******************************
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:

 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

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
 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
 asl.w #8,d7
 move.w d6,sxoff
 move.w 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 80
rightsidetab:
 ds.w 80
leftsideclip:
 ds.w 80
rightsideclip:
 ds.w 80

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 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
 
 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)+,leftedge
 move.w d2,rightedge

 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


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 #6,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 #6,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 #6,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.w 0
szoff: dc.w 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
 
 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 leftedge(pc),d6
 beq.s nomultleft
 
 move.l d1,d3
 asr.l #6,d3
 muls d6,d3
 asl.l #6,d3
 swap d3
 add.b d3,d5

 move.l d2,d3
 asr.l #6,d3
 muls d6,d3
 asl.l #6,d3
 swap d3
 lsl.w #8,d3
 add.w d3,d5
 
nomultleft:

 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 tstwat

allinsecstrip
 sub.w a2,d3
 move.w d3,d7
 move.w #0,d4
 bra tstwat
 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 tstwat
 rts

allinthirdstrip
 sub.w a2,d3
 move.w d3,d7
 move.w #0,d4
 bra tstwat
 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 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
 
 include "ab3:source/bumpmap.s"

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

 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
 
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
startsmoothx: dc.w 0
startsmoothz: dc.w 0

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

numframes:
 dc.w 0

alframe: dc.l Objects+4096
 
alan:
 dcb.l 4,0
 dcb.l 4,1
 dcb.l 4,2
 dcb.l 4,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

 
PLR1_mouse_control
 jsr ReadMouse
 jsr PLR1_alwayskeys
 move.l #SineTable,a0
 move.w PLR1s_angspd,d1
 move.w PLR1s_angpos,d0
 and.w #8190,d0
 move.w (a0,d0.w),PLR1s_sinval
 adda.w #2048,a0
 move.w (a0,d0.w),PLR1s_cosval

 move.l PLR1s_xspdval,d6
 move.l PLR1s_zspdval,d7

 neg.l d6
 ble.s .nobug1
 asr.l #1,d6
 add.l #1,d6
 bra.s .bug1
.nobug1
 asr.l #1,d6
.bug1:

 neg.l d7
 ble.s .nobug2
 asr.l #1,d7
 add.l #1,d7
 bra.s .bug2
.nobug2
 asr.l #1,d7
.bug2: 

 
 move.w ymouse,d3
 sub.w oldymouse,d3
 add.w d3,oldymouse
 asr.w #1,d3
 cmp.w #50,d3
 ble.s nofastfor
 move.w #50,d3
nofastfor:
 cmp.w #-50,d3
 bge.s nofastback
 move.w #-50,d3
nofastback:

 tst.b Ducked
 beq.s .nohalve
 asr.w #1,d3
.nohalve

 move.w d3,d2
 asl.w #3,d2
 move.w d2,d1
 add.w d2,d1
 add.w d2,d1
 add.w Bobble,d1
 and.w #8190,d1
 move.w d1,Bobble

 move.w PLR1s_sinval,d1
 move.w PLR1s_cosval,d2
 
 move.w d2,d4
 move.w d1,d5
 muls lrs,d4
 muls lrs,d5
 

 muls d3,d2
 muls d3,d1
 sub.l d4,d1
 add.l d5,d2

 sub.l d1,d6
 sub.l d2,d7
 add.l d6,PLR1s_xspdval
 add.l d7,PLR1s_zspdval
 move.l PLR1s_xspdval,d6
 move.l PLR1s_zspdval,d7
 add.l d6,PLR1s_xoff
 add.l d7,PLR1s_zoff

 tst.b PLR1_fire
 beq.s .firenotpressed
; fire was pressed last time.
 btst #6,$bfe001
 bne.s .firenownotpressed
; fire is still pressed this time.
 st PLR1_fire
 bra .doneplr1
 
.firenownotpressed:
; fire has been released.
 clr.b PLR1_fire
 bra .doneplr1
 
.firenotpressed

; fire was not pressed last frame...

 btst #6,$bfe001
; if it has still not been pressed, go back above
 bne.s .firenownotpressed
; fire was not pressed last time, and was this time, so has
; been clicked.
 st PLR1_clicked
 st PLR1_fire

.doneplr1:
 move.l PLR1s_tyoff,d0
 move.l PLR1s_yoff,d1
 move.l PLR1s_yvel,d2
 sub.l d1,d0
 bgt.s .aboveground
 sub.l #1024,d2
 blt.s .notfast
 sub.l #2048,d2
.notfast:
 add.l d2,d1
 sub.l d2,d0
 blt.s .pastitall
 move.l #0,d2
 add.l d0,d1
 bra.s .pastitall

.aboveground:
 add.l d2,d1
 add.l #1024,d2
.pastitall:

 move.l d2,PLR1s_yvel
 move.l d1,PLR1s_yoff
 
 rts

PLR1_follow_path:

 move.l pathpt,a0
 move.w (a0),d1
 move.w d1,PLR1s_xoff
 move.w 2(a0),d1
 move.w d1,PLR1s_zoff
 move.w 4(a0),d0
 add.w d0,d0
 and.w #8190,d0
 move.w d0,PLR1_angpos

 move.w TempFrames,d0
 asl.w #3,d0
 adda.w d0,a0
 
 cmp.l #endpath,a0
 blt notrestartpath
 move.l #Path,a0
notrestartpath:
 move.l a0,pathpt

 rts
 
OldSpace: dc.b 0
SpaceTapped: dc.b 0
SPCTAP: dc.b 0
Ducked: dc.b 0
 even

PLR1_alwayskeys
 move.l #KeyMap,a5
 move.b $40(a5),d1
 beq.s nottapped
 tst.b OldSpace
 bne.s nottapped
 st SpaceTapped
nottapped:
 move.b d1,OldSpace

 tst.b $22(a5)
 beq.s notduck
 clr.b $22(a5)
 move.l #playerheight,PLR1s_targheight
 not.b Ducked
 beq.s notduck
 move.l #playercrouched,PLR1s_targheight
notduck:

 move.l PLR1_Roompt,a4
 move.l ToZoneFloor(a4),d0
 sub.l ToZoneRoof(a4),d0
 tst.b PLR1_StoodInTop
 beq.s usebottom
 move.l ToUpperFloor(a4),d0
 sub.l ToUpperRoof(a4),d0
usebottom:

 cmp.l #playerheight+3*1024,d0
 bgt.s oktostand
 st Ducked
 move.l #playercrouched,PLR1s_targheight
oktostand:

 move.l PLR1s_height,d0
 move.l PLR1s_targheight,d1
 cmp.l d1,d0
 beq.s noupordown
 bgt.s crouch
 add.l #1024,d0
 bra noupordown
crouch:
 sub.l #1024,d0
noupordown:
 move.l d0,PLR1s_height

 tst.b $27(a5)
 beq.s notselkey
 st PLR1KEYS
 clr.b PLR1PATH
 clr.b PLR1MOUSE
 clr.b PLR1JOY
notselkey:

 tst.b $26(a5)
 beq.s notseljoy
 clr.b PLR1KEYS
 clr.b PLR1PATH
 clr.b PLR1MOUSE
 st PLR1JOY
notseljoy:

 tst.b $37(a5)
 beq.s notselmouse
 clr.b PLR1KEYS
 clr.b PLR1PATH
 st PLR1MOUSE
 clr.b PLR1JOY
notselmouse:

 lea 1(a5),a4
 lea GunData,a3
 moveq #0,d0
 move.w #4,d1
pickweap
 tst.b (a4)+
 beq.s notgotweap
 tst.b 7(a3)
 beq.s notgotweap
 move.b d0,GunSelected
notgotweap
 addq #1,d0
 adda.w #16,a3
 dbra d1,pickweap

 rts

PLR1_keyboard_control:

 move.l #SineTable,a0
 
 jsr PLR1_alwayskeys
 move.l #KeyMap,a5

 move.w PLR1s_angpos,d0
 move.w #70,d1
 move.w #7,d2
 tst.b $61(a5)
 beq.s nofaster
 move.w #120,d1
 move.w #10,d2
nofaster:
 tst.b Ducked
 beq.s .nohalve
 asr.w #1,d2
.nohalve

 moveq #0,d4 
; tst.b $67(a5)
; bne.s slidelr
 
 tst.b $4f(a5)
 beq.s noleftturn
 sub.w d1,d0
noleftturn
 move.l #KeyMap,a5
 tst.b $4e(a5)
 beq.s norightturn
 add.w d1,d0
norightturn
; bra.s noslide

slidelr:
 tst.b $39(a5)
 beq.s noleftslide
 move.w d2,d4
 asr.w #1,d4
noleftslide
 move.l #KeyMap,a5
 tst.b $3a(a5)
 beq.s norightslide
 sub.w d2,d4
 asr.w #1,d4
norightslide
  
noslide:
  
 and.w #8191,d0
 move.w d0,PLR1s_angpos
 
 move.w (a0,d0.w),PLR1s_sinval
 adda.w #2048,a0
 move.w (a0,d0.w),PLR1s_cosval

 move.l PLR1s_xspdval,d6
 move.l PLR1s_zspdval,d7

 neg.l d6
 ble.s .nobug1
 asr.l #1,d6
 add.l #1,d6
 bra.s .bug1
.nobug1
 asr.l #1,d6
.bug1:

 neg.l d7
 ble.s .nobug2
 asr.l #1,d7
 add.l #1,d7
 bra.s .bug2
.nobug2
 asr.l #1,d7
.bug2: 

 moveq #0,d3
 
 tst.b $4c(a5)
 beq.s noforward
 neg.w d2
 move.w d2,d3
 
noforward:
 tst.b $4d(a5)
 beq.s nobackward
 move.w d2,d3
nobackward:
 
 move.w d3,d2
 asl.w #3,d2
 move.w d2,d1
 add.w d2,d1
 add.w d2,d1
 add.w Bobble,d1
 and.w #8190,d1
 move.w d1,Bobble
 
 move.w PLR1s_sinval,d1
 muls d3,d1
 move.w PLR1s_cosval,d2
 muls d3,d2

 sub.l d1,d6
 sub.l d2,d7
 move.w PLR1s_sinval,d1
 muls d4,d1
 move.w PLR1s_cosval,d2
 muls d4,d2
 sub.l d2,d6
 add.l d1,d7
 
 add.l d6,PLR1s_xspdval
 add.l d7,PLR1s_zspdval
 move.l PLR1s_xspdval,d6
 move.l PLR1s_zspdval,d7
 add.l d6,PLR1s_xoff
 add.l d7,PLR1s_zoff
 
 tst.b PLR1_fire
 beq.s .firenotpressed
; fire was pressed last time.
 tst.b $65(a5)
 beq.s .firenownotpressed
; fire is still pressed this time.
 st PLR1_fire
 bra .doneplr1
 
.firenownotpressed:
; fire has been released.
 clr.b PLR1_fire
 bra .doneplr1
 
.firenotpressed

; fire was not pressed last frame...

 tst.b $65(a5)
; if it has still not been pressed, go back above
 beq.s .firenownotpressed
; fire was not pressed last time, and was this time, so has
; been clicked.
 st PLR1_clicked
 st PLR1_fire

.doneplr1:

 move.l PLR1s_tyoff,d0
 move.l PLR1s_yoff,d1
 move.l PLR1s_yvel,d2
 sub.l d1,d0
 bgt.s .aboveground
 sub.l #512,d2
 blt.s .notfast
 move.l #0,d2
.notfast:
 add.l d2,d1
 sub.l d2,d0
 blt.s .pastitall
 move.l #0,d2
 add.l d0,d1
 bra.s .pastitall

.aboveground:
 add.l d2,d1
 add.l #1024,d2
.pastitall:

 move.l d2,PLR1s_yvel
 move.l d1,PLR1s_yoff

 rts
passspace:
 ds.l 400 

PLR1_JoyStick_control:

 move.l #KeyMap,a5
 move.l #SineTable,a0

 btst #1,$dff00c
 sne d0
 btst #1,$dff00d
 sne d1
 btst #0,$dff00c
 sne d2
 btst #0,$dff00d
 sne d3
 btst #7,$bfe001
 seq $65(a5)

 move.b d0,$4f(a5)
 move.b d1,$4e(a5)
 eor.b d0,d2
 move.b d2,$4c(a5)
 eor.b d1,d3
 move.b d3,$4d(a5)
 
 jsr PLR1_alwayskeys

 move.w PLR1s_angpos,d0
 move.w #70,d1
 move.w #7,d2
 tst.b $61(a5)
 beq.s .nofaster
 move.w #120,d1
 move.w #10,d2
.nofaster:

 tst.b Ducked
 beq.s .nohalve
 asr.w #1,d2
.nohalve:

 moveq #0,d4 
; tst.b $67(a5)
; bne.s slidelr
 
 tst.b $4f(a5)
 beq.s .noleftturn
 sub.w d1,d0
.noleftturn
 move.l #KeyMap,a5
 tst.b $4e(a5)
 beq.s .norightturn
 add.w d1,d0
.norightturn
; bra.s noslide

.slidelr:
 tst.b $39(a5)
 beq.s .noleftslide
 move.w d2,d4
 asr.w #1,d4
.noleftslide
 move.l #KeyMap,a5
 tst.b $3a(a5)
 beq.s .norightslide
 sub.w d2,d4
 asr.w #1,d4
.norightslide
  
.noslide:
  
 and.w #8191,d0
 move.w d0,PLR1s_angpos
 
 move.w (a0,d0.w),PLR1s_sinval
 adda.w #2048,a0
 move.w (a0,d0.w),PLR1s_cosval

 move.l PLR1s_xspdval,d6
 move.l PLR1s_zspdval,d7

 neg.l d6
 ble.s .nobug1
 asr.l #1,d6
 add.l #1,d6
 bra.s .bug1
.nobug1
 asr.l #1,d6
.bug1:

 neg.l d7
 ble.s .nobug2
 asr.l #1,d7
 add.l #1,d7
 bra.s .bug2
.nobug2
 asr.l #1,d7
.bug2: 

 moveq #0,d3
 
 tst.b $4c(a5)
 beq.s .noforward
 neg.w d2
 move.w d2,d3
.noforward:
 tst.b $4d(a5)
 beq.s .nobackward
 move.w d2,d3
.nobackward:
 
 move.w d3,d2
 asl.w #3,d2
 move.w d2,d1
 add.w d2,d1
 add.w d2,d1
 add.w Bobble,d1
 and.w #8190,d1
 move.w d1,Bobble
 
 move.w PLR1s_sinval,d1
 muls d3,d1
 move.w PLR1s_cosval,d2
 muls d3,d2

 sub.l d1,d6
 sub.l d2,d7
 move.w PLR1s_sinval,d1
 muls d4,d1
 move.w PLR1s_cosval,d2
 muls d4,d2
 sub.l d2,d6
 add.l d1,d7
 
 add.l d6,PLR1s_xspdval
 add.l d7,PLR1s_zspdval
 move.l PLR1s_xspdval,d6
 move.l PLR1s_zspdval,d7
 add.l d6,PLR1s_xoff
 add.l d7,PLR1s_zoff
 
 tst.b PLR1_fire
 beq.s .firenotpressed
; fire was pressed last time.
 tst.b $65(a5)
 beq.s .firenownotpressed
; fire is still pressed this time.
 st PLR1_fire
 bra .doneplr1
 
.firenownotpressed:
; fire has been released.
 clr.b PLR1_fire
 bra .doneplr1
 
.firenotpressed

; fire was not pressed last frame...

 tst.b $65(a5)
; if it has still not been pressed, go back above
 beq.s .firenownotpressed
; fire was not pressed last time, and was this time, so has
; been clicked.
 st PLR1_clicked
 st PLR1_fire

.doneplr1:

 move.l PLR1s_tyoff,d0
 move.l PLR1s_yoff,d1
 move.l PLR1s_yvel,d2
 sub.l d1,d0
 bgt.s .aboveground
 sub.l #512,d2
 blt.s .notfast
 move.l #0,d2
.notfast:
 add.l d2,d1
 sub.l d2,d0
 blt.s .pastitall
 move.l #0,d2
 add.l d0,d1
 bra.s .pastitall

.aboveground:
 add.l d2,d1
 add.l #1024,d2
.pastitall:

 move.l d2,PLR1s_yvel
 move.l d1,PLR1s_yoff

 rts

prot7: dc.w 0
OKTOPROCEED: dc.w 0

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

 rte


Chan0inter:

 move.w #$0010,$dff000+intreq

 tst.b doanything
 bne.s dosomething
 rte
 
dosomething:


 addq.w #1,FramesToDraw
 tst.b counting
 beq nostopcounter
 JSR STOPCOUNTNOADD
nostopcounter:
 movem.l d0-d7/a0-a6,-(a7)
 
; tst.b OKTOPROCEED
; bne.s justhandshake
; jsr INITSEND
; moveq #-1,d0
; JSR SENDLAST
; move.l #OtherInter,$6c 
; st OKTOPROCEED
; bra.s doneshake

;justhandshake:
; jsr INITSEND
; moveq #0,d0
; JSR SENDLAST
doneshake:
 
 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.w Robotanimpos,d0
 add.w #6*38,d0
 cmp.w #6*38*64,d0
 blt.s norebot
 move.w #0,d0
norebot:
 move.w d0,Robotanimpos
 
 tst.w d0
 seq d1
 cmp.w #6*32*38,d0
 seq d2
 or.b d2,d1
 or.b d1,clump
 
 move.w Robotarmpos,d0
 add.w #6*14,d0
 cmp.w #6*14*64,d0
 blt.s norebot2
 move.w #0,d0
norebot2:
 move.w d0,Robotarmpos
 
 move.l alanptr,a0
 move.l (a0)+,alframe
 cmp.l #endalan,a0
 blt.s nostartalan
 move.l #alan,a0
nostartalan:
 move.l a0,alanptr
 
 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 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: 
 
; 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
 tst.b counting
 beq .nostartcounter
 JSR STARTCOUNT
.nostartcounter:
noneed:
 
 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 #bass,a0
 move.l #bassend,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 #bass,$a0(a6)
 move.w #18370/2,$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
 asr.w #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.w #0,RIGHTCHANDATA+2
 st RIGHTCHANDATA+1
 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
 asr.w #1,d0
 move.w d0,$b4(a6)
 move.l d1,$b0(a6)
 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.w #0,RIGHTCHANDATA+2+4
 st RIGHTCHANDATA+1+4
 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
 asr.w #1,d0
 move.w d0,$c4(a6)
 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.w #0,LEFTCHANDATA+2+4
 st LEFTCHANDATA+1+4
 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
 asr.w #1,d0
 move.w d0,$d4(a6)
 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

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

 rte
 
backbeat: 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 $FF000000
 dc.l $00000000
 dc.l $00000000
 dc.l $00000000
RIGHTCHANDATA:
 dc.l $00000000
 dc.l $00000000
 dc.l $00000000
 dc.l $00000000
 
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

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"
 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:
 incbin "floortile" 
 even
wallrouts:
; incbin "2x2WallDraw" 
 CNOP 0,64
BackPicture:
 incbin "backfile"
EndBackPicture:

drawpt: dc.l colbars2
olddrawpt: dc.l colbars
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_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

 ds.w 4

PLR2: dc.b $0
 even
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_ForwardSpd: 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 800 
ObjRotated:
 ds.l 800

OnScreen:
 ds.l 800 
 
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

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

old: dc.l 0

prot5: dc.w 0
PanelCop:

 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 $80
och:
 dc.w 0
 dc.w $82
ocl:
 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 #'t',option+1
; bra.s leaveold
; move.w #$f8e,$dff1dc
;leaveold:
 
 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

 jmp endstuff

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

 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

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

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