La Place des Développeurs Do The Same - MSX
aoineko
Membre non connecté
Conseiller Municipal
Reprise du message précédent
Pour la palette, chaque puce graphique (VDP) a ses propres réglages de couleur.La plupart des ordinateurs MSX1 sont équipés de la puce Texas Instruments TMS9918, mais certains utilisent des clones avec des réglages de couleurs légèrement différents (comme le Toshiba T6950 ou le Yamaha YM2220). Sur MSX1 on ne peut rien y faire.
Les MSX2 sont eux généralement équipés d'un Yamaha V9938 qui a effectivement des réglages de bases assez différent du TMS9918. Mais là, on y peut quelque chose puisqu'à partir du MSX2, la palette de 16 couleurs peut être redéfinie. Il est donc tout à fait possible pour un programme de détecter au démarrage si l'ordinateur est équipé d'un VDP MSX2 (ou plus) et si c'est le cas, de redéfinir les 16 couleurs pour les faire correspondre à des réglages proches de ceux des MSX1. Ce n'est pas trivial à faire, mais si ça t'intéresse, j'ai tout le code qu'il faut pour faire ça dans ma lib.
Les couleurs de la palette du MSX2 sont définies sur 9-bits (3-bits par canal rouge-vert-bleu) et stocker sur 16-bits dans le VDP.
On doit pouvoir trouver les valeurs à mettre pour s'approcher au plus près des couleurs du MSX1.
EDIT: Pour visualiser la différence...
TMS9918 | V9938 |
EDIT2: Voici les valeurs de la palette MSX2 d'origine et les valeurs pour s'approcher des couleurs du MSX1
Palette MSX2 d'origine | Palette MSX2 style MSX1 |
Code TEXT : + R + G + B 0 | 0 | 0 | 0 1 | 0 | 0 | 0 2 | 1 | 6 | 1 3 | 3 | 7 | 3 4 | 1 | 1 | 7 5 | 2 | 3 | 7 6 | 5 | 1 | 1 7 | 2 | 6 | 7 8 | 7 | 1 | 1 9 | 7 | 3 | 3 10 | 6 | 6 | 1 11 | 6 | 6 | 4 12 | 1 | 4 | 1 13 | 6 | 2 | 5 14 | 5 | 5 | 5 15 | 7 | 7 | 7 |
Code TEXT : + R + G + B 0 | 0 | 0 | 0 1 | 0 | 0 | 0 2 | 1 | 5 | 1 3 | 3 | 6 | 3 4 | 2 | 2 | 6 5 | 3 | 3 | 7 6 | 5 | 2 | 2 7 | 2 | 6 | 7 8 | 6 | 2 | 2 9 | 6 | 3 | 3 10 | 5 | 5 | 2 11 | 6 | 6 | 3 12 | 1 | 4 | 1 13 | 5 | 2 | 5 14 | 5 | 5 | 5 15 | 7 | 7 | 7 |
On est toujours ignorant avant de savoir.
Merci les zamis
Dans le village, il y a plein de 'pointures' qui sont en plus pédagogues Ca aide. Merci à eux
Pour mon probleme de synchro, j'avais laissé dans la boucle du jeu un afficheur qui n'avait plus lieu d'etre là (pour des tests). J'ai enlevé la routine et c'est good à nouveau
Concernant les couleurs, même en screen2, je peux changer la palette ?
Je suis en train de tester le type de machine 0x002d et je me renseigne sur la palette
A+ pour un autre épisode
Suisse 0 - Espagne 1
Dans le village, il y a plein de 'pointures' qui sont en plus pédagogues Ca aide. Merci à eux
Pour mon probleme de synchro, j'avais laissé dans la boucle du jeu un afficheur qui n'avait plus lieu d'etre là (pour des tests). J'ai enlevé la routine et c'est good à nouveau
Concernant les couleurs, même en screen2, je peux changer la palette ?
Je suis en train de tester le type de machine 0x002d et je me renseigne sur la palette
A+ pour un autre épisode
Suisse 0 - Espagne 1
aoineko
Membre non connecté
Conseiller Municipal
Sur MSX2, les modes écran (y compris ceux hérités du MSX1) utilisent la même palette de 16 couleurs redéfinissables.
Les modes 4-bits par couleur utilisent toutes les 16 entrées (0-15), le mode 2-bits par couleur, uniquement les 4 premières entrées (0-3), et le mode 1-bit (monochrome) utilise 2 couleurs dont l'index est définie dans des registres du VDP.
La seule exception c'est le mode écran 8, qui n'utilise pas la palette (chaque pixel est représenté par 1 octet qui stock les valeurs rouge-vert-bleu).
Donc si tu redéfinies la palette MSX2 pour la faire ressembler à celle du MSX1, ton jeu aura à peu près les mêmes couleurs sur tous les MSX.
Sur MRC, j'ai trouvé une routine assembleur pour initialiser la palette MSX2 avec des couleurs proches du MSX1.
A mon avis, tu pourrais la mettre tel quelle au début de ton programme et tu n'as peut-être même pas besoin de détecter le MSX2 car sur MSX1, le code ne va probablement juste rien faire.
Si tu as besoin d'un coup de main pour la convertir en assembleur en ligne pour SDCC, dis-moi.
Bon match
Les modes 4-bits par couleur utilisent toutes les 16 entrées (0-15), le mode 2-bits par couleur, uniquement les 4 premières entrées (0-3), et le mode 1-bit (monochrome) utilise 2 couleurs dont l'index est définie dans des registres du VDP.
La seule exception c'est le mode écran 8, qui n'utilise pas la palette (chaque pixel est représenté par 1 octet qui stock les valeurs rouge-vert-bleu).
Donc si tu redéfinies la palette MSX2 pour la faire ressembler à celle du MSX1, ton jeu aura à peu près les mêmes couleurs sur tous les MSX.
Sur MRC, j'ai trouvé une routine assembleur pour initialiser la palette MSX2 avec des couleurs proches du MSX1.
A mon avis, tu pourrais la mettre tel quelle au début de ton programme et tu n'as peut-être même pas besoin de détecter le MSX2 car sur MSX1, le code ne va probablement juste rien faire.
Code ASM :
; Routine to set colors palette MSX1 like VDP_DW equ 00007h RG16SAV equ 0FFEFh MSX1palette: ld a,(VDP_DW) ld c,a ; C= CPU port connected to the VDP writing port #1 xor a ; Set color 0 ... di out (c),a ld (RG16SAV),a ld a,80h+16 ; ...into register 16 (+80h) out (c),a ei inc c ; C= CPU port connected to the VDP writing port #2 ld b,31 ld hl,MSX1paletteData otir ret MSX1paletteData: db 00h,0 ; Color 0 db 00h,0 ; Color 1 db 11h,5 ; Color 2 db 33h,6 ; Color 3 db 26h,2 ; Color 4 db 37h,3 ; Color 5 db 52h,2 ; Color 6 db 27h,6 ; Color 7 db 62h,2 ; Color 8 db 63h,3 ; Color 9 db 52h,5 ; Color A db 63h,6 ; Color B db 11h,4 ; Color C db 55h,2 ; Color D db 55h,5 ; Color E db 77h,7 ; Color F
Si tu as besoin d'un coup de main pour la convertir en assembleur en ligne pour SDCC, dis-moi.
Bon match
On est toujours ignorant avant de savoir.
Ah la Suisse, j'y croyais...
Pour la routine, c'est justement sur celle-ci que je me suis attardé
Ma conversion ASM pour SDCC
#define VDP_DW 0x0007
#define RG16SAV 0xFFEF
const unsigned char MSX1paletteData[] = {
0x00,0, // Color 0
0x00,0, // Color 1
0x11,5, // Color 2
0x33,6, // Color 3
0x26,2, // Color 4
0x37,3, // Color 5
0x52,2, // Color 6
0x27,6, // Color 7
0x62,2, // Color 8
0x63,3, // Color 9
0x52,5, // Color A
0x63,6, // Color B
0x11,4, // Color C
0x55,2, // Color D
0x55,5, // Color E
0x77,7 // Color F
};
void MSX1palette(void) __naked
{
__asm
ld a,(VDP_DW)
ld c,a // C= CPU port connected to the VDP writing port #1
xor a // Set color 0 ...
di
out (c),a
ld (RG16SAV),a
ld a,#0x80+16 // ...into register 16 (+80h)
out (c),a
ei
inc c // C= CPU port connected to the VDP writing port #2
ld b,#31
ld hl,#_MSX1paletteData
otir
ret
__endasm;
}
Je n'ai pas vu de changement !
J'ai essayé meisei (msx1) - catapult (8245, msx2) - bluemsx (msx2+)...
J'y retourne
Pour la routine, c'est justement sur celle-ci que je me suis attardé
Ma conversion ASM pour SDCC
#define VDP_DW 0x0007
#define RG16SAV 0xFFEF
const unsigned char MSX1paletteData[] = {
0x00,0, // Color 0
0x00,0, // Color 1
0x11,5, // Color 2
0x33,6, // Color 3
0x26,2, // Color 4
0x37,3, // Color 5
0x52,2, // Color 6
0x27,6, // Color 7
0x62,2, // Color 8
0x63,3, // Color 9
0x52,5, // Color A
0x63,6, // Color B
0x11,4, // Color C
0x55,2, // Color D
0x55,5, // Color E
0x77,7 // Color F
};
void MSX1palette(void) __naked
{
__asm
ld a,(VDP_DW)
ld c,a // C= CPU port connected to the VDP writing port #1
xor a // Set color 0 ...
di
out (c),a
ld (RG16SAV),a
ld a,#0x80+16 // ...into register 16 (+80h)
out (c),a
ei
inc c // C= CPU port connected to the VDP writing port #2
ld b,#31
ld hl,#_MSX1paletteData
otir
ret
__endasm;
}
Je n'ai pas vu de changement !
J'ai essayé meisei (msx1) - catapult (8245, msx2) - bluemsx (msx2+)...
J'y retourne
aoineko
Membre non connecté
Conseiller Municipal
Le mieux est de tester avec OpenMSX avec les profils de vrais modèles de MSX (perso, j'utilise le Canon V20 comme réf de MSX1 PAL et le Philipps VG-8235 comme réf de MSX2 PAL).
C'est le seul émulateur ou je suis sûr qu'il gère correctement la palette de chaque puce graphique des MSX (même les clones de TMS9918/V9938).
C'est le seul émulateur ou je suis sûr qu'il gère correctement la palette de chaque puce graphique des MSX (même les clones de TMS9918/V9938).
On est toujours ignorant avant de savoir.
Voici une capture écran faite avec à gauche un msx1 (canon v20) et à droite msx2 (8245)
on voit la différence avec le bleu et le rouge des carottes par exemple.
le passage en screen5 serait-il le bienvenu ?
A+ et bon weekend
on voit la différence avec le bleu et le rouge des carottes par exemple.
le passage en screen5 serait-il le bienvenu ?
A+ et bon weekend
Salut Ricco
si tu passe en screen5 il y aura plusieurs inconvénients
- ce ne sont plus des tiles 8x8 a gérer mais du bitmap, il faut donc se créer le tiles dans une page et faire des COPY d'une page vers l'autre
- tu ne seras plus "compatible" avec les règles 2021 du MSXdev il faudra attendre le version 2022 qui est plus libre
si tu redéfinit la palette au tout début de ton programme ça doit fonctionner
je l'ai dèja fait en basic avec des jeux MSX1 ayant un loader basic et des .bin
en utilisant des COLOR=(N°de palette,rouge,vert,bleu)
si tu passe en screen5 il y aura plusieurs inconvénients
- ce ne sont plus des tiles 8x8 a gérer mais du bitmap, il faut donc se créer le tiles dans une page et faire des COPY d'une page vers l'autre
- tu ne seras plus "compatible" avec les règles 2021 du MSXdev il faudra attendre le version 2022 qui est plus libre
si tu redéfinit la palette au tout début de ton programme ça doit fonctionner
je l'ai dèja fait en basic avec des jeux MSX1 ayant un loader basic et des .bin
en utilisant des COLOR=(N°de palette,rouge,vert,bleu)
Effectivement,
Mes doigts sont allés plus vite que mon cerveau : j'etais resté sur SCREEN8 et 256Couleurs. Pour moi SCREEN5 etait aussi en tiles... stoupid idiot comme dirait Benny Hill LOL
Je vais y jeter un oeil dans la soirée
Mes doigts sont allés plus vite que mon cerveau : j'etais resté sur SCREEN8 et 256Couleurs. Pour moi SCREEN5 etait aussi en tiles... stoupid idiot comme dirait Benny Hill LOL
Je vais y jeter un oeil dans la soirée
Il me reste un peu moins de 2ko hihihi
Non, je v m'attacher à ce pb de couleurs en modifiant la palette de 16 couleurs msx2 pour rendre la palette 'identique' à celle du msx1
Non, je v m'attacher à ce pb de couleurs en modifiant la palette de 16 couleurs msx2 pour rendre la palette 'identique' à celle du msx1
aoineko
Membre non connecté
Conseiller Municipal
Comme dis Jipe, si tu utilises les fonctions du Bios pour passer en Screen 2, il n'est pas impossible que le Bios réécrase la palette à ce moment-là pour mettre la palette MSX2 par défaut.
Test de mettre ta fonction MSX1palette() après le passage en Screen 2.
Test de mettre ta fonction MSX1palette() après le passage en Screen 2.
On est toujours ignorant avant de savoir.
Il y a qd meme un truc que je ne m'explique pas :
La color table est en 0x2000.
Sur OpenMSX debugger (VDP registers view V9938) c'est pareil.
Mais sur https://www.msx.org/wiki/VDP_Color_Palette_Registers, dans la partie Storage of palette in VRAM, la palette est stockée en 0x1B80 pour un screen2
Je n'ai pas du comprendre la subtilité
concernant mon passage en mode screen2, j'utilise
call INIGRP (0x0072) et ensuite
MSX1palette()
Je decouvre, je perds mes cheveux mais c'est l'éclate totale HIHIHIHI
La color table est en 0x2000.
Sur OpenMSX debugger (VDP registers view V9938) c'est pareil.
Mais sur https://www.msx.org/wiki/VDP_Color_Palette_Registers, dans la partie Storage of palette in VRAM, la palette est stockée en 0x1B80 pour un screen2
Je n'ai pas du comprendre la subtilité
concernant mon passage en mode screen2, j'utilise
call INIGRP (0x0072) et ensuite
MSX1palette()
Je decouvre, je perds mes cheveux mais c'est l'éclate totale HIHIHIHI
aoineko
Membre non connecté
Conseiller Municipal
La palette n'est pas stocké en VRAM, mais dans une mémoire spéciale de 32 octets dans le VDP et uniquement accessible via un registre dédié.
Elle représente les valeurs rouge-vert-bleu de chaque index (numéro de couleur).
A priori, le BASIC stock effectivement ces valeurs en VRAM, mais c'est spécifique au BASIC et ça n'a aucun intérêt dans ton cas.
Seul les valeurs enregistrées dans le VDP vont influencer l'affichage.
En VRAM, par contre, tu as la Pattern Colors Table, utilisé par les modes écrans 1 à 4, qui représente les index de couleurs utilisées par les tiles.
On y trouve aussi les informations d'index de couleurs des sprites.
Elle représente les valeurs rouge-vert-bleu de chaque index (numéro de couleur).
A priori, le BASIC stock effectivement ces valeurs en VRAM, mais c'est spécifique au BASIC et ça n'a aucun intérêt dans ton cas.
Seul les valeurs enregistrées dans le VDP vont influencer l'affichage.
En VRAM, par contre, tu as la Pattern Colors Table, utilisé par les modes écrans 1 à 4, qui représente les index de couleurs utilisées par les tiles.
On y trouve aussi les informations d'index de couleurs des sprites.
On est toujours ignorant avant de savoir.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie