Je ne sais pas comment fonctionne Genlib au niveau des interruptions, mais je suis persuadé quand réalisant une fonction dans Genlib on purrais avoir uenc ompatibilité parfaite à 100%. Le seul problème c'est que PolySnd devient la librairie principal à cause de la vitesse de l'interurption n°5.
Voilà à quoi je pense:
Initialiser PolySnd avec EnableSound et InstallSound
Créer une interruption de 5 Khz avec la fonction interrupt5 et la diriger vers un DEFINE_INT_HANDLER.
Créer une fonction dans genlib redirgeant les fonctions de niveaux de gris et des timers sur l'interruption de 5 Khz de PolySnd.
Diminuer la vitesse de l'interruption de PolySnd avec un compteur ou un petit algo pour la mettre à la vitesse courante demandé à Genlib.
Au final malheuresmeent je pense que PpHd doit toucher à Genlib pour que PolySnd soit compatible et pourtant il suffit de pas grand chose.
PpHd 2003-08-18 at 05:58pm Techniquement il suffit d'initialiser Genlib, de recupere l'adresse de son vecteur, puis d'initialiser polysnd. Puis il faut installer une interruption personnelle de l'int 5 en asm.
jsr genlib::init
move.l $74,GenLibInt
jsr polysnd::init
move.l $74,PolySndInit
move.l #MyInt5,$40074
move.w #INITIAL_VALUE,Int5Timer
MyInt5:
; Call PolySnd
pea \Return1(pc)
move.w SR,-(a7)
move.l PolySndInit,a0
jmp (a0)
\Return1:
; Call Genlib if needed.
subq.w #1,Int5Timer
bne.s \Return
move.w #INITIAL_VALUE,Int5Timer
pea \Return(pc)
move.w SR,-(a7)
move.l GenLibInit,a0
jmp (a0)
\Return
rte
1. INITIAL_VALUE doit valoir exactement FrequencePolySnd/FrequenceGenlib.
2. Si c'est pas un entier, je recommande d'utiliser des fixed (Pas plus complique).
PpHd 2003-08-18 at 06:02pm Je rappelle que toutes les interruptions doivent etre finis par un rte...
Pour des timer fixed:
Tu travailles avec des long.
INITIAL_VALUE = PolySndFreq*65536/GenLiBFreq = 3640889
GenLibFreq=90Hz
PolySndFreq=5000Hz.
sub.l #65536,Int5Timer
bgt.s \return
add.l #INITIAL_VALUE,Int5Timer
Voila. Ca devrait marcher peut etre.
PpHd 2003-08-18 at 06:03pm Et je rappelle que TeOs utilise aussi l'int5.
L'interruption de PolySnd tourne à 5000 Hz et l'interruption en interne à PolySnd à 8192 Hz sur HW2 et 11569 sur HW1. Donc le cas ce simplifie.
J'aurais pensais qu'il été plus simple d'utiliser la fonction interrupt5 de PolySnd et executer à 90 Hz dans celle-ci l'interurption de GenLib.
PpHd 2003-08-18 at 06:40pm Ben c'est ce que je fais.
Non toi tu créer une nouvelle interruption, tu intercepte les fonctions de PolySnd et de Genlib et dans cette interruption tu approxime le temps d'execution 5 Khz pour PolySnd et 90 Hz pour Genlib, c'est bon ausf que PolySnd à besoin de 8192 Hz sur HW2 et 11569 sur HW1.
Moi je propose ça:
InitGenLib et interception de l'interruption, sauver $74 dans une variable.
EnableSound();
InstallSound ();
Interrupt5(intgen);
....
Dans DEFINE_INT_HANDLER (intgen)
approximer le temps en passant de 5 Khz à 90 Hz et executer l'interruption de GenLib.
PpHd 2003-08-19 at 02:14pm Heu........
J'approxime rien me semble-t-il pour PolySnd. C'est juste un couche supplementaire gerant l'appel a 90Hz de Genlib.
MyInt5:
; Call Genlib if needed.
sub.l #65536,Int5Timer
bgt.s \Return
add.l #INITIAL_VALUE,Int5Timer
pea \Return(pc)
move.w SR,-(a7)
move.l GenLibInit,-(a7)
rts
\Return
; Call PolySnd
move.l PolySndInt(pc),-(a7)
rts
J'en ai profite pour corriger un gros bug et optimise un peu.
Juste une petite question, il est possible de programmer en C avec Genlib??
C vE dire que je dois recoder tout mon SM en ASM ou seulement utiliser cette fonction (poste 8)?
PpHd 2003-08-24 at 11:57pm GenLibInit (); c'est gl_init();
ExecuterHandler(...); c'est une fct de PolySnd ?
C'est pas plutot genlibint = GetIntVec(AUTO_INT_5);
Iros a enfin réussit à faire fonctionner PolySnd avec Genlib mais il reste un problème assez génant qui ,empêche de faire fonctionner correctement les niveaux de gris avec PolySnd.
Je pense que le problème vient de Genlib avec le mask dans sr situé dans l'interruption 1 qui doit possèder une valeur >=0x2205. Il faudrait être capable de modifier avec une simple ligne après initialisation de Genlib le contenus de ce registre ou créer une fonction dans Genlib comme le fait PolySnd permettant de modifier comme on veut la valeur de SR.
Le problème est simple, l'interruption 1 déclenché moins souvent que l'interruption n°5 retire des cycles de l'interruption n°5 et la fait passer de 8192 Hz à 6 Khz et donc ralentie le son et devient plsu grave, dans le cas de l'int n°1 c'est pareil, l'interruption est plus len te et donc provoque des clignotement.
Je pense qu'il faudra faire un hack de l'AI1 comme pour celle de gray.s.
PpHd 2003-09-09 at 09:14am 1. Je comprend pas ton truc. Genlib fixe le masque de SR comme tu dis a $2200, donc l'int 1 n'est pas activee.
2. L'int 1 ne peut pas interrompre l'int 5. Mais lorsque l'int 1 est active elle est souvent avec le masque $2700, donc l'int 5 n'est pas activable: il ne faut donc pas utiliser du tout l'int1.
3. Le probleme provient peut etre du fait que la copie de genlib du tiers de l'ecran prend trop de temps (Elle est ininterrupable par l'int5). Pour savoir si c'est ca, il faut tester sur HW1.
Au fait j'ai mis plutôt 0x2200 car 0x2400 semble désactiver l'auto int 3.