;
;[1m[32m        ____     ___        ___     ___ ___ ___ ___ ____      ___ ___ ___[0m
;[1m[32m         /  /__//_         /__ /  //_ //__ /  //_    /  / / //_ //__//_  [0m
;[1m[32m        /  /  //__        ___//__//__/___//__//     /  /_/_//  //  \/__  [0m
;
;[1m[32m-----------------------------------------------------------------------------[0m
;   - FOR ABO'S CONTACT US AT:   BP:28 1170 WATERMAEL-BOITSFORT 1 BELGIUM!!...
;
;[1m[32m-----------------------------------------------------------------------------[0m
;                           - DON'T SEND ANY DISKS -
;
;[1m[32m-----------------------------------------------------------------------------[0m
;
;
;
;                      [33m THE LEGENDARY >> SUBSOFTWARE << IN 87/88/89/90/91!!...
;                      [1m[32m ------------------------------------------------------
;
;
; ************************************
; * Wave                             *
; * Affiche et déplace des barres de *
; * rasters copper                   *
; ************************************
; * par J. Etienne pour ANT          *
; ************************************

; ************************************
; * Définition des registres hard    *
; ************************************
custom	EQU	$dff000
ciaapra	EQU	$bfe001
key	EQU	$bfec01

color	EQU	$180
color00	EQU	color+00*2
color17	EQU	color+17*2
color18	EQU	color+18*2
color19	EQU	color+19*2
dmacon	EQU	$096
cop1lc	EQU	$080
copjmp1	EQU	$088
vposr	EQU	$004
diwstrt	EQU	$08e
diwstop	EQU	$090
ddfstrt	EQU	$092
ddfstop	EQU	$094
bplcon0	EQU	$100
bplcon1	EQU	$102
bplcon2	EQU	$104

; ************************************
; * Fonctions d'exec.library         *
; ************************************
_LVOOpenLibrary=-552
_LVOCloseLibrary=-414
_LVOForbid=-132
_LVOPermit=-138

; ************************************
; * Petite macro utile               *
; ************************************
CALLSYS	MACRO
	jsr	_LVO\1(a6)
	ENDM

; ************************************
; * Variables                        *
; ************************************
nb_coul	EQU	$10	; doit être multiple de 4
nb_line	EQU	200	; doit être multiple de 4
cl_size	EQU	nb_line*8+4
nb_bar	EQU	15

space_between_line=7
raywave	EQU	80
oy_wave	EQU	100
max_speed_wave=10

; ************************************
; * Début du programme               *
; * on s'approprie le hardware       *
; ************************************
Start	move.l	$4.w,a6
	lea	custom,a5	; adresse des chips dans a5
	lea	bar_colors,a4	; adresse de la palette dans a4

	CALLSYS	Forbid	; bloque le multitâche

	bsr	compute_sin_tab	; calcule la table des sinus
	bsr	build_cl	; construit la CopperList
	bsr	init_wave	; initialise les barres

	move.w	#$03e0,dmacon(a5)	; dma bloqué
	move.l	#newcopper,cop1lc(a5)	; init coplist
	move.w	#0,copjmp1(a5)
	move.w	#$8380,dmacon(a5)	; dma copper et bitplane on

; ************************************
; * Boucle principale - fin avec ESC *
; ************************************
Loop	move.l	vposr(a5),d2	;
	and.l	#$0001ff00,d2	; attend le VBL
	cmp.l	#$00010100,d2	;   (vsync)
	bne.s	Loop	;

	lea	cl_adr,a0	; adr de la coplist origine
	addq.l	#6,a0	; pointe la première barre
	moveq	#nb_line/4-1,d0	; taille de la liste -1
	moveq	#0,d1	; inscrit des 0
loop_clear_cl:
	move.w	d1,(a0) 
	move.w	d1,8(a0)
	move.w	d1,$10(a0)
	move.w	d1,$18(a0)
	lea	$20(a0),a0	; a0 pointe la barre suivante
	dbf	d0,loop_clear_cl

	lea	cur_coor_wave(pc),a1
	moveq	#nb_bar-1,d2
each_bar:
	move.w	(a1),d3
	add.w	speed_wave(pc),d3
	cmp.w	#tab_y_wave_size,d3
	blt.s	not_change_cur_coor_wave
	sub.w	#tab_y_wave_size,d3
not_change_cur_coor_wave:
	move.w	d3,(a1)+

	moveq	#0,d0
	lea	tab_y_wave(pc),a0
	move.b	(a0,d3.w),d0	; coordonnée de la barre

	lea	cl_adr,a0	; adr de la coplist
	lsl.w	#3,d0	; calcule l'adr du y à modifer
	addq.w	#6,d0
	add.l	d0,a0

	move.w	00(a4),$00(a0)	; Répéter nb_coul fois
	move.w	02(a4),$08(a0)
	move.w	04(a4),$10(a0)
	move.w	06(a4),$18(a0)
	move.w	08(a4),$20(a0)
	move.w	10(a4),$28(a0)
	move.w	12(a4),$30(a0)
	move.w	14(a4),$38(a0)
	move.w	16(a4),$40(a0)
	move.w	18(a4),$48(a0)
	move.w	20(a4),$50(a0)
	move.w	22(a4),$58(a0)
	move.w	24(a4),$60(a0)
	move.w	26(a4),$68(a0)
	move.w	28(a4),$70(a0)

	dbf	d2,each_bar

; clavier
	move.b	key,d0	;
	not	d0	; teste le clavier
	ror.b	#1,d0	;

	cmp.b	#$4e,d0	; flèche gauche ?
	bne.s	not_inc_speed_wave
	cmp.w	#max_speed_wave,speed_wave
	bge.s	not_inc_speed_wave
	addq.w	#1,speed_wave
	bra	Loop

not_inc_speed_wave:
	cmp.b	#$4f,d0	; flèche droite ?
	bne.s	not_dec_speed_wave
	cmp.w	#0,speed_wave
	ble.s	not_dec_speed_wave
	subq.w	#1,speed_wave
	bra	Loop

not_dec_speed_wave:
	cmp.b	#$45,d0	; ESCape ?
	bne	Loop

; ************************************
; * Fin du programme. Retour au CLI  *
; ************************************
Ciao	lea	gfxname(pc),a1
	moveq	#0,d0
	CALLSYS	OpenLibrary
	move.l	d0,a1
	move.l	38(a1),cop1lc(a5)
	clr.w	copjmp1(a5)
	CALLSYS	CloseLibrary

	move.w	#$83e0,dmacon(a5) 	; réactivation des canaux dma
	CALLSYS	Permit

fin	moveq	#0,d0	; Retour au CLI
	rts

; ************************************
; * Initialise le tableau des barres *
; ************************************
init_wave:
	lea	cur_coor_wave(pc),a0
	moveq	#nb_bar-1,d0
	moveq	#0,d1

loop_init_cur_coor_wave:
	move.w	d1,(a0)+
	add.l	#space_between_line,d1
	dbf	d0,loop_init_cur_coor_wave

	lea	tab_y_wave(pc),a1
	move.l	#360-1,d2
	moveq	#0,d1
loop_init_tab_y_wave:
	move.l	d1,d0
	bsr	sin
	muls	#raywave,d0
	lsl.l	#1,d0
	swap	d0
	add.b	#oy_wave,d0
	move.b	d0,(a1)+
	addq.l	#4,d1
	dbf	d2,loop_init_tab_y_wave
	rts

; ************************************
; * Construit la CopperList          *
; ************************************
build_cl:
	lea	cl_adr,a0	; adr de la coplist origine
	move.w	#nb_line-1,d0	; taille de la liste -1
	moveq	#0,d1	; ligne de depart
loop_build_cl:
	move.b	d1,(a0)+	; wait y
	move.b	#$0f,(a0)+	; wait x
	move.w	#$fffe,(a0)+	; wait mask
	move.w	#color00,(a0)+	; move.w adr
	move.w	#0,(a0)+	; move.w data
	addq.w	#1,d1	; 1 ligne traite en +
	dbf	d0,loop_build_cl
	move.l	#$fffffffe,(a0)+ 	; la fin de la liste
	rts

; ************************************
; * Retourne le sinus de d0 dans d0  *
; ************************************
cos:	add.w	#360,d0	; principe: cos(d0) = sin(d0+360)
sin:	cmp.w	#360*4,d0	; angle sup ou equ a 360*4
	blt.s	sin1
	sub.w	#360*4,d0
	bra.s	sin
sin1:	tst.w	d0	; negatif ?
	bpl	sin2
	add.w	#360*4,d0
	bra.s	sin1
sin2:	lea	sin_tab_adr(pc),a0
	lsl.l	#1,d0
	move.w	(a0,d0.w),d0	; d0 = cos ou sin
	rts

; ************************************
; * Calcule la tables des sinus à    *
; * partir des valeurs déjà connues  *
; ************************************
compute_sin_tab:
sin_tab_size=360*2*4
	lea	sin_tab,a0
	lea	sin_tab_adr(pc),a1
	move.w	#360-1,d0
copy_sin_tab:
	move.w	(a0)+,(a1)+
	dbf	d0,copy_sin_tab

; calcule le reste de la table

;	sintab 	90-180
	lea	sin_tab_adr(pc),a0	; a1 pointe sur le degr 180
	lea	(360+360+1)*2(a0),a1
	move.w	#$7fff,360*2(a0)	; place degr 90
	move.l	#360-1,d0	; copie 90 valeurs
copy_90_180:		; principe: sin 0= sin 180
	move.w	(a0)+,-(a1)	; sin 1= sin 179
	dbf	d0,copy_90_180	; sin 2= sin 178 etc...

;	sintab 	180-270
	lea	sin_tab_adr(pc),a0	; a0 pointe sur 0 degr
	lea	720*2(a0),a1	; a1 pointe sur 180 degr
	move.l	#360-1,d0	; copie 90 valeurs
	moveq	#0,d2
copy_180_270:
	moveq	#1,d1	;\
	swap	d1	;/d1=$10000
	move.w	(a0)+,d2	;
	sub.l	d2,d1	;
	move.w	d1,(a1)+	;d1= $10000-d2
	dbf	d0,copy_180_270

;	sintab 	270-359
	lea	sin_tab_adr(pc),a0	; a0 pointe sur 0 degr
	lea	720*2(a0),a0	; a1 pointe sur le degr 360
	lea	(360+360)*2(a0),a1
	move.w	#$8000,360*2(a0)	; place degr 270
	lea	2(a0),a0
	move.l	#359-1,d0	; copie 89 valeurs
copy_270_359:		; principe: sin 360=sin 180
	move.w	(a0)+,-(a1)	; sin 359= sin 181
	dbf	d0,copy_270_359	; sin 358= sin 182 etc...
	rts
	 
; ************************************
; * Variables                        *
; ************************************
speed_wave	dc.w 1
cur_coor_wave	dcb.w nb_bar*2,0

tab_y_wave	dcb.b 180*2
end_tab_y_wave	EQU *
tab_y_wave_size	EQU end_tab_y_wave-tab_y_wave

gfxname	dc.b	"graphics.library",0
	even

; ************************************
; * Palette des barres de couleur    *
; ************************************
bar_colors:
	dc.w	$0100,$0300,$0500,$0700
	dc.w	$0900,$0b00,$0d00,$0f00
	dc.w	$0e00,$0c00,$0a00,$0800
	dc.w	$0600,$0400,$0200,$0000

; ************************************
; * valeurs des sin*32768 de 0 à 90  *
; 4 valeurs pr 1 deg                 *
; ************************************
sin_tab	dc.w	$0000,$008E,$011D,$01AC
	dc.w	$023B,$02CA,$0359,$03E8
	dc.w	$0477,$0506,$0595,$0624
	dc.w	$06B2,$0741,$07D0,$085E
	dc.w	$08ED,$097C,$0A0A,$0A99
	dc.w	$0B27,$0BB6,$0C44,$0CD2
	dc.w	$0D60,$0DEF,$0E7D,$0F0B
	dc.w	$0F99,$1026,$10B4,$1142
	dc.w	$11D0,$125D,$12EA,$1378
	dc.w	$1405,$1492,$151F,$15AC
	dc.w	$1639,$16C6,$1752,$17DF
	dc.w	$186B,$18F8,$1984,$1A10
	dc.w	$1A9C,$1B28,$1BB3,$1C3F
	dc.w	$1CCA,$1D55,$1DE0,$1E6B
	dc.w	$1EF6,$1F81,$200B,$2096
	dc.w	$2120,$21AA,$2234,$22BD
	dc.w	$2347,$23D0,$2459,$24E2
	dc.w	$256B,$25F4,$267C,$2704
	dc.w	$278C,$2814,$289C,$2923
	dc.w	$29AB,$2A32,$2AB9,$2B3F
	dc.w 	$2BC6,$2C4C,$2CD2,$2D58
	dc.w	$2DDD,$2E63,$2EE8,$2F6D
	dc.w	$2FF1,$3076,$30FA,$317E
	dc.w	$3202,$3285,$3309,$338B
	dc.w	$340E,$3491,$3513,$3595
	dc.w	$3617,$3698,$3719,$379A
	dc.w	$381B,$389B,$391B,$399B
	dc.w	$3A1A,$3A9A,$3B19,$3B97
	dc.w	$3C16,$3C94,$3D12,$3D8F
	dc.w	$3E0C,$3E89,$3F06,$3F82
	dc.w 	$3FFE,$407A,$40F5,$4170
	dc.w	$41EB,$4265,$42DF,$4359
	dc.w	$43D2,$444B,$44C4,$453D
	dc.w	$45B5,$462C,$46A4,$471B
	dc.w	$4791,$4808,$487E,$48F3
	dc.w	$4969,$49DE,$4A52,$4AC6
	dc.w	$4B3A,$4BAE,$4C21,$4C94
	dc.w	$4D06,$4D78,$4DEA,$4E5B
	dc.w	$4ECC,$4F3C,$4FAC,$501C
	dc.w	$508B,$50FA,$5169,$51D7
	dc.w 	$5244,$52B2,$531F,$538B
	dc.w	$53F7,$5463,$54CE,$5539
	dc.w	$55A4,$560E,$5677,$56E0
	dc.w	$5749,$57B2,$5819,$5881
	dc.w	$58E8,$594F,$59B5,$5A1B
	dc.w	$5A80,$5AE5,$5B49,$5BAD
	dc.w	$5C11,$5C74,$5CD6,$5D39
	dc.w	$5D9A,$5DFC,$5E5C,$5EBD
	dc.w	$5F1D,$5F7C,$5FDB,$603A
	dc.w	$6098,$60F5,$6152,$61AF
	dc.w 	$620B,$6267,$62C2,$631C
	dc.w	$6377,$63D0,$642A,$6482
	dc.w	$64DB,$6532,$658A,$65E1
	dc.w	$6637,$668D,$66E2,$6737
	dc.w	$678B,$67DF,$6832,$6885
	dc.w	$68D7,$6929,$697A,$69CB
	dc.w	$6A1B,$6A6B,$6ABA,$6B08
	dc.w	$6B57,$6BA4,$6BF1,$6C3E
	dc.w	$6C8A,$6CD5,$6D20,$6D6B
	dc.w	$6DB5,$6DFE,$6E47,$6E8F
	dc.w 	$6ED7,$6F1E,$6F65,$6FAB
	dc.w	$6FF0,$7035,$707A,$70BE
	dc.w	$7101,$7144,$7186,$71C8
	dc.w	$7209,$724A,$728A,$72CA
	dc.w	$7308,$7347,$7385,$73C2
	dc.w	$73FF,$743B,$7476,$74B1
	dc.w	$74EC,$7526,$755F,$7598
	dc.w	$75D0,$7607,$763E,$7675
	dc.w	$76AB,$76E0,$7715,$7749
	dc.w	$777C,$77AF,$77E2,$7813
	dc.w 	$7845,$7875,$78A5,$78D5
	dc.w	$7903,$7932,$795F,$798C
	dc.w	$79B9,$79E5,$7A10,$7A3B
	dc.w	$7A65,$7A8E,$7AB7,$7AE0
	dc.w	$7B07,$7B2E,$7B55,$7B7B
	dc.w	$7BA0,$7BC5,$7BE9,$7C0C
	dc.w	$7C2F,$7C52,$7C73,$7C94
	dc.w	$7CB5,$7CD5,$7CF4,$7D12
	dc.w	$7D31,$7D4E,$7D6B,$7D87
	dc.w	$7DA3,$7DBD,$7DD8,$7DF2
	dc.w 	$7E0B,$7E23,$7E3B,$7E52
	dc.w	$7E69,$7E7F,$7E95,$7EA9
	dc.w	$7EBE,$7ED1,$7EE4,$7EF7
	dc.w	$7F08,$7F19,$7F2A,$7F3A
	dc.w	$7F49,$7F58,$7F66,$7F73
	dc.w	$7F80,$7F8C,$7F97,$7FA2
	dc.w	$7FAD,$7FB6,$7FBF,$7FC8
	dc.w	$7FD0,$7FD7,$7FDD,$7FE3
	dc.w	$7FE9,$7FED,$7FF1,$7FF5
	dc.w	$7FF8,$7FFA,$7FFB,$7FFC

sin_tab_adr:
	dcb.b	sin_tab_size,0

; ************************************
	section	chip,data_c

newcopper:
	dc.w	diwstrt,$2981,diwstop,$29c1
	dc.w	ddfstrt,$0038,ddfstop,$00d0
	dc.w	bplcon0,$0000,bplcon1,$0000
	dc.w	bplcon2,$0000
cl_adr:	dcb.b	nb_line*8
	dc.l	-2

; ************************************

	END

