Inscription : 12 Juin 2008, 20:29 Message(s) : 1709
Hello à tous !
Je souhaite vous parler de potentiel problème de compatibilité entre ces 2 demos et nos chers CPC :
1) Equalizor demo de P007
Elle ne marche pas sur un CPC 6128 avec CRTC1 au moment où le programme ce décompress/decrypt...voici la portion de code en question (utilisation du registre R pour vérifier que le code est celui original car R est utilisé comme clé de décryptage (XOR (HL)) du code :
voici mon analyse sur emulateur : décodage à partir de 8442
en 8451 interrupt ! alors qu'on devrait être en 8452 !
du coup décalage de R de 1 au retour de l'interrupt!
-> détection de la HSYNC trop tôt d'une microseconde ce qui va déclencher l'interruption du z80 trop tôt d'une micro seconde !!!
si je décale d'une microseconde la détection de la HSYNC, cela fonctionne sur l'émulateur en question, donc pas lié à un mauvais code d'émulation z80 !
Dois-je en déduire que c'est un comportement du CRTC1 différent du CRTC0 par exemple où cette demo fonctionne ? ou sur les deux Z80 différents, notamment sur l'instruction HALT juste avant en &8441 ou autre différence de timming sur le ld A,R par exemple ?
2) ReSeT 0 - Outer World Music
Pour cette fois, la différence entre les deux CPC 6128 (CRTC0 et CRTC1) que j'ai testé est peut-être lié au PPI (ou au Z80) ???
Le CPC 6128 CRTC 0 sur lequel on entend bien la musique a un PPI Toshiba TMP8255AP-5 (8804A), le cpu : Z8400APS Z80 CPU (8609) Le CPC 6128 CRTC 1 sur lequel on entend pas la musique (et vumètres restent à 0) : PPI NEC D8253AC-5 (8609EJ), le cpu : Z0840004PSC Z80 CPU (8803)
pb avec out(#ff),a ! soit out(#E6FF),#E6 ou out(#A6FF),#A6 qui ne marche pas avec le second PPI ??
Code :
org #9541 ld hl,#96b9 ld de,#e6a6 ld bc,#f400 .l954a ld a,d out (#ff),a out (c),c ld b,d out (c),0 dec b outi ld a,e out (#ff),a inc c ld a,#0d cp c jr nz,l954a bit 7,(hl) jr nz,l956d ld a,d out (#ff),a out (c),c inc b ld a,e out (#ff),a outi .l956d ld b,d out (c),0 ret
Dois-je en déduire que c'est un comportement différent entre les deux PPI de marque différentes ??
The NMOS Z80s suffer a problem whereby LD A,I and LD A,R record the state of IFF2 after it has been reset if an interrupt is delivered during that instruction. This behaviour, along with workarounds for this for use in interrupt handlers are documented in the Z80 Family Questions and Answers section of the Zilog Product Specifications Databook, and is useful for detecting the model of Z80 in use, so as to determine whether the CPU (assuming it is a genuine NMOS or CMOS Z80) provides an 'OUT (C),0' instruction (NMOS), or 'OUT (C),255' instead (CMOS).
OUT (C),0 or OUT (C),255 instruction
In 1996, Simon Cooke noted in a Usenet posting that the undocumented instruction usually referred to as 'OUT (C),0' behaves instead as 'OUT (C),255' on CMOS Z80s.
Later, in 2004, Colin Piggot rediscovered this with his own SAM Coupé, when running a demo for SCPDU 6, coincidentally written by Simon Cooke. With the CMOS Z80, a white background colour was set over part of the screen in the demo. This was described in SAM Revival Issue 9 (March/April 2004).
In 2008, this was once again rediscovered by the MSX community.
Pour ton premier souci, je ne vois pas le souci avec l'interruption qui arrive un peu après, ça ne va rien changer puisque tu as déjà fait le xor (hl) et pas encore le LD A,R, ce n'est à mon sens pas la première interruption qui arrive le problème (les suivantes, peut-être si elles ont lieu à un autre moment, à savoir entre le LD A,R et le XOR (HL) )
En plus ce qu'il fait ne sert à rien niveau chiffrement, tu peux modifier le code quand même, vu que la boucle fait toujours la même chose, la valeur de A avant le XOR va respecter la même suite, quelles que soient les données lues.
Megachur : Pourquoi la valeur de R serait-elle différente en &844C, selon que l'interruption pop en &8451 ou &8452 ?
A priori, quelque soit l'adresse, au retour, le +1 fait au préalable est rattrapé immédiatement, ce qui fait qu'à 844C, R doit être égal dans les deux cas... Ou est-ce que j'oublie quelque chose ?
Par ailleurs, as-tu le code désassemblé de la routine d'interruption ? On y apprendra peut-être quelque chose ?
Inscription : 12 Juin 2008, 20:29 Message(s) : 1709
Lone a écrit :
Hello,
Megachur : Pourquoi la valeur de R serait-elle différente en &844C, selon que l'interruption pop en &8451 ou &8452 ?
A priori, quelque soit l'adresse, au retour, le +1 fait au préalable est rattrapé immédiatement, ce qui fait qu'à 844C, R doit être égal dans les deux cas... Ou est-ce que j'oublie quelque chose ?
Par ailleurs, as-tu le code désassemblé de la routine d'interruption ? On y apprendra peut-être quelque chose ?
en fait, je donnais un exemple, l'interruption n'aura pas toujours lieu à la même adresse...
R est incrémenté aussi pendant l'exécution du code en &38...
effectivement, le code en &38 y est pour quelque chose : (enfin en #8483...)...et à chaque instruction -> R++ donc au finale R=R+&0c (+12 car les instrucions IX ey IY on un &dd et &fd qui compte aussi )
org #0038 jp #8483
org #8483 ei pop ix <- récupère l'adresse où l'interruption en &38 a été déclenchée ! pop iy ld iy,#82bf push iy jp (ix) --> go en retour à l'adresse où l'interruption a été déclenchée !
donc c'est surtout quand elle a lieu pendant le début d'instruction ld a,r que cela à une influence sur la valeur de R récupéré dans A (et donc le XOR(HL)) !
donc c'est surtout quand elle a lieu pendant le début d'instruction ld a,r que cela à une influence sur la valeur de R récupéré dans A (et donc le XOR(HL)) !
C'est ce que j'avais écrit dans mon premier post, malgré que tu parles au début d'une interruption qui ne devait rien changer à l'affaire
marcel a écrit :
(les suivantes, peut-être si elles ont lieu à un autre moment, à savoir entre le LD A,R et le XOR (HL) )
Bon, au final, on a des interruptions qui ne se passent pas au bon moment... (j'ai pas de CRTC1 pour jouer)
Inscription : 12 Juin 2008, 20:29 Message(s) : 1709
marcel a écrit :
Megachur a écrit :
donc c'est surtout quand elle a lieu pendant le début d'instruction ld a,r que cela à une influence sur la valeur de R récupéré dans A (et donc le XOR(HL)) !
C'est ce que j'avais écrit dans mon premier post, malgré que tu parles au début d'une interruption qui ne devait rien changer à l'affaire
marcel a écrit :
(les suivantes, peut-être si elles ont lieu à un autre moment, à savoir entre le LD A,R et le XOR (HL) )
Bon, au final, on a des interruptions qui ne se passent pas au bon moment... (j'ai pas de CRTC1 pour jouer)
--> du coup, est-ce du à mon CRTC1 qui n'a pas un bon timming ou est-ce valable pour tout les CRTC1s ?
Si tu faisais un proof of concept que tu postais sur ici (et/ou sur cpcwiki) pour que les possesseurs de CRTC 0 et 1 testent?
C'est intéressant comme différence (et probablement pas compliqué à émuler correctement)
Si ça se trouve, on doit pouvoir observer une différence avec un code du style, à moins que le HALT n'ait pas le souci!
Code :
EI LD B,#F5 IN A,(C) RRA JR NC,$-2 HALT LD A,#DD LD R,A HALT LD A,R PUSH AF AND #F ADD 128 CALL #BB5A POP AF AND #F0 CALL #BB5A LD A,10 CALL #BB5A LD A,13 CALL #BB5A RET
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 37 invité(s)
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas insérer de pièces jointes dans ce forum