DCMOTO - Emulateur universel Thomson 8 bits : Forum - Programmation - Au sujet de mon projet de routine
Retour : Accueil » Programmation
Pages : 1 - 2
Auteur Message
Fool-DupleX
Visiteur
Date : 21/02/2005 à 23h47
Mon serveur est configure en mode "paranoïd" c'est possible qu'il y ait un souci avec ton ie. Cependant, personne ne m'a jamais reporte de probleme (et Louis verifie regulierement que ca marche, pas vrai Louis? )

Je dois pouvoir te mettre ca accessible temporairement sur le web, je te tiens au courant. Ce serait dommage, c'est un bon bouquin de reference pour tous les petits trucs dont on se souvient jamais.

Fool
en haut - en bas
jasz
Visiteur
Date : 22/02/2005 à 06h57
Merci
en haut - en bas
Fool-DupleX
Visiteur
Date : 22/02/2005 à 21h16
Je t'ai mis le bouquin ici :

http://www.forler.ch/basasm/

Fais-moi signe quand t'as tout recupere, je ne veux pas laisser trainer ca sur mon site web trop longtemps. Le FTP est fait pour ce genre de choses.

Fool
en haut - en bas
jasz
Visiteur
Date : 22/02/2005 à 23h34
C'est bon. Tu peux l'enlever.

Merci
en haut - en bas
Fool-DupleX
Visiteur
Date : 23/02/2005 à 10h11
Oula, c'est du rapide !

Bon ben il restera quand meme jusqu'a ce soir... par "pas laisser trainer" j'entendais pas plus de 1-2 jours

Fool
en haut - en bas
jasz
Visiteur
Date : 11/04/2005 à 22h41
Bon, j'ai deux problèmes

1- Celui de convertion entre le 8 et le 6 bits
2- Celui de la tm

Pour la tm j'ai peut-être une solution pour faire tourner la routine sur deux cycles et non un (et ce pour garder la qualité audio). A voir

Par contre pour la synchro je sèche un peu. Le thomson ne possède pas (à ma connaissance) de vecteur d'intérruption dit vbl. La synchro se fait alors sur le tst d'un simple bit ce qui pose un problème quand la rout dépasse le cycle. Car même sur deux cycles et 10khz... c'est hard.
en haut - en bas
Yoann
Visiteur
Date : 12/04/2005 à 01h04
Pour la conversion 8bits a 6bits, tu a sois :

* ANDA #$3F

ou

* ASRA ; ASRA

Avec ces 2 solutions, tu es sur d'avoir une valeur sur 6 bits. Par contre, la premiere ne te donnera pas une "belle" valeur (les proportions ne sont pas gardees). La deuxieme solution est dans ton cas la meilleur je pense, et n'occupe pas beaucoup de cycles.
en haut - en bas
Fool-DupleX
Visiteur
Date : 12/04/2005 à 09h55
Bienvenue dans le monde des thomson, jasz. En effet pas d'interruption vbl. De toute maniere, c'est beaucoup trop gourmand en temps cpu sur un 8 bits. On ecrit toutes nos routines en calculant au cycle pres les operations. A l'extreme, certaines routines n'ont meme pas besoin de se synchroniser, elles le sont naturellement car le nombre de cycles d'une boucle correspond pile a ce qui est executable dans une vbl. Plusieurs parties sont concues ainsi dans la megademo et dans chinese stack.

Fool
en haut - en bas
Yoann
Visiteur
Date : 12/04/2005 à 15h41
Tout a fait, Color Of China est concu comme ca. Il synchronise d'abord la VBL une seule fois. Ensuite, le programme est calcule au cycle CPU pret pour l'ecran entier, et le suivant. Il est possible que les rasters verticaux de prehisto soit concu de la meme facon.

Pour la mega demo, il y a au moins la presentation en raster qui fonctionne de la meme facon avec une seule synchro VBL au debut (ca se voit d'ailleur, la presentation semble attendre une bonne seconde avant de demarrer, car il y a une grosse attente a ce moment la), et probablement d'autres presentations avec plus de 16 couleurs a l'ecran.

Instruction a retenir :

NOP = 2 cycles
ABX = 3 cycles (c'est bien d'avoir un nombre impair de cycle CPU ; )
en haut - en bas
jasz
Visiteur
Date : 12/04/2005 à 21h20
Le seul problème vient en fait de la lecture de la partition. Car si la sous routine qui créer le digit est constante dans son temps. La sous routine qui interprète la partition elle ne l'est pas. Donc calculer les cycles de chaques opérandes reste relativement hard. C'est pour cette raison que l'utilasation d'un vector blank est nécessaire.

Si le thomson possède un timer, il doit également posséder une vrai vbl (je parle d'interruption et non de tst bit machin pour la synchro).

De toute manière le fait de tester un bit ne correspond en rien à l'éfficacité d'un vecteur (j'ai essayé sur atari c'est un peu merdique).

Donc, reste pour moi à synchroniser la routine et à dévelepper le player.
en haut - en bas
Fool-DupleX
Visiteur
Date : 13/04/2005 à 10h32
Sur atari t'as un 68000. Tu peux te permettre d'interrompre, de sauver des registres, de checker un vecteur et de faire des sauts x fois par secondes. Sur Thomson a 1 MHz, on prefere de loin ecrire du code completement synchrone en choisissant bien les instructions. Comme dit, a la limite, y'a meme pas besoin de verifier le fameux bit de synchro et ca plus l'interruption ca fait beaucoup de cycles de gagnes !

Seuls les TO possedent un timer (6846). En theorie tu peux l'utiliser pour interrompre le cpu. Mais si tu fais cela, tu vas egalement te prendre l'interruption systeme dans la figure, qui est non programmable, dont la routine est en ROM et qui bouffe du cycle pour du vent (genre afficher le curseur), car il n'est pas possible de masquer les interruptions separement, c'est tout ou rien.

Pourquoi ne pas derouler une partie de tes boucles de mix et rajouter ce qu'il faut de NOP et de ABX pour avoir a peu pres des temps constants ? (remplacer les NOP et les ABX par du code utile serait evidemment encore mieux )

Quoiqu'il en soit tiens-nous au courant de tes avancees.

Fool
en haut - en bas
Yoann
Visiteur
Date : 13/04/2005 à 11h04
Et pour rajouter, je ne pense pas que dans ton cas, tu ais besoin d'etre au cycle pret. Si c'est de la musique que tu fais, un cycle, voir meme une centaine en plus en en moins ne devrait pas changer grand chose et ne sera pas audible.

Par contre, dans le cas des rasters, c'est primordiale d'etre parfaitement synchro, sinon les changement de palette pendant la zone de balayage vont laisser des traces a l'ecran.
en haut - en bas
jasz
Visiteur
Date : 13/04/2005 à 22h44
Certes cher yoann

Mais la routine du portamento bouffe 50 cycles minimum, je parle par piste si tu en prends 4 cela te donne 200 cycles. Et tous ces cycles se perdent à chaque vbl. Donc...

Le processeur n'a pas d'importance mais seule la manière dont on l'utilise en a car les premieres tournées à presque 250 cycles.

Le but pour moi est de conserver un max de qualité sonore. Et pour ce je doit réduire au maximum le temps machine de la routine dans son ensemble. Une chose est certaine c'est que sur thomson la routine qui créée le digit est plus rapide que sur atari (je parle en cycles) à partir de la c'est peut-être un avantage.

Je vais donc reprendre mon atari et faire des essais sans vbl.
en haut - en bas
Yoann
Visiteur
Date : 15/04/2005 à 10h50
Pourquoi perdu ?

Si ta routine prend trop de temps, optimise la. Si elle ne prend pas assez de temps, complete avec des nop. Mais je n'ai peut etre pas compris ton utilisation de la VBL.

Mais pour moi, une synchro peut se faire sans VBL (une VBL initiale, peut etre comme pour les rasters, mais pour le reste, on peut parfaitement s'en passer - voir Colors Of China par exemple)
en haut - en bas
jasz
Visiteur
Date : 08/06/2005 à 00h51
Je réponds vraiment en retard, mais comment t'expliquer

Je sais bien que sur thomson la vbl ne correspond à aucun vecteur mais plutôt un simple test pour synchroniser l'image. Sur les 16 bits elle sert de métronome. Comme la routine à une durée temps trés variable on a d'autre choix que de se synchroniser sur un vecteur même en comptant les cycles.

Donc, je vais reprendre pour ceux qui étaient absents (faites gaffe, j'ai les nom )
A chaque vbl, je swap les buffers. Ainsi j'ai celui pour le travail de la routine et l'autre pour la lecture des échantillons. Ensuite, je décode la partition (le programme est des plus simple). Puis, je créer un digit qui sera lu à la prochaine vbl.
Voilà

Mais il faut bien comprendre que si je décode une partion remplie de zero aucune interprétation ne sera donnée mais malgrés tout un digit sera crée.

Je ne sais pas si je suis bien clair là
en haut - en bas
Yoann
Visiteur
Date : 08/06/2005 à 01h30
As-tu moyen de faire en sorte que toutes tes routines (celles qui gerent les differents effets sur tes echantillions) aient la meme longueur, en bourrant avec des NOP par exemple ?
en haut - en bas
jasz
Visiteur
Date : 08/06/2005 à 02h09
Salut Yoann :)

Regarde

DEC tempo_user
BGT not_yet
LEAX pattern_adress
LDY tampon_piste1
BSR read_pattern
LDY tampon_piste2
BSR read_pattern
LDY tampon_piste3
BSR read_pattern
LDY tampon_piste4
BSR read_pattern
STX pattern_adress
LDA tempo_define
STA tempo_user reinit the tempo
LDA break_counter
BITA ,#$01
BEQ new_pattern
ADDA ,#$04
BCC no_new_pattern
new_pattern LDB pattern_position
INCB
CMPB ,repeat
BNE no_repeat
LDB repeat_pattern_number
no_repeat ORA ,#$01
STD break_counter
LDX pattern_table
ABX
LDB ,X
LDA ,#$06
MUL
ADDB ,pattern_adress
STB pattern_adress
RTS
no_new_pattern STA ,break_counter
RTS
not_yet LDY tampon_piste1
BSR command_A
LDY tampon_piste2
BSR command_A
LDY tampon_piste3
BSR command_A
LDY tampon_piste4
command_A LDD $02,Y ‘command_number’ in A and ‘command_parameter’ in B
CMPA ,#$0A
BNE exit
LDX $12,Y ‘volume_user’
ADDB ,X
BMI clear_parameter
ANDB ,#$3F
STB ,X
exit RTS
clear_parameter CLR X
RTS
read_pattern LDD ,X++
STD $14,Y
LDD ,X++
STD $16,Y frequence rate on 4 bytes
LDB ,X
ANDB #$0F
STB $02,Y command
PSHS B
LDB ,X+
ANDB #$F0 sample number
BEQ no_sample
PSHS X
LDX sample_table
ABX
LDD ,X++
STD $04,Y sample_adress
LDD ,X++
STD $08,Y sample_lenght
LDD ,X++
STD $0C,Y loop_adress
LDD ,X++
STD $10,Y loop_lenght
PULS X
no_sample PULS B
CMPB #$0C
BEQ command_C
CMPB #$0D
BEQ command_D
CMPB #$0F
BEQ command_F
LDB ,X+
STD $03,Y
RTS
command_C LDB ,X+
STB $12,Y
RTS
command_D LDB ,X+
CLR ,break_counter
RTS
command_F LDB ,X+
STB ,tempo_define
RTS

Je livre non pas l'intégralité de la routine mais plutôt la partie qui gère la partition. C'est cette partie qui est variable en fonction d'une partition. Bien sûr! on peut combler les manques par des nop. Mais... mon soucis est de pouvoir lui faire sortir un son et surtout de respecter la taille en mémoire. C'est pour cette raison et compte tenu de la variabilité de cette partie que je cherche avant toute chose de synchroniser l'ensemble car la partie qui suit prend beaucoup de cycles (même sur un 7Mhz). C'est pour cette raison que j'ai divisé la durée en deux cycles machine. La fréquence sera donc de moitié (désolé) mais cela permettra au moins une animation.
en haut - en bas
jasz
Visiteur
Date : 09/06/2005 à 21h14
Bon, je pense que beaucoup attendent la routine qui va créer le digit...

Alors c'est let's go :D

Alors posons les données:

X contient l'adresse du buffer pour stocker le digit
Cette routine est executée &hD8 fois
$table contient l'adresse de la table des volumes

PSHS X
LDD 4,Y
ADDD 8,Y
TFR D,X
LDA 12,X
LDB X
ADDD $table
TFR D,X
LDB X
PULS X
STB X

Explications. On commence par sauver X ensuite on charge l'adresse du spl (attention dans mon cas l'adresse représente celle de fin du spl en RAM). Ensuite on ajoute la position du curseur de lecture (cette position est forcement une valeur négative). X=D puis on charge le volume en A(commande C) et l'échantillon du sample en B. On récupère par la suite la valeur correspondante dans la table des volumes et on sauve le tout dans le buffer (sans inc pour la première piste).

Let's warp

LDD A,Y
ADDD 14,Y
STD A,Y
LDD 8,Y
BCS (1)
ADDD #1
(1) ADDD 16,Y
BLT (2)
LDD C,Y
STD 4,Y
LDD 10,Y
ADDD 16,Y
(2)STD 8,Y
RTS

Explications.On charge le compteur virtuel de la la fréquence et on ajoute la partie décimale de cette dernière (A,Y ne gère que le calcul de la partie décimale). Si il ya une retenue on ajoute 1 à la partie entière (comme pour pour un calcul normal en fait). On charge l'entier de la fréquence et on execute l'addition sur sa longueur (je rappele que le longueur est une valeur négative). Si la longueur n'atteint pas le 0 alors pas de problème on sauve la nouvelle variable. Au contraire on charge l'adresse du loop (toujours l'adresse de fin) qui devient celle du spl (4,Y) en suite celle de la longueur (8,Y)

Suis-je assez explicite 8o

A savoir que cette routine ne concerne qu'une voie.
Pour la deux et la trois il faudra prévoir un ADDB, X avant le STB, X et la quatrième remplacer le STB,X par un STB,X+

Cette routine est appelée comme les autres

par

LDY tampon_piste1
BSR digit_piste1
LDY tampon_piste2
BSR digit_piste2
LDY tampon_piste3
BSR digit_piste2
LDY tampon_piste4
...(dernière routine)

Voili
en haut - en bas
jasz
Visiteur
Date : 11/06/2005 à 12h11
Bon, maintenant je vais réorganiser les tampons 'piste' et rajouter entre deux ou trois effets.

Si la création de la table des volumes ne pose aucun problème en revenche la convertion 8-6 bits ne me laisse pas trés enthousisaste sur la qualité du son. (beaucoup trop de souffle )
en haut - en bas
Fool-DupleX
Visiteur
Date : 13/06/2005 à 10h38
Ecris 0A,Y et 0C,Y dans ton code, car A,Y est un adressage licite, il consiste a additionner le registre A au registre Y pour calculer l'adresse. Pour eviter de confondre...

Ca a l'air sympathique tout cela, quelle frequence d'echantillonnage vises-tu ? Pour les 6 bits, on a reussi a faire du son tres correct avec et puis je pense que ce n'est pas le probleme numero 1, tu pourras toujours t'y atteler plus tard.

Fool
en haut - en bas
Pages : 1 - 2