MSX Village forum

La Place des Développeurs Déplacement d'un sprite en assembleur ... ou le résultat de mes derniers travaux

MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 775

Le 26/03/2010 à 22h22

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 autre :hum

Le 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 :D
depspr2.zip


Le MSXien le plus à l'ouest :fou ... ou presque :D
osaurer
   
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1500

Le 29/03/2010 à 08h24
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 !! ;)


MSX un jour, MSX toujours ! :D
Site web    
Sebbeug Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h33

Messages: 2241

Le 22/04/2010 à 11h32
Ouahouh .... Y a de quoi faire Nemesis4 là !
:oups


Clé de sol

Site web    
KN2000 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 08/06/2010 à 09h30

Messages: 209

Le 15/06/2010 à 13h29
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...


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 !
   
MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 775

Le 15/06/2010 à 14h44
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...




Oui j'avais vu aussi ce bug qui rendait les déplacement erratiques, depuis on a trouvé d'autres solutions :d



Mais mine de rien avec ses exercices Granced m'a motivé pour attaquer l'assembleur.


Le MSXien le plus à l'ouest :fou ... ou presque :D
osaurer
   
KN2000 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 08/06/2010 à 09h30

Messages: 209

Le 16/06/2010 à 11h21
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 !
   
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1500

Le 18/06/2010 à 15h28
Ben disons que la syntaxe de l'assembleur ça va, c'est plus la connaissance du matériel MSX qui pose problème :oups


MSX un jour, MSX toujours ! :D
Site web    
Walter Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 02/10/2009 à 19h33

Messages: 1883

Le 20/06/2010 à 21h31
Quand on veut on peut ! :p
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie