t'es sur ? parce qu'elle fonctionne tres bien sur mon crtc1
Oui, je suis certain.
Cette démo est (dé)cryptée « classiquement » avec des XOR avec la valeur du registre R.
Le registre R évolue selon le nombre d'octets d'instructions lu par le Z80A.
Code : Tout sélectionner
#8438
ei ; interruptions autorisées
ld b,#f5 ; attente de vsync
wait_vsync
in a,(c)
rra
jp nc,wait_vsync
halt ; et interruption pour caler R
ld a,#da ; R initialisé pour le decodage
ld r,a
ld hl,#140 ; debut du code a decrypter
ld de,#81d2 ; longueur du code a decrypter
decode
ld a,r ; r=r+2 Lecture de R
xor (hl) ; r=r+1 Decodage
ld (hl),a ; r=r+1 Remise en memoire
inc hl ; r=r+1
dec de ; r=r+1
ld a,d ; r=r+1
or e ; r=r+1
jp nz,decode ; r=r+1
Cependant, les interruptions sont
actives.
Avant le décodage, R est calé à partir d'un HALT.
Dès qu'une interruption survient dans cette boucle, le registre R est incrémenté par l'appel et le code de l'interruption.
Tout irait bien si les interruptions étaient très précises et tombaient toujours au même endroit.
Mais ce n'est pas toujours le cas, et notamment sur le CRTC 1.
Dans ce cas, si l'interruption survient avant ou après le LD A,R, la valeur de R ne sera pas la même pour décoder l'octet.
Et par voie de conséquence, le décodage se passe bien sur certains CRTC 1 et moins bien sur d'autres.
Sur mon CRTC 1 numéro 1, la démo fait un RESET.
Sur mon CRTC 1 numéro 2, la démo démarre mais tous les gfx sont totalement corrompus.
Aucun problème sur CRTC 0 et 2.
Tu trouveras l’explication détaillée sur ce sujet au chapitre 26.7.2 (p 275) du compendium 1.5.
En gros, cela tient à la précision du CRTC à signaler sa fin de HSYNC au GATE ARRAY pour que ce dernier demande une interruption au Z80A.