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 * 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. Je ne dois pas être très loin quand même de la solution simple et de bon gout...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 [EDIT2] YES! 187 cycles (mais j'aime pas le LBNE final: c'est moche) Code: 120 7411 f_loop set * je me demande si un "beq suite" suivi un "jmp <f_loop" à la place ne serait pas plus élégant ?
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 |
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 :
|
Auteur: | Prehisto [ 05 Fév 2017, 23:38 ] |
Sujet du message: | Re: MOD ? |
Tu as été plus rapide que moi |
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 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 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 ?
rot2 bsr rot1 rot1 lsla adca #0 rts
|
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 Sinon on peut aussi faire> ROLA C=0 A=1234567x > ROLA C=1 A=234567x0 > ROLA C=2 A=34567x01 > ROLA C=3 A=4567x012 Code: CLR ,-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)LSLA ROL ,S LSLA ROL ,S LSLA ROL ,S LSLA ROL ,S ORA ,S+ Code: LDB #16 mais ca écrase B et c'est pas non plus super rapide à cause des accès à la mémoire.MUL STB ,-S ORA ,S+ 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! Code: C=? A=abcdefghi Question vitesse 4x"LSLA; ADCA #0" restent finalement le plus rapide avec 16 cycles, mais ta solution est la plus courte de 2 octets!
> 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 |
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 Ca donne:_A_\|_________ $v0 | $v0 $0v $0v | $v0 $0v Code: tricky part: volume is $0v or $v0 and we Si ca se trouve, pour cet usage on peut même être plus efficace en remarquant que la moitié de A est à 0.* 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 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 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/ |