Amstrad Plus Index du Forum

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

 FAQFAQ   RechercherRechercher   MembresMembres   GroupesGroupes   S’enregistrerS’enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Amstrad Plus et Acquittements Interruptions
Aller à la page: 1, 2, 3, 4, 5, 6  >
 
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation
Sujet précédent :: Sujet suivant  
Auteur Message
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 54

MessagePosté le: Sam 22 Juil - 11:09 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

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.


Revenir en haut
Publicité






MessagePosté le: Sam 22 Juil - 11:09 (2017)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 112

MessagePosté le: Sam 22 Juil - 11:33 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

Longshot a écrit:
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 a écrit:
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...."


Revenir en haut
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 54

MessagePosté le: Sam 22 Juil - 13:22 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

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é....

Citation:
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


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 112

MessagePosté le: Sam 22 Juil - 13:35 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

Longshot a écrit:
...
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 a écrit:

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

Citation:
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 a écrit:

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 a écrit:
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...."


Revenir en haut
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 54

MessagePosté le: Sam 22 Juil - 14:27 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

Citation:
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.

Citation:


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


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 112

MessagePosté le: Sam 22 Juil - 14:36 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

Longshot a écrit:
Citation:
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 a écrit:


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...."


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 112

MessagePosté le: Sam 22 Juil - 14:48 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

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...."


Revenir en haut
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 54

MessagePosté le: Sam 22 Juil - 15:06 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

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.


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 112

MessagePosté le: Sam 22 Juil - 15:22 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

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

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


Revenir en haut
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 54

MessagePosté le: Sam 22 Juil - 17:59 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

Citation:
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"


Revenir en haut
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 54

MessagePosté le: Sam 22 Juil - 18:01 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

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

Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 112

MessagePosté le: Sam 22 Juil - 18:24 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

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...."


Revenir en haut
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 54

MessagePosté le: Sam 22 Juil - 19:48 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

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.


Revenir en haut
roudoudou


Hors ligne

Inscrit le: 14 Juil 2016
Messages: 210
Localisation: LYON

MessagePosté le: Sam 22 Juil - 20:10 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

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?


Revenir en haut
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 54

MessagePosté le: Sam 22 Juil - 20:53 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions Répondre en citant

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




Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 05:43 (2017)    Sujet du message: Amstrad Plus et Acquittements Interruptions

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation Toutes les heures sont au format GMT + 2 Heures
Aller à la page: 1, 2, 3, 4, 5, 6  >
Page 1 sur 6

 
Sauter vers:  

Index | Panneau d’administration | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com