Logicielsmoto.com

Nous sommes le 29 Mar 2024, 14:07

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 280 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5, 6, 7, 8 ... 19  Suivante
Auteur Message
 Sujet du message: Re: MOD ?
MessagePosté: 05 Fév 2017, 22:49 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Oui il est modifié, ca correspond au test de fin d'instrument (et rebouclage par le LDD qui suit). Pour la performance, le code s'auto-moifie intensément. Désolé que je n'ai pas été assez précis sur cet aspect.

Bon j'entrevois une autre façon de coder la boucle.. A voir si ca respecte la taille et le timing.
[EDIT] oui 199µs/boucle.
Code:
    125                  7411     f_loop  set     *
     78  3     7411 CC   0000             LDD     #0          ; 3
     79  2     7414 8B   00               ADDA    #0          ; 2  LSB freq>>
     81  4     7416 97   12               STA     <*-4        ; 4
     82  2     7418 C9   00               ADCB    #0          ; 2
     84  3     741A 8E   0000             LDX     #0          ; 3
     85                  741B     ch_smp0 set     *-2
     86  3     741D 3A                    ABX                 ; 3
     87  4     741E 8C   0000             CMPX    #0          ; 4
     73                  741F     ch_end      set     *-2
     89  3     7421 25   DD               BCS     ch0L1      ; 3
     90  3     7423 8E   0000             LDX     #0
     73                  7424     ch_rpt      set     *-2
     92  5     7426 9F   1B       ch0L0   STX     <ch_smp0    ; 5
     93  4+0   7428 E6   84               LDB     ,X          ; 4
     94  2     742A C4   0F               ANDB    #$0F        ; 2
     73                  742B     nibble      set     *-1
     96  2     742C CA   F0       vol0    ORB     #$F0        ; 2
     73                  742D     vol      set     *-1
     98  4+1   742E E6   C5               LDB     b,u         ; 5
    100  4     7430 D7   98               STB     <mix0      ; 4 => 46

     78  3     7432 CC   0000             LDD     #0          ; 3
     79  2     7435 8B   00               ADDA    #0          ; 2  LSB freq>>
     81  4     7437 97   33               STA     <*-4        ; 4
     82  2     7439 C9   00               ADCB    #0          ; 2
     84  3     743B 8E   0000             LDX     #0          ; 3
     86  3     743E 3A                    ABX                 ; 3
     87  4     743F 8C   0000             CMPX    #0          ; 4
     89  3     7442 25   BE               BCS     ch1L1      ; 3
     90  3     7444 8E   0000             LDX     #0
     92  5     7447 9F   3C       ch1L0   STX     <ch_smp1    ; 5
     93  4+0   7449 E6   84               LDB     ,X          ; 4
     94  2     744B C4   0F               ANDB    #$0F        ; 2
     96  2     744D CA   F0       vol1    ORB     #$F0        ; 2
     98  4+1   744F E6   C5               LDB     b,u         ; 5
    100  4     7451 D7   96               STB     <mix1      ; 4 => 46

     78  3     7453 CC   0000             LDD     #0          ; 3
     79  2     7456 8B   00               ADDA    #0          ; 2  LSB freq>>
     81  4     7458 97   54               STA     <*-4        ; 4
     82  2     745A C9   00               ADCB    #0          ; 2
     84  3     745C 8E   0000             LDX     #0          ; 3
     87  4     7460 8C   0000             CMPX    #0          ; 4
     89  3     7463 25   9F               BCS     ch2L1      ; 3
     90  3     7465 8E   0000             LDX     #0
     92  5     7468 9F   5D       ch2L0   STX     <ch_smp2    ; 5
     93  4+0   746A E6   84               LDB     ,X          ; 4
     94  2     746C C4   0F               ANDB    #$0F        ; 2
     96  2     746E CA   F0       vol2    ORB     #$F0        ; 2
     98  4+1   7470 E6   C5               LDB     b,u         ; 5
    100  4     7472 D7   94               STB     <mix2      ; 4 => 46

     78  3     7474 CC   0000             LDD     #0          ; 3
     79  2     7477 8B   00               ADDA    #0          ; 2  LSB freq>>
     81  4     7479 97   75               STA     <*-4        ; 4
     82  2     747B C9   00               ADCB    #0          ; 2
     84  3     747D 8E   0000             LDX     #0          ; 3
     86  3     7480 3A                    ABX                 ; 3
     87  4     7481 8C   0000             CMPX    #0          ; 4
     89  3     7484 25   80               BCS     ch3L1      ; 3
     90  3     7486 8E   0000             LDX     #0
     92  5     7489 9F   7E       ch3L0   STX     <ch_smp3    ; 5
     93  4+0   748B E6   84               LDB     ,X          ; 4
     94  2     748D C4   0F               ANDB    #$0F        ; 2
     96  2     748F CA   F0       vol3    ORB     #$F0        ; 2
     98  4+1   7491 E6   C5               LDB     b,u         ; 5
    130
    106  2     7493 CB   00               addb    #0          ; 2
    107                  7494     mix2   set     *-1
    106  2     7495 CB   00               addb    #0          ; 2
    107                  7496     mix1   set     *-1
    106  2     7497 CB   00               addb    #0          ; 2
    107                  7498     mix0   set     *-1
    137
    138  4+1   749C 31   3F               leay    -1,y        ; 5
(139) Branch Out Of Range
    139  3     749E 26   FE               bne     f_loop      ; 3 ==> 199 cycles
Mais débordement encore pire: 14 octets :( Si on met un LBNE on se prend 3 cycles de plus, et ca dépasse 200µs. C'est pas encore bon. :voyons: Je ne dois pas être très loin quand même de la solution simple et de bon gout...

[EDIT2] YES! :coolfuck: 187 cycles (mais j'aime pas le LBNE final: c'est moche)
Code:
    120                  7411     f_loop  set     *
     78  2     7411 C6   00               LDB     #0          ; 2
     79  2     7413 CB   00               ADDB    #0          ; 2  LSB freq>>
     73                  7414     ch_flo      set     *-1
     81  4     7415 D7   12               STB     <*-3        ; 4
     82  2     7417 C6   00               LDB     #0          ; 2
     83  2     7419 C9   00               ADCB    #0          ; 2
     73                  741A     ch_fhi      set     *-1
     85  3     741B 8E   0000             LDX     #0          ; 3
     86                  741C     ch_smp0 set     *-2
     87  3     741E 3A                    ABX                 ; 3
     88  4     741F 8C   0000             CMPX    #0          ; 4
     73                  7420     ch_end      set     *-2
     90  3     7422 25   DC               BCS     ch0L1      ; 3
     91  3     7424 8E   0000             LDX     #0
     73                  7425     ch_rpt      set     *-2
     93  5     7427 9F   1C       ch0L0   STX     <ch_smp0    ; 5
     94  4+0   7429 E6   84               LDB     ,X          ; 4
     95  2     742B C4   0F               ANDB    #$0F        ; 2
     73                  742C     nibble      set     *-1
     97  2     742D CA   F0       vol0    ORB     #$F0        ; 2
     73                  742E     vol      set     *-1
    100  4+1   742F A6   C5               LDA     b,u         ; 5

     78  2     7431 C6   00               LDB     #0          ; 2
     79  2     7433 CB   00               ADDB    #0          ; 2  LSB freq>>
     81  4     7435 D7   32               STB     <*-3        ; 4
     82  2     7437 C6   00               LDB     #0          ; 2
     83  2     7439 C9   00               ADCB    #0          ; 2
     85  3     743B 8E   0000             LDX     #0          ; 3
     87  3     743E 3A                    ABX                 ; 3
     88  4     743F 8C   0000             CMPX    #0          ; 4
     90  3     7442 25   BE               BCS     ch1L1      ; 3
     91  3     7444 8E   0000             LDX     #0
     93  5     7447 9F   3C       ch1L0   STX     <ch_smp1    ; 5
     94  4+0   7449 E6   84               LDB     ,X          ; 4
     95  2     744B C4   0F               ANDB    #$0F        ; 2
     97  2     744D CA   F0       vol1    ORB     #$F0        ; 2
    102  4+1   744F AB   C5               ADDA    b,u         ; 5 => 43

     78  2     7451 C6   00               LDB     #0          ; 2
     79  2     7453 CB   00               ADDB    #0          ; 2  LSB freq>>
     81  4     7455 D7   52               STB     <*-3        ; 4
     82  2     7457 C6   00               LDB     #0          ; 2
     83  2     7459 C9   00               ADCB    #0          ; 2
     85  3     745B 8E   0000             LDX     #0          ; 3
     87  3     745E 3A                    ABX                 ; 3
     88  4     745F 8C   0000             CMPX    #0          ; 4
     90  3     7462 25   A0               BCS     ch2L1      ; 3
     91  3     7464 8E   0000             LDX     #0
     93  5     7467 9F   5C       ch2L0   STX     <ch_smp2    ; 5
     94  4+0   7469 E6   84               LDB     ,X          ; 4
     95  2     746B C4   0F               ANDB    #$0F        ; 2
     97  2     746D CA   F0       vol2    ORB     #$F0        ; 2
    102  4+1   746F AB   C5               ADDA    b,u         ; 5 => 43

     78  2     7471 C6   00               LDB     #0          ; 2
     79  2     7473 CB   00               ADDB    #0          ; 2  LSB freq>>
     81  4     7475 D7   72               STB     <*-3        ; 4
     82  2     7477 C6   00               LDB     #0          ; 2
     83  2     7479 C9   00               ADCB    #0          ; 2
     85  3     747B 8E   0000             LDX     #0          ; 3
     87  3     747E 3A                    ABX                 ; 3
     88  4     747F 8C   0000             CMPX    #0          ; 4
     90  3     7482 25   82               BCS     ch3L1      ; 3
     91  3     7484 8E   0000             LDX     #0
     93  5     7487 9F   7C       ch3L0   STX     <ch_smp3    ; 5
     94  4+0   7489 E6   84               LDB     ,X          ; 4
     95  2     748B C4   0F               ANDB    #$0F        ; 2
     97  2     748D CA   F0       vol3    ORB     #$F0        ; 2
    102  4+1   748F AB   C5               ADDA    b,u         ; 5 => 43
    125
    126  5     7491 B7   E7CD             sta     $E7CD       ; 5 sortie son
    127
    128  4+1   7494 31   3F               leay    -1,y        ; 5
    129  6     7496 1026 FF77             lbne    f_loop      ; 6 ==> 187 µs
 
je me demande si un "beq suite" suivi un "jmp <f_loop" à la place ne serait pas plus élégant ?

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 05 Fév 2017, 23:37 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Bon, j'ai trouvé un truc assez tordu, mais tu récupères 4 octets et 4 cycles :
Code:
f_loop  set     *
        LDB     #$00        ; 2
        ADDB    #0          ; 2  LSB freq>>
        STB     <*-4        ; 4
        LDX     #$0000     ; 3
smp0    equ     *-2
        ROLB                ; 2
        ANDB    #1          ; 2
        ABX                 ; 3
        CMPX    #$0000      ; 4
        BCS     ch0L1      ; 3
        LDX     #$0000      ; 3
ch0L0   STX     <smp0      ; 5 => 33
23 octets

        ldb     ,x          ; 4
        andb    #$0F        ; 2
        orb     #$F0        ; 2
        lda     b,u         ; 5 => 13
8 octets

Donc :
  • Tu rapproches les déplacements de pointeurs des prélèvements de sample
  • Tu libères le registre X en utilisant le registre S pour pointer le bus sonore

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 05 Fév 2017, 23:38 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Tu as été plus rapide que moi :lol:

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 05 Fév 2017, 23:51 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
lol :)

Le "ROLB ; ANDB #1" est intéréssant si les incréments sont <= 1 sur l'échantillon à chaque tour de boucle. Je garde ca dans un coin pour plus tard (car pour le moment j'ai gardé les incréments > 1.)

En fait c'est la séquence "LDB #freq_hi; ADCB #0" qui mange un octet de trop. On aimerait pouvoir écrire cela sur 3 octets au lieu de 4. Ce serait possible si on avait un ADBC implicite (avec #0 implicite). Je ne crois pas avoir vu une telle instruction dans les opcodes illégaux. C'est dommage. Si freq_hi était pair, "LDB #freq_hi/2; ROLB" ferait le truc. Mais il y a le cas impair, donc ca n'est pas suffisamment général.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 06 Fév 2017, 14:08 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Bon j'ai mal compté, j'ai oublié 3 cycles par voix qui coutent donc 46µs chacune, dont au total on a 4x46+5+5+6=200µs, 5khz tout juste. Ouf! ca passe encore.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 06 Fév 2017, 20:43 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Bon ca avance bien et le support pour la supperposition des samples est quasi fini. Xenon2 passe de 27ko à moins de 16ko (voir fichier joint). C'est très très bien :cool:

Mais j'ai une question d'optimisation. Il se trouve que j'ai besoin de faire une rotation du registre A sur lui-même pour échanger sa partie haute et sa partie basse. De façon compacte j'arrive à
Code:
rot4    bsr     rot2
rot2    bsr     rot1
rot1    lsla
        adca    #0
        rts
Mais c'est pas le plus rapide. On peut certes dérouler les appels et avoir 4 "lsla ; adca #0" en place soit un total de 16 cycles ce qui me semble long pour ce qu'on veut faire. Avec "LDX #tab-precalc; LDA A,X" on ferait pareil en 8 cycles (et 256 octets de perdus). Mais n'y a t-il pas un truc plus malin que je ne vois pas ?


Fichiers joints:
Commentaire: Xenon2 optimisé avec 2 instruments par octets. Il passe de 27ko à moins de 16ko.
xenon2_opt.zip [61.2 Kio]
Téléchargé 499 fois

_________________
Good morning, that's a nice Tnetennba
Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 06 Fév 2017, 22:28 
Hors ligne
M. DCMOTO

Inscription: 06 Juin 2004, 08:23
Messages: 681
Localisation: Provence (France)
Pourquoi pas quatre ROLA ?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 06 Fév 2017, 23:02 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
En fait ca marche pas avec 4 rols parce que ca revient à travailler sur 9 bits (la carry tient le role du 9e bit):
Code:
C=x A=01234567
> ROLA
C=0 A=1234567x
> ROLA
C=1 A=234567x0
> ROLA
C=2 A=34567x01
> ROLA
C=3 A=4567x012
Sinon on peut aussi faire
Code:
CLR ,-S
LSLA
ROL ,S
LSLA
ROL ,S
LSLA
ROL ,S
LSLA
ROL ,S
ORA ,S+
Mais c'est affreusement lent :(Avec un MUL on va un poil plus vite (il est plus rapide que les 4 "LSLA ROLB" équivalents)
Code:
LDB #16
MUL
STB ,-S
ORA ,S+
mais ca écrase B et c'est pas non plus super rapide à cause des accès à la mémoire.

J'ai beau tourner le truc dans tous les sens il nous manque une rotation sur 8 bits seuls et je n'ai trouvé que l'astuce avec LSL + ADC pour l'émuler (mais ca ne marche pas avec des rotations à droite).

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 07 Fév 2017, 00:22 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Un petit peu plus rapide (8 cycles de mieux que le premier) :
Code:
sta  ,-s   4+2
lsra       2
lsra       2
lsra       2
lsra       2
sta  ,-s   4+2
lda  1,s   4+1
asla       2
asla       2
asla       2
asla       2
ora  ,s++  4+3
40 cycles

Sinon tu protèges A (pour place dans la pile) et B avec le MUL :
Code:
PSHS  A,B  5+2
LDB #16    2
MUL        11
STB ,S     4+0
ORA ,S+    4+2
PUlS  B  5+1
36 cycles

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 07 Fév 2017, 00:28 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Encore mieux. L'idée de Daniel était bonne, il suffisait de "décaler" préalablement le quartet fort d'un bit vers la gauche pour compenser l'erreur du 9ème bit :
Code:
sta   ,-s   4+2
anda  #$f0  2
adda  ,s+   4+2
rola        2
rola        2
rola        2
rola        2
22 cycles

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 07 Fév 2017, 08:22 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Oh génial! Tu introduis une bulle au milieu de A. J'adore! :love:
Code:
C=? A=abcdefghi
> STA ,-S
C=? A=abcdefghi
> ANDA #$F0
C=0 A=abcd0000
> ADDA ,S+
C=a A = bcd0fghi <==== Une bulle "0" au milieu. C'est génial ce truc !!!!
> RORA
C=b A=cd0fghia
> RORA
> RORA
> RORA
C=0 A=fghiabcd
Question vitesse 4x"LSLA; ADCA #0" restent finalement le plus rapide avec 16 cycles, mais ta solution est la plus courte de 2 octets!

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 07 Fév 2017, 09:39 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Si le programme se trouve dans la zone de page directe, tu obtiens 16 cycles et toujours 2 octets de mieux :

Code:
      sta   <ladd 4
      anda  #$f0  2
      adda  #$00  2
ladd  equ   *-1
      rola        2
      rola        2
      rola        2
      rola        2
16 cycles

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 07 Fév 2017, 10:17 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Là on approche du code ultime: 10 octets et 16 cycles. Si le code n'est pas auto-modifiable, on peut toujours utiliser l'un des registres temporaires de la page 0 du moniteur ce qui ajoute seulement 2 cycles de plus à l'ensemble.

Inspiré par cela je vais modifier la tranformation du volume "A" $0v (ou $v0) en $v0 (ou $0v) suivant la valeur de "nibble-ch_ref,x" ($F0 ou $0F). Il faut que la partie "v" du volume aille au niveau du "0" de la partie nibble "N"
Code:
  \N| $0F $F0
_A_\|_________
$v0 | $v0 $0v
$0v | $v0 $0v
Ca donne:
Code:
 tricky part: volume is $0v or $v0 and we
* must adapt it to the current nibble
        lda     vol-ch_ref,x    ; 5 A=abcd0000 or 0000abcd
        sta     ,s              ; 4
        anda    #$F0            ; 2 A=abcd0000 or 00000000
        adda    ,s              ; 4 A=bcd00000 or 0000abcd
        rola                    ; 2 A=cd00000a or 000abcd0
        rola                    ; 2 A=d00000ab or 00abcd00
        rola                    ; 2 A=00000abc or 0abcd000
        rola                    ; 2 A=0000abcd or abcd0000
        ora     ,s              ; 4 A=abcdabcd
        sta     ,s              ; 4
        anda    nibble-ch_ref,x ; 5 A=0000abcd (nibble=$0F) or abcd0000 (nibble=$F0)
        eora    ,s              ; 4 A=abcd0000 (nibble=$0F) or 0000abcd (nibble=$F0)
        sta     vol-ch_ref,x    ; 5
Si ca se trouve, pour cet usage on peut même être plus efficace en remarquant que la moitié de A est à 0.

Ah mais oui, carrément! Le ANDA #$F0 du ébut est inutile ([EDIT] non c'est faux :()

_________________
Good morning, that's a nice Tnetennba


Dernière édition par Samuel Devulder le 07 Fév 2017, 11:33, édité 8 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 07 Fév 2017, 10:42 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Non, le ANDA #$F0 n'est pas inutile :nanana: Sinon la valeur 0000abcd se décale d'un bit de plus.
Code:
        adda    vol-ch_ref,x    ; 5 A=bcd00000 or 000abcd0

et pas :
Code:
        adda    vol-ch_ref,x    ; 5 A=bcd00000 or 0000abcd

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: MOD ?
MessagePosté: 07 Fév 2017, 10:45 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Ah oui tu as raison. Je corrige aussitôt.

_________________
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  [ 280 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5, 6, 7, 8 ... 19  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

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