Logicielsmoto.com

Nous sommes le 28 Mar 2024, 14:46

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 598 messages ]  Aller à la page Précédente  1 ... 12, 13, 14, 15, 16, 17, 18 ... 40  Suivante
Auteur Message
MessagePosté: 01 Oct 2021, 08:48 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Question optim je ferais un profiling et déplacerais l'un des labels L10x, MASK, etc (celui le plus fréquent) juste avant LOOP pour économiser le coût du "BRA LOOP".

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 01 Oct 2021, 10:32 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Je viens de prendre le temps de lire le code que tu as posté, c'est excellent.

Peut-être peut on utiliser la balise libre de la manière suivante :
01 000000 (or) => masque AND $0F
11 000000 (or) => masque AND $F0

du coup le masque AND est hardcodé et on demultiplie le bout de routine correspondant, mais on gagne un octet à chaque paire de pixel dont l'un est transparent.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 01 Oct 2021, 11:14 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Oui si tu travailles en BM4.. le code plus haut est ultra général en fait.

Reste à voir le taux de compression et la vitesse d'affichage.

Remarque: si on veut un taux de compression super fort on peut prévoir un code qui dit "répéter les n octets de l'offset p", ce qui est un début de compression LZ. C'est super avantageux pour encoder les séquences répétitives. Par exemple abcabcabc s'encode en "recopie 3 littéraux: a b c", puis "répète 6 fois la recopie des octets à l'offset -3" . La dernière commande montre toute la puissance de cet encodage car quand on va avoir réalisé la 2e copie de a,b,c alors offset (-3 par rapport à la position courante) pointe alors sur le début de "abc" qui vient d'être produit et on peut donc recopier le motif. Bref ca compresse super bien les trucs répétitifs comme des motifs tramés". Cela généralise l'encodage pour un seul octet en un sens (il suffit de dire que si p=0, on preds l'octet suivant comme litéral et on passe l'offset à -1). Avec n+p sur 6 bits on peut faire n et p chacun sur 3 bits, ou 4 pour n et 2 pour p ou inversement.

En plus ca doit être un exercice de codage rigolo :)

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 01 Oct 2021, 12:43 
Hors ligne

Inscription: 24 Juil 2010, 16:08
Messages: 454
Localisation: France
Dans https://github.com/emmanuel-marty/lzsa il y a une comparaison entre différents décompresseurs en terme de place gagnée et de temps de décompression.
La comparaison est faite sur z80, ça pourrait être intéressant de faire la même chose sur la version 6809 (certains décompresseurs qui fonctionnent bit par bit seront plus lent car il manque certaines instructions par rapport au z80 dans ce domaine, par exemple).

Le LZSA1-m5 a l'air plutôt rapide, et se rapproche presque de la vitesse d'une copie mémoire sans décompression avec l'instruction LDIR sur z80 (qui n'est pas la façon la plus rapide de copier de la mémoire).


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 01 Oct 2021, 13:35 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Samuel Devulder a écrit:
En plus ca doit être un exercice de codage rigolo :)

  • 00 000000 => fin
  • 00 nnnnnn => skip(n unsigned 6 bits)
  • 01 000000 (byte) => Masque la partie gauche et ajoute (byte)
  • 01 nnn000 (byte) => repète (byte) nnn fois
  • 01 nnnppp => repéte les nnn+1 bytes à l'offset -ppp
  • 10 nnnnnn (b1) .. (bn+1) ==> recopie les n+1 octets
  • 11 000000 (byte) => Masque la partie droite et ajoute (byte)
  • 11 nnnnnn (byte) => skip(14 bits signés)
Code:
LOOP
  LDA ,Y+
  LSLA
  BCC L0x
  BMI L11x
L10x (recopie)
  LDB ,Y+
  STB ,X+
  SUBA #2
  BCC L10x
  BRA LOOP
L11x (skip 14 bits)
  LDB  #$FF
  LSLA 
  BEQ MASK
  ASRA     extension de signe
  ASRA     extension de signe
  LDB ,Y+
  LEAX D,X
  BRA LOOP
MASK
  EORB  #$F0
  ANDB ,X
  ORB ,Y+
  STB ,X+
  BRA LOOP
L0x
  BEQ FIN
  BMI L01x
SKIP (saute 6 bits)
  LDB -1,Y
  ABX
  BRA LOOP
L01x
  CLRB
  ANDA #%01111110
  BEQ MASK
  LDB -1,Y
  ANDB #%00000111
  BEQ  REPETE
  NEGB
  LEAU B,X
 LZx
  LDB ,U+
  STB ,X+
  SUBA #%00010000
  BCC LZx
  BRA LOOP
REPETE
  LDB ,Y+
REP1
  STB ,X+
  SUBA #%00010000
  BCC REP1
  BRA LOOP

(sous réserve d'erreur et sans doute optimisable)

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 01 Oct 2021, 23:43 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Je suis en cours de test sur la version d'hier soir (sans les répétition type LZ).
J'ai fait qq modifs car il y avait un problème quand on avait des offsets entre 64 et 255, dans ce cas on était sur la balise 11000000 qui nous branchait sur le mask left.
Du coup j'ai modifié le format et on utilise le 10000000 pour le mask left
ça implique d'avoir un comptage n et non plus n+1 pour les nombre de répétitions, du coup j'ai remplacé les bcc par des bne pour le point de sortie du compteur.

// 00 000000 => end of data
// 00 nnnnnn => write ptr offset n:1,63 (6 bits unsigned)
// 01 000000 vvvvvvvv => right pixel is transparent, v : byte to add
// 01 nnnnnn vvvvvvvv => n : number of byte to repeat (6 bits unsigned), v : value
// 10 000000 vvvvvvvv => left pixel is transparent, v : byte to add
// 10 nnnnnn vvvvvvvv ... => n : number of bytes to write (6 bits unsigned), v : value, ...
// 11 nnnnnn nnnnnnnn => write ptr offset n:-8192,8191 (14 bits signed)

J'ai encore qq bugs a corriger, je verrai demain.
Pour le moment on est à 90ko sur mon jeu de test au lieu de 114ko sur la précédente version (premier format RLE) et au lieu de 242ko pour la version sprite compilé.

C'est une super nouvelle ! ça a l'air de tourner a une vitesse exploitable.
Je donnerai le rapport de temps d'exécution avec la version sprite compilé quand j'aurai corrigé tous les bugs.

Je verrai par la suite pour la version avec répétition de motifs, je pense que ça va bien compresser de ce que je vois dans les données (pris au hasard):
Code:
        fdb   $CE4E
        fcb   128,$03
        fcb   $22
        fcb   65,$33
        fcb   $04
        fcb   128,$03
        fcb   $22
        fcb   65,$33
        fcb   $27
        fcb   64,$30
        fcb   $04
        fcb   128,$01
        fcb   $22
        fcb   128,$01
        fcb   $04
        fcb   65,$01
        fcb   $22
        fcb   128,$01
        fcb   $04
        fcb   65,$01
        fcb   $22
        fcb   128,$01
        fcb   $04
        fcb   65,$01
        fcb   $22
        fcb   128,$01
        fcb   $04
        fcb   128,$01
        fcb   $22
        fcb   128,$01
        fcb   $04
        fcb   128,$01
        fcb   $22
        fcb   128,$01
        fcb   0


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 02 Oct 2021, 16:43 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
ça y est ça fonctionne !
J'ai surtout galéré sur la partie encodage ...

Par rapport aux sprites compilés (valeurs approximatives) :
- Taille des données divisée par 3
- Durée d'exécution multipliée par 6

_sam_ voici le code ajouté au projet, très peu de changements par rapport à ton code d'origine.
Un grand merci pour ta contribution !!!

Reste à voir pour l'amélioration proposée hier, il faut que je bosse sur la partie encodage.

Code:
*------------------------------------------------------------------------------*
*                                                                              *
* Decode RLE image data with transparency                                      *
* Samuel Devulder (01/10/2021)                                                 *
*                                                                              *
*------------------------------------------------------------------------------*
* Data :                                                                       *
* ------                                                                       *
* 00 000000              => end of data                                        *
* 00 nnnnnn              => write ptr offset n:1,63 (unsigned)                 *
* 01 000000 vvvvvvvv     => right pixel is transparent, v : byte to add        *
* 01 nnnnnn vvvvvvvv     => n: nb of byte to repeat (unsigned), value          *
* 10 000000 vvvvvvvv     => left pixel is transparent, v: byte to add          *
* 10 nnnnnn vvvvvvvv ... => n: nb of bytes to write (unsigned), values         *
* 11 nnnnnn nnnnnnnn     => write ptr offset n:-8192,8191 (14 bits signed)     *
*                                                                              *
* Registers :                                                                  *
* -----------                                                                  *
* y  : Ptr to data part 1                                                      *
* u  : Ptr to data part 2                                                      *
* glb_screen_location_1 : Ptr to screen part 1                                 *
* glb_screen_location_2 : Ptr to screen part 2                                 *
*------------------------------------------------------------------------------*


DecMapAlpha
        ldx   glb_screen_location_1
        stu   @end+2
        cmpy  #0                       
        beq   @end                     ; branch if no data part 1
        bra   @loop
@l10x
        ldb   ,y+                      ; non-identical bytes
        stb   ,x+
        suba  #2
        bne   @l10x
@loop
        lda   ,y+                      ; new chunk
        lsla
        bcc   @l0x
        beq   @maskl   
        bpl   @l10x
@l11x
        lsla                           ; 14 bits offset
        asra
        asra
        ldb   ,y+
        leax  d,x
        bra   @loop
@l0x
        beq   @end
        bmi   @l01x
@skip
        ldb   -1,y                     ; 6 bits offset
        abx
        bra   @loop
@l01x
        anda  #%01111111
        beq   @maskr
        ldb   ,y+
@repeat
        stb   ,x+                      ; repeat identical bytes
        suba  #2
        bne   @repeat
        bra   @loop
@maskr
        ldb   #$0f                     ; write half byte (transparency px on right)
        andb  ,x
        orb   ,y+
        stb   ,x+
        bra   @loop
@maskl
        ldb   #$f0                     ; write half byte (transparency px on left)
        andb  ,x
        orb   ,y+
        stb   ,x+
        bra   @loop
@end   
        ldy   #0                       ; (dynamic) load next data ptr
        beq   @rts
        ldd   #0                       
        std   @end+2                   ; clear exit flag for second pass
        ldx   glb_screen_location_2
        bra   @loop
@rts    rts


Edit du 05/10/21 : correction anda #%01111111 au lieu de anda #%00111111


Dernière édition par Bentoc le 05 Oct 2021, 22:07, édité 1 fois.

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

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Par rapport au code de hier, je me suis fais la réflexion que sauter par dessus n octets n'est ni plus ni moins que de travailler "en mode LZ" avec l'offset 0 (on recopie un octet sur lui même, et alors?), et donc le code peut être bien plus simple et permettre de gagner un bit de plus dans le nombre d'octets à copier ou l'offset:
  • 0 0000000 => fin
  • 0 nnnnnn0 (n+2 bytes) => (1+)n+1 littéraux, mais le 1er forme un masque et et le second un masque ou (mettre deux fois la même valeur si on ne veut pas de masque)
  • 0 nnnnnn1 (n+2 bytes) => n+1(+1) littéraux, mais les deux derniers forment un masque et/ou (dupliquer si on en veut pas)
  • 1 nnnnppp => recopie nnnn+1 fois l'octet à l'offset -ppp par rapport à l'octet de sortie (0 est équivalent à simplement sauter par dessus les nnnn+1 octets de sortie suivants)
Code:
LOOP
  LDB ,Y+
  BMI LZCODE
  BEQ FIN
  LSRB
  BCS RMASK
LMASK
  LDA ,Y+
  ANDA ,X
  ORA ,Y+
  STA ,X+
L0
  LDA ,Y+
  STA ,X+
  DECB
  BCC L0
  BRA LOOP
RMASK
  BEQ L2
L1
  LDA ,Y+
  STA ,X+
  DECB
  BNE L1
L2
  LDA ,Y+
  ANDA ,X
  ORA ,Y+
  STA ,X+
  BRA LOOP
LZCODE
  LDA #7
  ANDA -1,Y
*  BEQ L4   optionnel
  NEGA
  LEAU A,X
L3
  LDA ,U+
  STA ,Y+
  SUBB #8
  BMI L3
  BRA LOOP

Le "BEQ L4" est optionnel mais permet d'aller juste un peu plus vite pour avancer de nnnn+1 fois avec un ABX:
Code:
L4
   ADDB #%10001000  (efface le bit de signe et ajoute 1)
   LSRB
   LSRB
   LSRB
   ABX
   BRA LOOP
La recopie d'un seul octet x s'écrit %0 000001 0, x,x, %1 nnnn001. C'est un peu plus long, c'est vrai. Mais je pense qu'on a rarement un octet sec à recopier. On aura plus facilement un truc genre <des trucs pas répétés>x x x x x. Alors il suffit d'écrire "<des trucs pas répétés>x" suivi de répète nnnn fois l'offset -1. Bref on fait passer l'octet répétitif dans la séquence de littéraux précédents. Alors je dis l'octet, mais en fait c'est encore plus puissant que cela car ca peut être jusqu'à la série de 7 octets qui se répètent.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 04 Oct 2021, 19:17 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Fool-DupleX a écrit:
Punaise, le graphisme sur Sinclair, il est ultra-chiadé, j'adore :love:

Ouais, ils arrivent vraiment à faire des jeux super jolis malgré les limitations graphiques:
phpBB [video]

_________________
Good morning, that's a nice Tnetennba


Dernière édition par Samuel Devulder le 18 Déc 2021, 12:29, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
MessagePosté: 05 Oct 2021, 21:30 
Hors ligne

Inscription: 06 Juin 2004, 08:23
Messages: 464
:eek: Mon dieu mais quel TALENT !! Et avec un scrolling différentiel, le truc qui nous faisait baver à l'époque :buzz:

On manque de graphistes de talent sur Thomson. Je ne connais qu'Exocet, perso ...


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 05 Oct 2021, 23:29 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Et tu as entendu le son du début rien qu'au buzzer. :cool: Je suis jaloux!

C'est clair que je me demande pourquoi on arrive même pas au même niveau sur Thomson. Est-ce le manque de bras (codeurs/graphistes/musicos?) ou quand même une certaine anémie du processeur et/ou de l'architecture ne permettant pas de se surpasser ?

Ou tout simplement une vache de grosse flemme...

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 06 Oct 2021, 07:16 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Oui l'éditeur c'est également Zosya, c'est aussi eux "Travel Through Time Volume 1: Northern Lights"
phpBB [video]


Ce qu'ils font est vraiment génial.

J'adore ces graphisme retro, ça me donne envie de décliner les routines graphiques du moteur de jeu pour gérer d'autres modes graphiques, en particulier le mode de superposition de pages. Avec le système de sprite compilé dans ce mode on pourrait aller vraiment très vite, car on n'aurait que la moitié des données vidéo à rafraichir pour faire un scroll.
Mais c'est du gros boulot, donc pas vraiment pour de suite.

Le fonctionnement à plusieurs permet vraiment de progresser plus vite, à l'image de ce qui a été fait en quelques jours sur la partie encodage/decodage de bitmap avec sam.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 06 Oct 2021, 08:11 
Hors ligne

Inscription: 24 Juil 2010, 16:08
Messages: 454
Localisation: France
Le Spectrum a une mémoire vidéo de 8Ko au lieu de 16Ko sur Thomson, j'imagine que ça fait pas mal de différence.

Sur TO8 on peut compenser car il y a beaucoup de RAM donc on peut précalculer pas mal de choses. Mais ça n'empêche que un écran de 16Ko, ça demande plus de temps pour redessiner les choses.

Pour les graphistes et musiciens, je pense que pas mal de gens seraient intéressés pour s'esayer au Thomson. Il suffit de leur demander :)
Par exemple en passant une annonce sur https://wanted.scene.org ?


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 06 Oct 2021, 20:23 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 478
hello,
le build sur framework TO8 fonctionne sur macOS aussi, génération des .fd .rom etc... OK
:good:

_________________
Image


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Oct 2021, 17:26 
Hors ligne

Inscription: 06 Juin 2004, 08:23
Messages: 492
adnz a écrit:
hello,
le build sur framework TO8 fonctionne sur macOS aussi, génération des .fd .rom etc... OK
:good:

Mais un emulateur Thomson sur MacOS qui soit un tant soit peu actuel n'existe pas :L


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 ... 12, 13, 14, 15, 16, 17, 18 ... 40  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

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