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
Guest
Guest

Offline




PostPosted: Wed 26 Jul - 15:38 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Pas mon mot de passe sur mon pc pro...
Fait un org &A000 ou &7000 et le bug ne se produira plus, quelque soit la valeur que tu mets dans I


Back to top
Publicité






PostPosted: Wed 26 Jul - 15:38 (2017)    Post subject: Publicité

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

Offline

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

PostPosted: Wed 26 Jul - 15:40 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Anonymous wrote:
Pas mon mot de passe sur mon pc pro...
Fait un org &A000 ou &7000 et le bug ne se produira plus, quelque soit la valeur que tu mets dans I


Je regarde ça de suite ^^
_________________
Ast/iMP4CT

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


Back to top
Ast
Administrateur

Offline

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

PostPosted: Wed 26 Jul - 15:49 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Salut,

Après une courte discussion avec Roudoudou ce matin et une petite correction avec Longshot cet après midi concernant le bug qui mélange les interruptions Dma0 et Raster (PRI) en mode iM2, il semblerait qu'une solution viable ait été trouvée.
Je m'en vais de ce pas vous l'expliquer.

Il suffirait d'avoir le bit 13 du poids fort de l'adresse du code (Merci Longshot!) à 1 pour que ce bug ne se produise pas, ce qui nous laisserait les adresses suivantes (#2xxx, #3xxx, #6xxx, #7xxx, #axxx, #bxxx, #exxx,#fxxx) hors du fameux bug !

Description Octet poids fort (si bit 13=1)
%0010 -> #20
%0011 -> #30
%0110 -> #60
%0111 -> #70
%1010 -> #a0
%1011 -> #b0
%1110 -> #e0
%1111 -> #f0
Qu'à cela ne tienne ! Je décide donc de tester avec le programme du maitre en modifiant un peu quand même





Code:
;           Gestion du mode d'interruption
;         vectorisé sur 6128 plus et 464 plus
; (mise en évidence du bug du vecteur d'interruption)
;
;                Par OffseT of Futurs'
;              pour Quasar CPC numéro 10
;                Modifié par AsT/iMPact 26/07/2017
;
;      Attention : pensez à délocker l'ASIC avant
; de lancer ce prog car sinon c'est le plantage assuré !!!
;
 
 Org &2000  ; (Bit 13 à 1)
Ent $
 
vector Equ &a0   ; Octet de poids fort
                         ; de l'adresse des
                         ; vecteurs d'interruption
adr Equ vector*&100 ; adr = &a000
ivr Equ 0   ; Valeur du registre IVR
 
dma0 Equ adr+ivr+%100 ; Déclaration des adresses
dma1 Equ adr+ivr+%010 ; des vecteurs d'interruption
dma2 Equ adr+ivr+%000 ; des DMA son 0, 1 et 2 et
rast Equ adr+ivr+%110 ; de l'interruption raster.
 
      di   ; On interdit les
            ; interruptions pour
            ; ne pas avoir de surprise !
      ld bc,&7fb8  ; On connecte la page
      out (c),c  ; I/O ASIC en &4000-&7FFF
                      ; (comme d'habitude)
      ld a,vector  ; On charge l'octet de
                         ; poids fort du vecteur
      ld i,a   ; d'interruption dans I.
      ld a,ivr  ; Chargement du registre IVR
      ld (&6805),a  ; sur la page I/O ASIC
      ld bc,&7fa0  ; Déconnexion de la page
      out (c),c  ; I/O ASIC
      ld hl,son0  ; Initialisation des vecteurs
      ld (dma0),hl  ; d'interruption aux adresses
      ld hl,son1  ; calulées lors de la
      ld (dma1),hl  ; déclaration des constantes.
      ld hl,son2  ; (DMA0)=Son0
      ld (dma2),hl  ; (DMA1)=Son1
      ld hl,raster  ; (DMA2)=Son2
      ld (rast),hl  ; (RAST)=Raster
      im 2   ; Passage en mode vectorisé

;
main ld b,#f5
vbl    in a,(c)
        rra
        jr nc,vbl
        ei
        halt
        jr vbl
;
; Vecteur d'interruption
;
 
son0 push af  
     push bc
     ld bc,#7f4c ; rouge
     ld a,#10
     out (c),a
     out (c),c
     pop bc
     pop af   ; le vecteur d'interruption
     jp &b941  ; du système - Si 464 Plus, mettre le vecteur #b939
 
son1 push af  
     push bc
     ld bc,#7f58 ; violet
     ld a,#10
     out (c),a
     out (c),c
     pop bc
     pop af   ; le vecteur d'interruption
      jp &b941  ; du système - Si 464 Plus, mettre le vecteur #b939
 
son2 push af  
     push bc
     ld bc,#7f44 ; bleu
     ld a,#10
     out (c),a
     out (c),c
     pop bc
     pop af   ; le vecteur d'interruption
      jp &b941  ; du système - Si 464 Plus, mettre le vecteur #b939
 
Raster push af     push bc
     ld bc,#7f4e ; orange
     ld a,#10
     out (c),a
     out (c),c
     pop bc
     pop af   ; le vecteur d'interruption
      jp &b941  ; du système - Si 464 Plus, mettre le vecteur #b939














1. Ne pas oublier de délocker l'asic avant de lancer ce test !
2. L'adresse du vecteur (vector) est toujours positionné en #a000, on peut modifier ce paramètre pour mettre l'adresse désirée.
3. L'adresse de la routine est positionnée (bit 13 à 1)

Résultat :

Si tout fonctionne correctement nous devrions avoir un border de la couleur orange et nous avons bien ce résultat ! Félicitation les Gars ^^

Conclusion :  Le résultat est sans appel : ça fonctionne !

_________________
Ast/iMP4CT

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


Back to top
Guest
Guest

Offline




PostPosted: Wed 26 Jul - 16:05 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Il faut maintenant déterminer (ce qui est en cours) dans quelle situation ça ne fonctionne pas lorsque le bit 13 vaut 0
(car lorsqu'on parle de bug, il se produit seulement dans certains cas de figure)
D'ou l'autre programme que tu peux tester en le mettant en &9000 Laughing


Back to top
Ast
Administrateur

Offline

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

PostPosted: Wed 26 Jul - 16:12 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

C'est déjà un grand pas !

Pour ton programme il doit y avoir quoi comme résultat ?
_________________
Ast/iMP4CT

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


Back to top
Guest
Guest

Offline




PostPosted: Wed 26 Jul - 16:42 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Avec le code suivant, je pensais qu'on devait tout avoir en bleu ou tout avoir en jaune.
Or Roud obtient du bleu sur la 2ème interruption de manière stable et toutes les autres en jaune (voir écran sur cpcwiki page 9)
Obtiens tu  la même chose ?

Code:

          org &9000
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 hl,&8000
        ld de,&8008
        ld bc,256-8
        ldir
        ;
        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,&8100
        ld de,&8108
        ld bc,256-8
        ldir
        ;
        ld bc,&7F10
        out (c),c
        ;
        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

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    
  




Back to top
Ast
Administrateur

Offline

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

PostPosted: Wed 26 Jul - 16:48 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Voici le résultat:



Border Jaune !

Edit
Même résultat sur le Cpc Plus de Cmp!
_________________
Ast/iMP4CT

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


Back to top
Guest
Guest

Offline




PostPosted: Wed 26 Jul - 16:59 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

C'est plutôt bizarre car Roud vient d'écrire sur CpcWiki que ça fait la même chose sur ses autres CPC (voir écran page 10 du post sur CpcWiki)
Ce qui est bizarre sur sa photo, c'est que le fond est noir, alors que je n'ai pas touché à cette couleur.

Roud ? WTF?

Bref, on est bien avec le bit 13=0, mais avec no bug, ce qui me parait bien plus cohérent.


Back to top
Ast
Administrateur

Offline

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

PostPosted: Wed 26 Jul - 17:17 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Pour ma part, sur mes 2 cpcs, ça donne bien le même résultat, je confirme!
_________________
Ast/iMP4CT

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


Back to top
roudoudou


Offline

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

PostPosted: Wed 26 Jul - 18:51 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Longshot, n'oublie pas que j'exécute une cartouche, par défaut tout est noir non?

Back to top
Longshot


Offline

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

PostPosted: Wed 26 Jul - 18:51 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Et avec celui ci, tu obtiens quoi ?

 
Code:

          org &9000
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 hl,&8000
        ld de,&8008
        ld bc,256-8
        ldir
        ;
        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,&8100
        ld de,&8108
        ld bc,256-8
        ldir
        ;
        ld bc,&7F10
        out (c),c
        ;
        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
         nop     ; 1 -- 37
            call wait        ; 5 
            nop            ; 1 
end_calibrate
            nop
me        jr me

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
            nop     ; 1 -- 37
instruction     ld b,a            ; instruction to test
          ds 10,0    
  




Back to top
Longshot


Offline

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

PostPosted: Wed 26 Jul - 18:55 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

 
Quote:
 Longshot, n'oublie pas que j'exécute une cartouche, par défaut tout est noir non?
J'imagine en effet que c'est le basic qui met le fond bleu Very Happy
En l'état, je suppose que lorsque le bit 13 est à 0, il faut peut-être aussi que le bit 0 soit à 0 pour que ça bug
Car il est possible que la 2ème interruption survienne un nop avant ou après, et donc on est sur une adresse paire ou impaire.


Back to top
Ast
Administrateur

Offline

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

PostPosted: Wed 26 Jul - 18:57 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Longshot : ça va me prendre un peu de temps de convertir ton source... J'ai toutes tes tabulations qui s'affiche sous forme de "^"
Dis moi plutôt ce qui change, je modifie ton 1er source comme cela ! merci
_________________
Ast/iMP4CT

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


Last edited by Ast on Wed 26 Jul - 18:57 (2017); edited 1 time in total
Back to top
Longshot


Offline

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

PostPosted: Wed 26 Jul - 18:57 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

D'ailleurs si c'est vrai, (Roud), tu devrais avec ce code dont j'ai décalé le code interrompu (ou simplement en assemblant le code en 9001), obtenir strictement l'inverse, à savoir du bleu avec une interrupt jaune...

Back to top
Longshot


Offline

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

PostPosted: Wed 26 Jul - 18:59 (2017)    Post subject: Amstrad Plus et Acquittements Interruptions Reply with quote

Quote:

 Longshot : ça va me prendre un peu de temps de convertir ton source... J'ai toutes tes tabulations qui s'affiche sous forme de "^"
Il y a plus simple. Assemble le précédent en &9001

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 5 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