CPC Rulez
https://cpcrulez.fr/forum/

Equalizor demo et Outer World Music disk pb sur CPC CRTC1 !?
https://cpcrulez.fr/forum/viewtopic.php?f=7&t=5835
Page 1 sur 1

Auteur :  Megachur [ 14 Nov 2016, 07:24 ]
Sujet du message :  Equalizor demo et Outer World Music disk pb sur CPC CRTC1 !?

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 :

Code :
8438:ei
8439:ld b,&f5
843B:in a,(c)
843D:rra
843E:jp nc,&843B
8441:halt
8442:ld a,&da
8444:ld r,a*
8446:ld hl,&0140
8449:ld de,&81D2
844C:ld a,r
844E:xor (hl)
844F:ld (hl),a
8450:inc hl
8451:dec de
8452:ld a,d
8453:or e
8454:jp nz,&844C


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


Comparaison des deux Z80 : http://www.cpu-world.com/Compare/977/Zilog_Z80_4_MHz_(Z0840004PSC)_vs_Zilog_Z80_4_MHz_(Z8400APS).html

j'ai juste trouvé une référence ici sur une différence sur des z80s et les outs : est-ce que les deux problèmes rencontrés sont liés ??

Differences between NMOS and CMOS Z80s http://faqwiki.zxnet.co.uk/wiki/Z80#OUT_.28C.29.2C0_or_OUT_.28C.29.2C255_instruction

Citer :
LD A,I and LD A,R bug

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.



J'espère que ce challenge vous intéresse... :winner: :biere: :winner: :biere:

:winner: N'hésitez pas à poster votre analyse ici !!! :winner: :sweatingbullets: :sweatingbullets: :winner:

Auteur :  marcel [ 14 Nov 2016, 13:25 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

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.

Auteur :  Megachur [ 14 Nov 2016, 20:40 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

merci pour ta réponse rapide !

mais tu as oublié un détail dans ton analyse dans le fonctionnement du Z80 : le registre R est incrémenté à lecture d'un octet d'instruction... :magic:

donc en gros si tu as
a=&da
ld r,a

ld hl,&0140
-> r++
8449:ld de,&81D2
-> r++
844C:ld a,r
-> r++
a=&dd !

etc...

comme cela boucle sur &844c, l'instruction ld a,r donnera toujours un :magic: R :magic: différent !

je te rassure, si c'était 'trivial', je n'aurai même pas posté cela ici !

Auteur :  Lone [ 14 Nov 2016, 20:44 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

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 ?

Auteur :  Megachur [ 14 Nov 2016, 21:14 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

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

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)) ! :magic: :kissed: :kissed: :sweatingbullets: :?

Auteur :  marcel [ 14 Nov 2016, 23:22 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

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)) ! :magic: :kissed: :kissed: :sweatingbullets: :?


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)

d'après les docs officielles, on est en dessous de la microseconde pour le respect du hsync mais peut-être que la faible différence sur le CRTC1 peut jouer?
voir http://www.cpcwiki.eu/imgs/c/c0/Hd6845.hitachi.pdf
et http://www.cpcwiki.eu/imgs/b/b5/Um6845r.umc.pdf

Auteur :  Megachur [ 15 Nov 2016, 07:36 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

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)) ! :magic: :kissed: :kissed: :sweatingbullets: :?


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)

d'après les docs officielles, on est en dessous de la microseconde pour le respect du hsync mais peut-être que la faible différence sur le CRTC1 peut jouer?
voir http://www.cpcwiki.eu/imgs/c/c0/Hd6845.hitachi.pdf
et http://www.cpcwiki.eu/imgs/b/b5/Um6845r.umc.pdf


--> du coup, est-ce du à mon CRTC1 qui n'a pas un bon timming ou est-ce valable pour tout les CRTC1s ?

Auteur :  marcel [ 15 Nov 2016, 13:34 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

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

Auteur :  Megachur [ 30 Déc 2016, 10:28 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

Coucou !

--> :sweatingbullets: :sweatingbullets: Personne pour me faire un retour pour savoir si ces 2 démos marchent sur vos cpcs (avec le coupe CRTC/PPI à me donner pour info) ???

A votre bon coeur cpcien :kiss: mesdames et messieurs :biere: !!!

Auteur :  Supersly [ 31 Déc 2016, 02:41 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

Sur mon CRTC1, j'ai bien un problème sur la 1ere démo (écran noir), mais aucun sur la seconde : les musiques de la Reset 0 passent bien.

Auteur :  Megachur [ 31 Déc 2016, 08:46 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

@Supersly : merci pour ton retour ! :biere: :thankyou:

Sur ton CRTC1, quelle est la marque/modèle de ton PPI ? :soshelp:

Auteur :  Supersly [ 31 Déc 2016, 18:31 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

Toshiba TMP8255AP-5

Par contre, si tu veux une photo de la CM, ce sera plus chiant, car des fils sont soudés en travers pour mes boutons Reset & Cie (pas de ma faute).

Auteur :  Megachur [ 31 Déc 2016, 21:11 ]
Sujet du message :  Re: Equalizor demo et Outer World Music disk pb sur CPC CRTC

@Supersly : merci pour l'info !

Cela confirmerait que sur le PPI NEC D8253AC-5 on a un comportement différent que sur le PPI Toshiba sur ce point !

Page 1 sur 1 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/