MSX Village forum

La Place des Développeurs Besoin de "snippet' Pour terminer le développement d'un jeu ...

bfg Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 05/08/2011 à 10h02

Messages: 58

Le 20/10/2013 à 14h47
Bonjour,

je suis en train de finir l'adaptation de Lock'n chase sur MSX. Mais pour rendre le tout propre et optimisé, j'aurais besoin de quelques tuyaux.

Par exemple, lorsque je change de jeu de caractère, on vois le tout se redessiné à l'écran, sur Coleco, j'ai 2 routine screen_off() et screen_on() qui désactive l'affichage (écran noir) pendant que je trace mes décors par exemple.

Auriez vous une routine assembleur qui fait ceci ? Je pourrais l'implémenter dans ma librairie C.

Ensuite pour écrire des phrases voici ce que j'utilise. Ce n'est pas du tout optimisé .. et mes chaines doivent se terminer par le caractère '!'.
Vous auriez un appel bios ou autre ?

Voici le code nom optimisé (routine print_at) :

void put_char(unsigned char x,unsigned char y,unsigned char chr) {
int offset;
if ((x>32) || (y>24)) return;
offset = (y<<5)+x;
vpoke(peek_word(GRPNAM)+offset,chr);
}

void print_at(char x,char y, char *txt){
unsigned char i;
unsigned char c;

i=0;
c = (*txt);
while (c!='!')
{
put_char(x+i,y,c);
txt++;
c = (*txt);
i++;
}
}

Merci d'avance !
bfg Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 05/08/2011 à 10h02

Messages: 58

Le 20/10/2013 à 17h43
Au passage, je sais que j'exagère ... Quelqu'un pourrait il essayer cette rom sur une vrai machine ? (Je n'ai hélas pas de matériel pour faire cela), et me dire si ça tourne ? result.zip
metalgear2 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 27/11/2010 à 23h40

Messages: 2768

Le 20/10/2013 à 18h50
Bonjour,

En tout cas, ça tourne sous BlueMSX.

C'est plus facile de faire des essais avec lui que sur une vrai eprom car l'eprom, il faut l'éffacer a chaque essais.



Mon site consacré au MSX : http://mymsx2.free.fr
Site web    
bfg Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 05/08/2011 à 10h02

Messages: 58

Le 20/10/2013 à 19h00
metalgear2 :
Bonjour,



En tout cas, ça tourne sous BlueMSX.



C'est plus facile de faire des essais avec lui que sur une vrai eprom car l'eprom, il faut l'éffacer a chaque essais.




Oui, en fait, je me demandais si quelqu'un qui avait un genre d'atarimax sur MSX pouvait tester ... Au pire je vais essayer de transformer la rom en .wav et voir si elle passe en version "K7" ...(Mais bon, tout marche pas comme ça de toutes façons ...)
Fabf Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 24/08/2010 à 20h55

Messages: 4833

Le 20/10/2013 à 19h18
Il me semble qu'il y a plus simple

DEFUSR=&H41:X=USR(0)Ecran noir. Permet de construire un dessin sans que ça se voit
DEFUSR=&H44:X=USR(0)Ré affiche l'écran caché

source : MSXVillage :lol
http://www.msxvillage.fr/forum/topic.php?id=1685#m37115
bfg Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 05/08/2011 à 10h02

Messages: 58

Le 20/10/2013 à 19h36
Fabf :
Il me semble qu'il y a plus simple



DEFUSR=&H41:X=USR(0) Ecran noir. Permet de construire un dessin sans que ça se voit

DEFUSR=&H44:X=USR(0) Ré affiche l'écran caché



source : MSXVillage :lol

http://www.msxvillage.fr/forum/topic.php?id=1685#m37115




Hum ... Ca donne quoi en assembleur :) :) (Je rêve, je demande du code assembleur ... :D )





Edit :



Merci, merci, merci !! Ca donne ça et ça marche !! ;)



void screen_on()

{

__asm



call 0x0044



__endasm;

}



void screen_off()

{

__asm



call 0x0041



__endasm;



} Edité par bfg Le 20/10/2013 à 19h45
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 21/10/2013 à 11h12
bfg :
Vous auriez un appel bios ou autre ?


En mode texte, il y a l'appel BIOS à la routine CHPUT en 00A2h, l'accumulateur contenant le caractère à imprimer.


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

Touriste

Rang

Avatar

Inscrit le : 25/06/2013 à 17h49

Messages: 192

Le 21/10/2013 à 15h00
bfg :
Fabf :
Il me semble qu'il y a plus simple



DEFUSR=&H41:X=USR(0) Ecran noir. Permet de construire un dessin sans que ça se voit

DEFUSR=&H44:X=USR(0) Ré affiche l'écran caché



source : MSXVillage :lol

http://www.msxvillage.fr/forum/topic.php?id=1685#m37115




Hum ... Ca donne quoi en assembleur :) :) (Je rêve, je demande du code assembleur ... :D )





Edit :



Merci, merci, merci !! Ca donne ça et ça marche !! ;)



void screen_on()

{

__asm



call 0x0044



__endasm;

}



void screen_off()

{

__asm



call 0x0041



__endasm;



}






Pour faire un "Print" sans passer par le Bios (car je n'ai jamais essaye en screen 2), ca donne un truc du genre:







ld d,3 ; Y Location

ld e,3 ; X Location

ld bc,string ; Chaine a afficher

call printat



string:

db "TEST","!"



printat:

ld a,d ;D= Y POSITIOn (0 to 23)

rrca

rrca

rrca

ld d,a

and %11100000

or e ;E = X Position (0 to 31)

ld l,a

ld a,d

and %11

ld h,a

ld de,sc2tnp

add hl,de

push hl

pop de

call vpoke

print_loop:

ld a,(bc)

cp "!"

ret z

out (#98),a

inc bc

jp print_loop



vpoke:

ld a,d

and %11000000

rlca

rlca

dovpoke:

out (#99),a

ld a,128+14

out (#99),a



vpoke:

ld a,e

out (#99),a

ld a,d

and %00111111

or %01000000

out (#99),a

ret
Site web    
bfg Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 05/08/2011 à 10h02

Messages: 58

Le 21/10/2013 à 21h41
Alors en fait, j'ai fait ça :

void put_vram(void* block,unsigned int vramaddr,unsigned int size)
{
__asm

ld l,4(ix);
ld h,5(ix);
ld e,6(ix);
ld d,7(ix);
ld c,8(ix);
ld b,9(ix);
call 0x005c;

__endasm;
}

void print_at(char x,char y, unsigned char *txt){
unsigned char nb;
unsigned char *ptr;
int offset;
nb=0;
ptr = txt;

while ((*ptr)!=0) // Calcule le nombre de caractères de la chaine
{
ptr++;
nb++;
}

offset = peek_word(GRPNAM)+((y<<5)+x);// Calcule l'endroit ou affiche la chaine en video
put_vram(txt,offset,(unsigned int)nb);

}

Il faut bien entendu avoir chargé en charset avec des caractères en mémoire.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie