Logicielsmoto.com

Nous sommes le 28 Mar 2024, 11:54

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 168 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5, 6, 7 ... 12  Suivante
Auteur Message
MessagePosté: 12 Aoû 2020, 18:50 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
jasz a écrit:
Code:
ORG $A500
MAIN
     ...
     LDU #$DFFF
/* Affichage Sprites
     LDX ADRSPR
     STD RAMECR
     JSR SPRITP
     RTS

Pourquoi un STD .RAMECR après un #PUTC?


Salut
Effectivement ici c'st une erreur parce que j'ai effacé une grande partie du programme source original (uiq était sensé afficher 20x11 Sprites)

J'ai remodifié le code du message précédent.

Mais je ne comprends pas pourquoi là ça affiche des pixels par 4 de la RAMA avec des décalage à droite et en bas à chaque fois. Y est sensé pointer sur les adresses de la RAM écran, mais j'ai pas l'impression que la bascule RAMA vers RAMB se fasse. Bon je vais essayer de voir d'où vient le problème (c'est pas si complique dans des langages évolués, notamment pour les boucles)


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 12 Aoû 2020, 19:29 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Citation:
Cependant, j'ai essayé de convertir le code que j'avais fait du Pascal vers l'Assembleur, et juste pour un affichage de Sprite, j'ai quelque chose qui déconne!!

Bon ce qui déconne est peut-être là:
Code:
***********
* Equates *
***********
* Affichage d'un caractere
PUTC EQU $E803
* Selection DP
DIRECT EQU *<-8 <======= ERREUR
 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 <== on ne mets pas la bonne valeur dans DP
 TFR A,DP

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.

Après le fait que le PUTC est coûteux ne compte pas vu que c'est dans l'init, mais par contre on peut optimiser ce que est appelé fréquemment comme cette portion de code:
Code:
LDA >$E7C3
 ANDA #1
 CMPA #1
 BNE FIPRO0
 LDA >$E7C3
 ANDA #254
 STA >$E7C3
 JMP BOUC01
FIPRO0 RTS
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

_________________
Good morning, that's a nice Tnetennba


Dernière édition par Samuel Devulder le 12 Aoû 2020, 20:02, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
MessagePosté: 12 Aoû 2020, 19:56 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Le problème ne vient pas de là mais de " LEAY 40-LSPRIP,Y", je pensais que, pour LSPRIP=2, ça ferait "LEAY 38,Y" mais en fait non (J'ai testé en mettant en brut 38 et là, les caractères s'affichent à peu près au bon endroit contrairement à "LEAY 40-SPRIP,Y")

Hmm ça vient du fait que les registres et variables sont gérés comme des entiers relatifs (signés) et pas naturels (non signés)... C'est galère!! Par exemple pour une variable A = 255, et tester avec le masque 240 et le masque 15... ("ANDA #240").

Mes algorithmes sont bons puisqu'ils ont été testés sous BASIC et Pascal.

Quelqu'un sait si on peut utiliser une opérande avec étiquette dans un adressage indexé ? Du genre "40-LSPRIP,Y" avec "LSPRIP FCB 2" ?

J'ai fait un truc du genre
Code:
 LDB LSPRIP
 NEGB
 ADDB #40
 LEAY B,Y

S'il y a plus court, je suis preneur...


Dernière édition par Neotenien le 12 Aoû 2020, 20:26, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
MessagePosté: 12 Aoû 2020, 20:05 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Citation:
Le problème ne vient pas de là
Peut-ête, mais ca reste un bug: SETDP n'est pas initialisé avec la valeur attendue (et je ne saurais dire laquelle dans la mesure où tu n’utilise nulle par l'adressage direct).
Citation:
mais de " LEAY 40-LSPRIP,Y", je pensais que, pour LSPRIP=2, ça ferait "LEAY 38,Y" mais en fait non

Ben en fait LSTRIP est une adresse dont la valeur est 2, mais pas 2 lui même. Fais
Code:
LSTRIP EQU 2
et ca marchera, et n'oublie pas que "CMPA LSTRIP" devient "CMPA #LSTRIP" (c'est plus court et plus rapide).

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 12 Aoû 2020, 20:33 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Samuel Devulder a écrit:
Citation:
Le problème ne vient pas de là
Peut-ête, mais ca reste un bug: SETDP n'est pas initialisé avec la valeur attendue (et je ne saurais dire laquelle dans la mesure où tu n’utilise nulle par l'adressage direct).

Il y a un TFR A,DP dans le code, donc ya pas de soucis

Citation:
Citation:
mais de " LEAY 40-LSPRIP,Y", je pensais que, pour LSPRIP=2, ça ferait "LEAY 38,Y" mais en fait non

Ben en fait LSTRIP est une adresse dont la valeur est 2, mais pas 2 lui même. Fais
Code:
LSTRIP EQU 2
et ca marchera, et n'oublie pas que "CMPA LSTRIP" devient "CMPA #LSTRIP" (c'est plus court et plus rapide).

C'est pas le but! LSPRIP est une variable qui contient le nombre d'octets en largeur de chaque sprite (ça peut être 2, 4, 8... Sinon je n'aurait pas mis d'étiquette. De toutes façon j'ai trouvé un moyen de contourner ce problème. En utilisant un index avec déplacement registre B.

L'état do logiciel actuel: affiche bien un ensemble de points de 8x16 mais pas avec les bonnes couleur (défini dans ADRSPR) bon je continue les essais.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 12 Aoû 2020, 20:48 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
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...


Dernière édition par Neotenien le 12 Aoû 2020, 21:13, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
MessagePosté: 12 Aoû 2020, 21:13 
Hors ligne

Inscription: 13 Juin 2005, 21:50
Messages: 290
Localisation: Planete Zorg (31)
C'est ce que je disais de manière plus silencieuse ;)


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 12 Aoû 2020, 22:43 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Neotenien a écrit:
Il y a un TFR A,DP dans le code, donc ya pas de soucis

Citation:
C'est du code extrait du manuel "Assembleur 6809" chez FIL pour TO8... DOnc à mon avis, ça doit être du code solide.

Ca change rien. Le pb c'est que SETDP n'indique pas à l’assembleur quelle est la valeur de DP attendue dans le code. Regarde ce que donne le assemblage du code en mémoire pour voir si tu y trouve l'utilisation du mode direct-page (DP).

Citation:
C'est pas le but! LSPRIP est une variable qui contient le nombre d'octets en largeur de chaque sprite (ça peut être 2, 4, 8... Sinon je n'aurait pas mis d'étiquette.

Ben tu peux avoir du code auto-modifié, perso c'est ce que je ferais.
Citation:
De toutes façon j'ai trouvé un moyen de contourner ce problème. En utilisant un index avec déplacement registre B.

La lecture des différentes variables fini par manger des cycles, je vais voir avec du code auto-modifiable... (à suivre)

[EDIT] on peut encore faire mieux, mais c'est pour montrer le principe.
Code:

SPRITP
    LDA     LSPRIP
    STA     BOUC02+1    ; code auto-modifié -------+
                                                   |
    SUBA    #40                                    |
    NEGA                                           |
    STA     OFFSETY     ; code auto-modifié -------|----------+
                                                   |          |
    LDA     $E7C3                                  |          |
    ORA     #1                                     |          |
BOUC01                                             |          |
    STA     $E7C3   ; mode forme                   |          |
                                                   |          |
    LDA     HSTRIP  ; Boucle RAMA ou RAMB          |          |
    STA     ISPRIP                                 |          |
                                                   |          |
    LDY     RAMECR                                 |          |
                                                   |          |
BOUC02                                             |          |
    LDA     #0      ; Boucle I : HSPRIP  <---------+          |
    STA     JSPRIP                                            |
                                                              |
TRANSP                                                        |
    LDA     ,X+     ; X+ integre le LEAX 1,X couteux          |
                                                              |
*Debut transparence couleur 15                                |
    CMPA    #$F0                                              |
    BLO     TRANSA                                            |
    LDB     ,Y                                                |
    BRA     TRANSB  ; BRA est plus rapide que JMP             |
TRANSA                                                        |
    LDB     -1,X    ; -1 pour compenser le X+ au dessus       |
TRANSB                                                        |
    ANDB    #$F0                                              |
    STB     TRANSC+1    ; code auto-modifié                   |
    ANDA    #$0F    ;          |                              |
    CMPA    #$0F    ;          |                              |
    BLO     TRANSC  ;          |                              |
    LDA     ,Y      ;          |                              |
    ANDA    #$0F    ;          |                              |
TRANSC SET *        ;          |                              |
    ORA      #0     ; <--------+                              |
                                                              |
* Fin transparence                                            |
    STA     ,Y+                                               |
                                                              |
    DEC     JSPRIP  ; on décompte, c'est plus rapide          |
    BNE     TRANSP  ; rebouclage J si pas fini                |
                                                              |
* Fin boucle J (passage à la ligne suivante)                  |
    LEAY    <$33,Y  ; code auto modifié    <------------------+
OFFSETY EQU *-1

    DEC     ISPRIP  ; on décompte c'est plus rapide
    BNE     BOUC02  ; Fini I ? non => boucle
   
* Fin boucle I (2e passe en mémoire forme)
    LDA     $E7C3
    LSRA
    BCC     FIPRO0 
    LSLA
    BRA     BOUC01
FIPRO0
    RTS

* on gagnerait à faire pointer DP ici:
ADDATA FDB ADRSPR
ISPRIP FCB 0
JSPRIP FCB 0
HSPRIP FCB 16
LSPRIP FCB 2

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 13 Aoû 2020, 08:45 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Questions sur l'assembleur

1/ A priori la directive SETDP transforme les accès étendus en accès direct dans le code qui suit si les étiquettes sont situées dans la même page, pourquoi êtes vous contre cette directive ?
2/ Comment est enregistré le code en LM avec la directive ORG ? Est ce que, si, par exemple, je met un bout de code en $A000 et un autre en $B000 ça créera un code qui predra tout cet espace ? (c'est à dire qu'au début, à l'adresse 0 du code, on aura le code PUIS des "0" et ensuite à $1000 du code, le code suivant ?)
3/ Mon assembleur v2.0 ne permet que 39 colonnes par ligne et donc, les commentaires sont court, pourquoi chez vous, vous avez des commentaires à rallonge ?
4/ Qu'apporte l'assembleur v3 ?

Sinon j'ai trouvé d'où venait mon erreur d'affichage du Sprite, j'avais mis "LDA ADRSPR" au lieu de "LDA #ADRSPR" et là ça affiche correctement.

Sinon, il n'est écrit nulle part dans la doc de l'assembleur 6809 qu'un programme doit se terminer par RTI et pas par RTS (si on appelle par EXEC)... C'est ce que j'avais fait avant et le résultat était très aléatoire! Maintenant otut ets rentré dans l'ordre...


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 13 Aoû 2020, 12:25 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Neotenien a écrit:
Questions sur l'assembleur

1/ A priori la directive SETDP transforme les accès étendus en accès direct dans le code qui suit si les étiquettes sont situées dans la même page, pourquoi êtes vous contre cette directive ?
Non on s'est mal compris, je ne suis pas contre, ni pour, bien au contraire. Je te dis juste qu'il est mal utilisé dans le code plus haut. Perso je l'utilise intensément car ca fait gagner 1 cycles par rapport aux accès étendus.
Citation:
2/ Comment est enregistré le code en LM avec la directive ORG ? Est ce que, si, par exemple, je met un bout de code en $A000 et un autre en $B000 ça créera un code qui predra tout cet espace ? (c'est à dire qu'au début, à l'adresse 0 du code, on aura le code PUIS des "0" et ensuite à $1000 du code, le code suivant ?)
Ca dépend des assembleurs. Le format binaire thomson permet de charger "avec des trous", aussi par défaut un assembleur comme c6809 va te faire un binaire en plusieurs sections discontinues. Mais si tu ajoutes une option de compilation ("-b l" pour binaire linéaire), il va ne faire qu'une seule section et combler les trous avec du "$00".
Citation:
3/ Mon assembleur v2.0 ne permet que 39 colonnes par ligne et donc, les commentaires sont court, pourquoi chez vous, vous avez des commentaires à rallonge ?
Je développe sur PC. Je compile avec c6809. C'est la version portable de l'assembleur v3.
Citation:
4/ Qu'apporte l'assembleur v3 ?
Une syntaxe plus relaxe (cf. commentaires), un macro-processeur super puissant, la possibilité d'inclure du binaire brut ou du binaire thomson, et surtout il accepte les fichiers ASM des autres assembleurs, ou générés par c6809 à partir du fichier ASS.
Citation:
Sinon j'ai trouvé d'où venait mon erreur d'affichage du Sprite, j'avais mis "LDA ADRSPR" au lieu de "LDA #ADRSPR" et là ça affiche correctement.
C'est bizarre ca. ADRSPR est une adresse 16bits, et LDA #ADRSPR ne charge que la partie faible (8bits) de ces 16bits. Je ne suis pas certain que ca fait ce que tu veux.
Citation:
Sinon, il n'est écrit nulle part dans la doc de l'assembleur 6809 qu'un programme doit se terminer par RTI et pas par RTS (si on appelle par EXEC)...
RTI c'est une retour d'interruption, on ne l'utilise en pratique jamais sur Thomson.

La doc de l'appel depuis le basic (registre à sauvegarder, retour, etc) se trouve dans les annexes du basic2.
Fichier(s) joint(s):
Sans titre.gif
Sans titre.gif [ 78.56 Kio | Vu 8036 fois ]


Ensuite les docs avancées se trouvent dans la 2e partie du "manuel technique des TO8,TO9,TO9+".

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 13 Aoû 2020, 17:54 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Merci pour toute ces informations! (En plus j'ai les manuels sus cité mais ça fait des gros pavé que j'utilise pourtant mais pas complètement apparemment). Il y a ausssi "le Microprocesseu 6809, ses périphériques et le processeur graphique 9365-66" (bien moins bon que le gate array LOL) aux éditions Eyrolles.

Je verrai pour l'assembleur v3 qui est dispo sur le site de Daniel Coulomb (DCMoto).

J'ai fait une routine principale (après l'avoir corrigé de nombreuses fois à cause de bug dans mon code) en ASS sensée afficher 20x12 sprites (240) "avec masque" il ne reste quasiment plus de bug, et ça les affiche en moins d'1 seconde (je ne sais pas exactement combien). Alors qu'en Pascal compilé, ça affichait 50 Sprites avec masque en 7.5". Autant dire qu'en Assembleur, on gagne un facteur 37.5 (à minima) comparé au Pascal compilé et x400 comparé au BASIC (qui affichait 50 Sprites avec masque en 90")! Wow et wow. Ca promet du bon pour Bubble Bobble en ASS. Test effectué sur DCMoto en émulation 100% (1 MHz) puis en 10% (100 kHz), donnant 9" pour afficher 240 sprites.

Voici ma routine principale. Elle ne s'arrête pas en fin de boucle I alors qu'elle devrait, mais je trouverai le problème d'ici ce soir.

Code:
********************
*Programme principal
*Affiche 20x12
*Sprites
********************
 ORG $A500
* ORCC #$50
MAIN LDB #$1B sequence d echappement
 JSR PUTC
 LDB #$5E Mode bm16c
 JSR PUTC
 LDU #$DFFF
 LDA #$A0
*Calcul limite basse
 LDA #199
 SUBA >HSPRIP
 STA >LIMITB
*Init DP pour accelerer
 TFR DP,A
 STA >DPINIT
 SETDP $A0
 LDA $A0
 TFR A,DP
* Affichage Sprites
 LDD #ECRDEB
 STD >RAMECR
 LDA #0
 STA >YECR
BOUCM0 LDA #0
 STA >XECR
BOUCM1 *
* Calcul RAMECR
 LDA #40
 LDB >YECR
 MUL
 ADDB >XECR
 ADDD #ECRDEB
 STD >RAMECR
*Fin calcul RAMECR
 LDX #ADRSPR
 JSR >SPRITP
 LDA >XECR
 ADDA >LSPRIP
 STA >XECR
 CMPA #40
 BLO BOUCM1
 LDA >YECR
 ADDA >HSPRIP
 STA >YECR
 CMPA >LIMITB
 BLO BOUCM0
* Retour du DPINIT
 LDA >DPINIT
 TFR A,DP
*Fin du programme
 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
DPINIT FCB 0
LIMITB FCB 0

Par contre, j'avais peur pour l'interruption logicielle (curseur) que ça fasse le boxon dans les variables intermédiaires mais apparemment non.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 13 Aoû 2020, 21:44 
Hors ligne

Inscription: 13 Juin 2005, 21:50
Messages: 290
Localisation: Planete Zorg (31)
Code:
/*Init DP pour accelerer
     TFR    DP,A
     STA    >DPINIT

/* Retour du DPINIT
     LDA    >DPINIT
     TFR    A,DP

Préfère
Code:
/*Init DP pour accelerer
     PSHS   DP

/* Retour du DPINIT
     PULS   DP



Après ça c'est inutile
Code:
/* Calcul RAMECR
     LDA    #40
     LDB    >YECR
     MUL
     ADDB   >XECR
     ADDD   #ECRDEB
     STD    >RAMECR

Dans la mesure ou le "calcul" du positionnement peut être fait avec le moteur de déplacement.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 13 Aoû 2020, 22:47 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Petite optim au passage: Quand on a un "ADDD #$NN00" (exemple adresse écran), il est plus rapide de faire "ADDA #$NN" ;)

J'imagine que tu lances le programme sous Assembleur, non ? Dans ce cas il faut non pas terminer par RTS, mais par SWI.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 14 Aoû 2020, 17:43 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
jasz a écrit:
Après ça c'est inutile
Code:
/* Calcul RAMECR
     LDA    #40
     LDB    >YECR
     MUL
     ADDB   >XECR
     ADDD   #ECRDEB
     STD    >RAMECR

Dans la mesure ou le "calcul" du positionnement peut être fait avec le moteur de déplacement.


Ici c'est dans le cadre d'un affichage de tous les sprites (240 sprites) à l'écran. C'était juste pour une démo pour voir quelle vitesse ça donnait (et 240 sprotes en mode "avec masque" en 0.9 secondes, c'est assez satisfaisant je pense.

Pour ce qui est du PSHS, désolé mais je ne l'utiliserai que dans le cadre unique d'un scrolling et je ne maîtrise pas encore les piles (notamment où mettre l'adresse de haut de pile en RAM, ça peut interférer avec d'autre code. Ca marche peit êre dasn le cadre d'une démo où les animations sont à sesn unique mais pas dans le cadre d'un jeu.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 14 Aoû 2020, 21:11 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
La plupart des scrolling dans les jeux Thomson utilisent les instructions de pile. Même le scroll de l'écran "texte" par la routine PUTC utilise la pile dans la ROM:
Code:
EEC3 DE60       LDU    <$60                5 Lecture adresse début écran
EEC5 32C828     LEAS   $28,U               5 S = U + 40 (S pointe une ligne en dessous)
EEC8 3347       LEAU   $07,U               5 U = U + 7 (car on copie de 7 octets vers le bas)
EECA 0D78       TST    <$78                6 Scroll doux ?
EECC 2602       BNE    $EED0               3 OUI => alors U et S sont décalés de 40 octets (1 ligne)
EECE 32EB       LEAS   D,S                 8 NON => on ajoute D = 7*40 pour un décalage de 8 lignes au total
EED0 353E       PULS   A,B,DP,X,Y         12 LIT 7 octets
EED2 363E       PSHU   Y,X,DP,B,A         12 ECRIT ces 7 octets plus haut dans l'écran
EED4 334E       LEAU   $0E,U               5 U=U+14 (car l'écriture fait descendre U de 7)
EED6 11BC6062   CMPS   $6062               8 Bas écran atteint ?
EEDA 25F4       BCS    $EED0               3 NON => boucle

En fait il n'y a pas plus rapide pour copier de la mémoire. Après bon c'est qu'une question d'habitude.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 168 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5, 6, 7 ... 12  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 30 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com