Amstrad Plus Forum Index

Amstrad Plus
Découverte de la gamme Old et Plus des Cpc d'Amstrad.

 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Amstrad Plus et Acquittements Interruptions
Goto page: 1, 2, 3, 4, 5, 6  >
 
Post new topic   Reply to topic    Amstrad Plus Forum Index -> Programmation Cpc -> Asic
Previous topic :: Next topic  
Author Message
Longshot


Offline

Joined: 21 Nov 2015
Posts: 93
Masculin
Point(s): 8
Moyenne de points: 0.09

PostPosted: Sat 22 Jul - 11:09 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Hello.

Vu que je ne peux pas actuellement tester ça sur la vraie machine je me pose une petite question auquel l'un de vous a sans doute la réponse...

Lorsqu'on programme une interruption dma en mode acquittement dscr (ivr.bit0=1), est-il nécessaire de faire un ei en plus de l'acquittement dscr (dscr.bit acq=1) pour que l'interruption soit réellement acquittée ? La logique voudrait qu'il faille faire un ei/ret pour éviter toute réentrance (puisque l'instruction suivant le ei est ininterruptible).
Bref, si on ne fait pas un ei après avoir mis dscr.bit acq=1, est ce qu'une autre interruption dma peut survenir (donc que la liste DMA continue à être traitée) ?

Et si c'est bien le cas, ça signifie qu'on ne peut pas conserver uniquement des interruptions dma et se débarrasser de l'autre interruption (à savoir l'interruption pri de l'asic, soit le mode 52 lignes "old" lorsque pri vaut 0). Sauf à ce que le ei ne soit pas nécessaire, ou à ce qu'on puisse acquitter l'interruption raster comme indiqué dans la spécification technique de l'amstrad plus (v1.4 et 1.5).
"the raster interrupt is reset either by a CPU interrupt acknowledge cycle, or by writing  a 1 to bit D4 of the mode and ROM enable register." (soit RMR.b4)
Pour moi ce bit remet à 0 le compteur R52, mais je ne pense pas qu'il acquitte l'interruption.


Back to top
Publicité






PostPosted: Sat 22 Jul - 11:09 (2017)    Post subject: Publicité

PublicitéSupprimer les publicités ?
Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Sat 22 Jul - 11:33 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Longshot wrote:
Lorsqu'on programme une interruption dma en mode acquittement dscr (ivr.bit0=1), est-il nécessaire de faire un ei en plus de l'acquittement dscr (dscr.bit acq=1) pour que l'interruption soit réellement acquittée ?











En mode ivr (iM 2 bien sûr), le bit 0 du reg Asic situé en #6805 est à 1. Les bits 1 et 2 précisent quel périphérique a généré une interruption (raster, dma 0,1 ou 2)   détermine le type d'acquittement.
Donc, pour être précis, si le bit 0=0, on utilise l'acquittement universel (EI)
                                  si le bit 0=1 on passe alors en mode acquittement spécifique

Le EI est utilisé pour l'acquitement "universel".

Pour l'acquitement spécifique, il faut utiliser le reg Asic DCSR situé en #6c0f et mettre le bit du périphérique concerné (Dma 2, 1, 0 et raster) à 1dans l'ordre, le bit 4 pour le Dma2, le bit 5 pour le Dma1, le bit 6 pour le Dma 0 et le bit 7 pour le Dma Raster.



Les bits 4 à 7 servent à acquitter le bon périphérique s'il est positionné à 0.

Longshot wrote:
Bref, si on ne fait pas un ei après avoir mis dscr.bit acq=1, est ce qu'une autre interruption dma peut survenir (donc que la liste DMA continue à être traitée) ?




Non ! Mettre un EI provoquerait simplement un empilement d'interruption, c'est tout!

C'est corrigé !


_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Longshot


Offline

Joined: 21 Nov 2015
Posts: 93
Masculin
Point(s): 8
Moyenne de points: 0.09

PostPosted: Sat 22 Jul - 13:22 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Salut David

Merci pour ta réponse, mais ce n'est pas un cours sur les interruptions que je demande (d'autant plus que j'ai déjà expliqué tout ça il y a longtemps), mais si l'acquittement ei est obligatoire, même en cas d'acquittement via dcsr, car j'ai un doute par rapport à ce que fait l'émulateur. Relis bien mon post stp.

Je vois que tu es venu corriger les boulettes que tu avais écrites, mais tu en as laissé....

Quote:
Non ! Mettre un EI provoquerait simplement un empilement d'interruption, c'est tout!

A mon avis tu n'as pas très bien compris comment fonctionnent les interruptions.

L'acquittement, c'est indiquer au processeur ou au périphérique relié au processeur que l'interruption a été "servie" et qu'il peut en générer une nouvelle.
C'est pourquoi, au niveau du z80a, l'instruction EI empêche qu'une interruption survienne derrière elle.
Ca a été fait pour permettre de faire un RET, vu que l'interruption a fait un "CALL".

L'empilement d'interruption, c'est le contraire de ce que tu indiques.
Exemple
Si tu as EI / NOP / RET à la fin d'une interruption et que ton code d'interruption dure plus de 52 lignes (interruption en attente), alors la prochaine est en attente de l'acquittement. EI autorise l'interruption, mais si le NOP est "protégé", la nouvelle interruption va survenir entre le NOP et le RET. Donc le RET n'aura pas lieu, et une nouvelle adresse va être mise sur la pile. Il suffit que toutes les nouvelles interruptions dure plus longtemps que 52 lignes et la pile écrase la mémoire.

Bref, si tu acquittes 2 fois une interruption, il n'y a pas de problème majeur.

A bien y réfléchir un acquittement au niveau seul de DSCR serait dangereux car justement il pourrait y avoir de la réentrance.
Car le temps de positionner le bit DSCR.Acq=1, il n'existe pas de mécanisme permettant d'empêcher une interruption avant de sortir de l'interruption
Donc que le EI doit rester obligatoire.
Ce qui signifie en gros qu'en acquittement automatique (IVR.bit0=0), c'est plutôt que l'acquittement Z80A se transmet automatiquement au DMA

Si tu as la vraie machine, je fais un petit code que je mettrais ici... Mr. Green


Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Sat 22 Jul - 13:35 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Longshot wrote:
...
mais si l'acquittement ei est obligatoire, même en cas d'acquittement via dcsr, car j'ai un doute par rapport à ce que fait l'émulateur. Relis bien mon post stp.




Non il n'est pas obligatoire, c'est certain.

Longshot wrote:

Je vois que tu es venu corriger les boulettes que tu avais écrites, mais tu en as laissé....

Quote:
Non ! Mettre un EI provoquerait simplement un empilement d'interruption, c'est tout!




Oui j'ai corrigé quelques conneries, comme quoi coder en même temps que de répondre n'a pas que du bon.
Laissé des boulettes c'est fort possible mais ...

OffseT/QuasarNet wrote:

Les acquittements
Il ne vous aura pas échappé que le registre IVR permet également de choisir le mode d'acquittement. Ah, “c'est quoi donc un acquittement”, demande notre inculte petit blond à lunettes. Eh bien c'est la façon dont vous direz au périphérique ayant généré l'interruption qu'il peut se rendormir et que vous avez bien pris en compte sa requête. Sur CPC classique la question ne se pose pas car le Gate Array n'attend pas d'acquittement spécifique ; mais sur CPC plus, vous avez le choix entre acquittements spécifiques et universels via le bit 0 du registre IVR.
En mode d'acquittement universel, pas de problème, on ne se pose pas de question, on plante juste un EI une fois l'interruption traitée ça roule ! En effet, dans ce mode le périphérique ne maintient pas sa requête d'interruption (on a le même comportement avec le Gate Array sur CPC classique). En mode d'acquittement spécifique, c'est un peu plus évolué puisqu'on doit mettre à 1 le bit qui va bien dans le registre DCSR pour que notre périphérique comprenne qu'on a bien pris en compte sa requête. Tant que l'ont aura pas fait cette manipulation, il maintiendra la requête d'interruption et tout EI provoquerait un empilement d'interruption !




Longshot wrote:
Si tu as la vraie machine, je fais un petit code que je mettrais ici... Mr. Green


C'est le cas, alors n'hésites pas, je te donnerai les résultat du test!
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Longshot


Offline

Joined: 21 Nov 2015
Posts: 93
Masculin
Point(s): 8
Moyenne de points: 0.09

PostPosted: Sat 22 Jul - 14:27 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Quote:
En mode ivr (iM 2 bien sûr)


Le registre IVR n'est pas forcément relié à IM2.
Le IVR.Bit0 sert à déterminer le mode d'acquittement, qu'on soit en IM1 ou IM2.
Tu peux donc décider ne pas avoir à acquitter spécifiquement tes DMA en mode IM1, si tu ne te soucies pas de savoir qui a appelé ton code en &38.

Quote:


Tant que l'ont aura pas fait cette manipulation, il maintiendra la requête d'interruption et tout EI provoquerait un empilement d'interruption !


C'est doublement absurde.
Si on n'acquitte pas une interruption, elle n'a simplement plus lieu.
Le EI autorise simplement le Z80A a accepter de nouvelles interruptions (donc celles générées par les autres périphériques)
Pour qu'il y ait un "empilement" dans le contexte de l'article, il faudrait que le "dma" ait une mémoire interne...

En attendant, sans vouloir abuser Razz , tu peux peut-être tester le source que j'ai mis en ligne ici :
http://www.cpcwiki.eu/forum/amstrad-cpc-hardware/amstrad-plus-and-im2-bug/5…
On y discute de déterminer l'origine du bug de confusion de l'interruption raster/dma0Enregistrer


Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Sat 22 Jul - 14:36 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Longshot wrote:
Quote:
En mode ivr (iM 2 bien sûr)




Le registre IVR n'est pas forcément relié à IM2.
Le IVR.Bit0 sert à déterminer le mode d'acquittement, qu'on soit en IM1 ou IM2.
Tu peux donc décider ne pas avoir à acquitter spécifiquement tes DMA en mode IM1, si tu ne te soucies pas de savoir qui a appelé ton code en &38.


Oui, c'est exact !


Longshot wrote:


En attendant, sans vouloir abuser Razz , tu peux peut-être tester le source que j'ai mis en ligne ici :
http://www.cpcwiki.eu/forum/amstrad-cpc-hardware/amstrad-plus-and-im2-bug/5…
On y discute de déterminer l'origine du bug de confusion de l'interruption raster/dma0Enregistrer



Je teste ça de suite...
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Sat 22 Jul - 14:48 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Code Utilisé pour le test :
Code:
  org &a000
nbnopinst equ 1   ; nb usec instruction to test
test
  di
  ld bc,&7F00+%10001101
  out (c),c  ; roms off, mode 1
  ld sp,&c000
  im 1
  ld hl,#c9fb
   ld (#38),hl
   ei
    halt
    halt 
  di
  ;
  ld bc,&7f10  ; black border
  out (c),c
  ld bc,&7f54
  out (c),c
  ;
  ld hl,calibrate_int
  ld (&8000),hl
  ld (&8002),hl
  ld (&8004),hl
  ld (&8006),hl
  ;
  ld a,&80
  ld i,a
  ;
  im 2
  ;
  ld hl,0
  ld (&8100),hl
  ld (&8102),hl
  ld hl,dma_int
  ld (&8104),hl
  ld hl,raster_int
  ld (&8106),hl    
  
   ld hl,tabazik
  ld bc,&BC00+17
zlika
  ld a,(hl)
  out (c),a
  inc l
  dec c
  jr nz,zlika
    ;
    ld bc,&7fb8
  out (c),c
  ;
  xor a
  ld (&6805),a ; ivr=0 (8000/8100)
  ;
  ld bc,&7fa0
  out (c),c
  ;
  ld b,&7F
  xor a
  out (c),a
  ;
  ei
  halt
; wait de usec  
; 40+(((de/8)-5) x 8)+(de and 7) nop
wait:
  ld hl,adjust ; 3
  ld b,0  ; 2
  ld a,e  ; 1
  and %111 ; 2>8
  ld c,a  ; 1
  sbc hl,bc ; 4
  srl d  ; 2 
  rr e  ; 2>17
  srl d  ; 2
  rr e  ; 2 
  srl d  ; 2
  rr e  ; 2>25
  dec de  ; 2>27 8
  dec de  ; 2>29 16
  dec de  ; 2>31 24
  dec de  ; 2>33 32 
  dec de          ; 2>35 40 *
                nop  ; 1>36 
wait_01
  dec de  ; 2 -
  ld a,d  ; 1 -
  or e  ; 1 -
  nop  ; 1 -
  jp nz,wait_01 ; 3 - v=(8 x DE)
  jp (hl)  ; 1>37 
  nop  ; 1 * v=0--7
      nop  ; 1
      nop  ; 1
      nop  ; 1
      nop  ; 1
  nop  ; 1
  nop  ; 1
adjust
  ret  ; 3>40 *
calibrated:
    ld a,&81 ; vector on page 2
    ld i,a   
  halt
  
calibrate_int:
      ei   ; 1
      pop hl   ; 3 
      ld  sp,&c000  ; 3
      ld de,end_calibrate ; 3 -- 10
      or a   ; 1
      sbc hl,de  ; 4
      ld a,h   ; 1
      or l   ; 1
      jp z,calibrated  ; 3 -- 20
     ld de,(calibnop+1) ; 6
      inc de   ; 2
      ld (calibnop+1),de ; 6 -- 34 
  nop   ; 1 -- 35
  nop   ; 1 -- 36
      call wait  ; 5 
      nop   ; 1 
end_calibrate
      nop
me  jr me
tabazik
  DB 255,0,255,119,179
  DB 81,168,212,98,57,156
  DB 70,43,21,138,205
  DB 238
raster_int:
    ld bc,&7f49  ; 3
     jp common  ; 3
dma_int:
    ld bc,&7f44
      jp common
    
common
  ei   ; 1 -- 7
      ld sp,&c000  ; 3 -- 10
      out (c),c  ; 4 -- 14
calibnop   ld hl,64*48  ; 3 -- 17
compens  ld de,0   ; 3 -- 20
  or a   ; 1 -- 21
  sbc hl,de  ; 4 -- 25
  ex de,hl  ; 1 -- 26
  ld a,nbnopinst-1 ; 2 -- 28
  ld (compens+1),a ; 4 -- 32
      call wait
ouf 
  nop   ; 1 -- 33
      nop   ; 1 -- 34
      nop   ; 1 -- 35
      nop   ; 1 -- 36
instruction     ld b,a   ; instruction to test
    ds 10,0    
  
  



Résultat :



Border 0 | Ink 0,25

Est-ce qu'il doit y avoir ou autre chose ?
Edit: En gros ça tape dans le PRI.
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Longshot


Offline

Joined: 21 Nov 2015
Posts: 93
Masculin
Point(s): 8
Moyenne de points: 0.09

PostPosted: Sat 22 Jul - 15:06 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Normalement le bug ne doit pas survenir dans ce contexte.
L'écran est jaune à chaque interruption correcte. (bleu si le dma survient)
Maintenant il faut que tu remplaces "instruction ld b,a" (1 nop) par "instruction "add a,(ix+1)" (5 nop) et que tu changes nbnopinst par 5.
Et voir si l'écran devient bleu.


Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Sat 22 Jul - 15:22 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Même résultat que précédemment !
Ink 0-> 25 et Border à 0
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Longshot


Offline

Joined: 21 Nov 2015
Posts: 93
Masculin
Point(s): 8
Moyenne de points: 0.09

PostPosted: Sat 22 Jul - 17:59 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Quote:
Même résultat que précédemment !
Ink 0-> 25 et Border à 0

Donc dans cette situation, le bug dma ne se produit pas du tout
Dans le premier cas, pour chaque interruption l'instruction de 1 nop précède l'interruption.
Dans le second cas, pour chaque interruption, l'instruction de 5 nop précède l'interruption, ce qui la retarde de 4 nop
Le plus étonnant, c'est que le bug ne se produise jamais dans ce contexte.
Peux tu essayer
* avec add a,(ix+3) en virant un des nop avant instruction
* avec ld (de),a (en remettant le nop et nbnopinst=2)

En p.j. un petit source pour tester l'acquittement.
Les 6 bandes de couleurs du border sont pour les int R52 standard
Les 2 couleurs en ink 0 sont pour les int DMA-2
* remplacer le ei par un nop au label "ici"
* remettre le ei, et virer le LD (#6C0F),A au label "etla"


Back to top
Longshot


Offline

Joined: 21 Nov 2015
Posts: 93
Masculin
Point(s): 8
Moyenne de points: 0.09

PostPosted: Sat 22 Jul - 18:01 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

URL pour le fichier : http://www.sendspace.com/file/vznzyd

Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Sat 22 Jul - 18:24 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Les résultats :

-Test ld (de),a -> border 0 - ink 0,25
-Test add a,(ix+3) -> border 0 - ink 0,25

PJ "Standard'"


Remplacement EI->Nop

Le border est vert, ink0 est violet

Remettre EI, virer ld (#6c0f),a (le label etla n'existe pas! tu l'as oublié!)

border noir, ink0 gris

voilà!
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Longshot


Offline

Joined: 21 Nov 2015
Posts: 93
Masculin
Point(s): 8
Moyenne de points: 0.09

PostPosted: Sat 22 Jul - 19:48 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Merci beaucoup, David. Okay

Résultat:
1) Le EI Z80A est impératif pour acquitter toutes les interruptions, quelque soit leur origine.
2) Sans l'acquittement DSCR pour le DMA actif, le EI autorise de nouveau les interruptions mais le Z80A considère que l'interruption reste à servir.
Du coup, le Z80A génère de nouveau une interruption (car pour lui celle qu'on quitte n'a pas été servie)
Je pense que c'est ce que disait Offset lorsqu'il parle d'empilement d'interruption (le terme n'est pas très bien choisi)
Ceci permet de générer des interruptions un peu n'importe où grâce à EI...
Peu d'intérêt puisque CALL existe.

Donc si on ne met pas un EI après avoir acquitté l'interruption (dcsr.bit acq=1), on n'a effectivement plus d'interruption
(mais mettre le EI n'empile en rien l'interruption, il permet simplement à la suivante de survenir)

L'acquittement d'une interruption DMA en acquittement manuel (ivr.bit0=1) passe donc par "dscr.bit acq=1" et "ei"

Lorsque PRI=0, on a les interruptions R52
Lorsque PRI<>0, on a les interruptions raster.

Vu que EI est obligatoire pour acquitter les DMA, on ne peut pas se débarrasser simplement des interruptions R52/PRI
Pour le faire, il faudrait modifier sans cesse RMR.bit4 pour réinitialiser R52, soit jouer avec la valeur de PRI...
Pas super bien pensé ce bazar.


Back to top
roudoudou


Offline

Joined: 14 Jul 2016
Posts: 427
Localisation: LYON
Masculin
Point(s): 46
Moyenne de points: 0.11

PostPosted: Sat 22 Jul - 20:10 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

En fait, c'est quoi alors? C'est pas bogué mais c'est mal pensé?

J'croyais que ça faisait pas ce qu'on voulait?


Back to top
Longshot


Offline

Joined: 21 Nov 2015
Posts: 93
Masculin
Point(s): 8
Moyenne de points: 0.09

PostPosted: Sat 22 Jul - 20:53 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Roud, il y a plusieurs sujets...
Au niveau des acquittements, j'avais un questionnement car je me demandais comment ne garder que les interruptions dma (donc inhiber seulement R52 et/ou PRI).



Sur le cpcwiki, on a vu que le bit 6 de R52 n'est pas remis à 0 lorsqu'il s'agit d'une interruption DMA (contrairement à ce que fait winape, qui est un bug à corriger)


Concernant le bug d'interversion dma/raster, je ne comprends pas pourquoi mon code ne le fait pas "apparaitre", surtout si il apparait aussi facilement avec le code de Kevin.

La différence, c'est qu'il ne connecte pas l'asic et donc il ne touche pas à IVR. IVR.bit0=1 par défaut (acquittement manuel) mais cela ne concerne pas les acquittements R52/PRI
Du coup, il considère l'état des bits 3 à 7 de IVR inconnus, et il duplique la table des 4 vecteurs dans toute la page.


Le code ci-dessous est le même test que lui.
David, est ce que tu obtiens bien du bleu/jaune avec ce code ?



Code:
         org &a000
test
        di
        ld bc,&7F00+%10001101
        out (c),c        ; roms off, mode 1
        ld sp,&c000
        ;
        ld hl,dma_int
        ld (&8000),hl
        ld (&8002),hl
        ld (&8004),hl
        ld hl,raster_int
        ld (&8006),hl    
        ld hl,&8000
        ld de,&8008
        ld bc,256-8
        ldir
        ;
        ld a,&80
        ld i,a
        ;
        im 2
        ;
        ld bc,#7F10
        out(c),c
        ld de,#4449
        ei
loupe
        defs 64,&12
        defs 64,0
        jp loupe

dma_int:
        out (c),d
        ei
        ret
raster_int:
        out (c),e
        ei
        ret
        
tabazik
        DB 255,0,255,119,179
        DB 81,168,212,98,57,156
        DB 70,43,21,138,205
        DB 238




Back to top
Display posts from previous:   
Post new topic   Reply to topic    Amstrad Plus Forum Index -> Programmation Cpc -> Asic All times are GMT + 2 Hours
Goto page: 1, 2, 3, 4, 5, 6  >
Page 1 of 6

 
Jump to:  

Index | Administration Panel | Create a forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group