Logicielsmoto.com
http://www.logicielsmoto.com/phpBB/

MOD ?
http://www.logicielsmoto.com/phpBB/viewtopic.php?f=3&t=549
Page 5 sur 19

Auteur:  Samuel Devulder [ 05 Fév 2017, 22:49 ]
Sujet du message:  Re: MOD ?

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 ?

Auteur:  Prehisto [ 05 Fév 2017, 23:37 ]
Sujet du message:  Re: MOD ?

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

Auteur:  Prehisto [ 05 Fév 2017, 23:38 ]
Sujet du message:  Re: MOD ?

Tu as été plus rapide que moi :lol:

Auteur:  Samuel Devulder [ 05 Fév 2017, 23:51 ]
Sujet du message:  Re: MOD ?

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.

Auteur:  Samuel Devulder [ 06 Fév 2017, 14:08 ]
Sujet du message:  Re: MOD ?

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.

Auteur:  Samuel Devulder [ 06 Fév 2017, 20:43 ]
Sujet du message:  Re: MOD ?

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

Auteur:  Daniel Coulom [ 06 Fév 2017, 22:28 ]
Sujet du message:  Re: MOD ?

Pourquoi pas quatre ROLA ?

Auteur:  Samuel Devulder [ 06 Fév 2017, 23:02 ]
Sujet du message:  Re: MOD ?

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).

Auteur:  Prehisto [ 07 Fév 2017, 00:22 ]
Sujet du message:  Re: MOD ?

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

Auteur:  Prehisto [ 07 Fév 2017, 00:28 ]
Sujet du message:  Re: MOD ?

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

Auteur:  Samuel Devulder [ 07 Fév 2017, 08:22 ]
Sujet du message:  Re: MOD ?

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!

Auteur:  Prehisto [ 07 Fév 2017, 09:39 ]
Sujet du message:  Re: MOD ?

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

Auteur:  Samuel Devulder [ 07 Fév 2017, 10:17 ]
Sujet du message:  Re: MOD ?

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 :()

Auteur:  Prehisto [ 07 Fév 2017, 10:42 ]
Sujet du message:  Re: MOD ?

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

Auteur:  Samuel Devulder [ 07 Fév 2017, 10:45 ]
Sujet du message:  Re: MOD ?

Ah oui tu as raison. Je corrige aussitôt.

Page 5 sur 19 Heures au format UTC + 1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/