La Place des Développeurs Mode 1 et Mode 2 Test de codage du MSX en C
Bonjour,
j'aurais besoin d'un renseignement, à savoir des infos sur les modes graphiques 1 et 2. Je suis en train de développer une librairie en C pour MSX, j'arrive à afficher des sprites par exemple et j'essaye de porter mes fonds graphiques Coleco sur MSX. Pour cela il faudrait que j'active le mode 2
Le mode graphique 2 est il dédié uniquement au MSX 2 ?
Quelqu'un ici à t'il déja compilé une ROM avec SDCC ? (En effet ma rom compilée fonctionne sous MSX1 mais pas sous MSX2 ....)
Bref je fais quelques expérimentation,et pour le moment c'est un peut compliqué ...
j'aurais besoin d'un renseignement, à savoir des infos sur les modes graphiques 1 et 2. Je suis en train de développer une librairie en C pour MSX, j'arrive à afficher des sprites par exemple et j'essaye de porter mes fonds graphiques Coleco sur MSX. Pour cela il faudrait que j'active le mode 2
Le mode graphique 2 est il dédié uniquement au MSX 2 ?
Quelqu'un ici à t'il déja compilé une ROM avec SDCC ? (En effet ma rom compilée fonctionne sous MSX1 mais pas sous MSX2 ....)
Bref je fais quelques expérimentation,et pour le moment c'est un peut compliqué ...
Jipe :
le mode 2 ou GR2 est le screen 2 sur MSX
16 couleurs 256 x 192 pixels + sprites 8x8 ou 16x16
16 couleurs 256 x 192 pixels + sprites 8x8 ou 16x16
Ok, j'ai donc bien un problème, j'arrive à charger la définition des caractères, ainsi que le "name", mais pas les couleurs des caractères ... Je ne comprends pas pourquoi ...
#define T32NAM 0xF3C7
#define T32COL 0xF3C9
#define T32CGP 0xF3CB
#define T32ATR 0xF3CD
#define T32PAT 0xF3CF
J'initialise le mode 2 :
void screen_mode_2()
{
__asm
ld a,#0x02
call 0x005F ; --- go to screen 2
call 0x00CC ; --- erase function keys
__endasm;
}
Je charge, le NAME = Les caractères dans l'écran
vpoke_block(peek_word(T32NAM),NAME,48*16);
Je charge la définition des caractères dans les 3 banks du mode 2
vpoke_block(peek_word(T32CGP),PATTERN,128*16);
vpoke_block(peek_word(T32CGP)+2048,PATTERN,128*16);
vpoke_block(peek_word(T32CGP)+4096,PATTERN,128*16);
Je charge la palette des caractères dans les 3 banks couleurs du mode 2 ... Et ça marche pas pour les couleurs ..
vpoke_block(peek_word(T32COL),COLOR,128*16);
vpoke_block(peek_word(T32COL)+2048,COLOR,128*16);
vpoke_block(peek_word(T32COL)+4096,COLOR,128*16);
Les fichiers viennent de mon Bomb Jack sur Coleco, on voit bien apparaitre le graphisme de mon niveau, mais en "monochrome".
Si jamais quelqu'un à une idée ...
Bon, j'ai trouvé, c'est ma routine d'initialisation des sprites que j'ai récupéré qui fait sauter le mode 2 et repasse en mode 1 à savoir :
spritesize permet de savoir si on fait des sprites de 8*8 ou 16*16 et le zoom si on double ou pas la taille du sprite ... Le problème c'est que pour le moment, je ne comprend pas ce que fait cette routine et pourquoi ça repasse en mode 1
Si quelqu'un saurait m'éclairer ...
void setup_sprites(char spritesize, char zoom){
__asm
ld b,#0x00
ld a,4(ix)
and #0x0f
cp #0x08
jr z,$1
set 1,b ; --- if 16x16 sprites => set bit 1
$1:
ld a,5(ix)
cp #0x00
jr z, $2
set 0,b ; --- if zoom sprites => set bit 0
$2:
ld hl,#0xf3e0 ; --- read vdp(1) from mem
ld a,(hl)
and #0xfc
or b
ld (hl),a
call 0x007b ; --- change vdp(1) bits
ld a,#0x01
ld hl,#0xfcaf
ld (hl),a
call 0x0069 ; --- reset sprite attributes
__endasm;
}
Edit : j'ai trouvé ... call 0x007b ; --- change vdp(1) bits doit être changé en call 0x007e ; --- change vdp(1) bits Edité par bfg Le 24/10/2012 à 20h21
spritesize permet de savoir si on fait des sprites de 8*8 ou 16*16 et le zoom si on double ou pas la taille du sprite ... Le problème c'est que pour le moment, je ne comprend pas ce que fait cette routine et pourquoi ça repasse en mode 1


void setup_sprites(char spritesize, char zoom){
__asm
ld b,#0x00
ld a,4(ix)
and #0x0f
cp #0x08
jr z,$1
set 1,b ; --- if 16x16 sprites => set bit 1
$1:
ld a,5(ix)
cp #0x00
jr z, $2
set 0,b ; --- if zoom sprites => set bit 0
$2:
ld hl,#0xf3e0 ; --- read vdp(1) from mem
ld a,(hl)
and #0xfc
or b
ld (hl),a
call 0x007b ; --- change vdp(1) bits
ld a,#0x01
ld hl,#0xfcaf
ld (hl),a
call 0x0069 ; --- reset sprite attributes
__endasm;
}
Edit : j'ai trouvé ... call 0x007b ; --- change vdp(1) bits doit être changé en call 0x007e ; --- change vdp(1) bits Edité par bfg Le 24/10/2012 à 20h21
Sector28 :
pour "rester" en screen 2, il faut faire CALL #7E
Code :
SCREEN 1:DEFUSR=&H7E:X=USR(0)
Yep, merci !! Ca marche bien !
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie