MSX Village forum

La Place des Développeurs Mes 1ers pas sur MSX ...

Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 17/03/2021 à 21h37

Reprise du message précédent

Merci pour AYsfx et tout le reste :) Ca va etre chaud, il me reste moins de 2ko...

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


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2702

Le 18/03/2021 à 00h44
Je suis pas sûr de bien comprendre le problème. :gne
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). :gne
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.
Github    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5485

Le 18/03/2021 à 09h30
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 C :
 
void                 SetBorderColor( char BorderCol) __z88dk_fastcall; 
 


Code ASM
Code ASM :
 
;---------------------------------------------------------
;    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
 
Edité par ericb59 Le 18/03/2021 à 14h11


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2702

Le 18/03/2021 à 10h40
ericb59 :
Voici la mienne, mais ca revient au même

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)... :hum
Ca devrait pas plutôt être :
Code ASM :
_SetBorderColor::
    ld a,l
    ...


On est toujours ignorant avant de savoir.
Github    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5485

Le 18/03/2021 à 14h04
Oups !
Tu as tout à fait raison. J'ai corrigé.


banniere-ericb59e
Site web    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 18/03/2021 à 22h00
Bon les ptits gars, j'ai corrigé ;) merci encore

(...) 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


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 18/03/2021 à 23h30
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


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2702

Le 19/03/2021 à 15h43
Presque fini ! (on met le champa... le cidre au frais)

Ricco59 :

- 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.
Github    
Gfx Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 22/02/2021 à 22h22

Messages: 355

Le 19/03/2021 à 21h18
Super Ricco ! ca me donne presque envie de me mettre au dev sur MSX vos projets :)


Il faut cultiver notre jardin.
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2702

Le 19/03/2021 à 21h47
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.
Github    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 25/03/2021 à 21h29
@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


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2702

Le 25/03/2021 à 22h09
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.


On est toujours ignorant avant de savoir.
Github    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 25/03/2021 à 22h46
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


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2702

Le 25/03/2021 à 23h04
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).


On est toujours ignorant avant de savoir.
Github    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 25/03/2021 à 23h53
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é


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5485

Le 26/03/2021 à 11h44
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
 
 
 
 


banniere-ericb59e
Site web    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie