;POUR CHARGER LES DATAS TAPEZ:
;
;RI		RETURN
;MODULE		RETURN
;MT_DATA	RETURN RETURN
;
;PUIS TAPEZ
;G BEGIN	RETURN RETURN
;
;SUPPRIMEZ LES LIGNES SUIVANTES SI VOTRE VERSION DU SEKA
;NE COMPORTE PAS LA COMMANDE Y

>EXTERN "MODULE",MT_DATA

org $30000	;EMPLACEMENT EN MEMOIRE
load $30000	;DE NOTRE PROGRAMME

BEGIN:
JMP START
;=====================================================================
EXECBASE=4
OPENLIBRARY=-408
CLOSELIBRARY=-414
SUPERSTATE=-150
USERSTATE=-156	
FORBID=-132
PERMIT=-138
ADDINTSERVER=-168
REMINTSERVER=-174
Open=-30
Close=-36
Read=-42

;=====================================================================
BLTCON0=$DFF040		
BLTCON1=$DFF042
BLTAFWM=$DFF044
BLTALWM=$DFF046
BLTCPTH=$DFF048
BLTCPTL=$DFF04A
BLTBPTH=$DFF04C
BLTBPTL=$DFF04E
BLTAPTH=$DFF050
BLTAPTL=$DFF052
BLTDPTH=$DFF054
BLTDPTL=$DFF056
BLTSIZE=$DFF058
BLTCMOD=$DFF060
BLTBMOD=$DFF062
BLTAMOD=$DFF064
BLTDMOD=$DFF066
BLTCDAT=$DFF070
BLTBDAT=$DFF072
BLTADAT=$DFF074
DMACONR=$DFF002
;==================================
IMAGE1=$35000			;PREMIER ECRAN
				;
IMAGE2=IMAGE1+[40*256]		;DEUXIEME ECRAN POUR DOUBLE BUFFERING
				;
MT_DATA=IMAGE2+[40*256]		;MUSIQUE
				;
FINDATA=MT_DATA+129216		;FIN DES DATAS
			
;==================================
START:    
MOVEM.L D0-D7/A0-A6,-(A7)	;SAUVE REGISTRES
MOVE.L EXECBASE,A6		;CHARGE ADRESSE EXECBASE DANS A6
JSR FORBID(A6)    		;SAUTE SOUS PROGRAMME: INTERDIT MULTITACHE
JSR OPENLIB  			;SAUTE SOUS PROGRAMME: OUVERTURE LIBRAIRIES

LEA IMAGE1,A0			;EFFACE LES 2 ECRANS
MOVE.W #[40*256]-1,D0		;POUR ANIMATION DES BOBS
CLR_IMAGES:
MOVE.W #0,(A0)+
DBF D0,CLR_IMAGES


BSR.L INIT_MUSIQUE		;INITIALISATION DE LA MUSIQUE

BSR.L SETCOPPER			;SAUTE SOUS PROGRAMME: MET EN PLACE LISTE COPPER

BSR.L MAIN			;SAUTE A INITIALISATION 3D

BSR.s NEWIRQ3			;SAUTE SOUS PROGRAMME: MET EN PLACE ROUTINE D'INTERRRUPTION

WAIT:

BSR.L MAINLOP1			;VA A ROUTINES DE CALCUL

BTST	#6,$BFE001		;ATTENDANT PRESSION SUR BOUTON GAUCHE SOURIS
BNE.S	WAIT			;SINON RETOURNE A WAIT
 				;SI OUI  FIN
END: 				;FIN:	
BSR.L STOP_MUSIQUE		;ARRET DE LA MUSIQUE
BSR.s STOPIRQ3        		;SAUTE SOUS PROGRAMME: STOPPE INTERRUPTION
BSR.L CLRCOPPER       		;SAUTE SOUS PROGRAMME: RESTAURE ANCIENNE LISTE COPPER
BSR.L CLOSELIB        		;SAUTE SOUS PROGRAMME: FERME LIBRAIRIES 
MOVE.L EXECBASE,A6		;CHARGE ADRESSE EXECBASE DANS A6
JSR PERMIT(A6)      		;AUTORISE MULTITACHE
                      
MOVEM.L (A7)+,D0-D7/A0-A6	;RESTAURE REGISTRES
RTS
;========================
NEWIRQ3:			;MET EN PLACE NOTRE ROUTINE 
MOVE.L	EXECBASE,A6		;D'INTERRUPTION
lea	irqstr,a1
move.l	#5,d0
jsr	addintserver(a6)
move.l	d0,irq
beq.s	irqerror
rts
irqerror:
rts
;==========================
STOPIRQ3:			;RESTAURE ANCIENNE ROUTINE
movem.l	a0-a6/d0-d7,-(sp)	;D'INTERRUPTION
	tst.l	irq
	beq.s	irqoff1
	move.l	execbase,a6
	lea	irqstr,a1
	move.l	#32,d0
	jsr	remintserver(a6)
irqoff1:movem.l	(sp)+,a0-a6/d0-d7
	rts
irqstr:
	dc.l	0,0
	dc.b	2,-127
	dc.l	0,irqdat,interrupt
irqdat:	dc.l	0,0,0,0
irq:	dc.l	0
;============================
interrupt:			;NOTRE ROUTINE D'INTERRUPTION	
movem.l	a0-a6/d0-d7,-(sp)

BSR.L PLAY_MUSIQUE		;VA A LA ROUTINE POUR JOUER LA MUSIQUE
	
movem.l	(sp)+,a0-a6/d0-d7
rts
;============================
OPENLIB:  			;OUVERTURE DE LA LIBRAIRIE GRAPHIQUE
move.l execbase,a6      	;MET ADRESSE EXECBASE DANS A6
lea gfxname,a1			;MET NOM DE LA LIBRAIRIE DANS A1
move.l #$0,d0           	;MET 0 DANS D0
jsr openlibrary(a6)		;OUVRE LIBRAIRIE
tst d0				;TESTE D0
beq.s error			;SI = A 0   VA A ERROR = SORTIE
move.l d0,gfxbase       	;SI NON, MET ADRESSE D0 DANS GFXBASE
add.l #$32,d0			;AJOUTE $32 A CETTE ADRESSE
move.l d0,coppertr      	;MET D0=ADRESSE ACTUELLE LISTE COPPER
rts				;DANS COPPERTR
even
gfxname: dc.b 'graphics.library',0 	;NOM DE LA LIBRAIRIE
even
gfxbase: dc.l 0				;POINTEUR POUR LA GRAPHICS LIBRARY
coppertr: dc.l 0			;POINTEUR POUR ADRESSE LISTE COPPER
;====================
CLOSELIB: 			;FERMETURE LIBRAIRIE
move.l execbase,a6      	;MET ADRESSE EXECBASE DANS A6
move.l gfxbase,a1		;MET NOM DE LA LIBRAIRIE DANS A1
jsr closelibrary(a6)		;FERME LIBRAIRIE
rts
;====================
ERROR:				;SI ERREUR
illegal				;SORTIE
rts
;====================
SETCOPPER:			;MET EN PLACE NOTRE LISTE COPPER
move.l coppertr,a0		;MET ADRESSE ACTUEL COPPER DANS A0
move.l (a0),oldcopper		;MET CONTENU DANS OLDCOPPER
move.l #newcopper,(a0)		;MET NOTRE LISTE COPPER DANS A0
move.w #$81c0,$dff096		;ACTIVE LISTE COPPER
rts		
oldcopper: dc.l 0
;====================
CLRCOPPER:			;RESTAURE ANCIENNE LISTE COPPER
move.l coppertr,a0		;MET ANCIENNE ADRESSE DANS A0
move.l oldcopper,(a0)		;MET CONTENU DANS A0
move.w #$80a0,$dff096		;REACTIVE ANCIENNE COPPER
rts
;====================
WAIT_BLITTER:			;ROUTINE POUR ATTENDRE QUE LE BLITTER
BTST #14,DMACONR		;EST FINI SON PRECEDENT TRAVAIL
BNE.S WAIT_BLITTER
RTS
;===================

****************************
* Pass upper screen to VDC *
*  while drawing the other *
****************************

PAGEUP:
MOVE.L	D0,-(A7)
MOVE.L	#IMAGE1,DRAWPLANE	;ADRESSE ECRAN A DESSINER DANS POINTEUR
MOVE.L	#IMAGE2,d0		;POINTE D0 SUR ECRAN2
MOVE.W	D0,LO			;ET PLACE ADRESSE DANS LA LISTE COPPER  
SWAP	D0			
MOVE.W	D0,HI			
BSR	WAITBOT			
MOVE.L	(A7)+,D0
RTS

****************************
* Pass lower screen to VDC *
*  while drawing the other *
****************************

PAGEDOWN:
MOVE.L	D0,-(A7)
MOVE.L	#IMAGE2,DRAWPLANE	;ADRESSE ECRAN A DESSINER DANS POINTEUR
MOVE.L	#IMAGE1,D0		;POINTE D0 SUR ECRAN1
MOVE.W	D0,LO			;ET PLACE ADRESSE DANS LA LISTE COPPER  
SWAP	D0			
MOVE.W	D0,HI			
BSR	WAITBOT
MOVE.L	(A7)+,D0
RTS

WAITBOT:			;ATTENDS 256 IEME LIGNE VIDEO
CMP.B	#$FF,$DFF006
BNE.S	WAITBOT
RTS

********************
* Clear the screen *
********************

CLWORK:
BTST	#14,$DFF002			;ATTENDS BLITTER
BNE.S	CLWORK

MOVE.L	DRAWPLANE,$DFF054		;POINTE SUR ECRAN A EFFACER
MOVE.L	#$01000000,$DFF040		;PAS DE SOURCE  1 DESTINATION D
MOVE.W	#0,$DFF066			;MODULO 0
MOVE.W	#[256*64]+[40/2],$DFF058	;TAILLE TRANSFERT BLITTER
RTS

*******************************************************************
* Draw-line routine, The points are passed in D2,D3 (start point) *
* and A2, A3 (end point)                                          *
*******************************************************************

DRAWL:
MOVEM.L	D0-D3/A0-A1,-(A7)

MOVE.L	D2,D0
MOVE.L	D3,D1				; X,Y START
MOVE.L	A2,D2
MOVE.L	A3,D3				; X,Y END
BSR	DRAW

MOVEM.L	(A7)+,D0-D3/A0-A1
RTS

****************
* BLITTER LINE *
****************

DRAW:
MOVEM.L	D2-D7/A2-A3,-(A7)
MOVEQ	#$F,D4
AND.W	D2,D4				; LOW 4 BITS
SUB.W	D3,D1				; HEIGHT
MULU	#320/8,D3			; START ADDRESS
SUB.W	D2,D0				; WIDTH
BLT.S	NO1
TST.W	D1
BLT.S	NO2
CMP.W	D0,D1
BGE.S	NO3
MOVEQ	#$11,D7
BRA.S	OCTSEL				; OCTANT #
NO3:
MOVEQ	#1,D7
EXG	D1,D0
OCTSEL:
BRA.S	NO4
NO2:
NEG.W	D1
CMP.W	D0,D1
BGE.S	SKIP
MOVEQ	#$19,D7
BRA.S	NO4
SKIP:
MOVEQ	#5,D7
EXG	D1,D0
NO4:
BRA.S	OCTSSEL
NO1:
NEG.W	D0
TST.W	D1
BLT.S	NO11

CMP.W	D0,D1
BGE.S	NO12
MOVEQ	#$15,D7
BRA.S	OCTSEL2

NO12:
MOVEQ	#9,D7
EXG	D1,D0
OCTSEL2:
BRA.S	OCTSSEL

NO11:
NEG.W	D1
CMP.W	D0,D1
BGE.S	NO13
MOVEQ	#$1D,D7
BRA.S	OCTSSEL
NO13:
MOVEQ	#$D,D7
EXG	D1,D0
OCTSSEL:
ADD.W	D1,D1
ASR.W	#3,D2
EXT.L	D2
ADD.L	D2,D3				; TOTAL OFFSET
MOVE.W	D1,D2
SUB.W	D0,D2
BGE.S	NOMINUS
ORI.W	#$40,D7				; SIGN = -
NOMINUS:
LEA	$DFF000,A0
MOVE.W	D2,A3
MOVE.W	#$FFFF,D6			; LINEPTRN
WAITBL:
BTST	#6,2(A0)
BNE.S	WAITBL
MOVE.W	D1,$62(A0)			; 4Y
MOVE.W	D2,D1
SUB.W	D0,D1
MOVE.W	D1,$64(A0)			; 4Y-4X
MOVEQ	#-1,D1
MOVE.L	D1,$44(A0)			; AFWM+ALWM
MOVE.W	#320/8,$60(A0)			; BITMAP WIDTH IN BYTES
MOVE.W	D7,D5
ADDQ.W	#1,D0
ASL.W	#6,D0
ADDQ.W	#2,D0				; BLITSIZE
MOVE.W	D4,D2
SWAP	D4
ASR.L	#4,D4				; FIRST PIXELPOS
ORI.W	#$B00,D4			; USE ABD
MOVE.W	#$8000,$74(A0)			; INDEX
CLR.W	D1
NOSPESH:
MOVE.L	DRAWPLANE,D7			; POINTER
SWAP	D5
MOVE.W	D4,D5
MOVE.B	#$CA,D5				; MINTERMS
SWAP	D5
ADD.L	D3,D7
WTBL2:
BTST	#6,2(A0)
BNE.S	WTBL2
MOVE.L	D5,$40(A0)			; BLTCON0 & 1
MOVE.W	A3,$52(A0)			; 2Y-X
MOVE.L	D7,$48(A0)
MOVE.L	D7,$54(A0)			; START ADDRESS OF LINE
MOVE.W	D6,$72(A0)			; PATTERN
MOVE.W	D0,$58(A0)			; SIZE
MOVEM.L	(A7)+,D2-D7/A2-A3
RTS

*****************************************************
* Sine and cosine function, angle is passed in D0   *
* and the sine and cosine are returned in D1 and D2 *
*****************************************************

SINCOS:
TST.W	D0				; ANGLE NEG. ADD 360°
BPL.S	NOADDI
ADD.W	#360,D0
NOADDI:
MOVE.L	#SINTAB,A1			; BEGINNING AD. OF SINETABLE
MOVE.L	D0,D2				; ANGLE IN D0 AND D2
LSL.W	#1,D0				; ANGLE TIMES 2 AS INDEX
MOVE.W	0(A1,D0.W),D1			; SINE TO D1
CMP.W	#270,D2				; CALC COSINE THROUGH
BLT.S	PLUS9				; DISPLACEMENT OF SINE VALUE
SUB.W	#270,D2				; BY 90 DEGREES
BRA	SENDSIN
PLUS9:
ADD.W	#90,D2
SENDSIN:
LSL.W	#1,D2
MOVE.W	(A1,D2.W),D2			; COSINE TO D2

RTS					; AND RETURN

*****************************************************
* Sine function					    *
* Angle is passed in d0 and the sine returned in D1 *
*****************************************************

SIN:
MOVE.L	#SINTAB,A1
TST.W	D0
BPL.S	SIN1
ADD.W	#360,D0
SIN1:
LSL.W	#1,D0
MOVE.W	(A1,D0.W),D1
RTS

*************************************************************
* Init the main diagonal of the result matrix with          *
* ones which were multiplied by 2^14. This subroutine must  *
* be called at least once before the call by rotate, or the *
* result matrix will only consist of zeros.                 *
*************************************************************

MATINIT:
MOVEQ	#0,D1
MOVE.W	#16384,D2			; THE INITIAL VALUE FOR
MOVE.W	D2,MATRIX11			; THE MAIN DIAGONAL OF
MOVE.W	D1,MATRIX12			; THE RESULT MATRIX
MOVE.W	D1,MATRIX13			; ALL OTHER ELEMENTS 
MOVE.W	D1,MATRIX21			; AT ZERO.
MOVE.W	D2,MATRIX22
MOVE.W	D1,MATRIX23
MOVE.W	D1,MATRIX31
MOVE.W	D1,MATRIX32
MOVE.W	D2,MATRIX33
RTS

***************************************************************
* Multiplication of the rotation matrix by the rotation       *
* matrix for rotation about the X-Axis                        *
***************************************************************

XROTATE:
MOVE.W	XANGLE,D0		; MULTIPLY MATRIX11-MATRIX33
JSR	SINCOS			; WITH THE ROTATION MATRIX
MOVE.W	D1,SINX			; FOR A ROTATION ABOUT THE X-AXIS
MOVE.W	D2,COSX
MOVE.W	D1,D3
MOVE.W	D2,D4
MOVE.W	MATRIX11,ROTX11		; THE FIRST COLUMN OF THE MATRIX
MOVE.W	MATRIX21,ROTX21		; DOES NOT CHANGE WITH X ROTATION
MOVE.W	MATRIX31,ROTX31
MULS	MATRIX12,D2
MULS	MATRIX13,D1
SUB.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX12
MOVE.W	D3,D1
MOVE.W	D4,D2
MULS	MATRIX22,D2
MULS	MATRIX23,D1
SUB.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX22
MOVE.W	D3,D1
MOVE.W	D4,D2
MULS	MATRIX32,D2
MULS	MATRIX33,D1
SUB.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX32
MOVE.W	D3,D1
MOVE.W	D4,D2
MULS	MATRIX12,D1
MULS	MATRIX13,D2
ADD.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX13
MOVE.W	D3,D1
MOVE.W	D4,D2
MULS	MATRIX22,D1
MULS	MATRIX23,D2
ADD.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX23
MULS	MATRIX32,D3
MULS	MATRIX33,D4
ADD.L	D3,D4
LSL.L	#2,D4
SWAP	D4
MOVE.W	D4,ROTX33
MOVE.L	#ROTX11,A1
MOVE.L	#MATRIX11,A2
MOVEQ	#8,D7			; NUMBER OF MATRIX ELEMENTS

ROXLOP1:
MOVE.W	(A1)+,(A2)+		; COPY RESULT MATRIX, WHICH
DBRA	D7,ROXLOP1		; IS STILL IN ROTXNN, TO MATRIXNN
RTS

***********************************************************
* MULTIPLY THE GENERAL ROTATION MATRIX BY THE Y-AXIS	  *
* ROTATION MATRIX. RESULTS ARE STORED IN THE GENERAL	  *
* ROTATION MATRIX					  *
***********************************************************

YROTATE:
MOVE.W	YANGLE,D0		; ANGLE AROUND WHICH ROTATION IS MADE
JSR	SINCOS
MOVE.W	D1,SINY
MOVE.W	D2,COSY
MOVE.W	D1,D3			; SINE OF Y-ANGLE
MOVE.W	D2,D4			; COSINE OF Y-ANGLE

MULS	MATRIX11,D2
MULS	MATRIX13,D1
ADD.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX11
MOVE.W	D3,D1
MOVE.W	D4,D2

MULS	MATRIX21,D2
MULS	MATRIX23,D1
ADD.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX21
MOVE.W	D3,D1
MOVE.W	D4,D2

MULS	MATRIX31,D2
MULS	MATRIX33,D1
ADD.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX31
NEG.W	D3
MOVE.W	D3,D1				; -SINY IN THE ROTATION MAT.
MOVE.W	D4,D2

MOVE.W	MATRIX12,ROTX12
MOVE.W	MATRIX22,ROTX22			; THE SECOND COLUMN
MOVE.W	MATRIX32,ROTX32			; OF THE STARTING MATRIX
					; DOES NOT CHANGE.
MULS	MATRIX11,D1
MULS	MATRIX13,D2
ADD.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX13
MOVE.W	D3,D1
MOVE.W	D4,D2

MULS	MATRIX21,D1
MULS	MATRIX23,D2
ADD.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX23

MULS	MATRIX31,D3
MULS	MATRIX33,D4
ADD.L	D3,D4
LSL.L	#2,D4
SWAP	D4
MOVE.W	D4,ROTX33

MOVEQ	#8,D7

MOVE.L	#ROTX11,A1			; ADDRESS OF RESULT MATRIX
MOVE.L	#MATRIX11,A2			; ADDRESS OF ORIGINAL MATRIX

YROTLOP1:
MOVE.W	(A1)+,(A2)+			; COPY RESULT MATRIX
DBRA	D7,YROTLOP1			; TO ORIGINAL MATRIX
RTS

********************************************
* Z-AXIS - ROTATION MATRIX MULTIPLICATIONS *
********************************************

ZROTATE:
MOVE.W	ZANGLE,D0
JSR	SINCOS
MOVE.W	D1,SINZ
MOVE.W	D2,COSZ
MOVE.W	D1,D3
MOVE.W	D2,D4

MULS	MATRIX11,D2
MULS	MATRIX12,D1
SUB.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX11
MOVE.W	D3,D1
MOVE.W	D4,D2

MULS	MATRIX21,D2
MULS	MATRIX22,D1
SUB.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX21
MOVE.W	D3,D1
MOVE.W	D4,D2

MULS	MATRIX31,D2
MULS	MATRIX32,D1
SUB.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX31
MOVE.W	D3,D1
MOVE.W	D4,D2

MULS	MATRIX11,D1
MULS	MATRIX12,D2
ADD.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX12
MOVE.W	D3,D1
MOVE.W	D4,D2

MULS	MATRIX21,D1
MULS	MATRIX22,D2
ADD.L	D1,D2
LSL.L	#2,D2
SWAP	D2
MOVE.W	D2,ROTX22

MULS	MATRIX31,D3
MULS	MATRIX32,D4
ADD.L	D3,D4
LSL.L	#2,D4
SWAP	D4
MOVE.W	D4,ROTX32

MOVE.W	MATRIX13,ROTX13			; THE THIRD COLUMN REMAINS
MOVE.W	MATRIX23,ROTX23			; UNCHANGED
MOVE.W	MATRIX33,ROTX33

MOVEQ	#8,D7
MOVE.L	#ROTX11,A1
MOVE.L	#MATRIX11,A2

ZROTLOP1:
MOVE.W	(A1)+,(A2)+			; COPY TO GENERAL
DBRA	D7,ZROTLOP1			; ROTATION MATRIX
RTS

**************************************************************
* Multiply every point whose Array address is in datx etc.   *
* by previous translation of the coordinate source to        *
* point [offx,offy,offz], with the general rotation matrix.  *
* The coordinate source of the result coordinates is then    *
* moved to point [xoffs,yoffs,zoffs]                         *
**************************************************************

ROTATE:
MOVE.W	NUMMARK,D0			; NUMBER OF POINTS TO BE
EXT.L	D0				; TRANSFORMED AS COUNTER
SUBQ.L	#1,D0

MOVE.L	DATX,A1
MOVE.L	DATY,A2
MOVE.L	DATZ,A3

MOVE.L	POINTX,A4
MOVE.L	POINTY,A5
MOVE.L	POINTZ,A6

ROTATE1:
MOVE.W	(A1)+,D1			; X-COORDINATE
ADD.W	OFFX,D1
MOVE.W	D1,D4

MOVE.W	(A2)+,D2			; Y-COORDINATE
ADD.W	OFFY,D2				; TRANSLATION TO POINT[OFFX,OFFY,OFFZ]
MOVE.W	D2,D5

MOVE.W	(A3)+,D3			; Z-COORDINATE
ADD.W	OFFZ,D3
MOVE.W	D3,D6

MULS	MATRIX11,D1
MULS	MATRIX21,D2
MULS	MATRIX31,D3

ADD.L	D1,D2
ADD.L	D2,D3
LSL.L	#2,D3
SWAP	D3
ADD.W	XOFFS,D3
MOVE.W	D3,(A4)+			; ROTATED X-COORDINATE

MOVE.W	D4,D1
MOVE.W	D5,D2
MOVE.W	D6,D3

MULS	MATRIX12,D1
MULS	MATRIX22,D2
MULS	MATRIX32,D3
ADD.L	D1,D2
ADD.L	D2,D3
LSL.L	#2,D3
SWAP	D3
ADD.W	YOFFS,D3
MOVE.W	D3,(A5)+		; ROTATED Y-COORDINATE

MULS	MATRIX13,D4
MULS	MATRIX23,D5
MULS	MATRIX33,D6
ADD.L	D4,D5
ADD.L	D5,D6
LSL.L	#2,D6
SWAP	D6
ADD.W	ZOFFS,D6
MOVE.W	D6,(A6)+		; ROTATED Z-COORDINATE

DBRA	D0,ROTATE1
RTS

*********************************************************************
* Perspective, calculated from the transformed points in the arrays *
* pointx, pointy and pointz the screen coordinates, which           *
* are then stored in the arrays xplot and yplot.                    *
*********************************************************************

PERS:
MOVE.L	POINTX,A1		; BEGINNING ADDRESS OF POINT ARRAYS
MOVE.L	POINTY,A2
MOVE.L	POINTZ,A3

MOVE.L	XPLOT,A4		; START ADDRESS OF DISPLAY COORDINATE
MOVE.L	YPLOT,A5		; ARRAY.

MOVE.W	NUMMARK,D0		; NUMBER OF POINTS TO BE TRANSFORMED
EXT.L	D0
SUBQ.L	#1,D0

PERLOP:
MOVE.W	(A3)+,D5		; Z-COORDINATE OF OBJECT
MOVE.W	D5,D6
MOVE.W	DIST,D4			; ENLARGEMENT FACTOR
SUB.W	D5,D4			; DIST MINUS Z-COORDINATE OF OBJ.COORD
EXT.L	D4
LSL.L	#8,D4			; TIMES 256 FOR VALUE FITTING
MOVE.W	ZOBS,D3			; PROJECTION CENTER Z-COORDINATES
EXT.L	D3

SUB.L	D6,D3			; MINUS Z-COORDINATE OF OBJECT
BNE.S	PERS1

MOVEQ	#0,D1			; CATCH DIVISION BY ZERO
ADDQ.L	#2,A1
ADDQ.L	#2,A2
MOVE.W	D1,(A4)+
MOVE.W	D1,(A5)+
BRA.S	PEREND1

PERS1:
DIVS	D3,D4
MOVE.W	D4,D3
MOVE.W	(A1)+,D1		; X-COORDINATE OF OBJECT
MOVE.W	D1,D2
NEG.W	D1
MULS	D1,D3			; MULTIPLIED BY PERSPECTIVE FACTOR
LSR.L	#8,D3			; /256 SAVE VALUE FITTING

ADD.W	D3,D2			; ADD TO X-COORDINATE
ADD.W	X0,D2			; ADD SCREEN OFFSET (CENTER POINT)
MOVE.W	D2,(A4)+		; DISPLAY X-COORDINATE

MOVE.W	(A2)+,D1		; Y-COORDINATE OF OBJECT
MOVE.W	D1,D2
NEG.W	D1
MULS	D1,D4
LSR.L	#8,D4			; /256

ADD.W	D4,D2
NEG.W	D2			; DISPLAY OFFSET, MIRROR OF Y-AXIS
ADD.W	Y0,D2			; SOURCE AT [X0,Y0]
MOVE.W	D2,(A5)+		; DISPLAY Y-COORDINATE
PEREND1:
DBRA	D0,PERLOP		; UNTIL ALL POINTS TRANSFORMED

RTS

*******************************************************
* Draw number of lines from array from lines in linxy *
*******************************************************

DRAWN1:
MOVE.L	XPLOT,A4		; DISPLAY X-COORDINATE
MOVE.L	YPLOT,A5		; DISPLAY Y-COORDINATE
MOVE.W	NUMLINE,D0		; NUMBER OF LINES
EXT.L	D0
SUBQ.L	#1,D0			; AS COUNTER
MOVE.L	LINXY,A6		; ADDRESS OF LINE ARRAY

DRLOP:
MOVE.L	(A6)+,D1		; FIRST LINE (P1,P2)
SUBQ.W	#1,D1			; FIT TO LIST STRUCTURE
LSL.W	#1,D1			; TIMES LIST ELEMENT LENGTH (2)
MOVE.W	(A4,D1.W),D2		; X-COORDINATE OF 2ND POINT
MOVE.W	(A5,D1.W),D3		; Y-COORDINATE OF SECOND POINT
SWAP	D1
SUBQ.W	#1,D1
LSL.W	#1,D1
MOVE.W	(A4,D1.W),A2		; X-COORDINATE OF FIRST POINT
MOVE.W	(A5,D1.W),A3		; Y-COORDINATE OF FIRST POINT
BSR	DRAWL			; DRAW LINE FROM P1 TO P2
DBRA	D0,DRLOP		; UNTIL ALL LINES DRAWN
RTS


***********************************
* Variables for the basic program *
***********************************

* Sine table starts here

SINTAB:
dc.w	0,286,572,857,1143,1428,1713,1997,2280
dc.w	2563,2845,3126,3406,3686,3964,4240,4516
dc.w	4790,5063,5334,5604,5872,6138,6402,6664
dc.w	6924,7182,7438,7692,7943,8192,8438,8682
dc.w	8923,9162,9397,9630,9860,10087,10311,10531
dc.w	10749,10963,11174,11381,11585,11786,11982,12176
dc.w	12365,12551,12733,12911,13085,13255,13421,13583
dc.w	13741,13894,14044,14189,14330,14466,14598,14726
dc.w	14849,14962,15082,15191,15296,15396,15491,15582
dc.w	15668,15749,15826,15897,15964,16026,16083,16135
dc.w	16182,16225,16262,16294,16322,16344,16362,16374
dc.w	16382,16383

dc.w	16382,16374,16362,16344,16322,16294,16262,16225
dc.w	16182
dc.w	16135,16083,16026,15964,15897,15826,15749,15668
dc.w	15582,15491,15396,15296,15191,15082,14962,14849
dc.w	14726,14598,14466,14330,14189,14044,13894,13741
dc.w	13583,13421,13255,13085,12911,12733,12551,12365
dc.w	12176,11982,11786,11585,11381,11174,10963,10749
dc.w	10531,10311,10087,9860,9630,9397,9162,8923
dc.w	8682,8438,8192,7943,7692,7438,7182,6924
dc.w	6664,6402,6138,5872,5604,5334,5063,4790
dc.w	4516,4240,3964,3686,3406,3126,2845,2563
dc.w	2280,1997,1713,1428,1143,857,572,286,0

dc.w	-286,-572,-857,-1143,-1428,-1713,-1997,-2280
dc.w	-2563,-2845,-3126,-3406,-3686,-3964,-4240,-4516
dc.w	-4790,-5063,-5334,-5604,-5872,-6138,-6402,-6664
dc.w	-6924,-7182,-7438,-7692,-7943,-8192,-8438,-8682
dc.w	-8923,-9162,-9397,-9630,-9860,-10087,-10311,-10531
dc.w	-10749,-10963,-11174,-11381,-11585,-11786,-11982,-12176
dc.w	-12365,-12551,-12733,-12911,-13085,-13255,-13421,-13583
dc.w	-13741,-13894,-14044,-14189,-14330,-14466,-14598,-14726
dc.w	-14849,-14962,-15082,-15191,-15296,-15396,-15491,-15582
dc.w	-15668,-15749,-15826,-15897,-15964,-16026,-16083,-16135
dc.w	-16182,-16225,-16262,-16294,-16322,-16344,-16362,-16374
dc.w	-16382,-16383

dc.w	-16382,-16374,-16362,-16344,-16322,-16294,-16262,-16225
dc.w	-16182
dc.w	-16135,-16083,-16026,-15964,-15897,-15826,-15749,-15668
dc.w	-15582,-15491,-15396,-15296,-15191,-15082,-14962,-14849
dc.w	-14726,-14598,-14466,-14330,-14189,-14044,-13894,-13741
dc.w	-13583,-13421,-13255,-13085,-12911,-12733,-12551,-12365
dc.w	-12176,-11982,-11786,-11585,-11381,-11174,-10963,-10749
dc.w	-10531,-10311,-10087,-9860,-9630,-9397,-9162,-8923
dc.w	-8682,-8438,-8192,-7943,-7692,-7438,-7182,-6924
dc.w	-6664,-6402,-6138,-5872,-5604,-5334,-5063,-4790
dc.w	-4516,-4240,-3964,-3686,-3406,-3126,-2845,-2563
dc.w	-2280,-1997,-1713,-1428,-1143,-857,-572,-286,0

X0:DC.W	0
Y0:DC.W	0
Z0:DC.W	0
Z1:DC.W	0

LINXY:DC.L	0		; ADDRESS OF LINE ARRAY

NUMMARK:DC.W	0		; NUMBER OF POINTS
NUMLINE:DC.W	0		; NUMBER OF LINES

POINTX:DC.L	0		; VARIABLES OF POINT ARRAYS FOR WORLD,
POINTY:DC.L	0		; VIEW, AND SCREEN COORDINATES
POINTZ:DC.L	0

XPLOT:DC.L	0
YPLOT:DC.L	0

DATX:DC.L	0
DATY:DC.L	0
DATZ:DC.L	0

SINX:DC.W	0		; TEMPORARY STORAGE FOR SIN & COS
SINY:DC.W	0		; VALUES
SINZ:DC.W	0

COSX:DC.W	0
COSY:DC.W	0
COSZ:DC.W	0

VAR1:DC.W	0		; GENERAL VARIABLES
VAR2:DC.W	0
VAR3:DC.W	0

XANGLE:DC.W	0		; VARIABLES FOR PASSING ANGLES
YANGLE:DC.W	0		; TO THE ROTATION SUBROUTINE
ZANGLE:DC.W	0

LEFTX:DC.W	0
LEFTY:DC.W	0
RIGHTX:DC.W	0
RIGHTY:DC.W	0

DIST:DC.W	0
ZOBS:DC.W	1500

ROTX11:DC.W	16384		; SPACE HERE FOR THE RESULT MATRIX
ROTX12:DC.W	0		; OF MATRIX MULTIPLICATION
ROTX13:DC.W	0
ROTX21:DC.W	0
ROTX22:DC.W	16384
ROTX23:DC.W	0
ROTX31:DC.W	0
ROTX32:DC.W	0
ROTX33:DC.W	16384

MATRIX11:DC.W	0		; SPACE HERE FOR THE GENERAL ROTATION
MATRIX12:DC.W	0		; MATRIX
MATRIX13:DC.W	0
MATRIX21:DC.W	0
MATRIX22:DC.W	0
MATRIX23:DC.W	0
MATRIX31:DC.W	0
MATRIX32:DC.W	0
MATRIX33:DC.W	0

DRAWPLANE:DC.L	0


MAIN:
BSR	GETRESO
BSR	MAKEWRLD		; CREATE THE WORLD SYSTEM
BSR	WORLDSET		; PASS THE WORLD PARAMETERS
BSR	SETROTDP		; INIT OBS.REF.POINT
BSR	PAGEUP
BSR	CLWORK
BSR	PAGEDOWN
BSR	CLWORK			; INIT BOTH PAGES
BSR	INP_CHAN		; INPUT AND CHANGE PARAMETERS
MOVE.W	#2047,DIST
RTS 

MAINLOP1:
BSR	POINTROT
BSR	PERS			; DO PERSPECTIVE
BSR	DRAWN1			; DRAW IT
BSR	PAGEUP			; DISPLAY IT
BSR	INP_CHAN		; INPUT NEW PARAMETERS
BSR	CLWORK
BSR	POINTROT		; ROTATE
BSR	PERS			; PERSPECTIVE
BSR	DRAWN1			; DRAWIT
BSR	PAGEDOWN
BSR	INP_CHAN		; INPUT PARAMETERS
BSR	CLWORK
RTS


INP_CHAN:

ADDQ.W	#2,HYANGLE
CMP.W	#360,HYANGLE
BLT.S	NOSUBY
SUB.W	#360,HYANGLE
NOSUBY:

ADDQ.W	#2,HZANGLE
CMP.W	#360,HZANGLE
BLT.S	NOSUBZ
SUB.W	#360,HZANGLE
NOSUBZ:

ADDQ.W	#2,HXANGLE
CMP.W	#360,HXANGLE
BLT.S	NOSUBX
SUB.W	#360,HXANGLE
NOSUBX:

SUB.W	#10,DIST
CMP.W	#-1000,DIST
BGT.S	NOCLR
MOVE.W	#-1000,DIST
NOCLR:

RTS

************************************************
* Init the rotation reference point to [0,0,0] *
************************************************

SETROTDP:
MOVEQ	#0,D1
MOVE.W	D1,ROTDPX
MOVE.W	D1,ROTDPY
MOVE.W	D1,ROTDPZ
MOVE.W	#0,HYANGLE		; START ROTATION ANGLE
MOVE.W	#0,HXANGLE
MOVE.W	#0,HZANGLE
RTS

***********************************************************
* Rotation around one point, the rotation reference point *
***********************************************************

POINTROT:
MOVE.W	HXANGLE,XANGLE	; ROTATE THE WORLD AROUND THE ANGLE
MOVE.W	HYANGLE,YANGLE	; HXANGLE, HYANGLE, HZANGLE ABOUT THE
MOVE.W	HZANGLE,ZANGLE
MOVE.W	ROTDPX,D0	; ROTATION REFERENCE POINT
MOVE.W	ROTDPY,D1
MOVE.W	ROTDPZ,D2
MOVE.W	D0,XOFFS
MOVE.W	D1,YOFFS
MOVE.W	D2,ZOFFS	; ADD FOR BACK TRANSFORMATION
NEG.W	D0
NEG.W	D1
NEG.W	D2
MOVE.W	D0,OFFX		; SUBTRACT FOR TRANSFORMATION
MOVE.W	D1,OFFY
MOVE.W	D2,OFFZ
BSR	MATINIT
BSR	ZROTATE
BSR	YROTATE
BSR	XROTATE
BSR	ROTATE
RTS

*****************************************************
* Creation of the world system from the object data *
*****************************************************

MAKEWRLD:
MOVE.L	#OBJDATX,A1		; CREATE THE WORLD SYSTEM BY
MOVE.L	#OBJDATY,A2
MOVE.L	#OBJDATZ,A3
MOVE.L	#WORLDX,A4
MOVE.L	#WORLDY,A5
MOVE.L	#WORLDZ,A6
MOVE.W	HNUMMARK,D0
EXT.L	D0
SUBQ.L	#1,D0
MAKEWL1:
MOVE.W	(A1)+,(A4)+		; COPYING THE OBJECT DATA INTO THE
MOVE.W	(A2)+,(A5)+		; WORLD DATA
MOVE.W	(A3)+,(A6)+
DBRA	D0,MAKEWL1
MOVE.W	HNUMLINE,D0
EXT.L	D0
SUBQ.L	#1,D0
MOVE.L	#OBJLIN,A1
MOVE.L	#WLINXY,A2
MAKEWL2:
MOVE.L	(A1)+,(A2)+
DBRA	D0,MAKEWL2
RTS

***********************************************
* Pass the world parameters to base variables *
***********************************************

WORLDSET:
MOVE.L	#WORLDX,DATX		; PASS VARIABLES FOR ROTATION ROUTINE
MOVE.L	#WORLDY,DATY
MOVE.L	#WORLDZ,DATZ
MOVE.L	#VIEWX,POINTX
MOVE.L	#VIEWY,POINTY
MOVE.L	#VIEWZ,POINTZ
MOVE.L	#WLINXY,LINXY
MOVE.W	PICTUREX,X0
MOVE.W	PICTUREY,Y0
MOVE.W	PROZ,ZOBS
MOVE.W	R1Z1,DIST
MOVE.L	#SCREENX,XPLOT
MOVE.L	#SCREENY,YPLOT
MOVE.W	HNUMLINE,NUMLINE
MOVE.W	HNUMMARK,NUMMARK
RTS

GETRESO:
MOVE.W	#320/2,PICTUREX
MOVE.W	#125,PICTUREY
RTS

*****************
* VARIABLE DATA *
*****************

*********************
* OBJECT DEFINITION *
*********************
;POINTS 
OBJDATX:
DC.W	-75,-45,-35,-25,-15, -5,  5, 15, 25, 35, 45, 55, 65, 75
DC.W	-65,-45, 60
DC.W	-65,-55
DC.W	 15, 25, 55, 65
DC.W	-65,-55
DC.W	-25,-15, 60
DC.W	-75,-65,-35, -5,  5, 15, 25, 35, 45, 55, 65, 75

DC.W	0,0,0,0,0,0,0,0,0,0
DC.W	0,0,0,0,0,0,0,0,0,0
DC.W	0,0,0,0,0,0,0,0,0,0
DC.W	0,0,0,0,0,0,0,0,0




OBJDATY:
DC.W	45,45,45,45,45,45,45,45,45,45,45,45,45,45 
DC.W	35,35,35
DC.W	30,30
DC.W	25,25,25,25
DC.W	20,20
DC.W	15,15,15
DC.W	5,5,5,5,5,5,5,5,5,5,5,5 

DC.W	-5,-5,-5,-5,-5,-5,-5,-5,-5,-5
DC.W	-15,-15,-15,-15,-15
DC.W	-25,-25
DC.W	-30
DC.W	-35,-35,-35,-35,-35,-35,-35
DC.W	-45,-45,-45,-45,-45,-45,-45,-45,-45,-45


OBJDATZ:	;PROFONDEUR
DC.W	0,0,0,0,0,0,0,0,0,0
DC.W	0,0,0,0,0,0,0,0,0,0
DC.W	0,0,0,0,0,0,0,0,0,0
DC.W	0,0,0,0,0,0,0,0,0,0

DC.W	-75,-65,-55,-45,-35,-25,5,35,45,65
DC.W	15,25,55,65,75
DC.W	15,25
DC.W	-60
DC.W	-25,-5,15,25,55,65,75
DC.W	-65,-55,-35,-5,5,15,25,35,45,65



***** WHAT POINTS SHOULD BE CONNECTED WITH LINES? ****

OBJLIN:
DC.W	1,2 ,2,16, 16,15, 15,18, 18,19, 19,25, 25,24, 24,30, 30,29, 29,1
DC.W	3,4 ,4,26 ,26,27 ,27,5 ,5,6 ,6,32, 32,31, 31,3
DC.W	7,8, 8,21, 21,9, 9,10, 10,36, 36,35, 35,20, 20,34, 34,33, 33,7
DC.W	11,12, 12,17, 17,13, 13,14, 14,23, 23,40, 40,39, 39,28
DC.W	28,38, 38,37, 37,22, 22,11

DC.W	41,42, 42,58, 58,43, 43,44, 44,67, 67,66, 66,41
DC.W	45,46, 46,59, 59,60, 60,69, 69,68, 68,45
DC.W	47,48, 48,73, 73,72, 72,62, 62,61, 61,71, 71,70, 70,47
DC.W	51,52, 52,57,57,56,56,51
DC.W	49,50,50,55,55,65,65,75,75,74,74,49
DC.W	53,54,54,64,64,63,63,53


HNUMMARK:DC.W	40+35		; NUMBER OF CORNER POINTS OF THE OBJECT
HNUMLINE:DC.W	40+7+6+12+10	; NUMBER OF LINES IN THE OBJECT

HXANGLE:DC.W	0	; ROTATION ANGLE OF THE OBJECT AROUND X AXIS
HYANGLE:DC.W	0
HZANGLE:DC.W	0

XWPLUS:DC.W	0	; ANGLE INCREMENT AROUND X AXIS
YWPLUS:DC.W	0
ZWPLUS:DC.W	0

PICTUREX:DC.W	320
PICTUREY:DC.W	100	; ORIGIN LOCATION ON SCREEN

ROTDPX:DC.W	0
ROTDPY:DC.W	0
ROTDPZ:DC.W	0	; ROTATION DATUM POINT

R1Z1:DC.W	0
NORMZ:DC.W	1500

PLUSROT:DC.L	0
FIRST:DC.L	0
SECOND:DC.W	0
DELTA1:DC.W	0

FLAG:DC.B	1
EVEN

DIFFZ:DC.W	0
DX:DC.W		0
DY:DC.W		0
DZ:DC.W		0

WORLDX:BLK.W	100,0	; WORLD COORDINATE ARRAY
WORLDY:BLK.W	100,0
WORLDZ:BLK.W	100,0

VIEWX:BLK.W	100,0	; VIEW COORDINATE ARRAY
VIEWY:BLK.W	100,0
VIEWZ:BLK.W	100,0

SCREENX:BLK.W	100,0	; DISPLAY COORDINATE ARRAY
SCREENY:BLK.W	100,0

WLINXY:BLK.L	300,0	; LINE ARRAY

PROX:DC.W	0	; COORDINATES OF THE PROJECTION CENTER
PROY:DC.W	0	; ON THE POSITIVE Z-AXIS
PROZ:DC.W	2000

OFFX:DC.W	0
OFFY:DC.W	0
OFFZ:DC.W	0
XOFFS:DC.W	0
YOFFS:DC.W	0
ZOFFS:DC.W	0

LOOPC:DC.L	0

EVEN

;====================
EVEN
;CETTE ROUTINE PERMET DE JOUER TOUS LES MODULES DE SOUNDTRACKERS
;DE LA VERSION 1.0 A LA VERSION 2.6  AINSI QUE CERTAINS MODULES
;NOISETRACKER.

INIT_MUSIQUE:			;INITIALISATION DE LA MUSIQUE
mt_init:move.l	mt_rdata(pc),a0
	cmp.l	#"M.K.",$438(a0)
	bne	mt_st20
	lea	mt_forst23(pc),a2
	move.l	a2,mt_forst
	bra	ok1st23
mt_st20:
	lea	mt_forst20(pc),a2
	move.l	a2,mt_forst
ok1st23:	
	add.l	(a2),a0
	moveq	#$7f,d0
	moveq	#0,d1
mt_init1:
	move.l	d1,d2
	subq.w	#1,d0
mt_init2:
	move.b	(a0)+,d1
	cmp.b	d2,d1
	bgt.s	mt_init1
	dbf	d0,mt_init2
	addq.b	#1,d2

mt_init3:
	move.l	mt_rdata(pc),a0
	lea	mt_sample1(pc),a1
	asl.l	#8,d2
	asl.l	#2,d2
	add.l	4(a2),d2
	add.l	a0,d2
	move.l	8(a2),d0
mt_init4:
	move.l	d2,(a1)+
	moveq	#0,d1
	move.w	42(a0),d1
	asl.l	#1,d1
	add.l	d1,d2
	add.l	#$1e,a0
	dbf	d0,mt_init4

	lea	mt_sample1(PC),a0
	moveq	#0,d0
mt_clear:
	move.l	(a0,d0.w),a1
	clr.l	(a1)
	addq.w	#4,d0
	cmp.w	#$7c,d0
	bne.s	mt_clear

	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	clr.l	mt_partnrplay
	clr.l	mt_partnote
	clr.l	mt_partpoint
	move.l	mt_rdata(pc),a1
	add.l	12(a2),a1
	move.b	(a1),mt_maxpart+1
	rts

STOP_MUSIQUE:			;ARRET DE LA MUSIQUE
mt_end:	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	move.w	#$f,$dff096
	rts

PLAY_MUSIQUE:			;JOUE LA MUSIQUE
mt_music:
	addq.w	#1,mt_counter
mt_cool:cmp.w	#6,mt_counter
	bne.s	mt_notsix
	clr.w	mt_counter
	bra	mt_rout2

mt_notsix:
	lea	mt_aud1temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp1
	lea	$dff0a0,a5		
	bsr.s	mt_arprout
mt_arp1:lea	mt_aud2temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp2
	lea	$dff0b0,a5
	bsr.s	mt_arprout
mt_arp2:lea	mt_aud3temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp3
	lea	$dff0c0,a5
	bsr.s	mt_arprout
mt_arp3:lea	mt_aud4temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp4
	lea	$dff0d0,a5
	bra.s	mt_arprout
mt_arp4:rts

mt_arprout:
	move.b	2(a6),d0
	and.b	#$0f,d0
	tst.b	d0
	beq	mt_arpegrt
	cmp.b	#$01,d0
	beq.s	mt_portup
	cmp.b	#$02,d0
	beq.s	mt_portdwn
	cmp.b	#$0a,d0
	beq.s	mt_volslide
	rts

mt_portup:
	moveq	#0,d0
	move.b	3(a6),d0
	sub.w	d0,22(a6)
	cmp.w	#$71,22(a6)
	bpl.s	mt_ok1
	move.w	#$71,22(a6)
mt_ok1:	move.w	22(a6),6(a5)
	rts

mt_portdwn:
	moveq	#0,d0
	move.b	3(a6),d0
	add.w	d0,22(a6)
	cmp.w	#$538,22(a6)
	bmi.s	mt_ok2
	move.w	#$538,22(a6)
mt_ok2:	move.w	22(a6),6(a5)
	rts

mt_volslide:
	moveq	#0,d0
	move.b	3(a6),d0
	lsr.b	#4,d0
	tst.b	d0
	beq.s	mt_voldwn
	add.w	d0,18(a6)
	cmp.w	#64,18(a6)
	bmi.s	mt_ok3
	move.w	#64,18(a6)
mt_ok3:	move.w	18(a6),8(a5)
	rts
mt_voldwn:
	moveq	#0,d0
	move.b	3(a6),d0
	and.b	#$0f,d0
	sub.w	d0,18(a6)
	bpl.s	mt_ok4
	clr.w	18(a6)
mt_ok4:	move.w	18(a6),8(a5)
	rts

mt_arpegrt:
	move.w	mt_counter(PC),d0
	cmp.w	#1,d0
	beq.s	mt_loop2
	cmp.w	#2,d0
	beq.s	mt_loop3
	cmp.w	#3,d0
	beq.s	mt_loop4
	cmp.w	#4,d0
	beq.s	mt_loop2
	cmp.w	#5,d0
	beq.s	mt_loop3
	rts

mt_loop2:
	moveq	#0,d0
	move.b	3(a6),d0
	lsr.b	#4,d0
	bra.s	mt_cont
mt_loop3:
	moveq	#$00,d0
	move.b	3(a6),d0
	and.b	#$0f,d0
	bra.s	mt_cont
mt_loop4:
	move.w	16(a6),d2
	bra.s	mt_endpart
mt_cont:
	add.w	d0,d0
	moveq	#0,d1
	move.w	16(a6),d1
	lea	mt_arpeggio(PC),a0
mt_loop5:
	move.w	(a0,d0),d2
	cmp.w	(a0),d1
	beq.s	mt_endpart
	addq.l	#2,a0
	bra.s	mt_loop5
mt_endpart:
	move.w	d2,6(a5)
	rts

mt_rout2:
	move.l	mt_rdata(pc),a0
	move.l	a0,a3
	add.l	#$0c,a3
	move.l	a0,a2
	move.l	mt_forst,a4
	add.l	(a4),a2
	add.l	16(a4),a0
	move.l	mt_partnrplay(PC),d0
	moveq	#0,d1
	move.b	(a2,d0),d1
	asl.l	#8,d1
	asl.l	#2,d1
	add.l	mt_partnote(PC),d1
	move.l	d1,mt_partpoint
	clr.w	mt_dmacon

	lea	$dff0a0,a5
	lea	mt_aud1temp(PC),a6
	bsr	mt_playit
	lea	$dff0b0,a5
	lea	mt_aud2temp(PC),a6
	bsr	mt_playit
	lea	$dff0c0,a5
	lea	mt_aud3temp(PC),a6
	bsr	mt_playit
	lea	$dff0d0,a5
	lea	mt_aud4temp(PC),a6
	bsr	mt_playit
	move.w	#$01f4,d0
mt_rls:	dbf	d0,mt_rls

	move.w	#$8000,d0
	or.w	mt_dmacon,d0
	move.w	d0,$dff096

	lea	mt_aud4temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice3
	move.l	10(a6),$dff0d0
	move.w	#1,$dff0d4
mt_voice3:
	lea	mt_aud3temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice2
	move.l	10(a6),$dff0c0
	move.w	#1,$dff0c4
mt_voice2:
	lea	mt_aud2temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice1
	move.l	10(a6),$dff0b0
	move.w	#1,$dff0b4
mt_voice1:
	lea	mt_aud1temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice0
	move.l	10(a6),$dff0a0
	move.w	#1,$dff0a4
mt_voice0:
	move.l	mt_partnote(PC),d0
	add.l	#$10,d0
	move.l	d0,mt_partnote
	cmp.l	#$400,d0
	bne.s	mt_stop
mt_higher:
	clr.l	mt_partnote
	addq.l	#1,mt_partnrplay
	moveq	#0,d0
	move.w	mt_maxpart(PC),d0
	move.l	mt_partnrplay(PC),d1
	cmp.l	d0,d1
	bne.s	mt_stop
	clr.l	mt_partnrplay
mt_stop:tst.w	mt_status
	beq.s	mt_stop2
	clr.w	mt_status
	bra.s	mt_higher
mt_stop2:
	rts

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

	moveq	#0,d3
	lea	mt_samples(PC),a1
	move.l	d2,d4
	lsl.l	#2,d2
	mulu	#$1e,d4
	move.l	(a1,d2),4(a6)
	move.w	(a3,d4.l),8(a6)
	move.w	2(a3,d4.l),18(a6)
	move.w	4(a3,d4.l),d3
	tst.w	d3
	beq.s	mt_displace
	move.l	4(a6),d2
	add.l	d3,d2
	move.l	d2,4(a6)
	move.l	d2,10(a6)
	move.w	6(a3,d4.l),8(a6)
	move.w	6(a3,d4.l),14(a6)
	move.w	18(a6),8(a5)
	bra.s	mt_nosamplechange

mt_displace:
	move.l	4(a6),d2
	add.l	d3,d2
	move.l	d2,10(a6)
	move.w	6(a3,d4.l),14(a6)
	move.w	18(a6),8(a5)
mt_nosamplechange:
	move.w (a6),d0
	andi.w #$fff,d0			;it's the bug
	tst.w	d0			;of the real
	beq.s	mt_retrout		;source replay
	move.w	(a6),16(a6)
	move.w	20(a6),$dff096
	move.l	4(a6),(a5)
	move.w	8(a6),4(a5)
	move.w	(a6),d0
	andi.w #$fff,d0			;second bug
	move.w d0,6(a5)			;of the source
	move.w	20(a6),d0
	or.w	d0,mt_dmacon

mt_retrout:
	tst.w	(a6)
	beq.s	mt_nonewper
	move.w	(a6),22(a6)

mt_nonewper:
	move.b	2(a6),d0
	and.b	#$0f,d0
	cmp.b	#$0b,d0
	beq.s	mt_posjmp
	cmp.b	#$0c,d0
	beq.s	mt_setvol
	cmp.b	#$0d,d0
	beq.s	mt_break
	cmp.b	#$0e,d0
	beq.s	mt_setfil
	cmp.b	#$0f,d0
	beq.s	mt_setspeed
	rts

mt_posjmp:
	not.w	mt_status
	moveq	#0,d0
	move.b	3(a6),d0
	subq.b	#1,d0
	move.l	d0,mt_partnrplay
	rts

mt_setvol:
	move.b	3(a6),8(a5)
	rts

mt_break:
	not.w	mt_status
	rts

mt_setfil:
	moveq	#0,d0
	move.b	3(a6),d0
	and.b	#1,d0
	rol.b	#1,d0
	and.b	#$fd,$bfe001
	or.b	d0,$bfe001
	rts

mt_setspeed:
	move.b	3(a6),d0
	and.b	#$0f,d0
	beq.s	mt_back
	clr.w	mt_counter
	move.b	d0,mt_cool+3
mt_back:rts

mt_aud1temp:
	blk.w	10,0
	dc.w	1
	blk.w	2,0
mt_aud2temp:
	blk.w	10,0
	dc.w	2
	blk.w	2,0
mt_aud3temp:
	blk.w	10,0
	dc.w	4
	blk.w	2,0
mt_aud4temp:
	blk.w	10,0
	dc.w	8
	blk.w	2,0
mt_partnote:	dc.l	0
mt_partnrplay:	dc.l	0
mt_counter:	dc.w	0
mt_partpoint:	dc.l	0
mt_samples:	dc.l	0
mt_sample1:	blk.l	31,0
mt_maxpart:	dc.w	0
mt_dmacon:	dc.w	0
mt_status:	dc.w	0
mt_forst:	dc.l	0

mt_forst20:	dc.l 472,600,14,470,600
mt_forst23:	dc.l $3b8,$438,$1e,$3b6,$43c
mt_arpeggio:
	dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c
	dc.w $023a,$021a,$01fc,$01e0,$01c5,$01ac,$0194,$017d
	dc.w $0168,$0153,$0140,$012e,$011d,$010d,$00fe,$00f0
	dc.w $00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097
	dc.w $008f,$0087,$007f,$0078,$0071,$0000,$0000,$0000
mt_rdata:	dc.l mt_data

;====================
EVEN				;NOTRE LISTE COPPER
NEWCOPPER:   
	DC.W	$008E,$2981	;DIMENSIONS DE L'ECRAN
	DC.W	$0090,$29D1	;256 LIGNES

	DC.W	$0092,$0038,$0094,$00D0

	;POINTEURS ADRESSE DES PLANS DE L'IMAGE

	DC.W $00E0
HI:	DC.W IMAGE1/65536			
	DC.W $00E2
LO:	DC.W IMAGE1 & 65535


	;REGISTRE POUR CHOISIR RESOLUTION	

	DC.W	$0100,$1200		;1 PLAN + MODE COULEURS

	;DECALAGE ECRAN - INUTILISE ICI

	DC.W	$0102,$0000

	;PRIORITE DES PLANS ET SPRITES - INUTILISE ICI

	DC.W 	$0104,$0000

	;MODULOS DES PLANS

	DC.W	$0108,0	;MODULOS PLANS PAIRS
	DC.W 	$010A,0	;MODULOS PLANS IMPAIRS

	;POINTEURS DES SPRITES - MIS A 0 SI PAS DE SPRITES

	DC.W	$0120,$0000,$0122,$0000
	DC.W	$0124,$0000,$0126,$0000
	DC.W	$0128,$0000,$012A,$0000	;PAS DE SPRITES
	DC.W	$012C,$0000,$012E,$0000
	DC.W	$0130,$0000,$0132,$0000
	DC.W	$0134,$0000,$0136,$0000
	DC.W	$0138,$0000,$013A,$0000
	DC.W	$013C,$0000,$013E,$0000

	;REGISTRES DES COULEURS

	DC.W	$0180,$0000	;COULEUR 00  SEULES CES DEUX COULEURS
	DC.W	$0182,$0FFF	;COULEUR 01  SONT UTILISEES ICI	

	DC.W	$0184,$0135	;COULEUR 02
	DC.W	$0186,$0246	;COULEUR 03
	DC.W	$0188,$0468	;COULEUR 04
	DC.W	$018A,$068a	;COULEUR 05
	DC.W	$018C,$08ac	;COULEUR 06
	DC.W	$018E,$0ace	;COULEUR 07
	DC.W	$0190,$0310	;COULEUR 08
	DC.W	$0192,$0da2	;COULEUR 09
	DC.W	$0194,$0c70	;COULEUR 10
	DC.W	$0196,$0b50	;COULEUR 11
	DC.W	$0198,$0a40	;COULEUR 12
	DC.W	$019A,$0830	;COULEUR 13
	DC.W	$019C,$0520	;COULEUR 14
	DC.W	$019E,$0def	;COULEUR 15
	DC.W	$01A0,$0DEF	;COULEUR 16	;LES COULEURS DE 16 A 31 SONT
	DC.W	$01A2,$0BEF	;COULEUR 17	;AUSSI CELLES DES SPRITES
	DC.W	$01A4,$0ADF	;COULEUR 18
	DC.W	$01A6,$07BD	;COULEUR 19	;LES COULEURS 16 A 31 NE SONT
	DC.W	$01A8,$058A	;COULEUR 20	;PAS UTILISEES DANS LE MODE
	DC.W	$01AA,$0357	;COULEUR 21	;HOLD AND MODIFY (HAM)
	DC.W	$01AC,$0234	;COULEUR 22
	DC.W	$01AE,$0011	;COULEUR 23
	DC.W	$01B0,$0FD0	;COULEUR 24
	DC.W	$01B2,$0FA0	;COULEUR 25
	DC.W	$01B4,$0E80	;COULEUR 26
	DC.W	$01B6,$0C60	;COULEUR 27
	DC.W	$01B8,$0A30	;COULEUR 28
	DC.W	$01BA,$0720	;COULEUR 29
	DC.W	$01BC,$0510	;COULEUR 30
	DC.W	$01BE,$0300	;COULEUR 31

	;INSTRUCTIONS POUR AVOIR UN ECRAN PAL (256 LIGNES DE HAUT)

	DC.W $FFDF,$FFFE


DC.L $FFFFFFFE ;FIN LISTE COPPER
EVEN
FINDEMO:
