Gamoover

Vous aimez GAMOOVER ? Vous avez trouvé la perle rare grâce à notre forum ?
Alors pourquoi pas nous soutenir en effectuant un petit don Paypal sur : contribution@gamoover.net
C'est peut être un détail pour vous, mais nous, ça nous aiderait beaucoup !

[WIP] Spaces Invaders Midway

Démarré par pet, Dimanche 20 Décembre 2020, 10:52:14 AM

pet

Intéressant l arcade!

Ben j arrete pour ce soir...
C est pas une magouille la vidéo est en a13...

Je ne trouve pas d ou viennent les lignes!

Un clavier AZERTY en vaut deux

f4brice

Les RAMs sont lues pour afficher une image, alors qu'elles n'ont jamais été écrites.
Le contenu d'une RAM dans cette situation est indéterminé.

Little_Rabbit

#18
Salut,

Citation de: f4brice le Jeudi 24 Décembre 2020, 20:13:12 PM
Les RAMs sont lues pour afficher une image, alors qu'elles n'ont jamais été écrites.
Le contenu d'une RAM dans cette situation est indéterminé.

Oui, c'est ce qui donne la bouillie de pixels qu'on a à l'allumage du PCB, avant le RESET :).

Pour ce qui est des lignes verticales, l'histoire est tout autre, et c'est ce que je me propose de vous raconter :).


Que se passe-t-il en l'absence de ROM/EPROM sur le PCB ?

On voit sur le schéma qu'à cet endroit un réseau de résistances de pull-up fixent le bus à +5V, soit tous les bits du bus de donnée à 1, c'est à dire avec une valeur hexadécimale à $FF.



Je me suis demandé si ce $FF pouvait correspondre à une instruction pour le µP8080... Pour en avoir le cœur net, je me suis amusé à créer un fichier de substitution pour MAME pour l'emplacement H ne contenant que des $FF, pour simuler l'absence d'EPROM.



puis j'ai lancé MAME en mode debugger : ça donne ça :



On se rend compte alors que les valeurs $FF reviennent à avoir une série d'instructions "RST 7" !...

Je ne connaissais pas cette instruction du 8080. Quelques recherches Google plus loin, j'ai compris qu'il s'agit d'une instruction liée à la gestion des interruptions, et si j'ai bien compris à la possibilité de présenter un vecteur d'interruption pour gérer plusieurs routines d'interruption pour les niveaux respectifs.

Sur ce site, on trouve un PDF qui détaille le codage de l'instruction RST (RST pour "ReStarT) :



les 3 bits "n n n" servent à coder la valeur du vecteur d'interruption voulu, et autorisent le codage de 8 valeurs différentes (de 0 à 7).

Par exemple, RST 2 se coderait :

1 1 0 1 0 1 1 1

et comme 7 se code en binaire 1 1 1, cela nous donne bien pour RST 7 le codage suivant :

1 1 1 1 1 1 1 1

soit tous les bits à 1, comme lorsqu'on enlève les EPROMs :).

Et que fait cette instruction ? L'image plus haut nous donne la réponse, mais si vous ne savez pas comment fonctionne un microprocesseur, cela ne vous parlera sans doute pas trop ;)...

[SP-1] <-- PCH, [SP-2] <-- PCL, SP <-- SP-2, PC <--  N x 8

sans rentrer trop dans les détails, voici quelques explications :

PC pour "Program Counter", c'est le registre qui contient l'adresse mémoire de l'instruction que le processeur doit exécuter (et quand il exécute une instruction, le PC pointe déjà la suivante !)

SP pour "Stack Pointer", c'est le pointeur de pile, c'est à dire un registre qui contient l'adresse en RAM où seront empilées les valeurs à mettre en pile (comme un pile d'assiettes, typiquement on y met l'adresse de l'instruction de retour d'un sous-programme)

Donc si on détaille ce que fait l'instruction RST 7, cela nous donne :

[SP-1] <-- PCH, [SP-2] <-- PCL => on empile la valeur actuelle du PC

SP <-- SP-2 => on décrémente l'adresse de la pile de 2, pour se mettre juste après la valeur du PC qu'on vient d'empiler

PC <--  N x 8 => le PC prend pour valeur le vecteur n qui était précisé dans l'instruction RST, multiplié par 8 (ce "multiplié par 8" permet d'avoir une table de petits bouts de programme distincts pour chaque vecteur d'interruption, qui permettront de sauter vers le reste de la routine, une table de sauts en gros)



Et quel rapport avec nos lignes verticales me direz-vous ?? :D

Un 8080 après un RESET a tous ses registres à 0, comme le montre la capture du debugger MAME plus haut.

Ensuite, il faut observer le plan mémoire des cartes CPU Midway, comme celle utilisée sur Space Invaders :



Je ne suis pas sûr à 100% que ce mapping soit bon, mais c'est ce que j'en ai déduit en examinant le schéma. Le 8080 dispose d'un espace adressable de 64 Ko, mais ce PCB n'en exploite que 16 Ko : 8 Ko pour la ROM, et 8 Ko pour la RAM. Et comme le décodage d'adresse est dit « partiel », c'est-à-dire qu'il ignore le 2 bits de poids fort A15 et A14, et bien on retrouve des miroirs des blocs précédents : si on écrit en RAM à l'adresse $6002, c'est physiquement exactement comme si on écrivait à l'adresse $2002.

Revenons-en à ce qui se passe quand le PCB est démarré sans aucune ROM. Le CPU vient d'être reseté et a tous ses registres à 0. Il démarre l'exécution de ce qu'il trouve à l'adresse $0000, soit $FF, ce qu'il décode comme étant une instruction RST 7.

Comme expliqué plus haut, RST 7 va provoqué ceci

- empile en $0000-1 et $0000-2 la valeur du PC, soit $0001 car à ce moment le PC vaut déjà l'adresse de l'instruction suivante
- décrémente le pointeur de pile de 2, il passe donc à $FFFE
- multiplie le vecteur par 8 et met se résultat dans le PC => 7 x 8 = 56, soit $0038 en hexadécimal

Voilà le résultat sous le debugger de MAME :



Que remarque-t-on à l'écran et où donc ont atterri ces valeurs empilées ? 0000-1 nous donne $FFFF et $0000-2 $FFFE. Or du fait des blocs miroirs du décodage d'adresse, écrire dans la pile en $FFFE est équivalent à écrire en $3FFE, c'est-à-dire en toute fin de la RAM vidéo ! Si vous observez bien, on voit le pixel qui vient de passer à 1, entouré en jaune !

Le CPU va exécuter la prochaine instruction, à l'adresse $0038 puisque RTS 7 vient de lui fournir cette adresse. Mais on le sait, tout l'espace ROM contient des $FF, il va donc tomber à nouveau sur une instruction RST 7, qui s'exécute à nouveau :

- empile en $FFFE-1 et -2 la valeur du PC, soit $0039 (puisque là encore, on pointe déjà l'adresse qui serait exécuter après le RST 7),
- décrémente le pointeur de pile de 2, il passe donc à $FFFC
- multiplie le vecteur par 8 et met se résultat dans le PC => toujours $0038 en hexadécimal

Voilà le résultat de cette seconde étape sous le debugger de MAME :



Un second motif apparaît ! C'est le fameux $0039, valeur du PC qui a été empilée par le RST 7 !

Et comme chaque instruction RST 7 demande au 8080 de poursuivre sont exécution en $0038 qui contient elle-même un instruction RST 7, cela donne une boucle infinie d'empilement de $0039 dans la pile, avec le pointeur de pile qui s'incrémente à chaque fois, remontant ainsi un peu plus dans la RAM vidéo.

D'ailleurs, si on observe cette valeur $0039 qui est mise en pile, d'un point de vue « pixel », cela donne ça :



Ce motif vous est familier ? ;)



On comprend donc que cette succession infinie d'instruction RST 7, remplit peu à peu la RAM vidéo, ce qui va en une fraction de seconde remplir l'écran des fameuses barres verticales (ou horizontales en "tate") tant convoitées :).



Voilà donc élucidé le mystère des barres qui remplissent l'écran quand on enlève toutes les ROM. C'est ni plus ni moins le résultat de l'exécution d'un programme un peu spécial, dont le code se limite à des $FF !

Mais le test est astucieux et bigrement efficace, car il permet de s'assurer du fonctionnement d'une bonne partie de la carte, et notamment du CPU, sans qu'il soit nécessaire d'avoir de ROM, et qui s'exécutera correctement même si la RAM est fortement endommagée ! Et les « perturbations » visibles à l'écran sont ensuite révélatrices de tel ou tel dysfonctionnement, mettant le réparateur sur la piste de ce qu'il faut corriger, en suivant les recommandations du manuel « Midway CPU 8080 board test procedure » :)

Joyeux Noël à tous et à toutes !  :-*

A+
Recherche bornes dédiées ou PCB originaux: Miss Pacman, Dig Dug, Galaga, Mappy, Asteroids, Battlezone, Missile Command, Tempest, Star Wars, Donkey Kong (+ Jr), Mario Bros, Moon Patrol, Defender, Joust, Frogger, Gyruss, Pooyan, Space Tactics, Zaxxon, etc. Flip : Gottlieb des années 80 (Spirit, Amazon Hunt, ...), Baby Pac Man. Divers :  Ice Cold Beer => Trois fois rien quoi ! :D
Ma séance sur le divan : c'est grave Docteur ? :-\
Ma gaming room, ma storage room

pet

#19
 ^-^Superbe analyse! ^-^


Mais moi je n ai quasi que des 0 sur mon bus de donnée..
Et pour cause le réseau de résistances est en option...
>:D Et moi je l ai pas  >:D

Sa place est à droite sur la photo



Je vais le rajouter!
Un clavier AZERTY en vaut deux

f4brice

Excellent Petit_Lapin ! Merci beaucoup !
Ainsi l'image vidéo ne correspond pas à des données non initialisées, mais à une constante écrite par un CPU qui exécute du vent !

Fred G5

Flipper: DE "Laser War"- WMS "F14-Tomcat"- GTB " Hollywood Heat" - Bally "Black Pyramid"
Borne: Konami "Lethal Enforcers" - New Game "N'Styl"- René Pierre 1982 - Jeutel Neo Geo 16/9 - Simulateur Twin Konami "Midnight Run Road Fighter 2"
Jeu/Système de jeu: 53 PCB Jamma, 7 cartouches MVS, slot Neo-Geo MV-1T, MV-2F, MV-4F, MV-6F
Console: Nintendo SNES 2CHIP, SNES 1CHIP-02 + 43 jeux

pet

C est fait


J ai mes 1 sur mon bus de donnée...
Mais ils n arrivent pas jusqu'à la cpu, il ne dépassent pas les 74ls153....
Je vais reprendre la doc de dépannage car ce n est pas simple a suivre ces bus qui passent a travers x buffers et déstocker l oscillo pour comparer les signaux.
Un clavier AZERTY en vaut deux

f4brice

Attention, le CPU Intel 8080 est une (très) grosse bouze d'usine à gaz.
Il faut bien lire le datasheet et comprendre qu'il ne fait pas que "lire la ROM" pour exécuter ce qu'il y trouve.
Il y a une notion de cycles (de mémoire 4) et lors de l'un d'eux il sort sur le bus de donnée un status word de 8 bits à la con.
Ce SW indique grosso-modo ce qu'il va faire : lire une donnée, écrire une donnée, lire un port, écrire un port, etc...
C'est détaillé dans la doc Intel.

pet

#24
Bon suite pas glorieuse...
J etudie un peu le schéma et je place des points de couleurs en fonction des résultats à la sonde logique
Rouge toujours  à 1
Vert toujours  à 0
Bleu les 2


B3 et d3 ne fonctionne pas ainsi que la sélection des ls153  a2 b3 c2 d2  je m'oriente vers les portes NOR d6 et les sortie sont systématiquement à 1 donc a priori hs
Je vampirise une vieille carte pour lever le doute au comparateur logique hp et les résultats sont bizarre.... (peut-être que la pièce de récup est hs)
Je déstock mon deuxième comparateur logique et oh surprise j ai 3 74ls74 dans la boite.

Ca tombe bien il y en a sur la pcb je test les 3 avec les 2 comparateurs....
Ils sont tous hs

Bref j ai des doutes sur mes mesures, mes composants car la vidéo est cohérente (il lit bien les ram mais tout ce que je test semble mort)

Ca ne va pas être simple....


Un clavier AZERTY en vaut deux

f4brice

Désolé si ma question est bête, mais n'as-tu pas accès à un oscilloscope, même modeste, même vintage ?

Little_Rabbit

Salut,

Le fait que tes 4 multiplexeurs LS153 ne semble pas correctement sélectionnés me semble une bonne piste !  ^-

Tel que je comprends cette partie du schéma, la carte mère comporte 3 bus de données :

- le bus des données provenant des EPROMs, le "Instruction Bus"
- le bus des données multiplexées provenant/allant à la carte fille "Mplex Game Data Bus"
- le bus des données de la RAM "RAM Data bus"

À un moment donnée, la carte sélectionne l'un de ces 3 bus en fonction des valeurs des broches de sélection A et B des LS153.

Comme tu l'as observé, ces valeurs sur A et B proviennent du 74LS32 en D6.

Le fait que ses différentes portes NOR aient en entrée des valeurs constantes me paraît pour le moins suspect.

Ces valeurs proviennent notamment du 74174 en D7, le fameux Latch Register qui va renseigner l'électronique autour du CPU sur la nature du cycle en cours : adressons-nous le plan mémoire, ou le plan des E/S ? Sommes-nous en train de lire ou écrire en mémoire ? Adressons-nous plutôt la pile ? Sommes-nous en train d'accepter une interruption ? Décodons-nous l'instruction en cours, etc.

Je cite un extrait de mon WIP Space Invaders :

Citation de: Little_Rabbit le Mercredi 06 Mars 2019, 20:31:19 PM
../.. je comprends que le 8080 utilise en fait un registre externe au microprocesseur pour consigner l'état dans lequel il se trouve ! C'est le rôle de son « Status Latch » :



Une instruction donnée du microprocesseur est décomposée en plusieurs cycles, et une fois que l'instruction est décodée, et sa nature connue, le microprocesseur présente sur le bus de donnée le « Status » associé à cette instruction. Le registre externe mémorise cette valeur pour être exploitée par l'électronique de la carte.

Les différents états sont donc définis selon cette table :



../..

Comment cela est-il mis en place sur le carte mère de Space Invaders ?



C'est le 74174 qu'on voit en haut à gauche qui joue le rôle de Status Latch. Il est ensuite combiné à d'autres portes logiques pour générer le signal « Sample » qu'on a vu tout à l'heure sur la carte fille, et qui sert à capturer la valeur des ports adressés sur la carte fille.

Donc, après un RESET, quand le CPU veut adresser la zone EPROM en $0000, ce Status Latch devrait permettre de sélectionner le "Instruction Bus" pour exécuter la 1ère instruction.

Je serais toi, je commencerais par changer le 74174 en D7 :).
(et ne te fie pas à ce que pourrait te dire un testeur de composants => dans mon cas, le testeur le disait comme bon, alors qu'il était bien partiellement défectueux !)

A+

Recherche bornes dédiées ou PCB originaux: Miss Pacman, Dig Dug, Galaga, Mappy, Asteroids, Battlezone, Missile Command, Tempest, Star Wars, Donkey Kong (+ Jr), Mario Bros, Moon Patrol, Defender, Joust, Frogger, Gyruss, Pooyan, Space Tactics, Zaxxon, etc. Flip : Gottlieb des années 80 (Spirit, Amazon Hunt, ...), Baby Pac Man. Divers :  Ice Cold Beer => Trois fois rien quoi ! :D
Ma séance sur le divan : c'est grave Docteur ? :-\
Ma gaming room, ma storage room

pet

#27
Oui j ai un oscilloscope et 2-3 analyseurs logique.
Mais je voulais faire léger, je n ai pas d atelier et je travail sur la table du salon et je range et remet tout à chaque fois.
De plus j essais de vérifier les composants dont j ai la ressource immédiate.

Je vais faire quelques mesure à l oscilloscope ca sera peut-être plus parlant et commander une poignée de composants suspects.

Le 74174 en fera partie

Merci pour vos post ça remet la niaque.
Un clavier AZERTY en vaut deux

Michel Maeva

Bonjour,

Je suis avec grand intérêt ce WIP  ^-^ Merci pour le partage  :-*
Sauvegardons notre patrimoine arcade !!!
Président du Celtic Arcade Museum (Musée de l'arcade à Quimperlé (29))
https://www.facebook.com/CelticArcadeMuseum

AsPiC

Citation de: Little_Rabbit le Vendredi 25 Décembre 2020, 16:54:38 PM
Salut,

Oui, c'est ce qui donne la bouillie de pixels qu'on a à l'allumage du PCB, avant le RESET :).

Pour ce qui est des lignes verticales, l'histoire est tout autre, et c'est ce que je me propose de vous raconter :).

Impressionnant, intéressant et compréhensible 8)  ^-^

C'est là que l'on ce rend compte de l'intérêt d'un forum à l'inverse des réseaux sociaux, la qualité des interventions qui sont inversement proportionnelles au temps nécessaire pour cliquer sur un pouce levé...

Merci pour ce partage de connaissance :-*

pet

#30
Beaucoup de beau monde sur mon WIP...

La suite...
Bon déstockage de l oscillo... fulke 99 sans transfo mais avec des batteries...
A oui des batteries... je me rappelle avoir jeter le chargeur car je n ai plus de batterie a charger depuis longtemps.... ah si le fluke...
Bon il fonctionne aussi en 12v mais je n ai pas de joli transfo pour lui sous la main... pas envie de faire un bricolage avec une alim de pc. Je ferais un truc pérenne  plus tard.

En attendant je change le 74ls02 mais je n ai plus le compresseur sous la main(celui du taf)

Donc plan B
Dremel, Scotch, pompe à dessouder, bout de stylo pour soufflet la soudure et acétone.

Le tout en photo : le tour du ci est masqué  pour éviter les projections


Après le coup de dremel


On souffle


On aspire


On nettoie à l acétone et on démasque... et hop





Il reste 2 3 m..douilles je les enlèverai 
Un clavier AZERTY en vaut deux

f4brice

Bravo pour l'aspect "propre" du travail.
Ce n'est pas facile de retirer proprement un composant à la Dremel et tu t'en es très bien sorti !

Plutôt que d'utiliser de l'acétone qui est particulièrement nocif, tu peux utiliser de l'alcool à brûler.
Ça nettoie un micro-chouilla moins bien, mais la toxicité n'a rien à voir.

Pour bien nettoyer les 2 ~ 3 m..douilles restantes, le fer à souder + de la tresse feront merveille.
Tu peux aussi, avant de passer la tresse, recharger en soudure fraîche (ça semble paradoxal).
Le décapant "frais" que tu apportes ainsi via la soudure fraîche va décaper les vieilles soudures et grandement faciliter le nettoyage.
Attention de ne pas souder la tresse (involontairement) puis tirer, tu risque d'arracher les pistes.