|
CPCEMU - Interne
7. Information interne sur CPCEMU
Ce chapitre fournit quelques informations d‘arrière-plan et répond à la question: “POURQUOI devrais-je faire ceci ou cela maintenant ?” Le puissant menu de débogage est aussi écrit. Vous trouverez également la structure des images de disquettes et des fichiers de snapshots.
Cette information n‘est pas destinée à ceux des utilisateurs de CPCEMU qui n‘ont aucune connaissance de ce que contient un CPC. Peut-être, pourtant, leur sera-t-elle utile un jour.
J‘ai placé cette information à la fin, et même après les marques déposées, avec l‘intention de montrer sa “relative insignifiance”.
Si vous n‘avez aucun plaisir à lire des phrases inintelligibles et des informations en désordre, ne lisez pas plus avant! Sautez directement à l‘Appendice.
ATTENTION: Vous continuez la lecture à vos propres risques!
7.1 Table des matières du chapitre 7
- 7.2 Aperçu interne des particularités de CPCEMU
-
- 7.2.1 Le Z80 (le microprocesseur)
- 7.2.2 Le Gate Array (le “co-processeur”)
- 7.2.3 Le PAL (Programmable Logic Array)
- 7.2.4 Le CRTC 6845 (Cathode Ray Tube Controller: contrôleur vidéo)
- 7.2.5 Le PIO 8255 (Programmable Input Output)
- 7.2.6 Le PSG AY 3-8912 (Programmable Sound Generator)
- 7.2.7 Le FDC 765 (Floppy Disc Controller: contrôleur de disquettes)
- 7.2.8 L‘interface Centronics pour imprimante
- 7.3 Le menu Debug
-
- Aperçu du menu Debug
- Préliminaires
- Aperçu des commandes
- Manipulation des registres
- 7.4 Gestion de la mémoire
-
- 7.4.1 Encore une fois: la configuration EMS
- 7.4.2 Comment opère la commutation de banques?
- 7.5 Modifications de la ROM
-
- 7.5.1 Dérivation de la ROM pour la cassette
- 7.5.2 Modifications de la ROM AMSDOS
- 7.6 Divers
-
- 7.6.1 Encore une fois: le fichier de configuration
- 7.6.2 L‘adaptateur parallèle
-
- 7.6.3 CPCTRANS
- 7.7 Structure des fichiers CPCEMU
-
- 7.7.1 Images de disquettes
-
- 7.7.2 Fichiers Snapshot
- 7.7.3 En-tête AMSDOS
- 7.7.4 Base de données de Pokes
- 7.8 Historique interne
7.2 Aperçu interne des particularités de CPCEMU
A quel point CPCEMU est-il réellement compatible ? Voici les “plus” et les “moins”.
7.2.1 Le Z80 (le processeur)
- Toutes les instructions du Z80 sont émulées, y compris celles dites “illégales”.
- Vous avez le choix entre une émulation lente du Z80, écrite en C, et une émulation rapide, écrite en assembleur par Juergen Weber.
- Avec la technique CO-CPU, chaque instruction du Z80 est émulée simultanément par les versions lente et rapide, ce qui est très lent, mais, en comparant les registres après chaque instruction, bien des erreurs sont débusquées. Evidemment, on n‘a fait cela que durant la phase de développement du programme. Vous pouvez activer l‘émulation lente dans le menu Debug.
- Instructions additionnelles codées “ED FC xx”, qui n‘existent que sur l‘émulateur.
Au nombre de ces instructions, le “break utilisateur” codé “ED FC FC”, à traduire par “USER &BCFC”.
- Le temps d‘exécution des instructions n‘est pas exact. Mais il y a calibration du temps en mode “realtime”.
7.2.2 Le Gate Array (le “co-processeur”)
- Toutes les couleurs du CPC (32 théoriques, 27 différentes, en fait)
- Les trois modes d‘écran (X x Y x COULEURS):
- mode 0 = 160 x 200 x 16
- mode 1 = 320 x 200 x 4
- mode 2 = 640 x 200 x 2
- "simple multi modes"
- Commutation de ROM (16K OS, 16K Basic, 16K AMSDOS et ROMs additionnelles)
- La couleur provoque un scintillement
7.2.3 Le PAL (Programmable Logic Array)
Le PAL est à la même adresse logique que le Gate Array, mais en est physiquement séparé.
- Commutation de RAM (128 K, jusqu‘à 576 K) avec mémoire EMS ou conventionnelle.
- Avec de l‘EMS émulée, les blocs sont “mappés” par le matériel, de sorte que la vitesse est bonne. CPCEMU vous offre une extension de RAM “compatible Dk‘Tronics”, jusqu‘à 576 K.
- Sans EMS, la commutation de RAM est très lente, puisque les blocs de mémoire doivent être déplacés dans la mémoire du PC. En outre, vous avez seulement 128 K de RAM.
7.2.4 Le CRTC 6845 (Cathode Ray Tube Controller : contrôleur vidéo)
- Base de l‘écran et “offset” (décalage) par scrolling hard.
- Plusieurs tailles d‘écran, de 0x0 à 80x25, avec les registres 1 et 6.
- Différentes tailles de caractères (1..7) avec le registre 9 du CRTC.
- Multi-mode (il utilise d‘autres registres).
- L‘overscan n‘est pas encore assuré.
7.2.5 Le PIO 8255 (Programmable Input Output)
- Clavier (connecté au PSG).
- Emulation de la VSYNC : un bit mis à 1 entre deux interruptions, durant un rafraîchissement de l‘écran. Vous pouvez changer la position.
- La cassette est très rapide, une dérivation de la ROM permet l‘accès à tous les fichiers DOS.
- Le bit de VSYNC est positionné trop longtemps.
- Les ports cassette ne sont pas émulés ; ainsi, beaucoup de programmes sur cassette qui accèdent directement aux ports ne fonctionnent pas.
7.2.6 Le PSG AY 3-8912 (Programmable Sound Generator)
- Du son, soit par le haut-parleur du PC (horrible, parce que trois canaux sont multiplexés en un seul, et que le volume ne peut pas être modifié) ou sur une carte GUS ou Soundblaster. Son numérique ave bruit ou partie Adlib compatible FM.
- Pas de son numérique, ou alors trop lent.
7.2.7 Le FDC 765 (Floppy Disc Controller : contrôleur de disquettes)
- Toutes les commandes du FDC nécessaires pour contrôler deux lecteurs A et B (y compris lire/écrire secteur, chercher piste, lire ID-secteur, etc.)
- Formats de disquettes très souples (jusqu‘à 18 secteurs par piste).
- Incluant les formats double face, par exemple de VORTEX.
- Les formats compliqués destinés à la protection contre la copie ne sont pas reconnus.
7.2.8 L‘interface-imprimante Centronics
- Sorties vers l‘imprimante sur 8 bits, vers un fichier défini par la ligne PRINTER dans le fichier de configuration.
7.3 Le menu Debug
Le jeu complet des registres du Z80 est affiché, et leur contenu peut être modifié.
Vous pouvez faire un “dump” de la mémoire, la désassembler ou la modifier. Vous pouvez charger ou sauvegarder des zones de mémoire. Et, le plus intéressant : vous pouvez exécuter les programmes pas à pas (comme sur un vrai débogueur)!
Aperçu du menu Debug
R)un T)race S)tep A)ssem D)ump I)nput L)oad saV)e fiN)d F)ast Q)uit
AF=0000 BC=0000 DE=0000 HL=0000 IX=0000 IY=0000 SP=0000 PC=0000 IR=0000
AF'=0000 BC'=0000 DE'=0000 HL'=0000 IFF1=0 IFF2=0 IMD=0 NZ NC PO P
0000 : 01 89 7F LD BC,&7F89
f->
La première ligne affiche les commandes disponibles, sous forme de lettres majuscules.
Les deux lignes suivantes montrent les valeurs contenues dans les registres du Z80.
La suivante désassemble l‘instruction en cours à la position du PC (le Compteur de Programme, pas l‘ordinateur !).
Et la dernière est un “prompt” qui attend votre prochaine entrée (le “f” indique que vous êtes dans le mode rapide de l‘émulation).
Préliminaires
Aperçu des commandes
- R)un:
- r [<adresse>] : lance l‘émulation à partir de l‘adresse du PC ou de
l‘adresse optionnelle que vous donnez. Exemples:
- f-> r lance l‘émulation à partir de l‘adresse du PC.
- f-> r 100 place l‘adresse 0x100 dans le PC et lance l‘émulation.
- T)race (“trace into”):
- t [<adresse>] : exécute uniquement l‘instruction affichée.
Utilisez <Return> pour continuer dans ce mode, et ainsi de suite.
<chaîne_quelconque><Return> revient au mode normal.
Toutes les commandes pas à pas sont exécutées par l‘émulation lente (même si “-f->” est affiché), parce qu‘il n‘y a plus de compteur dans l‘émulation rapide.
- S)tep (“step over”):
- s [<adresse>] : exécute la prochaine instruction.
Ou plutôt, toutes les instructions, jusqu‘à ce que l‘adresse du PC soit égale à celle de la prochaine instruction (cas d‘un appel de sous- programme). Ce qui peut prendre “un certain temps”, par exemple après un “Ret”. Dans ce cas, la touche F10 peut aider (comme toujours).
Toutes les commandes pas à pas sont exécutées par l‘émulation lente, comme dit 11 lignes plus haut.
- A)ssemble (en réalité : désassemble):
- a [<adresse>] : désassemble les 16 instructions suivantes.
Utilisez <Return> pour continuer dans ce mode, et ainsi de suite.
<chaîne_quelconque><Return> revient au mode normal.
- D)ump:
- d [<adresse>] : affiche un dump en hexa/ASCII des 256 octets suivants,
à partir de l‘adresse spécifiée ou contenue dans le PC.
Utilisez <Return> pour continuer dans ce mode, et ainsi de suite.
<chaîne_quelconque><Return> revient au mode normal.
- I)nput (modifiant la mémoire) :
- i [<adresse>] : affiche l‘adresse mémoire donnée et son contenu, que vous
pouvez conserver avec <Return> ou modifier avec <valeur-hexa><Return>.
Quittez ce mode en donnant un nombre invalide, tel que “-1” : -1<Return>.
- L)oad (charger un programme) :
- l [<adresse>] : attend que vous donniez un nom de fichier, et le charge
à partir du sous-répertoire TAPE_PATH (il doit donc s‘y trouver !), à l‘adresse spécifiée.
Un en-tête AMSDOS est reconnu comme tel.
Si vous appuyez sur <Return> après la demande du nom de fichier, le menu de sélection de fichier (bien connu) apparaît...
Exemples:
- f-> l<Return> demo<Return> :
charge le fichier “demo” à l‘adresse contenue dans le PC.
- f-> l a000<Return> monprog<Return> :
charge le fichier “monprog” à l‘adresse 0xA000.
- saV)e (sauvegarder un programme) :
- v [<adresse>] : attend que vous lui donniez un nom de fichier, et la
longueur de la zone de mémoire à sauvegarder. Cette zone sera sauvegardée depuis <adresse> (ou celle contenue dans le PC), en tant que fichier binaire, dans le sous-répertoire TAPE_PATH, avec un en-tête AMSDOS.
Exemple:
- f-> v<Return> demo<Return> 4000<Return> :
sauvegarde un fichier “demo” commençant à l‘adresse du PC et de longueur 0x4000.
- "fiN)d (Find a byte string):" (translate!)
- "n : Same as I)nput, input the byte string to find. Use "??" (or "?") as placeholder for an arbitrary byte. This only makes sense within the byte string
Then the avtive 64KB memory is searched for the string and all matching adresses are output."
- M)ode (changer le mode d‘affichage) : (check translation!)
- m : bascule entre les modes d‘affichage : affichage des registres,
marche/arrêt du désassemblage de l‘instruction.
- F)ast (sélection du type d‘émulation) :
- f : bascule entre l‘émulation rapide du Z80 (développée en assembleur
par Juergen Weber, et prise par défaut) et l‘émulation lente (écrite en C).
Le “prompt” bascule entre “-f->” pour “fast” (rapide) et “-s->” pour “slow” (lente).
Les commandes r, s, t se réfèrent au type d‘émulation sélectionné.
- Q)uit (quitter le programme):
- q : abandonne l‘émulateur.
Manipulation des registres
Outre les commandes ci-dessus, vous pouvez modifier le contenu des registres du Z80 avec la syntaxe “<registre>=<valeur-hexa>”.
Exemples:
- af=345 : place 0x0345 dans le registre AF.
- pc=a000 : fixe le compteur de programme à l‘adresse 0xA000.
Vous pouvez également écrire “<registre><espace><valeur-hexa>”. Vous pouvez modifier tous les registres affichés c‘est-à-dire AF, BC, DE, HL, IX, IY, SP, PC, IR, AF‘, BC‘, DE‘, HL‘, et aussi IFF1, IFF2 et IMD.
7.4 La gestion de la mémoire
7.4.1 Une fois de plus: la configuration EMS
Il vous faut un gestionnaire de mémoire aceptant le standard LIM EMS 4.0. Ce gestionnaire doit fournir des pages EMS étendues dans n‘importe quelle région de la mémoire, car CPCEMU cherchera 6 pages physiques sur des adresses consécutives.
Si l‘emploi de la mémoire EMS est possible, un décompte de ladite mémoire “EMS xxx Bytes ok.” apparaîtra durant l‘initialisation.
Je vous ai conseillé, au début de cette documentation, d‘employer les réglages suivants sous OS/2:
EMS_FRAME_LOCATION = auto
EMS_HIGH_OS_MAP_REGION = 32 (ou davantage)
EMS_LOW_OS_MAP_REGION = 0 (ou davantage)
Qu‘est-ce que cela signifie?
La région basse est pour les pages EMS en mémoire conventionnelle.
Si CPCEMU doit utiliser de telles pages, mettez au moins 6*64K = 384K.
La région haute est pour les pages EMS au-dessus de la limite des 640K, en plus du frame standard de 64K. Mettez au moins 2*16K = 32 K.
Avec le DOS, je vous ai conseillé d‘inclure les lignes suivantes dans votre CONFIG.SYS:
DEVICE=C:\DOS\HIMEM.SYS
DEVICE=C:\DOS\EMM386.EXE 1024
...
Modifiez le “1024”, selon la mémoire dont vous disposez sur votre ordinateur.
Notes:
EMM386 fournit plusieurs pages additionnelles en mémoire conventionnelle. L‘adresse minimale peut être changée avec l‘option /B=<segment> (par défaut, 4000).
Avec /P<nombre>=<segment>, il est possible de changer les segments des pages physiques.
7.4.2 Comment s‘effectue la commutation de banques ?
La commutation de banques se pratique sur les ordinateurs “familiaux” qui ont de la RAM et de la ROM à la même adresse.
Ainsi, les lectures se font en ROM, et les écritures en RAM.
Les CPCs 464 et 664 d‘Amstrad ont 64K de RAM, une ROM de 16K aux adresses (hexa) 0-3fff, et une seconde aux adresses c000-ffff:
0 RAM 0000-3fff
1 RAM 4000-7fff
2 RAM 8000-bfff
4 RAM c000-ffff
L ROM 0000-3fff
U ROM c000-ffff
L‘idée maîtresse pour CPCEMU est d‘avoir des segments et offsets différents pour la lecture et l‘écriture. Pour chaque accès en lecture, un offset de lecture est additionné à l‘adresse désirée, et on fait de même avec un offset d‘écriture.
état 0 état 1
block 5 M L c 0 <
block 4 M W C c C c | commute au
block 3 M W 8 b c W 8 a c | changement
block 2 M W 4 b c W 4 a c | d‘état
block 1 M W 0 b W L a c <
block 0 M U b W U a
(M = mémoire conventionnelle, ou pages physiques EMS)
a = ROM basse activée, ROM haute activée
b = ROM basse désactivée, ROM haute activée
c = ROM basse activée, ROM haute désactivée
W = ROM basse désactivée, ROM haute désactivée
- Pour basculer entre les deux états, les blocs “0” et “L” doivent être commutés.
- Pour la commutation des banques de RAM, un nouveau bloc “0” doit être commuté avec l‘ancien. La sélection de ROM est effectuée en copiant la nouvelle ROM vers le bloc “U”.
- Avec la mémoire EMS, toutes les commutations de banques sont faites par le matériel EMS (ou son émulation). Cela augmente la vitesse de l‘émulation en Basic et avec CP/M Plus.
Maintenant, vous comprenez pourquoi 6 pages physiques EMS consécutives sont nécessaires : le frame standard avec 4 pages est insuffisant.
7.5 Modifications de la ROM
7.5.1 Dérivation de la ROM pour la cassette
Après la commande “|TAPE” (Azerty : “ùTAPE”), ou si la ROM de l‘AMSDOS est désactivée, c‘est la cassette qui est active. Les accès-cassette avec CPCEMU sont transformés en accès à un fichier dans un simple sous-répertoire.
Cette redirection est accomplie par une dérivation de la ROM.
Avec “TAPE_BYPASS=1”, vous activez la dérivation des vecteurs-cassette en ROM.
Si CPCEMU trouve une ROM connue de CPC 464/664/6128, elle est modifiée en conséquence. La dérivation est nécessaire si vous voulez employer la cassette.
Des instructions spéciales sont implantées dans l‘émulation du Z80. Elles appellent des fonctions spéciales qui ne sont fournies que par l‘émulateur ; elles ont été entrées directement en ROM, mais il est toujours possible de modifier les vecteurs en RAM.
Les instructions suivantes sont disponibles :
ED FC xx USER &BCxx (valide seulement pour quelques vecteurs en RAM)
Elles équivalent à une instruction CALL vers une des fonctions internes.
Les valeurs hexa suivantes pour xx sont légales:
65 |
CASSETTE INIT (BC65) |
77 |
CASSETTE IN OPEN (BC77) |
7A |
CASSETTE IN CLOSE |
7D |
CASSETTE IN ABANDON |
80 |
CASSETTE IN CHAR |
83 |
CASSETTE IN DIRECT |
86 |
CASSETTE RETURN |
89 |
CASSETTE TEST EOF |
8C |
CASSETTE OUT OPEN |
8F |
CASSETTE OUT CLOSE |
92 |
CASSETTE OUT ABANDON |
95 |
CASSETTE OUT CHAR |
98 |
CASSETTE OUT DIRECT |
9B |
CASSETTE CATALOG |
En outre, vous pouvez employer le “break utilisateur” codé ED FC FC (USER &BCFC) : il stoppe immédiatement l‘émulation.
7.5.2 Modifications de la ROM de l‘AMSDOS
- Avec “AMSDOS_DISABLE=1” dans le fichier de configuration, vous faites “oublier” l‘initialisation de l‘AMSDOS.
Dans ce cas, la modification des vecteurs-cassette, effectuée par l‘AMSDOS lorsqu‘on ordonne “|TAPE” ou “ùTAPE”, est désactivée (ainsi, les vecteurs-cassette pointent toujours sur la cassette, bien que la ROM de l‘AMSDOS ait été initialisée). C‘est nécessaire si vous désirez continuer à charger des fichiers à partir de la cassette après un reset-disc, mais sans avoir à donner la commande “|TAPE” auparavant (bidouille réalisée avec “poke &CCF2,&18 : poke &CCF3,&05” dans la ROM de l‘AMSDOS).
Les instructions de secteur ne sont pas affectées, elles adressent toujours la disquette.
- “AMSDOS_SPEEDUP=1” active une modification de l‘AMSDOS, laquelle minimise le délai d‘attente du moteur du lecteur de disquettes, afin de rendre plus rapides les accès-disque (ici, tout est fait par le DOS, on n‘a donc pas besoin de délai d‘attente).
Pour y parvenir, on a modifié les octets suivants, toujours dans la ROM de l‘AMSDOS:
- poke &C5D4,&01 : délai pour le moteur
- poke &C5D8,&01 : délai pour le formatage d‘une piste
- poke &C5D9,&01 : court délai
- poke &C5DA,&01 : court délai
- poke &C602,&01 : 1 seul “Retry” en cas d‘erreur
- poke &C784,&01 : recherche rapide
- poke &C7E2,&01 : recherche rapide
7.6 Divers
7.6.1 Une fois de plus: le fichier de configuration
Peut-être vous souvenez-vous que les commentaires commencent par un point-virgule “;” et peuvent prendre place à n‘importe quel endroit d‘une ligne : le reste de la ligne est alors ignorée.
Les espaces, tabulations, sauts de ligne et “;” sont des délimiteurs, et peu importe combien vous en utilisez.
Beaucoup de définitions ont la forme syntaxique:
<mot-clé> = <valeur> {T}
{T} est une séquence d‘au moins un délimiteur.
Exemple:
ROM_PATH = ".\ROM"
- <nombre> peut être donné en décimal, hexadécimal (avec le préfixe 0x) ou binaire (%).
- <chemin> peut avoir une longueur de 80 caractères et
- <fichier> jusqu‘à 20 caractères.
Dernière information sur un mot-clé:
BREAK_MASK = <nombre> (3)
réservé au déboguage.
Certains événements (“events”) interrompent l‘émulation normale. Avec ce drapeau, vous pouvez désactiver ces événements.
A utiliser avec précaution!
Laissez tous les bits à 1, sauf ceux concernant les événements
que vous ne voulez pas voir intervenir.
b2 = 0 -> désactive l‘affichage des erreurs sur les ports (utilisez 3)
La signification de ces bits pourra changer dans l‘avenir!
7.6.2 L‘adaptateur parallèle
Voyons d‘abord la construction de l‘adaptateur, avec la description des fonctions de chaque fil:
PC D-SUB Cent. CPC Fonction
-------------------------------- ---------------------------
GND 19 ---- 19 GND GND
BUSY 11 <--- 1 -STROBE Synchro (Donnée disponible)
ACK 10 <--- 8 D6 |
PE 12 <--- 7 D5 | Données
SELECT 13 <--- 6 D4 |
ERROR 15 <--- 5 D3 |
D0 2 ---> 11 BUSY Synchro (Prêt à recevoir)
Sens CPC->PC
Normalement, l‘adaptateur est conçu pour fonctionner dans ce sens seulement. Envoyer une donnée depuis le CPC équivaut en principe à envoyer du texte sur la ligne de l‘imprimante.
Si le PC signale “Not-BUSY” (non occupé), le CPC écrit un quartet (4 bit d‘un octet) sur le port, positionne STROBE pour signaler que la donnée est là, et l‘efface ensuite.
Ainsi, le PC a seulement besoin d‘effacer le signal BUSY (par la ligne D0), d‘attendre le STROBE (sa ligne BUSY), de prendre le quartet (sur les lignes d‘entrée imprimante->PC), et de positionner BUSY.
Question : pourquoi scinder l‘octet en deux quartets? Pourquoi ne pas envoyer les 8 bits en une seule fois?
Réponse:
- Le port imprimante du PC doit être reprogrammé en entrée, et je
ne suis pas sûr que c‘est possible sur tous les PCs et
- Le CPC n‘a que 7 bits sur sa sortie imprimante (* Note du traducteur: sauf le 6128 Plus, et encore son utilisation est-elle acrobatique, puisqu‘il faut passer par le registre 12 du CRTC! *).
Sens PC->CPC
J‘ai pensé un jour à la possibilité d‘envoyer des données dans l‘autre sens. Malheureusement, le CPC n‘a qu‘une seule ligne (un seul bit) en entrée sur le port-imprimante : le signal BUSY.
Aussi, cela n‘améliorerait pas la situation si vous tentiez de concevoir un meilleur adaptateur pour ce sens. Ainsi, faites avec ce que vous avez déjà, et tentez plutôt d‘améliorer le protocole de transfert.
Une interface série, également, n‘a qu‘une ligne pour chaque sens. Mais elle utilise une synchronisation matérielle, habituellement avec un quartz, et les deux côtés doivent employer exactement la même vitesse de transmission, par exemple 1200 bauds.
Il est difficile de réaliser cela avec seulement un logiciel.
Que faire alors ?
L‘idée maîtresse consiste à utiliser l‘avantage de la vitesse du PC sur le CPC. Chaque octet est partagé en 8 bits, et transmis en série, le PC devant se charger de positionner le signal BUSY au rythme voulu. Durant la transmission de ces 8 bits, le CPC fournit sa vitesse maximale, et le PC doit se régler sur lui. Le CPC écrit un “bit de requête” avec une instruction en assembleur, et le PC doit réagir rapidement en positionnant le signal BUSY en concordance avec le bit suivant, puisque, avec l‘instruction “suivante-moins-une” (?), le CPC le lira.
Afin de ne pas désactiver les interruptions pendant tout le transfert, pour chaque octet, une “connexion” est établie : le CPC dit “Envoie-moi quelque chose !”, et le PC répond “D‘accord, j‘attends jusqu‘à ce que tu sois prêt à le recevoir !” en basculant le signal BUSY.
Tout le processus est protégé par un timer, pour éviter qu‘aucun des deux partenaires n‘aille se planter en attendant un signal qui n‘a jamais été envoyé.
Ainsi (puisque les interruptions ne sont pas désactivées), vous pouvez sortir du programme avec <ESC> ou <CRTC>+<BREAK> à tout moment.
7.6.3 CPCTRANS
Une autre option non mentionnée, à propos de CPCTRANS, est “/d 0” ou “/d 1”. Avec 1, le mode double-pas spécial est sélectionné, et, sur les lecteurs de disquettes 80 pistes, chaque seconde piste est sautée lorsqu‘on travaille avec des disquettes de 40 pistes.
Cette option ne devrait pas être nécessaire, puisque CPCTRANS commute automatiquement en double-pas quand il détecte une disquette 5,25 pouces et 360 K.
Normalement, il est très simple de lire et d‘écrire des secteurs en utilisant le BIOS. Mais le BIOS ne peut pas gérer les faces B des disquettes avec une marque de tête égale à 0.
Aussi ai-je programmé moi-même les fonctions du FDC, avec l‘aide de la source MINIX. Malheureusement, cette source MINIX contient des erreurs, et le “timing” de certaines sections critiques est effectué par de simples boucles d‘attente qui ont peut-être été prévues pour un 8086, beaucoup plus lent que les microprocesseurs actuels.
7.7 Structure des fichiers CPCEMU
7.7.1 Images de disquettes
Ces fichiers se composent d‘un bloc de 256 octets d‘infos sur la disquette, et, pour chaque piste, d‘un bloc de 256 octets d‘infos sur la piste, suivi par les données pour chaque secteur de chaque piste.
Le nouveau format “étendu” de disquettes est conçu pour la copie de disquettes protégées. Les éléments nouveaux de ce format étendu sont signalés par un E (à partir de notre “Extended DISK Format Proposal, Rev.5).
Le bloc d‘Information Disquette
Octet (hexa): |
Signification: |
00 - 21 |
"MV - CPCEMU Disk-File\r\nDisk-Info\r\n"
(“MV - CPC” est caractéristique pour la reconnaissance du fichier)
*E* -- "EXTENDED CPC DSK File\r\n\Disk-Info\r\n"
(“EXTENDED” est caractéristique pour la reconnaissance du fichier) |
22 - 2F |
inutilisé (0)
*E* -- Créateur de DSK (nom de l‘utilitaire)
(sans \0 de fin nécessaire !) |
30 |
nombre de pistes (40, 42, peut-être 80) |
31 |
nombre de têtes (1 ou 2) |
32 - 33 |
taille d‘une piste (incluant 256 octets d‘info-piste)
Avec 9 secteurs * 512 octets + 256 octets d‘info-piste=0x1300.
*E* -- inutilisé (0) |
34 - FF |
inutilisé (0)
*E* -- octets forts des taille de piste pour toutes les pistes
(calculé de la même façon que 32-33 pour le format normal). |
- Pour les formats simple face, la table contient les tailles de piste d‘une seule face ; sinon, pour les deux faces alternées.
- Une taille de valeur 0 indique une piste non formatée.
- Longueur réelle de la piste = valeur de la table * 256. Gardez à l‘esprit que l‘image contient en plus 256 octets d‘information sur la piste.
Le bloc d‘Information Piste (pour chaque piste)
Octet (hexa) |
Signification: |
00 - 0C |
Track-Info\r\n |
0D - 0F |
inutilisé (0) |
10 |
numéro de piste (de 0 à “nombre de pistes - 1”) |
11 |
numéro de tête (0 ou 1) |
12 - 13 |
inutilisé (0) |
Paramètres de formatage de piste: |
14 |
BPS (octets par secteur) (2 pour 512 octets) |
15 |
SPT (secteurs par piste) (9, jusqu‘à 18) |
16 |
GAP#3 de formatage (0x4E) |
17 |
Octet de remplissage (pendant le formatage, 0xE5) |
Info secteur (pour chaque secteur): |
18+i |
numéro de piste (information ID de secteur) |
19+i |
numéro de tête (information ID de secteur) |
1A+i |
numéro de secteur (information ID de secteur) |
1B+i |
BPS (information ID de secteur) |
1C+i |
état 1, code d‘erreur (0) |
1D+i |
état 2, code d‘erreur (0) |
1E+i,1F+i |
inutilisé (0)
*E* -- Longueur du secteur en octets (notation “petit Indien”,
c‘est-à-dire l‘octet faible avant l‘octet fort).
Cela permet d‘avoir des secteurs de différentes tailles sur la même piste.
Calculé comme (0x0080 << BPS réel). |
Notes :
- Les données enregistrées sur le secteur doivent suivre le bloc d‘Information-Piste dans l‘ordre des IDs de secteur. Aucune piste, aucun secteur ne doit être omis.
- Avec les formats double face, les pistes alternent, par exemple:
piste 0 tête 0, piste 0 tête 1, piste 1 tête 0, etc.
- Employez CPCTRANS pour copier des disquettes CPC vers ce format.
7.7.2 Fichiers Snapshots
Les fichiers snapshots se composent d‘un en-tête de 256 octets,
suivi du dump de la mémoire entière.
L‘en-tête Snapshot:
Octet (hexa) |
Signification: |
00 - 07 |
“MV - SNA” (pour reconnaître ce type de fichier) |
08 - 0F |
inutilisé (0) |
10 |
version de snapshot (2, auparavant 1) |
11 - 1A |
registres du Z80 AF, BC, DE, HL, R, I |
1B - 1C |
drapeaux du Z80 IFF0, IFF1 (0=désactivé, 1=activé) |
1D - 24 |
registres du Z80 IX, IY, SP, PC |
25 |
mode d‘interruption IMD du Z80 (0 - 2) |
26 - 2D |
registres du Z80 AF', BC', DE', HL' |
2E |
Gate Array: registre du numéro d‘encre |
2F - 3F |
Gate Array: registre de valeur d‘encre (0, 1,..., 15, 16) |
40 |
Gate Array: registre multi-configuration |
41 |
Gate Array: registre configuration de la RAM |
42 |
CRTC: registre d‘adresse |
43 - 54 |
CRTC : registre de données (0, 1,..., 17) |
55 |
numéro de ROM haute |
56 - 59 |
PIO: port A, port B, port C, port de contrôle |
5A |
PSG: registre d‘adresse |
5B - 6A |
PSG: registre de données (0, 1, ..., 15) |
6B - 6C |
taille du dump de la mémoire (64K ou 128K) |
(les paramètres suivants n‘existent que depuis la version 2.0): |
6D |
type de CPC où le snapshot a été généré
(0=CPC 464, 1=CPC 664, 2=CPC 6128, 3=inconnu) |
6E |
numéro d‘interruption (0..5), la dernière interruption
durant un cycle de rafraîchissement de l‘écran. |
6F - 74 |
6 octets de multi-mode : le mode d‘écran (0..2)
pour les interruptions 0..5. |
75 - FF |
inutilisé (0), peut-être plus tard pour la configuration de l‘émulateur |
7.7.3 En-tête AMSDOS
Octet (hexa) |
Signification: |
00 |
numéro d‘user (0 ; valeurs possibles : 0-15) |
01 - 0F |
nom + extension (zéros de remplissage le cas échéant) |
10 |
numéro de bloc (0) |
11 |
drapeau “dernier bloc” (0) |
12 |
type de fichier (0=Basic, 1=Basic protégé, 2=binaire, etc.) |
13 - 14 |
longueur de bloc (0) |
15 - 16 |
adresse de chargement (0-FFFF) |
17 |
drapeau “premier bloc” (0) |
18 - 19 |
longueur logique (0-FFFF) |
1A - 1B |
adresse du point d‘entrée (0-FFFF) |
1C - 3F |
libres pour l‘utilisateur (0) |
40 - 42 |
longueur réelle du fichier (1-FFFFFF) |
43 - 44 |
somme de contrôle des octets 00-42 |
45 - 7F |
inutilisé (valeurs aléatoires venant du tampon secteur) |
Note :
- Un en-tête précède tout fichier non-ASCII. Il est identifié comme tel en calculant la somme de contrôle.
- Les octets 00-3F ont pour origine la “zone cassette”, où les fichiers étaient divisés en blocs.
- Les octets 12, 15-16, 1A-1B, 40-42, 43-44 sont nécessaires.
7.7.4 Base de données de Pokes
Une entrée (une ligne) consiste en 7 rubriques, chacune étant limitée par des guillemets, et séparées par des virgules.
- numéro de rubrique (1 caractère, 0-F) : la première a le numéro 0 et peut être sélectionnée. Si un programme nécessite plus d‘un poke, les entrées suivantes ont les numéros 1, 2, etc.
- Nom du programme (jusqu‘à 20 caractères).
- Description (jusqu‘à 20 caractères).
- Type (1 caractère) : “t”=Tape (cassette), “d”=disquette, “a”=all (tous).
Ignoré en général.
- Adresse du poke (4 caractères, hexadécimal) : donne l‘adressse en mémoire dont le contenu doit être modifié.
- Valeur à “poker” (2 caractères, hexadécimal ou “??”) : si c‘est “??”, vous devrez fournir vous-même la valeur, pas exemple un nombre de vies.
- Ancienne valeur, à modifier (2 caractères, hexadécimal ou “??”) : permet de vérifier si le poke modifie l‘environnement correct. Si la valeur trouvée à l‘adresse du poke diffère de cette ancienne valeur, un avertissement est affiché. Il n‘y a pas de vérification avec “??”.
Exemple:
"0","Devils Crown","inf oxygen","t","863b","00","??"
"1","","","t","863c","00","??"
"2","","","t","863d","00","??"
Il y a trois pokes pour le programme “Devils Crown”, tous fonctionnant ensemble. Les anciennes valeurs sont inconnues, donc on a mentionné “??”. Vous pouvez omettre le nom et la description dans les entrées qui suivent.
7.8 Historique interne
Z80EMU (seulement un Z80, beaucoup moins qu‘un CPC)
- v1.0 (1991)
- Première version en Pascal (uniquement une émulation de Z80).
- v1.2 (12.8.1992 - 16.8.1992)
- Première version en C (traduite avec TPTC).
Problèmes Z80 : ADD HL..., DAA, LDIR positionnent de façon incorrecte le drapeau P. BIT... positionne de façon incorrecte le drapeau Z. Les instructions de rotation positionnent de façon incorrecte les drapeaux Z et S. On peut à présent employer les ROMs.
- v1.3 (18.8.1992)
- Mauvais adressage de port: octet faible incorrect.
Nouvelle gestion de la mémoire avec 128 K de RAM, 32 K de ROM.
- v2.0 (18.8.1992 - 22.8.1992)
- Implantation de la technique CO-CPU pour trouver les erreurs (CO-CPU utilise de la mémoire séparée, et n‘est active que dans un mode de débogage spécial).
Problèmes Z80 : AND... positionne de façon incorrecte le drapeau H.
CPI... positionne de façon incorrecte le drapeau N.
A l‘origine, l‘écran était seulement en noir et blanc, à présent il est bleu et jaune comme sur un vrai CPC.
- v2.1 (25.8.1992 - 27.8.1992)
- Emulation de tous les PENs et de toutes les couleurs, dans tous les modes.
Ecriture seulement sur l‘écran actif (celui que vous voyez).
CO-CPU a trouvé une erreur : toutes les instructions contenant (IX+zz) avec un déplacement négatif étaient fausses ! J‘avais oublié de prendre en compte les octets “signés”.
- v2.2 (30.8.1992 - 3.9.1992)
- Nouvelle routine pour le clavier.
Palette fixée, sans clignotement (attente pour HSYNC).
“Need-ROM” avec COPYMATE introduite.
- v2.3 (15.9.1992 - 19.9.1992)
- Emulation du FDC pour “charger/sauver secteur”.
CO-CPU a trouvé une erreur : LD XH,... était LD H,...
- v2.3b (19.9.1992)
- Fait le rafraîchissement de l‘image seulement si l‘écran est en RAM, blocs 0..3 (et non 4..7).
Fait de “port FCxx” un alias pour FBxx (pour CP/M Plus).
A ce moment, je ne savais pas que OUTI... prédécrémentait le registre B.
- v2.4 test (25.10.1992)
- Emulation du registre seulement si on le désire (avec “DEFINE”). A présent, rafraîchissement de l‘écran à chaque interruption “n”, et non pour chaque octet écrit en mémoire (toujours très lent, parce que tout est écrit en C).
Nouvelle gestion de la mémoire, avec les blocs alignés sur les segments.
- v2.5 test (31.10.1992)
- Changé la gestion de la mémoire. Scrolling “hard” et différentes tailles d‘écran possibles.
- v2.6 test (5.11.1992)
- Nouveau gestionnaire du clavier, de Arnt Gulbrandsen : toutes les combinaisons de touches possibles.
Rafraîchissement de l‘écran en assembleur.
- v2.7 test
- Essayé, sans succès, d‘inclure l‘émulation rapide du Z80 due à Juergen Weber.
- v2.8
- Rafraîchissement de l‘écran amélioré : seules les zones modifiées en mémoire-écran sont modifiées à l‘écran.
- v2.9
- Utilisation du timer du PC pour générer les interruptions sur 300 Hertz. L‘émulation rapide fonctionne seulement si on n‘a besoin d‘aucune ROM (commutation de banques).
CPCEMU (un CPC, à présent)
- v0.2 (23.12.1992), succédant à Z80EMU v2.9
- Après presque quatre heures d‘analyse avec Turbo Debugger, j‘ai trouvé l‘erreur qui plantait l‘émulation rapide : PUSH ES au lieu de PUSH DS.
- v0.3 (28.12.1992 - 29.12.1992)
- Positionné le drapeau N pour INI, OUTI.
CPI en émulation rapide positionnait mal les drapeaux.
RL (HL) utilisait le segment de lecture (dans DS) au lieu du segment d‘écriture (dans ES).
LD A,R produit à présent des nombres aléatoires.Implanté toutes les routines-cassette (mais CASSETTE IN CHAR est fausse).
- v0.4 (1.1.1993)
- IN A,(n) : A sur les bits b8..b15 (au lieu de B).
Configuration de la RAM 0xC3 : corrigée vers 0,3,2,7 (pour CP/M Plus). KC-Compact (un compatible CPC de l‘ancienne Allemagne de l‘Est) utilise le port EE00 - EE3D, mais pour quoi faire?
- v0.5 (28.1.1993 - 8.2.1993)
- INIR, ... : l‘incrémentation du registre R dépend de B, pas de BC.
CASSETTE IN CHAR corrigée (“patch” défectueux pour CPC 6128).
- v0.6 (23.3.1993 - 24.5.1993)
- Quelqu‘un me fait savoir que les instructions OUTI prédécrémentent le registre B!
Compilation des parties en C vers le code 386 (avec Borland C++ v3.1).
Les images de disquettes ont le suffixe “DSK”.
CPCREAD.PAS corrigé (tête non initialisée avec 0) et renommé CPCREAD.C. Adressage de port du PIO amélioré (le microprocesseur peut lire même si le port est programmé en sortie, etc..)
- v0.7 (26.7.1993 - 29.8.1993) (pas sortie)
- Source totalement nouvelle, modulaire, etc.
Fichier de configuration : davantage de ROMs possible.
Changé le nom de la firme de “Schneider” en “Amstrad” (on peut choisir entre sept noms).
Enlevé l‘erreur de commutation de banques-RAM.
Nouvelle documentation en allemand.
- v0.8 (30.8.1993 - 9.9.1993)
- Emulation lente : instructions de parité améliorées en utilisant une table, pas seulement pour la parité.
Z80 : ED xx avec “xx” illégal est ignoré.
Nouvelle documentation en anglais.
- v0.8a (10.9.1993 - 15.9.1993)
- Erreur fatale dans l‘émulation rapide : si une instruction DD CB xx est exécutée et qu‘une interruption survient, l‘instruction est ignorée!
- v0.8b (16.9.1993 - 21.9.1993)
- Implanté une “vraie” VSYNC, si VSYNC_CT = 0.
Corrigé le problème du port A du PIO : OUT &F400,xx avec le Port A en mode entrée était ignoré.
Nouvelle routine pour le joystick par Martin Zacho.
- v0.8c (22.9.1993 - 13.12.1993)
- Vérifié la documentation avec “ispell”.
L‘émulation ne démarrair pas si “USE_JOYSTICK=YES” et si un joystick n‘était pas présent (PUSH AX à la mauvaise position).
Emulation lente : DAA corrigée (les parenthèses manquaient depuis la version v0.8).
Mauvaise modification dans la routine d‘interruption pour le CPC 664. Remplacer EI par NOP évite le problème avec EI (active les interruptions une instruction plus tard). Maintenant corrigé pour tous les CPCs.
- v0.8d (14.12.1993 - 29.12.1993)
- Emulation du FDC réécrite pour les formats double face.
CPCTRANS remplace l‘ancien CPCREAD, et permet de lire les disquettes Vortex après que vous ayez installé le patch 720KB.COM. En plus de cela, vous pouvez réécrire les images de disquettes sur la disquette.
Nouvelle sélection de fichiers avec la touche F3.
Introduit quelques aliases d‘adresses de port, par exemple &7000 - &7f00 pour adresser le Gate Array, &0c00, &1c00, &2c00, &3c00, &bc00 pour le CRTC.
Activé l‘émulation du registre R.
- v0.9 alpha (30.12.1993 - 20.1.1994)
- Mémoire EMS possible avec une configuration spéciale EMS/UMB.
Nombres binaires dans le fichier de configuration.
Corrigé l‘adressage de la commutation des banques de RAM : l‘émulateur acceptait &d0-&ff comme &c0-&c7.
A présent, jusqu‘à 576 K de RAM avec EMS.
- v0.9b (21.1.1994 - 31.1.1994)
- Utilisation de EMS simplifiée avec EMS étendue (ou LIM EMS 4.0), avec plus de 4 pages physiques EMS.
Sélection de fichiers ajoutée aux options “l” (menu Debug) et RUN”.
- v0.9c (1.2.1994 - 29.4.1994)
- Du son, mais horrible, sur le haut-parleur du PC (désactivé avec F4).
Sélection de fichiers aussi avec l‘option “v” du menu Debug.
Documentation anglaise corrigée.
Son avec la carte Soundblaster (peut être amélioré).
Nouveau CPCTRANS avec paramètres sur la ligne de commande.
Accès direct au FDC.
Adaptateur parallèle testé, et le logiciel qui va avec, amélioré.
Emulation rapide du Z80 : INC (HL), DEC (HL), INC (IX+n), DEC (IX+n) pour la RAM au-dessous de la ROM, corrigée.
<PgPréc>,<PgSuiv> déplacent les écrans agrandis.
Affichage de parties d‘overscan.
Maintenant possible : snapshots de 64 K.
- v0.9d (30.4.1994 - 12.5.1994)
- Les interruptions durant un DI ne sont pas oubliées, et elles ne sont plus activées directement après une instruction EI.
Nouvelles fonctions de couleurs : à présent sans “neige” sous OS/2.
Emulation rapide du Z80 : code accéléré.
- v1.0 (13.5.1994 - 20.5.1994)
- Partie écran améliorée : différentes tailles de caractères, de 1 à 8. Sélection de fichiers ajoutée à SAVE ; ajouté une sélection rapide en tapant une lettre.
Amélioré CPCTRANS, avec une option de vérification.
Nouveau menu de réglages si on appuie sur F7. Ainsi, on peut désactiver le papillonnement des couleurs.
- v1.0a (21.5.1994 - 9.6.1994)
- Amélioré le menu des réglages avec entrée directe ou par les flèches du curseur. Ajouté une possibilité de clavier allemand, et une option simple délai.
Corrigé l‘affichage d‘écrans de taille plus petite (sans parties d‘écrans plus grands).
Amélioré en partie l‘émulation rapide du Z80 : RRA, RLA et autres instructions CB xx.
Ajouté davantage d‘instructions illégales (ED xx) : LD D,XH et LD YL,YH manquaient!
Corrigé CPDR, CPIR avec BC=0 (0 signifiant 65536 sur un Z80, mais bien 0 pour le préfixe REPE du 80x86 !).
Drapeaux DAA corrigés.
Nouveau logiciel pour l‘adaptateur parallèle : à présent, il est possible de transmettre vers le CPC.
Merci à Bernd Schmidt pour avoir attiré mon attention sur le fait qu‘une interruption ajoute 1 au registre R. Avec son aide, l‘émulation du port C du PIO a été améliorée.
- v1.1a (10.6.1994 - )
-
CPCEMU entre dans une nouvelle ère : Amstrad a autorisé l‘utilisation de ses ROMs !
Changement dans le fichier de configuration : ROM_BLOCKS -> ROM_BLOCK, DISC_BYPASS-> DISABLE_ADOS, plus d‘espace nécessaire pour séparer “=”. Changement dans la partie son et la partie graphique : taille verticale par VGA-CRTC.
Le calibrage du joystick se trouve à présent dans le menu des réglages.
Amélioration des routines de sauvegarde sur “cassette”.
Partie FDC améliorée : maintenant, vous pouvez employer COPYMATE. Insertion sans erreur de lecture avec les disquettes au format autre que DATA (sans recherche de la piste 0).
Un autre délai d‘attente dans CPCTRANS : j‘espère que vous n‘aurez plus besoin du commutateur turbo de votre PC. Formatage d‘images de disquettes. Corrigé une nouvelle fois le port C du PIO : il est effacé après un “OUT &7f00,n”.
Changements importants dans le fichier de configuration : à présent, il comporte une configuration conditionnelle (#IFCPC, #ENDIF). Quelques mots-clés changés (VSYNC_CT -> /, DISC_PATH -> /, SNAP_PATH -> SNAPSHOT, DRV_A -> DRIVE_A, DRV_B -> DRIVE_B).
Chargement de programmes depuis une archive ZIP, nécessitant PKUNZIP.
- v1.1b (17.8.1994 - 2.9.1994)
-
Multi-mode introduit, ce qui signifie différents modes sur le même écran. Le rafraîchissement de l‘écran est partitionné jusqu‘à six zones, et chacune est rafraîchie quand une interruption survient (peut être amélioré).
Possible maintenant : snapshots de 128K, étendus pour multi-mode. CPCPARA amélioré : on peut maintenant transférer les fichiers binaires avec un en-tête.
Détection du CPC 6128 Plus incluse.
Davantage d‘aliases de ports.
- v1.2 (3.9.1994 - )
- Principalement, quelques changements dans le menu d‘aide.
- v1.2a (27.9.1994 - ) : était disponible dans UPD12A.ZIP
-
Sélection de fichiers : seuls les lecteurs disponibles étaient affichés.
Et : avec le pilote ANSI.SYS, le fond du texte était noir.
TMP_PATH : vous pouvez spécifier un lecteur, sans chemin.
DOS Shell (F7) : CPCEMU est d‘abord permuté vers XMS, EMS ou le disque dur, ainsi vous disposez de plus de mémoire dans le Shell du DOS (cette particularité vient du programme du domaine public SWAP300.ZIP, de Marty Del Vecchio).
Le rafraîchissement de l‘écran pouvait être corrompu, si la largeur de l‘écran n‘était pas divisible par 4.
Une autre version de CPCEMU est encore plus rapide : C2.EXE. Elle utilise une gestion différente de la mémoire, avec deux frames EMS de 64 K chacune. Mais elle ne tourne qu‘avec EMS.
Les ROMs sont aussi “© by Locomotive Software”, pas seulement Amstrad.
- v1.2b ( )
-
Il n‘y avait pas de son stéréo sur une carte Soundblaster Pro, même si la configuration l‘affirmait. Si aucune carte Soundblaster n‘était trouvée, il n‘y avait pas de son du tout jusqu‘à ce que vous utilisiez USE_SB=NO.
Z80 rapide : remplacé l‘accès à un mot par l‘accès à un octet. C‘est un peu plus lent, mais on ne plante plus l‘ordinateur chaque fois qu‘on accède à un mot à l‘adresse 0xffff. Egalement, problème corrigé avec “EI HALT DI” : l‘adresse où HALT était PUSHé au lieu de celle de DI. Corrigé la documentation anglaise.
Amélioré CPCPARA et PCPARA v1.1 : test de l‘adaptateur, vitesse plus grande de CPC vers PC (approximativement 1600 octets par seconde lors de la lecture sur la disquette, avec un 486/66), statistiques. Ainsi, vous pouvez transférer 16 K en 10 secondes ! Merci à Klaus Weber pour m‘avoir fait remarquer qu‘avant, c‘était beaucoup trop long. Dans PCPARA, il y avait un DELAY(1) après chaque quartet, pour attendre une milliseconde, et ce n‘était pas nécessaire.
- v1.2c (28.2.1995 - ) : était disponible dans UPD12C.ZIP
- Parties de CPCEMU réécrites en C++. Cela permet des fonctions “inline” et des interfaces améliorées, pour garder un meilleur aperçu sur le projet.
- v1.2d (16.3.1995 - ), réservée aux correspondants
-
Z80 rapide : changements internes, invisibles à l‘utilisateur, sauf une petite amélioration de la vitesse. Toutes les données sont gardées dans le segment de données, à présent, au lieu du segment de code.
Introduit finalement le mode absolument nécessaire pour les ordinateurs rapides : le “realtime CPC” (vitesse réelle du CPC, à sélectionner dans le menu des réglages ou avec REALTIME=1).
- v1.3 (16.4.1995 - )
-
Base de données de POKEs pour les jeux.
Documentation sommaire en français.
Commandes pour le FDC (reformater des images de disquettes à la même taille).
Nouveau système de menu acceptant la souris (MOUSE=1).
Insertion d‘images de disquettes avec l‘attribut DOS “read-only”, et qui conservent cet attribut.
Menu Debug : ajouté l‘option “find”.
- v1.3a (30.4.1995 - ) (était disponible sous UPD13A.ZIP)
-
Avec la version v1.3, “Boulder Dash” ne marchait pas, alors qu‘il fonctionnait avec v1.2.
Le mode 2 d‘interruption du Z80 n‘était pas simulé correctement (oublié PUSH/POP).
L‘émulation lente du Z80 avait une bogue similaire.
CPCTRANS : option -f 6 activée.
- v1.3b (20.5.1995 - ) (disponible sous UPD13B.ZIP)
- Certains utilisateurs ont signalé qu‘il n‘y avait pas de sortie de son SoundBlaster depuis la version 1.3.
- v1.4a0 (21.3.1996 (v1.3c); published in the German magazin c't 6/97))
-
Support de son GUS par Ulrich Doewich.
Système d‘aide en ligne en anglais, allemand, français et
espagnol. Documentation complète en français.
Support pour deux joysticks.
Modes vidéo VESA pour résolutions supérieures.
Amélioré le menu des réglages et le fichier de configuration.
Configuration “load” et “save” ajoutées dans le menu des réglages.
Amélioré les routines du FDC pour les formats non standard.
Format de disquette étendu.
Couleurs et touches paramétrables par l‘utilisateur.
Nouveau SNA2GIF (v1.1) pour récupérer l‘image-écran d‘un snapshot.
CPCTRANS amélioré (v2.3).
Emulation rapide du Z80 : parfois, l‘écran n‘est pas complètement effacé après un reset (problème avec HALT).
- v1.4a1 (4.4.1996)
- v1.4a2 (5.7.1996)
- v1.5b0 (8.6.1998; published in the German magazin c't 12/98)
- v1.5b1
CPCEMU est écrit en C++ et en assembleur, à l‘aide de Borland C 3.1, optimisation 386 et Turbo Assembler. Pour le débogage, on a employé Turbo Debugger.
Les couleurs ont été composées avec le programme VGAMETER de J. Stephen Shattuck, Jr., le CPC étant connecté à un téléviseur avec un adaptateur Scart.
(A partir d‘ici, vous pouvez reprendre votre lecture sans danger.)
Chapitre 8. Appendice
© Marco Vieth, Mai 1998
Marco Vieth, 19.04.2008 12:21:50
|