
 	section base,code		; Put into chip memory
 	opt 	c-,o+,l-		; No case sensitivity, Optimize on
                                        ; No link please!

        incdir  "include:"
	include	"exec/funcdef.i"
        include "exec/exec_lib.i"
        include "exec/exec.i"

        bra	.gr

	dc.b	"Hello and Welcome! Keep on looking at this code, it's"
	dc.b    " quite fun!"

        dc.b    "As there is no scroll, here are the credits: "
	dc.b    "All programming (what programming???) by Jolyon Ralph "
	dc.b    "Music will vary, so no credits I'm afraid... "
	dc.b    "Graphics by our favourite editor, Jeff Walker "
        dc.b	"Buy JAM Now! It's much more fun than any other "
	dc.b    "Amiga magazine. "



	even

.gr	move.l 	4.w,a6			; Get execbase
	jsr 	-132(a6)		; Turn off multitasking

 	lea 	gfxlib,a1
 	moveq 	#0,d0
 	jsr 	-$228(a6) 		; Open Graphics library
 	tst 	d0
 	beq 	error
 	move.l  D0,gfxbse

 	move.l  #gfx,d0			; Store screen address in
 	move.w  d0,pl0l			; Copper list
 	swap    d0
 	move.w  d0,pl0h
        swap    d0
        add.l   #planesize,d0           ; point to next bitplane
        move.w  d0,pl1l
        swap    d0
        move.w  d0,pl1h

        move.l  #sprite0,d0
        move.w  d0,sp0l
        swap    d0
        move.w  d0,sp0h

        move.l  #sprite1,d0
        move.w  d0,sp1l
        swap    d0
        move.w  d0,sp1h


        move.l  #sprite2,d0
        move.w  d0,sp2l
        swap    d0
        move.w  d0,sp2h

        move.l  #sprite3,d0
        move.w  d0,sp3l
        swap    d0
        move.w  d0,sp3h


        move.l  #sprite4,d0
        move.w  d0,sp4l
        swap    d0
        move.w  d0,sp4h

        move.l  #sprite5,d0
        move.w  d0,sp5l
        swap    d0
        move.w  d0,sp5h


        move.l  #sprite6,d0
        move.w  d0,sp6l
        swap    d0
        move.w  d0,sp6h

        move.l  #sprite7,d0
        move.w  d0,sp7l
        swap    d0
        move.w  d0,sp7h

	bra.s .sk

	dc.b "Well, that's all the setup out of the way, let's "
	dc.b "call the Protracker MT_INIT routine.... "

	even

.sk        jsr     mt_init



 	move.l  gfxbse,a6		; Set up copper list
 	add.l	#$32,a6
 	move.w  #$80,$dff096
 	move.l  (a6),oldcpr		; store wb copperlist
 	move.l  #newcpr,(a6)		; use our copperlist
 	move.w  #$8080,$dff096
 	move.w  #$8010,$dff09a		; enable lev 3 int.
 	move.l  $6c.w,old		; store old lev 3
 	move.l  #new,$6c.w		; use our int.

* All we have to do now in our main program is wait for the
* mousebutton to exit. All the interesting stuff is done by the
* interrupt we set up.

WAIT:	btst	#6,$bfe001		; Test for left mousebutton
 	bne.s 	wait			; wait if not pressed

 	move.l  old,$6c.w		; Return to workbench
	move.l  #$10,$dff09a		; Disable copper int.
 	move.l  gfxbse,a6		; copper list
 	add.l	#$32,a6
 	move.w	#$0080,$dff096
 	move.l  oldcpr,(a6)
 	move.w  #$8080,$dff096

	move.l	gfxbse,a1		; Close graphics library
	move.l  $4.w,a6
	jsr 	-$19e(a6)

	move.l 	4.w,a6			; execbase
	jsr	-138(a6)		; Permit() - Restart multitasking

        jsr     mt_end

error: 	moveq 	#0,d0			; exit routine
 	rts

	dc.b	"That was the end of the main routine, here's the "
	dc.b    "Interrupt routine. By the way, you *should* use "
	dc.b    "AddIntServer to set up your interrupt routines, but "
        dc.b    "I'm lazy. Do what I say, not what I do!"
        even

new: 	movem.l d0-d7/a0-a6,-(sp)	; save all registers
 	and.w 	#$10,$dff01e        	; check if it is copper int.
	beq.s 	out			; if not, skip this code
 	move.w 	#$10,$dff09c




        jsr    mt_music

        bsr   spritefrig

out:	movem.l (sp)+,d0-d7/a0-a6	; restore registers

	move.l 	old,-(sp)		; put old address on stack
	rts				; safe exit for '020


        dc.b "Sorry this intro is rather crap, but I wrote it in "
	dc.b "an evening and had absolutely no part in the design. "
	dc.b "It's only meant to be a moving picture really... "
        even


spritefrig:

        moveq   #0,d0
        move.b  mt_eq1,d0
        beq.s .z1
	sub.b	#1,mt_eq1
.z1      bsr     calcsprite
        move.b  d0,sprite0
        move.b  d0,sprite1

        move.b  mt_eq2,d0
	beq.s	.z2
	sub.b	#1,mt_eq2
.z2     bsr     calcsprite
        move.b  d0,sprite2
        move.b  d0,sprite3

        move.b  mt_eq3,d0
   	beq.s	.z3
	sub.b	#1,mt_eq3
.z3	bsr	calcsprite
        move.b  d0,sprite4
        move.b  d0,sprite5

        move.b  mt_eq4,d0
        beq.s	.z4
        sub.b	#1,mt_eq4
.z4	bsr	calcsprite
	move.b	d0,sprite6
	move.b	d0,sprite7


        rts


	dc.b "Wow. this is a good bit!"
	even
calcsprite
        move.l   d0,d1
        lsl.b   #2,d1
        add.b   d0,d1
        move.b  #$f2,d0
        sub.b   d1,d0
        rts


        section protrack,code_c



n_cmd			EQU	2  ; W
n_cmdlo			EQU	3  ; low B of n_cmd
n_start			EQU	4  ; L
n_length		EQU	8  ; W
n_loopstart		EQU	10 ; L
n_replen		EQU	14 ; W
n_period		EQU	16 ; W
n_finetune		EQU	18 ; B
n_volume		EQU	19 ; B
n_dmabit		EQU	20 ; W
n_toneportdirec	        EQU	22 ; B
n_toneportspeed	        EQU	23 ; B
n_wantedperiod	        EQU	24 ; W
n_vibratocmd	        EQU	26 ; B
n_vibratopos	        EQU	27 ; B
n_tremolocmd	        EQU	28 ; B
n_tremolopos	        EQU	29 ; B
n_wavecontrol	        EQU	30 ; B
n_glissfunk		EQU	31 ; B
n_sampleoffset	        EQU	32 ; B
n_pattpos		EQU	33 ; B
n_loopcount		EQU	34 ; B
n_funkoffset	        EQU	35 ; B
n_wavestart		EQU	36 ; L
n_reallength	        EQU	40 ; W

mt_init	LEA	mt_data,a0
	MOVE.L	A0,mt_SongDataPtr
	LEA	mt_mulu(PC),A1
	MOVE.L	A0,D0
	ADDQ.L	#8,D0
	ADDQ.L	#4,D0
	MOVEQ	#$1F,D1
	MOVEQ	#$1E,D3
mt_lop4	MOVE.L	D0,(A1)+
	ADD.L	D3,D0
	DBRA	D1,mt_lop4
	LEA	$3B8(A0),A1
	MOVEQ	#127,D0
	MOVEQ	#0,D1
	MOVEQ	#0,D2
mt_lop2 MOVE.B	(A1)+,D1
	CMP.B	D2,D1
	BLE.S	mt_lop
	MOVE.L	D1,D2
mt_lop	DBRA	D0,mt_lop2
	ADDQ.W	#1,d2
	ASL.L	#8,D2
	ASL.L	#2,D2
	LEA	4(A1,D2.L),A2
	LEA	mt_samplestarts(PC),A1
	ADD.W	#$2A,A0
	MOVEQ	#$1E,D0
mt_lop3 CLR.L	(A2)
	MOVE.L	A2,(A1)+
	MOVEQ	#0,D1
	MOVE.B	D1,2(A0)
	MOVE.W	(A0),D1
	ASL.L	#1,D1
	ADD.L	D1,A2
	ADD.L	D3,A0
	DBRA	D0,mt_lop3
	LEA	mt_speed(PC),A1
	MOVE.B	#6,(A1)
	OR.B	#2,$BFE001
	MOVEQ	#0,D0
	LEA	$DFF000,A0
	MOVE.W	D0,$A8(A0)
	MOVE.W	D0,$B8(A0)
	MOVE.W	D0,$C8(A0)
	MOVE.W	D0,$D8(A0)
	MOVE.B	D0,mt_songpos-mt_speed(A1)
	MOVE.B	D0,mt_counter-mt_speed(A1)
	MOVE.W	D0,mt_pattpos-mt_speed(A1)
	RTS

	dc.b 	"Another section, someone elses code. This is "
	dc.b    "Protracker replay routine, slightly changed by me. "
	even

mt_end	MOVEQ	#0,D0
	LEA	$DFF000,A0
	MOVE.W	D0,$A8(A0)
	MOVE.W	D0,$B8(A0)
	MOVE.W	D0,$C8(A0)
	MOVE.W	D0,$D8(A0)
	MOVE.W	#$F,$DFF096
	RTS

mt_music
	ADDQ.B	#1,mt_counter
	MOVE.B	mt_counter(PC),D0
	CMP.B	mt_speed(PC),D0
	BLO.S	mt_NoNewNote
	CLR.B	mt_counter
	TST.B	mt_PattDelTime2
	BEQ.S	mt_GetNewNote
	BSR.S	mt_NoNewAllChannels
	BRA	mt_dskip

mt_NoNewNote
	BSR.S	mt_NoNewAllChannels
	BRA	mt_NoNewPosYet

mt_NoNewAllChannels
	LEA	$DFF0A0,A5
	LEA	mt_chan1temp(PC),A6
	BSR	mt_CheckEfx
	LEA	$DFF0B0,A5
	LEA	mt_chan2temp(PC),A6
	BSR	mt_CheckEfx
	LEA	$DFF0C0,A5
	LEA	mt_chan3temp(PC),A6
	BSR	mt_CheckEfx
	LEA	$DFF0D0,A5
	LEA	mt_chan4temp(PC),A6
	BRA	mt_CheckEfx

mt_GetNewNote
	MOVE.L	mt_SongDataPtr(PC),A0
	LEA	12(A0),A3
	LEA	952(A0),A2	;pattpo
	LEA	1084(A0),A0	;patterndata
	MOVEQ	#0,D0
	MOVEQ	#0,D1
	MOVE.B	mt_SongPos(PC),D0
	MOVE.B	(A2,D0.W),D1
	ASL.L	#8,D1
	ASL.L	#2,D1
	ADD.W	mt_PattPos(PC),D1
	CLR.W	mt_DMACONtemp

	LEA	$DFF0A0,A5
	move.l	#mt_eq1,mt_frig
	LEA	mt_chan1temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	$DFF0B0,A5
	move.l	#mt_eq2,mt_frig
	LEA	mt_chan2temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	$DFF0C0,A5
	move.l	#mt_eq3,mt_frig
	LEA	mt_chan3temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	$DFF0D0,A5
	move.l	#mt_eq4,mt_frig
	LEA	mt_chan4temp(PC),A6
	BSR.S	mt_PlayVoice
	BRA	mt_SetDMA

mt_PlayVoice
	TST.L	(A6)
	BNE.S	mt_plvskip



	MOVE.W	n_period(A6),6(A5)
mt_plvskip



	MOVE.L	(A0,D1.L),(A6)
	ADDQ.L	#4,D1
	MOVEQ	#0,D2
	MOVE.B	n_cmd(A6),D2
	LSR.B	#4,D2
	MOVE.B	(A6),D0
	AND.B	#$F0,D0
	OR.B	D0,D2
	BEQ	mt_SetRegs



        move.l  a0,-(sp)
	move.l	mt_frig,a0
	move.b	#16,(a0)
	move.l (sp)+,a0


	MOVEQ	#0,D3
	LEA	mt_SampleStarts(PC),A1
	MOVE	D2,D4
	SUBQ.L	#1,D2
	ASL.L	#2,D2
	MULU	#30,D4
	MOVE.L	(A1,D2.L),n_start(A6)
	MOVE.W	(A3,D4.L),n_length(A6)
	MOVE.W	(A3,D4.L),n_reallength(A6)
	MOVE.B	2(A3,D4.L),n_finetune(A6)
	MOVE.B	3(A3,D4.L),n_volume(A6)
	MOVE.W	4(A3,D4.L),D3 ; Get repeat
	TST.W	D3
	BEQ.S	mt_NoLoop
	MOVE.L	n_start(A6),D2	; Get start
	ASL.W	#1,D3
	ADD.L	D3,D2		; Add repeat
	MOVE.L	D2,n_loopstart(A6)
	MOVE.L	D2,n_wavestart(A6)
	MOVE.W	4(A3,D4.L),D0	; Get repeat
	ADD.W	6(A3,D4.L),D0	; Add replen
	MOVE.W	D0,n_length(A6)
	MOVE.W	6(A3,D4.L),n_replen(A6)	; Save replen
	MOVEQ	#0,D0
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,8(A5)	; Set volume
	BRA.S	mt_SetRegs

mt_NoLoop
	MOVE.L	n_start(A6),D2
	ADD.L	D3,D2
	MOVE.L	D2,n_loopstart(A6)
	MOVE.L	D2,n_wavestart(A6)
	MOVE.W	6(A3,D4.L),n_replen(A6)	; Save replen
	MOVEQ	#0,D0
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,8(A5)	; Set volume



mt_SetRegs



	MOVE.W	(A6),D0
	AND.W	#$0FFF,D0
	BEQ	mt_CheckMoreEfx	; If no note
	MOVE.W	2(A6),D0
	AND.W	#$0FF0,D0
	CMP.W	#$0E50,D0
	BEQ.S	mt_DoSetFineTune
	MOVE.B	2(A6),D0
	AND.B	#$0F,D0
	CMP.B	#3,D0	; TonePortamento
	BEQ.S	mt_ChkTonePorta
	CMP.B	#5,D0
	BEQ.S	mt_ChkTonePorta
	CMP.B	#9,D0	; Sample Offset
	BNE.S	mt_SetPeriod
	BSR	mt_CheckMoreEfx
	BRA.S	mt_SetPeriod

mt_DoSetFineTune
	BSR	mt_SetFineTune
	BRA.S	mt_SetPeriod

mt_ChkTonePorta
	BSR	mt_SetTonePorta
	BRA	mt_CheckMoreEfx

mt_SetPeriod
	MOVEM.L	D0-D1/A0-A1,-(SP)
	MOVE.W	(A6),D1
	AND.W	#$0FFF,D1
	LEA	mt_PeriodTable(PC),A1
	MOVEQ	#0,D0
	MOVEQ	#36,D7
mt_ftuloop
	CMP.W	(A1,D0.W),D1
	BHS.S	mt_ftufound
	ADDQ.L	#2,D0
	DBRA	D7,mt_ftuloop
mt_ftufound
	MOVEQ	#0,D1
	MOVE.B	n_finetune(A6),D1
	MULU	#36*2,D1
	ADD.L	D1,A1
	MOVE.W	(A1,D0.W),n_period(A6)
	MOVEM.L	(SP)+,D0-D1/A0-A1

	MOVE.W	2(A6),D0
	AND.W	#$0FF0,D0
	CMP.W	#$0ED0,D0 ; Notedelay
	BEQ	mt_CheckMoreEfx

	MOVE.W	n_dmabit(A6),$DFF096
	BTST	#2,n_wavecontrol(A6)
	BNE.S	mt_vibnoc
	CLR.B	n_vibratopos(A6)
mt_vibnoc
	BTST	#6,n_wavecontrol(A6)
	BNE.S	mt_trenoc
	CLR.B	n_tremolopos(A6)
mt_trenoc
	MOVE.L	n_start(A6),(A5)	; Set start
	MOVE.W	n_length(A6),4(A5)	; Set length
	MOVE.W	n_period(A6),D0
	MOVE.W	D0,6(A5)		; Set period
	MOVE.W	n_dmabit(A6),D0
	OR.W	D0,mt_DMACONtemp
	BRA	mt_CheckMoreEfx

mt_SetDMA

    bsr mt_nicerwait

	MOVE.W	mt_DMACONtemp(PC),D0
	OR.W	#$8000,D0
	MOVE.W	D0,$DFF096

    bsr mt_nicerwait

	LEA	$DFF000,A5


	LEA	mt_chan4temp(PC),A6
	MOVE.L	n_loopstart(A6),$D0(A5)
	MOVE.W	n_replen(A6),$D4(A5)
	LEA	mt_chan3temp(PC),A6
	MOVE.L	n_loopstart(A6),$C0(A5)
	MOVE.W	n_replen(A6),$C4(A5)
	LEA	mt_chan2temp(PC),A6
	MOVE.L	n_loopstart(A6),$B0(A5)
	MOVE.W	n_replen(A6),$B4(A5)
	LEA	mt_chan1temp(PC),A6
	MOVE.L	n_loopstart(A6),$A0(A5)
	MOVE.W	n_replen(A6),$A4(A5)

mt_dskip
	ADD.W	#16,mt_PattPos
	MOVE.B	mt_PattDelTime,D0
	BEQ.S	mt_dskc
	MOVE.B	D0,mt_PattDelTime2
	CLR.B	mt_PattDelTime
mt_dskc	TST.B	mt_PattDelTime2
	BEQ.S	mt_dska
	SUBQ.B	#1,mt_PattDelTime2
	BEQ.S	mt_dska
	SUB.W	#16,mt_PattPos
mt_dska	TST.B	mt_PBreakFlag
	BEQ.S	mt_nnpysk
	SF	mt_PBreakFlag
	MOVEQ	#0,D0
	MOVE.B	mt_PBreakPos(PC),D0
	CLR.B	mt_PBreakPos
	LSL.W	#4,D0
	MOVE.W	D0,mt_PattPos
mt_nnpysk
	CMP.W	#1024,mt_PattPos
	BLO.S	mt_NoNewPosYet
mt_NextPosition
	MOVEQ	#0,D0
	MOVE.B	mt_PBreakPos(PC),D0
	LSL.W	#4,D0
	MOVE.W	D0,mt_PattPos
	CLR.B	mt_PBreakPos
	CLR.B	mt_PosJumpFlag
	ADDQ.B	#1,mt_SongPos
	AND.B	#$7F,mt_SongPos
	MOVE.B	mt_SongPos(PC),D1
	MOVE.L	mt_SongDataPtr(PC),A0
	CMP.B	950(A0),D1
	BLO.S	mt_NoNewPosYet
	CLR.B	mt_SongPos
mt_NoNewPosYet
	TST.B	mt_PosJumpFlag
	BNE.S	mt_NextPosition
	RTS

mt_NicerWait
    MOVEQ	#4,d3
mt_wai2
    MOVE.B	$dff006,d2
mt_wai3
    CMP.B	$dff006,d2
	BEQ.S	mt_wai3
	DBF     d3,mt_wai2
	MOVEQ   #8,d2
mt_wai4
    DBF	    d2,mt_wai4
rts



mt_CheckEfx
	BSR	mt_UpdateFunk
	MOVE.W	n_cmd(A6),D0
	AND.W	#$0FFF,D0
	BEQ.S	mt_PerNop
	MOVE.B	n_cmd(A6),D0
	AND.B	#$0F,D0
	BEQ.S	mt_Arpeggio
	CMP.B	#1,D0
	BEQ	mt_PortaUp
	CMP.B	#2,D0
	BEQ	mt_PortaDown
	CMP.B	#3,D0
	BEQ	mt_TonePortamento
	CMP.B	#4,D0
	BEQ	mt_Vibrato
	CMP.B	#5,D0
	BEQ	mt_TonePlusVolSlide
	CMP.B	#6,D0
	BEQ	mt_VibratoPlusVolSlide
	CMP.B	#$E,D0
	BEQ	mt_E_Commands
SetBack	MOVE.W	n_period(A6),6(A5)
	CMP.B	#7,D0
	BEQ	mt_Tremolo
	CMP.B	#$A,D0
	BEQ	mt_VolumeSlide
mt_Return2
	RTS

mt_PerNop
	MOVE.W	n_period(A6),6(A5)
	RTS

mt_Arpeggio
	MOVEQ	#0,D0
	MOVE.B	mt_counter(PC),D0
	DIVS	#3,D0
	SWAP	D0
	CMP.W	#0,D0
	BEQ.S	mt_Arpeggio2
	CMP.W	#2,D0
	BEQ.S	mt_Arpeggio1
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	LSR.B	#4,D0
	BRA.S	mt_Arpeggio3

mt_Arpeggio1
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#15,D0
	BRA.S	mt_Arpeggio3

mt_Arpeggio2
	MOVE.W	n_period(A6),D2
	BRA.S	mt_Arpeggio4

mt_Arpeggio3
	ASL.W	#1,D0
	MOVEQ	#0,D1
	MOVE.B	n_finetune(A6),D1
	MULU	#36*2,D1
	LEA	mt_PeriodTable(PC),A0
	ADD.L	D1,A0
	MOVEQ	#0,D1
	MOVE.W	n_period(A6),D1
	MOVEQ	#36,D7
mt_arploop
	MOVE.W	(A0,D0.W),D2
	CMP.W	(A0),D1
	BHS.S	mt_Arpeggio4
	ADDQ.L	#2,A0
	DBRA	D7,mt_arploop
	RTS

mt_Arpeggio4
	MOVE.W	D2,6(A5)
	RTS

mt_FinePortaUp
	TST.B	mt_counter
	BNE.S	mt_Return2
	MOVE.B	#$0F,mt_LowMask
mt_PortaUp
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	mt_LowMask(PC),D0
	MOVE.B	#$FF,mt_LowMask
	SUB.W	D0,n_period(A6)
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	CMP.W	#113,D0
	BPL.S	mt_PortaUskip
	AND.W	#$F000,n_period(A6)
	OR.W	#113,n_period(A6)
mt_PortaUskip
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	MOVE.W	D0,6(A5)
	RTS
 
mt_FinePortaDown
	TST.B	mt_counter
	BNE	mt_Return2
	MOVE.B	#$0F,mt_LowMask
mt_PortaDown
	CLR.W	D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	mt_LowMask(PC),D0
	MOVE.B	#$FF,mt_LowMask
	ADD.W	D0,n_period(A6)
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	CMP.W	#856,D0
	BMI.S	mt_PortaDskip
	AND.W	#$F000,n_period(A6)
	OR.W	#856,n_period(A6)
mt_PortaDskip
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	MOVE.W	D0,6(A5)
	RTS

mt_SetTonePorta
	MOVE.L	A0,-(SP)
	MOVE.W	(A6),D2
	AND.W	#$0FFF,D2
	MOVEQ	#0,D0
	MOVE.B	n_finetune(A6),D0
	MULU	#37*2,D0
	LEA	mt_PeriodTable(PC),A0
	ADD.L	D0,A0
	MOVEQ	#0,D0
mt_StpLoop
	CMP.W	(A0,D0.W),D2
	BHS.S	mt_StpFound
	ADDQ.W	#2,D0
	CMP.W	#37*2,D0
	BLO.S	mt_StpLoop
	MOVEQ	#35*2,D0
mt_StpFound
	MOVE.B	n_finetune(A6),D2
	AND.B	#8,D2
	BEQ.S	mt_StpGoss
	TST.W	D0
	BEQ.S	mt_StpGoss
	SUBQ.W	#2,D0
mt_StpGoss
	MOVE.W	(A0,D0.W),D2
	MOVE.L	(SP)+,A0
	MOVE.W	D2,n_wantedperiod(A6)
	MOVE.W	n_period(A6),D0
	CLR.B	n_toneportdirec(A6)
	CMP.W	D0,D2
	BEQ.S	mt_ClearTonePorta
	BGE	mt_Return2
	MOVE.B	#1,n_toneportdirec(A6)
	RTS

mt_ClearTonePorta
	CLR.W	n_wantedperiod(A6)
	RTS

mt_TonePortamento
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_TonePortNoChange
	MOVE.B	D0,n_toneportspeed(A6)
	CLR.B	n_cmdlo(A6)
mt_TonePortNoChange
	TST.W	n_wantedperiod(A6)
	BEQ	mt_Return2
	MOVEQ	#0,D0
	MOVE.B	n_toneportspeed(A6),D0
	TST.B	n_toneportdirec(A6)
	BNE.S	mt_TonePortaUp
mt_TonePortaDown
	ADD.W	D0,n_period(A6)
	MOVE.W	n_wantedperiod(A6),D0
	CMP.W	n_period(A6),D0
	BGT.S	mt_TonePortaSetPer
	MOVE.W	n_wantedperiod(A6),n_period(A6)
	CLR.W	n_wantedperiod(A6)
	BRA.S	mt_TonePortaSetPer

mt_TonePortaUp
	SUB.W	D0,n_period(A6)
	MOVE.W	n_wantedperiod(A6),D0
	CMP.W	n_period(A6),D0
	BLT.S	mt_TonePortaSetPer
	MOVE.W	n_wantedperiod(A6),n_period(A6)
	CLR.W	n_wantedperiod(A6)

mt_TonePortaSetPer
	MOVE.W	n_period(A6),D2
	MOVE.B	n_glissfunk(A6),D0
	AND.B	#$0F,D0
	BEQ.S	mt_GlissSkip
	MOVEQ	#0,D0
	MOVE.B	n_finetune(A6),D0
	MULU	#36*2,D0
	LEA	mt_PeriodTable(PC),A0
	ADD.L	D0,A0
	MOVEQ	#0,D0
mt_GlissLoop
	CMP.W	(A0,D0.W),D2
	BHS.S	mt_GlissFound
	ADDQ.W	#2,D0
	CMP.W	#36*2,D0
	BLO.S	mt_GlissLoop
	MOVEQ	#35*2,D0
mt_GlissFound
	MOVE.W	(A0,D0.W),D2
mt_GlissSkip
	MOVE.W	D2,6(A5) ; Set period
	RTS

mt_Vibrato
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_Vibrato2
	MOVE.B	n_vibratocmd(A6),D2
	AND.B	#$0F,D0
	BEQ.S	mt_vibskip
	AND.B	#$F0,D2
	OR.B	D0,D2
mt_vibskip
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F0,D0
	BEQ.S	mt_vibskip2
	AND.B	#$0F,D2
	OR.B	D0,D2
mt_vibskip2
	MOVE.B	D2,n_vibratocmd(A6)
mt_Vibrato2
	MOVE.B	n_vibratopos(A6),D0
	LEA	mt_VibratoTable(PC),A4
	LSR.W	#2,D0
	AND.W	#$001F,D0
	MOVEQ	#0,D2
	MOVE.B	n_wavecontrol(A6),D2
	AND.B	#$03,D2
	BEQ.S	mt_vib_sine
	LSL.B	#3,D0
	CMP.B	#1,D2
	BEQ.S	mt_vib_rampdown
	MOVE.B	#255,D2
	BRA.S	mt_vib_set
mt_vib_rampdown
	TST.B	n_vibratopos(A6)
	BPL.S	mt_vib_rampdown2
	MOVE.B	#255,D2
	SUB.B	D0,D2
	BRA.S	mt_vib_set
mt_vib_rampdown2
	MOVE.B	D0,D2
	BRA.S	mt_vib_set
mt_vib_sine
	MOVE.B	0(A4,D0.W),D2
mt_vib_set
	MOVE.B	n_vibratocmd(A6),D0
	AND.W	#15,D0
	MULU	D0,D2
	LSR.W	#7,D2
	MOVE.W	n_period(A6),D0
	TST.B	n_vibratopos(A6)
	BMI.S	mt_VibratoNeg
	ADD.W	D2,D0
	BRA.S	mt_Vibrato3
mt_VibratoNeg
	SUB.W	D2,D0
mt_Vibrato3
	MOVE.W	D0,6(A5)
	MOVE.B	n_vibratocmd(A6),D0
	LSR.W	#2,D0
	AND.W	#$003C,D0
	ADD.B	D0,n_vibratopos(A6)
	RTS

mt_TonePlusVolSlide
	BSR	mt_TonePortNoChange
	BRA	mt_VolumeSlide

mt_VibratoPlusVolSlide
	BSR.S	mt_Vibrato2
	BRA	mt_VolumeSlide

mt_Tremolo
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_Tremolo2
	MOVE.B	n_tremolocmd(A6),D2
	AND.B	#$0F,D0
	BEQ.S	mt_treskip
	AND.B	#$F0,D2
	OR.B	D0,D2
mt_treskip
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F0,D0
	BEQ.S	mt_treskip2
	AND.B	#$0F,D2
	OR.B	D0,D2
mt_treskip2
	MOVE.B	D2,n_tremolocmd(A6)
mt_Tremolo2
	MOVE.B	n_tremolopos(A6),D0
	LEA	mt_VibratoTable(PC),A4
	LSR.W	#2,D0
	AND.W	#$001F,D0
	MOVEQ	#0,D2
	MOVE.B	n_wavecontrol(A6),D2
	LSR.B	#4,D2
	AND.B	#$03,D2
	BEQ.S	mt_tre_sine
	LSL.B	#3,D0
	CMP.B	#1,D2
	BEQ.S	mt_tre_rampdown
	MOVE.B	#255,D2
	BRA.S	mt_tre_set
mt_tre_rampdown
	TST.B	n_vibratopos(A6)
	BPL.S	mt_tre_rampdown2
	MOVE.B	#255,D2
	SUB.B	D0,D2
	BRA.S	mt_tre_set
mt_tre_rampdown2
	MOVE.B	D0,D2
	BRA.S	mt_tre_set
mt_tre_sine
	MOVE.B	0(A4,D0.W),D2
mt_tre_set
	MOVE.B	n_tremolocmd(A6),D0
	AND.W	#15,D0
	MULU	D0,D2
	LSR.W	#6,D2
	MOVEQ	#0,D0
	MOVE.B	n_volume(A6),D0
	TST.B	n_tremolopos(A6)
	BMI.S	mt_TremoloNeg
	ADD.W	D2,D0
	BRA.S	mt_Tremolo3
mt_TremoloNeg
	SUB.W	D2,D0
mt_Tremolo3
	BPL.S	mt_TremoloSkip
	CLR.W	D0
mt_TremoloSkip
	CMP.W	#$40,D0
	BLS.S	mt_TremoloOk
	MOVE.W	#$40,D0
mt_TremoloOk
	MOVE.W	D0,8(A5)
	MOVE.B	n_tremolocmd(A6),D0
	LSR.W	#2,D0
	AND.W	#$003C,D0
	ADD.B	D0,n_tremolopos(A6)
	RTS

mt_SampleOffset
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_sononew
	MOVE.B	D0,n_sampleoffset(A6)
mt_sononew
	MOVE.B	n_sampleoffset(A6),D0
	LSL.W	#7,D0
	CMP.W	n_length(A6),D0
	BGE.S	mt_sofskip
	SUB.W	D0,n_length(A6)
	LSL.W	#1,D0
	ADD.L	D0,n_start(A6)
	RTS
mt_sofskip
	MOVE.W	#$0001,n_length(A6)
	RTS

mt_VolumeSlide
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	LSR.B	#4,D0
	TST.B	D0
	BEQ.S	mt_VolSlideDown
mt_VolSlideUp
	ADD.B	D0,n_volume(A6)
	CMP.B	#$40,n_volume(A6)
	BMI.S	mt_vsuskip
	MOVE.B	#$40,n_volume(A6)
mt_vsuskip
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,8(A5)
	RTS

mt_VolSlideDown
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
mt_VolSlideDown2
	SUB.B	D0,n_volume(A6)
	BPL.S	mt_vsdskip
	CLR.B	n_volume(A6)
mt_vsdskip
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,8(A5)
	RTS

mt_PositionJump
	MOVE.B	n_cmdlo(A6),D0
	SUBQ.B	#1,D0
	MOVE.B	D0,mt_SongPos
mt_pj2	CLR.B	mt_PBreakPos
	ST 	mt_PosJumpFlag
	RTS

mt_VolumeChange
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	CMP.B	#$40,D0
	BLS.S	mt_VolumeOk
	MOVEQ	#$40,D0
mt_VolumeOk
	MOVE.B	D0,n_volume(A6)
	MOVE.W	D0,8(A5)
	RTS

mt_PatternBreak
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	MOVE.L	D0,D2
	LSR.B	#4,D0
	MULU	#10,D0
	AND.B	#$0F,D2
	ADD.B	D2,D0
	CMP.B	#63,D0
	BHI.S	mt_pj2
	MOVE.B	D0,mt_PBreakPos
	ST	mt_PosJumpFlag
	RTS

mt_SetSpeed
	MOVE.B	3(A6),D0
	BEQ	mt_Return2
	CLR.B	mt_counter
	MOVE.B	D0,mt_speed
	RTS

mt_CheckMoreEfx
	BSR	mt_UpdateFunk
	MOVE.B	2(A6),D0
	AND.B	#$0F,D0
	CMP.B	#$9,D0
	BEQ	mt_SampleOffset
	CMP.B	#$B,D0
	BEQ	mt_PositionJump
	CMP.B	#$D,D0
	BEQ.S	mt_PatternBreak
	CMP.B	#$E,D0
	BEQ.S	mt_E_Commands
	CMP.B	#$F,D0
	BEQ.S	mt_SetSpeed
	CMP.B	#$C,D0
	BEQ	mt_VolumeChange
	RTS	

mt_E_Commands
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F0,D0
	LSR.B	#4,D0
	BEQ.S	mt_FilterOnOff
	CMP.B	#1,D0
	BEQ	mt_FinePortaUp
	CMP.B	#2,D0
	BEQ	mt_FinePortaDown
	CMP.B	#3,D0
	BEQ.S	mt_SetGlissControl
	CMP.B	#4,D0
	BEQ	mt_SetVibratoControl
	CMP.B	#5,D0
	BEQ	mt_SetFineTune
	CMP.B	#6,D0
	BEQ	mt_JumpLoop
	CMP.B	#7,D0
	BEQ	mt_SetTremoloControl
	CMP.B	#9,D0
	BEQ	mt_RetrigNote
	CMP.B	#$A,D0
	BEQ	mt_VolumeFineUp
	CMP.B	#$B,D0
	BEQ	mt_VolumeFineDown
	CMP.B	#$C,D0
	BEQ	mt_NoteCut
	CMP.B	#$D,D0
	BEQ	mt_NoteDelay
	CMP.B	#$E,D0
	BEQ	mt_PatternDelay
	CMP.B	#$F,D0
	BEQ	mt_FunkIt
	RTS

mt_FilterOnOff
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#1,D0
	ASL.B	#1,D0
	AND.B	#$FD,$BFE001
	OR.B	D0,$BFE001
	RTS	

mt_SetGlissControl
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	AND.B	#$F0,n_glissfunk(A6)
	OR.B	D0,n_glissfunk(A6)
	RTS

mt_SetVibratoControl
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	AND.B	#$F0,n_wavecontrol(A6)
	OR.B	D0,n_wavecontrol(A6)
	RTS

mt_SetFineTune
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	MOVE.B	D0,n_finetune(A6)
	RTS

mt_JumpLoop
	TST.B	mt_counter
	BNE	mt_Return2
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	BEQ.S	mt_SetLoop
	TST.B	n_loopcount(A6)
	BEQ.S	mt_jumpcnt
	SUBQ.B	#1,n_loopcount(A6)
	BEQ	mt_Return2
mt_jmploop	MOVE.B	n_pattpos(A6),mt_PBreakPos
	ST	mt_PBreakFlag
	RTS

mt_jumpcnt
	MOVE.B	D0,n_loopcount(A6)
	BRA.S	mt_jmploop

mt_SetLoop
	MOVE.W	mt_PattPos(PC),D0
	LSR.W	#4,D0
	MOVE.B	D0,n_pattpos(A6)
	RTS

mt_SetTremoloControl
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	LSL.B	#4,D0
	AND.B	#$0F,n_wavecontrol(A6)
	OR.B	D0,n_wavecontrol(A6)
	RTS

mt_RetrigNote
	MOVE.L	D1,-(SP)
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	BEQ.S	mt_rtnend
	MOVEQ	#0,D1
	MOVE.B	mt_counter(PC),D1
	BNE.S	mt_rtnskp
	MOVE.W	(A6),D1
	AND.W	#$0FFF,D1
	BNE.S	mt_rtnend
	MOVEQ	#0,D1
	MOVE.B	mt_counter(PC),D1
mt_rtnskp
	DIVU	D0,D1
	SWAP	D1
	TST.W	D1
	BNE.S	mt_rtnend
mt_DoRetrig
	MOVE.W	n_dmabit(A6),$DFF096	; Channel DMA off
	MOVE.L	n_start(A6),(A5)	; Set sampledata pointer
	MOVE.W	n_length(A6),4(A5)	; Set length

        bsr     mt_nicerwait

	MOVE.W	n_dmabit(A6),D0
	BSET	#15,D0
	MOVE.W	D0,$DFF096

        bsr     mt_nicerwait

	MOVE.L	n_loopstart(A6),(A5)
	MOVE.L	n_replen(A6),4(A5)
mt_rtnend
	MOVE.L	(SP)+,D1
	RTS

mt_VolumeFineUp
	TST.B	mt_counter
	BNE	mt_Return2
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F,D0
	BRA	mt_VolSlideUp

mt_VolumeFineDown
	TST.B	mt_counter
	BNE	mt_Return2
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	BRA	mt_VolSlideDown2

mt_NoteCut
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	CMP.B	mt_counter(PC),D0
	BNE	mt_Return2
	CLR.B	n_volume(A6)
	MOVE.W	#0,8(A5)
	RTS

mt_NoteDelay
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	CMP.B	mt_Counter,D0
	BNE	mt_Return2
	MOVE.W	(A6),D0
	BEQ	mt_Return2
	MOVE.L	D1,-(SP)
	BRA	mt_DoRetrig

mt_PatternDelay
	TST.B	mt_counter
	BNE	mt_Return2
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	TST.B	mt_PattDelTime2
	BNE	mt_Return2
	ADDQ.B	#1,D0
	MOVE.B	D0,mt_PattDelTime
	RTS

mt_FunkIt
	TST.B	mt_counter
	BNE	mt_Return2
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	LSL.B	#4,D0
	AND.B	#$0F,n_glissfunk(A6)
	OR.B	D0,n_glissfunk(A6)
	TST.B	D0
	BEQ	mt_Return2
mt_UpdateFunk
	MOVEM.L	A0/D1,-(SP)
	MOVEQ	#0,D0
	MOVE.B	n_glissfunk(A6),D0
	LSR.B	#4,D0
	BEQ.S	mt_funkend
	LEA	mt_FunkTable(PC),A0
	MOVE.B	(A0,D0.W),D0
	ADD.B	D0,n_funkoffset(A6)
	BTST	#7,n_funkoffset(A6)
	BEQ.S	mt_funkend
	CLR.B	n_funkoffset(A6)

	CLR.B	n_funkoffset(A6)
	MOVE.L	n_loopstart(A6),D0
	MOVEQ	#0,D1
	MOVE.W	n_replen(A6),D1
	ADD.L	D1,D0
	ADD.L	D1,D0
	MOVE.L	n_wavestart(A6),A0
	ADDQ.L	#1,A0
	CMP.L	D0,A0
	BLO.S	mt_funkok
	MOVE.L	n_loopstart(A6),A0
mt_funkok
	MOVE.L	A0,n_wavestart(A6)
	MOVEQ	#-1,D0
	SUB.B	(A0),D0
	MOVE.B	D0,(A0)
mt_funkend
	MOVEM.L	(SP)+,A0/D1
	RTS


mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128

mt_VibratoTable	
	dc.b   0, 24, 49, 74, 97,120,141,161
	dc.b 180,197,212,224,235,244,250,253
	dc.b 255,253,250,244,235,224,212,197
	dc.b 180,161,141,120, 97, 74, 49, 24

mt_PeriodTable
; Tuning 0, Normal
	dc.w	856,808,762,720,678,640,604,570,538,508,480,453
	dc.w	428,404,381,360,339,320,302,285,269,254,240,226
	dc.w	214,202,190,180,170,160,151,143,135,127,120,113
; Tuning 1
	dc.w	850,802,757,715,674,637,601,567,535,505,477,450
	dc.w	425,401,379,357,337,318,300,284,268,253,239,225
	dc.w	213,201,189,179,169,159,150,142,134,126,119,113
; Tuning 2
	dc.w	844,796,752,709,670,632,597,563,532,502,474,447
	dc.w	422,398,376,355,335,316,298,282,266,251,237,224
	dc.w	211,199,188,177,167,158,149,141,133,125,118,112
; Tuning 3
	dc.w	838,791,746,704,665,628,592,559,528,498,470,444
	dc.w	419,395,373,352,332,314,296,280,264,249,235,222
	dc.w	209,198,187,176,166,157,148,140,132,125,118,111
; Tuning 4
	dc.w	832,785,741,699,660,623,588,555,524,495,467,441
	dc.w	416,392,370,350,330,312,294,278,262,247,233,220
	dc.w	208,196,185,175,165,156,147,139,131,124,117,110
; Tuning 5
	dc.w	826,779,736,694,655,619,584,551,520,491,463,437
	dc.w	413,390,368,347,328,309,292,276,260,245,232,219
	dc.w	206,195,184,174,164,155,146,138,130,123,116,109
; Tuning 6
	dc.w	820,774,730,689,651,614,580,547,516,487,460,434
	dc.w	410,387,365,345,325,307,290,274,258,244,230,217
	dc.w	205,193,183,172,163,154,145,137,129,122,115,109
; Tuning 7
	dc.w	814,768,725,684,646,610,575,543,513,484,457,431
	dc.w	407,384,363,342,323,305,288,272,256,242,228,216
	dc.w	204,192,181,171,161,152,144,136,128,121,114,108
; Tuning -8
	dc.w	907,856,808,762,720,678,640,604,570,538,508,480
	dc.w	453,428,404,381,360,339,320,302,285,269,254,240
	dc.w	226,214,202,190,180,170,160,151,143,135,127,120
; Tuning -7
	dc.w	900,850,802,757,715,675,636,601,567,535,505,477
	dc.w	450,425,401,379,357,337,318,300,284,268,253,238
	dc.w	225,212,200,189,179,169,159,150,142,134,126,119
; Tuning -6
	dc.w	894,844,796,752,709,670,632,597,563,532,502,474
	dc.w	447,422,398,376,355,335,316,298,282,266,251,237
	dc.w	223,211,199,188,177,167,158,149,141,133,125,118
; Tuning -5
	dc.w	887,838,791,746,704,665,628,592,559,528,498,470
	dc.w	444,419,395,373,352,332,314,296,280,264,249,235
	dc.w	222,209,198,187,176,166,157,148,140,132,125,118
; Tuning -4
	dc.w	881,832,785,741,699,660,623,588,555,524,494,467
	dc.w	441,416,392,370,350,330,312,294,278,262,247,233
	dc.w	220,208,196,185,175,165,156,147,139,131,123,117
; Tuning -3
	dc.w	875,826,779,736,694,655,619,584,551,520,491,463
	dc.w	437,413,390,368,347,328,309,292,276,260,245,232
	dc.w	219,206,195,184,174,164,155,146,138,130,123,116
; Tuning -2
	dc.w	868,820,774,730,689,651,614,580,547,516,487,460
	dc.w	434,410,387,365,345,325,307,290,274,258,244,230
	dc.w	217,205,193,183,172,163,154,145,137,129,122,115
; Tuning -1
	dc.w	862,814,768,725,684,646,610,575,543,513,484,457
	dc.w	431,407,384,363,342,323,305,288,272,256,242,228
	dc.w	216,203,192,181,171,161,152,144,136,128,121,114

mt_chan1temp	dc.l	0,0,0,0,0,$00010000,0,  0,0,0,0
mt_chan2temp	dc.l	0,0,0,0,0,$00020000,0,  0,0,0,0
mt_chan3temp	dc.l	0,0,0,0,0,$00040000,0,  0,0,0,0
mt_chan4temp	dc.l	0,0,0,0,0,$00080000,0,  0,0,0,0

mt_SampleStarts	dc.l	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		dc.l	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

mt_SongDataPtr	dc.l 0

mt_speed	dc.b 6
mt_counter	dc.b 0
mt_SongPos	dc.b 0
mt_PBreakPos	dc.b 0
mt_PosJumpFlag	dc.b 0
mt_PBreakFlag	dc.b 0
mt_LowMask	dc.b 0
mt_PattDelTime	dc.b 0
mt_PattDelTime2	dc.b 0
		dc.b 0

mt_PattPos	dc.w 0
mt_DMACONtemp	dc.w 0

mt_eq1          dc.b 16
mt_eq2          dc.b 16
mt_eq3          dc.b 16
mt_eq4          dc.b 16

mt_frig		dc.l 0

mt_mulu		dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0


mt_data		;incbin "sources:jam/mod.chipgene"
		incbin "st-00:modules/mod.intromuz"


	section data,data_c

old: 	dc.l 	0
oldcpr: dc.l	0			; Workbench copperlist


	dc.b  "And here comes the copperlist..."
	even

newcpr:	dc.w 	$100,$a200,$102,0,$104,%100100,$108,0,$10a,0
 	dc.w 	$92,$3c,$94,$d4,$8e,$2c79,$90,$2cc8



 	dc.w	$e0

pl0h: 	dc.w	0,$e2
pl0l: 	dc.w	0,$e4
pl1h:   dc.w    0,$e6
pl1l:   dc.w    0,$180
col0    dc.w    $fff,$182
col1    dc.w    0,$184
col2    dc.w    $888,$186
col3    dc.w    $ddd,$120
sp0h    dc.w    0,$122
sp0l    dc.w    0,$124
sp1h    dc.w    0,$126
sp1l    dc.w    0,$128
sp2h    dc.w    0,$12a
sp2l    dc.w    0,$12c
sp3h    dc.w    0,$12e
sp3l    dc.w    0,$130
sp4h    dc.w    0,$132
sp4l    dc.w    0,$134
sp5h    dc.w    0,$136
sp5l    dc.w    0,$138
sp6h    dc.w    0,$13a
sp6l    dc.w    0,$13c
sp7h    dc.w    0,$13e
sp7l    dc.w    0


        dc.w    $a309,$fffe
        dc.w    $1a2,$f00
        dc.w    $1aa,$f02
        dc.w    $1b2,$f04
        dc.w    $1ba,$f06

        dc.w    $a809,$fffe
        dc.w    $1a2,$f20
        dc.w    $1aa,$f22
        dc.w    $1b2,$f24
        dc.w    $1ba,$f26

        dc.w    $ad09,$fffe
        dc.w    $1a2,$f40
        dc.w    $1aa,$f42
        dc.w    $1b2,$f44
        dc.w    $1ba,$f46

        dc.w    $b209,$fffe
        dc.w    $1a2,$f60
        dc.w    $1aa,$f62
        dc.w    $1b2,$f64
        dc.w    $1ba,$f66

        dc.w    $b709,$fffe
        dc.w    $1a2,$f80
        dc.w    $1aa,$f82
        dc.w    $1b2,$f84
        dc.w    $1ba,$f86

        dc.w    $bc09,$fffe
        dc.w    $1a2,$fa0
        dc.w    $1aa,$fa2
        dc.w    $1b2,$fa4
        dc.w    $1ba,$fa6

        dc.w    $c109,$fffe
        dc.w    $1a2,$fc0
        dc.w    $1aa,$fc2
        dc.w    $1b2,$fc4
        dc.w    $1ba,$fc6

        dc.w    $c609,$fffe
        dc.w    $1a2,$fe0
        dc.w    $1aa,$fe2
        dc.w    $1b2,$fe4
        dc.w    $1ba,$fe6

        dc.w    $cb09,$fffe
        dc.w    $1a2,$ef0
        dc.w    $1aa,$ef2
        dc.w    $1b2,$ef4
        dc.w    $1ba,$ef6

        dc.w    $d009,$fffe
        dc.w    $1a2,$cf0
        dc.w    $1aa,$cf2
        dc.w    $1b2,$cf4
        dc.w    $1ba,$cf6

        dc.w    $d509,$fffe
        dc.w    $1a2,$af0
        dc.w    $1aa,$af2
        dc.w    $1b2,$af4
        dc.w    $1ba,$af6

        dc.w    $da09,$fffe
        dc.w    $1a2,$8f0
        dc.w    $1aa,$8f2
        dc.w    $1b2,$8f4
        dc.w    $1ba,$8f6

        dc.w    $df09,$fffe
        dc.w    $1a2,$6f0
        dc.w    $1aa,$6f2
        dc.w    $1b2,$6f4
        dc.w    $1ba,$6f6

        dc.w    $e409,$fffe
        dc.w    $1a2,$4f0
        dc.w    $1aa,$4f2
        dc.w    $1b2,$4f4
        dc.w    $1ba,$4f6

        dc.w    $e909,$fffe
        dc.w    $1a2,$2f0
        dc.w    $1aa,$2f2
        dc.w    $1b2,$2f4
        dc.w    $1ba,$2f6

        dc.w    $ee09,$fffe
        dc.w    $1a2,$0f0
        dc.w    $1aa,$0f2
        dc.w    $1b2,$0f4
        dc.w    $1ba,$0f6



        dc.w    $ffdf,$fffe

	dc.w	$9c,$8010		; call copper interrupt
  	dc.w	$ffff,$fffe
        dc.w 	$ffff,$fffe     	; End copper

gfxlib: dc.b 	"graphics.library",0	; library name

 	even

gfxbse: dc.l 	0


	dc.b	"Here starts the bitmap data. Watch for the EVEN pad bytes though!!"
        even

gfx     incbin "sources:jam/jampic.bmap"
planesize       equ 256*80

	dc.b	"start of sprite data now... "
	dc.b    "  Oh by the way, Hi to Kevin, Russ, Dave, "
	dc.b	"Max, Gordon, Jeff, Jim, Mark, & Mark. "
	even

sprite0
        dc.w    $f248,$f300            ;control words
        dc.l    0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    0,0

sprite1
        dc.w    $f250,$f300            ;control words
        dc.l    0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    0,0


sprite2
        dc.w    $f25a,$f300            ;control words
        dc.l    0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    0,0

sprite3
        dc.w    $f262,$f300            ;control words
        dc.l    0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    0,0

sprite4
        dc.w    $f26c,$f300            ;control words
        dc.l    0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    0,0

sprite5
        dc.w    $f274,$f300            ;control words
        dc.l    0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    0,0


sprite6
        dc.w    $f27e,$f300            ;control words
        dc.l    0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    0,0

sprite7
        dc.w    $f286,$f300            ;control words
        dc.l    0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    $ffff0000,$ffff0000,$ffff0000,$ffff0000,0
        dc.l    0,0
