MSX Village forum

La Place des Développeurs Coder en C avec SDCC

Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 10/01/2021 à 23h21

Reprise du message précédent

Vindiou les gars, j'ai encore du chemin à parcourir ;)


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

Le 10/01/2021 à 23h58
Oui, mais un chemin plaisant :)


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

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5469

Le 14/01/2021 à 09h03
"Le voyage est la récompense"
- Steve Jobs


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 14/01/2021 à 11h15
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 :D


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

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5469

Le 14/01/2021 à 11h24
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 :D

Comme le gars à fait un stage Boudhiste dans sa jeunesse, je le soupçonne de s'être largement inspiré ... :siffle


banniere-ericb59e
Site web    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5469

Le 15/01/2021 à 20h12
@aoineko
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


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 15/01/2021 à 20h46
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 ? :)


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

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1482

Le 15/01/2021 à 20h48
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 ?

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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 15/01/2021 à 21h01
ericb59 :

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

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5469

Le 16/01/2021 à 07h17
@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 ?


banniere-ericb59e
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 16/01/2021 à 07h34
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 :jesors Edité par igal Le 16/01/2021 à 09h42


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 16/01/2021 à 12h01
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 ?


Tout à fait. C'est ce que je fais dans le sample de sprite de ma lib. :top


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

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5469

Le 17/01/2021 à 09h01
J'ai expérimenté un peu...
Ca permet d'afficher 16 couleurs en Screen 0 ! En faisant des Raster Lines :)
Trop rigolo.




La rom
hsync.ROM


banniere-ericb59e
Site web    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5469

Le 19/01/2021 à 08h34
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à :)

:top
Je fais des aller-retour ! :siffle

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) ?


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 19/01/2021 à 08h59
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.

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

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5469

Le 21/01/2021 à 20h47
@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 :D
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 :lol Edité par ericb59 Le 21/01/2021 à 21h00


banniere-ericb59e
Site web    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie