MSX Village forum

La Place des Développeurs FUSION-C Codez en C pour MSX les doigts dans le nez !

ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5484

Le 05/03/2020 à 21h23

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


banniere-ericb59e
Site web    
RibbSayan Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 19/08/2010 à 22h47

Messages: 154

Le 05/03/2020 à 23h16
Super, ca fonctionne très bien.
Merci pour ton temps passé.
   
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5484

Le 06/03/2020 à 09h40
Parfait.
N'hésites pas à me solliciter en cas de problèmes. :)


banniere-ericb59e
Site web    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5484

Le 06/04/2020 à 13h18

Challenge du Dimanche : Coder un Pong !




: lien : https://www.youtube.com/watch?v=WlOnX2uqRxE Edité par ericb59 Le 06/04/2020 à 13h19


banniere-ericb59e
Site web    
RibbSayan Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 19/08/2010 à 22h47

Messages: 154

Le 08/07/2020 à 14h36
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.
   
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5484

Le 08/07/2020 à 17h45
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
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);
 
}
 


banniere-ericb59e
Site web    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5484

Le 08/07/2020 à 17h49
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);
 
 


banniere-ericb59e
Site web    
RibbSayan Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 19/08/2010 à 22h47

Messages: 154

Le 08/07/2020 à 21h41
Merci Eric.
   
RibbSayan Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 19/08/2010 à 22h47

Messages: 154

Le 24/07/2020 à 18h44
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.
   
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5484

Le 24/07/2020 à 18h58
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 ?


banniere-ericb59e
Site web    
TurboSEB Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 08/08/2010 à 20h57

Messages: 5793

Le 25/07/2020 à 03h49
Excusez mon intervention de béotien reptilien :D, 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 :tea

Ou alors, toujours en se limitant a 8 patterns en page 0 et le reste 9 a 12 en page 1 :tea

(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 :oups Edité par TurboSEB Le 25/07/2020 à 04h17



MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
   
RibbSayan Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 19/08/2010 à 22h47

Messages: 154

Le 25/07/2020 à 09h52
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
   
TurboSEB Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 08/08/2010 à 20h57

Messages: 5793

Le 25/07/2020 à 10h23
@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 :D
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 :tea
-- 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 :lol Edité par TurboSEB Le 25/07/2020 à 10h39



MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
   
RibbSayan Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 19/08/2010 à 22h47

Messages: 154

Le 25/07/2020 à 11h05
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 ;)
   
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5484

Le 25/07/2020 à 11h21
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... :p

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


banniere-ericb59e
Site web    
RibbSayan Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 19/08/2010 à 22h47

Messages: 154

Le 25/07/2020 à 11h30
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