[VG5000] Lode Runner
Modérateurs : Papy.G, fneck, Carl
Re: [VG5000] Lode Runner
Question vitesse, je pense que l'on est bon surtout à vitesse constante
Quelqu'un sait-il ce qu'il faut faire pour rendre le jeu jouable et Re: [VG5000] Lode Runner
Malheureusement, il faut, soit ralentir l'émulateur, soit faire un boucle d'attente entre chaque mouvement.
C'est le bug de roue libre donc je te parlais avec le curseur vers le bas, ou vers le haut avec un obstacle.
Tu as aussi la possibilité de mettre un player de musique qui mangera de la ressource sur une interruption software.
Faut demander à Hervé...
Re: [VG5000] Lode Runner
Je crois avoir trouvé le bug pour les tableaux. Il ya un caractère ASCII qui ne passe pas avec le copier-coller. Il faudrait que Guillaume nous envoie le fichier k7 ou wav directement etpas un copier-coller.
Guillaume???
Guillaume???
Re: [VG5000] Lode Runner
Bonjour bonjour,
Ca phosphore dur ici on dirait . C'est quoi le problème avec la vitesse du jeu ? Trop rapide ?
Ca phosphore dur ici on dirait . C'est quoi le problème avec la vitesse du jeu ? Trop rapide ?
Re: [VG5000] Lode Runner
Oui trop rapide. Il en est injouable. Le problème des boucles d'attente c'est que le jeu n'est pas à vitesse constante.
- Papy.G
- Modérateur
- Messages : 3051
- Inscription : 10 juin 2014 13:40
- Localisation : Haute-Garonne/Gers
Re: [VG5000] Lode Runner
Et le comptage des VBlanks (ou d'une autre source d'interruption régulière), c'est pas faisable sur le VG5000?
D'autant que le Z80 a une instruction de suspension réveillable par une interruption, il me semble, non? (genre, Hang, ou Halt…)
En plus, ça fait économiser de l'énergie, des fois que quelqu'un veut se faire un VG5000 portable.
D'autant que le Z80 a une instruction de suspension réveillable par une interruption, il me semble, non? (genre, Hang, ou Halt…)
En plus, ça fait économiser de l'énergie, des fois que quelqu'un veut se faire un VG5000 portable.
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.
Demandez-en plus, ou faites-le vous-même.
Re: [VG5000] Lode Runner
Tu prends mon fichhhhhhhhhhh…Il faudrait que Guillaume nous envoie le fichier k7 ou wav directement etpas un copier-coller.
Je vient de comprendre le problème pour les échelles de sorties et le décalage dans les REM pour les 30 tableaux.
Bien vu Joaopa !
Généralement, on se base sur le rafraîchissement vidéo qui est stable dans le temps, comme un trigger au niveau de la boucle principale.
Mais ça nécessite une réorientation et un comptage des cycles, par exemple on attend 50 mise à jours pour boucler une nouvelle action.
Enfin, c'est l'idée.
[edit: cf. réponse de Papy.G]
[ou d'une autre source d'interruption régulière= Scrutation clavier?... Y a bien une variable système qui compte des trucs !]
[100 validations du VDP ? ]
[Question: Il y a des caractères qui ne passent pas au LLIST ?... Zut, j'ai répondu dans ma question.]
Re: [VG5000] Lode Runner
L'adresse 47fah est le compteur de rafraîchissement. Mais on s'en sert comment dans un jeu pour avoir une vitesse constante?
Dernière modification par joaopa le 18 mai 2020 09:50, modifié 1 fois.
Re: [VG5000] Lode Runner
Cool !
Tu boucles sur un test de cette adresse en indirect avec le bit 6,(HL)...
Si c'est trop rapide, tu fais 10,20,30... tout plein de test.
Tu boucles sur un test de cette adresse en indirect avec le bit 6,(HL)...
Si c'est trop rapide, tu fais 10,20,30... tout plein de test.
- Papy.G
- Modérateur
- Messages : 3051
- Inscription : 10 juin 2014 13:40
- Localisation : Haute-Garonne/Gers
Re: [VG5000] Lode Runner
Dans le vecteur d'interruption que tu veux utiliser, tu mets un compteur, quand sa valeur est atteinte, il met à jour le flag d'autorisation de la boucle de jeu, et réinitialise sa valeur. De cette façon, tu ne vas pas ajouter le temps de traitement dans ta boucle à ta durée d'attente, le comptage se fait en quasi-simultané.
Non, Xavier, il ne faut pas utiliser une boucle de comptage, il faut utiliser les vecteurs d'interruption. En testant une valeur depuis un programme non prioritaire, tu risques de louper ta valeur cible si jamais pour une raison ou une autre, elle saute de deux valeurs entre deux tests.
Non, Xavier, il ne faut pas utiliser une boucle de comptage, il faut utiliser les vecteurs d'interruption. En testant une valeur depuis un programme non prioritaire, tu risques de louper ta valeur cible si jamais pour une raison ou une autre, elle saute de deux valeurs entre deux tests.
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.
Demandez-en plus, ou faites-le vous-même.
Re: [VG5000] Lode Runner
Il faudrait tester.
Mais à mon point de vu, le résultat est le même… même si l'affichage prendra plus de temps qu'une interruption incrémentateuse toute simple.
Et comme ça fait moins à coder...
Mais à mon point de vu, le résultat est le même… même si l'affichage prendra plus de temps qu'une interruption incrémentateuse toute simple.
Et comme ça fait moins à coder...
Re: [VG5000] Lode Runner
Pour avoir "une source de temps", le vecteur d'interruption 38h est utile je pense. Après, je regarde la tête du jeu actuellement pour voir si on peut s'en servir pour faire de la temporisation.
Ok, ta version est 100% assembleur Joaopa ? Pour le coup, le RST &38 est utilisable, avec un compteur que tu gères toi-même pour l'appel aux routines du jeu. Si le compteur n'est pas atteind, tu ne fais rien. Cela suppose par contre que le code tienne compte de cette manière de fonctionner.
C'est ce que le gars qui a codé Tortues a fait, l'affichage des sprites se fait sous interruption.
Ok, ta version est 100% assembleur Joaopa ? Pour le coup, le RST &38 est utilisable, avec un compteur que tu gères toi-même pour l'appel aux routines du jeu. Si le compteur n'est pas atteind, tu ne fais rien. Cela suppose par contre que le code tienne compte de cette manière de fonctionner.
C'est ce que le gars qui a codé Tortues a fait, l'affichage des sprites se fait sous interruption.
Re: [VG5000] Lode Runner
Certaines machines (Sinclair par exemple, utilise l'instruction HALT qui se débloque sur un signal /INT qui doit être connecté au /VBLNK ou apparenté). La question est : est-ce que le VG5000 utilise l'interruption et pour quoi ? sans cette réponse, on ne peut pas aveuglement utiliser HALT et interruption 38H (en supposant que le VG5000 soit en mode IM1).Papy.G a écrit : ↑18 mai 2020 09:15 Et le comptage des VBlanks (ou d'une autre source d'interruption régulière), c'est pas faisable sur le VG5000?
D'autant que le Z80 a une instruction de suspension réveillable par une interruption, il me semble, non? (genre, Hang, ou Halt…)
En plus, ça fait économiser de l'énergie, des fois que quelqu'un veut se faire un VG5000 portable.
Code : Tout sélectionner
----------------------------------
Interruption masquable (IRQ)
----------------------------------
0038 cdd047 call 47d0h routine utilisateur
003b f5 push af
003c dd3500 dec (ix+00h) compteur d'interruptions pour
003f c28601 jp nz,0186h le rafraichissement de l'ecran
0042 dd7e02 ld a,(ix+02h) valeur de reference compteur interruptions
0045 dd7700 ld (ix+00h),a
0048 ddcb0146 bit 0,(ix+01h) flag si l'ecran doit être rafraichi (47FB)
004c ddcb0186 res 0,(ix+01h)
0050 ca8601 jp z,0186h
0053 c5 push bc
0054 d5 push de
0055 e5 push hl
---------------------------------
Affichage de l'écran
---------------------------------
0056 3e28 ld a,28h 28=Command register + exec request
0058 d38f out (8fh),a
005a 3e82 ld a,82h 82=Indirect
005c d3cf out (0cfh),a
005e 3e29 ld a,29h 29=Data register R1 + exec request
0060 d38f out (8fh),a
0062 c3bc00 jp 00bch
...
0186 dd3406 inc (ix+06h) <------ sortie sans affichage
0189 f1 pop af
018a fb ei enable interrupts
018b c9 ret
Deuxième constat, IX semble figé à une adresse particulière et ne doit pas être touché même en dehors de l'interruption.
Donc consulter la valeur de (ix+00h) permettrait de savoir à combien d'interruptions il faut passer pour le rafraîchissement.
Par contre, j'ai un doute sur le fait que ce soit bien cadencé par rapport au vrai VBLANK.
Re: [VG5000] Lode Runner
Supposons que /INT est enclenché de manière périodique et en nombre constant par rapport à une /VSYNC de 50 Hz. Soit au minimum 50 interruptions. Il ne faudrait pas non plus que le compteur soit grand en nombre car ça voudrait dire qu'il y aurait trop d'interruptions dans le programme et au vu du code, c'est assez gourmand en cycle avec tous ces IX.
Soit on se sert de de la routine utilisateur pour lire (IX+0) et affecter un flag ou un compteur (comme ça si jamais on dépasse plus d'une /VSYNC, on le sait et on peut s'en servir pour "déboguer" et trouver quelle partie du code en jeu peut ralentir le jeu ou même pour ralentir le jeu car il y a quand même 50 incrémentations par seconde ! un peu trop rapide).
Soit on lit directement (IX+0) dans le jeu pour déterminer quand il passe à 0 mais avec le risque de le louper si on n'assure pas qu'une boucle de jeu est toujours en-dessous d'un frame pour que l'on ait le temps de "poller" activement cette adresse à la fin de la boucle de jeu.
Et si ça fonctionne, ça veut dire que vous bouclez le jeu 50 fois dans la seconde, il suffirait donc d'un compteur qui comptera ces passages à 0 pour choisir de ralentir la boucle.
Soit on se sert de de la routine utilisateur pour lire (IX+0) et affecter un flag ou un compteur (comme ça si jamais on dépasse plus d'une /VSYNC, on le sait et on peut s'en servir pour "déboguer" et trouver quelle partie du code en jeu peut ralentir le jeu ou même pour ralentir le jeu car il y a quand même 50 incrémentations par seconde ! un peu trop rapide).
Soit on lit directement (IX+0) dans le jeu pour déterminer quand il passe à 0 mais avec le risque de le louper si on n'assure pas qu'une boucle de jeu est toujours en-dessous d'un frame pour que l'on ait le temps de "poller" activement cette adresse à la fin de la boucle de jeu.
Et si ça fonctionne, ça veut dire que vous bouclez le jeu 50 fois dans la seconde, il suffirait donc d'un compteur qui comptera ces passages à 0 pour choisir de ralentir la boucle.
Re: [VG5000] Lode Runner
Bon, je n'ai pas réussi à utiliser les interruptions: Si je mets un compteur qui s'incrémente en rst 38, ça rend le jeu saccadé (le personnage bouge de 3 cases, des appuis de touches sont manqués....)
J'ai mis une boucle d'attente. C'est bien crade mais le jeu reste jouable quand même (infiniment plus que la version BASIC). Je ne compte pas y retoucher à moins que Guillaume se manifeste (ajout du mode CHASE et correction du bug des tableaux) ou alors que quelqu'un trouve un énorme bug.
Prochain travail: voir comment les développeurs des années 80 ont réussi à ce que leurs jeux soient à vitesse constante. Par exemple dans hélicoptère et la moto infernale je n'ai pas l'impression que la vitesse du jeu change en fonction du remplissage de l'écran.
J'ai mis une boucle d'attente. C'est bien crade mais le jeu reste jouable quand même (infiniment plus que la version BASIC). Je ne compte pas y retoucher à moins que Guillaume se manifeste (ajout du mode CHASE et correction du bug des tableaux) ou alors que quelqu'un trouve un énorme bug.
Prochain travail: voir comment les développeurs des années 80 ont réussi à ce que leurs jeux soient à vitesse constante. Par exemple dans hélicoptère et la moto infernale je n'ai pas l'impression que la vitesse du jeu change en fonction du remplissage de l'écran.