Obligement - L'Amiga au maximum

Samedi 20 avril 2024 - 00:31  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

Actualité (récente)
Actualité (archive)
Comparatifs
Dossiers
Entrevues
Matériel (tests)
Matériel (bidouilles)
Points de vue
En pratique
Programmation
Reportages
Quizz
Tests de jeux
Tests de logiciels
Tests de compilations
Trucs et astuces
Articles divers

Articles in english


Réseaux sociaux

Suivez-nous sur X




Liste des jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z,
ALL


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : Assembleur - Défilement Kick Off
(Article écrit par Jérôme Étienne et extrait d'Amiga News Tech - novembre 1991)


Le mois dernier, je vous avais promis le défilement le plus rapide possible. Voici qui est prometteur, mais beaucoup d'entre vous se sont peut-être dit que ce n'était là qu'un moyen malhonnête d'attirer l'attention du lecteur...

Je viens de me rendre compte qu'il est possible que certains croient que je parle de la technique très répandue dans le domaine des démos, qui consiste à créer un gros plan de bits et à faire bouger l'écran dessus... Cette pratique est non seulement très simple à programmer, mais aussi très rapide en temps d'exécution (en fait, plus rapide que la technique dite Kick Off), mais les contraintes mémoire qu'elle entraîne la rendent inutilisable dans un jeu digne de ce nom.

Le gros avantage du défilement que je vais vous décrire, provient du fait qu'il permet de ne gérer que les nouveaux blocs de 16x16 pixels et donc, si l'on n'affiche que le strict nécessaire, on ne peut pas faire moins (à l'exception de ne rien faire, et pour cela je ne connais que la technique du gros plan de bits).

Après cette introduction, je vais vous expliquer plus précisément comment programmer un tel défilement et quelles sont ses limites.

Le principe

Tout d'abord, le défilement horizontal. L'écran doit être défini à la taille voulue, en ajoutant un modulo de deux octets permettant d'utiliser le défilement matériel (registre BPLCON1). Pour procéder au défilement, on calcule la direction en comparant la position actuelle (variables ori_x, ori_y) à l'ancienne (variables old_ori_x, old_ori_y). Si le défilement va vers la droite, on affiche une nouvelle colonne de blocs à droite de l'écran et s'il va vers la gauche, on l'affiche devinez où ? Eh bien oui, à gauche, bien joué, vous reviendrez en deuxième semaine.

Pour voir le défilement bouger, on incrémente les pointeurs plans de bits pour la droite et on les décrémente pour la gauche, mais uniquement quand cela est nécessaire, c'est-à-dire tous les 16 pixels. Le spectateur a ainsi l'impression que l'écran tout entier bouge dans la direction voulue. Comme vous l'avez sûrement deviné, on peut aller très loin dans la mémoire comme cela et c'est en effet le seul défaut de cette technique : il n'est pas infini en horizontal. Par exemple, pour un défilement sur 80 écrans de large, il faut prévoir 80 lignes supplémentaires en bas de la page. Ce défaut n'est pas vraiment excessif, compte tenu des avantages. De plus, avec le double tampon mémoire qui est nécessaire dans la majorité des jeux ou autres applications, nous ne sommes pas forcés d'avoir deux fois ce supplément. En effet, quand une page va descendre, l'autre aussi, donc si on espace un peu les deux pages pour ne pas qu'elles se chevauchent au moment des changements de direction, le supplément de ligne n'est que de 80 pour les deux pages.

Passons maintenant au défilement vertical, qui est lui plus efficace car infini. Il est en fait la partie forte de la technique grâce à la manière originale dont il est géré. Il a besoin pour pouvoir s'exprimer pleinement, d'une hauteur de champ de jeu ("playfield") égale à celle de l'écran plus 16 pixels. Tout se fait grâce au Copper : quand le défilement descend, on fait descendre le pointeur des plans de bits sur la page. Après avoir descendu 16 pixels, la page n'est plus assez grande pour descendre encore de cette manière. Quand le défilement est dans cette position, on remarque que l'on ne se sert pas des 16 premiers pixels de la page, donc la ruse consiste à afficher la nouvelle ligne de blocs à cet endroit. Pour donner l'illusion au spectateur que le défilement continue normalement, on interrompt au moment opportun le balayage-écran avec le Copper pour changer les pointeurs qui montrent la zone contenant les nouveaux blocs.

Dans cette posture, on peut encore descendre de 16 pixels. Arrivé à cette nouvelle limite, on affiche encore une nouvelle ligne en bas de l'écran, donc en fait sur le haut de la page, entre les lignes 16 et 32, et ainsi de suite pour le reste de la descente.

Quand le premier pointeur arrive en bas de la page, on le fait remonter tout en haut et on peut continuer comme cela très longtemps. Pour faire monter le défilement, le procédé est identique, à l'exception du pointeur plan de bits qui monte et de la nouvelle ligne de blocs qui est affichée en haut de l'écran.

On détecte dans un premier temps la direction de la même manière que dans le défilement horizontal pour savoir si on affiche une ligne de blocs en haut ou en bas de l'écran.

Réalisation

Ceux qui ont tout suivi se sont très probablement aperçus que le défilement vertical empêchait l'utilisation du défilement horizontal tel qu'il a été décrit plus haut. Pour avoir un défilement multidirectionnel, il faut obtenir une parfaite compatibilité entre les deux. Pour ce faire, on va modifier le défilement horizontal et plus précisément la routine qui affiche les nouvelles colonnes : on fait en sorte que le premier bloc de la colonne s'affiche à l'endroit que montre le premier pointeur plan de bits. On affiche chaque bloc en dessous de l'autre, en testant à chaque fois si l'on arrive en bas de la page ; si oui, on affiche les prochains blocs en haut de la page. De cette façon, on peut avoir un défilement tout à fait intéressant, car il permet un déplacement de 16 pixels en X et en Y simultanément, le tout en cinquante lignes de trame (rasterlines) pour un écran de 320x256 en 4 plans de bits.

Dans le cas de l'utilisation du double tampon mémoire, le pas maximum descend à 8 pixels en X et en Y.

	OPT	C-	

	incdir	'include:'
	include	'exec/exec_lib.i'
	include	'hardware/custom.i'

custom		=	$dff000
execbase	=	4

BPL_X		=	320
BPL_Y		=	192
BPL_DEPTH	=	4
MODULO		=	2
BPL_WIDTH	=	BPL_X/8+MODULO
BPL_SIZE	=	BPL_WIDTH*BPL_Y
SCR_SIZE	=	BPL_SIZE*BPL_DEPTH
MAP_WIDTH	=	35
MAP_HEIGHT	=	35
BLK_WIDTH	=	16
BLK_HEIGHT	=	16
SCROLL_SPEED	=	8
vsync:	macro
.wait_vsync\@:
	move.l	vposr(a5),d0
	and.l	#$1ff00,d0
	cmp.l	#$11000,d0
	bne.s	.wait_vsync\@
	endm

wait_blt:	macro
	btst	#14,dmaconr(a5)
.loop_wait_blt\@:
	btst	#14,dmaconr(a5)
	bne.s	.loop_wait_blt\@
	endm

MOD:	MACRO	\1,\2		* \1 chiffre a moduler   \2 la base du modulo	
.MODULO_GO_ON\@:
	cmp.w	\2,\1
	blt.s	.MODULO_IS_FINISH\@
	sub.w	\2,\1
	bra.s	.MODULO_GO_ON\@
.MODULO_IS_FINISH\@:
	ENDM

******************************************************
**************  programme principal  *****************
******************************************************
	move.l	(execbase).w,a6
	lea	custom,a5

	CALLEXEC	Forbid
	move.w	#$03e0,dmacon(a5)	* all dma off except disk

	move.w	#(BPL_DEPTH<<12)+$200,bplcon0(a5)
	clr.w	bplcon1(a5)
	clr.w	bplcon2(a5)		
	move.w	#BPL_WIDTH*(BPL_DEPTH-1),bpl1mod(a5)
	move.w	#BPL_WIDTH*(BPL_DEPTH-1),bpl2mod(a5)

	move.w	#$2981,diwstrt(a5)	*\ 
	move.w	#$e9c0,diwstop(a5)	* > init un ecran 320*192
	move.w	#$0030,ddfstrt(a5)	* > avec un mot en plus pour
	move.w	#$00d0,ddfstop(a5)	*/  le shift


	bsr	build_coplist		
	
	move.l	coplist_adr,cop1lc(a5)	* > run my coplist
	clr.w	copjmp1(a5)		*/
	
	move.w	#$83c0,dmacon(a5)	* dma blitter,copper & plan de bits on
	
	move.w	#$f00,color+15*2(a5)
	move.w	#$0f0,color+1*2(a5)
	move.w	#$00f,color+6*2(a5)

	bsr	INIT_FIRST_SCR

main_loop:
	vsync
	move.w	#-1,color(a5)

		

	bsr	INIT_SCR_PT_ADR
	bsr	SCROLL
	bsr	build_coplist		

	bsr	CHANGE_DIRECTION_WITH_KEYBOARD


	tst.w	ORI_X
	bge.s	.ORI_X_NE_SORT_PAS_A_GAUCHE
	clr.w	ORI_X
.ORI_X_NE_SORT_PAS_A_GAUCHE
	cmp.w	#MAP_WIDTH*16-BPL_X-1,ORI_X
	ble.s	.ORI_X_NE_SORT_PAS_A_DROITE
	move.w	#MAP_WIDTH*16-BPL_X-1,ORI_X
.ORI_X_NE_SORT_PAS_A_DROITE
	tst.w	ORI_Y
	bge.s	.ORI_Y_NE_SORT_PAS_EN_HAUT
	clr.w	ORI_Y
.ORI_Y_NE_SORT_PAS_EN_HAUT
	cmp.w	#MAP_HEIGHT*16-BPL_Y-1,ORI_Y
	ble.s	.ORI_Y_NE_SORT_PAS_EN_BAS
	move.w	#MAP_HEIGHT*16-BPL_Y-1,ORI_Y
.ORI_Y_NE_SORT_PAS_EN_BAS

	clr.w	color(a5)
	move.b	$bfec01,d0	*\
	not	d0		* >capture the key wich is pressed
	ror.b	#1,d0		*/ and put is code RAW in d0
	cmp.b	#$45,d0		*\
	beq	init_end	*/ sort si on press sur esc
	btst	#6,$bfe001
	bne	main_loop
******** init end ***********
*	reactivation de l'old coplist
init_end:
	wait_blt
	lea	GfxName(pc),a1		* nom de la library ds a1
	moveq	#0,d0			* version 0 (the last)
	CALLEXEC	OpenLibrary	* lib graphique ouverte
	move.l	d0,a4			* adr de graphicbase ds a4
	move.l	38(a4),cop1lc(a5)	* chargement de l'adr de
	clr.w	copjmp1(a5)		* l'old coplist et lancement

	move.w	#$83e0,dmacon(a5)	* activation des canaux dma necessaires
	CALLEXEC	Permit		* multi switching autorise
	
fin:	moveq	#0,d0	* flag d'erreur desactive
	rts
GfxName:		dc.b	"graphics.library",0
	even

CHANGE_DIRECTION_WITH_KEYBOARD: ******************************************
	move.b	$bfec01,d0	*\
	not	d0		* >capture the key wich is pressed
	ror.b	#1,d0		*/ and put is code RAW in d0
	ext.w	d0
	lea	TAB_DELTA_X_Y_ACOORDING_TO_KEYBOARD,a0
.TRY_ANOTHER_KEY:
	tst.w	(a0)
	blt.s	.TST_KEY_FINISH
	cmp.w	(a0),d0
	bne.s	.NOT_THIS_KEY
	move.w	2(a0),d0
	add.w	d0,ORI_X
	move.w	4(a0),d0
	add.w	d0,ORI_Y
	bra.s	.TST_KEY_FINISH
.NOT_THIS_KEY:
	addq.l	#6,a0	
	bra.s	.TRY_ANOTHER_KEY
.TST_KEY_FINISH:
	rts
s	SET	SCROLL_SPEED
TAB_DELTA_X_Y_ACOORDING_TO_KEYBOARD:
	dc.w	$3f,s,-s,$3e,0,-s,$3d,-s,-s,$2d,-s,0,$2f,s,0,$1d,-s,s
	dc.w	$1e,0,s,$1f,s,s
	dc.w	-1
**************************************** END_CHANGE_DIRECTION_WITH_KEYBOARD


INIT_SCR_PT_ADR: *******************************************************
	move.l	LOG_SCR_ADR,a0
	move.w	ORI_X,d0
	and.w	#$fff0,d0
	lsr.w	#3,d0
	lea	(a0,d0.w),a0
	move.l	a0,SCR_PT_ADR
	rts
***************************************************** END_INIT_SCR_PT_ADR

SCROLL: **************************************************************
	move.w	ORI_Y,d0
	move.w	#BPL_Y+BLK_HEIGHT,d1
	MOD	d0,d1
	move.w	d0,START_FIRST_PART
	neg.w	d0
	add.w	#BPL_Y+BLK_HEIGHT,d0
	cmp.w	#BPL_Y,d0
	ble.s	.FIRST_PART_SIZE_NOT_BIGGER_THAN_SCREEN
	move.w	#BPL_Y,d0
.FIRST_PART_SIZE_NOT_BIGGER_THAN_SCREEN
	move.w	d0,FIRST_PART_SIZE


	move.w	ORI_Y,d0
	add.w	#BPL_Y,d0
	move.w	#BPL_Y+BLK_HEIGHT,d1
	MOD	d0,d1
	move.w	d0,END_SECOND_PART
	
	lea	MAP,a0
	move.w	ORI_X,d0
	lsr.w	#4,d0
	lea	(a0,d0.w),a0
	move.w	ORI_Y,d0
	lsr.w	#4,d0
	mulu	#MAP_WIDTH,d0
	add.l	d0,a0
	move.l	a0,MAP_PT

* on init les registres blitter qui resteront ainsi durant toute la routine
	WAIT_BLT
	move.w	#$09f0,BLTCON0(a5)
	clr.w	BLTCON1(a5)
	move.w	#-1,BLTAFWM(a5)
	move.w	#-1,BLTALWM(a5)
	move.w	#BPL_WIDTH-2,BLTDMOD(a5)
	clr.w	BLTAMOD(a5)


* maintenant on affiche les blk pour le scroll en x
	move.w	ORI_X,d0
	cmp.w	OLD_ORI_X,d0
	ble.s	.DONT_SCROLL_TOWARD_RIGHT	
	move.w	OLD_ORI_X,d0
	add.w	#BPL_X-1,d0
	and.w	#$fff0,d0
	move.w	ORI_X,d1
	add.w	#BPL_X-1,d1
	and.w	#$fff0,d1
	cmp.w	d0,d1
	beq.s	.DONT_SCROLL_TOWARD_RIGHT
	move.l	SCR_PT_ADR,a0
	move.w	START_FIRST_PART,d0
	and.w	#$fff0,d0
	mulu	#BPL_WIDTH*BPL_DEPTH,d0
	add.l	d0,a0
	lea	BPL_WIDTH-MODULO(a0),a0
	move.l	MAP_PT,a1
	add.l	#BPL_X/16,a1
	bsr	AFF_A_COLUMM_OF_BLK
.DONT_SCROLL_TOWARD_RIGHT:	
	move.w	ORI_X,d0
	cmp.w	OLD_ORI_X,d0
	bge.s	.DONT_SCROLL_TOWARD_LEFT	
	move.w	OLD_ORI_X,d0
	and.w	#$fff0,d0
	move.w	ORI_X,d1
	and.w	#$fff0,d1
	cmp.w	d0,d1
	beq.s	.DONT_SCROLL_TOWARD_LEFT
	move.l	SCR_PT_ADR,a0
	move.w	START_FIRST_PART,d0
	and.w	#$fff0,d0
	mulu	#BPL_WIDTH*BPL_DEPTH,d0
	add.l	d0,a0
	move.l	MAP_PT,a1
	bsr	AFF_A_COLUMM_OF_BLK
.DONT_SCROLL_TOWARD_LEFT:	



* maintenant on affiche les blk pour le scroll en y
	move.w	ORI_Y,d0
	cmp.w	OLD_ORI_Y,d0
	ble.s	.DONT_SCROLL_TOWARD_DOWN	
	move.w	OLD_ORI_Y,d0
	add.w	#BPL_Y-1,d0
	and.w	#$fff0,d0
	move.w	ORI_Y,d1
	add.w	#BPL_Y-1,d1
	and.w	#$fff0,d1
	cmp.w	d0,d1
	beq.s	.DONT_SCROLL_TOWARD_DOWN
	move.l	SCR_PT_ADR,a0
	move.w	END_SECOND_PART,d0
	and.w	#$fff0,d0
	mulu	#BPL_WIDTH*BPL_DEPTH,d0
	add.l	d0,a0
	move.l	MAP_PT,a1
	add.l	#(BPL_Y/16)*MAP_WIDTH,a1
	bsr	AFF_A_LINE_OF_BLK
.DONT_SCROLL_TOWARD_DOWN:	
	move.w	ORI_Y,d0
	cmp.w	OLD_ORI_Y,d0
	bge.s	.DONT_SCROLL_TOWARD_UP	
	move.w	OLD_ORI_Y,d0
	and.w	#$fff0,d0
	move.w	ORI_Y,d1
	and.w	#$fff0,d1
	cmp.w	d0,d1
	beq.s	.DONT_SCROLL_TOWARD_UP
	move.l	SCR_PT_ADR,a0
	move.w	START_FIRST_PART,d0
	and.w	#$fff0,d0
	mulu	#BPL_WIDTH*BPL_DEPTH,d0
	add.l	d0,a0
	move.l	MAP_PT,a1
	bsr	AFF_A_LINE_OF_BLK
.DONT_SCROLL_TOWARD_UP:	

	
	
	move.w	ORI_X,OLD_ORI_X
	move.w	ORI_Y,OLD_ORI_Y
	rts
	
ORI_X:	 	ds.w	1		*\ coor du coin en haut a gauche
ORI_Y:		ds.w	1		*/
OLD_ORI_X:	ds.w	1
OLD_ORI_Y:	ds.w	1
START_FIRST_PART:	ds.w	1
END_SECOND_PART:	ds.w	1
FIRST_PART_SIZE:	ds.w	1
MAP_PT:			ds.l	1
************************************************************ END_SCROLL

AFF_A_COLUMM_OF_BLK:  ***********************************************
* IN: a0= adr ou on va poser les blk
*     a1= adr de la map ou on va chercher quel blk afficher
* OUT: rien
	lea	TAB_ADR_BLK_GFX,a2
	moveq	#0,d2
	move.w	#BPL_Y/16-1+1,d0
.LOOP_AFF_EACH_BLK:
	move.b	(a1),d1
	lea	MAP_WIDTH(a1),a1
	ext.w	d1
	lsl.w	#2,d1
	move.l	(a2,d1.w),d1
	WAIT_BLT
	move.l	a0,BLTDPT(a5)
	move.l	d1,BLTAPT(a5)
	move.w	#BLK_HEIGHT*BPL_DEPTH*64+BLK_WIDTH/16,BLTSIZE(a5)
	lea	BLK_HEIGHT*BPL_WIDTH*BPL_DEPTH(a0),a0
	tst.w	d2
	bne.s	.SECOND_PART_ALREADY_BEGIN	
	move.l	SCR_PT_ADR,a3
	add.l	#(BPL_Y+BLK_HEIGHT-1)*BPL_WIDTH*BPL_DEPTH,a3
	cmp.l	a3,a0
	ble.s	.FIRST_PART_NOT_TOTALLY_PRINT
	sub.l	#(BPL_Y+BLK_HEIGHT)*BPL_WIDTH*BPL_DEPTH,a0
	moveq	#-1,d2
.SECOND_PART_ALREADY_BEGIN	
.FIRST_PART_NOT_TOTALLY_PRINT:

	dbf	d0,.LOOP_AFF_EACH_BLK
	
	rts
************************************************** END_AFF_A_COLUMM_OF_BLK

AFF_A_LINE_OF_BLK:  ******************************************************
* IN: a0= adr ou on va poser les blk
*     a1= adr de la map ou on va chercher quel blk afficher
* OUT: rien
	lea	TAB_ADR_BLK_GFX,a2
	moveq	#BPL_WIDTH/2-1,d0
.LOOP_AFF_EACH_BLK:
	move.b	(a1)+,d1
	ext.w	d1
	lsl.w	#2,d1
	move.l	(a2,d1.w),d1
	WAIT_BLT
	move.l	a0,BLTDPT(a5)
	move.l	d1,BLTAPT(a5)
	move.w	#BLK_HEIGHT*BPL_DEPTH*64+BLK_WIDTH/16,BLTSIZE(a5)
	addq.l	#BLK_WIDTH/8,a0
	dbf	d0,.LOOP_AFF_EACH_BLK
	rts
************************************************** END_AFF_A_LINE_OF_BLK

INIT_FIRST_SCR: **********************************************************
	clr.w	ORI_X
	clr.w	ORI_Y
	clr.w	OLD_ORI_X
	clr.w	OLD_ORI_Y
* on init les registres blitter qui resteront ainsi durant toute la routine
	WAIT_BLT
	move.w	#$09f0,BLTCON0(a5)
	clr.w	BLTCON1(a5)
	move.w	#-1,BLTAFWM(a5)
	move.w	#-1,BLTALWM(a5)
	move.w	#BPL_WIDTH-2,BLTDMOD(a5)
	clr.w	BLTAMOD(a5)

* maintenant on affiche le premier ecran
	move.l	LOG_SCR_ADR,a0
	move.l	PHY_SCR_ADR,a3
	lea	MAP,a1
	lea	TAB_ADR_BLK_GFX,a2
	moveq	#BPL_Y/16+1-1,d2
.LOOP_AFF_EACH_LINE:
	move.w	#BPL_WIDTH/2-1,d0
.LOOP_AFF_EACH_BLK:
	move.b	(a1)+,d1
	ext.w	d1
	lsl.w	#2,d1
	move.l	(a2,d1.w),d1
	WAIT_BLT
	move.l	a0,BLTDPT(a5)
	move.l	d1,BLTAPT(a5)
	move.w	#16*BPL_DEPTH*64+1,BLTSIZE(a5)
	addq.l	#2,a0
	WAIT_BLT
	move.l	a3,BLTDPT(a5)
	move.l	d1,BLTAPT(a5)
	move.w	#16*BPL_DEPTH*64+1,BLTSIZE(a5)
	addq.l	#2,a3
	dbf	d0,.LOOP_AFF_EACH_BLK
	lea	16*BPL_WIDTH*BPL_DEPTH-BPL_WIDTH(a0),a0
	lea	16*BPL_WIDTH*BPL_DEPTH-BPL_WIDTH(a3),a3
	lea	MAP_WIDTH-BPL_WIDTH/2(a1),a1
	dbf	d2,.LOOP_AFF_EACH_LINE
		
	rts
**************************************************** END_INIT_FIRST_SCR

build_coplist: ********************************************************
	move.l	COPLIST_ADR(pc),a0
	move.w	ORI_X,d0
	and.w	#$000f,d0
	neg.w	d0
	add.w	#$f,d0
	move.w	d0,d1
	lsl.w	#4,d0
	or.w	d1,d0
	move.w	#BPLCON1,(a0)+
	move.w	d0,(a0)+


	move.l	SCR_PT_ADR,d2
	move.w	START_FIRST_PART,d0
	mulu	#BPL_WIDTH*BPL_DEPTH,d0
	add.l	d0,d2
	moveq	#BPL_DEPTH-1,d0
	move.w	#bplpt,d1
.loop_init_BPL_in_clist
	move.w	d1,(a0)+
	addq.l	#2,d1
	swap	d2
	move.w	d2,(a0)+
	swap	d2
	move.w	d1,(a0)+
	addq.l	#2,d1
	move.w	d2,(a0)+
	add.l	#BPL_WIDTH,d2
	dbf	d0,.loop_init_BPL_in_clist

	moveq	#$29,d0
	add.w	FIRST_PART_SIZE,d0
	lsl.w	#8,d0
	or.w	#$0001,d0
	move.w	d0,(a0)+
	move.w	#$fffe,(a0)+

	move.l	SCR_PT_ADR,d2
	moveq	#BPL_DEPTH-1,d0
	move.w	#bplpt,d1
.loop_init_BPL_in_clist1
	move.w	d1,(a0)+
	addq.l	#2,d1
	swap	d2
	move.w	d2,(a0)+
	swap	d2
	move.w	d1,(a0)+
	addq.l	#2,d1
	move.w	d2,(a0)+
	add.l	#BPL_WIDTH,d2
	dbf	d0,.loop_init_BPL_in_clist1

	
	move.l	#$fffffffe,(a0)+	* montre la fin de la clist
	rts
********************************************************* END_build_coplist

******** datas
*	variables
TAB_ADR_BLK_GFX:	dc.l	BLK0_GFX,BLK1_GFX,BLK2_GFX
SCR_PT_ADR:	ds.l	1
LOG_SCR_ADR:	dc.l	ecran1
PHY_SCR_ADR:	dc.l	ecran2
COPLIST_ADR:	dc.l	coplist
MAP:	
 dc.b 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
 dc.b 0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0
 dc.b 0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0
 dc.b 0,0,1,0,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0
 dc.b 0,0,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0
 dc.b 0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,1,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0
 dc.b 0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,1,1,1,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,1,0,0,0,1,0
 dc.b 0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,0
 dc.b 0,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,1,0,1,0,0,1,0,0,1,0,1,0,1,0
 dc.b 0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,0,1,0,1,0,0,0,1,0
 dc.b 0,0,1,0,0,0,0,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,0,1,0,1,1,0,0,1,0,0,0,1,0
 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0
 dc.b 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,1,1,1,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,1,0,0,0,1,0
 dc.b 0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,0
 dc.b 0,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,2,2,0,1,0,1,0,0,1,0,0,1,0,1,0,1,0
 dc.b 0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,0,1,0,1,0,0,0,1,0
 dc.b 0,0,1,0,0,0,0,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,0,1,0,1,1,0,0,1,0,0,0,1,0
 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
 dc.b 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0
 dc.b 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1

	section	GFX,DATA_C
BLK0_GFX:	REPT	16
		dc.w	-1,-1,-1,-1
		ENDR
BLK1_GFX:	REPT	16
		dc.w	-1,0,0,0
		ENDR
BLK2_GFX:	REPT	16
		dc.w	0,-1,-1,0
		ENDR

	section	ZONE_CHIP,BSS_C
		ds.l	1
ecran1:		ds.l	(scr_size*2)/4
ecran2:		ds.l	(scr_size*2)/4
coplist:	ds.l	1000*4	* taiile inconnue donc on prevoit gros
	end		

NDLR : une erreur s'est glissée dans le source, voir cet article pour plus d'informations.

Voilà, c'est fini ; le mois prochain vous aurez très probablement droit à quelque chose plus proche de la démo que du jeu, comme une routine de plasma ou un ciel étoilé multidirectionnel.

La phrase du mois : "si vous n'affrontez pas vos terreurs en face, elles vous grimperont dans le dos".


[Retour en haut] / [Retour aux articles]