Les problèmes de compatibilité entre les CPC et CPC+

(c) Maj du 08/01/2005 * (c) Tom et Jerry du GPA


Ce texte est une version un peu modifiée d'un article publié dans la revue CPC Infos numéro 46. Elle fait le point sur les problèmes que tout utilisateur de CPC Plus peut rencontrer avec des programmes originaux. Si ce document peut apparaître inutile aux ténors du CPC (il n'en reste plus beaucoup, en fait :-) ), je suppose qu'il peut intéresser les éventuels nouveaux amateurs de cette prodigieuse machine.

Ces derniers ont déjà dû connaître la douloureuse expérience de s'apercevoir que leur dernier jeu original acheté sur E-Bay se plante lamentablement sur sa machine. Ne perdez pas espoir, la plupart du temps, il est possible de modifier le code incompatible ou de trouver des versions patchées des programmes "défectueux".

Avec cet article, vous avez la cerise sur le gâteau, des fichiers permettant d'utiliser des programmes incompatibles. Il y en a pour des jeux originaux, mais aussi pour quelques jeux déprotégés. Cliquer ici pour downloader le tout.


Les problèmes liés a la ROM disquette

Comme vous avez dû le remarquer, l'une des principales nouveautés du CPC+ par rapport à son aîné, c'est son port cartouche. Amstrad a jugé bon de fournir une partie de la ROM du CPC+, non pas en interne, mais sur une cartouche, celle qui contient également Burnin' Rubber. Les programmeurs en ont profité pour retoucher la ROM disque, en partie pour loger de nouvelles RSX dans le CPC+ (|JEU, |JUEGO, |GAME).

Le résultat de ce travail est que le code de cette nouvelle version de la ROM disque est "décalé" par rapport à l'ancienne. Cela se traduit par un plantage assuré lors d'un appel direct à une routine de cette ROM. Certaines parties ont même été complètement modifiées ! Il semblerait de plus que le FDC du CPC+ (composant spécialisé gèrant le lecteur de disquette) soit légèrement buggué, dixit Longshot du Logon System, que je remercie au passage pour ses conseils éclairés. Son timing semble différent, ce qui explique que beaucoup de logiciels de copie physique (Discology, Hercule, etc...) accédant directement au FDC ne fonctionnent pas.

Cette différence de la ROM disque est aussi la source du plantage de chargeurs de jeux plus ou moins anciens utilisant le loader Mirrorsoft, comme Strike Harrier Force, Biggles, Geebee Air Rallye, mais aussi d'autres jeux avec des protections moins connues : Sigma 7, Fernandez must die, etc... Tous les loaders d'anciens jeux d'Ere Informatique et d'Infogrames sont également concernés.

Le remède le plus simple pour corriger ce problème consiste à se procurer une cartouche contenant l'ancienne ROM du CPC, distribuée par Amstrad peu après la sortie du CPC+. Il est malheureusement très difficile de la trouver. Elle ne corrige pas de plus les plantages constatés sur les copieurs physiques.

Une autre solution consiste à adapter ces chargeurs, en modifiant dans la mesure du possible, les adresses d'appels aux routines de la ROM disque.

Vous trouverez ci-dessous une table de conversion des principales adresses rencontrées. Cette modification ne s'avère hélas pas efficace à 100%, certains jeux continuant à planter, en particulier la plupart des anciens softs Infogrames (Les dieux de la mer, Bob Morane Espace) effectuant des rechargements.

Table de conversion

CPCCPC plus
&C6E5&C6EC
&C91C&C94A
&C947&C971
&C95C&C988
&C976&C9D8
&D252&D349


Troisième option, se procurer une version déprotégée du logiciel qui ne se charge pas correctement. S'il est en fichiers, il n'utilise forcément plus un chargeur faisant directement appel à la ROM disque ! De plus, si vous possédez l'original du programme, c'est parfaitement légal.


Les problèmes liés à l'émulation du PPI

Autre source fréquente d'incompatibilité, l'émulation du PPI 8255. Pour doter le CPC+ de caractéristiques étendues par rapport au CPC, et au passage faire des économies d'echelle, Amstrad n'a pas hésité à remplacer le Gate Array, le CRTC et le PPI 8255 du CPC par une puce nouvelle, l'ASIC. Même si elle s'avère très puissante (sprites hardware, 4096 couleurs, etc... ), elle n'en présente pas moins un petit défaut au niveau de l'émulation du PPI, en ne réagissant pas exactement comme celui du CPC.

Dans la pratique, en fonction de la façon dont la routine lisant les touches du clavier est programmée, le clavier ne "répond" plus, aucune des touches sur lesquelles vous pouvez appuyer n'est prise en compte.

Autre phénomène rigolo, même si moins grave, on trouve dans quelques démos des vumètres ne fonctionnant pas sur CPC Plus. Ce phénomène est dû à la routine lisant le volume sonore du PSG, qui, comme par hasard, "passe" par le PPI !

Dans les deux cas, l'adaptation à réaliser pour rendre une routine compatible est simple. La routine de lecture ci-dessous n'est pas complète, seule la portion posant problème est indiquée. Si vous voulez plus d'informations sur la manière de réaliser une routine de lecture clavier, je vous incite à vous reporter sur l'excellent article de Stéphane Rodriguez que vous trouverez sur le site http://tj.gpa.free.fr.

Routine CPC incompatibleRoutine CPC +
LD BC,&F40ELD BC,&F40E
OUT (C),COUT (C),C
LD BC,&F6C0LD BC,&F6C0
OUT (C),COUT (C),C
LD BC,&F79ELD C,&00
OUT (C),COUT (C),C
....LD BC,&F79E
OUT (C),C
....


Comme vous pouvez le constater, l'adaptation est minime. Il suffit de faire un OUT &F6,&00 après le OUT &F6,&C0. La seule difficulté consiste à retrouver dans un jeu cette fameuse routine de lecture du port clavier. Une interface style Hacker est chaudement recommandée pour simplifier les recherches.

Attention, l'ASIC est aussi sensible à l'ordre dans lequel vous transmettez les données dans les ports. Ainsi, la routine suivante sera incompatible sur CPC+ alors qu'elle tourne parfaitement sur CPC :

LD BC,&F6C0
OUT (C),C
LD C,&00
OUT (C),C
LD BC,&F40E
OUT (C),C

Pour conclure le sujet, cette incompatibilité est, avec les problèmes liées à la ROM disque bricolée, la plus fréquente que vous pouvez rencontrer. Elle concerne aussi bien des jeux comme Barbarian, Super Cycle, Tornado Low level, que des démos ou des fanzines sur disquette !


Emulation du CRTC

Vous pouvez parfois avoir des problèmes d'affichage sur votre moniteur. L'écran n'est plus stable, une partie de l'écran est absente ou mal placée. Là, c'est l'émulation du CRTC par l'ASIC qui est en cause. Si vous êtes un fan de démos, vous devez savoir qu'il existe plusieurs types de CRTC (en gros, le processeur gérant la synchronisation de l'écran) sur le CPC, plus ou moins compatibles entre eux. L'ASIC semble avoir été conçu pour émuler un CRTC type 0, mais dans la pratique, il réagit différemment ; on parle de CRTC de type 4 pour les puristes. Les techniques dites de "rupture d'écran" peuvent donc poser problème.

L'adaptation de programmes utilisant de tels procédés est plutôt complexe et hasardeuse. Heureusement, ce genre d'incompatibilité est exceptionnel pour des jeux. On peut citer trois jeux ayant de tels soucis : Octoplex, Led Storm et Skateball. Par contre, pas mal de démos (Terrific demo, par exemple) refusent de fonctionner sur CPC+ à cause de l'émulation CRTC.


Programmes Basic/Binaires

On trouve parfois des programmes Basic dont le chargement s'opère comme un fichier binaire. Une fois chargé, une routine assembleur particulière "lance" le programme Basic. Pour une raison étrange, ce type de bricolage plante lamentablement sur CPC plus, bien que la ROM Basic soit en tout point similaire à celle d'un CPC 6128. Ce genre de routine a très peu été utilisé par des éditeurs. On la retrouve par contre dans les programmes Basic compactés avec le Crown Imploder. Un générateur de tels programmes a été publié dans le fanzine Noix de Croco numéro 4. Enfin, le fameux cracker C.A.C.H abusait de cette routine dans ses loaders...

Il existe un paliatif trés simple à ce problème. Il suffit de charger le programme binaire soit à partir d'un programme Basic, soit à partir des vecteurs système du CPC (&BC77, &BC83 et &BC7A). Bref, tout est bon sauf la commande RUN" !


Bugs graphiques

L'écran couleur du CPC nouvelle génération est plus large que les anciens modèles CTM 664. Cette différence de taille explique le fait que sur des demos en overscan, on distingue des choses sur le côté droit de l'écran que l'on n'est pas censé voir ! Il s'agit en général de bouts de lettres non effacées dans des scrollings. Cela n'est pas à proprement parler un bug, mais gâche un peu la qualité graphique de ces démos. Pour avoir un overscan couvrant la totalité de l'écran d'un CPC plus, il faut la définir comme suit :

LD BC,&BC01
OUT (C),C
LD BC,&BD31
OUT (C),C
LD BC,&BC02
OUT (C),C
LD BC,&BD32
OUT (C),C

Autre curiosité, si un programme a utilisé des rasters (changement de couleurs d'une encre synchronisé avec le balayage video) ou des split rasters (plusieurs changement d'une couleur sur une même ligne video), ces derniers seront décalé un peu vers la droite. Le décalage entre le CPC et le CPC+ correspond en gros à un NOP.

Il existe une petite astuce qui dans certains cas, peut éliminer ce bug. Il suffit de décaler l'écran du CPC plus d'un caractère vers la droite, en tapant la séquence suivante sous BASIC :

OUT &BC00,2
OUT &BD00,45

Evidemment, si le programme concerné change la valeur du registre 2 du CRTC, cela ne fonctionnera pas !


Chargeurs Basic et chaines hexadécimales

Vous trouverez dans l'archive diffusé avec cet article des loaders pour les programmes originaux suivants :

Afterburner (Activision)
Asterix and the magic cauldron (Melbourne house)
Barbarian (Palace software)
Biggles (Mirrorsoft)
Blue war (Free Game Blot)
Bob Morane Chevalerie (Infogrames)
Croco passion demo 2 (?)
Fernandez must die (Imageworks)
Geebee air rally (Activision)
Guadalcanal (Activision)
Le casse du siecle (Ariolasoft)
Nigel's Mansell grand prix (Martech)
Shufflepuck cafe (Microids)
Sigma 7 (Durell)
Sky demo 2 (Strooki)
Shufflepuck cafe (Microids)
Sky demo 2 (Strooki)
Star raiders II (Electric dreams)
Street sport basketball (Epyx)
Strike harrier force (Mirrorsoft)
Super cycle (Epyx)
Textomat (traitement de texte de Micro Applications)
Turbo cup (Loriciels)

Si vous maniez avec dextérité un éditeur de secteurs, voici quelques recherches à effectuer pour d'autres jeux. Un conseil, travaillez TOUJOURS avec une copie de sauvegarde de votre jeu, un malheur est si vite arrivé...

ARCADE TRIVIA QUIZZ SIMULATOR (Zeppelin)
****************************************
Rechercher : 06 F6 3E C0 (logé en mémoire vive en &C96)
Remplacer par : CD 7B 2A
Rechercher la chaine ASCII "rewind" (en &2A7B)
Remplacer par

COMANDO TRACER (Dinamic)
*************************
Rechercher : 01 0E F4
Remplacer par : CD 81 7F
Rechercher 2 fois la chaine ASCII "COPYR"
Remplacer LA 2EME CHAINE par : AE 91 9E F4 ED 49 01 C0 F6 ED 49 0E 00 C9

DEATH STALKER (Codemasters)
***************************
Rechercher : 32 AE 00 CD 0B 09
Remplacer par : CD DE 1C
Rechercher la chaine ASCII "CODE1.BIN"
Remplacer par : 32 AE 00 ED 49 C9

JONNY QUEST (hitech)
********************
Rechercher : 01 0E F4
Remplacer par : CD A6 94
Rechercher chaine ASCII "BY HITECH"
Remplacer par : 01 0E F4 ED 49 01 C0 F6 ED 49 0E 00 C9

MYTH (System 3)
***************
Rechercher : 01 C0 F6 ED 49
Remplacer par : C3 ED 87
Rechercher la chaine ASCII "YOUR QUEST"
Remplacer par : 00 01 0E F4 ED 49 01 C0 F6 ED 49 0E 00 ED 49 01 92 F7 C3 EA 96

MUTANT FORTRESS (Players)
*************************
Rechercher 2 fois : 01 C0 F6 ED 49 01 0E F4
Remplacer 2 fois par : 01 0E F4 ED 49 CD EE 2C
Rechercher 1 fois la chaine ASCII "REWIND"
Remplacer par : 01 C0 F6 ED 49 0E 00 ED 49 C9

PRISON RIOT (Players)
*********************
Rechercher : 3E C8 06 F8 (logé dans la mémoire vive en &82C1)
Remplacer par : CD 00 80 00
Rechercher : 00 00 38 7C 7C 7C 38 (en &7FF0)
Remplacer 16 OCTETS PLUS LOIN (en &8000) par : 01 C0 F6 ED 49 0E 00 ED 49 C9

RED HEAT (Ocean)
****************
Rechercher : 01 C0 F6
Remplacer par : CD D9 7A
Rechercher la chaine ASCII "DOORSPR"
Remplacer par : 01 0E F4 ED 49 01 C0 F6 ED 49 0E 00 C9

SUPER CYCLE (Epyx, version disque)
**********************************
Rechercher 2 fois : 01 C0 F6 ED 49 01 0E F4
Remplacer 2 fois par : 01 0E F4 ED 49 CD 50 7C
Rechercher chaine ASCII "SUPER CYCLE"
Remplacer 23 octets moins loing (suite de 00) par 01 C0 F6 ED 49 0E 00 C9

TIE BREAK (Ocean)
*****************
Rechercher : 01 C0 F6
Remplacer par : CD A0 09
Rechercher : 41 57 54 09 09 3B 52 45
Remplacer par : 01 C0 F6 ED 49 0E 00 C9

TORNADO LOW LEVEL (Vortex)
**************************
Rechercher 3 fois : 01 0E F4
Remplacer 3 fois par : CD C0 8C
Rechercher : 06 0C 21 23 C0 11 50 00
Remplacer par : 01 0E F4 ED 49 01 C0 F6 ED 49 0E 00 C9