La Place des Développeurs Coder en C avec SDCC
Reprise du message précédent
Vindiou les gars, j'ai encore du chemin à parcourir
aoineko
Membre non connecté
Conseiller Municipal
Je pensais plus au dicton bouddhiste « Le bonheur n'est pas au bout du chemin, il est le chemin »... mais Steve Jobs, c'est bien aussi
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
aoineko :
Je pensais plus au dicton bouddhiste « Le bonheur n'est pas au bout du chemin, il est le chemin »... mais Steve Jobs, c'est bien aussi
Comme le gars à fait un stage Boudhiste dans sa jeunesse, je le soupçonne de s'être largement inspiré ...
ericb59
Membre non connecté
Conseiller Municipal
@aoineko
j'ai vu que tu as posté ce bout de code sur MSX.ORG
Si j'ai bien Compris cette routine doit être appelée par le hook H.KEYI
Elle lit le bit 0 du registre de statut 1, pour vérifier si on a le HBLANK actif.
Pour que ce HBLANK soit détecté il faut préalablement avoir mis un numéro de ligne pour le HBLANK dans le R#19 et avoir mis le bit #4 de R#0 à 1
Si on a le HBLANK dans ce cas la routine apple la routine _HBlankHook en C
Alors il y a une chose que je n'ai jamais compris...
En quoi avoir une interruption à l'affichage de la ligne 100 (par exemple) de l'écran me permet d'avoir un SPLIT SCREEN ?
J'ai jamais compris l'utilité du HBLANK en fait...
Peux tu m'expliquer ?
Edité par ericb59 Le 15/01/2021 à 20h14
j'ai vu que tu as posté ce bout de code sur MSX.ORG
Code ASM :
#define P_VDP_ADDR 0x99 #define P_VDP_STAT 0x99 void InterruptHook() { __asm // Get S#1 ld a, #1 out (P_VDP_ADDR), a ld a, #(0x80 + 15) out (P_VDP_ADDR), a in a, (P_VDP_STAT) // Call H-Blank if bit #0 of S#1 is set rrca jp nc, _no_hblank call _HBlankHook // call to C function HBlankHook() _no_hblank: // Reset R#15 to S#0 xor a out (P_VDP_ADDR), a ld a, #(0x80 + 15) out (P_VDP_ADDR),a __endasm; }
Si j'ai bien Compris cette routine doit être appelée par le hook H.KEYI
Elle lit le bit 0 du registre de statut 1, pour vérifier si on a le HBLANK actif.
Pour que ce HBLANK soit détecté il faut préalablement avoir mis un numéro de ligne pour le HBLANK dans le R#19 et avoir mis le bit #4 de R#0 à 1
Si on a le HBLANK dans ce cas la routine apple la routine _HBlankHook en C
Alors il y a une chose que je n'ai jamais compris...
En quoi avoir une interruption à l'affichage de la ligne 100 (par exemple) de l'écran me permet d'avoir un SPLIT SCREEN ?
J'ai jamais compris l'utilité du HBLANK en fait...
Peux tu m'expliquer ?
Edité par ericb59 Le 15/01/2021 à 20h14
aoineko
Membre non connecté
Conseiller Municipal
Déjà, je précise qu'on peut faire 1001 excellent jeux MSX sans jamais avoir besoin de screen split.
Ceci étant dit, l'utilité d'un screen split c'est de pouvoir changer les paramètres d'affichage en plein milieu du processus d'affichage de la page et de créer des effets qui ne sont pas possible sans.
Des exemples d'utilisations :
- Dans le sample de sprites de ma lib je voulais pouvoir afficher sur la même page des sprites 8x8, 16x16 et 16x16 scale 2. Normalement c'est pas possible : ces paramètres s'applique à toute la frame. Du coup, j'utilise le H-Blank à 2 lignes différentes pour changer les paramètres d'affichage des sprites. Sur l'image ci-dessous, la zone noire représente le moment et le temps d'exécution de ma fonction de H-Blank (je change le fond d'écran pour pouvoir visualiser les timings).
- Dans mon projet GOS, j'utilise le scrolling hardware du MSX2 au delà des 256 pixels normalement autorisé. L'astuce, c'est qu'au moment ou le VDP devrait bouclé pour afficher le début de la première page (ce qui est le comportement normal), j'utilise le H-Blank pour changer le numéro de page courante. Du coup, le VDP affiche la suite de la VRAM au lieu de boucler comme il devrait.
- Y a quelques jeux qui utilises un changement de mode graphique entre la zone de jeu et un bandeau en bas d'écran. Par ex., tu peux affiche en Screen 2 ta zone de jeu de la ligne 0 à 128, et passer en Screen 5 de la ligne 129 à 211.
La seule contrainte, c'est qu'on va pouvoir changer les comportements du VDP que sur des bandes horizontales ; les splits.
Après, tu peux aussi utiliser le H-Blank pour timer ton code. En plaçant les interruptions aux lignes qui vont bien, tu peux par exemple diviser ta frame en 4 parties égales (en temps). Algorithmiquement, ça peut avoir un intéret.
En tout cas, le H-Blank réponds surtout à des besoins très spécifiques.
C'est plus clair ?
Ceci étant dit, l'utilité d'un screen split c'est de pouvoir changer les paramètres d'affichage en plein milieu du processus d'affichage de la page et de créer des effets qui ne sont pas possible sans.
Des exemples d'utilisations :
- Dans le sample de sprites de ma lib je voulais pouvoir afficher sur la même page des sprites 8x8, 16x16 et 16x16 scale 2. Normalement c'est pas possible : ces paramètres s'applique à toute la frame. Du coup, j'utilise le H-Blank à 2 lignes différentes pour changer les paramètres d'affichage des sprites. Sur l'image ci-dessous, la zone noire représente le moment et le temps d'exécution de ma fonction de H-Blank (je change le fond d'écran pour pouvoir visualiser les timings).
- Dans mon projet GOS, j'utilise le scrolling hardware du MSX2 au delà des 256 pixels normalement autorisé. L'astuce, c'est qu'au moment ou le VDP devrait bouclé pour afficher le début de la première page (ce qui est le comportement normal), j'utilise le H-Blank pour changer le numéro de page courante. Du coup, le VDP affiche la suite de la VRAM au lieu de boucler comme il devrait.
- Y a quelques jeux qui utilises un changement de mode graphique entre la zone de jeu et un bandeau en bas d'écran. Par ex., tu peux affiche en Screen 2 ta zone de jeu de la ligne 0 à 128, et passer en Screen 5 de la ligne 129 à 211.
La seule contrainte, c'est qu'on va pouvoir changer les comportements du VDP que sur des bandes horizontales ; les splits.
Après, tu peux aussi utiliser le H-Blank pour timer ton code. En plaçant les interruptions aux lignes qui vont bien, tu peux par exemple diviser ta frame en 4 parties égales (en temps). Algorithmiquement, ça peut avoir un intéret.
En tout cas, le H-Blank réponds surtout à des besoins très spécifiques.
C'est plus clair ?
On est toujours ignorant avant de savoir.
ericb59 :
Alors il y a une chose que je n'ai jamais compris...
En quoi avoir une interruption à l'affichage de la ligne 100 (par exemple) de l'écran me permet d'avoir un SPLIT SCREEN ?
J'ai jamais compris l'utilité du HBLANK en fait...
Peux tu m'expliquer ?
En quoi avoir une interruption à l'affichage de la ligne 100 (par exemple) de l'écran me permet d'avoir un SPLIT SCREEN ?
J'ai jamais compris l'utilité du HBLANK en fait...
Peux tu m'expliquer ?
Et bien tout simplement, quand tu réponds à l'interruption HBLANK, tu fais une action dans ta routine qui change les propriétés de l'écran affiché. Donc par exemple, tu es en SCREEN5, et lorsque l'interruption en ligne 100 arrive, tu changes pour être en SCREEN4, par exemple. Et tu reviens à la propriété initiale avec l'interruption VBLANK. Edité par Metalion Le 15/01/2021 à 20h53
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
aoineko
Membre non connecté
Conseiller Municipal
ericb59 :
En quoi avoir une interruption à l'affichage de la ligne 100 (par exemple) de l'écran me permet d'avoir un SPLIT SCREEN ?
En quoi avoir une interruption à l'affichage de la ligne 100 (par exemple) de l'écran me permet d'avoir un SPLIT SCREEN ?
P'être aussi une confusion entre Screen split (changement de paramètres d'affichage à une ligne donnée) et le mode de jeu Split screen qui consiste à avoir une zone graphique qui peut bouger indépendant pour chaque joueur.
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
@aoineko
oui tu as raison, moi je pensais à 2 zones graphiques distincts. Je ne savais pas que le terme avait une autre signification.
Voilà pourquoi j'ai jamais compris !
et bien merci pour les explications!
je suis moins bête qu'hier
Du coup cette interruption peux se cumuler avec H.TINI ? on a donc 2 interruptions possible.
d'autant que celle ci, comme tu le dit plus à
haut aoineko, peut être scindée. on peut avoir 2 ou 3 ... interruptions par frame si on veut... ça peut être intéressant !
Pour en avoir 3, Je suppose que la méthode pour ce faire est la suivante ...
Mettre R#19 à 64, lors de l'interruption changer R#19 à 128 , puis à la prochaine changer R#19 à 196 ?
oui tu as raison, moi je pensais à 2 zones graphiques distincts. Je ne savais pas que le terme avait une autre signification.
Voilà pourquoi j'ai jamais compris !
et bien merci pour les explications!
je suis moins bête qu'hier
Du coup cette interruption peux se cumuler avec H.TINI ? on a donc 2 interruptions possible.
d'autant que celle ci, comme tu le dit plus à
haut aoineko, peut être scindée. on peut avoir 2 ou 3 ... interruptions par frame si on veut... ça peut être intéressant !
Pour en avoir 3, Je suppose que la méthode pour ce faire est la suivante ...
Mettre R#19 à 64, lors de l'interruption changer R#19 à 128 , puis à la prochaine changer R#19 à 196 ?
igal
Membre non connecté
Conseiller Municipal
Lorsque j'ai "détourné" [Copy screen] en l'utilisant pour numériser du screen 8 à la volée, au vu de ce qui s'affichait à l'écran à savoir une multitude "d'interruptions" permettant la transparence et laissant ainsi apparaître l'image "source" sous l'image "numérisée"...
Concrètement, on voit dans la même image, une succession de parcelles de [SCREEN 8] entre coupées de [VIDES (laissant apparaître l'image source) ].
Je m'étais fait la réflexion suivante:
Puisque les "parcelles" transparentes devraient être noires, pourquoi les ingénieurs de l'époque avaient ils choisi du transparent au lieu du noir ?
L'autre possibilité étant que ce n'est pas du "transparent", mais bien des interruptions générées sans puiser de ressources CPU !
Bon... Je vous laisse Edité par igal Le 16/01/2021 à 09h42
Concrètement, on voit dans la même image, une succession de parcelles de [SCREEN 8] entre coupées de [VIDES (laissant apparaître l'image source) ].
Je m'étais fait la réflexion suivante:
Puisque les "parcelles" transparentes devraient être noires, pourquoi les ingénieurs de l'époque avaient ils choisi du transparent au lieu du noir ?
L'autre possibilité étant que ce n'est pas du "transparent", mais bien des interruptions générées sans puiser de ressources CPU !
Bon... Je vous laisse Edité par igal Le 16/01/2021 à 09h42
aoineko
Membre non connecté
Conseiller Municipal
ericb59 :
Pour en avoir 3, Je suppose que la méthode pour ce faire est la suivante ...
Mettre R#19 à 64, lors de l'interruption changer R#19 à 128 , puis à la prochaine changer R#19 à 196 ?
Mettre R#19 à 64, lors de l'interruption changer R#19 à 128 , puis à la prochaine changer R#19 à 196 ?
Tout à fait. C'est ce que je fais dans le sample de sprite de ma lib.
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
aoineko :
C'est bon, j'ai trouvé !
Y a une option --constseg <Name> pour SDCC qui permet de placer tous les datas constants dans un segment de notre choix (j'utilise "RODATA" car c'est le nom du segment dans z88dk).
Ensuite, il suffit de placer ce segment dans les crt0 à l'endroit souhaité.
Pour une cartouche 32 KB, tu peux le mettre en 8000h.
Ca a un double avantage :
- Les données sont placées en 3e page (laissant toute la 2e page pour le code)
- Si ton code (en 2e page) dépassé la taille de sa page, tu auras un message d'erreur (si ce n'est dans le linker, au moins dans hex2bin)
Et voilà
Y a une option --constseg <Name> pour SDCC qui permet de placer tous les datas constants dans un segment de notre choix (j'utilise "RODATA" car c'est le nom du segment dans z88dk).
Ensuite, il suffit de placer ce segment dans les crt0 à l'endroit souhaité.
Pour une cartouche 32 KB, tu peux le mettre en 8000h.
Ca a un double avantage :
- Les données sont placées en 3e page (laissant toute la 2e page pour le code)
- Si ton code (en 2e page) dépassé la taille de sa page, tu auras un message d'erreur (si ce n'est dans le linker, au moins dans hex2bin)
Et voilà
Je fais des aller-retour !
Ok pour l'option --contseg
Citation :
Pour une cartouche 32 KB, tu peux le mettre en 8000h.
Comment tu définis que RODATA se place en 0x8000 (ou ailleurs) ?
aoineko
Membre non connecté
Conseiller Municipal
J'ai pas encore testé car chez moi les datas const ne vont pas tous dans ce segment.
Je suis en discussion avec un gars de SDCC pour trouver une solution (lui m'affirme que c'est censé marcher).
Mais en théorie, si tu mets --constseg RODATA dans ta ligne de commande du linker, tous les datas const sont censé s'y trouver.
Du coup, ensuite, dans le crt0, tu as juste a déclaré le segment RODATA comme ayant un positionnement en absolu (ABS) et à le placer en 8000h.
Je te confirmerais ça quand je testerai (donc après avoir résolu le problème de placement des données).
Je suis en discussion avec un gars de SDCC pour trouver une solution (lui m'affirme que c'est censé marcher).
Mais en théorie, si tu mets --constseg RODATA dans ta ligne de commande du linker, tous les datas const sont censé s'y trouver.
Du coup, ensuite, dans le crt0, tu as juste a déclaré le segment RODATA comme ayant un positionnement en absolu (ABS) et à le placer en 8000h.
Code ASM :
.area RODATA (ABS) .org 0x8000
Je te confirmerais ça quand je testerai (donc après avoir résolu le problème de placement des données).
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
@aoineko
Je ne retrouve pas l'endroit où l'on avait parlé de la routine de print graphique... Et du petit "concours" d'optimisation ...
J'ai continué à optimiser de mon coté tout ca, sans ajouter toutes les fonctionnalités que tu as implémenté de ton coté.
Le texte que j'avais soumis à l'époque, je l'affiche maintenant en 16 cycles
Quelque soit le mode graphique, avec ou sans transparence. (Sans changement de couleurs)
ou bien 26 lignes de 32 caractère (remplissage de l'écran) en 98 cycles. La commande du Bios mets 170 cycles pour la même chose.
J'suis content Edité par ericb59 Le 21/01/2021 à 21h00
Je ne retrouve pas l'endroit où l'on avait parlé de la routine de print graphique... Et du petit "concours" d'optimisation ...
J'ai continué à optimiser de mon coté tout ca, sans ajouter toutes les fonctionnalités que tu as implémenté de ton coté.
Le texte que j'avais soumis à l'époque, je l'affiche maintenant en 16 cycles
Quelque soit le mode graphique, avec ou sans transparence. (Sans changement de couleurs)
ou bien 26 lignes de 32 caractère (remplissage de l'écran) en 98 cycles. La commande du Bios mets 170 cycles pour la même chose.
J'suis content Edité par ericb59 Le 21/01/2021 à 21h00
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie