;POUR CHARGER LES DATAS TAPEZ:
;RI		RETURN
;BOBS_RAW	RETURN
;BOBS		RETURN RETURN
;
;RI		RETURN
;BOBS_MASK	RETURN
;MASKBOBS	RETURN RETURN
;
;RI		RETURN
;MUSIC2		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 "BOBS_RAW",BOBS
>EXTERN "BOBS_MASK",MASKBOBS
>EXTERN "MUSIC2",MT_DATA

org $25000	;EMPLACEMENT EN MEMOIRE
load $25000	;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=$30000			;PREMIER ECRAN
				;
IMAGE2=$40000			;DEUXIEME ECRAN POUR DOUBLE BUFFERING
				;
BOBS=IMAGE2+[40*256*4]		;IMAGE DES BOBS
				;
MASKBOBS=BOBS+[32*128*4]	;IMAGE DES MASQUES DES BOBS
				;
MT_DATA=MASKBOBS+[32*128*4]	;MUSIQUE
				;
FINDATA=MT_DATA+85812		;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 #[20*256*4]-1,D0		;POUR ANIMATION DES BOBS
CLR_IMAGE1:
MOVE.W #0,(A0)+
DBF D0,CLR_IMAGE1

LEA IMAGE2,A0			
MOVE.W #[20*256*4]-1,D0		
CLR_IMAGE2:
MOVE.W #0,(A0)+
DBF D0,CLR_IMAGE2

LEA OPX1,A0			;COPIE LA STRUCTURE DU 1ER OBJET
LEA LOPX1,A2			;DANS STRUCTURE OBJET
BSR.L COPY_OBJETS		;

MOVE.W #0,TESTCL		

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 POINTROT			;VA A ROUTINE DE CALCUL DE ROTATIONS
BSR.L PERS			;VA A ROUTINE DE PERSPECTIVE
BSR.L TRIBOBS			;VA A ROUTINE DE TRI STRUCTURE BOBS
BSR.L  PLACEBOBS		;VA A ROUTINE D'AFFICHAGE DES BOBS

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

BSR.L  CLEAR_ALL		;VA A ROUTINE D'EFFACEMENT

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
BSR.L DEMOMODE

CMP.W #1,TESTCL			;SI TESTCL = 1
BNE.s IRQ2			;VA A ROUTINE DE TEST DU CLAVIER
BSR.L TESTCLAVIER
IRQ2:

CMP.W #0,TESTCL			;SI TESTCL = 0
BNE.s IRQ3			;VA A ROUTINE DE TRAJECTOIRE AUTO
BSR.L INP_CHAN
IRQ3:
	
movem.l	(sp)+,a0-a6/d0-d7
rts
;============================
even
TESTCL: DC.W 0			;POINTEUR POUR TEST
even
;============================
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
;===================
;BOB01:				;STRUCTURE D'UN BOB
;DC.W 0	; X		;0
;DC.W 0	; Y		;2
;DC.W 0	;MOTS EN +	;4
;DC.W 0	; SHIFT		;6
;DC.W 0	;QUEL BOB	;8
;DC.W 0	; Z		;10
;DC.W 0 ;ANCIEN MOTS +  ;12
;DC.W 0 ;		;14
;	16

LISTEBOBS:			;LISTE DES STRCUTURES DES BOBS


BOB01: DC.W 0,0,0,0,0,2,0,0
BOB02: DC.W 0,0,0,0,1,2,0,0
BOB03: DC.W 0,0,0,0,2,2,0,0
BOB04: DC.W 0,0,0,0,3,2,0,0
BOB05: DC.W 0,0,0,0,4,2,0,0
BOB06: DC.W 0,0,0,0,5,2,0,0
BOB07: DC.W 0,0,0,0,6,2,0,0
BOB08: DC.W 0,0,0,0,7,2,0,0
BOB09: DC.W 0,0,0,0,8,2,0,0
BOB10: DC.W 0,0,0,0,9,2,0,0
BOB11: DC.W 0,0,0,0,0,2,0,0
BOB12: DC.W 0,0,0,0,1,1,0,0
BOB13: DC.W 0,0,0,0,0,1,0,0
BOB14: DC.W 0,0,0,0,1,2,0,0
BOB15: DC.W 0,0,0,0,2,3,0,0
BOB16: DC.W 0,0,0,0,3,3,0,0
BOB17: DC.W 0,0,0,0,4,2,0,0
BOB18: DC.W 0,0,0,0,5,1,0,0
BOB19: DC.W 0,0,0,0,6,1,0,0
BOB20: DC.W 0,0,0,0,7,0,0,0
;==========================
EVEN
FLAGSCREEN: DC.W 0		;POINTEUR POUR TEST ECRAN VISISBLE
EVEN
STRUCTURE:			;LISTE A TRIER DES STRUCTURE DES BOBS
DC.L BOB01
DC.L BOB02
DC.L BOB03
DC.L BOB04
DC.L BOB05
DC.L BOB06
DC.L BOB07
DC.L BOB08
DC.L BOB09
DC.L BOB10
DC.L BOB11
DC.L BOB12
DC.L BOB13
DC.L BOB14
DC.L BOB15
DC.L BOB16
DC.L BOB17
DC.L BOB18
DC.L BOB19
DC.L BOB20
EVEN
;===================
TRIBOBS:		;ROUTINE DE TRI DE LA LISTE DES BOBS STRUCTURE
			;PAR RAPPORT A LEUR POSITION Z
LEA STRUCTURE,A0
MOVE.W #20,D0
TRISTR:
SUBQ #2,D0
TRIS1:
LEA 4(A0),A1
MOVE.W D0,D1
TRIS2:
MOVE.L (A0),A2
MOVE.L (A1),A3

MOVE.W 10(A2),D3
MOVE.W 10(A3),D4
	
CMP.W D4,D3
BLE.S TRIS3
MOVE.L (A0),D2
MOVE.L (A1),(A0)
MOVE.L D2,(A1)

TRIS3:
ADDQ #4,A1
DBRA D1,TRIS2
ADDQ #4,A0
DBRA D0,TRIS1
RTS

;=========================
PLACEBOBS:		;ROUTINE D'AFFICHAGE DES BOBS
LEA STRUCTURE,A6	;DANS L'ORDRE DE LA LISTE STRUCTURE
MOVEQ #19,D6
PLB2:
MOVE.L (A6),A1
BSR.s PLACEBOBBIS
ADDQ #4,A6
DBF D6,PLB2
RTS



PLACEBOBBIS:		;ROUTINE D'AFFICHAGE DES BOBS
			;VOIR COURS NUMERO 3

CMP.W #0,FLAGSCREEN	;TESTE ECRAN INVISIBLE ACTUEL
BNE.l DADA
LEA IMAGE1,A4
DADA:
CMP.W #1,FLAGSCREEN
BNE.l DADA2
LEA IMAGE2,A4
DADA2:


MOVE.W 4(A1),12(A1)	;SAUVE ANCIENNE VALEUR DE POSITION
			;POUR EFFACEMENT ULTERIEUR

CMP.W #2,2(A1)		;TESTE SI POSITION DU BOBS EST SUR L'ECRAN
BLE.L KTM		;SINON PAS D'AFFICHAGE

CMP.W #256-32,2(A1)
BHI.L KTM

CMP.W #320-32,(A1)
BHI.L KTM

CMP.W #0,(A1)
BLE.L KTM

MOVE.W (A1),D1		;CALCUL DU SHIFTING ET DU NOMBRE DE MOTS
MOVE.W 2(A1),D3		;D'APRES LA POSITION X ET Y
MULU	#40*4,D3		
MOVE.W	D1,D2		
AND.W	#$FFF0,D1	
LSR.W	#3,D1
add.w d3,d1
	
AND.W	#$000F,D2	
MULU	#$1000,D2	

MOVE.W D1,4(A1)		;NOMBRE DE MOT
MOVE.W D2,6(A1)		;SHIFTING

ADD.W 4(A1),A4		;ADRESSE SUR ECRAN

LEA TABLEBOBS,A0		
MOVE.W 8(A1),D1
LSL.W #2,D1
MOVE.L (A0,D1.W),A3	;IMAGE DU BOB
LEA TABLEMASKBOBS,A0
MOVE.L (A0,D1.W),A5	;IMAGE DU MASQUE

         	  
PLACEBOB2:
BSR.L WAIT_BLITTER         
MOVE.L A5,BLTAPTH
MOVE.L A3,BLTBPTH
MOVE.L A4,BLTCPTH        	  
MOVE.L A4,BLTDPTH        	  
MOVE.W #32-6,BLTAMOD
MOVE.W #32-6,BLTBMOD   	  
MOVE.W #40-6,BLTCMOD
MOVE.W #40-6,BLTDMOD   	  

MOVE.L #$FFFF0000,d2
MOVE.W 6(A1),D3
ROR.L D3,D2
MOVE.L D2,$DFF044 

MOVE.W 6(A1),BLTCON1
MOVE.W #$0FCA,D4
ADD.W 6(A1),D4
MOVE.W D4,BLTCON0  	  	  
MOVE.W #[32*4*64]+[6/2],BLTSIZE

KTM:

rts

EVEN
TABLEBOBS:			;TABLE DES ADRESSES DES BOBS
DC.L BOBS+[32*32*0*4]+00
DC.L BOBS+[32*32*0*4]+04
DC.L BOBS+[32*32*0*4]+08
DC.L BOBS+[32*32*0*4]+12
DC.L BOBS+[32*32*0*4]+16
DC.L BOBS+[32*32*0*4]+20
DC.L BOBS+[32*32*0*4]+24
DC.L BOBS+[32*32*0*4]+28

DC.L BOBS+[32*32*1*4]+00
DC.L BOBS+[32*32*1*4]+04
DC.L BOBS+[32*32*1*4]+08
DC.L BOBS+[32*32*1*4]+12
DC.L BOBS+[32*32*1*4]+16
DC.L BOBS+[32*32*1*4]+20
DC.L BOBS+[32*32*1*4]+24
DC.L BOBS+[32*32*1*4]+28

DC.L BOBS+[32*32*2*4]+00
DC.L BOBS+[32*32*2*4]+04
DC.L BOBS+[32*32*2*4]+08
DC.L BOBS+[32*32*2*4]+12
DC.L BOBS+[32*32*2*4]+16
DC.L BOBS+[32*32*2*4]+20
DC.L BOBS+[32*32*2*4]+24
DC.L BOBS+[32*32*2*4]+28

DC.L BOBS+[32*32*3*4]+00
DC.L BOBS+[32*32*3*4]+04
DC.L BOBS+[32*32*3*4]+08
DC.L BOBS+[32*32*3*4]+12
DC.L BOBS+[32*32*3*4]+16
DC.L BOBS+[32*32*3*4]+20
DC.L BOBS+[32*32*3*4]+24
DC.L BOBS+[32*32*3*4]+28
EVEN

TABLEMASKBOBS:			;TABLE DES ADRESSES DES MASQUES DES BOBS
DC.L MASKBOBS+[32*32*0*4]+00
DC.L MASKBOBS+[32*32*0*4]+04
DC.L MASKBOBS+[32*32*0*4]+08
DC.L MASKBOBS+[32*32*0*4]+12
DC.L MASKBOBS+[32*32*0*4]+16
DC.L MASKBOBS+[32*32*0*4]+20
DC.L MASKBOBS+[32*32*0*4]+24
DC.L MASKBOBS+[32*32*0*4]+28

DC.L MASKBOBS+[32*32*1*4]+00
DC.L MASKBOBS+[32*32*1*4]+04
DC.L MASKBOBS+[32*32*1*4]+08
DC.L MASKBOBS+[32*32*1*4]+12
DC.L MASKBOBS+[32*32*1*4]+16
DC.L MASKBOBS+[32*32*1*4]+20
DC.L MASKBOBS+[32*32*1*4]+24
DC.L MASKBOBS+[32*32*1*4]+28

DC.L MASKBOBS+[32*32*2*4]+00
DC.L MASKBOBS+[32*32*2*4]+04
DC.L MASKBOBS+[32*32*2*4]+08
DC.L MASKBOBS+[32*32*2*4]+12
DC.L MASKBOBS+[32*32*2*4]+16
DC.L MASKBOBS+[32*32*2*4]+20
DC.L MASKBOBS+[32*32*2*4]+24
DC.L MASKBOBS+[32*32*2*4]+28

DC.L MASKBOBS+[32*32*3*4]+00
DC.L MASKBOBS+[32*32*3*4]+04
DC.L MASKBOBS+[32*32*3*4]+08
DC.L MASKBOBS+[32*32*3*4]+12
DC.L MASKBOBS+[32*32*3*4]+16
DC.L MASKBOBS+[32*32*3*4]+20
DC.L MASKBOBS+[32*32*3*4]+24
DC.L MASKBOBS+[32*32*3*4]+28
EVEN
;====================
CLEAR_ALL:		;ROUTINE D'EFFACEMENT DES BOBS
CMP.W #0,FLAGSCREEN	;VOIR COURS NUMERO 3
BNE.S CE1
BSR.L CLEAR_ALL2
RTS
CE1:

CMP.W #1,FLAGSCREEN
BNE.S CE2
BSR.s CLEAR_ALL1
RTS
CE2:

RTS


CLEAR_ALL1:
MOVE.W #0,FLAGSCREEN

MOVE.W #IMAGE2+[40*0]/65536,HI1
MOVE.W #IMAGE2+[40*0] & 65535,LI1
MOVE.W #IMAGE2+[40*1]/65536,HI2
MOVE.W #IMAGE2+[40*1] & 65535,LI2
MOVE.W #IMAGE2+[40*2]/65536,HI3
MOVE.W #IMAGE2+[40*2] & 65535,LI3
MOVE.W #IMAGE2+[40*3]/65536,HI4
MOVE.W #IMAGE2+[40*3] & 65535,LI4


LEA BOB01,A0
MOVE.W #19,D0

CLB:
MOVE.L #IMAGE1,A2
ADD.W 12(A0),A2

BSR.L WAIT_BLITTER
MOVE.L A2,BLTDPTH 

MOVE.W #40-6,BLTDMOD   	  

MOVE.L #$FFFFFFFF,$DFF044 

MOVE.L #$01000000,BLTCON0
  	  	  
MOVE.W #[32*4*64]+[6/2],BLTSIZE


ADD.W #16,A0
DBF D0,CLB

RTS
;==============================
CLEAR_ALL2:
MOVE.W #1,FLAGSCREEN

MOVE.W #IMAGE1+[40*0]/65536,HI1
MOVE.W #IMAGE1+[40*0] & 65535,LI1
MOVE.W #IMAGE1+[40*1]/65536,HI2
MOVE.W #IMAGE1+[40*1] & 65535,LI2
MOVE.W #IMAGE1+[40*2]/65536,HI3
MOVE.W #IMAGE1+[40*2] & 65535,LI3
MOVE.W #IMAGE1+[40*3]/65536,HI4
MOVE.W #IMAGE1+[40*3] & 65535,LI4

LEA BOB01,A0
MOVE.W #19,D0

CLBB:
MOVE.L #IMAGE2,A2
ADD.W 12(A0),A2

BSR.L WAIT_BLITTER
MOVE.L A2,BLTDPTH 

MOVE.W #40-6,BLTDMOD   	  

MOVE.L #$FFFFFFFF,$DFF044 

MOVE.L #$01000000,BLTCON0
  	  	  
MOVE.W #[32*4*64]+[6/2],BLTSIZE

ADD.W #16,A0
DBF D0,CLBB


RTS
TESTCLAVIER:		;ROUTINE DE TEST DU CLAVIER


                      
cmp.b #$5f,$bfec01      ;f1
bne.s l3 
addq	#2,HXangle
cmp.w	#360,HXangle
blt.s	l3
sub.w	#360,HXangle                 
l3:
                   
cmp.b #$5d,$bfec01      ;f2
bne.s l4
addq	#2,HYangle
cmp.w	#360,hYangle
blt.s	l4
sub.w	#360,HYangle
l4: 
                     
cmp.b #$5b,$bfec01      ;f3
bne.s l5 
addq	#2,HZangle
cmp.w	#360,hZangle
blt.s	l5
sub.w	#360,HZangle                 
l5:  

cmp.b #$59,$bfec01	;f4     
bne.s l2   
add.w #1,x0
l2:
                    
cmp.b #$57,$bfec01      ;f5
bne.s l6
sub.w #1,x0                  
l6: 
                     
cmp.b #$55,$bfec01      ;f6
bne.s l7
add.w #1,y0                  
l7: 
                     
cmp.b #$53,$bfec01      ;f7
bne.s l8                  
sub.w #1,y0       
l8:    
                  
cmp.b #$51,$bfec01      ;f8
bne.s l9                  
         
l9:                      
cmp.b #$4f,$bfec01      ;f9
bne.s l10

l10:

cmp.b #$4d,$bfec01      ;f10
bne.s l11
l11:

cmp.b #$fd,$bfec01	;1
bne.s l12
add.w #1,rotdpx
l12:

cmp.b #$fb,$bfec01	;2
bne.s l13
subQ #1,rotdpx
l13:

cmp.b #$f9,$bfec01	;3
bne.s l14
addQ #1,rotdpy
l14:

cmp.b #$f7,$bfec01	;4
bne.s l15
subQ #1,rotdpy
l15:

cmp.b #$f5,$bfec01	;5
bne.s l16
addQ #1,rotdpz
l16:

cmp.b #$f3,$bfec01	;6
bne.s l17
subQ #1,rotdpz
l17:

cmp.b #$dF,$bfec01	;Q
bne.s l18
LEA OPX1,A0
LEA LOPX1,A2
BSR.L COPY_OBJETS
l18:

cmp.b #$dd,$bfec01	;W
bne.s l19
LEA OPX2,A0
LEA LOPX2,A2
BSR.L COPY_OBJETS
l19:

cmp.b #$db,$bfec01	;E
bne.s l20
LEA OPX3,A0
LEA LOPX3,A2
BSR.L COPY_OBJETS
l20:

cmp.b #$d9,$bfec01	;R
bne.s l21
LEA OPX4,A0
LEA LOPX4,A2
BSR.L COPY_OBJETS
l21:

cmp.b #$d7,$bfec01	;T
bne.s l22
LEA OPX5,A0
LEA LOPX5,A2
BSR.L COPY_OBJETS
l22:

cmp.b #$d5,$bfec01	;Y
bne.s l23
LEA OPX6,A0
LEA LOPX6,A2
BSR.L COPY_OBJETS
l23:

cmp.b #$BF,$bfec01	;A-Q
bne.s l24
l24:

cmp.b #$Bd,$bfec01	;S
bne.s l25
l25:

cmp.b #$Bb,$bfec01	;D
bne.s l26
l26:

cmp.b #$B9,$bfec01	;F
bne.s l27
l27:

cmp.b #$B7,$bfec01	;G
bne.s l28
l28:

cmp.b #$B5,$bfec01	;H
bne.s l29
l29:


L33: 
RTS

DEMOMODE:
cmp.b #$74,$bfec01	;ESC = AUTO
bne.s l30
MOVE.W #0,TESTCL
l30:

cmp.b #$76,$bfec01	;RETURN = MANUEL 
bne.s l31
MOVE.W #1,TESTCL
l31:

cmp.b #$35,$bfec01	;alt droit
bne.s l32
sub.w	#10,Dist
cmp.w	#-1000,Dist
bgt.s	l32
move.w	#-1000,Dist
l32:

cmp.b #$37,$bfec01	;alt gauche
bne.s l34
add.w	#10,Dist
cmp.w	#1500,Dist
ble.s	l34
move.w	#1500,Dist
l34:


rts   
EVEN
;======================
COPY_OBJETS:		;ROUTINE DE COPIE DE LA STRUCTURE
LEA OBJDATX,A1		;D'UN OBJET DANS LA STRUCTURE UTILISEE
MOVE.W #[20*3]-1,D0	;PAR LE PROGRAMME 3D
CO2:
MOVE.W (A0)+,(A1)+
DBF D0,CO2

LEA BOB01,A0
MOVE.W #19,D0
LCO2:
MOVE.W (A2),8(A0)
ADD.W #2,A2
ADD.W #16,A0
DBF D0,LCO2 

BSR.L MAIN
MOVE.W #0,TESTCL

RTS

;======================
; SEQUENCE AUTOMATIQUE
INP_CHAN:


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


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


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


*****************************************************
* 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.s	sendsin
plus9:
add.w	#90,d2
sendsin:			; Cosine to D2
lsl.w	#1,d2
move.w	(a1,d2.w),d2		; And return  

rts				

*****************************************************
* 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				; -siny in the rotation mat.
move.w	d4,d2

muls	Matrix21,d2
muls	Matrix23,d1			; The second column
add.l	d1,d2				; of the starting matrix
lsl.l	#2,d2				; does not change.          
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				
move.w	d4,d2

move.w	Matrix12,Rotx12
move.w	Matrix22,Rotx22			
move.w	Matrix32,Rotx32			
					
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			
move.w	Matrix23,Rotx23			
move.w	Matrix33,Rotx33

moveq	#8,d7
move.l	#Rotx11,a1
move.l	#Matrix11,a2

zrotlop1:
move.w	(a1)+,(a2)+			
dbra	d7,zrotlop1			
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			
ext.l	d0				
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		
add.w	Offx,d1
move.w	d1,d4

move.w	(a2)+,d2		
add.w	Offy,d2			
move.w	d2,d5

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

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

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

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		
MOVE.L	POINTY,A2
MOVE.L	POINTZ,A3

MOVE.L	XPLOT,A4		
MOVE.L	YPLOT,A5	
	
LEA BOB01,A0

MOVE.W	#19,D0			

PERLOP:


MOVE.W	(A3)+,D5		
MOVE.W D5,10(A0)
MOVE.W	D5,D6
MOVE.W	DIST,D4			
SUB.W	D5,D4			
EXT.L	D4
LSL.L	#8,D4			
MOVE.W	ZOBS,D3			
EXT.L	D3

SUB.L	D6,D3			
BNE.S	PERS1

MOVEQ	#0,D1			
ADDQ.L	#2,A1
ADDQ.L	#2,A2
MOVE.W	D1,(A4)+
MOVE.W  D1,(A0)
MOVE.W	D1,(A5)+
MOVE.W  D1,2(A0)
BRA.S	PEREND1

PERS1:
DIVS	D3,D4
MOVE.W	D4,D3
MOVE.W	(A1)+,D1		
MOVE.W	D1,D2
NEG.W	D1
MULS	D1,D3			
LSR.L	#8,D3			

ADD.W	D3,D2			
ADD.W	X0,D2			
MOVE.W	D2,(A4)+		
MOVE.W  D2,(A0)
MOVE.W	(A2)+,D1		
MOVE.W	D1,D2
NEG.W	D1
MULS	D1,D4
LSR.L	#8,D4			

ADD.W	D4,D2
NEG.W	D2			
ADD.W	Y0,D2			
MOVE.W	D2,(A5)+		
MOVE.W  D2,2(A0)
PEREND1:
ADD.W #16,A0
DBRA	D0,PERLOP		

RTS


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		

nummark:dc.w	0		
numline:dc.w	0		

pointx:dc.l	0		
pointy:dc.l	0		
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		
siny:dc.w	0		
sinz:dc.w	0

cosx:dc.w	0
cosy:dc.w	0
cosz:dc.w	0

var1:dc.w	0		
var2:dc.w	0
var3:dc.w	0

xangle:dc.w	0		
yangle:dc.w	0		
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		
rotx12:dc.w	0		
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		
matrix12:dc.w	0		
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


setrotdp:
moveq	#0,d1
move.w	d1,rotdpx
move.w	d1,rotdpy
move.w	d1,rotdpz
move.w	#0,hyangle	
move.w	#0,hxangle
move.w	#0,hzangle
rts


pointrot:
move.w	Hxangle,xangle	
move.w	hyangle,yangle	
move.w	hzangle,zangle
move.w	rotdpx,d0	
move.w	rotdpy,d1
move.w	rotdpz,d2
move.w	d0,xoffs
move.w	d1,yoffs
move.w	d2,zoffs	
neg.w	d0
neg.w	d1
neg.w	d2
move.w	d0,offx		
move.w	d1,offy
move.w	d2,offz
bsr.L	Matinit
bsr.L	zrotate
bsr.L	yrotate
bsr.L	xrotate
bsr.L	rotate
rts

Makewrld:
move.l	#ObjDatx,a1		
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)+		
move.w	(a2)+,(a5)+		
move.w	(a3)+,(a6)+
dbra	d0,makewl1

rts

worldset:
move.l	#Worldx,datx		
move.l	#worldy,daty
move.l	#Worldz,datz
move.l	#viewx,pointx
move.l	#viewy,pointy
move.l	#viewz,pointz
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	hnummark,nummark
rts

getReso:
move.w	#320/2-16,PictureX
move.w	#110,pictureY
rts

Main:
bsr.s	GetReso
bsr.L	MakeWrld		
bsr.L	WorldSet		
bsr.L	SetRotDp		
move.w	#2047,dist
RTS

; PREMIER OBJET
ObjDatx:
dc.w   60,60,60,60,60,60
dc.w   40,40,40,40,40,40
dc.w   20,20,20,20,20,20
dc.w    0, 0

ObjDaty:
dc.w 60,40,20,0,-20,-40 
dc.w 60,40,20,0,-20,-40
dc.w 60,40,20,0,-20,-40
dc.w 60,40

ObjDatz:
dc.w 0,0,0,0,0,0
dc.w 0,20,20,20,20,0
dc.w 0,20,40,40,20,0
dc.w 0,20

hnummark:dc.w	20	


hxangle:dc.w	0	
hyangle:dc.w	0
hzangle:dc.w	0

xwplus:dc.w	0	
ywplus:dc.w	0
zwplus:dc.w	0

picturex:dc.w	320
picturey:dc.w	150	

rotdpx:dc.w	0
rotdpy:dc.w	0
rotdpz:dc.w	0	

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	
worldy:blk.w	100,0
worldz:blk.w	100,0

viewx:blk.w	100,0	
viewy:blk.w	100,0
viewz:blk.w	100,0

screenx:blk.w	100,0	
screeny:blk.w	100,0

;wlinxy:blk.l	300,0	

prox:dc.w	0	
proy:dc.w	0	
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

OBJET1:
OPX1:
dc.w   -10, 10,-10, 10
dc.w   -8, 8,-8, 8
dc.w   -7, 7,-7, 7
dc.w   -6, 6,-6, 6
dc.w   -5, 5,-5, 5

dc.w   -10,-10, 10, 10 
dc.w   -8,-8, 8, 8 
dc.w   -7,-7, 7, 7 
dc.w   -6,-6, 6, 6 
dc.w   -5,-5, 5, 5 
 
dc.w -40,-40,-40,-40
dc.w -20,-20,-20,-20
dc.w -3,-3,-3,-3
dc.w 11,11,11,11
dc.w 22,22,22,22

LOPX1: 
DC.W 0, 8,16,24
DC.W 1, 9,17,25
DC.W 2,10,18,26
DC.W 3,11,19,27
DC.W 4,12,20,28

OBJET2:
OPX2:
DC.W 30,10,-10,-30
DC.W 30,10,-10,-30
DC.W 30,10,-10,-30
DC.W 30,10,-10,-30

DC.W 10,-10
DC.W 10,-10

DC.W 30,30,30,30
DC.W 10,10,10,10
DC.W -10,-10,-10,-10
DC.W -30,-30,-30,-30

DC.W 10,10
DC.W -10,-10

DC.W 30,30,30,30
DC.W 30,10,10,30
DC.W 30,10,10,30
DC.W 30,30,30,30

DC.W -10,-10
DC.W -10,-10

LOPX2:
DC.W 0,0,0,0,0
DC.W 0,0,0,0,0
DC.W 0,0,0,0,0
DC.W 0,0,0,0,0
DC.W 0,0,0,0,0


OPX3: ;CUBE

DC.W -20,  0, 20,-20,20,-20,0,20
DC.W -20,  0, 20,-20,20,-20,0,20
DC.W -20, 20,-20, 20

DC.W 20,20,20,0,0,-20,-20,-20
DC.W 20,20,20,0,0,-20,-20,-20
DC.W 20,20,-20,-20

DC.W 20,20,20,20,20,20,20,20
DC.W -20,-20,-20,-20,-20,-20,-20,-20
DC.W 0,0,0,0

LOPX3:
DC.W 0,0,0,0,0,0,0,0
DC.W 16,16,16,16,16,16,16,16
DC.W 8,8,8,8


OPX4: ;CROIX

DC.W 0,0,0,0,0,0,0
DC.W -60,-40,-20,20,40,60
DC.W 0,0,0,0,0,0,0

DC.W 60,40,20,0,-20,-40,-60
DC.W 0,0,0,0,0,0
DC.W 0,0,0,0,0,0,0

DC.W 0,0,0,0,0,0,0
DC.W 0,0,0,0,0,0
DC.W -60,-40,-20,20,40,60,0

LOPX4:
DC.W 3,2,1,24,1,2,3
DC.W 19,18,17,17,18,19
DC.W 11,10,9,9,10,11
DC.W 24

OPX5: ;TRIANGLE

DC.W -60,-40,-20,0,20,40,60
DC.W 50,40,30,20,10,0
DC.W -10,-20,-30,-40,-50,0,0

DC.W 40,40,40,40,40,40,40
DC.W 20,0,-20,-40,-60,-80
DC.W -60,-40,-20,0,20,0,0

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

LOPX5:
DC.W 24,2,1,0,1,2,24
DC.W 18,17,16,17,18,24
DC.W 10,9,8,9,10,24
DC.W 24


OPX6: ;SPHERE
DC.W  0, 40, 60, 40,  0,-40,-60,-40
DC.W  0,0,0,0,0,0
DC.W  15,-15,-15,15,0,0

DC.W 60,40,0,-40,-60,-40,0,40
DC.W 40,0,-40,40,0,-40
DC.W 0,0,0,0,15,-15

DC.W 0,0,0,0,0,0,0,0
DC.W 40,60,40,-40,-60,-40
DC.W 15,15,-15,-15,0,0


LOPX6:
DC.W 3,3,3,3,3,3,3,3
DC.W 27,27,27,27,27,27
DC.W 16,0,16,0,8,8

;====================
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.s	mt_st20
	lea	mt_forst23(pc),a2
	move.l	a2,mt_forst
	bra.s	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.L	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.L	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.L	mt_playit
	lea	$dff0b0,a5
	lea	mt_aud2temp(PC),a6
	bsr.L	mt_playit
	lea	$dff0c0,a5
	lea	mt_aud3temp(PC),a6
	bsr.L	mt_playit
	lea	$dff0d0,a5
	lea	mt_aud4temp(PC),a6
	bsr.L	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,$F8D1	;200 LIGNES

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

	;POINTEURS ADRESSE DES PLANS DE L'IMAGE

dc.w $00e0
HI1: DC.W IMAGE1/65536			
dc.w $00e2
LI1: DC.W IMAGE1 & 65535
        
dc.w $00e4
HI2: DC.W IMAGE1/65536			
dc.w $00e6
LI2: DC.W IMAGE1 & 65535		
	
dc.w $00e8
HI3: DC.W IMAGE1/65536
dc.w $00ea
LI3: DC.W IMAGE1 & 65535 

dc.w $00ec
HI4: DC.W IMAGE1/65536				
dc.w $00ee
LI4: DC.W IMAGE1 & 65535  	
		

	;REGISTRE POUR CHOISIR RESOLUTION	

	DC.W	$0100,$4200		;4 PLANS+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,3*40	;MODULOS PLANS PAIRS
	DC.W 	$010A,3*40	;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
	DC.W	$0182,$0015	;COULEUR 01
	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


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