Samuel Devulder a écrit:
L'erreur est que "*" vaut un peu n'importe quoi à l'endroit ou il est. En tout cas il ne vaut pas la partie haute de l'adresse du code. Il faut donc déplacer la définition de DIRECT après le ORG qui t’intéresse, ou mieux: définir DIRECT à $A0, et faire "ORG DIRECT<+8" ou "ORG DIRECT*256". Enfin ca c'est dans l'hypothèse où tu veux que DP pointe dans le code. Si tu veux qu'il pointe en $E7 comme le suggère JASZ, il faut aussi utiliser les adresses de la forme "<$E7C3" et pas ">$E7C3" car ce dernier est l'adressage étendu.
C'est du code extrait du manuel "Assembleur 6809" chez FIL pour TO8... DOnc à mon avis, ça doit être du code solide. Cette partie du code je la verrai plus tard le but étant de mettre en DP la procédure d'affichage de Sprite pour gagner 10 cycles d'horloges
Citation:
Après le fait que le PUTC est coûteux ne compte pas vu que c'est dans l'init
Tout à fait et je ne vois pas comment passer en mode bm16c autrement!
Citation:
mais par contre on peut optimiser ce que est appelé fréquemment comme cette portion de code:
Code:
...
On charge $E7C3 plusieurs fois, c'est nul. On peut être plus malin:
Code:
LDA <$E7C3 ; en présumant SETDP $E7, ce sera optimisé
LSRA ; recup bit0 dans C
BCS FIPRO0 ; 1 ? on fait rien
LSLA ; Sinon on décale dans l'autre sens ce qui revient à mettre 0 dans le bit0
STA <$E7C3
JMP BOUC01
FIPRO0 RTS
Alors ça, ça m'intéresse grandement! Merci Samuel
Je ne savais pas comment éviter le doublage de chargement de E7C3
Mais pour info, la bascule ne se fait qu'une fois par Sprite (affichage des octets de RAMA d'abord puis ceux de RAMB).
Par contre, on ne fait rien quand c'est=0 justement, donc BCC (et pas BCS). Ca marche
Bon il ne reste que le soucis de ce décalage initial vers la droite de l'écran et le fait que ça n'affiche pas les bonnes couleurs du sprite..
Je remet le code modifié
Code:
***********
* Equates *
***********
* Affichage d'un caractere
PUTC EQU $E803
* Selection DP
DIRECT EQU *<-8
SETDP DIRECT
* Adresse ecran logique
ECRDEB EQU $4000
**************************
*Procedure affiche sprite
*avec transparence
*pour adresse ecran paire
***************************
ORG $A000
SPRITP LDA $E7C3
ORA #1
STA $E7C3
LDA #DIRECT
TFR A,DP
BOUC01 LDA #0 Boucle RAMA ou RAMB
STA ISPRIP
LDY RAMECR
BOUC02 LDA #0 Boucle I : HSPRIP
STA JSPRIP
TRANSP 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
LDA JSPRIP
INCA
STA JSPRIP
CMPA LSPRIP
BLO TRANSP
* Fin boucle J
LDB LSPRIP Largeur Sprite
NEGB negatif de B
ADDB #40
LEAY B,Y
LDA ISPRIP
INCA
STA ISPRIP
CMPA HSPRIP
BLO BOUC02
* Fin boucle I
LDA $E7C3
LSRA
BCC FIPRO0
LSLA
STA $E7C3
JMP BOUC01
FIPRO0 RTS
ADDATA FDB ADRSPR
ISPRIP FCB 0
JSPRIP FCB 0
HSPRIP FCB 16
LSPRIP FCB 2
BTEMPO FCB 0
******************
*Fin procedure
***************
********************
*Programme principal
*Affiche 20x11
*Sprites
********************
ORG $A500
* ORCC #$50
MAIN LDB #$1B sequence d echappement
JSR PUTC
LDB #$5E Mode bm16c
JSR PUTC
LDU #$DFFF
* Affichage Sprites
LDX ADRSPR
JSR SPRITP
RTS
***************
*Fin Main
***************
* Espaces mémoire divers
ORG $B000
RAMECR FDB ECRDEB
MOTIF FCB $FF,$FF,$FF,$FF
FCB $FF,$FF,$FF,$FF
XECR FCB 0
YECR FCB 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
END
Bonne nuit...