En plein bricolage et apprentissage sur du Z80 (voir "Retro-ingénierie d'une carte Z80 : de la centrale DTMF vers des projets Z80") j'y ai ajouté une petite carte d'extension pour faciliter mon propre apprentissage qui se commande à l'aide d'un out() C'est aussi simple que:
Code : Tout sélectionner
ld a, $0f ; Lit LED 0, 1, 2, 3
out ($1d),a ; LED port
Voici comment j'ai détecté mon problème...
- J'ai bien initialisé l'adresse de ma stack et j'obtiens un comportement bizarre quand je fais des call et des push et pop.
- Le programme semble ne plus répondre (plante)... et j'ai une modification de mon affichage de LED durant l'appel de ma routine sys_wait1s.
- La routine sys_wait1s mouline deux fois un décompte du registre HL afin d'avoir une pause totale de 1 seconde puis fait un RET.
- Si j'appelle la routine avec un call mon affichage LED est modifié sans aucun out() dans le compte !!!!
Comme mon interface d'extension se comporte bizarrement durant un call, je me suis penché sur son fonctionnement pour m'assurer qu'il n'y avait pas de bug sur le décodage de l'IORQ.
Pour modifier les LEDs (point 1), il faut une impulsion LOW sur le Signal CP (entre poins 1 & 2).
Cette impulsion n'est possible que pour la bonne combinaison de a0, a1, l'opération write (donc _wr LOW) et l'activation _RCIOce (point 2) enable de la carte d'extension).
Le signal RCIO provient du point 3, ligne Y7 du 74HC138 qui décode l'adresse de base de l'IORQ en provenance du Z80 (pour l'adresse 0x1C auquel on ajout a0 ==> 0x1D pour pouvoir contrôler les LEDs).
Tout cela me semble correct... je me demande donc pourquoi l'état de mes LEDs est modifié pendant un décompte du registre HL (lors d'un call uniquement)!
J'ai donc commencé à vérifier mes signaux sur la carte avec un oscilloscope.
J'en suis arrivé a tester un programme très simple:
Code : Tout sélectionner
ld a, $0f ; Lit LED 0, 1, 2, 3
out ($1d),a ; LED port
halt
et là je ne comprend pas pourquoi!
- JAUNE : Activation du module LED (signal CP sur U108)... donc envoi des données D0-D7 vers les LEDs.
- Bleu Foncé: Adresse A0 (pour vérification).
- Rose: IORQ du Z80
- Bleu ciel: signal _RCIOce (ligne Y7) donc un IORequest vers ma carte
Edit 17/12 19:00
J'ai essayé de trouver une corrélation entre mon activation CP de U108 et quelques autres signaux:
- RESET n'est pas en cause.
- INT n'est pas en cause
- Les signaux MRQ, RD, WR sont bien comme attendu
- M1 est bien HIGH durant les mise-à-jour des LEDs (donc normal).
- Je n'ai pas le signal HALT après le premier IORQ (voir image ci-dessous).
Je me suis assuré que la 2ieme ROM n'est jamais activée.
Donc pas de problème avec les ROM.
Les signaux sur ma première ROM sont OK.
Toute suggestion est la bienvenue.
Dominique