;POUR CHARGER LES DATAS TAPEZ:
;
;RI		RETURN
;BOB1_RAW	RETURN
;SPR1		RETURN RETURN
;
;RI		RETURN
;BOB1_OUT	RETURN
;MSPR1		RETURN RETURN
;
;RI		RETURN
;BOB2_RAW	RETURN
;SPR2		RETURN RETURN
;
;RI		RETURN
;BOB2_OUT	RETURN
;MSPR2		RETURN RETURN
;
;RI		RETURN
;BOB3_RAW	RETURN
;SPR3		RETURN RETURN
;
;RI		RETURN
;BOB3_OUT	RETURN
;MSPR3		RETURN RETURN
;
;RI		RETURN
;BOB4_RAW	RETURN
;SPR4		RETURN RETURN
;
;RI		RETURN
;BOB4_OUT	RETURN
;MSPR4		RETURN RETURN
;
;
;PUIS TAPEZ
;G BEGIN	RETURN RETURN
;
;SUPPRIMEZ LES LIGNES SUIVANTES SI VOTRE VERSION DU SEKA
;NE COMPORTE PAS LA COMMANDE Y

>EXTERN "BOB1_RAW",SPR1
>EXTERN "BOB1_OUT",MSPR1
>EXTERN "BOB2_RAW",SPR2
>EXTERN "BOB2_OUT",MSPR2
>EXTERN "BOB3_RAW",SPR3
>EXTERN "BOB3_OUT",MSPR3
>EXTERN "BOB4_RAW",SPR4
>EXTERN "BOB4_OUT",MSPR4

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
;==================================
ECRAN1=$30000			;ECRAN 1 D'AFFICHAGE DES BOBS 
				;400 PIXELS SUR 1 EN 3 PLANS
ECRAN2=ECRAN1+[50*20*3]		;ECRAN 2 D'AFFICHAGE DES BOBS 
				;400 PIXELS SUR 1 EN 3 PLANS
SPR1=ECRAN2+[50*20*3]		;IMAGE DES BOBS DE 320 SUR 20 	
				;EN 3 PLANS
MSPR1=SPR1+[40*3*20]		;IMAGE DES MASQUES DES BOBS
				;320 PIXELS SUR 20
SPR2=MSPR1+[40*20*3]		
				
MSPR2=SPR2+[40*3*20]		
				
SPR3=MSPR2+[40*20*3]		
				
MSPR3=SPR3+[40*3*20]		
				
SPR4=MSPR3+[40*20*3]		
				
MSPR4=SPR4+[40*3*20]		
				
;==================================
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

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

WAIT:
BTST	#6,$BFE001		;ATTENDANT PRESSION SUR BOUTON GAUCHE SOURIS
BNE.S	WAIT			;SINON RETOURNE A WAIT

 				;SI OUI  FIN
END: 				;FIN:	
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 CALCUL			;VA A ROUTINE CALCUL POSITIONS DES BOBS
BSR.L PLACEBOBS			;VA A LA ROUTINE D'AFFICHAGE DES BOBS
BSR.L CLEAR_ALL			;VA A LA ROUTINE DE SWAPPING ECRAN

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
;===================
EVEN
FLAGSCREEN: DC.W 0		;POINTEUR DE L'ECRAN VISIBLE
EVEN

CLEAR_ALL:
CMP.W #0,FLAGSCREEN		;SI POINTEUR EST DIFFERENT DE 0
BNE.S CE1			;VA A CE1
BSR.L CLEAR_ALL2		;SINON VA A CLEAR_ALL2
RTS				;RETOUR
CE1:

CMP.W #1,FLAGSCREEN		;SI POINTEUR EST DIFFERENT DE 1
BNE.S CE2			;VA A CE2
BSR.s CLEAR_ALL1		;SINON VA A CLEAR_ALL2
RTS				;RETOUR
CE2:	

RTS


CLEAR_ALL1:
MOVE.W #0,FLAGSCREEN			;MET 0 DANS POINTEUR ECRAN

MOVE.W #ECRAN2+[50*0]+10/65536,HI1	;CHARGE ADRESSE ECRAN2 DANS
MOVE.W #ECRAN2+[50*0]+10 & 65535,LO1	;LA LISTE COPPER            
MOVE.W #ECRAN2+[50*1]+10/65536,HI2
MOVE.W #ECRAN2+[50*1]+10 & 65535,LO2
MOVE.W #ECRAN2+[50*2]+10/65536,HI3
MOVE.W #ECRAN2+[50*2]+10 & 65535,LO3


BSR.L WAIT_BLITTER		;ATTENDS BLITTER
LEA ECRAN1,A1			;MET ADRESSE ECRAN1 DANS A1
MOVE.L A1,BLTDPTH		;MET A1 DANS ADRESSE DESTINATION D
MOVE.W #0,BLTDMOD   	  	;MET 40-6 DANS MODULO D
MOVE.L #$FFFFFFFF,$DFF044 	;PAS DE MASQUE 1ER ET DERNIER MOT
MOVE.L #$01000000,BLTCON0	;PAS DE SOURCE     1 DESTINATION
				;MINTERM A 0 POUR EFFACEMENT	
MOVE.W #[1*3*64]+[40/2],BLTSIZE	;MET TAILLE TRANSFERT POUR DEMARRER BLITTER
RTS
;==============================
CLEAR_ALL2:
MOVE.W #1,FLAGSCREEN			;MET 0 DANS POINTEUR ECRAN

MOVE.W #ECRAN1+[50*0]+10/65536,HI1	;CHARGE ADRESSE ECRAN2 DANS
MOVE.W #ECRAN1+[50*0]+10 & 65535,LO1	;LA LISTE COPPER           
MOVE.W #ECRAN1+[50*1]+10/65536,HI2
MOVE.W #ECRAN1+[50*1]+10 & 65535,LO2
MOVE.W #ECRAN1+[50*2]+10/65536,HI3
MOVE.W #ECRAN1+[50*2]+10 & 65535,LO3

BSR.L WAIT_BLITTER		;ATTENDS BLITTER
LEA ECRAN2,A1			;MET ADRESSE ECRAN1 DANS A1
MOVE.L A1,BLTDPTH		;MET A1 DANS ADRESSE DESTINATION D
MOVE.W #0,BLTDMOD   	  	;MET 40-6 DANS MODULO D
MOVE.L #$FFFFFFFF,$DFF044 	;PAS DE MASQUE 1ER ET DERNIER MOT
MOVE.L #$01000000,BLTCON0	;PAS DE SOURCE     1 DESTINATION
				;MINTERM A 0 POUR EFFACEMENT	
MOVE.W #[1*3*64]+[40/2],BLTSIZE	;MET TAILLE TRANSFERT POUR DEMARRER BLITTER
RTS                 
;======================
CALCUL:
SUB.W #1,BOB1		;SOUSTRAIT 1 A POSITION X DU BOB
CMP.W #80-[2*4],BOB1	;SI SUPERIEUR A 72
Bhi OK			;VA A OK
MOVE.W #80,BOB1		;SINON POSITION X = 80
OK:

SUB.W #2,BOB2
CMP.W #80-[2*8],BOB2
Bhi OK2
MOVE.W #80,BOB2
OK2:

SUB.W #3,BOB3
CMP.W #80-[2*16],BOB3
Bhi OK3
MOVE.W #80,BOB3
OK3:

SUB.W #4,BOB4
CMP.W #80-[2*32],BOB4
Bhi OK4
MOVE.W #80,BOB4
OK4:

RTS


PLACEBOBS:
LEA BOB1,A1			;POINTE A1 SUR DEBUT STRUCTURE DU BOB
LEA SPR1,A3			;POINTE A3 SUR IMAGE DES BOBS
LEA MSPR1,A5			;POINTE A5 SUR MASK DES BOBS
BSR.L BBOBS

LEA BOB2,A1			;POINTE A1 SUR DEBUT STRUCTURE DU BOB
LEA SPR2,A3			;POINTE A3 SUR IMAGE DES BOBS
LEA MSPR2,A5			;POINTE A5 SUR MASK DES BOBS
BSR.L BBOBS

LEA BOB3,A1			;POINTE A1 SUR DEBUT STRUCTURE DU BOB
LEA SPR3,A3			;POINTE A3 SUR IMAGE DES BOBS
LEA MSPR3,A5			;POINTE A5 SUR MASK DES BOBS
BSR.L BBOBS

LEA BOB4,A1			;POINTE A1 SUR DEBUT STRUCTURE DU BOB
LEA SPR4,A3			;POINTE A3 SUR IMAGE DES BOBS
LEA MSPR4,A5			;POINTE A5 SUR MASK DES BOBS
BSR.L BBOBS

RTS

BBOBS:
MOVE.W 4(A1),8(A1)		;MET NOMBRE DE MOTS DANS BOB+8
				;POUR EFFACEMENT ULTERIEUR
MOVE.W (A1),D1			;MET POSITION X DANS D1
MOVE.W 2(A1),D3			;MET POSITION Y DANS D3
MULU #150,D3			;MULTIPLIE PAR 40 MOTS * A PLANS
MOVE.W	D1,D2			;MET X DANS D2
AND.W	#$FFF0,D1		;MASQUE 4 BITS INFERIEUR
LSR.W	#3,D1			;DIVISE PAR 8
ADD.W D3,D1			;AJOUTE D3 A D1 POUR AVOIR LE NOMBRE DE
				;MOTS A AJOUTER AU DEBUT DE L'IMAGE
	
AND.W	#$000F,D2		;MASQUE 12 BITS SUPERIEURS
MULU	#$1000,D2		;MULTIPLIE PAR $1000
				;POUR OBTENIR DECALAGE A DROITE
MOVE.W D1,4(A1)			;MET NOMBRE DE MOTS DANS BOB+4
MOVE.W D2,6(A1)			;MET DECALAGE DANS BOB+6

CMP.W #0,FLAGSCREEN		;SI POINTEUR ECRAN N'EST PAS EGAL A 0
BNE.S DADA			;VA A DADA 
LEA ECRAN1,A4			;MET ADRESSE ECRAN 1 DANS A4         
DADA:
CMP.W #1,FLAGSCREEN		;SI POINTEUR ECRAN N'EST PAS EGAL A 0
BNE.S DADA2			;VA A DADA2 
LEA ECRAN2,A4			;MET ADRESSE ECRAN 2 DANS A4         
DADA2:

ADD.W 4(A1),A4			;AJOUTE NOMBRE DE MOTS A A4


BSR.L WAIT_BLITTER		;ATTENDS BLITTER
MOVE.L A5,BLTAPTH		;MET ADRESSE MASK DU BOB DANS POINTEUR SOURCE A
MOVE.L A3,BLTBPTH		;MET ADRESSE IMAGE DU BOB DANS POINTEUR SOURCE B
MOVE.L A4,BLTCPTH		;MET ADRESSE POSITION DU BOB DANS SOURCE C
MOVE.L A4,BLTDPTH		;MET ADRESSE POSITION DU BOB DANS DEST D

MOVE.W #0,BLTAMOD		;MET 40 - 6 DANS MODULO SOURCE A
MOVE.W #0,BLTBMOD		;MET 40 - 6 DANS MODULO SOURCE B
MOVE.W #10,BLTCMOD		;MET 40 - 6 DANS MODULO SOURCE C
MOVE.W #10,BLTDMOD		;MET 40 - 6 DANS MODULO DESTINATION D

MOVE.L #$FFFF0000,d2		;MET MASQUE DERNIER MOT DANS D2 
MOVE.W 6(A1),D3			;MET DECALAGE DANS D3
ROR.L D3,D2			;DECALE D3 FOIS LE MASQUE
MOVE.L D2,$DFF044 		;ET LE PLACE DANS REGISTRE MASQUE

MOVE.W 6(A1),BLTCON1		;MET DECALAGE DANS BLTCON1
MOVE.W #$0FCA,D4		;$F = 3 SOURCE + DESTINATION  ACTIVES
				;$CA = MINTERM POUR COPIE AVEC DECOUPAGE
ADD.W 6(A1),D4			;AJOUTE LE DECALAGE
MOVE.W D4,BLTCON0		;MET LE RESULTAT DANS BLTCON0

MOVE.W #[1*3*64]+[40/2],BLTSIZE	;CHARGE TAILLE POUR DEMARRER BLITTER

RTS

;====================
EVEN
;BOB:
;DC.W 0	; X			;0  POSITION X
;DC.W 0	; Y			;2  POSITION Y
;DC.W 0	;MOTS EN +		;4  NOMBRE DE MOTS DEPUIS DEBUT IMAGE
;DC.W 0	; SHIFT			;6  DECALAGE A DROITE
;DC.W 0 ;			;8  INUTILISE

BOB1: DC.W  80-64,0,0,0,0
BOB2: DC.W  80-64,0,0,0,0
BOB3: DC.W  80-64,0,0,0,0
BOB4: DC.W  80-64,0,0,0,0
EVEN
;==========================
EVEN				;NOTRE LISTE COPPER
NEWCOPPER:   
DC.W $008E,$2871,$0090,$28D1

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

DC.W $102,0
DC.W $104,0

DC.W	$120,0,$122,0

;COULEURS DES BOBS
dc.w	$0180,$0000 ,$0182,$0f00 ,$0184,$0f33 ,$0186,$0f55
dc.w	$0188,$0f88 ,$018a,$0faa ,$018c,$0fdd ,$018e,$0fff

DC.W $2911,$FFFE,$100,0		;RESOLUTION A 0
DC.W $108,-40			;MODULO ENTRELACE =
DC.W $10A,-40			;[LARGEUR ECRAN - 40]+[NOMBRE DE PLANS - 1]* 40

	DC.W $00E0		;POINTEURS ADRESSES ECRAN D'AFFICHAGE
HI1:    DC.W ECRAN1/65536	
	DC.W $00E2
LO1:    DC.W ECRAN1 & 65535 
	DC.W $00E4
HI2:    DC.W ECRAN1/65536	
	DC.W $00E6
LO2:    DC.W ECRAN1 & 65535 
	DC.W $00E8
HI3:    DC.W ECRAN1/65536	
	DC.W $00EA
LO3:    DC.W ECRAN1 & 65535


DC.W $2a11,$FFFE,$100,$3200	;MET RESOLUTION

;DC.W $2d01,$FFFE,$10A,-40,$108,-40

;MODULOS NEGATIFS POUR REPETION DE LA LIGNE

dc.w $ffDF,$fffe		;PASSAGE EN PAL



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