La Place des Développeurs Déplacement d'un sprite en assembleur ... ou le résultat de mes derniers travaux
Reprise du message précédent
Bon, j'ai fait différemment, après reste à savoir s'il y a une méthode meilleure qu'une autreLe programme de Granced avec mes modifs
Code ASM :
.bios .page 2 .rom .start DEBUT NAMTBL equ 1800h SPRTBL equ 3800h SPRATR equ 1b00h DEBUT: call DISSCR ld hl,0f3e9h ld [hl],15 inc hl ld [hl],0 inc hl ld [hl],0 call INIGRP ld bc,06201h call WRTVDP ld hl,NAMTBL ld bc,768 xor a call FILVRM ld hl,ATR_INITIAL ld de,SPRITES ld bc,8 ldir ; ; Defininitions des sprites ; ld hl,SPR_DEF ;On charge en HL le début de l'endroit de la mémoire ou sont stocké les patrons des sprites ld de,SPRTBL;On indique où on veut les mettre (table des patrons des sprite à partir de 0) ld bc,6*4*8;on boucle sur 6 sprites de 4 carrés de 8 octets call LDIRVM ;on copie HL en ROM sur DE en VRAM, HL=HL+1, DE=DE+1, BC=BC-1 jusqu'à ce que BC=0. call ENASCR LOOP: xor a ; mise à 0 de l'accu (a) call CHOIX_SPRITE; mise à la valeur par défaut de l'aspect du vaisseau ; ; DEPLACEMENT ; xor a ; mise à 0 de l'accu (a) call GTSTCK; test du pad clavier (0) pushaf; Sauvegarde de a dans la pile ; ;EST ; ld HL,STK_POE; HL pointe vers les 3 positions ou le sprite va à droite (2,3,4) ld bc,3 ; BCà 3 on boucle sur 3 tours voir instruction suivante: cpir ; test de a avec l'adresse pointé par HL puis HL=HL+1 et BC=BC-1 ; jusqu'à ce que BC=0 (fin de la boucle) :-) je viens de découvrir cette instruction! JR NZ,@@WEST ; si pas d'égalité entre a et une des 3 valeurs pointé par HL on passe à la suite ; sinon on déplace le sprite ld a,[SPRITES+1] ; a=position en x du sprite 1 cp 240 ; a=240? jr z,@@NORTH ; oui donc on passe direct au déplacement vertical inc a ; sinon a=a+2 inc a ld [SPRITES+1],a ; remise de a+2 dans x du sprite1 ld [SPRITES+5],a ; puis dans x du sprite2 car il sesuivent en permanence ;-) jp @@NORTH ; puis on passe direct au déplacement vertical ; ;OUEST ; @@WEST: ld HL,STK_POW ld bc,3 cpir JR NZ,@@NORTH ld a,[SPRITES+1] cp 0 jr z,@@NORTH dec a dec a ld [SPRITES+1],a ld [SPRITES+5],a ; ;NORD ; @@NORTH: popAF ld HL,STK_PON ld bc,3 cpir JR NZ,@@SOUTH ld a,8 call CHOIX_SPRITE ld a,[SPRITES] cp 0 jr z,@@END dec a dec a ld [SPRITES],a ld [SPRITES+4],a JP @@END ; ;SUD ; @@SOUTH: ld HL,STK_POS ld bc,3 cpir JR NZ,@@END ld a,16 call CHOIX_SPRITE ld a,[SPRITES] cp 176 jr z,@@END ld a,[SPRITES] inc a inc a ld [SPRITES],a ld [SPRITES+4],a @@END: call DUMP jp LOOP nop ret DUMP: halt ld hl,SPRITES ld de,SPRATR ld bc,8 call LDIRVM ret CHOIX_SPRITE: ld [SPRITES+2],a add a,4 ld [SPRITES+6],a cp 12 jr nz,@@ROUGE ld a,4 jp @@COULEUR @@ROUGE: ld a,8 @@COULEUR: ld [SPRITES+7],a ret ATR_INITIAL: db 88,120,0,15 db 88,120,4,8 STK_POE: db 2,3,4 STK_POW: db 6,7,8 STK_PON: db 8,1,2 STK_POS: db 4,5,6 SPR_DEF: ;SPR_NEM1=sprite0 db 000h,080h,0e0h,070h,07fh,07fh,0bfh,0bfh,0bfh,078h,0e0h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,088h,0ffh,0f8h,000h,000h,000h,000h,000h,000h,000h,000h ;SPR_NEM2=sprite1*4= 4 db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,0c0h,070h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;SPR_UP1=sprite2*4= 8 db 000h,080h,0e0h,070h,0ffh,01fh,001h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,080h,0f0h,0ffh,000h,000h,000h,000h,000h,000h,000h,000h,000h ;SPR_UP2=sprite3*4= 12 db 000h,000h,000h,000h,000h,0e0h,0feh,07fh,03fh,01eh,018h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,0fch,0f0h,000h,000h,000h,000h,000h,000h,000h ;SPR_DOWN1=sprite4*4= 16 db 000h,000h,0b0h,0fch,07fh,07fh,0bfh,0bfh,0bfh,07fh,078h,0e0h,000h,000h,000h,000h db 000h,000h,000h,000h,080h,018h,08fh,0fch,0e0h,000h,000h,000h,000h,000h,000h,000h ;SPR_DOWN1=sprite5*4= 20 db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,0e0h,070h,000h,000h,000h,000h,000h,000h,000h,000h,000h .page 3 SPRITES: ds 8
Le fichier qui va bien et fait la même chose que celui de Granced
depspr2.zip
Le MSXien le plus à l'ouest ... ou presque
Joli travail aussi l'Osaure !
Je ne m'étais pas intéressé à CPIR, ça m'a l'air assez puissant comme instruction (ça évite manifestement de faire toute une liste de comparaisons comme je l'ai fait moi, notamment dans le cas de similarités !).
Après pour savoir quel programme est le plus efficace, faut voir la RAM occupée, et la vitesse d'exécution, mais là ça dépasse mes maigres connaissances !!
Je ne m'étais pas intéressé à CPIR, ça m'a l'air assez puissant comme instruction (ça évite manifestement de faire toute une liste de comparaisons comme je l'ai fait moi, notamment dans le cas de similarités !).
Après pour savoir quel programme est le plus efficace, faut voir la RAM occupée, et la vitesse d'exécution, mais là ça dépasse mes maigres connaissances !!
MSX un jour, MSX toujours !
Granced, c'est normal qu'il y ait un bug si tu ne fais pas de LD B,A.
Si par exemple A=1 après le test joystick.
Ton programme appelle ta sous-routine NORTH. Et que fais cette sous-routine ? Elle modifie le registre A. Puis ton programme continue ton test clavier. Et si A vaut 4 par exemple, il va éxécuter ta sous-routine SOUTHEAST Du coup, Metalion va partir à l'est. Et comme à l'Est, il n'y a rien de nouveau...
Si par exemple A=1 après le test joystick.
Ton programme appelle ta sous-routine NORTH. Et que fais cette sous-routine ? Elle modifie le registre A. Puis ton programme continue ton test clavier. Et si A vaut 4 par exemple, il va éxécuter ta sous-routine SOUTHEAST Du coup, Metalion va partir à l'est. Et comme à l'Est, il n'y a rien de nouveau...
Nous sommes en 2010 aps JC, toute la Gaule est envahie. Ah ben non, apparement, un village résiste encore aux envahisseurs Personalcomputerum et autres Consoledessalum. Bienvenue dans l'antre du emessix !
mutuelsanrix :
Granced, c'est normal qu'il y ait un bug si tu ne fais pas de LD B,A.
Si par exemple A=1 après le test joystick.
Ton programme appelle ta sous-routine NORTH. Et que fais cette sous-routine ? Elle modifie le registre A. Puis ton programme continue ton test clavier. Et si A vaut 4 par exemple, il va exécuter ta sous-routine SOUTHEAST Du coup, Metalion va partir à l'est. Et comme à l'Est, il n'y a rien de nouveau...
Si par exemple A=1 après le test joystick.
Ton programme appelle ta sous-routine NORTH. Et que fais cette sous-routine ? Elle modifie le registre A. Puis ton programme continue ton test clavier. Et si A vaut 4 par exemple, il va exécuter ta sous-routine SOUTHEAST Du coup, Metalion va partir à l'est. Et comme à l'Est, il n'y a rien de nouveau...
Oui j'avais vu aussi ce bug qui rendait les déplacement erratiques, depuis on a trouvé d'autres solutions
Mais mine de rien avec ses exercices Granced m'a motivé pour attaquer l'assembleur.
Le MSXien le plus à l'ouest ... ou presque
Il n'était pas convaincu quand je lui disais que vous aviez un bon niveau.
Nous sommes en 2010 aps JC, toute la Gaule est envahie. Ah ben non, apparement, un village résiste encore aux envahisseurs Personalcomputerum et autres Consoledessalum. Bienvenue dans l'antre du emessix !
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie