MSX Village forum

La Place des Développeurs Dev emulateur Minitel

aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2947

Le 04/01/2025 à 19h37

Reprise du message précédent

Je pars du principe que tu as suivi le tuto pour la création d'un projet sur MSXgl. :)

Dans MSXgl, tu dois configurer la libraire pour l'émulateur que tu souhaites utiliser pour communiquer (malheureusement, ils n'utilisent pas tous le même système).
Tu dois éditer ton fichier de configuration de la librairie (msxgl_config.h) :

Code C :
 
//-----------------------------------------------------------------------------
// DEBUG
//-----------------------------------------------------------------------------
 
// Debugger options
// - DEBUG_DISABLE ................ No debug tool
// - DEBUG_EMULICIOUS ............. Debug features for Emulicious
// - DEBUG_OPENMSX ................ Debug features for openMSX using 'debugdevice' extension
// - DEBUG_OPENMSX_P .............. Debug features for openMSX using PVM script (tools/script/openMSX/debugger_pvm.tcl)
#define DEBUG_TOOL                    DEBUG_OPENMSX_P // <---- Change ici !
 
// Profiler options
// - PROFILE_DISABLE .............. No profile tool
// - PROFILE_OPENMSX_G ............ Profiler features for openMSX using Grauw script (tools/script/openMSX/profiler_grauw.tcl)
// - PROFILE_OPENMSX_S ............ Profiler features for openMSX using Salutte script (tools/script/openMSX/profiler_salutte.tcl)
#define PROFILE_TOOL                PROFILE_DISABLE
#define PROFILE_LEVEL                10
 


Ensuite, tu dois ajouter le module de Debug dans la liste des modules de ton projet.
Pour ça édite la configuration de ton projet (project_config.js) et ajoute "debug" dans la liste LibModules.

Par ex. :
Code JAVASCRIPT :
//-- List of library modules to build (array)
LibModules = [ "debug", "system", "bios", "vdp", "print", "input", "memory" ];


Maintenant tu peux utiliser toutes les fonctions qui commence par DEBUG dans https://aoineko.org/msxgl-doc/#File:debug.h

Pour tester dans openMSX, le plus simple c'est de configurer MSXgl pour qu'il démarre automatiquement l'émulateur à la fin du build.
Dans ce cas, openMSX sera ouvert avec toutes les options qui vont bien (et notamment le script TLC sera automatiquement chargé).

Pour ça, il faut changer quelques options dans la configuration de ton projet (project_config.js) :
Code JAVASCRIPT :
 
// Pour forcer l'au-démarrage de l'émulateur:
DoRun     = true;    //-- Start the program automatically at the end of the build (boolean)
 
// Pour indiquer l'emplacement de l'émulateur (c'est le nom du fichier à exécuter mais tu peux omettre le .EXE):
Emulator  = `c:/ton_chemin/openMSX/openmsx`; //-- Path to the emulator to launch the project (string)
 


Enfin, pour la question de savoir où c'est affiché dans openMSX... et bien j'en ai aucune idée depuis qu'ils ont changé leur interface. ^^
Je vais regarder... Edité par aoineko Le 04/01/2025 à 21h54


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

Touriste

Rang

Avatar

Inscrit le : 21/12/2024 à 14h04

Messages: 33

Le 04/01/2025 à 20h03
@aoineko

Merci pour ton aide!

Oui, j'avais lu le tuto ! mais visiblement pas le fichier msxgl_config.h jusqu'au bout du bout.

J'ai donc modifié comme indiqué :

Code :

#define DEBUG_TOOL                    DEBUG_OPENMSX_P


Alors, c'est mieux : si je place un
Code :
DEBUG_BREAK()
, ca fait bien un break.

En revanche,
Code :
DEBUG_LOG("xxxxxxxx"); 
affiche dans la fenêtre "Message log" de openMSX (ca semble s'affiche là donc), 4 jolis messages : "Warning: invalid address"

Bon, en tout cas, ca avance !




   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2947

Le 04/01/2025 à 22h11
Ajoute ce paramètre dans la configuration de ton projet (project_config.js) :
Code JAVASCRIPT :
 
//-- Emulator extra parameters to be add to command-line (string). Emulator sotfware specific
EmulExtraParam = `-script ${ToolsDir}script/openMSX/debugger_pvm.tcl`;
 


Les explications, sont ici : https://aoineko.org/msxgl/index.php?title=Modules/debug#openMSX

Tu peux tester avec le projet Example en mettant DEBUG_TOOL à DEBUG_OPENMSX_P dans la configuration de la librairie (msxgl_config.h).
Comme on dit « chez moi, ça marche ». ^^ Edité par aoineko Le 04/01/2025 à 22h18


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

Touriste

Rang

Avatar

Inscrit le : 21/12/2024 à 14h04

Messages: 33

Le 05/01/2025 à 00h50
Bon, j'ai pas mal cherché et me suis pris pas mal la tête !
Jusqu'à réinstaller SDCC avec la version que tu préconises sur ton site (4.2) et OpenMSX !

J'ai essayé le debug avec le fichier d'exemple : ca fonctionne effectivement !

J'ai fait un mini test comme cela, le truc basique de chez basique :

Code :

void main() {
    DEBUG_INIT();
    DEBUG_BREAK();
    DEBUG_LOG("Start debug");
    DEBUG_LOG("Start debug fin");
}


ca ne marchait pas, avec les fichiers de config de mon projet.

Donc j'ai bien cherché et il s'avère que ton exemple cré un ROM 32K.

Le mien, c'est un programme MSX-DOS 1.

Et ce qui pose problème et qui fait que le debug déconne complètement c'est lorsque j'ajoute l'extension -ext Mitsubishi_ML-30DC_ML-30FD
Le même soucis se produit avec ton exemple si on ajoute cette extension.

Est-ce normal que le debug ne fonctionne pas si cette extension est activée (pareil avec d'autres extension pour un floppy disk)?
Ou y a t il (encore) un truc que j'ai zappé ? (possible !)






Edité par ludojoey Le 05/01/2025 à 00h50
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2947

Le 05/01/2025 à 11h07
La communication de débug avec openMSX se fait via les ports I/O 2Eh et 2Fh. A moins que l'extension que tu ajoutes utilise les mêmes ports I/O, ça ne devrait avoir aucune incidence. Je vais tester.

Aussi, note que SDCC 4.2.0 est inclu dans le package MSXgl donc tu n'as rien à installer de plus. Edité par aoineko Le 05/01/2025 à 11h30


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

Le 05/01/2025 à 12h02
Alors, d'après mes tests, tout fonctionne bien avec le projet Example en mode MSX-DOS 1.

Peut-être que ton problème vient du fait que tu utilises les machines CBIOS.
Pour la petite histoire, openMSX n'est fournis avec aucune ROM système pour des raisons légales.
Ils utilisent donc par défaut les BIOS du projet open source CBIOS qui malheureusement ne supporte pas encore les disques.

Pour que de base MSXgl fonctionne avec la version de openMSX de base, c'est CBIOS qui est sélectionné quand tu active l'option EmulMachine dans la configuration de ton projet (project_config.js), qui permet de sélectionner la génération de MSX qui s'adapte à ton choix pour ton projet.

Pour utiliser l'extension Mitsubishi_ML-30DC_ML-30FD, je te conseil cette configuration :
Code JAVASCRIPT :
 
//-- Force the MSX version of the emulated machine (boolean)
EmulMachine    = false;
 
//-- Emulator extra parameters to be add to command-line (string). Emulator sotfware specific
EmulExtraParam = `-ext Mitsubishi_ML-30DC_ML-30FD -script ${ToolsDir}script/openMSX/debugger_pvm.tcl`;
 


Et dans openMSX, tu séléctionnes une machine MSX1 sans disque comme le Canon V20 par ex. :
Machine > Select MSX Machine... > Canon V20 (FR) > Replace current machine > Make this the the default machine

Pour plus d'infos sur les ROMs systèmes : https://aoineko.org/msxgl/index.php?title=Emulators#openMSX

Avec ça, le projet Example se lance bien sur un MSX1 en mode MSX-DOS1.

Petite astuces : Tu peux build le project Example (idem pour les Template) en mettant le nom du média cible dans la ligne de commande. Par ex.
- ROM de 32 KB : build ROM_32K
- Programme MSX-DOS 1 : build DOS
- Programme disque BASIC : build BIN_DISK
- Programme cassette BASIC : build BIN_TAPE
- Etc. (voir la liste des médias) Edité par aoineko Le 05/01/2025 à 12h12


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

Touriste

Rang

Avatar

Inscrit le : 21/12/2024 à 14h04

Messages: 33

Le 05/01/2025 à 13h07
Merci @aoineko , là le debug marche comme ca doit sous MSX-DOS1 !

Oui, pour le ROMs je savais, mais ce que je ne savais pas c'était que CBIOS ne supporte pas les disques, et, il faut le dire, openMSX me parait être vraiment super, mais pas forcément intuitif.
Pas évident de commencer, avec tous ces petits tracas.
Mais je persiste !

Tu es d'une aide précieuse !

   
ludojoey Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 21/12/2024 à 14h04

Messages: 33

Le 07/01/2025 à 12h32
Hello!

Bon, désolé, je reviens encore à la charge !
Cela fait 2 jours que je galère sur l'accès au floppy (toujours sous MSX-DOS1).

J'ai une fonction qui parcours le répertoire à la recherche de fichier en ".vdt".

Le soucis : de manière aléatoire, l'appel à "DOS_FindFirstFileFCB" plante totalement : le système freeze complètement, ou parfois, va retourner n'importe quoi (genre 50 fichiers trouvés, avec des noms hasardeux..) ou redémarrer en boucle.
Quand je dis aléatoire, cela signifie que, pour une version compilée donnée, cela va fonctionner tout le temps.
Mais il suffit que je rajoute, par exemple, un "if" dans mon code (même dans un endroit qui ne sera pas exécuté), et ca plante...

Voici le code de la fonction (pas propre du tout [nom de variable en "g_" alors qu'elle est local, etc..), mais je fais des essais divers pour essayer de trouver le soucis !)

Code :

u8 EMX_getFileList(c8 *fileList) {
    DOS_FCB fcb;
    u8 g_Buftmp[128];
    DEBUG_PRINT("addrfilelist2=%x\n",(u16) fileList);
    DEBUG_PRINT("addrfcb=%x\n",(u16) &fcb);
    DEBUG_PRINT("addrbuf=%x\n",(u16) &g_Buftmp);
    DEBUG_PRINT("size fcb=%d\n",sizeof(DOS_FCB));
    Mem_Set(0, &fcb, sizeof(DOS_FCB));
    Mem_Copy("????????VDT", &fcb.Name, 11);
    DEBUG_LOG("memcopy ok\n");
    DOS_SetTransferAddr(&g_Buftmp);
    DEBUG_LOG("settransfert ok\n");
    
    g_I = DOS_FindFirstFileFCB(&fcb);
    DEBUG_LOG("findfirst ok\n");
    if(g_I == DOS_SUCCESS)
    {
        
        Mem_Copy(&g_Buftmp+1,(c8 *)fileList,11);
        *(fileList+11) = 0;
        g_I = 1;
        
        while(DOS_FindNextFileFCB() == DOS_SUCCESS) {
            Mem_Copy(&g_Buftmp+1,(c8 *)(fileList+(12*g_I)),11);
            *(fileList+(12*g_I)+11) = 0;
            g_I++;
            
        }
    }
    DOS_CloseFCB(&fcb);
    
    return g_I;
}


Lors d'une exécution qui plante, voici la sortie :

Code :

addrfilelist=d476
addrfilelist2=d476
addrfcb=d3cd
addrbuf=d3f2
size fcb=37
memcopy ok
settransfert ok
(Le système est alors planté)


Pensant que c'est probablement un problème de mémoire, genre mes variables qui débordent sur le code, j'ai regardé le fichier .map pour voir si ca avait l'air d'aller au niveau de la pile, ce genre de truc.
Je n'ai vraiment pas l'habitude de fouiller la dedans à vrai dire, donc pas sûr de bien comprendre.


Code :

.....
    00000100  s__CODE                         
     00000221  l__HOME                         
     0000095E  l__DATA                         
     00005BEB  l__CODE                         
     00005CEB  s__HOME                         
     00005F0C  s__INITIALIZER                  
     00005F0C  s__RODATA                       
     00005F2F  s__DATA                         
     00005F2F  s__GSFINAL                      
     00005F2F  s__GSINIT                       
     0000688D  s__INITIALIZED                  
     000068B0  s__BSEG                         
     000068B0  s__BSS                          
     000068B0  s__HEAP                         
     0000F30F  G$g_KANJTABLE$0_0$0                bios
     0000F30F  _g_KANJTABLE                       bios
     0000F323  G$g_DISKVE$0_0$0                   bios
     0000F323  _g_DISKVE                          bios
     0000F325  G$g_BREAKV$0_0$0                   bios
     0000F325  _g_BREAKV                          bios
     0000F341  G$g_RAMAD0$0_0$0                   bios
     0000F341  _g_RAMAD0                          bios
     0000F342  G$g_RAMAD1$0_0$0                   bios
     0000F342  _g_RAMAD1                          bios
     0000F343  G$g_RAMAD2$0_0$0                   bios
     0000F343  _g_RAMAD2                          bios
     0000F344  G$g_RAMAD3$0_0$0                   bios
     0000F344  _g_RAMAD3                          bios
     0000F348  G$g_MASTER$0_0$0                   bios
     0000F348  _g_MASTER                          bios
     0000F37D  G$g_BDOS$0_0$0                     bios
     0000F37D  _g_BDOS                            bios
     0000F380  G$g_RDPRIM$0_0$0                   system
     0000F380  _g_RDPRIM                          system
     0000F385  G$g_WRPRIM$0_0$0                   system
     0000F385  _g_WRPRIM                          system
     0000F38C  G$g_CLPRIM$0_0$0                   system
     0000F38C  _g_CLPRIM                          system
....


et

Code :

    0000681C  G$g_StackAddress$0_0$0             memory
     0000681C  _g_StackAddress                    memory



Lien vers le fichier Map complet

Je comprends que la pile se situe en 681C, c'est cela ?
Si vous avez une idée du soucis, elle est la bienvenue !


Edité par ludojoey Le 07/01/2025 à 12h38
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2947

Le 07/01/2025 à 13h22
ludojoey :
Je comprends que la pile se situe en 681C, c'est cela ?

Non, c'est une variable alloué en RAM (en mode DOS, les variables sont allouées juste après le programme) qui permet de récupérer l'adresse actuelle de la pille via la fonction Mem_GetStackAddress().
Mais si tu es sur émulateur, le plus simple c'est de regarder la valeur du registre SP.
Dans le fichier .MAP, l'espace des variables commence à la section _DATA (dans ton exemple c'est 0x5F2F).

Pour en revenir à ton problème, si j'ai bien compris, d'une build à l'autre tu as soit un programme qui fonctionne à 100%, soit qui crash à 100% ; c'est bien ça ?

La fonction DOS_FindFirstFileFCB() n'est qu'un wrapper vers un appel au BDOS.
Code C :
u8 DOS_FindFirstFileFCB(FCB* stream)
{
    stream; // HL
__asm
    push    ix
    // FCB pointer
    ex        de, hl
    ld        c, #DOS_FUNC_SFIRST
    call    BDOS
    ld        (_g_DOS_LastError), a
    pop        ix
__endasm;
}


Il y a 2 options :

- Soit la fonction BDOS peut crasher si on lui donne une valeur d'entrée invalide (l'adresse du FCB) ; ça me semble assez probable vu que le BDOS peut écrire dedans, mais c'est facile à tester en exécutant ce code :
Code C :
for(u16 i = 0; i <= 0xFFFF; i++) DOS_FindFirstFileFCB((FCB*)i);


- Soit il y a eu un écrasement mémoire sur la zone de travail du BDOS avant l'appel. La table de saut du BDOS se trouve à l'adresse 0x0005. C'est moins simple à tester.

Ça ne devrait pas poser de soucis, mais tu devrais essayer d'allouer tes tableaux (FCB et buffer) en dehors de ta fonction.
Je n'alloue jamais de tableau dans les fonctions pour des raisons de performance (le compilateur se met à utiliser les registres d'index IX et IY qui sont très lents) donc c'est possible qu'il y ait des soucis que je ne connais pas.
Si ça corrige ton bug, j'essayerai de le reproduire pour voir comment cela pourrait être corrigé.

Voilà pour les idées pour le moment. ^^ Edité par aoineko Le 07/01/2025 à 13h30


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

Touriste

Rang

Avatar

Inscrit le : 21/12/2024 à 14h04

Messages: 33

Le 07/01/2025 à 18h56
Merci pour ton aide.

Malheureusement, là, je n'arrive pas à m'en dépêtrer, malgré encore une journée à chercher...

J'ai repassé mes variables en globales (mais je savais que cela ne changerai rien, car, à la base, elles étaient globales avant que je les mette en local "pour voir" si cela changerai quelque chose.)

J'ai viré le module "game", dont je n'avais pas vraiment besoin de toutes façons.

Je n'ai plus de plantage (pour le moment), mais impossible d’accéder au floppy (DOS_FindFirstFileFCB() renvoi 0xFF)

J'ai vidé mon programme de toutes ses fonctions, jusqu'à ce que le soucis se produise.

Arrivé à un certain point juste le fait de rajouter un ligne, par exemple un simple i=0 dans une fonction qui n'est même pas appelée fait que DOS_FindFirstFileFCB() renvoi 0xFF (appelé dès le départ dans le main()), avant toute chose).

En faisant des essais cet après-midi sur bout de code qui posait un soucis similaire celui c'est résolu en ajoutant comme option de compilation --max-allocs-per-node 5000

En mettant cette même option à mon programme principal, cela n'a malheureusement pas résolu le soucis (à part qu'avant de mettre cette option j'avais le droit à un beau message "Insert floppy in drive B" (ou similaire) lors de l'appel à DOS_FindFirstFileFCB() [je précise que je n'ai pas de drive B...], alors que maintenant j'ai seulement le 0xFF en retour...

Bon, de toutes façons je pars en déplacement demain, cela me fera une pause je crois !
J'ai le sentiment que cela est inextricable !


   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2947

Le 07/01/2025 à 20h43
Si tu peux partager ton projet (GitHub par ex.), je peux jeter un œil.
A mon avis c'est pas grand chose... mais quoi... ^^

Tu peux aussi me contacter sur Discord : https://discord.gg/C4A2kRzE9F Edité par aoineko Le 07/01/2025 à 20h46


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

Touriste

Rang

Avatar

Inscrit le : 21/12/2024 à 14h04

Messages: 33

Le 15/01/2025 à 13h47
Hello!

Voici un premier (enfin, Xième !) jet de mon projet, à savoir un émulateur Minitel pour MSX1 (avec toutes ses contraintes quant au graphisme !)
La première étape est donc de pouvoir afficher plus ou moins correctement des fichiers videotex, à la norme CEPT2.

Pas facile, sachant qu'un écran videotex est composé de 25 lignes de 40 caractères de 8 pixels X 8 pixels, pour une résolution de 320 x 200, avec 2 couleurs parmi 8 par caractère.
Et scrolling vertical haut et bas pris en charge ainsi que les caractères double hauteur, double largeur et double taille.

Bref, pas du tout la résolution d'un MSX 1, c'est le challenge !
Deux possibilités s'offraient : afficher uniquement des lignes de 32 caractères et proposer un scrolling horizontal pour voir les 8 caractères manquants.
Ou redéfinir l'écran pour obtenir 40 caractères de 6 pixels de large.
J'ai choisi la deuxieme solution, la plus complexe !

Donc, les caractères sont de 6 pixels de large x 8 pixels de haut et dessinés "à cheval" entre chaque tuile avec un décalage variable cyclique.
Et les couleurs doivent suivre (comme elles peuvent !), avec la contrainte du Screen2 de 2 couleurs par ligne 8 pixels !
L'écran est donc de 40 caractères sur 24 lignes (et non 25 comme sur un minitel : la ligne 00 (celle du haut) est affiché en ligne 1).
J'ai repris la police de caractères des vrais minitels.

Voici le résultat pour le moment, soyez indulgent c'est mon premier projet (hors programmes en Basic en 1985) sur MSX (et même sur n'importe quel vieille machine !) :

Video Eminex 0.0.1

Alors, l'émulation est je pense correcte à 75%.
Plus la page est chargée en graphisme "complexes", plus cela est difficile pour obtenir un affichage correct.
On ne peut parfois (souvent) pas obtenir l'affichage comme on désirerai du aux contraintes de l'ordi.

Certaines choses ne sont pas émulées, pour le connaisseurs : séquences CSI, masquage, DRCS,...
Tout comme le clignotement, hors de portée je pense !
Le scrolling serait à revoir, tout comme la propagation des couleurs de fond et du soulignement ! (ca ne vous dit peut-être rien, mais bon !)
Tout comme une optimisation de la vitesse d'affichage (mettre toutes mes variables en globale serait parait-il bon pour cela...)

Je suis relativement content car le résultat est un affichage somme toute tout à fait utilisable.

Le prochaine étape (hormis optimiser ce qui est déjà fait), est la partie connexion.
Pour cela je pense utiliser la cartouche modem BadCat Wifi que j'ai.
Si j'arrive à obtenir une connexion telnet avec mon serveur, cela sera alors parfait !




Edité par ludojoey Le 15/01/2025 à 13h50
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2947

Le 15/01/2025 à 20h59
Bravo pour le résultat qui ressemble beaucoup au Minitel (dans mon souvenir en tout cas ^^) alors qu'effectivement un écart de résolution de 320 à 256 pixels est un énorme défi ! :top

Mais du coup, tu réinterprètes en temps réel les blocs 8x8 du format video-text en blocs 6x6 ?
Tu skip toujours les 2 mêmes colonnes et lignes, ou tu fais en fonction du contenu du bloc ?

Quand tu en seras à l'optimisation, je pourrais surement t'aider ; c'est ma spécialisation. :)


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

Villageois

Rang

Avatar

Inscrit le : 13/05/2023 à 09h12

Messages: 268

Le 15/01/2025 à 21h13
:siffle c'est très impressionnant :top


Pourquoi s'évertuer à voler avec des aigles quand on travaille avec des dindes...
   
ludojoey Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 21/12/2024 à 14h04

Messages: 33

Le 15/01/2025 à 21h33
aoineko :
Bravo pour le résultat qui ressemble beaucoup au Minitel (dans mon souvenir en tout cas ^^) alors qu'effectivement un écart de résolution de 320 à 256 pixels est un énorme défi ! :top

Mais du coup, tu réinterprètes en temps réel les blocs 8x8 du format video-text en blocs 6x6 ?
Tu skip toujours les 2 mêmes colonnes et lignes, ou tu fais en fonction du contenu du bloc ?

Quand tu en seras à l'optimisation, je pourrais sûrement t'aider ; c'est ma spécialisation. :)


La hauteur de mes caractères est de 8 pixels, donc pas de soucis sur les lignes.
Ce sont les colonnes le soucis !
Oui, au fur et à mesure de la lecture du fichier (ou de la réception des données donc), s'il y a un caractère à afficher (car on peut lire ou réceptionner également des séquences de controles) celui-ci est dessiné à la volé. Sachant qu'il fait 6 pixels de large, le 1er caractère correspond à la colonne 0 de l'écran MSX, sans décalage. Le second, toujours la colonne 0 de l'écran MSX, mais avec un décalage de 6 vers la droite, et donc un "débordement" de 4 pixels sur la gauche de la colonne 1. Le troisième sera en colonne 1, avec décalage de 4 à droite et débordement de 4 sur la colonne 2, etc, etc...

Le plus gros défi ce sont bien sûr les couleurs, surtout lorsqu'il s'agit des caractères semi-graphiques.
Avec les décalage, j'ai 2 couleurs de fond et 2 couleurs d'avant plan et le caractère est à cheval entre 2 tuiles.
Il faut voir si le fond de la partie à afficher de l'un correspond au fond de l'autre partie du caractère qui va rester par exemple, ou s'ils sont inversé.
Dans ce derniers cas, j'inverse les bits de la partie du caractère à afficher...
S'il la zone du caractère à afficher (ou celui qui est déjà en place dans la colonne MSX) est pleine ou vide, cela joue aussi.
Et quand il y a vraiment 4 couleurs distinctes, je regarde quel ensemble de 2 couleurs font les plus de pixels, pour les privilégier.
Et beaucoup de pages videotex jouent aussi sur l'inversion vidéo.
Enfin bref, des trucs comme ca.

Pour l'optimisation, j'ai déjà passé certaines variables en globales.
Bon, je vois pas trop la différence (enfin pour le code si, je trouve ca assez "dégueulasse" en fait !)
Après il est vrai que je ne suis pas habitué à forcément à faire le code le plus optimisé du monde (comme beaucoup de nos jours je pense, ceci à cause de la puissance du matériel actuel comparé à ce que l'on avait avant !).







   
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie