[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

Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [VG5000] Lode Runner

Message par hlide »

Bizarre... j'espère que tu ne t'ais pas contenté d'incrémenter un compteur dans le RST $38 pour le lire dans ta boucle : c'est l'échec assuré si tu t'attends à lire une valeur particulière et ce ne serait pas bien différent que de lire directement le compteur (IX+0) à ce stade.

Ce qu'il te faut faire, c'est tester si le compteur (IX+0) passe à 0 dans la routine utilisateur pour incrémenter ton compteur genre :

Code : Tout sélectionner

PUSH AF
PUSH HL
LD L,(IX+0)
XOR A
DEC L
LD HL,ton_compteur_de_frame_per_seconde
ADC (HL)
POP HL
POP AF
RET
Dans ta boucle, tu fais :

Code : Tout sélectionner

poll_again:
HALT
LD A,(ton_compteur_de_frame_per_seconde)
CP n
JP C,poll_again
XOR A
LD (ton_compteur_de_frame_per_seconde),A
JP loop
Avec n le nombre idéal d'images par seconde à passer avant de reboucler.

Evidemment, si tu as de longues séquences sous DI, il peut y avoir un risque que l'interruption soit perdue et de fausser le comptage.
Markerror
Messages : 2121
Inscription : 31 oct. 2011 19:21
Localisation : Orléans
Contact :

Re: [VG5000] Lode Runner

Message par Markerror »

Mettre une boucle d'attente, ce n'est pas vraiment "crado" mais mais si ton code en fonction de ce qui se passe dans le jeu prend parfois beaucoup plus de temps, tu auras des saccades.

En dehors de l'usage des interruptions, sur CPC, on a l'habitude dans des démos et certains jeux d'utiliser la détection de la VBL pour se synchroniser.
ca donne une boucle comme ça :

DI
LD B,&F5
wait_vbl:
IN A,(c)
RRA
JR nc,wait_vbl

Je ne suis pas certain qu'on puisse faire la même chose avec l'EF9345, mais il me semble bien qu'il y a la possibilité d'interroger la synchro VBL. A vérifier donc... Après, ce n'est pas forcément compatible avec ton code.
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 »

Si l'interruption VBL n'est pas implémentée matériellement, on revient encore à du polling, et si jamais la variabilité de la boucle est supérieure à 1/50s, on se retrouve avec un résultat irrégulier. :|
Markerror a écrit : 18 mai 2020 10:57Ok, 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.
Je ne pensais pas à une routine entièrement sous interruption, mais, si les routines d'interruption sont exécutées en RAM, ou que l'on peut modifier l'adresse (le vecteur?) de la routine d'interruption, y ajouter une dixaine de lignes de code pour le compteur et validation d'un bit d'autorisation, qui, lui, est testé par le programme principal hors interruption.
Après, je ne connais pas le Z80, à vous lire, ça a l'air d'être vachement plus compliqué que le 8051. :?
Sinon, il n'y a pas un timer disponible sur lequel on peut faire un comptage hors TM, et dont le vecteur d'interruption n'aura qu'à mettre à jour le bit d'autorisation de bouclage?
hlide a écrit : 18 mai 2020 13:26Certaines 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).

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.
Oui, mais le Sinclair, c'est particulier, le Z80 doit être suspendu pendant la génération de l'affichage pour ne pas interférer avec les accès mémoire de L'ULA, non?

Comme on est dans une architecture avec processeur graphique, et que le jeu est tout en assembleur, on doit pouvoir suspendre le processeur principal à notre guise. Attention toutefois à la gestion des appuis de touches dont le régime devra être changé, avec un "ou" à chaque boucle, et un reset après chaque rafraîchissement de position. Le scan clavier se fait sur interruption, ou par tests incessants (polling)?

Les routines que tu montres ne servent-elles pas au BASIC pour savoir s'il doit envoyer la page-écran au VDP, plutôt?
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [VG5000] Lode Runner

Message par hlide »

Le long code que j'avais cité provenait de là : http://vg5000bazar.free.fr/. Le RST $38 est bien utilisé pour un "rafraîchissement de l’écran" quand (IX+0) passe à 0 et réinitialise la valeur de ce dernier avec celle de (IX+2) qui sert de référence. Effectivement au passage à 0, un tas de cycles d'instruction en direction du VDP va être exécuté si le flag (IX+1) est positionné pour que l'écran soit rafraîchi.

Ce RST $38 appelle un routine utilisateur en $47D0 (que je suppose être en RAM , n'est-ce pas ?). Il doit donc être possible de placer son code d'interception à cet endroit. Il sera appelé à chaque tic tant que l'on n'abusera pas d'un DI dans le programme durant une période trop longue.

Et dans le post précédent, j'ai indiqué un exemple de code (non testé) qui permet de tester grâce à l'instruction HALT si l'/INT viens juste de se faire et donc de récupérer combien de cycles de "rafraîchissement" a eu lieu depuis la fois précédente qu'on les a traités. Non seulement, on sera au taquet mais on saura aussi de combien cycles on est en retard. Dans le meilleur des cas, ce sera un cycle.

EDIT: le signal /NMI semble être pris pour faire de l'input (appel utilisateur à $47ee). Là encore, le polling via un HALT devrait fonctionner car on boucle localement en ré-exécutant ce HALT tant qu'un cycle de "rafraîchissement" n'a pas été compté.
Avatar de l’utilisateur
Mokona
Messages : 1040
Inscription : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: [VG5000] Lode Runner

Message par Mokona »

Oui, c'est possible de s'accrocher sur $47d0 (avec précaution)

Je donne un exemple ici : https://www.triceraprog.fr/vg5000u-les-hooks.html
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [VG5000] Lode Runner

Message par hlide »

Ok, je comprends la logique. Le tampon de caractère comprend également celui des couleurs lors de rafraîchissement de la page ?

Ça ne doit pas être rapide non plus. Ceci dit, si la version de Joaopa contrôle directement le VDP sans utiliser cet artifice, la routine à faire sera très courte et pas consommatrice de ressource.

Mais j'ignore sur quoi est câblé le signal /INT, un timer ? un signal hardware en adéquation avec la vidéo ? et à quelle fréquence ? cette information serait précieuse.
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [VG5000] Lode Runner

Message par hlide »

"The Blank Start signal of the video processor is connected to the interrupt pin of the Z80, thus triggering an IRQ which, under the interrupt mode the BASIC initializes the Z80, calls address 0x0038 as an interrupt."

Hein, c'est assimilé au /HBLNK ? la vache cette routine bouffe des cycles CPU.

Et le compteur de référence ?

Donc je vois qu'il y a trois valeurs possible pour (IX+2) :

- SCREEN : $20 -> 32... lignes de caractère ?
- STORE : $0 euh ouais... que dire...
- routine inconnue : $0A -> 10... lignes de caractères ?

Bon vu le petitesse du nombre, ce n'est pas des /HBLNK par ligne de pixel. C'est même plutôt rassurant pour les cycles CPU perdus dans cette interruption.
Dernière modification par hlide le 20 mai 2020 12:02, modifié 2 fois.
Avatar de l’utilisateur
Mokona
Messages : 1040
Inscription : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: [VG5000] Lode Runner

Message par Mokona »

La broche INT du Z80 est reliée à PC/VS de l'EF9345 (Vertical Sync suivant le registre TGS). C'est donc appelé une fois par rafraîchissement (et la plupart du temps, ça revient tout de suite ; en BASIC ça dépend de l'argument passé à DISPLAY).

Cf le schéma ici : https://www.triceraprog.fr/vg5000u-sche ... ncipe.html

Et la Datasheet de l'EF9345.

Code : Tout sélectionner

irq:         call     inthk
             push     af
             dec      (ix+$00)
             jp       nz,skip_dsplay

             ld       a,(ix+$02)
             ld       (ix+$00),a
             bit      $00,(ix+$01)
             res      $00,(ix+$01)
             jp       z,skip_dsplay
Le premier est le compteur (setté par DISPLAY mais on peut aussi le faire en direct). Si le compteur n'est pas à zéro, pas d'affichage (mais le call au hook a quand même lieu).

Le second test est un flag qui empêche la routine de transfert de la mémoire vidéo RAM vers l'EF9345 (utilisé par exemple dans PLAY, pour éviter que l'affichage perturbe le son ; on quand on redéfini un caractère pour éviter d'avoir deux routines en simultané s'adressant à l'EF9345).
Avatar de l’utilisateur
Mokona
Messages : 1040
Inscription : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: [VG5000] Lode Runner

Message par Mokona »

hlide a écrit : 20 mai 2020 11:53 Donc je vois qu'il y a trois valeurs possible pour (IX+2) :

- SCREEN : $20 -> 32... lignes de caractère ?
- STORE : $0 euh ouais... que dire...
- routine inconnue : $0A -> 10... lignes de caractères ?
(IX+2) contient la valeur de départ du compteur pour limiter l'appel à l'affichage (transfert RAM -> EF9345).

La commande SCREEN met le compteur à 1, met le bit de rafraîchissement à 1, et fait un HALT (donc ça synchronise et force le prochaine affichage au prochain rafraîchissement).

La commande STORE met la valeur de départ du compteur à 0 et le compteur à 0 (du coup, plus de rafraîchissement j'ai l'impression... jamais essayé). Attention, le retour au prompt du BASIC réactive le rafraîchissement.

La commande DISPLAY met son argument comme valeur de départ du compteur. Donc DISPLAY 1 -> rafraîchissement systématique. DISPLAY 50 -> rafraîchissement une fois par seconde en %0 Hz (globalement... car l'IRQ est masquable, donc on peut perdre des appels). DISPLAY force aussi un affichage au prochain rafraîchissement (ça branche sur SCREEN).

Du coup moi j'ai tendance à juste faire "DISPLAY 200" quand je veux synchroniser en BASIC : ça force l'affichage et ça attend assez longtemps pour ma porchaine boucle...
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [VG5000] Lode Runner

Message par hlide »

When TGS4 = 1, this signal is the phase comparator output.
When TGS4 = 0, this output delivers the vertical synchro signal.
Je doute que ce soit la synchro verticale avec du $20 dans (IX+2) (ce qui est fait pour DISPLAY) - le compteur de référence - car on aurait un "rafraîchissement" de l'écran à la demi-seconde près.

Code : Tout sélectionner

TGS4 controls the SYNC OUT pins configuration :
TGS4 |HVS / HS |PC / VS
1    |Composite|Sync PC
0    |HSync Out|VSync Out
PC is the output of the on-chip phase comparator.
An external VCXO allows a smoother horizontal
phase lock than the internal scheme.

SYNC IN ----------->[D Q]---->[D Q]----> PC
                      ^         ^
                      |         |
HS -------------------+         |
                                |
CLK ------>[ / 6]---------------+
Ça me paraît plus probable que ce soit ce PC qui soit à l'oeuvre pour /INT que le VS puisque celui dépend de HS.
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [VG5000] Lode Runner

Message par hlide »

Bon okay, je ne mets pas en doute les dernière réponses que tu m'as données (je n'avais pas réfléchi à propos du SYNC IN et donc à l'impertinence du PC contrairement à la pertinence de tes réponses). Dans un sens, ça simplifierait énormément la gestion que ce soit le VS quitte à vampiriser totalement le /IRQ à notre avantage (1 /IRQ = 1 frame).
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [VG5000] Lode Runner

Message par hlide »

Code : Tout sélectionner

main_loop
    ld de,12000
bcle_main_att:
    dec de
    ld a,d
    or e
    jr nz,bcle_main_att
12000 !? tant que ça à attendre ? et le coup de l'/INT ne marche pas ?

Bon reprenons :

Code : Tout sélectionner

timing:                               ;rst 38
    inc sp
    inc sp
    ei
    ret
Ok, on ne contrôle rien, ça ne peut pas fonctionner comme ça. Mais je comprends qu'ici c'est pour raccourcir les cycles perdus dans cette interruption.

Mettons à la place :

Code : Tout sélectionner

timing:                               ;rst 38
    push af
@0:
    ld a,0 ; immediate
    dec a
    jp c,@2
@1:
    ld (@0+1),a
    pop af
    dec sp
    dec sp
    ei
    ret
@2:
    ld a,<n> ; nombre de VSYNC à passer avant de boucler le "main game"
    sll (vscount) ; shift left and set bit 0 to 1 - devrait être atomique et éviter l'overflow avec un "inc (nnnn)"
    jp @1
vscount: db 0
Voilà la boucle main a juste besoin de faire ça :

Code : Tout sélectionner

main_game:
...
wait_vsync:
    ld hl,vscount
@0:
    halt
    srl (hl) ; shift right after setting flag C with bit 0 - devrait être atomic (pas besoin d'encardrer avec DI et EI je pense)
    jp nc,@0
...    
Je n'ai pas testé par contre.
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [VG5000] Lode Runner

Message par joaopa »

J'ai identifié le caractère qui ne passe pas pour le copier-coller. C'est le caractère ASCII 127...
Avatar de l’utilisateur
Carl
Modérateur
Messages : 13253
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: [VG5000] Lode Runner

Message par Carl »

Je viens de prendre le temps de tester runner.zip sur un vrai VG5000, c'est rapide comme tout ! 8)
Carl
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [VG5000] Lode Runner

Message par joaopa »

Et encore, j'ai mis une boucle de ralentissement.
C'est dommage que Guillaume a abandonné le site car le jeu est peu intéressant actuellement vu les déplacements du monstres. Il faut vraiment un mode CHASE qui rendre vraiment intéressant le jeu. Et j'aurais aimé aussi régler le problème sur certains tableaux.

Je pense que c'est un vœu pieux maintenant...
Répondre