Des news sur les avancées pour l'animations de sprites.
Alors que c'est pleinement opérationnelle en dehors des routines d'interruption, le code suivant, sensé afficher 6 Bubble Bobble de haut en bas en train de se déplacer de gauche à droite avec "effacement" en début de chaque interruption, donne le drôle de résultat que vous voyez en vidéo.
Code:
*Equates
* Adresse ecran logique
ECRDEB EQU $4000
* Affichage d'un caractere
PUTC EQU $E803
*Timer
KBIN EQU $E830 a appeler fin procedure timer
STATUT EQU $6019 b5 pour valider timer
TIMEPT EQU $6027 Adresse routine timer
IRQPT EQU $6021 Adresse routine timer
TCR EQU $E7C5 Registre controle timer (???)
TSB EQU $E7C6 Valeur (16bits) timer en nombre de 8 cycles
*************************************
*Procedure affiche sprite avec
*transparence mode bm16c pour
*adresse ecran paire ET impaire
*Variable externe : RAMECR
************************************
ORG $7200 Minimum en Basic 512
ASPRIT LDA $E7C3
ORA #1
STA $E7C3
SPRI01 LDA HSPRIP Boucle I HSPRIP
STA ISPRIP Samuel Duvelver
LDY >RAMECR
SPRI02 LDA LSPRIP Boucle J LSPRIP
STA JSPRIP
SPRI03 LDA ,X Boucle J : LSPRIP
*Debut transparence couleur 15
CMPA #$F0
BLO TRANSA
LDB ,Y
JMP TRANSB
TRANSA LDB ,X
TRANSB ANDB #$F0
STB BTEMPO
ANDA #$0F
CMPA #$0F
BLO TRANSC
LDA ,Y
ANDA #$0F
TRANSC ORA BTEMPO
* Fin transparence
STA ,Y+
LEAX 1,X
DEC JSPRIP Samuel Duvelver
BNE SPRI03
* Fin boucle J
LDA #40
SUBA LSPRIP Soustrait largeur sprite
LEAY A,Y
DEC ISPRIP Samuel Duvelver
BNE SPRI02
* Fin boucle I
LDA $E7C3
LSRA Samuel duvelver
BCC FIPRO0
LSLA
STA $E7C3 Mis a 0 bit 0
JMP SPRI01
FIPRO0 RTS
*************************************
*Procedure affiche tile. Meme
*fonction que pour sprite sauf
*qu'il n'y a pas de transparence.
*Variable externe : RAMECR
************************************
ATILE LDA $E7C3
ORA #1
STA $E7C3
TILE01 LDA HSPRIP Boucle I HSPRIP
STA ISPRIP Samuel Duvelver
LDY >RAMECR
TILE02 LDA LSPRIP Boucle J LSPRIP
STA JSPRIP
TILE03 LDA ,X Boucle J : LSPRIP
STA ,Y+
LEAX 1,X
DEC JSPRIP Samuel Duvelver
BNE TILE03
* Fin boucle J
LDA #40
SUBA LSPRIP Soustrait largeur sprite
LEAY A,Y
DEC ISPRIP Samuel Duvelver
BNE TILE02
* Fin boucle I
LDA $E7C3
LSRA Samuel duvelver
BCC FIPRO1
LSLA
STA $E7C3 Mis a 0 bit 0
JMP TILE01
FIPRO1 RTS Idem a FIPRO0!
****************************
*DATA pour fonctions affiche
****************************
ISPRIP FCB 0 Index I
JSPRIP FCB 0 Index J
HSPRIP FCB 16 Hauteur de Sprite
LSPRIP FCB 2 Nb octets RAM ecran de large
BTEMPO FCB 0
*************************************
*Effacement Sprite.Variables externe:
*RAMECR,DEBECR
*************************************
POSTIL *
LDB >YSPRIT
LDA #40
MUL
ADDB >XSPRIT
ADDD #ECRDEB
STD >RAMECR
LDX #ADRTIL
JSR >ATILE
RTS
*************************************
*Positionnement Sprite.Variables externe:
*RAMECR,DEBECR
*************************************
POSSPR *
LDB >YSPRIT
LDA #40
MUL
ADDB >XSPRIT
ADDD #ECRDEB
STD >RAMECR
LDX #ADRSPR
JSR >ASPRIT
RTS
**************
*Routine timer
**************
ORG $7A00
FUTIMR *
ORCC #50
LDA >XSPRIT
CMPA #39
BEQ STOTMR Fin de la routine d'interruption
*On vide les sprites
VIDSPR *
JSR >POSTIL
LDB >YSPRIT
ADDB #32
STB >YSPRIT
CMPB #192
BLO VIDSPR
LDA #0
STA >YSPRIT
TMRRT0 *
*Affichage sprites
LDA >XSPRIT
INCA increment 4px droite
STA >XSPRIT
TMRRT1 *
JSR >POSSPR
LDB >YSPRIT
ADDB #32
STB >YSPRIT
CMPB #192
BLO TMRRT1
LDA #0
STA >YSPRIT
ANDCC #$AF
JMP KBIN
STOTMR * Extinction statut timer
LDA >STATUT
ANDA #$DF
STA >STATUT
ANDCC #$AF
JMP KBIN
********************************
*Programme principal
*Animation sprite bas de l ecran
*de gauche a droite
********************************
ORG $8000 Apres les fonctions
MAIN LDB #$1B sequence d echappement
JSR PUTC
LDB #$5E Mode bm16c
JSR PUTC
*INIT DP pour accelerer les fonctions
TFR DP,A
STA >DPINIT
LDA #$72
TFR A,DP
SETDP $72
*Programme*
LDA #0
STA >XSPRIT
STA >YSPRIT
LDD #6249
STD TSB
LDA >STATUT
ORA #$20
STA >STATUT
LDX #FUTIMR Routine d interruption
* STX IRQPT
STX TIMEPT
*fin programme*
LDA DPINIT
TFR A,DP
RTS
ORG $A000
************************
*Data deplacement sprite
************************
XSPRIT FCB 0 par 4 px horizontal (RAMEcran)
YSPRIT FCB 0
***************
*Data divers
***************
DPINIT FCB 0
LIMITB FCB 0
STIMER FDB 0 Adresse routine timer init
SVLTMR FDB 0 Valeur timer init
RAMECR FDB 0
**************************
* Les Sprites
**************************
* Bubble Droite 1
ADRSPR FCB 255,243,255,51,243,34,255
FCB 34,255,39,51,112,243,112
FCB 255,112,51,112,243,39,255
FCB 0,255,34,245,39,245,39
FCB 242,153,34,153,255,255,255
FCB 255,51,47,50,34,242,39
FCB 50,32,34,32,45,32,45
FCB 32,32,39,82,112,82,34
FCB 82,127,82,127,34,121,41
FCB 121
ADRTIL FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
END
J'ai tout essayé depuis 3 jours, dans la modification du code. Rien n'y fait, ça donne toujours cette animation SANS le bon sprite. A part quand ce n'est pas en mode "interruption" Je ne comprend pas comment le sprite ne peut s'afficher correctement alors que c'est exactement le même code que pour l'algorithme de l'affichage des 240 Sprites. L'autre soucis est que l'effacement des Sprite (avec le "Tile" se situant à ADRTIL ne semble pas s'afficher au bon endroit pour effacer les Sprites.
Par contre au niveau vitesse... C'est + que correct! Ici les interruptions sont sensées se faire toute les 1/20s et ça se fait effectivement à cette vitesse (40 images "plans" en 2 secondes). Je l'avai aussi effectué pour du 1/10s et là, ça se fait bien en 4 secondes aussi.