;APRES ASSEMBLAGE
;POUR CHARGER LES DATAS TAPEZ:
;
;RI		RETURN
;FONT.RAW	RETURN
;FONT		RETURN RETURN
;
;PUIS TAPEZ
;G BEGIN	RETURN RETURN
;
;SUPPRIMEZ LES LIGNES SUIVANTES SI VOTRE VERSION DU SEKA
;NE COMPORTE PAS LA COMMANDE Y

>EXTERN "FONT_RAW",FONT

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
;==================================
PLAN_SINUS=$40000		;IMAGE DU SINUS SCROLL
PLAN_SCROLL=PLAN_SINUS+[48*70]	;IMAGE DU SCROLL	
FONT=PLAN_SCROLL+[48*16]	;IMAGE DES CARACTERES
FINDATA=FONT+[40*48]
;==================================
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

MOVE.L	#TEXT,POINTEUR_TEXTE	;MET POINTEUR TEXTE AU DEBUT TEXTE	
MOVE.L	#SINS,POINTEUR_SINUS	;MET POINTEUR SINUS AU DEBUT TABLE SINUS

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

WAIT:
CMP.B #$E0,$DFF006		;ATTENDANT 200 IEME LIGNE RASTER
BNE.S WAIT			;SINON RETOURNE A WAIT

BSR.L	SCROLLING		;VA A ROUTINE DE SCROLLING	
BSR.L	SINECLR			;VA A ROUTINE D'EFFACEMENT SINUS SCROLL
BSR.L	SINE			;VA A ROUTINE DE SINUS SCROLL
		
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)

	
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
;====================
SINECLR:

LEA PLAN_SINUS,A0		;EFFACE ECRAN SINUS SCROLL
MOVE.W #[48*70]/4-1,D0
CLEAR:
MOVE.L #0,(A0)+
DBF D0,CLEAR
RTS 	
;====================
SINE:	MOVE.W	#$0DFC,BLTCON0		;$D =2 SOURCES + 1 DESTINATION
					;$FC = MINTERM
	MOVE.W  #$0000,BLTCON1		
	MOVE.W	#48-2,BLTDMOD		;MODULOS	
	MOVE.W	#48-2,BLTBMOD			
	MOVE.W	#48-2,BLTAMOD	 
		
	MOVE.L	#PLAN_SCROLL+46,A0	;POINTE A0 SUR FIN DE L'IMAGE DU SCROLL
	MOVE.L	#PLAN_SINUS+46,A1	;POINTE A1 SUN FIN DE L'IMAGE DU SINUS SCROLL
	MOVE.L	POINTEUR_SINUS,A2	;POINTE A2 SUR VALEUR ACTUEL DE SINUS
			
	MOVE.W	#24,D0		;24 = 24 BANDES DE 16 PIXELS
OUTL:	
	MOVE.W	#3,D1		;$3 = %0000 0000 0000 0011 = MASQUE
				;POUR AVOIR UN SINUS DE 1 PIXEL DE PRECISION
				;REMPLACEZ 3 PAR 1.
				;ET 8 PAR 16
	MOVE.W	#8,D2		;8 = 8 FOIS 2 PIXELS TRANSFERES

INL:	
	MOVE.L	A1,A3		;MET ADRESSE DE L'IMAGE DE SINUS SCROLL DANS A3
	CMP.L	#$FFFF,(A2)	;TESTE SI FIN TABLE SINUS
	BNE.S	NOWBLIT
	LEA	SINS,A2
NOWBLIT:
	ADD.L	(A2)+,A3	;POUR DOUBLER L'AMPLITUDE DU SINUS
				;ECRIRE A LA PLACE
				;MOVE.L (A2)+,D6
				;ADD.L D6,D6
				;ADD.L D6,A3
				;N'OUBLIEZ PAS DE DOUBLER LA TAILLE
				;DE L'IMAGE DU SINUS SCROLL
	BSR.L	WAIT_BLITTER
	MOVE.L	A0,BLTAPTH
	MOVE.L	A3,BLTDPTH
	MOVE.L	A3,BLTBPTH
	MOVE.W	D1,BLTAFWM
	MOVE.W	D1,BLTALWM
	MOVE.W	#[16*64]+1,BLTSIZE

	LSL.W	#2,D1		;POUR UN SINUS SCROLL DE 1 PIXEL
				;ECRIRE A LA PLACE
				;LSL.W #1,D1
	DBF D2,INL

	SUB.L	#2,A0
	SUB.L	#2,A1

	DBF D0,OUTL

	ADD.L	#4,POINTEUR_SINUS
	MOVE.L	POINTEUR_SINUS,A0
	CMP.L	#$FFFF,(A0)
	BNE.S	TABLE_PAS_FINIE
	LEA	SINS,A0
	MOVE.L	A0,POINTEUR_SINUS

TABLE_PAS_FINIE:
	RTS

SCROLLING:	;SIMPLE ROUTINE DE SCROLLING
		;SANS COMMENTAIRES..........
	
	BSR.L	WAIT_BLITTER
	MOVE.L	#PLAN_SCROLL,BLTAPTH
	MOVE.L	#PLAN_SCROLL-2,BLTDPTH
	MOVE.W	#$E9F0,BLTCON0
	MOVE.W	#$0000,BLTCON1
	MOVE.L	#$FFFFFFFF,BLTAFWM	
	MOVE.W	#0,BLTDMOD
	MOVE.W	#0,BLTAMOD
	MOVE.W	#[16*64]+23,BLTSIZE
	
	ADD.L	#1,COMPTEUR
	CMP.L	#8,COMPTEUR
	BLO.S	PASENCORE
	MOVE.L	#0,COMPTEUR
	BSR.S	PRINT
PASENCORE:
	RTS
PRINT:	CLR.L	POINTEUR_FONT
	LEA	TABLE_FONT,A1	

PAS_TROUVER:
	MOVE.B	(A1)+,D0	
	MOVE.L	POINTEUR_TEXTE,A2
	CMP.B	(A2),D0
	BEQ.S	TROUVER
	ADD.L	#1,POINTEUR_FONT
	BRA.S	PAS_TROUVER
TROUVER:
	MOVE.L	POINTEUR_FONT,D0
	MOVE.L	#0,POINTEUR_FONT
	LSL.L	#1,D0 
	LEA	ADRESSES_FONT,A0
	ADD.L	D0,A0
	MOVE.L	#0,D0
	MOVE.W	(A0),D0

	BSR.s	WAIT_BLITTER
	LEA	FONT,A1
	ADD.L	D0,A1
	MOVE.L	A1,BLTAPTH			
	MOVE.L	#PLAN_SCROLL+46,BLTDPTH		
	MOVE.W	#$09F0,BLTCON0
	MOVE.L	#$FFFFFFFF,BLTAFWM
	MOVE.W	#48-2,BLTDMOD
	MOVE.W	#40-2,BLTAMOD
	MOVE.W	#[16*64]+1,BLTSIZE

	ADD.L	#1,POINTEUR_TEXTE
	MOVE.L	POINTEUR_TEXTE,A0
	MOVE.B	(A0),D0
	CMP.B	#$FF,D0				
	BEQ.S	ENDOFTEXT
	RTS
ENDOFTEXT:
	MOVE.L	#TEXT,POINTEUR_TEXTE
	RTS
;==========================
WAIT_BLITTER:
	BTST	#14,DMACONR
	BNE.S	WAIT_BLITTER
	RTS
;==========================
EVEN
TEXT:
DC.B "                 "
DC.B "VOICI ENFIN COMME ON ME L A SOUVENT DEMANDE "
DC.B "UNE ROUTINE TRES SIMPLE DE SINUS SCROLL     "
DC.B "J ESPERE QUE CELA VOUS SATISFERA......."
DC.B "......................................."
DC.B "    ",$FF
EVEN

TABLE_FONT:	DC.B	"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-./!^$%"
		DC.B	"&:;`()=*+?,ß "

ADRESSES_FONT:	DC.W	0000,0002,0004,0006,0008
		DC.W	0010,0012,0014,0016,0018
		DC.W	0020,0022,0024,0026,0028
		DC.W	0030,0032,0034,0036,0038
		DC.W	0600,0602,0604,0606,0608
		DC.W	0610,0612,0614,0616,0618
		DC.W	0620,0622,0624,0626,0628
		DC.W	0630,0632,0634,0636,0638
		DC.W	1200,1202,1204,1206,1208
		DC.W	1210,1212,1214,1216,1218
		DC.W	1220,1222,1224,1226,1228
		DC.W	1230,1232,1234,1236,1238

SINS:	;TABLE DES SINUS

DC.L  1248, 1248, 1248, 1248, 1296, 1296, 1296
DC.L  1344, 1344, 1392, 1440, 1488
DC.L  1488, 1536, 1584, 1632, 1632, 1680, 1728, 1776, 1776, 1824
DC.L  1872, 1872, 1920, 1920, 1968, 2016, 2016, 2064, 2064, 2112
DC.L  2112, 2160, 2160, 2208, 2208, 2208, 2256, 2256, 2256, 2304
DC.L  2304, 2304, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352
DC.L  2352, 2400, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352
DC.L  2352, 2304, 2304, 2304, 2256, 2256, 2256, 2208, 2208, 2208
DC.L  2160, 2160, 2112, 2112, 2064, 2064, 2016, 2016, 1968, 1920
DC.L  1920, 1872, 1872, 1824, 1776, 1776, 1728, 1680, 1632, 1632
DC.L  1584, 1536, 1488, 1488, 1440, 1392, 1344, 1344, 1296, 1248
DC.L  1200, 1152, 1152, 1104, 1056, 1008, 1008, 960, 912, 864
DC.L  864, 816, 768, 720, 720, 672, 624, 576, 576, 528
DC.L  480, 480, 432, 432, 384, 336, 336, 288, 288, 240
DC.L  240, 192, 192, 144, 144, 144, 96, 96, 96, 48
DC.L  48, 48, 0, 0, 0, 0, 0, 0, 0, 0
DC.L  0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DC.L  0, 48, 48, 48, 96, 96, 96, 144, 144, 144
DC.L  192, 192, 240, 240, 288, 288, 336
DC.L  336, 384, 432, 480, 528, 528, 576, 624, 624
DC.L  672, 672, 672, 672, 672, 672, 672, 672, 624, 624
DC.L  576, 528, 528, 480, 432, 384, 336, 288, 240, 192
DC.L  144, 144, 96, 48, 48, 0, 0, 0, 0, 0
DC.L  0, 0, 0, 48, 48, 96, 144, 144, 192, 240
DC.L  288, 336, 384, 432
DC.L  432, 480, 480, 528, 576, 576, 624, 672, 720, 720
DC.L  768, 816, 864, 864, 912, 960, 1008, 1008, 1056, 1104
DC.L  1152, 1200, 1200, 1248, 1296
DC.L  1344, 1344, 1392, 1440, 1488
DC.L  1488, 1536, 1584, 1632, 1632, 1680, 1728, 1776, 1776, 1824
DC.L  1872, 1872, 1920, 1920, 1968, 2016, 2016, 2064, 2064, 2112
DC.L  2112, 2160, 2160, 2208, 2208, 2208, 2256, 2256, 2256, 2304
DC.L  2304, 2304, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352
DC.L  2352, 2400, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352
DC.L  2352, 2304, 2304, 2304, 2256, 2256, 2256, 2208, 2208, 2208
DC.L  2160, 2160, 2112, 2112, 2064, 2064, 2016, 2016, 1968, 1920
DC.L  1920, 1872, 1872, 1824, 1776, 1776, 1728, 1680, 1632, 1632
DC.L  1584, 1536, 1488, 1488, 1440, 1392, 1344, 1344, 1296, 1248
DC.L  1200, 1152, 1152, 1104, 1056, 1008, 1008, 960, 912, 864
DC.L  864, 816, 768, 720, 720, 672, 624, 576, 576, 528
DC.L  480, 480, 432, 432, 384, 336, 336, 288, 288, 240
DC.L  240, 192, 192, 144, 144, 144, 96, 96, 96, 48
DC.L  48, 48, 0, 0, 0, 0, 0, 0, 0, 0
DC.L  0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DC.L  0, 48, 48, 48, 96, 96, 96, 144, 144, 144
DC.L  192, 192, 240, 240, 288, 288, 336, 336, 384, 432
DC.L  432, 480, 480, 528, 576, 576, 624, 672, 720, 720
DC.L  768, 816, 864, 864, 912, 960, 1008, 1008, 1056, 1056
DC.L  1104,1104,1104,1152,1152,1152
DC.L  1152, 1152, 1200, 1200, 1200
DC.L  $ffff

EVEN
POINTEUR_SINUS:	DC.L  00
POINTEUR_TEXTE:	DC.L	0
COMPTEUR:	DC.L	0
POINTEUR_FONT:	DC.L	0
EVEN
;====================
			;NOTRE LISTE COPPER
NEWCOPPER:   
	DC.W	$008E,$3581	;DIMENSIONS DE L'ECRAN
	DC.W	$0090,$35c1	;256 LIGNES

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

	DC.W $E0,PLAN_SINUS+2/65536
	DC.W $E2,PLAN_SINUS+2&65535


	DC.W	$0102,$0000

	;PRIORITE DES PLANS ET SPRITES - INUTILISE ICI

	DC.W 	$0104,$0000

	;MODULOS DES PLANS

	DC.W	$0108,8		;MODULOS PLANS PAIRS
	DC.W 	$010A,8		;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

	DC.W $0180,$0000


DC.W $8001,$FFFE

DC.W $0100,$1200
DC.W $0180,$0222

DC.W $8001+[70*$100],$FFFE
DC.W $0100,$0000
DC.W $0180,$0000

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