Logicielsmoto.com

Nous sommes le 28 Mar 2024, 18:08

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 69 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5  Suivante
Auteur Message
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 31 Mai 2021, 15:29 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Citation:
Code:
    LDX #next ; adresse de retour
    BRA label ; appel sous-routine
next:
    ...

label:
    ...
    JMP ,X    ; retour

qui réalise l'équivalent d'un couple "bsr label/rts" (7+5=12 cycles) en 3+3+3=9 cycles sans passer par la pile (ca peut être utilisé dans des cartouches de diagnostiques avant d'avoir testé l'état de la RAM.) Au total ceci tourne en 1320 cycles au lieu des 1808 d'origine soit 27% plus rapide que le code initial d'affichage de notre sprite.


Merci pour cette astuce.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 08 Juin 2021, 14:55 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Nous avons donc pour l'instant 3 patchs:
  • $C028 -> $C11A qui remplace la copie de l'écran interne dans la VRAM forme et fond
  • $BF35 -> $BF95 qui remplace la routine de copie des tuiles dans l'écran interne
  • $C8EA -> $CC6A qui remplace les routines d'affichages de sprites

C'est super 3 fichiers, mais ca serait mieux si le jeu était pré-patché à l'origine. Alors j'ai pris un éditeur hexa et j'ai essayé d'éditer le fichier *.fd directement. Alors premier truc surprenant: les 1er octets $C028 que l'on doit remplacer (CE400A108E7912) se trouvent à deux endroits de la diskette ! La routine de recopie écran est dupliquée... Et là je réalise qu'il y a 2 phases dans le jeux (à choisir au début), et que donc probablement tous ces patchs devront être dupliqués à d'autres adresses pour l'autre partie du jeu :bah:

Second truc le remplacement sur disk ne marche pas! Hein ?!? Mais ca marche en mémoire.. oui et je me suis bien creusé la tête la dessus :voyons: C'est ce qui expliquait ma récente absence sur ce fil. Heureusement, j'ai trouvé aujourd'hui même la cause du problème. :coolfuck:

Alors c'est quoi le truc ?

Bah déjà voici ce qui est chargé en mémoire en patchant le disk:
Code:
C0B8 39         RTS                        5
C0B9 12         NOP                        2
C0BA 12         NOP                        2
C0BB 12         NOP                        2
C0BC 7810EF     ASL    $10EF               7 <===
C0BF 8C5532     CMPX   #$5532              4
C0C2 8433       ANDA   #$33                2
Le ASL est totalement erroné. On devrait avoir là un PSHS bien dodu:
Code:
C0BC 3478       PSHS   U,Y,X,DP           12 Sauvegardes regs utilisés
C0BE 10FFC117   STS    $C117               7 (!) Sauvegarde de S pour la sortie
Soit l'opcode $34 suivi de $78. Si on regarde plus attentivement on voit qu'en fait le $34 a disparu mais que le $78 est là. En fait tout est décalé de un octet ensuite en mémoire. Or dans le fichier FD on retrouve bien les trois NOPs ($12) suivis par $3478:
Fichier(s) joint(s):
Sans titre.gif
Sans titre.gif [ 64.16 Kio | Vu 9697 fois ]


Allons bon.. que se passe-t-il ? Bug de l'émulateur ? Bug de l'éditeur hexa ? Protection du jeu ? Fichier BINaire fragmenté sur le disk ? quid ?

Et bien j'ai été coincé là dessus longtemps... :???: jusqu'à ce que je me souvienne que "bon sang!!!" :eek: les secteurs des diskettes DOS thomson ne font pas 256 octets mais 255 et que le $34 tombant en $xxxFE c'est à dire le dernier octet d'un secteur, il est purement et simplement ignoré par le dos Thomson. Groumph :q Mince, j'avais totalement oublié ce "détail" de l'organisation disk Thomson. A cause de lui on ne peut patcher le fichier FD directement. :evil:

C'est fichu alors?

Non! Pour contourner le problème il faut passer par DCfdutil, extraire, patcher et reinjecter les BIN concernés. C'est moins direct, et pour tout dire assez pénible (on aimerait un drag&drop depuis l'explorateur windows) mais bon ca marche et ca me permet de confirmer que tous mes patchs sont sur un seul et même fichier: SLAP1DAT.PRG correspondant au jeu no 1 et que c'est dans SLAP2DAT.PRG qu'on retrouve les autres endroits à patcher (que je ne fais pas tout de suite car j'ai la flemme)

Voici enfin la diskette (presque) finale:
Fichier(s) joint(s):
Commentaire: Version patchée sur disk (enfin juste le niveau 1, parce que grosse flemme)
slap-fight_to8.zip [49.7 Kio]
Téléchargé 324 fois

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 08 Juin 2021, 15:29 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Avec le nouvel écran titre !!! :good:

Chapeau pour cette version "Bidouille by SAM"

As-tu un cheat code pour avoir des vies infinies ? :D

Je passe le boss mais après ça se corse un peu ...


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 08 Juin 2021, 18:23 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Euh non j'ai pas cherché pour les vies infinies. Je devrais le faire. Il y a la version dans une compilation de HCL qui permet les vies infinies.

J'avais trouvé aussi ce code qui n'est pas optimal:
Code:
C257 860E       LDA    #$0E                2 ==> 6 PSHS B
C259 3402       PSHS   A                   6 ==> 2 LDB #$0E
C25B A680       LDA    ,X+                 6 ==> 6 LDA ,X+
C25D 2702       BEQ    $C261               3 ==> 3 BNE $C261
C25F A7C4       STA    ,U                  4 ==> 4 LDA ,U (on fait ca rarement, donc on gagne en moyenne)
C261 3341       LEAU   $01,U               5 ==> 6 STA ,U+
C263 6AE4       DEC    ,S                  6 ==> 2 DECB (plus rapide que via la pile)
C265 26F4       BNE    $C25B               3 ==> 3 BNE $625B
C267 3502       PULS   A                   6 ==> 8 PULS B,PC
C269 39         RTS                        5
mais je ne sais pas à quoi il sert et je ne pense pas qu'il impacte beaucoup les performances. Il y en a un autre entre $7E7F et $7FD5 qui traite encore des sprites.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 08 Juin 2021, 23:00 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 478
C'est moi ou c'est carrément plus jouable :bien:
et le splashscreen même si c'est une conversion, ça fait carrément mieux et graphique ... ( pas dessin de gamin :lol: )

lol on va finir par avoir notre battle squadron sur Thomson si tu continus comme ça :lol:

en tout cas c'est rapide !

_________________
Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 09 Juin 2021, 18:03 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Bon il semble que je n'ai pas épuisé les zones de sprites. En effet, je viens d'en trouver une tout au début de la mémoire du jeu, peu après l'écran interne. Il est important puisque c'est lui qui affiche les vaisseaux ennemis "de base" en 16x16 au début du jeu:
Code:
7E7F CE6560     LDU    #$6560              3
7E82 EC84       LDD    ,X                  5
7E84 847F       ANDA   #$7F                2
7E86 33C6       LEAU   A,U                 5
7E88 8618       LDA    #$18                2
7E8A 3D         MUL                       11
7E8B 33CB       LEAU   D,U                 8
7E8D A60A       LDA    $0A,X               5
7E8F 271B       BEQ    $7EAC               3
7E91 108E7E5F   LDY    #$7E5F              4
7E95 A607       LDA    $07,X               5
7E97 8108       CMPA   #$08                2
7E99 2D01       BLT    $7E9C               3
7E9B 4F         CLRA                       2
7E9C 8407       ANDA   #$07                2
7E9E 48         ASLA                       2
7E9F 48         ASLA                       2
7EA0 31A6       LEAY   A,Y                 5
7EA2 A60C       LDA    $0C,X               5
7EA4 48         ASLA                       2
7EA5 31A6       LEAY   A,Y                 5
7EA7 10AEA4     LDY    ,Y                  6
7EAA 2003       BRA    $7EAF               3

7EAC 10AE03     LDY    $03,X               7

7EAF A602       LDA    $02,X               5
7EB1 2703       BEQ    $7EB6               3

7EB3 31A860     LEAY   $60,Y               5
7EB6 3410       PSHS   X                   7
7EB8 1F21       TFR    Y,X                 6
7EBA C602       LDB    #$02                2

7EBC A68830     LDA    $30,X               5
7EBF A4C4       ANDA   ,U                  4
7EC1 AA80       ORA    ,X+                 6
7EC3 A7C4       STA    ,U                  4
7EC5 A68830     LDA    $30,X               5
7EC8 A441       ANDA   $01,U               5
7ECA AA80       ORA    ,X+                 6
7ECC A741       STA    $01,U               5
7ECE A68830     LDA    $30,X               5
7ED1 A442       ANDA   $02,U               5
7ED3 AA80       ORA    ,X+                 6
7ED5 A742       STA    $02,U               5
../...
7FA3 A68830     LDA    $30,X               5
7FA6 A4C900A8   ANDA   $00A8,U             8
7FAA AA80       ORA    ,X+                 6
7FAC A7C900A8   STA    $00A8,U             8
7FB0 A68830     LDA    $30,X               5
7FB3 A4C900A9   ANDA   $00A9,U             8
7FB7 AA80       ORA    ,X+                 6
7FB9 A7C900A9   STA    $00A9,U             8
7FBD A68830     LDA    $30,X               5
7FC0 A4C900AA   ANDA   $00AA,U             8
7FC4 AA80       ORA    ,X+                 6
7FC6 A7C900AA   STA    $00AA,U             8

7FCA 33C900C0   LEAU   $00C0,U             8
7FCE 5A         DECB                       2
7FCF 1026FEE9   LBNE   $7EBC               6/5
7FD3 3510       PULS   X                   7
7FD5 39         RTS                        5
C'est plus ou moins la routine de sprites 24x24 qu'on a vu en $C8EA. Le patch est similaire
Code:
* sprite 16x16
    ORG     $7E7F
   
    LDU     #$6560
   
    PSHS    X
    LEAY    ,X
   
    LEAU   $60,U
    LDD     ,Y
    ANDA    #$7F
    LEAU    A,U
    LDA     #$18
    MUL
    LEAU    D,U
   
    LDA     10,Y
    BEQ     L1
   
    LDX     #$7E5F
    LDB     7,Y
    CMPB    #8
    BLT     L2
    CLRB
L2  ANDB    #7
    ASLB
    ASLB
    ABX
   
    LDB     12,Y
    ASLB
    LDX     B,X
    BRA     L3
L1  LDX     3,Y

L3  LDB      #12
    LDA     2,Y
    BEQ     L4
    ADDB   #$60

MSK MACRO
    INDEXED LDD,\0-$60,U
    INDEXED ANDA,$30+\1-12,X
    INDEXED ANDB,$31+\1-12,X
    INDEXED ORA,0+\1-12,X
    INDEXED ORB,1+\1-12,X
    INDEXED STD,\0-$60,U
    INDEXED LDA,\0-$5e,U
    INDEXED ANDA,$32+\1-12,X
    INDEXED ORA,2+\1-12,X
    INDEXED STA,\0-$5e,U
    ENDM

L4  LEAX    B,X
    LDY       #L5
    PSHS   X,Y
    BRA     L6
L5  LEAU    $C0,U
    LEAX    24,X
L6  SET     *
    MSK     0,0
    MSK     $18,3
    MSK     $30,6
    MSK     $48,9
    MSK     $60,12 
    MSK     $78,15
    MSK     $90,18
    MSK     $A8,21
    PULS   X,PC
Ca march bien, .. jusqu'à ce qu'on zigouille un ennemi et là ca plante ! :mad:

Heureusement en utilisant la fonction TRACE de DCMoto, et en analysant les chemins d'execution vers $7EB6, je tombe sur ceci
Code:
7C5A 108E7E3F   LDY    #$7E3F              D=03E0 X=7FE5 Y=7D2E U=6D4C S=BC62 DP=61 CC=D1 | Banques: SYST=0 ROM=0 RAM=0F MEMO=0 VIDEO=1
7C5E 48         ASLA                       D=03E0 X=7FE5 Y=7E3F U=6D4C S=BC62 DP=61 CC=D1 | Banques: SYST=0 ROM=0 RAM=0F MEMO=0 VIDEO=1
7C5F 10AEA6     LDY    A,Y                 D=06E0 X=7FE5 Y=7E3F U=6D4C S=BC62 DP=61 CC=D0 | Banques: SYST=0 ROM=0 RAM=0F MEMO=0 VIDEO=1
Ok rien de spécial, sauf que là, regardez:
Code:
7C62 BD7EB6     JSR    $7EB6               D=06E0 X=7FE5 Y=BDC6 U=6D4C S=BC62 DP=61 CC=D8 | Banques: SYST=0 ROM=0 RAM=0F MEMO=0 VIDEO=1
7EB6 3410       PSHS   X                   D=06E0 X=7FE5 Y=BDC6 U=6D4C S=BC60 DP=61 CC=D8 | Banques: SYST=0 ROM=0 RAM=0F MEMO=0 VIDEO=1
7EB8 1F21       TFR    Y,X                 D=06E0 X=7FE5 Y=BDC6 U=6D4C S=BC5E DP=61 CC=D8 | Banques: SYST=0 ROM=0
Une autre routine saute pile au milieu de notre routine de remplacement.

Gasp! :colere: Donc le code plus haut n'est pas atomique. D'autres endroits du jeux sautent en plein milieu. Comme il m'est impossible de tracer tous ces appels "sauvages" (la trace m'en montre qu'il n'y en a pas qu'un seul), le mieux qu'on puisse faire est de ne pas patcher l'ensemble de la routine mais uniquement la partie $7EB6->$7FD5 qui réalise l'affichage et semble vraiment atomique. On ne peut plus ainsi réorganiser les registres au mieux et le gain sera marginal (on gagne juste au niveau des LDD/STD au lieu de deux LDA). Voici ce que ca donne:
Code:
(main)PATCH
* Compiler avec:
* c6809.exe  -bd -am -oOP PATCH_7EB6_7FD5.txt 7EB6_7FD5.RAW

* Optimise "OPCODE n,Reg" en "OPCODE ,Reg" quand n=0.
INDEXED MACRO
  IFEQ \1
    \0      ,\2
  ELSE
    \0      \1,\2
  ENDC
    ENDM

* Jeu de masque AND/OR sur 3 octets horizontaux
MSK MACRO
    INDEXED LDD,\0-$60,U
    INDEXED ANDA,$30+\1-12,X
    INDEXED ANDB,$31+\1-12,X
    INDEXED ORA,0+\1-12,X
    INDEXED ORB,1+\1-12,X
    INDEXED STD,\0-$60,U
    INDEXED LDA,\0-$5e,U
    INDEXED ANDA,$32+\1-12,X
    INDEXED ORA,2+\1-12,X
    INDEXED STA,\0-$5e,U
    ENDM
   
* sprite 16x16
    ORG     $7EB6
    LEAU    $60,U   ; on re-avance U pour avoir des index 8 bits
   
    LEAS    -6,S   
    STX     4,S     ; sauvegarde X en entree
   
    LDX     #L4     ; on simule un BSR L5
    STX     2,S     ; incluant une sauvegarde de X
    LEAX    12,Y    ; sur 68000 on ferait "PEA 12,Y"
    STX     ,S

    BRA     L5
L4  LEAU    $C0,U
    LEAX    24,X
   
L5  SET     *
    MSK     0,0
    MSK     $18,3
    MSK     $30,6
    MSK     $48,9
    MSK     $60,12 
    MSK     $78,15
    MSK     $90,18
    MSK     $A8,21
    PULS    X,PC
Avec lui le temps entre 2 rafraichissement est réduit de 0.5 ms/ennemi "simple". C'est "bof". On devrait pouvoir faire mieux en patchant tous les calculs entourant les appels à cette routine. Mais pour ca il faudrait avoir le code source d'origine, je le crains.


Fichiers joints:
Commentaire: Ce patch inclus.
slap-fight_to8.zip [50.98 Kio]
Téléchargé 326 fois

_________________
Good morning, that's a nice Tnetennba
Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 10 Juin 2021, 09:44 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Samuel Devulder a écrit:
Une façon de trouver cela est de faire de l'échantillonnage. On laisse le jeu tourner, puis on lance le débuggeur au pif plein de fois et on note le compteur program à cet instant. On fait ca vraiment plein de fois, et on fini par trouver une zone dans laquelle, statistiquement, le compteur programme est souvent. Et cette zone là peut être un bon candidat à l'optimisation.
J'ai trouvé un truc pour faire ca "tout seul". Je vous le livre directement tellement c'est trop bien. :love:
Code:
cat dcmoto_trace.txt | awk '{print $1}' | sort | uniq -c | sort -n > freq.txt
C'est tout ! :bien:

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 10 Juin 2021, 09:59 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
bien vu !
Il est bien pratique ce dcmoto_trace.txt :good:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 10 Juin 2021, 10:25 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Bien joué Bentoc, mais j'en vois qui sont encore perplexes :hum: :voyons:
Code:
cat dcmoto_trace.txt | awk '{print $1}' | sort | uniq -c | sort -n > freq.txt
Quelques explications alors...

Il faut utiliser la fonction "trace" de DCMoto avec aucun point d'arrêt sur le jeu. Il enregistre alors 100Mo de trace correspondant peu ou prou aux 760 000 dernières instructions exécutés (une ligne faisant 136+2 caractères, faites le calcul). Une instruction moyenne durant 4 cycles, cela représente environ 3 secondes d'enregistrement.

Dans ces 3 secondes, le jeu fait pas mal de choses, et on peut espérer que le fichier de trace reflète assez bien le nombre de fois où une routine est appelée. Pour cela il suffit d'extraire la 1ere colonne du fichier de trace (commande awk dans la commande unix plus haut) et de compter combien de fois chaque valeur de PC revient. C'est ce réalise le reste de la ligne de commande (avec les sort, uniq, etc.) A la sortie on a un fichier qui a deux colonnes. La seconde est une valeur de PC rencontrée dans la trace. La première est le nombre de fois où l'on a trouvé ce PC. Cela ressemble à ceci au début
Code:
      1 7BEA
      1 7BED
      1 7BF0
      1 81DB
      1 81DD
...
Cela ne nous informe de pas grand chose: on est passé 1 fois en $FBEA puis en $7BED et $7BF0.. ok ces trois instructions doivent faire parties d'une routine appelée qu'une seule fois au cours des 3 dernières secondes. Mouais. :bah:

En revanche la fin du fichier est plus instructive car elle montre de gros blocs ayant le même nombre d'occurrence pour des valeurs consécutives (enfin croissantes) du PC. Assurément là on retrouve les routines les plus fréquemment utilisées. Ainsi le dernier bloc est celui-ci:
Code:
  10492 C095
  10492 C098
  10493 C09B
  10493 C09D
  10493 C09F
  10493 C0A1
  10493 C0A3
  10493 C0A5
  10493 C0A7
  10493 C0A9
  10493 C0AB
  10493 C0AD
  10493 C0AF
  10493 C0B1
  10493 C0B3
  10493 C0B5
  10493 C0B8
Il nous dit que du code de $C095 à $C0B8 est appelé plus de 10 000 fois dans les 3 dernières secondes... Euhh attendez $C095->$c0B8 ca me dit un truc.. :voyons: Mais oui :oui: c'est la 1ere routine sur laquelle je suis tombé dans mon analyse. Bim! la méthode me la pointée directement. C'est cool :sol:

Regardons ensuite le "bloc" au dessus:
Code:
   7114 BF48
   7114 BF4A
   ...
   7115 BF43
   7115 BF46
Arf, on retombe sur la routine $BF35->$BF48 qui était un autre patch.. Whaou!!! :coolfuck:

Autre "bloc" de PC consécutifs plus haut
Code:
   2623 C0BC
   2623 C0BE
   2623 C0C2
   ...
   2623 C115
   2623 C119
Et hop directement cet >>autre patch<<. Trop fort !! Les 3 premiers patchs sur lesquels j'ai travaillé sont les 3 derniers "blocs" de la fin de fichier ! :eek:

Assurément cette technique nous identifie les grosses routines dans lesquelles le jeu passe du temps, et cela bien plus vite que ce que je faisais avec ma technique d'échantillonnage "manuel". Notons qu'en partant des blocs les plus souvent appelés (c'est à dire la fin du résultat de la commande supra), cela nous donne en plus les routines dans l'ordre du meilleur gain que l'on peut escompter si on arrive à les optimiser. C'est tout bon ca :bien:

Il est à présent temps de voir les autres blocs que nous produit la commande unix barbare du début.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 10 Juin 2021, 22:15 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Samuel Devulder a écrit:
Il est à présent temps de voir les autres blocs que nous produit la commande unix barbare du début.
Et bien poursuivons. Le prochain bloc est très petit
Code:
   1652 C25B A680       LDA    ,X+         6
   1652 C25D 2702       BEQ    $C261       3
    236 C25F A7C4       STA    ,U          4
   1652 C261 3341       LEAU   $01,U       5
   1652 C263 6AE4       DEC    ,S          6
   1652 C265 26F4       BNE    $C25B       3
Il correspond à la boucle principale du code dont je me demandais s'il était utilisé (plus haut). On constate une grosse différence du nombre de passage en $C25F et entre $C261, preuve que l'essentiel des BEQ est vrai ce qui invalide l'hypothèse de l'optimisation précédente. A la place je propose ceci qui utilise un index 8 bit sur U et X e qui est plus rapide que l'auto incrémentation (c'est possible car l'ordre de parcours importe peu et la trace indique que les valeur de U,X son écrasées à la sortie):
Code:
C257 3404       PSHS   B                   6
C259 C60E       LDB    #$0E                2
C25B A685       LDA    B,X                 5
C25D 2702       BEQ    $C261               3
C25F A7C5       STA    B,U                 5
C261 5A         DECB                       2
C262 2CF7       BGE    $C25B               3
C264 3584       PULS   B,PC                8
ce qui économise 6 cycles par tour (c'est toujours ca de pris et en plus le code est plus court.)

Plus haut encore on trouve:
Code:
   1300 D8A1
   1300 D8A3
   ...
   1300 D8CB
qui correspond à ceci:
Code:
D897 8EB090     LDX    #$B090              3
D89A 8614       LDA    #$14                2
D89C 3402       PSHS   A                   6
D89E CC6363     LDD    #$6363              3
D8A1 ED02       STD    $02,X               6
D8A3 ED04       STD    $04,X               6
...
D8BE ED881A     STD    $1A,X               6
D8C1 ED881C     STD    $1C,X               6
D8C4 ED84       STD    ,X                  5
D8C6 30881E     LEAX   $1E,X               5
D8C9 6AE4       DEC    ,S                  6
D8CB 26D4       BNE    $D8A1               3
D8CD 3502       PULS   A                   6
D8CF 39         RTS                        5
Ceci initialise une zone continue de 600 octets avec $63. Il fait cela en 2080 cycles (2ms). C'est super long. On peut faire plus court avec le code suivant qui marche à l'envers avec la pile utilisateur:
Code:
D897 3460       PSHS   U,Y                 9
D899 CC6363     LDD    #$6363              3
D89C 8E6363     LDX    #$6363              3
D89F 3184       LEAY   ,X                  4
D8A1 CEB2E8     LDU    #$B2E8              3
D8A4 3636       PSHU   Y,X,B,A            11
D8A6 3636       PSHU   Y,X,B,A            11
D8A8 3636       PSHU   Y,X,B,A            11
D8AA 3636       PSHU   Y,X,B,A            11
D8AC 3636       PSHU   Y,X,B,A            11
D8AE 3636       PSHU   Y,X,B,A            11
D8B0 3636       PSHU   Y,X,B,A            11
D8B2 3636       PSHU   Y,X,B,A            11
D8B4 3636       PSHU   Y,X,B,A            11
D8B6 3636       PSHU   Y,X,B,A            11
D8B8 1183B090   CMPU   #$B090              5
D8BC 26E6       BNE    $D8A4               3
D8BE 35E0       PULS   Y,U,PC             11
qui fait la même chose en 1202 cycles, presque moitié moins :)

Bon au dessus on tombe sur des routines trop petites ou non terminales pour lesquelles je ne vois pas trop de gain à atteindre. Si j'intègre tous les patchs dans SLAP1DAT.PRG je passe d'un rafraichissement écran tous les 106844 cycles à tous les 83588 soit environ 22% plus rapide :sol:

Je pense qu'il doit être possible d'approcher asymptotiquement 25% au prix de nombreuses écritures des endroits utilisant mal la pile (JSR/BSR suivi par un RTS, fusion d'un PULS et d'un RTS) ou utilisant la pile au lieu de registres pour les boucles. Cependant c'est un travail de fou (on gagne quelques dizaines de µs à chaque fois) et je pense ne pas avoir le courage. Donc je vais considérer que pour l'instant ceci est le mieux que je puisse faire après pratiquement un mois de boulot. Il est peut-être temps pour moi de regarder d'autres jeux pour voir s'ils peuvent être rendus plus rapides.


Fichiers joints:
Commentaire: 22% plus rapide
slap-fight_to8.zip [50.97 Kio]
Téléchargé 343 fois

_________________
Good morning, that's a nice Tnetennba


Dernière édition par Samuel Devulder le 11 Juin 2021, 10:40, édité 2 fois.
Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 11 Juin 2021, 09:35 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Bravo Sam : 22% c'est énorme !
et tout ça :
- sans le code source
- en patchant la RAM
- ... puis l'image disquette
- en nous donnant toutes les explications

Un boulot de dingue ... repsect !

Idée pour le prochain jeu : une version "turbo" de Turbocup :W ?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 11 Juin 2021, 10:43 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
C'est marrant de lancer la version d'origine et la version patchée cote à cote et de laisser tourner le jeu sans rien faire. La version patchée finit la partie sacrément plus vite. :)
phpBB [video]


Question autres jeux je m'étais posé la question de Sortilèges qui est un jeu qui m'a toujours étonné. Il y a de la 3D, ce qui me fascine, et il me semble pas mal rapide à l'écran.. sauf à certain moment où le perso semble se trainer un boulet qui ralenti l'affichage. Cela se produit typiquement quand il y a des objets à ramasser. Pourquoi est-ce que cela ralenti le jeu ? Et même est-ce bien cela la cause ?

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 11 Juin 2021, 22:33 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 478
Ah ouais on voit bien que ça speed carrément là ! chapo !

_________________
Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 12 Juin 2021, 14:44 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Et mais la triche ? je ne vous ai pas parlé de la triche. Comment peut-on tricher ?

Et bien je galère à trouver les mémoires mises en jeu. Cependant là encore la trace DCMoto va nous aider. J'ait démarré la trace juste avant que le jeu ne dessine le décors. En particulier les 5 "engins" à droite. J'ai alors lancé ceci:
Code:
cut -c1-43 dcmoto_trace.txt | sort | uniq -c | less
qui affiche le code exécuté tel qu'organisé en mémoire mais préfixé par le nombre de fois que chaque instruction a été exécutée. Exemple:
Code:
      1 C3FB 8EFFFF     LDX    #$FFFF             
  65535 C3FE 48         ASLA                       
  65535 C3FF 3D         MUL                       
  65535 C400 301F       LEAX   -$01,X             
  65535 C402 26FA       BNE    $C3FE               
      1 C404 39         RTS           
Où l'on comprends tout de suite que c'est une boucle de temporisation. Mais ce n'est pas là où je veux en venir. Je me suis dit que le nombre de vaisseaux, 5, devait apparaitre aussi dans un genre de boucle. Appelé une fois à l'entrée et à la sortie, mais 5 fois au milieu. Je relis alors le code avec les occurrence et tombe sur ceci:
Code:
      1 D032 B6CF9E     LDA    $CF9E               
      1 D035 270B       BEQ    $D042               
==>   1 D037 3402       PSHS   A                   
==>   5 D039 BDD05A     JSR    $D05A
==>   5 D03C 6AE4       DEC    ,S       
==>   5 D03E 26F9       BNE    $D039 
==>   1 D040 3502       PULS   A                   
      1 D042 8606       LDA    #$06   
C'est le seul endroit correspondant à ce motif: 1 5...5 1. Et si $CF9E contenait le nombre de vaisseaux ? Mettons un point d'arrêt en écriture sur cette valeur...
Code:
D019 7ACF9E     DEC    $CF9E               7 <== Touché
D01C 2D04       BLT    $D022               3
D01E BDD027     JSR    $D027               8
D021 39         RTS                        5
D022 3266       LEAS   $06,S               5
D024 16004A     LBRA   $D071               5
Oh sans déc, un DEC! Est-ce que ca ne serait pas là qu'on pert un vaisseau ? Remplaçons le DEC par TST ($7D) et le BLT par BRN ($21)..
Code:
D019 7DCF9E     TST    $CF9E               7 <== était DEC ($7A)
D01C 2104       BRN    $D022               3 <== était BLT ($2D)
D01E BDD027     JSR    $D027               8
D021 39         RTS                        5
D022 3266       LEAS   $06,S               5
et là oh magie! On ne pert plus aucun vaisseau. :cool: On a une infinité de vies :coolfuck:

Alors c'est pas aussi facile que d'être à l'abri des balles, mais au moins ca reste "fair play" avec le jeu car il faut continuer à échapper aux tirs. Par contre, on ne pert pas toute la partie bêtement par un ennemi planqué au calme dans un coin qui nous prends en traitre par l'arrière. Ok là on est touché, mais on reprends après avec l'ennemi en moins (car oui le jeu retire du jeu l'ennemi qui nous a touché, même quand c'est un big boss je crois).

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [Etude] Slap Fight
MessagePosté: 13 Juin 2021, 06:28 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Samuel Devulder a écrit:
J'ai alors lancé ceci:
Code:
cut -c1-43 dcmoto_trace.txt | sort | uniq -c | less
qui affiche le code exécuté tel qu'organisé en mémoire mais préfixé par le nombre de fois que chaque instruction a été exécutée.


Il ne manque plus que le nombre de cycles par instruction dans la trace dcmoto pour avoir un profiler de compétition !

(Bien joué pour les vies infinies)


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

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 26 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 à:  
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com