La Place des Développeurs Mes 1ers pas sur MSX ...
Reprise du message précédent
Merci pour AYsfx et tout le reste
C'est vrai que ton 'écriture' est bcp plus compréhensible. C'est un reflexe que je dois prendre

Je reviens vers vous pour un nième problème

Dans 'Where is it ?' lorsque le joueur trouve la bonne matrice 3x3 dans la mosaïque, il marque des points (c'est normal héhéhé). Cela dit, comme sur la version coleco, je voudrais un visuel en même temps qu'un effet sonore
Les petits points représentant le chrono sont sur un fond noir, mais pas le 1, mais le ZERO
De fait, quand je change la couleur du border, la couleur change (j'ai testé avec openMSX et openMSX debugger)
Dès que je valide la bonne matrice, l'effet est présent mais j'ai des carrés noirs qui apparaissent à l'écran. Je ne dois pas utiliser la bonne méthode qui est ci-dessous :
void Border12(void)
{
__asm
ld hl,#BDRCLR // > Adresse couleur border
ld a,#12 // couleur vert foncé
ld (hl),a //
CALL CHGCLR
__endasm;
}
Effet désiré

Effet obtenu, des carrés noirs sont venus me contrarier


si vous avez des pistes, ce dont je ne doute pas, je suis preneur... comme d'hab

Merci encore
Edité par Ricco59 Le 17/03/2021 à 21h40

Je suis pas sûr de bien comprendre le problème. 
Tous les pixels de couleur 0 à l'écran vont changer de couleur quand tu vas changer la couleur de la bordure.
A priori, c'est ce que tu veux.
Jusqu'ici tout va bien.
Quand tu changes la couleur de fond, ça change bien la couleur des pixels 0 par contre j'ai pas compris le problème des « carrés noirs ».
Si c'est des carrés qui étaient noir et qui le sont restés après le changement de couleur de bordure, c'est qu'à priori ils étaient de couleur 1 (noir) et non pas 0 (fond/bordure).
Par contre, si c'était des carrés d'une autre couleur et qui sont passés noirs au moment ou tu as passés la bordure en vert... là c'est très étrange.
Si c'est ce deuxième cas, je ne vois pas d'autre hypothèse qu'un écrasement mémoire (du code qui écrase les infos de couleur avec des 1).
J'sais pas si ça t'aide...
EDIT : Voici le fonctionnement de la fonction CHGCLR :
La dernière phrase laisse penser que la fonction modifie directement le contenu de la Color Table !!
Par contre, ce n'est pas clair de quel mode ils parlent ; officiellement, le seul Text Mode du MSX1 est le mode 40x24.
En tout cas, c'est ce genre de surprise qui me conforte dans l'idée de me passer du Bios !
Au moins, je sais exactement ce que font mes fonctions.
En l'occurrence, changer la couleur de bordure (et de tous les pixels de couleur 0) se fait simplement en modifiant la valeur du registre 7 du VDP :

Tous les pixels de couleur 0 à l'écran vont changer de couleur quand tu vas changer la couleur de la bordure.
A priori, c'est ce que tu veux.
Jusqu'ici tout va bien.

Quand tu changes la couleur de fond, ça change bien la couleur des pixels 0 par contre j'ai pas compris le problème des « carrés noirs ».
Si c'est des carrés qui étaient noir et qui le sont restés après le changement de couleur de bordure, c'est qu'à priori ils étaient de couleur 1 (noir) et non pas 0 (fond/bordure).
Par contre, si c'était des carrés d'une autre couleur et qui sont passés noirs au moment ou tu as passés la bordure en vert... là c'est très étrange.
Si c'est ce deuxième cas, je ne vois pas d'autre hypothèse qu'un écrasement mémoire (du code qui écrase les infos de couleur avec des 1).

J'sais pas si ça t'aide...
EDIT : Voici le fonctionnement de la fonction CHGCLR :
MSX Red Book :
Standard routine to set the VDP colours. SCRMOD is first examined to determine the appropriate course of action. In 40x24 Text Mode the contents of BAKCLR and FORCLR are written to VDP Mode Register 7 to set the colour of the 0 and 1 pixels, these are initially blue and white. Note that in this mode there is no way of specifying the border colour, this will be the same as the 0 pixel colour. In 32x24 Text Mode, Graphics Mode or Multicolour Mode the contents of BDRCLR are written to VDP Mode Register 7 to set the colour of the border, this is initially blue. Also in 32x24 Text Mode the contents of BAKCLR and FORCLR are copied to the whole of the Colour Table to determine the 0 and 1 pixel colours.
La dernière phrase laisse penser que la fonction modifie directement le contenu de la Color Table !!
Par contre, ce n'est pas clair de quel mode ils parlent ; officiellement, le seul Text Mode du MSX1 est le mode 40x24.
En tout cas, c'est ce genre de surprise qui me conforte dans l'idée de me passer du Bios !
Au moins, je sais exactement ce que font mes fonctions.

En l'occurrence, changer la couleur de bordure (et de tous les pixels de couleur 0) se fait simplement en modifiant la valeur du registre 7 du VDP :
Code ASM :
#define P_VDP_ADDR 0x99 ///< Register setup port (write) (bit 7=1 in second write) __asm // ld l, myValue ld a, l di //~~~~~~~~~~~~~~~~~~~~~~~~~~ out (P_VDP_ADDR), a ld a, #(0x80 + 7) // VDP register #7 ei //~~~~~~~~~~~~~~~~~~~~~~~~~~ out (P_VDP_ADDR), a __endasm;
On est toujours ignorant avant de savoir.

Mouep... Y a un Bug...
Mais où ? Mystère...
Essaie la routine de aoineko pour changer la border Color...
Voici la mienne, mais ca revient au même
Definition C
Code ASM
Mais où ? Mystère...
Essaie la routine de aoineko pour changer la border Color...
Voici la mienne, mais ca revient au même
Definition C
Code C :
void SetBorderColor( char BorderCol) __z88dk_fastcall;
Code ASM
Code ASM :
Edité par
ericb59
Le 18/03/2021 à 14h11
;--------------------------------------------------------- ; setbordercolor (char Color) ; ; ;---------------------------------------------------------- .area _CODE ;----------------------------------------------- BDRCLR = 0xF3EB ; border color _SetBorderColor:: ; Sets border colour by A=Nr. ld a,l di out (#0x99),a ; a=[0..15] ld a, #128+#7 ei out (#0x99),a ld (BDRCLR),a ret

ericb59 :
Voici la mienne, mais ca revient au même
Definition C
Code ASM
Definition C
Code C :
void SetBorderColor( char BorderCol) __z88dk_fastcall;
Code ASM
Code ASM :
;--------------------------------------------------------- ; setbordercolor (char Color) ; ; ;---------------------------------------------------------- .area _CODE ;----------------------------------------------- _SetBorderColor:: ; Sets border colour by A=Nr. ld a,(hl) di out (#0x99),a ; a=[0..15] ld a, #128+#7 ei out (#0x99),a ret
Si tu utilises __z88dk_fastcall, ton paramètre d'entrée devrait être dans le registre H, pas à l'adresse (HL)...

Ca devrait pas plutôt être :
Code ASM :
_SetBorderColor:: ld a,l ...
On est toujours ignorant avant de savoir.
Bon les ptits gars, j'ai corrigé
merci encore
C'est effectivement bizarre car les carrés noirs en question étaient colorés à l'origine (il n'y a que le symbole qui est noir 1). Ca ne doit affecter que quelques couleurs en début de table (0x2000). Ecrasement, bug, je ne sais pas mais j'y reviendrai plus tard
Edité par Ricco59 Le 18/03/2021 à 22h03

(...) Par contre, si c'était des carrés d'une autre couleur et qui sont passés noirs au moment ou tu as passés la bordure en vert... là c'est très étrange.(...)
C'est effectivement bizarre car les carrés noirs en question étaient colorés à l'origine (il n'y a que le symbole qui est noir 1). Ca ne doit affecter que quelques couleurs en début de table (0x2000). Ecrasement, bug, je ne sais pas mais j'y reviendrai plus tard

Edité par Ricco59 Le 18/03/2021 à 22h03
Voici quelques screenshots de Where is it ? sur MSX et ce qui a été fait




bugs corrigés
- pendant le jeu, le curseur était parfois décalé par rapport à une position multiple de 8
- l'animation du curseur relatif à la solution ne démarrait pas au bon index
- qd j'effaçais ligne / ligne un ecran rempli de texte, la routine n'effacait que par paquet de 8. Maintenant l'effacement se fait sur une ligne complete (bcp plus rapide)
les controles
joystick 1 bouton (fire 1 = action, ESC = Pause)
joystick 2 bouton (Fire 1 = action, Fire 2 = Pause)
Clavier (fleches de direction, SPACE = action, ESC = pause
Ajout du déplacment en diagonale
La pause
Qd un joueur appuie sur ESC, le jeu se met en pause avec une petite animation (clignottement du symbole de pause). Mais, car il y a toujours un mais, la matrice 3x3 change en permanence tant que le joueur n'a pas rappuyé sur SPACE/FIRE1
Ah oui, il n'y a pas de pause dans le CHALLENG'STAGE mode
Qd le joueur trouve la bonne matrice 3x3
un effet visuel apparait annonçant au joueur qu'il a trouvé la bonne matrice
A FAIRE
- corriger le MENU
- revoir la FIN qd le joueur est en mode STORY
- trouver un moyen d'ajouter qqs sons et le sfxplayer dans moins de 2ko...
Sur la version Coleco, avec les sons, j'en était à approximativement 29ko (je compilais avec SDCC3.6.0. Je vais tester avec 3.6.0
Tchao les zamis et merci encore












bugs corrigés
- pendant le jeu, le curseur était parfois décalé par rapport à une position multiple de 8
- l'animation du curseur relatif à la solution ne démarrait pas au bon index
- qd j'effaçais ligne / ligne un ecran rempli de texte, la routine n'effacait que par paquet de 8. Maintenant l'effacement se fait sur une ligne complete (bcp plus rapide)
les controles
joystick 1 bouton (fire 1 = action, ESC = Pause)
joystick 2 bouton (Fire 1 = action, Fire 2 = Pause)
Clavier (fleches de direction, SPACE = action, ESC = pause
Ajout du déplacment en diagonale
La pause
Qd un joueur appuie sur ESC, le jeu se met en pause avec une petite animation (clignottement du symbole de pause). Mais, car il y a toujours un mais, la matrice 3x3 change en permanence tant que le joueur n'a pas rappuyé sur SPACE/FIRE1
Ah oui, il n'y a pas de pause dans le CHALLENG'STAGE mode
Qd le joueur trouve la bonne matrice 3x3
un effet visuel apparait annonçant au joueur qu'il a trouvé la bonne matrice
A FAIRE
- corriger le MENU
- revoir la FIN qd le joueur est en mode STORY
- trouver un moyen d'ajouter qqs sons et le sfxplayer dans moins de 2ko...
Sur la version Coleco, avec les sons, j'en était à approximativement 29ko (je compilais avec SDCC3.6.0. Je vais tester avec 3.6.0
Tchao les zamis et merci encore

Presque fini ! (on met le champa... le cidre au frais)
Pour te donner un ordre d'idée, le player ayFX que j'utilise fait environs 256 octets et la banque de 21 sons que j'utilise comme « placeholder » (data de test) fait 1 Ko.
Si tu as juste besoin de 2~3 sons ; tu devrais tout pouvoir faire rentrer dans moins de 1 Ko.
Ricco59 :
- trouver un moyen d'ajouter qqs sons et le sfxplayer dans moins de 2ko...
- trouver un moyen d'ajouter qqs sons et le sfxplayer dans moins de 2ko...
Pour te donner un ordre d'idée, le player ayFX que j'utilise fait environs 256 octets et la banque de 21 sons que j'utilise comme « placeholder » (data de test) fait 1 Ko.
Si tu as juste besoin de 2~3 sons ; tu devrais tout pouvoir faire rentrer dans moins de 1 Ko.
On est toujours ignorant avant de savoir.

Gfx :
Super Ricco ! ca me donne presque envie de me mettre au dev sur MSX vos projets 

Z'y va ! (comme on dit chez moi

En tout cas, tu trouveras des gens pour t'aider ici.
On est toujours ignorant avant de savoir.
@Gfx : pourquoi presque, comme dit Guillaume z'y va 
@aoineko : je viens de zieuter un peu partout et pour le ayfx player, il doit être couplé à PT3-replayer ??? Si c'est le cas, je ne peux plus rien faire à moins de passer en 48ko, mettre des ziks, du sons et des graphs dans la partie intro du mode story
plus sérieusement, peux tu confirmer cela aoineko ? ayfxplayer n'est pas autonome ??
Concernant Wii? j'ai fait encore quelques retouches (gfx, code) et j'ai maintenant 2.2ko
Je bloque sur la partie son...
Je continue mes recherches sur mrc et partout où il est question d'ayfx...
J'ai vu aussi qu'Arkos Tracker permettait de jouer zik + sfx (Reidrac, Juan J MArtinez 'Night Knight' par exemple s'en sert)
A+ les potos
edit : je vais regarder du coté de WRTPSG (0093H) Edité par Ricco59 Le 25/03/2021 à 22h53

@aoineko : je viens de zieuter un peu partout et pour le ayfx player, il doit être couplé à PT3-replayer ??? Si c'est le cas, je ne peux plus rien faire à moins de passer en 48ko, mettre des ziks, du sons et des graphs dans la partie intro du mode story
plus sérieusement, peux tu confirmer cela aoineko ? ayfxplayer n'est pas autonome ??
Concernant Wii? j'ai fait encore quelques retouches (gfx, code) et j'ai maintenant 2.2ko
Je bloque sur la partie son...
Je continue mes recherches sur mrc et partout où il est question d'ayfx...
J'ai vu aussi qu'Arkos Tracker permettait de jouer zik + sfx (Reidrac, Juan J MArtinez 'Night Knight' par exemple s'en sert)
A+ les potos
edit : je vais regarder du coté de WRTPSG (0093H) Edité par Ricco59 Le 25/03/2021 à 22h53

De base ayFX est complétement indépendant, mais c'est vrai qu'on trouve souvent des versions couplées avec PT3.
En fait, tous les replayers marchent sur le même principe : y a une fonction de décodage qui converti une frame de musique ou de son en valeurs à envoyer au processeur sonore (PSG).
Ensuite, une autre fonction s'occupe d'envoyer ces valeurs au PSG.
La partie commune c'est le buffer mémoire ou l'on décode une frame (ça permet d'avoir plusieurs players en même temps) et la fonction qui copie ce buffer vers le PSG.
Si tu as besoin d'aide, je pourrais essayer de te faire une version du player ayFX autonome.
Après, si tu veux juste faire des bip bip, tu peux utiliser le Bios pour jouer des notes.
En fait, tous les replayers marchent sur le même principe : y a une fonction de décodage qui converti une frame de musique ou de son en valeurs à envoyer au processeur sonore (PSG).
Ensuite, une autre fonction s'occupe d'envoyer ces valeurs au PSG.
La partie commune c'est le buffer mémoire ou l'on décode une frame (ça permet d'avoir plusieurs players en même temps) et la fonction qui copie ce buffer vers le PSG.
Si tu as besoin d'aide, je pourrais essayer de te faire une version du player ayFX autonome.
Après, si tu veux juste faire des bip bip, tu peux utiliser le Bios pour jouer des notes.
On est toujours ignorant avant de savoir.
Merci pour ton aide 
Neanmoins, suis-je sur la bonne voie (histoire de savoir si j'ai compris le chimilimilik) ?
T N Per Noise Vol
1, 0, 0x21a, 0x00, 0xa
1, 0, 0x01f, 0x00, 0xb
1, 0, 0x01d, 0x00, 0xa
1, 0, 0x01f, 0x00, 0xb
1, 0, 0x01d, 0x00, 0xa
1, 0, 0x01f, 0x00, 0xb
1, 0, 0x01d, 0x00, 0xa
Address : #0093
Function : Writes data to PSG register
Input : A - PSG register number
E - Data write
pour i de 0 à 254 (pas de noise)
r0 = per[i+3] and 0%11111111 // Freq octet faible
r1 = per[i+2] and 0%00001111 // Freq octet fort puis decalé
r8 = per[i+5] // volume
writepsg
finpour Edité par Ricco59 Le 25/03/2021 à 22h52

Neanmoins, suis-je sur la bonne voie (histoire de savoir si j'ai compris le chimilimilik) ?
T N Per Noise Vol
1, 0, 0x21a, 0x00, 0xa
1, 0, 0x01f, 0x00, 0xb
1, 0, 0x01d, 0x00, 0xa
1, 0, 0x01f, 0x00, 0xb
1, 0, 0x01d, 0x00, 0xa
1, 0, 0x01f, 0x00, 0xb
1, 0, 0x01d, 0x00, 0xa
Address : #0093
Function : Writes data to PSG register
Input : A - PSG register number
E - Data write
pour i de 0 à 254 (pas de noise)
r0 = per[i+3] and 0%11111111 // Freq octet faible
r1 = per[i+2] and 0%00001111 // Freq octet fort puis decalé
r8 = per[i+5] // volume
writepsg
finpour Edité par Ricco59 Le 25/03/2021 à 22h52

J'utilise pas du tout le Bios donc je suis pas la bonne personne pour t'aider sur ce coup là. 
A priori, WRTPSG permet d'écrire une donnée dans l'un des 13 registres du PSG qui gère le son.
Tu peux trouver le détail des registres là par ex. : https://www.angelfire.com/art2/unicorndreams/msx/RR-PSG.html
Par ex., si tu mets FFh dans les registres #0 et #1, tu auras un son de fréquence 27,3 Hz sur la canal A. Si tu mets 0Fh dans le registre 8, ça va monter à fond le volume de ce channel.
Bon, ça marche si tu veux un truc vraiment ultra basic, mais perso, je te recommande quand même le player ayFX et son éditeur. C'est pas si complexe à faire fonction, c'est assez compact, et ça te permettra de créer des sons vraiment sympa (ou d'utiliser l'un des nombreux sont existants à ce format).

A priori, WRTPSG permet d'écrire une donnée dans l'un des 13 registres du PSG qui gère le son.
Tu peux trouver le détail des registres là par ex. : https://www.angelfire.com/art2/unicorndreams/msx/RR-PSG.html
Par ex., si tu mets FFh dans les registres #0 et #1, tu auras un son de fréquence 27,3 Hz sur la canal A. Si tu mets 0Fh dans le registre 8, ça va monter à fond le volume de ce channel.
Bon, ça marche si tu veux un truc vraiment ultra basic, mais perso, je te recommande quand même le player ayFX et son éditeur. C'est pas si complexe à faire fonction, c'est assez compact, et ça te permettra de créer des sons vraiment sympa (ou d'utiliser l'un des nombreux sont existants à ce format).
On est toujours ignorant avant de savoir.
Les 7 'phrases' de mon mess précedent viennent de AySFX Editor 0.6
ensuite il faut de l'imagination
Cela dit je suis partant pour un ayFX autonome
on verra si par la suite, je ferai une version 48ko avec des ziks
Comme j'apprends, ca sera plus long
Merci encore
Comme d'hab héhé
ensuite il faut de l'imagination

Cela dit je suis partant pour un ayFX autonome

on verra si par la suite, je ferai une version 48ko avec des ziks

Comme j'apprends, ca sera plus long
Merci encore
Comme d'hab héhé

Code ASM :
___________________________________________________________ ;/ __ _ \ ;| / _| (_) | ;| | |_ _ _ ___ _ ___ _ __ | ;| | _| | | / __| |/ _ \| '_ \ | ;| | | | |_| \__ \ | (_) | | | | | ;| |_| \__,_|___/_|\___/|_| |_| * | ;| | ;| The MSX C Library for SDCC | ;| V1.3 - 05-2020 | ;| | ;| Eric Boez & Fernando Garcia | ;| | ;| A S M S O U R C E C O D E | ;| | ;| https://github.com/Threetwosevensixseven/ayfxedit-improved| ;| | ;| https://shiru.untergrund.net/software.shtml | ;\___________________________________________________________/ ; ; AYFX Sound Effect Driver ; based on Shiru's, modified by Artrag in April 6 2014 ; ; This AYFX Replayer can play up to 3 SoundFx at the same time, over the 3 PSG Channels ; .area _DATA DATA_AREA: afxNoisePeriod: .ds 1 afxBnkAdr: .ds 2 afxAYREGS: .ds 14 ; descriptors channels 11 bytes to the channel: ; 0 (2) the current address (the channel is free, if the high byte = $ 00) ; 2 (2) Time effect ; 4 (1) the volume ; 5 (1) bits of the mixer ; 6 (2) pitch period ; 8 (1) looping effect if != $00 ; 9 (2) starting point if looping afxChData: .ds 33 END_DATA_AREA: ; endmap afxTonA= 0 afxTonB= 2 afxTonC= 4 afxNoise= 6 afxMixer= 7 afxAmplA= 8 afxAmplB= 9 afxAmplC= 10 loopingsfx= 0 ; sfx with $ up to loopingsfx (excluded) will loop, the higher $ will go once ; ------------------------------------------------- ------------- ; ; Initialization player effects. ; ; Turns off all channels , sets variables . ; ; ------------------------------------------------- ------------- ; .area _CODE _InitFX:: ; ld hl, sfxBank_miz ; ld de,miz_buffer ; call mom_depack_rom _StopFX:: ld hl,#DATA_AREA ld b,#END_DATA_AREA-#DATA_AREA afxloop: ld (hl),#0 inc hl djnz afxloop push ix ld ix,#0 add ix,sp ld l,4(ix) ld h,5(ix) pop ix inc hl ld (afxBnkAdr),hl ; reserve table address offsets xor a ld (afxNoisePeriod),a ld hl, #afxChData ; mark all channels as empty ld de, #0x00ff ld b, #3 afxInit0: ld (hl),d inc hl ld (hl),d inc hl ld (hl),e inc hl ld (hl),e inc hl ld (hl),d inc hl ld (hl),e inc hl ld (hl),d inc hl ld (hl),d inc hl ld (hl),d inc hl ld (hl),d inc hl ld (hl),d inc hl djnz afxInit0 ret ; ------------------------------------------------- ------------- ; ; Playback of the current frame . ; ; With no parameters . ; ; ------------------------------------------------- ------------- ; _UpdateFX:: push ix ; ROUT ;out buffered sfx data xor a ; --- FIXES BITS 6 AND 7 OF MIXER --- ld hl,#afxAYREGS+afxMixer set 7,(hl) res 6,(hl) ld c,#0xA0 ld hl,#afxAYREGS afxsfxloop: out (c),a inc c outi dec c inc a cp #13 jr nz,afxsfxloop ;/out buffered sfx data ld ix, #afxChData ld b, #3 afxFrameLoop: ld a, 1(ix) ; significant byte addresses effect or a ; if 0, the channel is not active jr z, afxFrameChSkip ld h, a ld l, 0(ix) ; low byte address effect ld a, (hl) ; read information bytes inc hl ld c, a ld 5(ix), a ; remember bits mixer and #15 ld 4(ix), a ; remember volume bit 5 , c ; changing pitch period jr z, afxFrameNoTone ld a, (hl) ; remember period inc hl ld 6(ix), a ld a,(hl) inc hl ld 7(ix), a afxFrameNoTone: bit 6 , c ; period change noise jr z, afxFrameNoNoise ld a, (hl) ; period obtain cp #0x20 ; if it is more than 31 , the effect is over jr c, afxFrameNoise ld a,8(ix) and a jr z,afxa1 ; looping effect ld l,9(ix) ; restart the effect from the beginning ld h,10(ix) ld 0(ix), l ; remember address ld 1(ix), h inc 2(ix) ; increment the playing time jr nz, afxFrameLoop inc 3(ix) jr afxFrameLoop afxa1: ; no loop xor a ; vanishes high byte address and the volume ld 1(ix), a ld 4(ix), a jr afxFrameChSkip afxFrameNoise: inc hl ; remember period noise ld (afxNoisePeriod), a afxFrameNoNoise: ld 0(ix), l ; remember address ld 1(ix), h inc 2(ix) ; increment the playing time jr nz, afxFrameChSkip inc 3(ix) afxFrameChSkip: ld de, #11 ; the next channel add ix, de djnz afxFrameLoop ; ld a, (afxAYREGS + AmplA) ; ld c, a ld a, (#afxChData+0 * 11 +4) ; cp c ; jr c, afxSkipCh0 ld (#afxAYREGS + afxAmplA), a ld a, (#afxChData +0 * 11 + 6 ) ld (#afxAYREGS + afxTonA +0), a ld a, (#afxChData +0 * 11 +7 ) ld (#afxAYREGS + afxTonA +1), a ld a, (#afxAYREGS + afxMixer) and #0b11110110 ld c, a ld a, (#afxChData +0 * 11 + 5 ) rra rra rra rra and #0b00001001 or c ld (#afxAYREGS + afxMixer), a afxSkipCh0: ; ld a, (afxAYREGS + AmplB) ; ld c, a ld a, (#afxChData +1 * 11 +4) ; cp c ; jr c, afxSkipCh1 ld (#afxAYREGS + afxAmplB), a ld a, (#afxChData +1 * 11 + 6 ) ld (#afxAYREGS + afxTonB +0), a ld a, (#afxChData +1 * 11 +7 ) ld (#afxAYREGS + afxTonB +1), a ld a, (#afxAYREGS + afxMixer) and #0b11101101 ld c, a ld a, (#afxChData +1 * 11 + 5 ) rra rra rra and #0b00010010 or c ld (#afxAYREGS + afxMixer), a afxSkipCh1: ; ld a, (afxAYREGS + AmplC) ; ld c, a ld a, (#afxChData +2 * 11 +4) ; cp c ; jr c, afxSkipCh2 ld (#afxAYREGS + afxAmplC), a ld a, (#afxChData +2 * 11 + 6 ) ld (#afxAYREGS + afxTonC +0), a ld a, (afxChData +2 * 11 +7 ) ld (#afxAYREGS + afxTonC +1), a ld a, (#afxAYREGS + afxMixer) and #0b11011011 ld c, a ld a, (#afxChData +2 * 11 + 5 ) rra rra and #0b00100100 or c ld (#afxAYREGS + afxMixer), a afxSkipCh2: ld ix, #afxChData ld a,5(ix) ; +0 * 11 +5 and 16(ix) ; +1 * 11 +5 and 27(ix) ; +2 * 11 +5 rla jr c, afxNoNoise ld a, (afxNoisePeriod) ld (#afxAYREGS + afxNoise), a afxNoNoise: pop ix ret ; ------------------------------------------------- ------------- ; ; Running effect on the free channel. In the absence ; ; free channels selects the most long -sounding . ; ; Input : A = number of effect 0 .. 255 ; ; ------------------------------------------------- ------------- ; _PlayFX:: push ix ld ix,#0 add ix,sp ld a,4(ix) push iy ex af,af' ld ix, #afxChData ; empty channel search ld de,#11 ld b,#3 afxb1: ;ld a,1(ix) or a jr z,afxfreechan add ix,de djnz afxb1 ; no free channels ld iy, #afxChData ; search the channel that plays from more time ld ix, #afxChData ; in case of 3 looping channels use channel A ld de, #0 ; in de the longest time while searching ld bc,#11 ld a, #3 afxPlay0: inc 8(iy) dec 8(iy) jr nz, afxPlay1 ; skip channels with looping effects ld l, 2(iy) ; compare time channel with the highest ld h, 3(iy) sbc hl,de jr c, afxPlay1 add hl,de ; remember the longest time ex de,hl push iy ; remember the address of the channel in ix pop ix afxPlay1: add iy,bc dec a jr nz,afxPlay0 ; expect to address the effect afxfreechan: ld h, a ex af,af' ld l, a add hl, hl ld bc, (afxBnkAdr) ; address offset table effects add hl, bc ld c, (hl) inc hl ld b, (hl) add hl, bc ; effect address obtained in hl ld 0(ix), l ; record in the channel descriptor ld 1(ix), h ld 2(ix), #0 ; reset execution Time ld 3(ix), #0 ld 8(ix), #0 ; reset looping flag cp #loopingsfx ; up to sfx $loopingsfx-1 will loop jr nc,afxc1 ld 8(ix), #-1 ; set looping flag ld 9(ix), l ; record in the channel descriptor for later use ld 10(ix), h afxc1: pop iy pop ix ret
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie