Jump to content

Le Dsp Pour Les Grands


RaZ

Recommended Posts

Vous trouverez dans les 3 chapitres ci dessous, le nécessaire de survie quand le Gpu est attaqué, le Dsp est pratiquement pareil (Jeux d'instrucions, lancement de code, etc...) les instructions ne fonctionnant que sur l'un ou l'autre sont indiqués. Mais j'ai écrit ceci car j'ai fait un petit paquet d'essais et autant en faire profité tout le monde.

 

Bon code.

 

 

Gpu in da face !!! (Et le Dsp aussi dans ta face !)

(Sur un petit air de 'Techno is not dead ')

 

 

Bienvenue ici, vous trouverez dans les milliers (Hein !?!) de ligne après plein de truc sur le Gpu de la Jag, le Dsp étant presque pareil, vous ferez d'une pierre, deux coups !! C'est un microprocesseur plein d'avenir, moi je vous le dis !!! Pourquoi parlez de cette puce alors que vous voulez juste dvper un shoot ? Alors que je n'ais pas de besoin de calcul ou de trucs super sophistiqués pour mon jeu. Si vous répondez cela c'est que vous êtes un ane et un de compétition !!

 

Le couple Gpu / Dsp c'est un peu la carte accélératrice de la Jag, faire un trait dessus c'est permettre aux autres dvpeurs de faire un jeu 'beaucoup beaucoup plus meilleur que le votre !' (Et faites moi confiance je ne ferais pas dans la dentelle, je suis un gros bourrin ! Donc mes codes mangeront vos productions comme apéritif !).

 

Oui mais c'est dur et puis truc et machin !!! NON NON et RENON !!

 

Ce qui ont déjà écrit en assembleur une fois dans leur vie, vont apprécier ces puces pleines de surprise et surtout de puissance !!! C'est ultra simple de codé avec, ceux qui ont fait du 68000 auront l'impression de trouvé son cousin, ceux qui ont fait du code Dsp (Sur un Falcon) vont avoir l'impression de faire du basic (C'est un peu poussé vais vous verrez que le transfert d'un code Gpu dans sa ram est 10 fois plus simple qu'avec le Falcon).

 

Le Gpu de de la Jag est un RISC, en clair, peu d'instructions mais qui arrache (C'est tout ce qu'il nous faut !). Il est d'après Atari, là pour faire de l'aide au copro vidéo, mais vu la puissance de la puce et son jeu d'instruction (Pas si réduit que cela !) on peut faire beaucoup de choses avec (Je lis les jagpads avec ! SCPCD fait ces liste de sprite avec !)

 

Je vais vous expliqué le jeu d'instruction et quelques trucs a savoir pour écrire vos propres codes Gpu pour écrire Native II.

 

Ce qui n'ont jamais fait d'assembleur de leur vie, passez votre chemin, je ne suis pas la pour vous faire une initiation mais une explication de cette puce. Les rois du 68000, mangeur de nop en puissance, restez ici ca va vous plaire tout cela, vous verrez !!

 

Petit détail techniques :

 

- processeur 32 bits (Attachez les ceintures !)

- presque toutes les instruction en un cycle, vu la vitesse de ce chip (26 Mhz) cela laisse rèveur a ce qui ont codé sur un ST...

- 64 registres (En utilisation normale c'est 32, meme un peu

moins (Ca sent l'arnaque !), parce que certains sont utilisé en interne) mais on peut accèder‚ a 64 ca c'est sur)

- 4 Kilos de ram interne, cela peut faire peu mais en assembleur et juste pour du code pure on peut en mettre des trucs interressants. Le Dsp quand a lui dispose de 8 Kilos (Ca va p‚ter moi je vous le dit !!)

- Il peut lire / écrire une phrase (8 octets) en une instruction)

 

Les registres sont ici appellés Rx (x=0 a 31, soit R0 … R31)

 

Voili, voila passons aux jeu d'instructions, n'oubliez pas c'est un proc 32 bits, donc quand on peut pas préciser, c'est les 32 bits du registres qui sont concernés.

 

Cela peut déboussoler‚ au début, mais très peu d'instruction autorise l'immédiat, c'est pour 90% du temps, reg sur reg, pour passer cela la technique est simple, mise de l'immédiat dans un registre et ensuite, votre instruction avec le registre ou se trouve votre immédiat. Cela peut ètre lourd, mais on s'en fou un peu tant que cela va vite !!!

 

Le Gpu dispose bien sur des flag pour les tests, il n'y a que trois flags

 

- Z(ero) placés bien sur si le résultat est nul.

- N(égatif) placés biens sur si le résultat est positif (Je rigoles je voulais voir ce qui suivait, c'est bien sur négatif)

- C(arry) retenue.

 

Pour les flags :

 

F signifié‚ fixé‚ (Donc modifié suivant le résultat)

0 signifié‚ mis a 0 quelque soit le résultat

1 signifié‚ mis a 1 quelque soit le résultat

I signifié‚ indéfini, pas modifié ou valeur inutilisable.

 

Rn désigne constamment un registre (r0-r31)

 

Les instructions du Gpu / Dsp.

Les instructions :

 

- Abs rn : donne la valeur absolue de rn (Registre)

(Flags : Z(F), N(0), C(placé si opérande négative)

 

- Add rn,rn : additionne rn sur rn et oui !!

(Flags : Z(F), N(F), C(F))

 

- Addc rn,rn : additionne rn sur rn et en plus rajoute la retenue !!

(Flags : Z(F), N(F), C(F))

 

- Addq #n,rn : additionne n sur rn, immédiat, n entre 1 et 32

(Flags : Z(F), N(F), C(F))

 

- Addqmod #n,rn : additionne n sur rn, immédiat.

(Dsp seulement, 1a particularité, intègre un modulo, permet de faire du buffer circulaire.)

(Flags : Z(F), N(F), C(F))

 

- Addqt #n,rn : additionne n sur rn, immédiat, n entre 1 et 32

(particularité‚ ne modifie pas les flags, le t est la pour transparent)

 

- And rn,rn : et logique

(Flags : Z(F), N(F), C(I))

 

- Bclr #n,rn : efface le bit n dans rn, n immédiat (0-31)

(Flags : Z(F si le résultat est maintenant égal a zéro)

N(Valeur du bit 31), C(I))

 

- Bset #n,rn : place le bit n dans rn, n immédiat (0-31)

(Flags : Z(F si le résultat est égal a zéro,N(F), C(I))

 

- Btst #n,rn : teste le bit n dans rn, n immédiat (0-31)

(Flags : Z(F si le bit est égal a zéro,N(I), C(I))

 

- Cmp rn,rn : compare rn a rn

(Flags : Z(F si ‚gal),N(F, source>destination)), C(F))

 

- Cmpq #n,rn : compare n (immédiat) a rn (n entre -16 a +15)

(Flags : Z(F si ‚gal),N(F, source>destination)), C(F))

 

- Div rn,rn : division non signé (32/32)

(Flags non affecté)

 

- Imacn rn,rn : multiplication / accumulation, signé

rn est multiplié par rn, le résultat est inscrit dans un registre interne (Voir resmac)

(Flags non affecté)

 

- Imult rn,rn : multiplication signé 16 bits (résultat 32)

(Flags : Z(F),N(F), C(I))

 

- Imultn rn,rn : multiplication signé 16 bits mais le résultat est sauvé en interne (Plus rapide que la précedente du fait de la non réecriture du résultat dans rn)

(Flags : Z(F),N(F), C(I))

 

- Jr cc, n : saut relatif conditionnel

cc : condition (voir tableau après)

n : offset du saut, additionné a l'adresse de l'instruction suivante

(Flags non affecté)

 

- Jump cc,(rn) : saut absolu conditionnel

cc : condition (voir tableau après)

rn : adresse du saut

(Flags non affecté)

 

- Load (rn),rn : charge le contenu de rn dans rn, équivaut a un move.l (a0),Dn (68000) ou lea (a0),a0 (Ne pas oubliez reg de données et d'adresse sont pareil sur le Gpu)

l'adresse doit ètre aligné sur un mot long.

Flags non affecté

 

- Load (R14+n),rn charge rn avec ce qu'on trouve en r14+n

- Load (R15+n),rn : équivaut a un move.l N(a0),Dn (68000) n immédiat (1-32) attention n est exprimé en mots long et pas en octet donc load (r14+1),rn est égal a move.l 4(a0),Dn

Flags non affecté

 

- Load (R14+rn),rn pareil qu'avant mais avec un registre

- Load (R15+rn),rn : équivaut a un move.l 0(a0,d0.l),Dn l'adresse obtenu doit etre aligné sur un mot long.

Flags non affecté

 

- Loadb (rn),rn : move.b (a0),d0 (68000)

lit un octet en mémoire, octet chargé dans les bit 0-7, le reste du registre est effacé. Attention : accès en ram extérieur pas de soucis, en cas d'accès

de ram interne lecture d'un mot long

 

- Loadw (rn),rn : move.w (a0),d0 (68000)

lit un mot en mémoire, mot chargé dans les bit 0-15, le reste du registre est effacé.

Attention : accès en ram extérieur pas de soucis, en cas d'accès de ram interne lecture d'un mot long

 

- Loadp (rn),rn : lit une phrase en mémoire, la partie basse est chargé dans le registre spécifié, le reste est placé dans un registre spécial (Voir après)

(Gpu seulement)

Attention : accès en ram extérieur pas de soucis, en cas d'accès de ram interne lecture d'un mot long

 

- Mirror rn : 'miroite' le registre (retourne le registre)

(Dsp seulement) (le bit 0 est échangé avec le 31, le bit 1 échangé avec le 30, etc..)

(Flags : Z(F), N(F), C(I))

 

- Mmult rn,rn : lance le calcul matriciel, le premier registre indique l'adresse de la matrice de départ, le second registre récupere le résultat.

(Des d‚tails dans un prochain registre)

(Flags : Z(F), N(F), C(F))

 

- Move rn,rn : sans commentaire ! (move.l dn,dn (68000))

Copie d'un registre vers un registre

 

- Move pc,rn : copie le PC, le pc est recalculé pour prendre compte du pipe lining et tout le toutim pour donné le bon PC.

(Flags non affect‚)

 

- Movefa rn,rn : permet de transféré un registre vers un registre de l'autre banque de registre (Voir notes)

 

- Movei #n,rn : charge rn avec l'immédiat (mot long)

(Flags non affecté)

 

- Moveq #n,rn : chargement avec l'immédiat n (0-31)

(Flags non affect‚)

 

- Moveta rn,rn : permet de transférer un registre de l'autre banque vers un registre de notre banque de registre (Voir notes)

(Flags non affecté)

 

- Mtoi rn,rn : extrait la mantisse, et signe le nombre 32 IEEE 32 bit flottant dans la destination, plus de détail quand on aura fait des essais.

 

- Mult rn,rn : multiplication 16 bit non signé de rn par rn, résultat sur 32 bits placé dans la destination.

 

- Neg rn : négation, 'negate' rn, cela veut dire rn=8 après rn=-8, etc.. Si vous comprenez pas allez vous faire....

 

- [red]Nop[/red] : l'instruction a connaitre, le top du top, l'exclu, l'instruction universelle des assembleurs, le Nop qui ne fait rien du tout !!!

(Flags non affecté)

 

- Normi rn,rn : donne un nombre 'entier normalisé', plus de détail une autre fois.

 

- Not rn : Non logique

(Flags : Z(F), N(F), C(I))

 

- Or rn,rn : Ou logique

(Flags : Z(F), N(F), C(I))

 

- Pack rn : Compacte un pixel au format cry : les bits 22-25 passent en 12-16, les 13-16 en 8-11 et les 0-7 en 0-7 !!! Quand j'aurais compris quoi faire avec on fera des trucs tous ensemble !!! Promis !!

(Gpu seulement)

(Flags non affecté)

 

- Resmac rn : récupère le résultat des multiplications précédentes, recopie le registre de multiplication dans rn.

(Flags non affect‚)

 

- Ror rn,rn : rotation par la droite. Valeur autorisé 1 a 32, seules les 5 bits de rn (source) sont pris en considération.

(Flags : Z(F), N(F), valeur du bit 31 avant la rotation)

 

- Rorq #n,rn : rotation par la droite en usant d'un immédiat. Valeur autorisé 1 a 32

(Flags : Z(F), N(F), valeur du bit 31 avant la rotation)

 

Arrive les instructions de saturation, what it is ? Ces instructions permettent de réduire un registre en utilisant deux règles. Pour vous expliquer ces règles, il faut juste savoir deux choses sur les instructions après seront données‚ deux chiffres et peut etre un 'S' optionnel. Le premier chiffre indique la taille de votre registre au départ, le second après 'Saturation'. Exemple :

 

Sat8 rn : 32->8 Cela veut dire que votre registre 32 va ètre réduit a 8 bits, en appliquant que si votre reg 32 est supérieur a 255 (2^8-1), il sera égal a 255, si il est inférieur a 255, il restera comme il est, si il est négatif il vaudra 0 (Si il n'y a pas de 'S' car sinon le résultat est signé donc non modifié si il était négatif)

 

- Sat8 rn : 32-> 8

(Gpu seulement)

(Flags : Z(F), N(0), C(I))

 

- Sat16 rn : 32-> 16 (La limite est donc 65535 (2^16-1))

(Gpu seulement)

(Flags : Z(F), N(0), C(I))

 

- Sat16S rn : 32->16 (Attention résultat peut ètre signé)

(Dsp seulement)

(Flags : Z(F), N(0), C(I))

 

- Sat24 rn : 32->24 bits (Limite 2^24-1)

(Gpu seulement)

(Flags : Z(F), N(0), C(I))

 

- Sat32S rn : 40->32 bits (Les 8 bits manquant sont récupéré du registre interne de multiplication / accumulation) et son considérés comme les 8 bits haut.

(Dsp seulement)

(Flags : Z(F), N(0), C(I))

 

- Sh rn,rn : décalage gauche ou droite, donnée par la valeur de rn. Valeur positive décalage a droite.

 

- Sha rn,rn : décalage arithmétique, le reste pareil que Sh

(Flags : Z(F), N(F), C(bit 0 des données non décalés.))

 

- Sharq #n, rn : décalage arithmétique droit avec un immédiat.

(Flags : Z(F), N(F), C(bit 0 des données non décalés.))

 

- Shlq #n, rn : décalage a gauche avec un immédiat.

(Flags : Z(F), N(F), C(bit 31 des données non décalés.))

 

- Shrq #n, rn : décalage a droite avec un immédiat.

(Flags : Z(F), N(F), C(bit 31 des données non décalés.))

 

- Store rn,(rn) : Ecrit un long (move.l d0,(a0) 68000)

L'adresse doit etre aligné sur un long (4 octets)

(Flags non affect‚)

 

- Store rn,(R14+n) : Comme le load mais en écriture

- Store rn,(R15+n) (N est calcul‚ en long n=1 (déplacement de 4))

(Flags non affect‚)

 

- Store rn,(R14+rn) : Comme le load mais en écriture

- Store rn,(R15+rn) (l'adresse doit ètre aligné sur un long)

(Flags non affecté)

 

- Storeb rn,(rn) : Ecrit un octet. Cela s'applique qu'au écriture extérieures, en interne c'est toujours un mot long

(Flags non affecté)

 

- Storew rn,(rn) : Ecrit un mot, cela s'applique qu'au écriture extérieures, en interne c'est toujours un mot long. Adresse aligné sur un mot long.

(Flags non affecté)

 

- Storep rn,(rn) Ecrit une phrase (8 octets). Le mot long manquant est récupéré dans un registre spécial, l'adresse doit ètre aligné sur un phrase.

(Gpu seulement)

(Flags non affecté)

 

- Sub rn,rn : soustrait rn de rn et oui !!

(Flags : Z(F), N(F), C(F))

 

- Subc rn,rn : soustrait rn de rn et en plus retire la retenue !!

(Flags : Z(F), N(F), C(F))

 

- subq #n,rn : soustrait n de rn, immédiat, n entre 1 et 32

(Flags : Z(F), N(F), C(F))

 

- Subqmod #n,rn : soustrait n sur rn, immédiat.

(Dsp seulement, 1 particularité, intègre un modulo, permet de faire du buffer circulaire.)

(Flags : Z(F), N(F), C(F))

 

- Subqt #n,rn : soustrait n sur rn, immédiat, n entre 1 et 32 (particularité ne modifie pas les flags,le t est la pour transparent)

 

- Unpack Rn : l'inverse de Pack...

 

- Xor rn,rn : Ou exclusif

(Flags : Z(F), N(F), C(I))

 

Notes :

 

loadp et storep lisent et écrivent des phrases (8 octets) mais les registres font 32 bits, donc on en utilisent 2 ? Pas tout a fait j'ai cherché quelques minutes, danc la doc est écrit que la partie haute est lu ou écrite depuis le 'high half register', c'est mignon mais cela veut dire quoi en clair, au début j'ai voulu commencé (Enfin non j'ai commencé...) a essayer tous les registres, mais après une dizaine cela devient lourd et en fin de compte en cherchant on trouve en $f02118 un registre appellé : High Data register et oui c'est lui qui sert de registre de stockage pour les phrases.

 

Moveta et Movefa ont une fonction particulière ils permettent de transférer un registre d'une banque vers une autre. Explication : vous vous souvenez, au début j'ai écrit qu'il avait 64 registres. Ceux ci sont divisés en deux banques de 32 registres, le seul moyen de selection des banques est masqués par le Gpu donc on y a pas accès en direct, alors ceux deux instructions sont la pour nous aider, moveta permet de transférer un registre de la première banque (La standard) vers l'autre (Celle qui se cache), exemple :

 

moveta r4,r4

 

Une personne qui ne connait pas pense que vous simulez un Nop ! Mais non, mais non cela transfert le premier r4 dans le second r4 et movefa fait l'inverse.

 

Attention, Atari précise qu'il faut initialisé la pile du Gpu mais la vous cherchez comme un ane et bien sur c'est écrit nulle part, j'ai cherché pour vous et apparement cela serait r27 a prendre avec des pincettes, j'ai fait des tours dans différents sources pour cela, donc zéro assurance. R31 est la pile pour les routines d'interruption et attention en cas de routine d'interruption r30 peut ètre 'plombé‚', donc vous savez qu'elle registre vous avez a éviter...

 

Conditions pour les instructions de saut :

 

C=flag de retenue

N=flag de négation

Z=flag de zero (!)

 

- : rien, branche toujours

- NZ : branche si Z=0

- Z : branche si Z=1

- NC : branche si C=0

- NC NZ : branche si C=0, Z=0

- NC Z : branche si C=0, Z=1

- C : branche si C=1

- C NZ : branche si C=1, Z=0

- CZ : branche si C=1, Z=1

- NN : branche si N=0

- NN NZ : branche si N=0 et Z=0

- NN Z : branche si N=0 et Z=1

- N : branche si N=1

- NN Z : branche si N=1 et Z=0

- N Z : branche si N=1 et Z=1

- : rien, branche jamais (Dite rien je cherches...)

 

 

Lancer un code Gpu

Avalez le jeu d'instruction ? Donc on attaque les choses sérieuse.

 

Comment faire pour écrire mon premier programme et le lancer ?

 

'Ca en etre une question qu'elle est bonne ?'

 

Premier point, MadMac l'assembleur fait le code 68000 / Gpu / Dsp donc il va falloir lui préciser que c'est un code Gpu ou Dsp donc pour prévenir le mossieur, vous faites sur votre premiere ligne de code :

 

. gpu (ou dsp suivant la puce)

 

C'est dur hein !

 

Second point, le code Gpu / Dsp est absolu, cela signifie qu'il est assemblé que pour fonctionner a une seule adresse. Pour fixer cela au début de votre source, vous devrez faire cela :

 

org $f03000 (Adresse de début de la ram Gpu)

 

L'adresse cité peut etre n'importe quoi tant qu'elle se situe dans la ram du Gpu ($f03000-$f03fff, 4 kilos) ou la ram Dsp ($f1b000-$f1cfff, 8 kilos), ces deux ram sont des rams a accès très rapide.

 

L'entrée est passé ? Les choses ultra simple commencent (Hein !?!)

 

Voici un code bidon pour démonstration :

 

.gpu

 

org $f03000

 

movei #Boucle,r0 ; Adresse pour faire notre boucle

 

Boucle: ; Début de notre boucle sans fin

nop ; l'instruction qui est 'jouli !'

jump (r0) ; on boucle sans fin, histoire 2 !

 

 

Passez ce truc dans MadMac vous allez récuperé un splendide

'votrenomdefichier'+.'o'. Et on en fait quoi ce celui la ?

 

C'est simple, vous le recopiez comme un barbare dans la ram du Gpu, comme par exemple :

 

lea Fin_code_dsp,a0

lea Debut_code_dsp,a1

move.l a0,a2

sub.l a1,a2 (Calcule la taille du code !)

 

lea $f03000,a3

move.w a2,d0

lsr.w #1,d0 (Divise par 2, car on va transférer des mots)

subq.w #1,d0 (-1 pour le dbra)

Copy_code_dsp:

move.w (a0)+,(a3)+

dbra d0,Copy_code_dsp

 

.....

 

 

Debut_code_dsp:

INCBIN "VOTRENOMDEFICHIER.O"

EVEN (Assure la parité au cas ou !)

Fin_code_dsp:

 

Dur n'est ce pas (Sans commentaire...)

 

Et maintenant on le lance comment ?

 

D'abord le PC (Program Counter) n'est pas initialisé, donc on le met en place :

 

move.l #$f03000,G_PC ($f02110)

 

Ensuite ? Ben on envoie la sauce !

 

move.l #1,G_CTRL ($f02114)

 

(Ne pas oublié d'adresser les registres sur 32 bits, meme si il ne comporte que 15 bits, d'ou le long au dessus !)

 

Place le bit 0 de $f02114, ce bit démarre le Gpu ou le stoppe.

 

Et voila votre code Gpu tourne ! C'est dur la vie d'artiste.

 

Note : le Gpu / Dsp pipe line a mort, ce qui fait que presque tout le temps, une instruction est en cours d'execution et pendant ce temps la suivante est commencé. Ce qui fait que dans certains cas un résultat a pas fini d'ètre calculer avant que l'instruction suivante soit executé, donc si vous écrivez cela :

 

moveq #0,r0

addq #1,r0

addq #4,r0

 

Le résultat ne sera peut etre pas 5 !! Donc soit vous inserez des nops, soit vous entrelacez votre code de manière a ce qu'une instruction qui utilise un résultat, n'utilise pas celui du calcul‚ juste avant :

 

moveq #0,r0

moveq #0,r1

addq #1,r0

subq #4,r1

addq #4,r0

 

Cela a plus de chance de marché !! Dans certains cas vous etes pas obligé d'entrelacer, le Gpu attend (comme un con !) que le résultat soit calculé si vous etes dans le cas du premier exemple mais dans certains cas non, donc méfiez vous, ne dites pas que je vous aurais pas prévenus.

 

Voila vous en savez beaucoup sur ces petites betes, le Dsp c'est exactement pareil, il dispose de quelques trucs en plus en rom (Différentes tables sonores) vu qu'a la base il est censé faire du son (Mais vu la taille de la ram cela doit etre possible de mettre la routine son et ....)

 

J'ai passer certains trucs, car je n'ais pas encore fait les essais ou ceci sont en cours au moment ou cet article est écrit.

 

Prenez note d'une chose, ces deux puces dispose de ram, vous pouvez les utiliser comme mémoire cache, vu leur vitesse d'accès. Quand j'ai écrit ma routine Jagpad au Gpu, j'avais un petit doute, mais en fin de compte les résultats des joys sont stockés dans la ram Gpu (Tout en haut !)et cela marche très bien, le 68000 n'a plus qu'a lire le résultat quand il le souhaite.

 

La routine souris qui se 'ballade' pour la Jag est chouette mais il est préciser qu'il faut faire une lecture 1000 fois par seconde (Du fait qu'on peut pas savoir quand elle a été déplacé car aucune interruption est géneré pour les ports joy !) au 68000 c'est marrant un moment, mais vous croyez pas que cela peut ralentir un peu tout ce mic mac ? Autant l'écrire au Gpu, faut bien qu'il serve a quelque chose....

 

Voila, vous en savez assez pour nous faire de jolis codes Dsp / Gpu, et surtout de vrais productions Jag, production amateur d'accord mais le résultat DOIT ètre pro, c'est une vrai console, pas un simulateur d'Atari St...... Elle est capable de superbes jeux, elle a un potentiel plus souvent 'inexploité qu'exploité', donc attrapez votre courage (Il y en a besoin ?) et cassez la baraque, meme si on peut pas faire du Gran Turismo 4 sur Jag, les jeux 2d sont l'apanage de cette chouette console, le seul jeu qui avait l'air de poussé est Native, apparement Rayman mais je l'ai pas encore vu (RaZ en a trouvé un donc on l'attend donc de pied ferme !)

 

Allez salut !

 

Pour les instructions je n'ais fait qu'une traduction (avec les pieds) de la doc officielle Atari (Merci a Vince), j'ai pu faire des erreurs, (Voire en rajouté !!), donc si vous avez un doute, votre code ne fonctionne pas tout a fait, faites signe !!!!

 

Pour certains 'trucs' spéciaux, multiplication de matrice, certains trucs spécifiques au Dsp, un autre article sera écrit.

 

GT Turbo (C.V.S.D.) Membre de la Jagware Team

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...