[VG5000] Lode Runner

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [VG5000] Lode Runner

Message par joaopa »

Question vitesse, je pense que l'on est bon :mrgreen:
Lode Runner.zip
(25.63 Kio) Téléchargé 200 fois
Quelqu'un sait-il ce qu'il faut faire pour rendre le jeu jouable et surtout à vitesse constante
Xavier_

Re: [VG5000] Lode Runner

Message par Xavier_ »

:lol:
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.

:shock:
Faut demander à Hervé...
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [VG5000] Lode Runner

Message par joaopa »

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???
Markerror
Messages : 2121
Inscription : 31 oct. 2011 19:21
Localisation : Orléans
Contact :

Re: [VG5000] Lode Runner

Message par Markerror »

Bonjour bonjour,

Ca phosphore dur ici on dirait :-). C'est quoi le problème avec la vitesse du jeu ? Trop rapide ?
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [VG5000] Lode Runner

Message par joaopa »

Oui trop rapide. Il en est injouable. Le problème des boucles d'attente c'est que le jeu n'est pas à vitesse constante.
Avatar de l’utilisateur
Papy.G
Modérateur
Messages : 3047
Inscription : 10 juin 2014 13:40
Localisation : Haute-Garonne/Gers

Re: [VG5000] Lode Runner

Message par Papy.G »

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. :mrgreen:
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.
Xavier_

Re: [VG5000] Lode Runner

Message par Xavier_ »

Il faudrait que Guillaume nous envoie le fichier k7 ou wav directement etpas un copier-coller.
Tu prends mon fichhhhhhhhhhh…
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 ? :mrgreen: ]
[Question: Il y a des caractères qui ne passent pas au LLIST ?... Zut, j'ai répondu dans ma question.]
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [VG5000] Lode Runner

Message par joaopa »

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.
Xavier_

Re: [VG5000] Lode Runner

Message par Xavier_ »

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.
Avatar de l’utilisateur
Papy.G
Modérateur
Messages : 3047
Inscription : 10 juin 2014 13:40
Localisation : Haute-Garonne/Gers

Re: [VG5000] Lode Runner

Message par Papy.G »

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.
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.
Xavier_

Re: [VG5000] Lode Runner

Message par Xavier_ »

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...
Markerror
Messages : 2121
Inscription : 31 oct. 2011 19:21
Localisation : Orléans
Contact :

Re: [VG5000] Lode Runner

Message par Markerror »

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.
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [VG5000] Lode Runner

Message par hlide »

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. :mrgreen:
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).

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     
Premier constat, je ne vois pas de surveillance d'un signal VBLANK.
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.
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [VG5000] Lode Runner

Message par hlide »

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.
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [VG5000] Lode Runner

Message par joaopa »

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.
runner.zip
(55.94 Kio) Téléchargé 171 fois
Répondre