La Place des Développeurs FUSION-C Codez en C pour MSX les doigts dans le nez !
ericb59
Membre non connecté
Conseiller Municipal
Reprise du message précédent
Oui pour le Tag c'est un bug que j'ai corrigéHum chez moi ton dernier indicateur (celui des touches de fonctions) réagit avec les touches fléchées !
J'ai peut être corrigé un bug de la 1.2 à 1.3 ? Je ne m'en souviens pas en tout cas !
Bref... On va faire autrement.
Je m'aperçois que je n'ai pas mis de fonctions simple pour le contrôle des touches de fonctions alors voici une routine que je vais intégrer dans FUSIONC-C 1.3
tu peux l'intégrer à ton programme
Code C :
char Fkeys(void) // Return Status of keys : F1 - F2 - F3 - F4 - F5 - ESC - GRAPH - STOP { __asm ld a,(#0xFBEB) xor #0xFF rra rra rra rra rra and #0b01000111 ld b,a ld a,(#0xFBEC) xor #0xFF rla rla rla and #00011000 or b ld l,a ld h,#0 ret __endasm; }
Cette fonction FKeys vas te retourner un Octet qui correspond à l'état des touches.
Etat 1 : Touche appuyées
Etat 0 : Touche non appuyée
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
STOP | GRAPH | ESC | F5 | F4 | F3 | F2 | F1 |
Ou plus simple elle retourne
1 : Si F1 est appuyé
2 : Si F2
4 : Si F3
8 : Si F4
16 : SI F5
32 : Si ESC
64 : Si GRAPH
128 Si STOP
Les combinaisons de touches sont possibles.
Dis moi si ca fonctionne chez toi...
PS De plus cette fonction est plus rapide que GetKeyMatrix, car elle n'utilises pas d'appel au Bios.
Edité par ericb59 Le 05/03/2020 à 21h27
Salut Eric,
La méthode SC5SpritePattern me pose un problème actuellement.
Quand j'utilise le code suivant, cela écrit dans le pattern 0.
SC5SpritePattern(129,point_pattern9);
J'ai le même effet avec 130 et 131, ca écrit dans le pattern 0.
Avant d'utiliser ce code, j'ai appelé
Screen(5);
SpriteOff();
Sprite16();
Je suis toujours avec Fusion-C 1.2 et SDCC 3.6.0.
Merci d'avance.
La méthode SC5SpritePattern me pose un problème actuellement.
Quand j'utilise le code suivant, cela écrit dans le pattern 0.
SC5SpritePattern(129,point_pattern9);
J'ai le même effet avec 130 et 131, ca écrit dans le pattern 0.
Avant d'utiliser ce code, j'ai appelé
Screen(5);
SpriteOff();
Sprite16();
Je suis toujours avec Fusion-C 1.2 et SDCC 3.6.0.
Merci d'avance.
ericb59
Membre non connecté
Conseiller Municipal
Salut,
J'ai changé de méthode, utilise cette fonction pour les sprites pattern.
Elle est compatible pour tous les modes écrans MSX1 et MSX2
J'ai changé de méthode, utilise cette fonction pour les sprites pattern.
Elle est compatible pour tous les modes écrans MSX1 et MSX2
Code C :
/* --------------------------------------------------------- */ /* set sprite pattern */ /* --------------------------------------------------------- */ void SetSpritePattern( char pattern_no, char* p_pattern, char s_size ) { CopyRamToVram(p_pattern, Peekw( 0xF926 ) + (pattern_no << 3), s_size); }
ericb59
Membre non connecté
Conseiller Municipal
Exemple
Code C :
static const unsigned int playerPatG1[]={ 0b0000011111000000, 0b0001111111110000, 0b0011111111111000, 0b0011111111111000, 0b0000111111111100, 0b0000001111111100, 0b0000000011111100, 0b0000001111111100, 0b0000111111111100, 0b0011111111111000, 0b0011111111111000, 0b0001111111110000, 0b0000011111000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000}; SetSpritePattern(0,Sprite32Bytes(playerPatG1),32);
Bonjour Eric,
Je suis en train de développer un shot vertical en screen 5. Et donc, je veux faire un scrolling vertical.
Pour cela je dois déplacer la gestion des sprites hors de la page 0, en bas de la page 1.
Et je bloque plus sur ça que le moteur du shot qui est presque terminé.
Par défaut, les tables sont là et je veux les déplacer de 7FFF (en base de la page 1)
sprite attribute (atrbas) = 0x7600 => 0xF5FF =>
sprite color (atrbas-0x200)= 0x7400 => 0xF3FF
sprite pattern (patbas) = 0x07800 => 0xF7FF =>
Pour modifier les attributs et les couleurs : 0xF5FF / 0x80 => 0x1EB
=> VDPwriteNi(11,0x01);
=> VDPwriteNi(5,0xEB);
Pour modifier les pattens : 0xF7FF / 0x800 => 0x1EB
=> VDPwriteNi(6,0x1E);
J'ai bien désactivé les interruption avant de faire les opérations.
Ca ne marche pas.
D'ailleurs, la fonction Peekw me renvoie toujours les anciennes valeurs
- atrbas=Peekw(0xF928); // 0x7600
- patbas=Peekw(0xF926); // 0x7800
J'ai eu moins de mal à coder le moteur que de bidouiller dans le msx.
Merci d'avance
Sylvain.
Je suis en train de développer un shot vertical en screen 5. Et donc, je veux faire un scrolling vertical.
Pour cela je dois déplacer la gestion des sprites hors de la page 0, en bas de la page 1.
Et je bloque plus sur ça que le moteur du shot qui est presque terminé.
Par défaut, les tables sont là et je veux les déplacer de 7FFF (en base de la page 1)
sprite attribute (atrbas) = 0x7600 => 0xF5FF =>
sprite color (atrbas-0x200)= 0x7400 => 0xF3FF
sprite pattern (patbas) = 0x07800 => 0xF7FF =>
Pour modifier les attributs et les couleurs : 0xF5FF / 0x80 => 0x1EB
=> VDPwriteNi(11,0x01);
=> VDPwriteNi(5,0xEB);
Pour modifier les pattens : 0xF7FF / 0x800 => 0x1EB
=> VDPwriteNi(6,0x1E);
J'ai bien désactivé les interruption avant de faire les opérations.
Ca ne marche pas.
D'ailleurs, la fonction Peekw me renvoie toujours les anciennes valeurs
- atrbas=Peekw(0xF928); // 0x7600
- patbas=Peekw(0xF926); // 0x7800
J'ai eu moins de mal à coder le moteur que de bidouiller dans le msx.
Merci d'avance
Sylvain.
ericb59
Membre non connecté
Conseiller Municipal
Hello,
Oui,alors,là tu vois je ne suis pas compétent.
J’ai essayé de faire une fonction pour ça et je me suis cassé les dents dessus.
En fait la méthode à utiliser n’est pas si simple à mettre en place... ou en tout les cas je n’ai pas tout saisi !
Pour résoudre ton problème, ne peux tu pas simplement changer de page active ?
Tu peux placer tes sprites sur la page 1, 2, ou 3 en ajoutant numero_page*256 à sa coordonnée Y.
Est ce que ça peut fonctionner pour toi ?
Oui,alors,là tu vois je ne suis pas compétent.
J’ai essayé de faire une fonction pour ça et je me suis cassé les dents dessus.
En fait la méthode à utiliser n’est pas si simple à mettre en place... ou en tout les cas je n’ai pas tout saisi !
Pour résoudre ton problème, ne peux tu pas simplement changer de page active ?
Tu peux placer tes sprites sur la page 1, 2, ou 3 en ajoutant numero_page*256 à sa coordonnée Y.
Est ce que ça peut fonctionner pour toi ?
TurboSEB
Membre non connecté
Conseiller Municipal
Excusez mon intervention de béotien reptilien , mais..... en se passant des patterns 9 a 12(?) qui posent problème en page 0, n'y a t'il pas moyen de se limiter a 8, car j''imagine que sur ces patterns , y' en a qui servent pour le scrolling du décor et d'autres de pseudo sprites. Cela appauvrissera certe les décors, mais résoudrait le problème
Ou alors de récrire à la volé 3 des patterns 1 (ou 0) a 8 moins utilisés dans la page 0 en cours de jeu pour les 3 patterns manquant
Ou alors, toujours en se limitant a 8 patterns en page 0 et le reste 9 a 12 en page 1
(dans mon esprit, la zone des patterns de la page 0 ou 1.... ou 3, est une "extra" zone non visible a l'écran en page active et les patterns 9 a 12, dépassent de cette zone en page 0, ce qui pose problème)
Désolé encore si j'ai rien capter Edité par TurboSEB Le 25/07/2020 à 04h17
Ou alors de récrire à la volé 3 des patterns 1 (ou 0) a 8 moins utilisés dans la page 0 en cours de jeu pour les 3 patterns manquant
Ou alors, toujours en se limitant a 8 patterns en page 0 et le reste 9 a 12 en page 1
(dans mon esprit, la zone des patterns de la page 0 ou 1.... ou 3, est une "extra" zone non visible a l'écran en page active et les patterns 9 a 12, dépassent de cette zone en page 0, ce qui pose problème)
Désolé encore si j'ai rien capter Edité par TurboSEB Le 25/07/2020 à 04h17
MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
Effectivement, j'essaierai de passer sur la page 1 car c'est celle qui partage la même vram que la page 0. Et du coup, les tables d'adressage ne changeront pas et resteront en bas de la page 0.
Il me reste à trouver comment afficher les sprites sur la page 1.
Effectivement, ca se confirme avec le logiciel DDesign(age.com) de T&Esoft. Un des raccourcis clavier permet de voir les différentes pages (shift+1, shift+2, shift+3 et shift+4)
page 0 : Vide, Page 1 : zone de dessin avec scroll, Page 3 : Icone de l'application et Page 4 : Mémoire pour le undo.
Merci Eric.
@turboSeb, je suis désolé, mais je n'ai pas compris ton explication. J'apprends aussi le VDP en même temps que je code.
Je suis assez content de moi pour l'instant, mais je crains que d'ajouter la musique et les bruitages va fortement ralentir le gameplay.
Edité par RibbSayan Le 25/07/2020 à 10h01
Il me reste à trouver comment afficher les sprites sur la page 1.
Effectivement, ca se confirme avec le logiciel DDesign(age.com) de T&Esoft. Un des raccourcis clavier permet de voir les différentes pages (shift+1, shift+2, shift+3 et shift+4)
page 0 : Vide, Page 1 : zone de dessin avec scroll, Page 3 : Icone de l'application et Page 4 : Mémoire pour le undo.
Merci Eric.
@turboSeb, je suis désolé, mais je n'ai pas compris ton explication. J'apprends aussi le VDP en même temps que je code.
Je suis assez content de moi pour l'instant, mais je crains que d'ajouter la musique et les bruitages va fortement ralentir le gameplay.
Edité par RibbSayan Le 25/07/2020 à 10h01
TurboSEB
Membre non connecté
Conseiller Municipal
@RibbSayan : disons que nous ne somme pas au même stade de l'évolution (en matière de programmation du moins), moi je suis resté bloqué au niveau nostalgique débutant en Basic, qui comprend les bases, et toi en praticien chevronné qui a évolué avec le temps. Loin de moi l'histoire de me dévaloriser car je sais que forcément dans certains domaines j'ai des connaissances supérieures
Je ne m'exprime donc pas avec les mots des praticiens, mais je comprend quand même dans les grandes lignes . Rien qu'avec ce que tu viens d'expliquer sur ton post ci dessus, j'ai appris qqchose et c'est le but
-- un p'tit trait d'humour a la TurboSEB ---
"FUSION-C Codez en C pour MSX les doigts dans le nez !"
Mince j'ai oublié de mettre mes d .... C'est ça le truc pour comprendre Edité par TurboSEB Le 25/07/2020 à 10h39
Je ne m'exprime donc pas avec les mots des praticiens, mais je comprend quand même dans les grandes lignes . Rien qu'avec ce que tu viens d'expliquer sur ton post ci dessus, j'ai appris qqchose et c'est le but
-- un p'tit trait d'humour a la TurboSEB ---
"FUSION-C Codez en C pour MSX les doigts dans le nez !"
Mince j'ai oublié de mettre mes d .... C'est ça le truc pour comprendre Edité par TurboSEB Le 25/07/2020 à 10h39
MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
Je ne suis pas du tout un praticien chevronné.
Quand j'ai écris que je n'ai pas compris ton explication, ça veut juste dire qu'avec mes pauvres connaissances actuelles, j'ai juste pas capté ton explication.
Je te remercie d'avoir aussi répondu à ma demande d'aide.
Maintenant je remets mes doigts dans le nez car je retourne coder
Quand j'ai écris que je n'ai pas compris ton explication, ça veut juste dire qu'avec mes pauvres connaissances actuelles, j'ai juste pas capté ton explication.
Je te remercie d'avoir aussi répondu à ma demande d'aide.
Maintenant je remets mes doigts dans le nez car je retourne coder
ericb59
Membre non connecté
Conseiller Municipal
Un autre soucis auquel je viens de penser.
Changer l'adresses des DATAS des sprites, c'est ennuyeux car les adresses par défauts de ces données sont hard-codées dans certaines fonctions de FUSION-C.
Il n'y en a pas des masses, mais bon...
Je sais, c'est pas bien ! Mais comme ça j'évite des vérifications qui prennent du temps machine...
Du coup, même si tu arrive à relocaliser les DATAs, les fonctions de sprites vont continuer à aller chercher les données en page 0, à moins de recompiler FUSION-C avec ces nouvelles addresses. (Ce qui est faisable)
Pour afficher un Sprite en page 1, c'est simple, ajoute 256 à sa coordonnées Y.
La plupart des fonctions graphiques MSX2 utilisent toute la VRAM comme un écran de 256 x 1024 pixel (Screen5), directement addressable en X,Y
Seuls les fonctions utilisant le Bios, ne sont pas compatibles, et se limitent à des coordonnées comprises entre 0 et 255. Mais dans ce cas il suffit d'utiliser SetActiveScreen(N_page) pour dire sur quelle page on veut travailler.
donc
X=100;
Y=266;
SetActivePage(0);
PutSprite(1,0,X,Y,0);
Affichera le sprite le sprite 1 avec le pattern 0, en X=100, Y=10 sur la page 1.
RibbSayan, la version 1.3 de FUSION-C fait gagner jusqu'à 200% de vitesse sur certaines fonctions graphiques MSX2. il y a aussi un gain sur la gestion des sprites, grace à une nouvelle fonction Fast Sprite qui utilise une structure C, pour gérer les attributs des sprites.
D'autre part, il y a une nouvelle routine d'interruption, qui facilite l'ajout de sons et musique. Les routines son et musiques ont aussi été optimisées, en vitesse et en taille.
Laisse moi ton email, et je t'envois Fusion-C 1.3 (qui est quasi finalisé).
Tu n'auras aucun mal à passer de Fusion-C 1.2 à 1.3, j'essaie de garder un maximum de compatibilité dans la gestion du code entre les versions.
De plus tu pourras compiler avec SDCC 4.0 si tu ne le fais pas déjà.
@TurboSeb : Je pense que RibbSayan essaie de faire un Scrolling de 256 pixels de haut, donc d'afficher la zones en dessous de la zone affichable qui est de 212 pixels de haut.
Les données des DATAs des sprites sont enregistrées en VRAM, dans la zone entre les coordonnées Y de 212 à 256 ce qui crée des pixels de toutes les couleurs, qui ne sont pas censées être vue (car en dehors de la zone d'affichage).
Qu'il y ait 3 ou 6 ou 12 ... patterns ne change rien, il y aura toujours des pixels allumés qui servent aux sprites dans cette zone, que RibbSayan ne veut pas voir.
Edité par ericb59 Le 25/07/2020 à 11h32
Changer l'adresses des DATAS des sprites, c'est ennuyeux car les adresses par défauts de ces données sont hard-codées dans certaines fonctions de FUSION-C.
Il n'y en a pas des masses, mais bon...
Je sais, c'est pas bien ! Mais comme ça j'évite des vérifications qui prennent du temps machine...
Du coup, même si tu arrive à relocaliser les DATAs, les fonctions de sprites vont continuer à aller chercher les données en page 0, à moins de recompiler FUSION-C avec ces nouvelles addresses. (Ce qui est faisable)
Pour afficher un Sprite en page 1, c'est simple, ajoute 256 à sa coordonnées Y.
La plupart des fonctions graphiques MSX2 utilisent toute la VRAM comme un écran de 256 x 1024 pixel (Screen5), directement addressable en X,Y
Seuls les fonctions utilisant le Bios, ne sont pas compatibles, et se limitent à des coordonnées comprises entre 0 et 255. Mais dans ce cas il suffit d'utiliser SetActiveScreen(N_page) pour dire sur quelle page on veut travailler.
donc
X=100;
Y=266;
SetActivePage(0);
PutSprite(1,0,X,Y,0);
Affichera le sprite le sprite 1 avec le pattern 0, en X=100, Y=10 sur la page 1.
RibbSayan, la version 1.3 de FUSION-C fait gagner jusqu'à 200% de vitesse sur certaines fonctions graphiques MSX2. il y a aussi un gain sur la gestion des sprites, grace à une nouvelle fonction Fast Sprite qui utilise une structure C, pour gérer les attributs des sprites.
D'autre part, il y a une nouvelle routine d'interruption, qui facilite l'ajout de sons et musique. Les routines son et musiques ont aussi été optimisées, en vitesse et en taille.
Laisse moi ton email, et je t'envois Fusion-C 1.3 (qui est quasi finalisé).
Tu n'auras aucun mal à passer de Fusion-C 1.2 à 1.3, j'essaie de garder un maximum de compatibilité dans la gestion du code entre les versions.
De plus tu pourras compiler avec SDCC 4.0 si tu ne le fais pas déjà.
@TurboSeb : Je pense que RibbSayan essaie de faire un Scrolling de 256 pixels de haut, donc d'afficher la zones en dessous de la zone affichable qui est de 212 pixels de haut.
Les données des DATAs des sprites sont enregistrées en VRAM, dans la zone entre les coordonnées Y de 212 à 256 ce qui crée des pixels de toutes les couleurs, qui ne sont pas censées être vue (car en dehors de la zone d'affichage).
Qu'il y ait 3 ou 6 ou 12 ... patterns ne change rien, il y aura toujours des pixels allumés qui servent aux sprites dans cette zone, que RibbSayan ne veut pas voir.
Edité par ericb59 Le 25/07/2020 à 11h32
pour les curieux, voila ce que ça donne actuellement S......... W...
Edité par
RibbSayan
Le 25/07/2020 à 11h31
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie