Logicielsmoto.com

Nous sommes le 19 Avr 2024, 21:28

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 598 messages ]  Aller à la page Précédente  1 ... 5, 6, 7, 8, 9, 10, 11 ... 40  Suivante
Auteur Message
MessagePosté: 15 Mai 2021, 15:00 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 434
Localisation: Var
Ces derniers jours j'ai avancé sur l'affichage de la piste. Toutes les images sont maintenant intégrées, y compris celles en "miroir" (virages à gauche).
Au total ça représente 106 images et environ 700Ko de sprites compilés.
On est loin des 57Ko du jeu d'origine qui lui fait appel a un algo de "fou furieux" pour compresser les données des 56 images (la symétrie est gérée au runtime).
Je ne suis pas allé en profondeur dans l'analyse de cet algo ... il y a 2000 lignes de code assembleur pour gérer tout ça.

J'ai envie d'aller jusqu'au bout de ce special stage et d'en faire une version jouable, ça pourrait faire un "mini-jeu" sympa de Sonic2 sur TO8 (avec une T.2).

Comme pour l'écran titre j'essaye de rester au plus près du code d'origine, je conserve donc naturellement le format des données :
- structure de la piste (terminé)
- emplacement des objets (en cours)
- données de perspective (pas commencé)

La bonne nouvelle :coolfuck: c'est qu'il existe un éditeur de niveau pour le special stage de sonic2 qui produit ces fichiers en sortie.
http://info.sonicretro.org/Sonic_2_Special_Stage_Editor
Les sources sont dispo ici:
https://github.com/flamewing/s2ssedit

Donc s'il y a trop de sprites à afficher (anneaux, bombes), je pourrai facilement modifier l'agencement des niveaux.

Il y a plein de mécanismes sympa dans ce special stage ... j'expliquerai ça au fil de l'eau.

Je vais commencer par les bombes qui n'ont pas d'animation (en dehors de l'effet de zoom).
Voici la conversion en 2:1 dans la palette existante (les mêmes couleurs que celles de la petite vidéo de mon premier essai de half-pipe avec Sonic).
Fichier(s) joint(s):
ssb.gif
ssb.gif [ 3.73 Kio | Vu 6013 fois ]


J'utilise maintenant les scritps photoshop pour le remap de couleurs indexées et le resize en batch, c'est un gain de temps fou !


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2021, 09:11 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 434
Localisation: Var
Salut,
J'ai besoin de votre aide pour la conversion du bout de code 68k suivant :

Code:
    muls.w  d4,d1
    asr.l   #8,d1


Il s'agit de multiplier deux valeurs 16bits signées :
- d1 (range FF00-1000) : correspond à un sin ou cos * 256, c'est pour cela qu'on a une valeur de -256 à 256
- d4 (range 0001-00FF) : correspond à un rayon stocké sur un byte
puis de diviser le résultat par 256

Comme les valeurs possibles pour les arguments sont restreintes, plutôt que d'implémenter un algo de multiplication complexe pour faire une division derrière, voici ma proposition :
Remarque :
- d1 est dans d
- d4 est stocké en 2,x

Code:
5             cmpd  #$FF00
3             bne   c0
2             lda   #$FF
4+1           ldb   2,x
2             negb
3             bra   c4
----------------
20 cycle(s) : CAS particulier d1=FF00
----------------
5     c0      cmpd  #$0100
3             bne   c1
2             lda   #0
4+1           ldb   2,x
3             bra   c4
----------------
18 cycle(s) + 8 = 26 cycles : CAS particulier d1=0100
----------------
3     c1      bmi   c2
4+1           lda   2,x
11            mul
6             tfr   a,b
2             lda   #0
3             bra   c4
----------------
30 cycle(s) + 8 + 8 = 46 cycles : CAS 0 <= d1 < 0100
----------------
4+1   c2      lda   2,x
2             nega
11            mul
6             tfr   a,b
2             lda   #$FF
2             negb
----------------
28 cycle(s) + 8 + 8 + 3 = 47 cycles :  CAS FF00 < d1 < 0
----------------
      c4


Une idée pour améliorer tout ça ? :voyons:


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2021, 10:26 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
En fait e que tu veux faire c'est multiplier 8 bits non signés (le rayon) par 8 bits signés (la partie haute du 256*sin() présente en 2,x).

Je ne pige pas trop les cas particuliers dans ton code
Code:
5             cmpd  #$FF00
3             bne   c0
2             lda   #$FF
car ici par exemple A=$FF forcément, et donc je ne comprends pas pourquoi on lui remets la même chose.

Perso je ferais tout simplement ainsi
Code:
SKIP1 MACRO
    FCB $C1
    ENDM

    LDB  2,X
    TSTA      ; test du signe
    BGE POS
    NEGA      ; cas sin<0 -- le fait passer à positif
    MUL       ; produit non signé >=0
    NEGA      ; réintroduction du signe
    SKIP1     ; On pourrait faire "BRA FIN"
POS MUL
FIN TFR A,B   ; division par 256
    SEX       ; transfert du signe de B dans A
A noter:
  • l'utilisation du SEX pour envoyer $00 ou $FF dans A en 2 cycles
  • la macro SKIP1 qui introduit un CMPB #nn pour sauter (non rien à voir avec le SEX :W ) au dessus d'un seul octet (celui du MUL). Cela coûte 2 cycles au lieu de 3 pour le BRA (et oui ca coûte un BRA :fresh: ).

Au niveau cycles, on a 2 cas à voir:
  • si sin<0, alors le code prends 2+3+2+11+2+2+6+2=30 cycles (pire cas), et
  • si sin>=0 le code tourne en 2+3+11+6+2=24 cycles.
Pas mal.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2021, 11:02 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 434
Localisation: Var
Merci pour cette réponse rapide !

Samuel Devulder a écrit:
En fait e que tu veux faire c'est multiplier 8 bits non signés (le rayon) par 8 bits signés (la partie haute du 256*sin() présente en 2,x).


=> c'est l'inverse le rayon est en 2,x sur un octet
=> le 256*sin() est sur 16 bits signés de -256 (FF00) à +256 (0100) et est chargé dans le registre D, comme je veux garder les 16 bits dans le calcul, c'est pour ça que je gère les deux cas particuliers car pour ces deux valeurs le LSB est 00

Samuel Devulder a écrit:
Je ne pige pas trop les cas particuliers dans ton code
Code:
5             cmpd  #$FF00
3             bne   c0
2             lda   #$FF
car ici par exemple A=$FF forcément, et donc je ne comprends pas pourquoi on lui remets la même chose.


=> effectivement il faut retirer le lda #$FF ... sorry

Samuel Devulder a écrit:
Perso je ferais tout simplement ainsi
Code:
SKIP1 MACRO
    FCB $C1
    ENDM

    LDB  2,X
    TSTA      ; test du signe
    BGE POS
    NEGA      ; cas sin<0 -- le fait passer à positif
    MUL       ; produit non signé >=0
    NEGA      ; réintroduction du signe
    SKIP1     ; On pourrait faire "BRA FIN"
POS MUL
FIN TFR A,B   ; division par 256
    SEX       ; transfert du signe de B dans A
A noter:
  • l'utilisation du SEX pour envoyer $00 ou $FF dans A en 2 cycles
  • la macro SKIP1 qui introduit un CMPB #nn pour sauter (non rien à voir avec le SEX :W ) au dessus d'un seul octet (celui du MUL). Cela coûte 2 cycles au lieu de 3 avec un BRA (et oui ca coûte un BRA :D ).

Au niveau cycles, on a 2 cas à voir:
  • si sin<0, alors le code prends 2+3+2+11+2+2+6+2=30 cycles (pire cas), et
  • si sin>=0 le code tourne en 2+3+11+6+2=24 cycles.
Pas mal ?


Du coup ça marche pas car ici on perd la partie basse du 256*sin() ...

Par contre cette macro SKIP1 est hallucinante !!!
J'ai mis 15 secondes avant de comprendre et je suis tombé de ma chaise :tourne:


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2021, 12:09 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
Oui SKIP1 est rigolo, et devines quoi.. il y a un SKIP2 aussi :) Je te laisse chercher une façon de l'implémenter :voyons: (mais c'est pas forcément plus rapide que BRA,. C'est juste plus court ce qui est utile si on est court en place mémoire.)

Ah oui, j'avais mal compris la partie basse. Je ne sais pas pourquoi, mais dans mon esprit D=32767*sin().. mais non tu l'as même écrit que D va de -256 à + 256. Du coup je pige les cas particuliers avec A=+/-1. On reprend:
Code:
    TSTA
    BMI  NEG 

* ICI A=0 ou 1, le cas A=1 revient à mettre 2,X dans B
    BEQ  POS
    LDB  2,X
    CLRA
    BRA FIN ; 2+3+3+5+2+3 = 18 cycles

POS LDA  2,X
    MUL
    TFR  A,B
    CLRA
    BRA FIN ; 2+3+3+5+11+6+2+3 = 35 cycles

* A=-1 ou 0
NEG BEQ NEG2
    LDB  2,X  ; A==-1 en ce point
    NEGB
    BRA FIN ; 2+3+3+5+2+3 = 18 cycles

NEG2
    LDA 2,X
    NEGB ; suppression du signe
    MUL
    NEGA ; ajout du signe
    TFR A,B
    LDA #-1 ; 2+3+3+5+2+11+2+6+2 = 36 cycles.
* 4 cycles plus (à cause des NEG) que le cas POS, mais comme
* on a pas de BRA, le total revient à +1 seulement)
FIN

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2021, 12:36 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 434
Localisation: Var
pour le SKIP2, je vois deux options :

- un CMPX ($8C) on perd un cycle (4 au lieu de 3 pour le BRA) mais on gagne un octet en place

ou bien ... si on accepte de perdre le contenu du registre D :
- un LDD ($CC) on a le même nombre de cycles que le BRA et on gagne un octet en place

Je regarde ta réponse en détail ce soir pour la multiplication (et encore merci).


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2021, 15:15 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
yep LDD LDX ou LDU ou les CMP correspondants avec 1 cycle de plus si on ne veut pas modifier les registres.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2021, 21:16 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 434
Localisation: Var
Bon après avoir étudié ta proposition, j'ai fait des tests et suis arrivé à ça :

Code:
        tsta
        beq   pos
        bpl   p256
        tstb
        bne   neg

n256    ldb   2,x
        negb
        bra   end
----------------
10 cycle(s) + 13 = 23
----------------
p256    clra
        ldb   2,x
        bra   end
----------------
10 cycle(s) + 8 = 18
----------------
pos     lda   2,x
        mul
        tfr   a,b
        clra
        bra   end
----------------
27 cycle(s) + 5 = 32
----------------
neg     lda   2,x
        negb
        mul
        nega
        negb
        sbca  #0
        tfr   a,b
        lda   #$FF
----------------
32 cycle(s) + 13 = 45
----------------


Voici la matrice d'échantillons de test ... ça a l'air de fonctionner :
Fichier(s) joint(s):
muls.png
muls.png [ 7.62 Kio | Vu 5957 fois ]


J'ai été obligé de faire un équivalent NEGD pour le cas de la multiplication négative, sinon dans certains cas ça ne fonctionnait pas (avec juste un NEGA).
Dans ta version il y avait encore une coquille : le BMI NEG faisait un appel à un BEQ NEG2 qui donc ne branchera jamais.
J'ai gardé ton idée des TST en lieu et place des CMPD car le gain est très intéressant.

Au final je suis bien content de ce petit échange, encore merci.

[Edit] Pour les tests j'utilise ce site que je trouve très pratique : http://6809.uk/


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2021, 23:18 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
Remplace le 1er TSTB par NEGB et retire celui qui arrive après, ca sera encore mieux !
Code:
        tsta
        beq   pos
        bpl   p256
        NEGB     ; était: tstb
        bne   neg
        ldb   2,x
       ...
neg     lda   2,x
*       negb   <-- couic, plus besoin !
        mul
        nega
        negb
        sbca  #0
        tfr   a,b
        lda   #$FF

Sinon oui le nega/negb/sbca à la fin c'est bof car ca ne change quelque chose que si b=0 à l'issu de la multiplication ce qui est "rare". Il faut je crois faire un produit entre 2 puissances de deux qui soit >= 256, soit
  • rayon=128 et 256*sin = -2,
  • rayon=64 et 256*sin=-4,
  • rayon=32 et 256*sin=-8
  • ...
  • rayon=2 et 256*sin=-128
Donc 8 produits sur les 128*513 possibles (128 rayons, et sinus de -256à 256=513 valeurs) où l'on aura un A plus gros de 1. A voir si c'est important ou pas.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 19 Mai 2021, 06:33 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 434
Localisation: Var
cool 2 cycles en moins !

pour le nega/negb/sbca je verrai au moment des tests (ça me plait pas non plus).


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 19 Mai 2021, 14:15 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 434
Localisation: Var
Petite astuce du jour à laquelle je n'avais pas pensé et qui est présent dans le code que je suis en train de "porter".

Dans une sous-routine, quand on veut retourner un booléen au code appelant pour brancher sur d'autres traitements,
et ce sans toucher aux registres de données, on peut utiliser :

En fin de sous-routine
Code:
   orcc  #$01 ; ou andcc  #$FE
   rts


De retour dans le code appelant :
Code:
   bcs   traitement_si vrai
traitement_si_faux
   ...


Ne me tapez pas dessus si c'est archi connu ...


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 19 Mai 2021, 20:25 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 478
ha oui ça peut faire gagner des lignes ça, moi je connaissais pas en tout cas, merci pour l'astuce ;)

ne me tapez pas dessus si c'est connus aussi :lol:

_________________
Image


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 26 Mai 2021, 22:01 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 434
Localisation: Var
Petit point intermédiaire, je trouvais que mes ombres étaient un peu étranges (pas symétriques et les images semblent pas idéalement placées au niveau inclinaison) :

Version TO8 Thomson :
Fichier(s) joint(s):
dcmoto3.png
dcmoto3.png [ 4.86 Kio | Vu 5857 fois ]


Alors j'ai mis mon fichier de test (piste et objets) dans la version megadrive de Sonic2 et recompilé la ROM.
Sous émulateur (gensKMod) on a ça :

Version Megadrive :
Fichier(s) joint(s):
s2built_275.png
s2built_275.png [ 8.03 Kio | Vu 5857 fois ]


Ah bah non le portage du code est bon :sol:
Au passage on peut voir que j'ai une image de décalage au niveau de la piste.

Au niveau vitesse c'est toujours rapide, même avec toutes ces bombes.
On verra quand le personnage de Sonic sera réintégré, mais il me faut porter les 900 lignes de code asm associées avant.

Je vous montre une petite vidéo dès que j'ai réglé 2 ou 3 bugs ...


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Mai 2021, 00:30 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 478
wouaaa. :oui:

_________________
Image


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Mai 2021, 11:38 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 434
Localisation: Var
Voici la vidéo :

phpBB [video]


Le défilement de la piste à été réglé à la vitesse maximum de 8fps (comme le jeu d'origine), c'est synchronisé par une IRQ à 1/50s (celle qui jouera la musique et lira le joystick)
Evidement ça peut ralentir si on charge trop les objets au moment d'un rendu d'une image de piste plus lente à dessiner que les autres.
A chaque boucle principale on regarde le temps écoulé grâce à l'IRQ et si il ne s'est pas écoulé 3 frames (on est en double buffering donc 6/2=3) alors on ne fait aucun rendu de piste.

Les objets sont rafraichis à chaque tour de la boucle principale du programme et donc profitent de tous les fps/cycles disponibles entre deux rendus de piste.

Il me reste un bout de code à écrire pour réguler l'avancement des objets quand ça ralenti, pour garder une impression de vitesse constante des objets par rapport à la piste.
On peut observer ce phénomène en fin de vidéo.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 598 messages ]  Aller à la page Précédente  1 ... 5, 6, 7, 8, 9, 10, 11 ... 40  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 98 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