MSX Village forum

La Place des Développeurs Projet GOS Et oui, encore trop d'ambitions ^^

igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 13/12/2020 à 09h56

Reprise du message précédent

aoineko :
Avec la technique que j'utilise (scrolling vertical hardware et changement de page en cours d'affichage), j'ai 0 travaille du VDP pour le terrain.


N'ayant aucune expérience autre que le Basic Msx, peux tu me dire si il existe "une opération" ou "série d'opérations" équivalente à ton processus permettant de "scroller" depuis la [page 0] à la [page 1]?

Encore une fois, En basic, soit j'affiche directement un bloc depuis une source stockée sur un média comme je sais le faire avec les "Bribes d'une image" comme si c'était "streamé" en live, soit je fais une copie d'image depuis une [page Non visible] vers la [page visible] que je fais scroller :oups





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 13/12/2020 à 12h41
igal :
N'ayant aucune expérience autre que le Basic Msx, peux tu me dire si il existe "une opération" ou "série d'opérations" équivalente à ton processus permettant de "scroller" depuis la [page 0] à la [page 1]?


Alors, je connais vraiment pas assez le Basic pour te dire précisément, mais il te faudrait pouvoir :
- Enregistrer du code sur les hooks H.KEYI et H.TIMI
- Changer la page courante en l'écrivant dans les bits 5 et 6 du registre VDP R#2
- Changer la valeur de l'offset d'affichage vertical (R#23)
- Changer la ligne ou le HBlank doit avoir lieu (R#19)
- Activer/désactiver le HBlank (bit 5 de R#1)

Une fois que tu as tout ça, tu changes ta valeur d'offset d'affichage vertical en fonction de... ce que tu veux (la position de ton héros par ex.).
Si l'offset d'affichage + le nombre de ligne (192 ou 212) dépasse 255, alors tu dois activer le HBlank.
Dans le code du VBlank, tu set le numéro de ta première page et dans celui du HBlank, tu set le numéro de la seconde page.
Du coup, durant l'affichage, l'écran va commencer par afficher ta première page puis à la ligne du HBlank, elle va afficher ta deuxième page.

Voici un exemple de ce que j'utilise.
Dans mon cas, c'est encore plus compliqué car une frame de code gameplay correspond à 2 frames d'affichage de l'écran.
Mais sur le principe, c'est la même chose.


En rouge le code d'interruption et en jaune, le code principal.


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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 13/12/2020 à 22h08
Je viens d'avoir un tilt ! :|
Je pense avoir trouvé une solution pour ne plus avoir besoin du H-Blank (et donc simplifier la gestion du rendu).
En fait, le registre R#2 permet de déplacer la zone affichée par pas de 1024 bytes (8 lignes en Screen 5).
Du coup, en théorie, il suffit d'utiliser R#2 pour scroller de 8 lignes en 8 lignes et R#23 pour scroller de ligne en ligne.
Je vais tester ça. :)


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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 13/12/2020 à 23h31
Ah bah non... en Screen 5 (G4), on ne peut utiliser qu'un pas de 32 Ko pour définir la zone d'affichage :'(
Je comprends pas ce choix de design du VDP mais bon, c'est 35 ans trop tard pour râler.
Du coup, le passage par H-Blank est bien la seule solution...


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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 21/12/2020 à 00h55
J'ai réussit à régler mes derniers problèmes de synchro entre le H-Blank, le V-Blank et mon programme.
Comme mon programme dure plus longtemps qu'une frame de l'écran, il à fallu utiliser les interruptions pour synchroniser certains évènements.
Mais ça y est, cette fois, tout fonctionne bien ! :)

Bon, c'est toujours très lent, mais c'est normal car pour le moment j'affiche toujours 14 personnages en 16x16 à chaque frame.
Au final, seuls ceux qui sont visibles et mobiles seront update et les copies seront plus petites.

Si vous voulez tester : gos_0_2.rom

Avant de m'attaquer à ces optimisations, j'ai encore un dernier gros chantier à lancer.
J'aimerai tester d'utiliser les interruptions pour simuler un thread de rendu.
Je m'explique.

Actuellement, j'utilise la technique classique du Double-Buffering :
- J'update les acteurs de mon jeu et je les dessine dans une partie cachée de la VRAM (frame N),
- Pendant ce temps, j'affiche à l'écran ma frame précédente (frame N-1).

Ce que j'aimerai tenter c'est :
- Update les acteurs de mon jeu, mais au lieu de les dessiner je vais juste enregistrer les commandes à envoyer au VDP dans un buffer (frame N),
- En même temps, via les interruption, je vais envoyer au VDP les commandes stockées dans le buffer de la frame précédente (frame N-1),
- Et toujours en même temps, j'affiche à l'écran la frame d'encore avant (frame N-2).

Le but est d'éliminer tous les temps d'attente de libération du VDP quand on veut envoyer une commande et donc optimiser au maximum les capacités du MSX.
L'idéal aurait été que le VDP déclenche une interruption quand il a fini une commande, mais en me branchant sur le H.KEYI, je pense pouvoir envoyer mes commandes avec un minimum de latence.
Normalement le code d'envoi des commandes devrait être assez petit pour pas trop perturber le système d'interruption, mais c'est à vérifier.
Faudra aussi que je check si le fait d'avoir 2 frames de retards entre ce qui est affiché et l'état du jeu n'est pas pénible pour le joueur... surtout à 25/30 Hz.

Bon, et sinon, ce week-end j'ai un système d'affichage de texte pour ma lib (oui, je réinvente la roue, mais je m'amuse) et j'en ai profité pour créer quelques fonts 8-bits.
Voici un programme pour les tester : sample_print.rom (flèches droite/gauche pour changer de font).
Si vous voulez les images/.h/.asm/.bin de ces fonts, je les mettrai sur le village.


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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 21/09/2013 à 07h42

Messages: 1710

Le 21/12/2020 à 08h48
kick off !!!! genial ca promet !! :top :top :top :top


TURBO-R FS-A1ST 512/128ko MSX2+ NMS 8250 F4 /Fix Audio /Ram 1/4Mb VDP9958 VRAM 192ko 2FDD SANYO WAVY PHC35J MSX2 NMS 8280 Ram 4Mb VDP9938 VRAM 192ko 2FDD NMS 8250 128/128ko 2FDD VG8235/39 128/128ko 1FDD SONY HB-F700D MSX1 MC810 32/16k VG 8020 64k HB75F 64k HX-22 64k RS232/ CX5M 32k HB501F EXT : My Exp 4X/[b] MegaFlashSCC 512ko/BERT R2/BEER CF/SUNRISE 2CF/FUNRICE V2.01/MAXIOL/MEGASCSI HDD-CD/SDMSX 1SD/FMPAC SRAM/NMS1205+1160/RS 232 Harukaze/GR8NET/DOS2/ HOMER V2 RAM512ko/Floppy Pack/MAXduino/ROM1664/FM Pak /GR8NET /AMIGA/ PC/ RaspB Pi(B) / ARDUINO
E-mail    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5469

Le 21/12/2020 à 10h25
Très sympa le jeu. Même si c'est lent, c'est très sympa.£
Pour moi le plus compliqué ça serait de faire les algorithmes de gestions des joueurs :p

Les fonts aussi sont bien .... Je peux avoir ça pour Fusion-c ? S'il te plait ? :siffle :)


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 21/12/2020 à 12h19
Ah zut... je viens de comprendre un truc embêtant.
Je pensais qu'il y avait un périphérique (comme une horloge interne) qui déclenchait des interruptions plusieurs fois par frame (le temps d'affichage d'un écran).
Mais en fait, il n'en n'est rien : par défaut seul le VDP déclenche une interruption et ce, 1 seule fois par frame.
Du coup, mon idée de me brancher sur les interruptions pour avoir du code de rendu en parallèle tombe à l'eau.
Je pourrais me brancher sur l'affichage de chaque lignes (H-Blank) pour avoir 212 interruptions, mais j'ai bien peur que le surcout soit trop important.
Faut que je revois mes plans... :gne

ericb59 :
Les fonts aussi sont bien .... Je peux avoir ça pour Fusion-c ? S'il te plait ? :siffle :)


Evidemment :)
Elles ne sont pas "finales", j'ai repéré quelques soucis de lisibilités que je corrigerais tantôt.
Voici la version actuelle : cmsx_font.7z
Les 4 premiers bytes servent à configurer mon système de Print() :
- Taille des données d'un caractère (4-bits pour la largeur, 4-bits pour la hauteur)
- Taille d'affichage d'un caractère (idem)
- Code ASCII du 1er caractère de la font
- Code ASCII du dernier caractère de la font
Toutes les fonts font 8 pixels de large max mais peuvent avoir n'importe quel nombre de lignes.


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/12/2020 à 14h37
@aoineko : Merci !
Et ta routine de print ? On peut voir ? C'est plus rapide que celle du Bios ? :D


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 21/12/2020 à 15h34
Tu peux jeter un œil à print.c et print.h dans https://github.com/aoineko-fr/cmsx/tree/master/cmsx/src
Pour le moment, ça ne supporte que les modes graphiques G4, G6 et G7.
C'est pas vraiment optimisé (car j'en ai pas besoin ^^), sauf pour l'envois des données en mode G4 ou j'ai trouvé un trick assez efficace.
J'ai hésité, mais j'ai perdu en perf en supportant pas uniquement des fonts 8x8 (avec lesquelles les calculs peuvent être inline et les mul/div bcp plus rapide).
Pour GOS, je vais surtout utilisé les sprites pour afficher le text en jeu (les print serviront que pour les menus).


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/12/2020 à 16h27
Alors, oui en fait c'est ce que j'ai fait juste après avoir posté mon commentaire.
J'ai trouvé ça compliqué ... Mais c'est normal, c'est ta lib, sans explications, alors forcément, débarquer en pleine jungle comme ça en short et baskets je ne pouvais pas aller loin :lol


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 21/12/2020 à 17h20
Même si à terme le but est de la partager officiellement, dans l'état actuel c'est clairement pas fait pour :p


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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 22/12/2020 à 00h54
@Eric, les fonts ont été mise à jour sur GitHub (https://github.com/aoineko-fr/cmsx/tree/master/cmsx/src/fonts).
J'ai fait une nouvelle variante de Neon1 plus lisible.
(faudrait que je fasse pareil pour Neon2).
On peut les voir ici aussi : sample_print.rom


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 22/12/2020 à 14h21
Ok...
Est-ce que je peux te demander un petit test avec ta librairie ?
Peux tu me dire en combien de temps tu affiches ce texte en Screen 8, avec l'une de tes font de 8x8
Temps calculé en utilisant l'horloge Timer du MSX (0xFC9E)

Code C :
 
    char text1[]="BONJOUR LE FUTUR";
    char text2[]="ICI LE MSX QUI VOUS PARLE";
    char text3[]="DEPUIS L'ANNEE 1985";
    char text4[]="IL PARAIT QUE LES VIEUX";
    char text5[]="JOUENT ENCORE AVEC MOI";
    char text6[]="DANS LES ANNEES 2020 ?";
    char text7[]="Incroyable !";
 






banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2680

Le 22/12/2020 à 14h59
Dans quel Screen Mode ? Le 5 ?
En 7 prints différents ? Tu supportes pas les '\n' ?
J'ai 3 options que je peux activer ou pas pour gagner en vitesse (un validateur qui essaye de modifier le caractère d'entrée s'il est invalide, un gestionnaire d'ombre portée et une optimisation pour les fonts 8x8)
Remarque, je peux faire le test avec/sans ces options pour voir ce qu'on y gagne.
Par contre, tu aurais du prendre un texte plus long pour que les chiffres soient plus représentatif.
Je te fait ça ce soir (là j'ai du bulot ^^).


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 22/12/2020 à 15h19
Ce qui m'intéresse de voir c'est ta routine la plus rapide.
En Screen mode 8 ou 5 ont doit obtenir les mêmes vitesses.
Oui utilises 7 Prints différents s'il te plait.

J'ai vu dans ta routine que tu transferts des caractères avec fonction Ram To VRAM. Tu en fait 8 par caractères, si j'ai bien pigé. 1 par ligne.
Pourquoi tu n'utilises pas HMMC ou LMMC pour faire un seul transfert par caractère ? Edité par ericb59 Le 22/12/2020 à 15h23


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