[DCVG5K] Pas à pas et Trace

Couvre tous les domaines de l'émulation logicielle ou de la virtualisation ainsi que les discussions sur les divers outils associés.

Modérateurs : Papy.G, fneck, Carl

Répondre
Avatar de l’utilisateur
Dominique
Messages : 833
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

[DCVG5K] Pas à pas et Trace

Message par Dominique »

Bonjour à tous,

@Daniel : ça n'a apparament aucune incidence sur le fonctionnement, mais après l'instruction EI ($FB), le 'Pas à Pas' et le 'Trace' présentent une irrégularité Sauf erreur de ma part....

Suite au message et aux éclaircissements donnés par Hervé post , j'ai voulu faire un test en mettant un jump vers une routine qui ne fait rien d'autre que d'éliminer l'adresse retour du RST 38H.

Code : Tout sélectionner

0001   0000             ; tasm -80 TestInter.asm -g3
0002   0000             
0003   5000             			.ORG  $5000
0004   5000             ;* *****************************************************
0005   5000             ;* DEBUT
0006   5000             ;* *****************************************************
0007   5000             
0008   5000             INIT:
0009   5000 F3          	DI			; Désactive les interruptions
0010   5001 CD 11 50    	CALL IRQ_ON		; Activation des interruptions et MAJ vecteur $47d0
0011   5004             INIT1:
0012   5004 CD A7 02    	CALL $02A7		; Scrutation rapide du clavier
0013   5007 E6 DF       	AND $DF			; Bit 5 = 0
0014   5009 FE 51       	CP $51			; Compare touche 'Q'
0015   500B 20 F7       	JR NZ, INIT1		; Si <> 'Q' Retour à 'Scrutation'
0016   500D CD 1F 50    	CALL IRQ_OF		; Sinon Désactivation des interruptions
0017   5010 C9          	RET
0018   5011             
0019   5011             ;* *****************************************************
0020   5011             ;* Activation des interruptions et MAJ vecteur $47d0
0021   5011             ;* *****************************************************
0022   5011             
0023   5011             IRQ_ON: 
0024   5011 11 21 50    	LD DE, DO_IRQ		; Adresse de la routine appelée à chaque interruption 
0025   5014 21 D0 47    	LD HL, $47d0		; Adresse appelée par $0038
0026   5017 36 C3       	LD (HL), $C3		; Code Jump -> JP, adresse $47d0
0027   5019 23          	INC HL			; $47d0 +1
0028   501A 73          	LD (HL), E		; Le byte de poids faible (LSb)
0029   501B 23          	INC HL			; $47d0 +2
0030   501C 72          	LD (HL), D		; Le byte de poids fort (MSb)
0031   501D FB          	EI			; Active les interruptions
0032   501E C9          	RET			; RET effectué mais non spécifié dans le Pas à Pas
0033   501F             
0034   501F             ;* *****************************************************
0035   501F             ;* Désactivation des interruptions
0036   501F             ;* *****************************************************
0037   501F             
0038   501F             IRQ_OF:
0039   501F F3          	DI			; Désactive les interruptions
0040   5020 C9          	RET			; 
0041   5021             
0042   5021             ;* *****************************************************
0043   5021             ;* Routine appelée à chaque interruption 
0044   5021             ;* *****************************************************
0045   5021             
0046   5021             DO_IRQ:
0047   5021 F3          	DI			; Désactive les interruptions
0048   5022 FB          	EI			; Active les interruptions
0049   5023 18 01       	JR DO_IRQ1		; JR effectué mais non spécifié dans le Pas à Pas
0050   5025 00          	.DB  $00		; NOP pour justifier le JR
0051   5026             DO_IRQ1:
0052   5026 F3          	DI			; Désactive les interruptions
0053   5027 F1          	POP AF			; Elimine l'adresse retour $0038
0054   5028 FB          	EI			; Active les interruptions
0055   5029 C9          	RET			; RET effectué mais non spécifié dans le Pas à Pas
0056   502A             
0057   502A             .END
0058   502A             
tasm: Number of errors = 0

Je charge le programme TestInter.bin adresse $5000 ; Je me positionne adresse $5000 en modifiant le registre PC; Point d'arrêt à $5010 ou $5020; Trace activé; je lance; Touche 'Q' pour arréter (assez rapidement sinon le Trace grandit vite).
Test Interruptions.zip
(1.18 Mio) Téléchargé 28 fois
On voit bien que tout marche, même si les instructions qui suivent EI ($5022 et $5028) n'apparaissent ni sur le Pas à pas, ni sur le Trace.

A+
Daniel
Messages : 17426
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCVG5K] Pas à pas et Trace

Message par Daniel »

Pendant les vacances il va être difficile de trouver une solution, je reprendrai cette question à la rentrée.
Si par hasard j'oublie, ne pas hésiter à me relancer !
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
Dominique
Messages : 833
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [DCVG5K] Pas à pas et Trace

Message par Dominique »

Pas de soucis Daniel, comme cela n'affecte en rien le comportement du programme, ça peut être mis en attente.
Avatar de l’utilisateur
Dominique
Messages : 833
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [DCVG5K] Pas à pas et Trace

Message par Dominique »

Bonjour à tous,

@Daniel,

Puisque dans un autre fil tu parlais du pas à pas, je relance l'observation sur le Pas à Pas du DCVG5K.

Rien de bien urgent.

A+ Dominique
Daniel
Messages : 17426
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCVG5K] Pas à pas et Trace

Message par Daniel »

Tu fais bien de me relancer, ça me motive. Je n'avais pas complètement oublié mais le courage me manquait :wink:
Daniel
L'obstacle augmente mon ardeur.
Daniel
Messages : 17426
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCVG5K] Pas à pas et Trace

Message par Daniel »

Après pas mal d'essais, je suis arrivé à la conclusion qu'à chaque instruction EI l'émulateur Z80 exécute cette instruction EI, mais aussi l'instruction suivante. L'outil de mise au point de dcvg5k ne sait pas que l'instruction suivante a été exécutée puisque l'exécution n'a pas été demandée, c'est pourquoi elle n'apparaît pas, ni dans le mode pas à pas ni dans la trace.

Je connais mal le programme d'émulation Z80 (je ne l'ai pas écrit moi-même). J'ai toutefois trouvé une modification qui semble empêcher l'exécution automatique de l'instruction après EI. J'espère qu'il n'y a pas d'effets collatéraux indésirables. Voici la nouvelle version de dcvg5k. J'attendrai qu'elle soit bien testée avant de la mettre officiellement en service. Si vous notez des comportements anormaux merci de les signaler.

dcvg5k_20231006.zip
(187.34 Kio) Téléchargé 18 fois
Attention : cette version n'est pas correcte, la bonne se trouve quelques messages plus bas dans ce fil de discussion.
Dernière modification par Daniel le 06 oct. 2023 14:45, modifié 1 fois.
Daniel
L'obstacle augmente mon ardeur.
Zebulon
Messages : 2806
Inscription : 02 nov. 2020 14:03

Re: [DCVG5K] Pas à pas et Trace

Message par Zebulon »

Daniel, je ne sais pas si c'est lié à ce problème mais dans la datasheet du Z80 il y a ces remarques concernant l'instruction EI:
During the execution of this instruction and the following instruction, maskable interrupts are disabled.
...
When the CPU executes an EI RETI instruction, the maskable interrupt is enabled then upon the execution of an the RETI instruction.
Peut-être que l'émulation a dû tenir compte de cette particularité d'une certaine manière, peut-être pas la plus réaliste, et il y a quelque chose à creuser ?
Daniel
Messages : 17426
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCVG5K] Pas à pas et Trace

Message par Daniel »

Je ne le savais pas. Merci pour cette précision. Elle explique pourquoi l'instruction suivante est exécutée automatiquement : les interruptions doivent être masquées pendant l'exécution de l'instruction suivante et démasquées seulement après.

Avec la modification faite pour supprimer cette exécution automatique, les interruptions sont démasquées trop tôt. Le bug de l'outil de mise au point est corrigé mais l'émulation du Z80 n'est plus conforme. Il faut trouver autre chose, mais ce n'est pas simple. Je vais encore réfléchir...
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
hlide
Messages : 3507
Inscription : 29 nov. 2017 10:23

Re: [DCVG5K] Pas à pas et Trace

Message par hlide »

L'instruction qui suit un EI (enable interrupt) est exécutée avant la prise en compte du signal /INT. Si le signal est positionné pendant le EI, alors elle ne va se lancer qu'à la fin de l'instruction qui a suivi le EI.

Dans l'émulation, on a souvent un flag qui est positionné après EI pour que la fonction qui recherche l'instruction suivante choisisse entre l'exécution d'un cycle M1 Opcode Fetch de l'instruction suivante (pas de signal d'interruption /NMI ou /INT) et l'exécution d'un cycle M Interrupt Request (sur signal /NMI ou /INT). Si le flag est positionné à vrai, on continue avec l'Opcode Fetch (sauf pour le /NMI) et on remet ce flag à faux. Au prochain cycle M, si le signal /INT est toujours actif alors on passera au cycle interrupt request.
Daniel
Messages : 17426
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCVG5K] Pas à pas et Trace

Message par Daniel »

Pour tenir compte de cette particularité j'ai remis l'émulateur Z80 dans son état initial. Il exécute l'instruction EI et la suivante dans la foulée avant d'autoriser les interruptions, probablement pour économiser un flag.

Pour permettre d'afficher correctement les deux instructions dans la trace et en mode pas à pas, j'ai ajouté un traitement spécial quand l'instruction EI est rencontrée, pour ne pas masquer l'instruction suivante. Voici la nouvelle version, toujours sans garantie faute de tests sérieux.

dcvg5k_20231006.zip
(189.52 Kio) Téléchargé 21 fois
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
Dominique
Messages : 833
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [DCVG5K] Pas à pas et Trace

Message par Dominique »

Bonjour à Tous,

Merci Daniel pour te pencher sur le problème.
Dès que je suis remis sur pied je regarde ça.

Merci
Répondre