La Place des Développeurs Mes 1ers pas sur MSX ...
ericb59
Membre non connecté
Conseiller Municipal
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
ericb59
Membre non connecté
Conseiller Municipal
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(); } }
aoineko
Membre non connecté
Conseiller Municipal
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 :
Et voici un exemple avec les données que je t'ai envoyé :
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
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.
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
Tout compile bien mais ... pas de son, rien
en mode BANK, j'ai ceci
en ligne 27, j'ai bien
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
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();
}
}
#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
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...
---------------------------------
.
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...
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
aoineko
Membre non connecté
Conseiller Municipal
Deux choses :
1) A chaque frame, il faut executer les 2 fonctions suivantes :
2) Il te manque une macro (déso, j'ai oublié de l'ajouter)
C'est une astuce pour pouvoir utiliser la directive __z88dk_fastcall avec 2 paramètres 8-bits.
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.
On est toujours ignorant avant de savoir.
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
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
aoineko
Membre non connecté
Conseiller Municipal
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...
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.
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
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
Bon ca y est, la version COLECOVISION est partie en phase de test
I'm back
Bon lundi de Paques
I'm back
Bon lundi de Paques
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
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
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
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
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
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
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 )
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 )
aoineko
Membre non connecté
Conseiller Municipal
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
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
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
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
On est toujours ignorant avant de savoir.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie