MSX Village forum

La Place des Développeurs Mon premier jeu en assembleur

zone Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 11/10/2023 à 19h25

Messages: 66

Le 22/11/2023 à 16h57

Reprise du message précédent

Je n'avais pas pensé aux cas où les sprites sont désactivés ou le tracé pendant hbl/vbl (j'avais bien compris que les « t-states » corresponaient à un intervalle minimum entre deux tracés). Pour moi ça devrait aller vu que je vise le MSX/2.

Il y a beaucoup de choses sur ce forum (rapport au post de MSXosaure), ça vaut le coup d'explorer .

Je n'ai pas posté depuis un moment, car je suis coincé sur mon tracé en mode 3 (screen 4).
Je définis l'adresse mémoire du tracé à $1800 (adresse des caractères), puis je trace. Ce qui apparait à l'écran n'a aucun rapport.

Code :

  ld a,0 ; adresse video ram, partie haute (reg.14)
  di
  out ($99),a ; on reste dans la partie basse

  ld a,14+128
  out ($99),a ; écriture dans registre 14

  ld a,0 ; adresse vram (partie basse)
  out ($99),a
  ld a,$18+64 ; adresse vram (partie haute) pour écrire (+64d) à 0x1800
  out ($99),a
  ei

  ld c,3
draw_loop_main:
  ld b,255
  ld hl,message
draw_loop:
  ld a,(hl)
  inc hl
  out ($98),a
  dec b
  jr nz,draw_loop
  dec c
  jr nz,draw_loop_main


J'ai l'impression qu'il manque un truc, et que l'adresse du début de l'affichage n'est pas $1800.
Pourtant dans mes docs , ce n'est pas abordé.
Mais en explorant les registres du VDP avec le debugger OpenMSX, j'ai trouvé le registre 2 (pattern name table base address register).
Il est à $c00 par défaut. Si je le passe à $1800, ça a l'air d'aller nettement mieux.
Bizarre ? Normal ? J'ai rien compris ?
Edité par zone Le 22/11/2023 à 16h57
   
Franck Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 22h54

Messages: 3279

Le 22/11/2023 à 17h03
As-tu parcouru les livres de notre bibliothèque ? Peut-être pourraient-il t’aider dans ton pas à pas ? :)
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2657

Le 22/11/2023 à 18h47
En mode graphique 3 (SC4), tu as 3 tables en VRAM a gérer.
- La table des patterns (les dessins des tuiles).
- La table des couleurs (la couleur des tuiles).
- La table de matrice (qui dit quelle tuile est affichée pour chacune des 32x24 cases de l'écran).

Chacune a une place en VRAM qui peut varier d'un MSX à l'autre.
Pour être sûr de leur emplacement, tu peux soit :
- Récupérer leur emplacement actuel (tu as des fonctions dans le BIOS pour ça il me semble)
- Soit, et c'est ce que je te conseille, les placer toi-même en VRAM en mettant les bonnes valeurs dans les registres du VDP.

Pour les détails, il y a plein de docs dispo sur le net, mais si tu as une question spécifique, n'hésite. :)


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

Le 22/11/2023 à 18h59
Petite particularité du GM3 (SC2) qui peut être perturbante au début, c'est que les tables des formes et des couleurs des tuiles est divisé en 3 sections de 256 patterns, et que chacune de ces sections ne s'applique qu'à une des 3 bandes verticales de l'écran.

En effet, dans ce mode, l'écran n'est pas découpé sur une grille unique de 32x24 cases, mais sur 3 bandes de 32x8 cases : une pour le haut, une pour le milieu et une pour le bas.

Chacune des 3 sections de patterns s'applique à l'une bande.

Ainsi, si tu veux une même tuile sur les 3 bandes de l'écran, il faut qu'elle soit recopié dans les 3 sections des tableaux en VRAM.

Il y a encore qq autres subtilités mais je te laisse déjà digérer ces infos. ^^ Edité par aoineko Le 22/11/2023 à 19h00


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

Touriste

Rang

Avatar

Inscrit le : 11/10/2023 à 19h25

Messages: 66

Le 22/11/2023 à 19h17
Oui j'ai commis l'erreur de penser que l'emplacement par défaut des différentes tables était fixe.
Je pensais qu'il y avait un emplacement par défaut, au vu de ce diagramme (tiré de « pratique du MSX », très bon livre par ailleurs).

2023-11-22_19_07_53

C'est ensuite, quand j'ai vu le registre 2 que j'ai commencé à douter. J'ai eu des infos complémentaires chez Konamiman ( https://konamiman.github.io/MSX2-Technical-Handbook/md/Chapter4a.html#35-graphic-2-graphic-3-modes ) pendant que tu me répondais et j'ai pigé (notamment qu'il y a une certaine granularité dans les emplacements mémoire: hier soir je cherchais la partie basse du registre 2, je n'étais pas près de trouver).

Pour les 3 bandes, j'avais aussi lu ça quelque part. J'ai vu aussi dans les docs qu'on peut choisir de cloner une section, c'est à dire par exemple d'utiliser la section 1 pour l'affichage de la section (2 ou 3) ou (2 et 3). Il y a 3 bits correspondant aux sections à allumer chépuou.

C'est vrai que ça en fait des infos. Et je n'ai toujours pas bien intégré le Z80 :fou Edité par zone Le 22/11/2023 à 19h30
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2657

Le 22/11/2023 à 20h28
zone :
J'ai vu aussi dans les docs qu'on peut choisir de cloner une section, c'est à dire par exemple d'utiliser la section 1 pour l'affichage de la section (2 ou 3) ou (2 et 3). Il y a 3 bits correspondant aux sections à allumer chépuou.


Ca fait parti des subtilités dont je parlais. ;)
Sur MSX 2, tu peux utiliser ce "mode" non-documenté sans soucis (ce qui n'est pas le cas avec le SC2 sur MSX 1 car certains VDP ne sont pas compatible).

Une autre subtilité, c'est qu'on peut avoir non pas 3 bandes, mais 4. :glass
C'est la technique qu'utilise le créateur de Eggy's Maze pour son scrolling fluide. Edité par aoineko Le 22/11/2023 à 20h29


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

Touriste

Rang

Avatar

Inscrit le : 11/10/2023 à 19h25

Messages: 66

Le 23/11/2023 à 12h05
Tiens j'ai encore une question.

J'ai bien compris que les registres du VDP (à part les registres de « statut » que je n'ai pas encore abordé) sont en écriture seule.
J'ai vu qu'il y avait un mirroring de l'état des registres en RAM:

(mes EQUs pour l'occasion)
Code :

VDP_0_7 = $F3DF
VDP_8_23 = $FFE7
VDP_25_27 = $FFFA


Je pensais que cette zone mémoire était mise à jour par les appels des fonctions BIOS.
Or, quand j'initialise GR3 (screen 4) à la main avec le VDP, VDP_0_7+1 (donc reg 2) contient bien l'adresse attendue de la « table de position des motifs ».

Comment cela est-il possible ? Quel est le mécanisme de mise à jour de cette zone mémoire ? Dois-je moi même la mettre à jour quand je modifie directement les registres du VDP ?
Pour l'instant, je ne m'en suis pas préoccupé, car je comptais sur le fait que le BIOS replaçait les bonnes valeurs lors du retour en SCREEN 0 (et pour un programme en cartouche, je suis seul maître à bord jusqu'au reset suivant).
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2657

Le 23/11/2023 à 19h10
zone :
Je pensais que cette zone mémoire était mise à jour par les appels des fonctions BIOS.
Or, quand j'initialise GR3 (screen 4) à la main avec le VDP, VDP_0_7+1 (donc reg 2) contient bien l'adresse attendue de la « table de position des motifs ».

Comment cela est-il possible ? Quel est le mécanisme de mise à jour de cette zone mémoire ? Dois-je moi même la mettre à jour quand je modifie directement les registres du VDP ?
Pour l'instant, je ne m'en suis pas préoccupé, car je comptais sur le fait que le BIOS replaçait les bonnes valeurs lors du retour en SCREEN 0 (et pour un programme en cartouche, je suis seul maître à bord jusqu'au reset suivant).


Je suis pas le mieux placé pour parler du BIOS vu que je l'ai rapidement court-circuité dans ma lib MSXgl car je n'aime pas les boite noire. ^^

Ceci dit, en théorie, la zone mémoire à partir de RG0SAV (F3Dh) est bien censé être mise-à-jour à chaque modification des valeurs de registre du VDP via les routines du BIOS.
Par contre, je peux te confirmer à 100% que si tu n'utilises pas le BIOS, ces valeurs ne seront jamais modifiés.
Et d'ailleurs, tu peux utiliser (presque) 100% de la RAM dispo quand tu n'utilises pas le BIOS.
En tout cas, tant que tu ne comptes pas rendre la main a un code qui lui, utilise le BIOS.
Dans le cas d'une cartouche, tu peux faire ce que tu veux vu que (normalement) tu ne rendras jamais la main au système.


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 24/11/2023 à 10h49
aoineko :
la zone mémoire à partir de RG0SAV (F3Dh) est bien censé être mise-à-jour à chaque modification des valeurs de registre du VDP via les routines du BIOS. Par contre, je peux te confirmer à 100% que si tu n'utilises pas le BIOS, ces valeurs ne seront jamais modifiés

Je confirme.


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)
   
zone Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 11/10/2023 à 19h25

Messages: 66

Le 24/11/2023 à 11h05
Bon alors ça doit être initialisé pour les modes graphiques au moment du boot.
Là, je pars du basic, cependant (même si screen 4 n'a jamais été appellé avant mes manips VDP).
Je n'ai pas vérifié que ça fonctionnait également avec un programme sur cartouche.
   
zone Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 11/10/2023 à 19h25

Messages: 66

Le 24/11/2023 à 18h32
Ok j'ai compris, en fait ce que je lis, c'est la valeur du dernier mode graphique initialisé par le bios.
Donc dans mon cas, je lis $C00, car ça correspond à l'emplacement des caractères pour le screen 0 de départ (comme je pars du basic).

Dommage, j'avais écrit une belle routine pour extraire la valeur du reg#2 et générer le pointeur d'écriture mémoire.
J'aurais appris quelques instructions z80 dans l'histoire.
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2657

Le 24/11/2023 à 19h27
Dans tous les cas, tu devrais reconfigurer entièrement le VDP pour tes besoins.
Si tu le fais via les fonctions du BIOS, tu pourras facilement remettre dans l'état pour un retour au système (BASIC par ex.) si tu le souhaites. Edité par aoineko Le 24/11/2023 à 19h28


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10255

Le 25/11/2023 à 15h35
pour répondre à ta question

Eggy's Maze utilise le chip clock qui est présent à partir des MSX2 pour sauvegarder la progression du jeu

https://www.msx.org/wiki/Ricoh_RP-5C01



:noel
Site web    
zone Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 11/10/2023 à 19h25

Messages: 66

Le 25/11/2023 à 16h24
Merci pour la réponse.
Mais alors c'est partagé pour tous les softs qui tournent sur un système donné, et peut-être modifié par un autre programme ?
Je pensais que ça faisait partie de la cartouche (un chip dédié).
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2657

Le 25/11/2023 à 17h29
Il existe des solutions avec de la SRAM soit directement dans la cartouche du jeux (comme Hydlyde 3 par ex.), soit dans une cartouche séparé (comme la PAC de Panasoft). C'est aussi supporté par MSXgl et utilisé dans le jeu Tetpuz et Crawlers.

Eggy's Maze utilise effectivement la mémoire intégrée a l'horloge interne des MSX 2. Elle est minuscule (quelques octets) et effectivement partagé par toutes les applications. Cette contrainte fait que paradoxalement elle est très peu utilisé et les risques de conflits sont donc minime. Dans MSXgl, j'ai ajouté un système de signature pour que le jeu puisse vérifier que les données sont celles du jeu en cours. Edité par aoineko Le 25/11/2023 à 17h37


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

Touriste

Rang

Avatar

Inscrit le : 11/10/2023 à 19h25

Messages: 66

Le 25/11/2023 à 20h03
La sauvegarde dans la zone horloge, c'est un peu chaud quand même, personnellement je ne m'y risquerais pas.

La solution SRAM est bien mieux (tu supportes vraiment une tonne de trucs dans MSXgl, pourquoi je m'emmerde en assembleur moi ?).
Le seul inconvénient que je vois est pour quelqu'un qui souhaite faire une vraie cartouche.

Sinon on peut peut-être sauver tout bêtement sur disquette ? Avec une disquette dédiée dont on lit/écrit les premiers secteurs, sans se soucier du FS. Avec un « magic » écrit à l'init de la disquette, puis un checksum sur chaque fichier pour éviter de charger / écrire n'importe quelle disquette. Edité par zone Le 25/11/2023 à 20h04
   
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie