90

ericde45 (./84) :
- j'ai essayé sans succès jwarn : il me dit qu'il n'y a pas assez de ligne, et je n'ai pas trouvé d'explications sur la syntaxe attendue pour que mon source soit au standard 'GASM' ? ( j'ai regardé le source mais trop c'est du C trop compact smile )
Oui, il faudrait que je rajoutes le support de VASM et Rmac. Vu que c'est les 2 assembleurs principalement utilisé.
Le port de l'outil sur Windows a été fait sans but précis mais ce fut rapide a faire.

91

j'ai l'impression que jwarn ne lit pas le source pur et dur mais plutot un log de compilation dans le genre de ce que sort vasm :

S01:00008300: 00 20 A0 E3
F00:0691 str R2,[R0,#0x5C]
S01:00008304: 5C 20 80 E5
F00:0692 str R2,[R0,#0x6C]
S01:00008308: 6C 20 80 E5
F00:0693 str R2,[R0,#0x7C]
S01:0000830C: 7C 20 80 E5
F00:0694 str R2,[R0,#0x8C]
S01:00008310: 8C 20 80 E5

( là c'est du risc, pas du dsp ou du gpu de Jaguar )
avatar

92

Le tool a besoin de lire le listing générer par l'assembleur. Ce n'est ni le source code, ni le fichier obj. Lors de l'assemblage, il faut rajouter l'option qui te génère ce listing.
Pour Rmac, c'est: -l[filename]
Mais JWARN ne peut lire que le GASM pour le moment, possible que Vasm et Rmac soit compatible mais j'en doutes.

93

je confirme, pas compatible avec l'option -l de rmac
tout est dans le sscanf dans le source de jwarn smile
avatar

94

ericde45 (./93) :
je confirme, pas compatible avec l'option -l de rmac
tout est dans le sscanf dans le source de jwarn smile
Je penses avoir réglé le soucis, je peux t'envoyer une nouvelle version si tu veux la tester. Ou tu peux m'envoyer tout / ou partie de ton listing pour test de mon bord.

95

cool
voilà mon code, toujours la même chose, ma routine I2S dans LSP

-------------------------

nb_bits_virgule_offset .equ 11 ; 11 ok DRAM/ 8 avec samples en ram DSP

.dsp

;movei #LSP_DSP_PAULA_internal_location3,R28 ; adresse sample actuelle, a virgule
movefa R1,R28
;movei #LSP_DSP_PAULA_internal_increment3,R27
movefa R2,R27
load (R28),R26 ; R26=current pointeur sample 16:16
load (R27),R27 ; R27=increment 16:16
move R26,R17 ; R17 = pointeur sample a virgule avant increment
;movei #LSP_DSP_PAULA_internal_length3,R25 ; =FIN
movefa R3,R25
add R27,R26 ; R26=adresse+increment , a virgule
load (R25),R23
movefa R0,R22
cmp R23,R26
jr mi,DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel3
;nop
shrq #nb_bits_virgule_offset,R17 ; ancien pointeur adresse sample partie entiere

; fin de sample => on recharge les infos des registres externes
shlq #32-nb_bits_virgule_offset,R26
;movei #LSP_DSP_PAULA_AUD3LEN,R27 ; fin, a virgule
movefa R4,R27
shrq #32-nb_bits_virgule_offset,R26 ; on ne garde que la virgule
;movei #LSP_DSP_PAULA_AUD3L,R24 ; sample location a virgule
movefa R5,R24
load (R27),R27
load (R24),R23
store R27,(R25) ; update internal sample end, a virgule
or R23,R26 ; on garde la virgule en cours

DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel3:
store R26,(R28) ; stocke internal sample pointeur, a virgule
shrq #nb_bits_virgule_offset,R26 ; nouveau pointeur adresse sample partie entiere
;shrq #nb_bits_virgule_offset,R17 ; ancien pointeur adresse sample partie entiere
move R26,R25 ; R25 = nouveau pointeur sample
and R22,R17 ; ancien pointeur sample modulo 4
and R22,R26 ; nouveau pointeur sample modulo 4
;movei #LSP_DSP_PAULA_AUD3DAT,R28 ; 4 octets actuels
subq #4,R28 ; de LSP_DSP_PAULA_internal_location3 => LSP_DSP_PAULA_AUD3DAT
not R22 ; => %11
load (R28),R21 ; R21 = octets actuels en stock
and R22,R25 ; R25 = position octet à lire
cmp R17,R26
jr eq,DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word3
shlq #3,R25 ; numero d'octet à lire * 8

; il faut rafraichir R21
load (R26),R21 ; lit 4 nouveaux octets de sample
store R21,(R28) ; rafraichit le stockage des 4 octets

DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word3:
;movei #LSP_DSP_PAULA_AUD3VOL,R23/R24
subq #4,R28 ; de LSP_DSP_PAULA_AUD3DAT => LSP_DSP_PAULA_AUD3VOL
neg R25 ; -0 -8 -16 -24
; R25=numero d'octet à lire
; ch2
;movei #LSP_DSP_PAULA_internal_increment2,R27
movefa R7,R27

sh R25,R21 ; shift les 4 octets en stock vers la gauche, pour positionner l'octet à lire en haut
load (R28),R28 ; R23 = volume : 6 bits
sharq #24,R21 ; descends l'octet à lire
; ch2
imult R28,R21 ; unsigned multiplication : unsigned sample * volume => 8bits + 6 bits = 14 bits

; R21=sample channel 3 on 14 bits
avatar

96

JWARN a besoin de l'output listing, il n'utilise pas le source code.
As tu le fichier output générer avec l'option -l de Rmac?

97

tromb Fichier joint : titi.lst


t.txt Page 1 8:45:24 am 3-Feb-2022 RMAC 2.1.13 (Win32)


1 =0000000B nb_bits_virgule_offset .equ 11
2 .dsp
3
4 ;movei #LSP_DSP_PAULA_internal_location3,R28 ; adresse sample actuelle, a virgule
RISC code generated with no origin defined
5 00000000 943C W movefa R1,R28
6 ;movei #LSP_DSP_PAULA_internal_increment3,R27
7 00000002 945B movefa R2,R27
8 00000004 A79A load (R28),R26 ; R26=current pointeur sample 16:16
9 00000006 A77B load (R27),R27 ; R27=increment 16:16
10 00000008 8B51 move R26,R17 ; R17 = pointeur sample a virgule avant increment
11 ;movei #LSP_DSP_PAULA_internal_length3,R25 ; =FIN
12 0000000A 9479 movefa R3,R25
13 0000000C 037A add R27,R26 ; R26=adresse+increment , a virgule
14 0000000E A737 load (R25),R23
15 00000010 9416 movefa R0,R22
16 00000012 7AFA cmp R23,R26
17 00000014 xxxx jr mi,DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel3
18 ;nop
19 00000016 6571 shrq #nb_bits_virgule_offset,R17 ; ancien pointeur adresse sample partie entiere
20
21 ; fin de sample => on recharge les infos des registres externes
22 00000018 617A shlq #32-nb_bits_virgule_offset,R26
23 ;movei #LSP_DSP_PAULA_AUD3LEN,R27 ; fin, a virgule
24 0000001A 949B movefa R4,R27
25 0000001C 66BA shrq #32-nb_bits_virgule_offset,R26 ; on ne garde que la virgule
26 ;movei #LSP_DSP_PAULA_AUD3L,R24 ; sample location a virgule
27 0000001E 94B8 movefa R5,R24
28 00000020 A77B load (R27),R27
29 00000022 A717 load (R24),R23
30 00000024 BF3B store R27,(R25) ; update internal sample end, a virgule
31 00000026 2AFA or R23,R26 ; on garde la virgule en cours
32
33 DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel3:
34 00000028 BF9A store R26,(R28) ; stocke internal sample pointeur, a virgule
35 0000002A 657A shrq #nb_bits_virgule_offset,R26 ; nouveau pointeur adresse sample partie entiere
36 ;shrq #nb_bits_virgule_offset,R17 ; ancien pointeur adresse sample partie entiere
37 0000002C 8B59 move R26,R25 ; R25 = nouveau pointeur sample
38 0000002E 26D1 and R22,R17 ; ancien pointeur sample modulo 4
39 00000030 26DA and R22,R26 ; nouveau pointeur sample modulo 4
40 ;movei #LSP_DSP_PAULA_AUD3DAT,R28 ; 4 octets actuels
41 00000032 189C subq #4,R28 ; de LSP_DSP_PAULA_internal_location3 => LSP_DSP_PAULA_AUD3DAT
42 00000034 3016 not R22 ; => %11
43 00000036 A795 load (R28),R21 ; R21 = octets actuels en stock
44 00000038 26D9 and R22,R25 ; R25 = position octet ^^à lire
45 0000003A 7A3A cmp R17,R26
46 0000003C xxxx jr eq,DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word3
47 0000003E 63B9 shlq #3,R25 ; numero d'octet ^^à lire * 8
48
49 ; il faut rafraichir R21
50 00000040 A755 load (R26),R21 ; lit 4 nouveaux octets de sample
51 00000042 BF95 store R21,(R28) ; rafraichit le stockage des 4 octets
52
53 DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word3:
54 ;movei #LSP_DSP_PAULA_AUD3VOL,R23/R24
55 00000044 189C subq #4,R28 ; de LSP_DSP_PAULA_AUD3DAT => LSP_DSP_PAULA_AUD3VOL


t.txt Page 2 8:45:24 am 3-Feb-2022 RMAC 2.1.13 (Win32)


56 00000046 2019 neg R25 ; -0 -8 -16 -24
57 ; R25=numero d'octet ^^à lire
58 ; ch2
59 ;movei #LSP_DSP_PAULA_internal_increment2,R27
60 00000048 94FB movefa R7,R27
61
62 0000004A 5F35 sh R25,R21 ; shift les 4 octets en stock vers la gauche, pour positionner l'octet ^^à lire en haut
63 0000004C A79C load (R28),R28 ; R23 = volume : 6 bits
64 0000004E 6F15 sharq #24,R21 ; descends l'octet ^^à lire
65 ; ch2
66 00000050 4795 imult R28,R21 ; unsigned multiplication : unsigned sample * volume => 8bits + 6 bits = 14 bits
67
68 ; R21=sample channel 3 on 14 bits


t.txt Page 3 8:45:24 am 3-Feb-2022 RMAC 2.1.13 (Win32)
Symbol Table

DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel3 0000000000000028 t
DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word3 0000000000000044 t
nb_bits_virgule_offset 000000000000000B a
avatar

98

ericde45 (./88) :
Chez Dilinger, son message sur la page d'avant :
arf mince, j'ai du lire trop vite..

ericde45 (./89) :
dans ton analyse je ne comprends pas ce morceau là, avec cmp:

and R22,R25 ; R25 = position octet à lire Rr22 & Rr25 Mr28 Wr22
- Cr25 Wr19
- - Wr25
cmp R17,R26 Rr17 & Rr26 - -

pourquoi le cmp attend la fin du and ?
Il y a 2 cycles entre le and et le cmp car on est dans le cas n°3 de ./86 :
ton CMP va lire 2 registres qui sont différents de R19 en écriture au 1er cycle (de l'instruction qui est avant le and) et de R25 au 2eme cycle, du coup il y a à chaque fois un waitstate d'inséré. smile

Il ne peux y avoir un accès qu'à 2 registres différents en même temps.
avatar

99

Bon, il est possible que Rmac ait un bug dans le output listing. On peut voir un opcode de valeur xxxx, ce qui peut créer un soucis dans le traitement.
Sinon, le résultat de JWARN donne ceci.

FILE: ..\samples\Lru0.lst
[03] line 17: a result is written back; src or dst not dst of line 14.
[04] line 16: two values are written back at once (1st value: line 14).
[03] line 18: a result is written back; src or dst not dst of line 17.
[04] line 21: two values are written back at once (1st value: line 19).
[04] line 30: two values are written back at once (1st value: line 27).
[03] line 33: a result is written back; src or dst not dst of line 30.
[04] line 33: two values are written back at once (1st value: line 30).
[01] line 39: src reg must wait for the result of the previous instruction.
[01] line 42: src reg must wait for the result of the previous instruction.
[03] line 43: a result is written back; src or dst not dst of line 40.
[04] line 43: two values are written back at once (1st value: line 40).
[03] line 43: a result is written back; src or dst not dst of line 42.
[01] line 56: src reg must wait for the result of the previous instruction.
[04] line 71: two values are written back at once (1st value: line 66).
[03] line 72: a result is written back; src or dst not dst of line 70.

Le chiffre entre [] correspond au numéro de la rule.
Le numéro de ligne ne correspond pas a la ligne présente a l'intérieur du fichier, mais au numéro de ligne du fichier.

100

merci !

je vais creuser cela, dès que j'aurai fini avec une routine de tri...
avatar

101

Le outpout listing est correct avec Vasm, alors que celui de Rmac ne l'est pas.
Par acquis de conscience, j'ai rajouté le support pour Vasm dans JWARN.
Utilisant le output listing fait par Vasm, le tool ne donne pas de warning sur les rules.
J'ai contacté les gars de Rmac au sujet du problème avec le output listing.
Je penses que le rapport que je t'ai donné plus haut ne devrait pas être considérer comme fiable pour le moment.

102

ok, affaire à suivre, avant que j'essaye d'optimiser.
merci
avatar

103

J'ai testé ton dernier abs dispo sur github, ça marche impec sur la JagFPGA smile
avatar

104

j'ai uploadé une nouvelle version de source avec 4 canaux son en + des 4 canaux du module.
c'est pas optimisé mais c'est plus utile que performant.
avatar

105

106

top
avatar

107

je me tate pour faire une version oversampling.
parce que en réalité pousser à 50 KHz, sans oversampling, avec des samples à 8 Khz de l'époque de l'amiga, ça doit pas être vraiment mieux que 35 KHz
avatar