La Place des Développeurs Besoin de "snippet' Pour terminer le développement d'un jeu ...
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 !
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 !
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
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.
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.
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.
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
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
http://www.msxvillage.fr/forum/topic.php?id=1685#m37115
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
http://www.msxvillage.fr/forum/topic.php?id=1685#m37115
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
http://www.msxvillage.fr/forum/topic.php?id=1685#m37115
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
http://www.msxvillage.fr/forum/topic.php?id=1685#m37115
Hum ... Ca donne quoi en assembleur (Je rêve, je demande du code assembleur ... )
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
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)
bfg :
Hum ... Ca donne quoi en assembleur (Je rêve, je demande du code assembleur ... )
Edit :
Merci, merci, merci !! Ca donne ça et ça marche !!
void screen_on()
{
__asm
call 0x0044
__endasm;
}
void screen_off()
{
__asm
call 0x0041
__endasm;
}
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
http://www.msxvillage.fr/forum/topic.php?id=1685#m37115
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
http://www.msxvillage.fr/forum/topic.php?id=1685#m37115
Hum ... Ca donne quoi en assembleur (Je rêve, je demande du code assembleur ... )
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
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.
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