MSX Village forum

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

ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5566

Le 26/03/2021 à 11h44

Reprise du message précédent

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    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5566

Le 26/03/2021 à 11h48
Example d’utilisation

Code C :
 
 
/*
 ___________________________________________________________
/               __           _                              \
|              / _|         (_)                             |
|             | |_ _   _ ___ _  ___  _ __                   |
|             |  _| | | / __| |/ _ \| '_ \                  |
|             | | | |_| \__ \ | (_) | | | |                 |
|             |_|  \__,_|___/_|\___/|_| |_| *               |
|                                                           |
|               The MSX C Library for SDCC                  |
|                 E X A M P L E  C O D E                    |
|                                            FUSION-C v1.3  |
\___________________________________________________________/
*/
// Example : how to load sounds FX and use the AYFX Player
//
// Works on MSX1 and upper  
//
// Need External files :
//   test.afb
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fusion-c/header/msx_fusion.h"
#include "fusion-c/header/ayfx_player.h"
 
#define AFB_SIZE 1207
 
static FCB file; 
 
char *afbdata;
 
/* ---------------------------------
            FT_errorHandler
 
          In case of Error
-----------------------------------*/ 
void FT_errorHandler(char n, char *name)
{
  InitPSG();
  Screen(0);
  SetColors(15,6,6);
  switch (n)
  {
      case 1:
          printf("\n\rFAILED: fcb_open(): %s ",name);
      break;
 
      case 2:
          printf("\n\rFAILED: fcb_close(): %s",name);
      break;  
 
      case 3:
          printf("\n\rSORRY: this game does not work on %s",name);
      break; 
  }
Exit(0);
}
 
/* ---------------------------------
                FT_SetName
 
    Set the name of a file to load
                (MSX DOS)
-----------------------------------*/ 
void FT_SetName( FCB *p_fcb, const char *p_name ) {
  char i, j;
  memset( p_fcb, 0, sizeof(FCB) );
  for( i = 0; i < 11; i++ ) {
    p_fcb->name[i] = ' ';
  }
  for( i = 0; (i < 8) && (p_name[i] != 0) && (p_name[i] != '.'); i++ ) {
    p_fcb->name[i] =  p_name[i];
  }
  if( p_name[i] == '.' ) {
    i++;
    for( j = 0; (j < 3) && (p_name[i + j] != 0) && (p_name[i + j] != '.'); j++ ) {
      p_fcb->ext[j] =  p_name[i + j] ;
    }
  }
}
 
 
/* ---------------------------------
          FT_LoadData
  Load Data to a specific pointer
  size is the size of data to read
  skip represent the number of Bytes
  you want to skip from the begining of the file
  Example: skip=7 to skip 7 bytes of a MSX bin
-----------------------------------*/ 
int FT_LoadData(char *file_name, char *buffer, int size, int skip)
{
 
    FT_SetName( &file, file_name );
    if(fcb_open( &file ) != FCB_SUCCESS) 
    {
          FT_errorHandler(1, file_name);
          return (0);
    }
    if (skip>0)
    {
        fcb_read( &file, buffer, skip );
    }
 
 
    fcb_read( &file, buffer, size );
 
    if( fcb_close( &file ) != FCB_SUCCESS ) 
    {
      FT_errorHandler(2, file_name);
      return (0);
    }
    return(0);
}
 
/* ---------------------------------
            FT_CheckFX
     Check if Playing Sound FX
          must be updated
-----------------------------------*/
void FT_CheckFX (void)
{ 
          EnableInterupt();
          Halt();
          DisableInterupt();
          UpdateFX();
          EnableInterupt();
}
 
void main (void)
{
  char k;
 
  afbdata=MMalloc(AFB_SIZE);
 
  InitPSG();
  InitFX(afbdata);
 
 
  FT_LoadData("test.afb", afbdata, AFB_SIZE, 0);
  Cls();
 
  Print("AYFX Player --- ESC to EXIT");
  Print("\n\rPush on key a,b,c,d,e,f,g,h,i,j or k");
  printf("\n\rTo play sound fx");
    while (1)
    {
      k=Inkey();
      switch (k)
      {
          case 97:
             PlayFX(1);;
          break;
 
          case 98:
              PlayFX(2);
          break;  
 
          case 99:
             PlayFX(3);
           break;
 
            case 100:
             PlayFX(4);
           break;
 
            case 101:
             PlayFX(5);
           break;
 
            case 102:
             PlayFX(6);
           break;
 
            case 103:
             PlayFX(7);
           break;
 
            case 104:
             PlayFX(8);
           break;
 
            case 105:
             PlayFX(9);
           break;
 
            case 106:
             PlayFX(10);
           break;
 
           case 107:
             PlayFX(11);
           break;
 
           case 108:
             PlayFX(12);
           break;
 
           case 27:
               Exit(0);
           break; 
      }
 
      FT_CheckFX();
 
    }
 
 
}
 
 
 
 
 


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 26/03/2021 à 16h32
Tu vas avoir droit à 2 libs pour le prix d'une. :)

Voici la version stand-alone que j'ai faite pour toi :ayfx_player.zip
Dedans tu trouveras :
- ayfx_player.h : le header de la librairie
- ayfx_player.c : le code source du player
- ayfx_bank.h : un exemple de banque de son avec 19 sons (les sons de test que j'utilise sur Final Smash)
- ayfx_fx017.h et ayfx_fx019.h ; deux exemples de sons hors banque

Voici les fonctions disponibles :

Code C :
/// Setup the ayFX replayer
/// @param        bank        Pointer to the ayFX bank data
void ayFX_InitBank(void* bank);
 
/// Play a ayFX sound
/// @param        id        Sound index in the bank
/// @param        prio    Priority of the sound (0-15). 0 is the highest priority.
/// @return                Error number (if any) @see AYFX_ERROR
unsigned char ayFX_PlayBank(unsigned char id, unsigned char prio);
 
/// Play a SFX directly from data pointer
/// @param        file    Pointer to AFX file data
unsigned char ayFX_Play(void* data);
 
/// Stop the sound playback
void ayFX_Stop();
 
/// Stop the sound playback and mute the channel
void ayFX_Mute();
 
/// Play a frame of an ayFX stream
void ayFX_Update();
 
/// Send data to PSG registers
void ayFX_SendToPSG();
 
/// Set channel mode
void ayFX_SetMode(unsigned char mode);
 
/// Set the channel to use for sound playback
void ayFX_SetChannel(unsigned char chan);
 
/// Get the channel used for sound playback
unsigned char ayFX_GetChannel();
 
/// Get number of sound in the bank
unsigned char ayFX_GetBankNumber();
 
/// Set the function to be call when a sound ended
unsigned char ayFX_SetFinishCB(Callback cb);


Et voici un exemple avec les données que je t'ai envoyé :

Code C :
 
// Includes 
#include "ayfx_player.h"
#include "ayfx_bank.h"
#include "ayfx_fx017.h"
#include "ayfx_fx019.h"
 
// ...
 
// L'initialisation de la banque
ayFX_InitBank(g_ayfx_bank);
ayFX_SetChannel(PSG_CHANNEL_A); // optionnel
 
// ...
 
// Jouer le 11e son de banque
ayFX_PlayBank(10, 0);
 
// ...
 
// Jouer directement un son hors banque :
ayFX_Play(g_ayfx_fx017);
 
// ...
 
// Arréter le son en cours
ayFX_Mute();
 
// ...
 
// A faire chaque frame (50/60 fois par seconde)
// Soit dans ta boucle principale si est synchro avec l'affichage, ou bien dans le Hook d'interruption du V-Blank
ayFX_Update();
ayFX_SendToPSG();


Un fois que tout fonctionnera bien, tu n'as plus qu'a créer tes sons avec le AYFX Editor : http://shiru.untergrund.net/software.shtml#old
Et ensuite convertir les banques ou les sons que tu as créés en fichier .h.
Pour ça, tu peux utiliser mon outil CMSXbin (https://github.com/aoineko-fr/CMSXbin).

Voilà, yapluka :)


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

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 26/03/2021 à 23h06
WOW, MERCI LES POTOS,

Je me suis attaqué à la version de Guillaume et... c'est pas aussi simple que ça ou alors, je n'ai plus les yeux en face des trous, le cerveau à l'envers et de fait, je fais n'imp !!!


Voici mon pti main.c
#include "ayfx_player.h"
#include "ayfx_fx019.h"
#include "ayfx_bank.h"

void HALT(void)
{
__asm
halt
__endasm;
}

//=====================================================================================================
void main(void)
{

__asm
call 0x0072 //INIGRP, screen mode 2
__endasm;



ayFX_InitBank(g_ayfx_bank);
//ayFX_SetChannel(PSG_CHANNEL_A);

while(1)
{
ayFX_PlayBank(10, 0);
//ayFX_Play(g_ayfx_fx019);
ayFX_Update();
HALT();

}
}


Tout compile bien mais ... pas de son, rien
:fou :fou :fou


en mode BANK, j'ai ceci

Where is It ? pour MSX. Mars 2021
---------------------------------
.
compilation SDCC 4.1.0
.
.
compilation crt0msx (32ko) ...
compilation de ayfx_player...
et compilation de ... main
main.c:27: warning 112: function 'FC88' implicit declaration
main.c:27: error 101: too many parameters
main.c:27: error 9: FATAL Compiler Internal Error in file '/home/sdcc-builder/bu
ild/sdcc-build/orig/sdcc/src/SDCCast.c' line number '5851' : node PARAM shouldn'
t be processed here
Contact Author with source code
.
.
creation du main.ihx ...
creation de la rom ...
hex2bin v1.0.12, Copyright (C) 2012 Jacques Pelletier & contributors

Lowest address = 00004000
Highest address = 00004632
Pad Byte = FF
8-bit Checksum = 7D
Appuyez sur une touche pour continuer...

:fou :fou :fou

en ligne 27, j'ai bien
ayFX_PlayBank(10, 0);


Bon quoiqu'il en soit, vous avez un fucking HIGH dev level
Je n'arrive même pas à jouer un son alors que tous les éléments sont là...

Bon je fais une pause

MERCI encore pour ce partage les zamis ;)




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: 2907

Le 26/03/2021 à 23h54
Deux choses :

1) A chaque frame, il faut executer les 2 fonctions suivantes :
Code C :
 
ayFX_Update(); // génère les infos d'une frame de son
ayFX_SendToPSG(); // envoie ces infos au PSG
 


2) Il te manque une macro (déso, j'ai oublié de l'ajouter)
Code C :
#define FC88(a, b)            (u16)((a << 8) + b)        // H, L

C'est une astuce pour pouvoir utiliser la directive __z88dk_fastcall avec 2 paramètres 8-bits.

Pour la petite histoire...

En fait, ayFX_PlayBank n'est pas une "vraie" fonction.
C'est un define qui sert à merger les 2 paramètres 8-bits (id et prio) en 1 seul pour pouvoir utiliser __z88dk_fastcall (beaucoup plus rapide, mais n'autorisant qu'une seul paramètre).
La vraie fonction s'appelle ayFX_PlayBankFC et prend comme paramètre un entier 16-bits (concaténation des 2 paramètres 8-bits).
Voici ce qui se passe quand tu compiles ayFX_PlayBank(10, 0); :

Code C :
 
#define FC88(a, b)            (u16)((a << 8) + b)        // H, L
#define ayFX_PlayBank(id, prio) ayFX_PlayBankFC(FC88(prio, id))
 
ayFX_PlayBank(10, 0);
 
// remplacement de la macro ayFX_PlayBank
 
ayFX_PlayBankFC(FC88(10, 0));
 
// remplacement de la macro FC88
 
ayFX_PlayBankFC((u16)((10 << 8) + 0));
 
// remplacement du calcul litéral
 
ayFX_PlayBankFC(0x0A00);
 


En assembleur, ça revient à faire un call à _ayFX_PlayBankFC avec id (10) dans le registre H et prio (0) dans le registre L.
La plus part des mes fonctions qui prennent 2 entiers 8-bits fonctionnent de cette façon car ça a un gros impact sur les performances.


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

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 27/03/2021 à 21h33
Bon, les ptits gars, le son fonctionne.
Il ne me reste plus qu'à les 'composer'...

une tite chose : plus haut dans les messages je vous disais avoir des soucis avec CHGET et bien je sais pourquoi... je n'avais pas utilisé __z88dk_fastcall... qué nouille ;)

Superbe astuce pour 2 paramètres 8bits aoineko ;)

Allez, a+

j'y retourne et merci :)




edit : bon, c'est pas si evident que ça. Plus j'avance, plus je m'aperçois que mon code est mal structuré...
De fait il faut que je trouve le bon endroit pour placer le ayFX_PlayBank(x,y) et le couple ayFX_Update() / ayFX_SendToPSG()
J'ai aussi un autre souci, lorsque j'affiche mon texte d'intro caractere par caractere, je voulais ajouter un son, histoire que ca fasse un peu comme le morse. Et bien que néni, il y a un bip au saut de ligne et pas lors du put_char... A moins que ce dernier foute le boxon...

Bonne nuit/journée les potos Edité par Ricco59 Le 28/03/2021 à 01h45


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: 2907

Le 28/03/2021 à 03h13
Ricco59 :
edit : bon, c'est pas si evident que ça. Plus j'avance, plus je m'aperçois que mon code est mal structuré...
De fait il faut que je trouve le bon endroit pour placer le ayFX_PlayBank(x,y) et le couple ayFX_Update() / ayFX_SendToPSG()
J'ai aussi un autre souci, lorsque j'affiche mon texte d'intro caractere par caractere, je voulais ajouter un son, histoire que ca fasse un peu comme le morse. Et bien que néni, il y a un bip au saut de ligne et pas lors du put_char... A moins que ce dernier foute le boxon...


Le plus simple, c'est de mettre les fonctions d'update du son dans le hook H.TIMI ; c'est une adresse en RAM qui est appelé 50/60 fois par seconde, indépendamment du code de ton jeu.
Ca permet de :
1) centraliser l'appel de ces fonctions (tu as besoin de les mettre qu'à cet endroit)
2) t'assurer qu'elles sont bien appelés de façon régulière

Par défaut, l'adresse du H.TIMI (0xFD9F) contient une instruction RET... et ne fait donc rien.
Comme c'est une adresse en RAM, tu peux modifier le contenu pour le remplacer par un JP XXXX ou XXXX est l'adresse de la fonction que tu souhaites être exécuté.
Voici le code qu'il te faut :

Code C :
 
typedef void (*callback)(void); ///< Callback default signature
typedef unsigned char    u8; ///< 8-bits unsigned integer type
typedef unsigned short    u16; ///< 16-bits unsigned integer type
 
/// Set a Hook to jump to given function
inline void Bios_SetHookDirectCallback(u16 hook, callback cb)
{
    *((u8*)hook) = 0xC3; // JUMP
    *((callback*)++hook) = cb; // Callback address
}
 
/// Clear a Hook (set RET asm code)
inline void Bios_ClearHook(u16 hook)
{
    *((u8*)hook) = 0xC9; // RET
}
 


Ensuite, pour l'utiliser, tu as juste besoin de faire :

Code C :
 
#define H_TIMI 0xFD9F
 
void MonHook()
{
    ayFX_Update();
    ayFX_SendToPSG();
}
 
// ...
 
Bios_SetHookDirectCallback(H_TIMI, MonHook); // Activer le hook
 
// ...
 
Bios_ClearHook(H_TIMI); // Le désactiver
 


Mon .h avec tous les defines : https://github.com/aoineko-fr/CMSX/blob/master/cmsx/src/bios_hook.h


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

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 31/03/2021 à 18h49
Merci Guillaume ;)

J'ai mis en standby la version MSX car en travaillant dessus, je me suis aperçu d'un bug sur la version Coleco. Je corrige donc la version Coleco :)
A très vite



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 05/04/2021 à 11h27
Bon ca y est, la version COLECOVISION est partie en phase de test ;)

I'm back

Bon lundi de Paques :)



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: 2907

Le 05/04/2021 à 12h14
Bien revenu :tea


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

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 09/04/2021 à 00h45
Salut les Zamis

J'aurais aimé savoir s'il vous est possible de tester "Where Is It ?" (limité à 3 niveaux que ce soit en mode arcade ou story)

Vous pourrez jouer/tester avec

- le clavier : flèches de direction, Action = SPACE et Pause = ESC
- stick 1 bouton : pour les directions vous savez quoi faire ;) Action = FIRE et Pause = ESC
- stick 2 boutons : idem pour les directions, Action = FIRE1 et Pause = FIRE2 (j'ai testé avec une manette de gx4000, c'est good)

Donnez-moi vos avis, les pistes d'amélioration, les bugs éventuels, une ptite bafouille ;)

j'ai remarqué un bug il y a peu : au niveau du son, lorsque 2 sfx sont joués en même temps, on ne les entends pas. Il faut que je vois pour changer de chanel (dans le jeu : son du chrono + son validation pièce)

la rom : http://ericmcolleco.free.fr/msx/msxr/Wisit.rom

Bon test et merci

Eric 'Ricco59' Edité par Ricco59 Le 09/04/2021 à 00h46


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10731

Le 09/04/2021 à 15h41
Salut Eric

j'ai testé dans 4 émulateurs avec des config différentes

BlueMSX avec Turbo-R , MSX1 16k et C-Bios -> ok
OpenMSX avec VG8000 -> ok
Meisei -> ok

RuMSX -> ne se charge pas car la taille de la rom n'est pas un multiple de 16K !!
( il faut la remplir de FF par exemple c'est ce que j'ai fait ;) )
avec cet émulateur il y a un probléme avec la gestion du sprite qui déborde sur la droite : voir copie d'écran





:noel
Site web    
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10731

Le 09/04/2021 à 16h04
avec BlueMSX et une manette :)




:noel
Site web    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 09/04/2021 à 18h37
Merci Jipe pour ton retour

je ne connaissais pas RuMSX. Par rapport à BlueMSX/Meisei, il est aussi fiable ?

Pour le 2e screen, pas de bug, tu as réussi à aller jusqu'au bout ;) (manette 1 bouton ou 2 ?)

Merci encore


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10731

Le 09/04/2021 à 18h45
test en mode arcade avec une manette Xbox 360 connectée en USB , 2 boutons émulés

je ferait des tests demain sur de vrais MSX mais il faut que je finisse de ranger un peu pour avoir accès aux MSX1 ;)

pour RuMSX a priori les autres jeux marchent bien

en fait le curseur se barre a droite mais pas tout de suite c'est aprés quelques déplacements bas et droite ( au clavier )


:noel
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 09/04/2021 à 19h36
D'après mes tests pour Final Smash, RuMSX ne semble pas supporter par le flag EC sur les sprites (celui qui permet de décaler un spite de 32 px vers la gauche).
Je ne sais pas si ton problème vient de là, mais cet émulateur semble moins complet que les autres.

Sinon, j'ai fait tester à Madame. Elle apprécie ce genre de jeu... et elle a apprécié Where Is It :top
Elle trouvait le son du timer un peu stressant, mais c'est p'être voulu.
Elle a pas compris tout de suite non plus que le pattern à chercher est celui de droite et pas celui de gauche (mais ça, tu t'en rends compte rapidement).

Pour ma part, tu sais que j'aime beaucoup. ^^
J'ai toujours un peu de mal avec le T de ta font ; dans les menus c'est pas gênant, mais dès qu'il y a du texte à lire, je trouve que ça rend la lecture moins fluide.
Je t'en ai aussi déjà parlé, mais parfois j'ai du mal à m'arrêter sur la bonne case avec les déplacements du curseur.

Pour jouer deux sons en simultané, ça ne va pas être possible avec la version de ayFX que je t'ai filé (ni avec aucune autre que je connaisse).
Il faudrait updater les infos de plusieurs channels en même temps (ce qui est n'est pas prévu dans le player ayFX).
Par contre, tu as un système de priorité qui permet de t'assurer que le son le plus important est toujours joués (il remplace un son de moins grande prio).

En tout cas, bravo :tchin


On est toujours ignorant avant de savoir.
Github    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie