MSX Village forum

La Place des Développeurs Projet Carwar

MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 781

Le 25/01/2011 à 17h06

Reprise du message précédent

:lol Bien vu Guil'

J'ai voulu teste en basic mais des valeurs du style &h8000+&h7600... il aime pas trop apparemment :moue

Désolé va falloir tester en ASM direct


Le MSXien le plus à l'ouest :fou ... ou presque :D
osaurer
   
MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 781

Le 25/01/2011 à 19h34
Je suis perplexe, je ne comprends pas ce qui ne fonctionne pas dans ce petit programme (pour tester les collisions en page 1).

Les valeurs &h7XXX sont pour les sprites en page0, Les valeurs en &hFXXX pour les sprite en page1 ( &h7XXX+&h8XXX=&HFxxx)

D'une part la génération de sprite en page 1 ne fonctionne pas :'( (alors qu'on allume facilement un point en page1 par un vpoke&h8111,15)

D'autre part les sprites s'affichent en blanc alors que je leurs alloue une couleur (Jaune et rouge)

Que n'ai-je point compris, y a-t-il une limite provoqué par le MSX Basic, le colonel Moutarde a-t-il tué le Professeur Violet avec le chandelier dans la bibliothèque :hum :fou Vous le saurez en suivant nos prochain posts! :|

Code BASIC :
10 SCREEN 5,1:SETPAGE0,0:CLS:'OPEN"grp:"FOROUTPUTAS#1
12 DEFINT A-Z
15 ONSPRITE GOSUB600
20 FORI=&H7800TO&H7807:VPOKEI,255:NEXT
30 FORI=&HF800TO&HF807:VPOKEI,255:NEXT
40 FORI=&H7600TO&H7607:READL:VPOKEI,L:NEXT
50 FORI=&HF600TO&HF607:READL:VPOKEI,L:NEXT
56 'SETPAGE1,1
57 FORI=&H7800TO&H7807:VPOKEI,255:NEXT
60 FORI=0TO240
70 VPOKE&H7601,I:VPOKE&H7605,240-I
80 VPOKE&HF601,I:VPOKE&HF605,240-I
90 SPRITE ON
100 NEXT
200 GOTO 200
500 DATA 50,0,0,8,80,240,0,10
510 DATA 50,0,0,8,50,240,0,10
600 SPRITEOFF:BEEP:RETURN


:oups OUF! J'ai bien failli oublié d'envoyer le code avec toutes ces âneries! :D


Le MSXien le plus à l'ouest :fou ... ou presque :D
osaurer
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 25/01/2011 à 21h23
Pourriez vous juste me confirmer que switcher les pages mémoires est assez léger pour pouvoir en faire une dizaine par frame ? :hum

(pour les sprites en page 1, j'essayerai en C après avoir fini la gestion des 2 pages graphiques)


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

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1503

Le 25/01/2011 à 22h08
Je ne comprends pas la structure mémoire de ton jeu :hum
Si c'est une ROM 32Ko, d'ou viennent les 64Ko de données graphique ? D'une disquette ? D'une décompression à partir de la ROM ?

Je ne sais pas si on peut switcher plusieurs fois par frame les banks (je suppose que oui), mais ce qui est sur, c'est que :

1. Si tout l'espace mémoire du Z80 est occupé par des données graphiques ... Où est ton code ? Au moment ou tu vas switcher, le Z80 va poursuivre l'exécution commencée en incrémentant le registre PC, et il va aller chercher une instruction au beau milieu de tes données graphiques : plantage !!!

2. Transférer 64Ko de la RAM vers la VRAM prends beaucoup de temps. Pour info, l'instruction HMMM, qui est une instruction rapide, vu qu'elle ne travaille que sur la VRAM, transfère environ 3600 octets par frame (par 50e de seconde). Imaginons qu'avec HMMC, on descende à 2400 octets/50e de seconde, transférer 64Ko va te prendre 27 frames, soit un peu plus d'une demi-seconde (ce n'est qu'une estimation). Impossible dans ces conditions de le faire plusieurs fois par frame.

3. Tu peux mettre de la RAM en page 0 si tu n'utilises pas le BIOS mais il ne faut pas oublier que la gestion des interruptions se fait dans le BIOS. Donc, soit tu interdit les interruptions pendant que tu as de la RAM en page 0, mais alors tu perds la possibilité d'utilser le hook H.TIMI, soit tu écris ta propre routine de gestion en $0038, mais tu devras alors gérer une alternance entre ta routine d'interruption (quand tu switches la RAM) et celle du BIOS (quand tu switches la ROM). Plutôt casse-tête, sans compter que tu pers alors un peu d'espace pour tes données graphiques dans la page 0.

Je pense qu'il faut que tu sois plus réaliste sur le mode graphique : le SCREEN 8 est beaucoup trop gourmand en mémoire pour être utilisé dans un double buffering graphique. Il vaut mieux se rabattre sur un mode graphique moins gourmand (SCREEN 5 est généralement un bon compromis), ou alors définir une fenêtre graphique plus réduite (voire même les 2).

Pour gagner en vitesse, il faut absolument que toutes tes données graphiques soit chargées en VRAM à l'initialisation du programme, et que tu n'aies plus ensuite qu'à les manipuler dans la VRAM avec les macro du VDP. D'où l'intérêt d'utiliser un mode graphique qui t'offre plus que 2 pages ...


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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 26/01/2011 à 09h48
Les voitures prennent 13(largeur) x 11(hauteur) x 16(étape de rotation) x 4(nombre de voiture) = environs 9Ko. Les circuits seront fait par assemblage de blocs 16x16 compressé (4 bits) et ré-orientable (un virage ne sera en mémoire qu'une seule fois). Imaginons que j'ai 32 blocs, cela fait 16(largeur) x 16(hauteur) x 0.5(compression) x 32(nombre de block) = 4Ko. Du coup, je pense que cela peut rentrer sans problème dans les 32 Ko d'une cartouche.



Pour ce qui est des performances, une fois que le fond de mon circuit est en RAM, je n'ai besoin d'effacer que 4 blocs de 13x11 avec le fond à l'ancienne place de mes voitures, puis ré-afficher mes 4 blocs de 13x11 à leur nouvelle place.



Reste le problème de la perte du code au moment du switch... ça m'avait complètement échappé. :fou



Du coup, j'imagine une architecture du genre :



En temps normal :

Page 0 : [Slot 0-0 - BIOS]

Page 1 : [Slot 1-0 - ROM] // Point d'entrée du code (qui jump direct en page 2) et données

Page 2 : [Slot 1-0 - ROM] // Code et données

Page 3 : [Slot 3-1 - RAM] // Informations gameplay (position voiture, temps, etc.)




Au moment d'effacer mes sprites avec la partie haute du décors, je switcherai sur :

Page 0 : [Slot 3-1 - RAM] // Partie haute...

Page 1 : [Slot 3-1 - RAM] // ... du circuit

Page 2 : [Slot 1-0 - ROM] // Code et données

Page 3 : [Slot 3-1 - RAM] // Informations gameplay (position voiture, temps, etc.)




Et au moment d'effacer mes sprites avec la partie basse du décors, je switcherai sur :

Page 0 : [Slot 3-2 - RAM] // Partie basse...

Page 1 : [Slot 3-2 - RAM] // ... du circuit

Page 2 : [Slot 1-0 - ROM] // Code et données

Page 3 : [Slot 3-1 - RAM] // Informations gameplay (position voiture, temps, etc.)




Comme ça, j'ai toujours le code et mes informations gameplay en mémoire et ça m'oblige juste à faire l'effacement en 2 fois pour les sprites à cheval sur la partie haute et la partie basse de l'écran. Donc au pire, si les 4 voitures sont en mouvement et à cheval sur la moitié de l'écran, ça fait 8 HMMC pour effacer avec le fond et 4 pour réafficher les voitures.



EDIT : Ceci dit, si je n'utilise pas les sprites, il me reste 44*256 pixel libre en bas de chacune des 2 pages graphiques, non ? Si je peux les utiliser librement (?) ça me permettrait d'y stocker mes sprites pour accélérer leur affichage. Edité par aoineko Le 26/01/2011 à 10h08


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

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1503

Le 26/01/2011 à 22h03
Aoineko ... Ce n'est pas encore suffisamment clair pour pouvoir te répondre sur la faisabilité :sick

Je voudrais comprendre ta gestion graphique, est-ce que tu pourrais la détailler (étape par étape) ?
Est-ce que tu recopies tout le fond d'écran (64Ko) à chaque fois que tes sprites bougent ?
Ou est-ce que tu ne recopies que le rectangle dans lequel le sprite a bougé ?

Je persiste et j'insiste : la meilleure solution (et de loin), c'est d'avoir toutes les données en VRAM et de ne plus avoir à les manipuler qu'à travers des macro du VDP opérant directement sur la VRAM. Et le meilleur mode graphique, le plus flexible et celui qui permet d'avoir plus d'espace en VRAM, c'est le mode SCREEN 5.

PS : Et ta division du switch vers la RAM en 2 parties ne résoud toujours pas le problème posé par la routine de gestion des interruptions. Soit tu interdit les interruptions pendant ce switch, soit tu vas devoir les gérer toi même.


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10730

Le 26/01/2011 à 22h36
pour la réponse a la question de l'Osaure sur les sprites je pense qu'il ne bougent pas et que les adresses &H7400 a &H7FFF restent valables quelque soit la page


:noel
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 27/01/2011 à 09h55
Metalion :
Je voudrais comprendre ta gestion graphique, est-ce que tu pourrais la détailler (étape par étape) ?

Est-ce que tu recopies tout le fond d'écran (64Ko) à chaque fois que tes sprites bougent ?

Ou est-ce que tu ne recopies que le rectangle dans lequel le sprite a bougé ?




Ok, allons y étape par étape :



Imaginons que j'ai déjà le fond de mon circuit en RAM dans les 2 premières pages des slots 3-1 (partie haute) et 3-2 (partie basse).



  1. Switcher la page courante
  2. Effacer les voitures à leur position de la frame N-2 (puisse que le nouvel écran de travail représente l'état du jeu il y a 2 frames de cela).

    1. Pour chaque voiture, détecter dans quelle partie de l'écran elle se trouve ou si elle se trouve à l'intersection du haut et du bas
    2. Si elle se trouve dans une seule partie, sélectionner les pages mémoires 0 et 1 correspondantes (désactiver les interruptions), faire un HMMC de 13*11 pixels du circuit en RAM vers la position en VRAM, puis reseter les pages mémoires (reactiver les interruptions).
    3. Si elle se trouve à cheval entre les deux zones, faire le même traitement que ci-dessus, mais en 2 fois : une pour la partie du sprite se trouvant dans la partie haut du circuit et une autre pour la partie basse. La somme des 2 HMMC équivaudra à un transfert de 13*11 pixels.

  3. Afficher les voitures via un LMMC (ou LMMM si je peux mettre les voitures qq part en VRAM)
  4. Attendre la synchronisation verticale





Est-ce plus clair ? :hum


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

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1503

Le 27/01/2011 à 13h40
Oui, c'est plus clair :top

Donc, pour chaque voiture (et je ne sais pas combien il y en a), tu auras besoin d'un transfert de 2x13x11 pixels, soit 286 octets.
Cela passera largement dans une frame, donc c'est réalisable.


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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 27/01/2011 à 13h51
En fait ça marche déjà presque. ^^
Voici une version avec les 4 voitures, dont 2 sont jouables : carwar v0.0.1
Ça utilise le switch entre les 2 pages graphiques.
Le premier joueur utilise les touches gauche/droite pour tourner et haut pour accélérer.
Le deuxième joueur utilise les touches (en QWERTY) Z/C pour tourner et X pour accélérer.
Sur MSXBlue, ça ne marche pas très bien à cause de la limitation du nombre de touche en simultané.
Quelqu'un peut me confirmer que ça marche sur un vrai MSX ?
Prochaine mission... le décors et les collisions. ^^

EDIT : Les 2 autres joueurs seront jouables à la manette. Edité par aoineko Le 27/01/2011 à 14h23


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 781

Le 27/01/2011 à 22h20
:| :| :| Alors là Chapeau! Je suis scotché, les superpositions des voitures se font sans problème! J'attends de voir les déplacements dans le décor avec impatience! :top


Le MSXien le plus à l'ouest :fou ... ou presque :D
osaurer
   
Franck Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 22h54

Messages: 3345

Le 27/01/2011 à 22h41
J'ai testé sur BlueMSX. La vitesse est impressionnante !! Bravo Aoineko :top

On dirait que le MSX Francophone peut encore faire de belles choses ^^
   
MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 781

Le 27/01/2011 à 23h15
Une fois fini ça pourrait faire l'objet d'un beau concours/défi/tournoi pour la prochaine convention ;)



Le MSXien le plus à l'ouest :fou ... ou presque :D
osaurer
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 27/01/2011 à 23h52
Content que ça plaise. C'est aussi grâce à vous. ^^



J'ai deux p'tites questions pour les spécialistes :



1. Est t'il plus intéressant de faire 1 seul LMMC (copie RAM->VRAM avec gestion de transparence) de 13x11 ou bien 11 HMMC (un par ligne ; sans gestion de transparence) ? En fait, quel est le coup des tests logiques faits par les instructions de type LMxx par rapport aux versions High Speed ?



2. Comment accéder à l'espace mémoire situé hors des deux pages graphiques via les commandes VDP ? Par exemple, dans la page 1, les zones 0xC000-0xEFFF et 0xFA80-0xFFFF (autour de la zone alloué au sprite). D'ailleurs, peut t'on désactiver la gestion des sprites pour utiliser librement tout l'espace 0xC000-0xFFFF ?



MSXosaure :
Une fois fini ça pourrait faire l'objet d'un beau concours/défi/tournoi pour la prochaine convention ;)




Effectivement, ça pourrait être cool. Par contre, j'espère que la prochaine convention est pas avant qq mois... y a encore beaucoup de boulot. :D Edité par aoineko Le 27/01/2011 à 23h59


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

Villageois

Rang

Avatar

Groupe : compte ++

Inscrit le : 16/10/2009 à 18h53

Messages: 691

Le 28/01/2011 à 00h49
:| :| :| Aoineko !!! Tu avales du R800 effervescent lorsque tu codes ??

Whaouaouaou !! Qu'est-ce que tu nous fais-là ? C'est impressionnant !

Je rêve d'un Supersprint !!! Trop fort ! Je revoie Motoraoder, c'est GENIAL ! :love

En plus tu pourrais le décliner en BMX simulator aussi... ;)

Bravo Aoineko ! :top :tchin

Sur MSX, ça tourne nikel et sur Turbo-R je m'entraine en crazy mode ! :p

Guil'


MSX1 Sony HB501F / MSX2+ FSA1FX / MSX2+ FSA1WX / MSX2+ FSA1WSX / MSX Turbo-R ST / MSX Turbo-R GT
Moonsound 2.0 & DalSoRi - Interface CF & CF Card Interface - MegaFlash SCC 512Ko & 2x512ko - SRam 512Ko - Megaflashrom SCC + SD
MSX4Ever !!
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 28/01/2011 à 00h55
Je viens de penser à un truc... J'ai pas besoin d'avoir mon circuit en RAM !

Il suffit que je fasse un backup des 4 zones de 13x11 ou je vais afficher ma voiture (que je pourrais surement stocker qq part dans la VRAM) puis d'utiliser ces blocks pour effacer mes voitures la prochaine fois. A cause de l'affichage sur 2 pages graphiques, j'aurai besoin de tout stocker en double, mais 8x13x11 (1144 octets), ça doit rentrer sans problème dans les espaces inoccupés de la VRAM. Reste plus qu'à trouver comment accéder à ces zones. ^^



GuillianSeed :
Sur MSX, ça tourne nikel et sur Turbo-R je m'entraine en crazy mode ! :p




Merci ! Par contre, je suis étonné que tu ais encore le Crazy Mode sur Turbo-R vu que normalement j'attends la fin du balayage vertical avant de dessiner une nouvelle image... ça devrait pas aller plus vite. A moins qu'on soit à 60fps sur Turbo-R et seulement à 30 sur MSX2. Edité par aoineko Le 28/01/2011 à 01h01


On est toujours ignorant avant de savoir.
Github    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie