Amstrad PlusDécouverte de la gamme Old et Plus des Cpc d'Amstrad.
Sujet précédent :: Sujet suivant |
Auteur |
Message |
Sid
Hors ligne
Inscrit le: 01 Mai 2018 Messages: 171 Point(s): 139 Moyenne de points: 0,81
|
Posté le: Mar 19 Juin - 10:07 (2018) Sujet du message: tentative scrolling soft en utilisant la pile |
|
|
bonjour à tous
je tente de faire un scrolling soft d'un sprite de 32 pixels par 32 pixels en utilisant la pile. Pouvez vous voir ce que j'ai oublié dans mon code ?
Code: | ORG &4000:ENT $
;; affichage et scrolling soft d'un sprite de 32 pixels par 32 pixels
di ld (pile+1),sp ; sauve la pile avant de l'utiliser ld sp,font ; on pointe la pile sur le sprite ld hl,&c000 ; adresse d'ecran a afficher loopmain: pop hl ld b,16 loop: pop de ld (hl),e:inc hl ; on afficher le sprite ld (hl),e:inc hl ld (hl),e:inc hl ld (hl),e:inc hl ld (hl),e:inc hl ld (hl),e:inc hl ld (hl),e:inc hl ld (hl),e:inc hl call bc26 ; recuperation de l'adresse de l'autre ligne en hl djnz loop pop hl inc hl jp loopmain pile ld sp,pileaddress ei call waitkey ret
waitkey call &BB06 ret bc26 Ld a,h ; on recupere le contenu de h dans a Add a,8 ; on ajoute 8 pour passer à la ligne suivante Ld h,a ; on met la nouvelle valeur dans h Ret nc ; on arrete ici s'il n'y a pas de depassement Ld bc,&c050 ; pour un ecran de 80 caracteres Add hl,bc ; s'il y a depassement on additionne &c050 a l'adresse. Res 3,h ; pour eviter le depassement de la zone et faire une Raz de l'adresse ecran Ret
pileaddress dw 0
font: DB &00, &00, &00, &00, &00, &00, &00, &00 DB &00, &00, &00, &00, &00, &00, &00, &00 DB &76, &F0, &F8, &F0, &C0, &00, &00, &00 DB &71, &FF, &FF, &FE, &C0, &00, &00, &00 DB &71, &0F, &0F, &1E, &E0, &00, &00, &00 DB &71, &0F, &0F, &0F, &E0, &00, &00, &00 DB &71, &0F, &0F, &0F, &F0, &00, &00, &00 DB &73, &0F, &0F, &0F, &78, &00, &00, &00 DB &71, &0F, &0F, &0F, &78, &80, &00, &00 DB &71, &0F, &0F, &0F, &3C, &80, &00, &00 DB &71, &0F, &78, &87, &3C, &C0, &00, &00 DB &71, &0F, &78, &C7, &1E, &C0, &00, &00 DB &71, &0F, &78, &E3, &1E, &E0, &00, &00 DB &71, &0F, &78, &E3, &0F, &E0, &00, &00 DB &71, &0F, &78, &F1, &0F, &F0, &00, &00 DB &71, &0F, &78, &F1, &0F, &78, &00, &00 DB &71, &0F, &78, &71, &8F, &78, &80, &00 DB &71, &0F, &78, &70, &8F, &3C, &88, &00 DB &71, &0F, &78, &30, &C7, &3D, &C8, &00 DB &71, &0F, &78, &30, &C7, &1E, &C0, &00 DB &71, &0F, &78, &10, &E3, &1E, &E0, &00 DB &71, &0F, &78, &70, &E3, &0F, &E0, &00 DB &71, &0F, &78, &71, &EF, &0F, &F0, &00 DB &71, &0F, &78, &71, &8F, &0F, &78, &00 DB &71, &0F, &78, &71, &0F, &0F, &78, &80 DB &71, &0F, &78, &71, &0F, &0F, &3C, &80 DB &75, &0F, &78, &77, &0F, &0F, &3C, &C0 DB &71, &0F, &78, &71, &F0, &C3, &1E, &C0 DB &71, &0F, &78, &70, &F0, &CF, &1E, &E6 DB &71, &0F, &78, &70, &F0, &EF, &0F, &E6 DB &70, &F0, &F1, &00, &00, &E7, &0F, &F6 DB &70, &F0, &F1, &00, &00, &F0, &F0, &F0 DB &72, &F0, &F0, &00, &00, &70, &F0, &F0 DB &00, &00, &00, &00, &00, &00, &00, &00
|
|
|
Revenir en haut |
|
|
Sid
Hors ligne
Inscrit le: 01 Mai 2018 Messages: 171 Point(s): 139 Moyenne de points: 0,81
|
Posté le: Mar 19 Juin - 12:53 (2018) Sujet du message: tentative scrolling soft en utilisant la pile |
|
|
bon nouvelle tentative avec un ldir simple la j'affiche bien mon sprite mais reset, donc je ne vois pas le sprite se déplacer :
Code: | ORG &2000:ENT $
;; affichage et scrolling soft d'un sprite de 16 par 6 lignes
ld hl,font ; source ld de,&c000 ; destination ld b,16 ; hauteur du sprite loopsprite: push bc ; affichage du premier sprite push de ; on met dans pile l'adresse de destination ld bc,6 ; on met la longueur du sprite ldir ; on remplit toute la ligne pop de ; on recupere l'adresse destination call bc26 ; on recupere dans de la ligne inferieure dans de pop bc ; on recupere la longueur du sprite djnz loopsprite ; on boucle tant que hauteur pas ok
ld de, &c001 ; on commence a donner l'adresse de l'animation ld hl,&c000 ; on met l'adresse de la source du sprite sur ecran ld b, 16 ; hauteur du sprite loopanim: push bc push de ld bc,6 ldir call bc26 pop bc djnz loopanim push bc push af call vbl ; attente vbl pop af pop bc inc de ; on passe a l'adresse suivante inc hl ld b,16 call waitkey jp loopanim
call waitkey ret
waitkey push af push hl push de push bc call &BB06 pop bc pop de pop hl pop af ret
bc26 ld a,d ; on récupère le poids fort du registre d add a,8 ld d,a ; on remet la bonne valeur à d ret nc ; on s'arrête ici si pas de dépassement (a>&ff) ex de,hl ; on inverse le contenu des registres HL et De ld bc,&c050 ; prochaine ligne si écran de 80 caractères add hl,bc ; on a ici la prochaine ligne après calcul ex de,hl ; on remets les valeurs de registres HL et DE à leur place ret
vbl ld b,&f5 synchro in a,(c) rra jr nc,synchro
font: DB &00, &00, &0C, &0C, &08, &00, &00, &00 DB &FC, &FC, &0C, &00, &00, &54, &EC, &DC DB &0C, &08, &00, &0C, &FC, &FC, &0C, &08 DB &00, &0C, &5C, &FC, &AC, &0C, &00, &CC DB &CC, &FC, &FC, &0C, &00, &CC, &CC, &FC DB &FC, &0C, &4C, &8C, &CC, &FC, &FC, &0C DB &0C, &0C, &EC, &FC, &FC, &5C, &5C, &AC DB &AC, &FC, &0C, &5C, &5C, &AC, &AC, &5C DB &5C, &5C, &54, &FC, &FC, &5C, &5C, &5C DB &00, &A8, &FC, &FC, &5C, &5C, &00, &FC DB &FC, &FC, &5C, &AC, &00, &0C, &0C, &0C DB &04, &08, &00, &00, &00, &00, &00, &00
| Avez vous une idée ?
|
|
Revenir en haut |
|
|
snake_plissken
Hors ligne
Inscrit le: 03 Déc 2014 Messages: 383
Localisation: les pont de cé Point(s): 52 Moyenne de points: 0,14
|
Posté le: Mar 19 Juin - 13:10 (2018) Sujet du message: tentative scrolling soft en utilisant la pile |
|
|
Le problème est dans la boucle LOOPANIM
|
|
Revenir en haut |
|
|
Sid
Hors ligne
Inscrit le: 01 Mai 2018 Messages: 171 Point(s): 139 Moyenne de points: 0,81
|
Posté le: Mer 20 Juin - 16:37 (2018) Sujet du message: tentative scrolling soft en utilisant la pile |
|
|
je réponds à moi même
Voici le code corrigé :
Code: | ORG &2000
;; affichage et scrolling soft d'un sprite de 16 par 6 lignes
ld hl,font ; source ld de,&c001 ; destination call displaysprite call waitkey
ld hl,font ld de,&c000
loopscroll call vbl ; on attend la vbl call nextaddress call displaysprite ; on affiche le sprite jp loopscroll nextaddress ld a,(counter) inc a cp 80 jp z,resetcounter ld (counter),a ld d,&c0 ld e,a ; de contient maintenant l'adresse destination ld hl,font ret resetcounter ld a, 0 ld (counter),a jp nextaddress
displaysprite ld b,16 ; hauteur du sprite loopdisplaysprite push bc ; affichage du premier sprite push de ; on met dans pile l'adresse de destination ld bc,6 ; on met la longueur du sprite ldir ; on remplit toute la ligne pop de ; on recupere l'adresse destination call bc26 ; on recupere dans de la ligne inferieure dans de pop bc ; on recupere la longueur du sprite djnz loopdisplaysprite ; on boucle tant que hauteur pas ok ret
waitkey push af call &BB06 pop af ret
bc26 ld a,d ; on recupere le poids fort du registre d add a,8 ld d,a ; on remet la bonne valeur e d ret nc ; on s'arrête ici si pas de depassement (a>&ff) ex de,hl ; on inverse le contenu des registres HL et De ld bc,&c050 ; prochaine ligne si ecran de 80 caracteres add hl,bc ; on a ici la prochaine ligne apres calcul ex de,hl ; on remets les valeurs de registres HL et DE a leur place ret
vbl ld b,&f5 synchro in a,(c) rra jr nc,synchro ret
font: DB &00, &00, &0C, &0C, &08, &00, &00, &00 DB &FC, &FC, &0C, &00, &00, &54, &EC, &DC DB &0C, &08, &00, &0C, &FC, &FC, &0C, &08 DB &00, &0C, &5C, &FC, &AC, &0C, &00, &CC DB &CC, &FC, &FC, &0C, &00, &CC, &CC, &FC DB &FC, &0C, &4C, &8C, &CC, &FC, &FC, &0C DB &0C, &0C, &EC, &FC, &FC, &5C, &5C, &AC DB &AC, &FC, &0C, &5C, &5C, &AC, &AC, &5C DB &5C, &5C, &54, &FC, &FC, &5C, &5C, &5C DB &00, &A8, &FC, &FC, &5C, &5C, &00, &FC DB &FC, &FC, &5C, &AC, &00, &0C, &0C, &0C DB &04, &08, &00, &00, &00, &00, &00, &00
counter db 0
| voilou
aller je continue
|
|
Revenir en haut |
|
|
|
|