CPC Rulez
https://cpcrulez.fr/forum/

quelques questions sur le timing
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=6521
Page 1 sur 1

Auteur :  elpapy [ 18 Mai 2021, 13:16 ]
Sujet du message :  quelques questions sur le timing

Hello !

Repri la bricole sur CPC, et j'ai quelques points qui me questionnent.

D'abord les timings sur z80. J'utilise rasm et TICKER pour calculer les synchros, ça marche très bien. Mais j'ai constaté que les cycles indiqués dans le "Z80 User Manual" de Zilog (édition 2016, http://z80.info/zip/z80cpu_um.pdf) n'étaient pas bon. Idem avec "The Undocumented Z80 Documented" de Sean Young (http://www.z80.info/zip/z80-documented.pdf). Par exemple, il est indiqué qu'un out (c),c prend 3 cycles machines, alors qu'il en prend en réalité 4 sur un CPC.

Le z80 est régulièrement interrompu par le Gate Array (READY connecté à la broche WAIT*) pour les accès en RAM du CRTC. J'ai lu dans "La bible du programmeur de l'Amstrad CPC" que c'était tous les 4 cycles d'horloge. Les instructions sont donc a priori interrompues en cours d'exécution. En principe cela n'altère pas le nombre de cycles M ou T, simplement la durée de certains cycles... du coup je ne vois pas bien d'où vient la différence entre les documents et ce qu'on constate sur CPC. Quelqu'un connaît la raison de cette spécificité ?

Autre chose, si on utilise habituellement l'équivalent nop (ce qui marche très bien), j'ai testé à des fins de compréhension des synchros avec les cycles d'horloge. Idem, les calculs ne sont pas justes. Si on ne peut pas se fier au document de Zilog pour les cycles M et T sur l'Amstrad, aurait-on dans un coin les cycles spécifiques au CPC ?

Dernière question, j'ai constaté que le premier halt après ei (dans une boucle qui interdit les interruptions) se produit plus tôt (presque immédiatement dans mon test) que le même halt dans une boucle où les interruptions sont autorisées. Je n'ai pas le souvenir que les INT soient mises en file sur z80...

Merci pour vos éclairages !

Auteur :  marcel [ 18 Mai 2021, 14:48 ]
Sujet du message :  Re: quelques questions sur le timing

le Z80 a bien un flag "pending" quand tu coupes les interruptions

si tu coupes les INT et qu'une se déclenche, tu la récupères APRES l'instruction qui SUIT le EI

cela permet, avec EI:RET, de revenir où tu étais et d'être sûr de ne jamais empiler à l'infini

si deux interruptions passent quand tu es en EI, tu n'en auras qu'une en sortie

Auteur :  elpapy [ 18 Mai 2021, 20:26 ]
Sujet du message :  Re: quelques questions sur le timing

marcel a écrit :
le Z80 a bien un flag "pending" quand tu coupes les interruptions

si tu coupes les INT et qu'une se déclenche, tu la récupères APRES l'instruction qui SUIT le EI

cela permet, avec EI:RET, de revenir où tu étais et d'être sûr de ne jamais empiler à l'infini

si deux interruptions passent quand tu es en EI, tu n'en auras qu'une en sortie


Ok, je vois le truc.
Pourtant dans mon code de test, j'ai un résultat différent :
Code :
di
...
ei:halt  ; une INT est récupérée immédiatement
halt:di  ; une 2nde INT est attendue


Et :
Code :
di
...
ei:nop   ; aucune INT n'est récupérée
halt:di  ; la 2nde INT est attendue


... comme si l'interruption empilée était récupérée juste après le ei, avec un signal de courte durée (<= 4 cycles d'horloge) :-|

Auteur :  marcel [ 18 Mai 2021, 21:54 ]
Sujet du message :  Re: quelques questions sur le timing

Relis bien ce que j'ai écrit et mis en majuscule

Il n'y aura jamais d'interruption sur le NOP de EI:NOP:HALT

si tu coupes les INT et qu'une se déclenche, tu la récupères APRES l'instruction qui SUIT le EI => Le nop SUIT le ei et l'int arrivera APRES

Auteur :  elpapy [ 18 Mai 2021, 23:22 ]
Sujet du message :  Re: quelques questions sur le timing

Je vois bien ce que tu veux dire et je comprends bien que ce soit une sécurité pour le ei:ret des routines d'interruption. Je récupère bien une interruption sur ei:halt, celle précédemment levée mais interdite pendant le code en amont (je la récupère très vite après ei). Ça s'explique sûrement par le fait que halt fait des nop et que le cycle d'instruction supplémentaire nécessaire est joué.

Mais dans le second cas, je n'ai pas l'impression que ce soit l'INT levée pendant le code en amont que je récupère sur le halt en deuxième ligne, mais une nouvelle (il y a une attente visible et classique de la position des halt, ce n'est pas immédiat). Il n'y a que dans le 1er cas que je la récupère, d'où ma perplexité...

Mes confuses si je suis pas clair, il y a peut-être aussi un artefact dans mon code de test qui crée la confusion.

Auteur :  marcel [ 19 Mai 2021, 07:19 ]
Sujet du message :  Re: quelques questions sur le timing

ok

ben j'comprends pas ta surprise

dans un cas tu fais 1 HALT, dans l'autre tu fais 2 HALT, il semble évident que tu vas attendre 1 INT dans un cas et 2 INT dans l'autre, rien n'est anormal

il faudrait qu'on en sache un peu plus sur le code qui est avant, est-il en temps fixe, es-tu sur un cas limite, etc?

Auteur :  elpapy [ 19 Mai 2021, 10:05 ]
Sujet du message :  Re: quelques questions sur le timing

marcel a écrit :
ok

ben j'comprends pas ta surprise

dans un cas tu fais 1 HALT, dans l'autre tu fais 2 HALT, il semble évident que tu vas attendre 1 INT dans un cas et 2 INT dans l'autre, rien n'est anormal


Je m'attendais à ce que l'INT empilée soit récupérée dans les deux cas. À ce que je comprends ei:halt et ei:nop:halt devrait récupérer cette INT, c'est-à-dire qu'on devrait voir dans les deux cas un halt très court, quasi immédiat.

marcel a écrit :
il faudrait qu'on en sache un peu plus sur le code qui est avant, est-il en temps fixe, es-tu sur un cas limite, etc?


C'est en temps constant, pas grand chose, une attente de VBL, une attente supplémentaire durant laquelle des INT arrivent normalement mais sont interdites, et le test avec des encres pour voir ce qui se passe. Je pose le code dès que j'ai un petit moment...

Auteur :  marcel [ 19 Mai 2021, 10:43 ]
Sujet du message :  Re: quelques questions sur le timing

elchoco a écrit :
Je m'attendais à ce que l'INT empilée soit récupérée dans les deux cas. À ce que je comprends ei:halt et ei:nop:halt devrait récupérer cette INT, c'est-à-dire qu'on devrait voir dans les deux cas un halt très court, quasi immédiat.


Oui, que tu mettes un NOP ou non, le premier HALT récupère la première INT à récupérer

Si tu mets deux nop, l'INT passe sous le nez du HALT et il attendra la suivante

Auteur :  elpapy [ 19 Mai 2021, 11:44 ]
Sujet du message :  Re: quelques questions sur le timing

marcel a écrit :
Oui, que tu mettes un NOP ou non, le premier HALT récupère la première INT à récupérer

Si tu mets deux nop, l'INT passe sous le nez du HALT et il attendra la suivante


Oui, c'est ce que je comprends aussi... mais dans le code le ei:nop:halt zappe la INT empilée, et attends la suivante direct...
Le code coupable (bon t'es pas obligé de t'embêter non plus !) :
Code :
TEST1   EQU 1

macro GA_INKR_SET couleur
        ; 7M
        ld bc,#7f00+64+{couleur}
        out (c),c
mend
macro WAIT_NLINE n,m
        push bc
        ld b,{n}-1
        push bc
        ld b,13:djnz $
        pop bc
        djnz $-6 ; 64 per loop
        pop bc
        defs 64-8-{m},0
mend

        org #2000

start
        di
        im 1
        ld hl,#c9fb
        ld (#0038),hl
        ld bc,#7f00+128+%1101   ; mode 1
        out (c),c
        ld bc,#7f00             ; PENR ink 0
        out (c),c
;===========================================================
; main
;
main
        ld b,#f5
.wvbl
        in a,(c)
        rra
        jr nc,.wvbl
        ei:halt:di
        defs 40,0               ; align
        WAIT_NLINE 130,0
        GA_INKR_SET 10          ; jaune

IFDEF TEST1
        ei:nop:halt:di
        GA_INKR_SET 0           ; gris

        ei:halt:di
        GA_INKR_SET 10          ; jaune

        ei:halt:di
ELSE
        ei:halt:di              ; halt immédiat (INT empilée)
        GA_INKR_SET 0           ; gris

        ei:halt:di
        GA_INKR_SET 10          ; jaune

        ei:halt:di
        GA_INKR_SET 0           ; gris

        ei:halt:di
ENDIF
        GA_INKR_SET 11          ; blanc
        jp main

end
run start
save './_build/tstint.bin',start,end-start,DSK,'./_build/tstint.dsk'

Auteur :  marcel [ 19 Mai 2021, 12:01 ]
Sujet du message :  Re: quelques questions sur le timing

Heu, j'ai dit une connerie à propos du NOP ou non, c'est bien la règle énoncée précédemment qui s'applique!

EI:NOP <INT> puis le HALT attend une nouvelle INT

L'int est après l'instruction qui suit le NOP, mais avant l'instruction qui suit le NOP

Auteur :  elpapy [ 19 Mai 2021, 15:35 ]
Sujet du message :  Re: quelques questions sur le timing

Ok... j'en sais un peu plus. Merci pour ton temps :)

Page 1 sur 1 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/