PC-CPC
-------
Emulateur Amstrad CPC 6128, crit 100% en C par Ludovic DEPLANQUE (Demoniak)
Toutes suggestions, remarques, conseils sont les bienvenus.
Pour me contacter :
ldeplanque(at)nordnet(point)fr
Sources disponnibles sur simple demande.

Utilisation :
-------------
Lancer l'mulateur (Z80.EXE)
Pour pouvoir fonctionner, il a besoin :
- du fichier config.cpc
- les roms d'un cpc (dans le rpertoire dfinit par le fichier config.cpc)
- ventuellement, un ou plusieurs fichiers images disquette (au format .DSK)

Touches de fonctions :
----------------------
F1 -> Mode turbo 'ON' : Ne synchronise plus l'affichage  50Hz. Cette
    option peut tre utile avec un PC assez lent.

F2 -> Mode turbo 'OFF' : Synchronise l'affichage  50Hz, comme sur un vrai CPC.

F3 -> Bouton 'STOP' de la multiface II (attention, cette option n'est pas
    encore totalement fonctionnelle). 

F4 -> Lecture d'un snapshot. Un snapshot est un fichier contenant l'tat
    de chaque composant du cpc ainsi qu'une copie de la mmoire  un instant
    dtermin, pour permettre par exemple une sauvegarde d'un jeu  un endroit
    prcis.
    

F5 -> Sauvegarde d'un snapshot

F6 -> Appel du dbuggeur Z80 intgr (en option...) Touches : Espace = pas 
      pas. Nouvel appui sur F6 : sortie du dbuggeur

F7 -> Changement de disquette. Une disquette est mule par un fichier image
    (fichier avec l'extension .DSK). Ce mode dsactive le mode de lecture
    depuis le disque dur du PC.

F8 -> Reset du CPC. Similaire  un switch du bouton ON/OFF

F9 -> Lecture d'un fichier cassette. Permet d'indiquer un nom de fichier au
    travers duquel l'mulation de la lecture cassette sera ralis. Le fichier
    doit tre un fichier au format .WAV, digitalis sur 8 bits en mono, avec
    une frquence de 11, 22 ou 44 Khz.

F11 -> Ecriture d'un fichier cassette. Permet de crer un fichier dans lequel
    sera restranscrit toute criture sur cassette. Le fichier cr est un
    fichier .WAV digitalis sur 8 bits en mono  la frquence de 11 Khz.

F12 -> Changement du mode d'mulation disquette. Par dfaut, les disquettes
     sont mules par un fichier .DSK. Un nouveau mode permet d'muler
     directement les fichiers depuis une partition ou un lecteur de disque
     du PC. Ce mode dsactive la lecture/criture par fichiers .DSK

SHIFT+F2 -> Permet de sauvegarder l'image actuelle de l'mulateur dans un
    fichier BMP.

SHIFT+F5 -> Permet de sauvegarder les sons dans un fichier au format YM.
    Un nouvel appui sur las touches SHIFT+F5 permet d'arrter la sauvegarde, et
    affiche le nombre de "trames" sauvegardes (une trame = 1/50e de secondes).

SHIFT+F9 -> Permet, lorsqu'un fichier cassette est ouvert en lecture (par F9),
    de choisir la position dans le fichier via un "compteur de secondes".
    Une fentre popup s'ouvre alors, indiquand la position actuelle du fichier.
    Il sufit d'diter cette valeur puis d'appuyer sur le bouton "OK" pour la
    modifier. La fermeture de la fentre par la petite croix en haut  droite
    ne fait aucune modification sur la position du compteur.

SHIFT+F11 -> Permet de sauvegarder les images de l'mulateur dans un fichier AVI.
    Un nouvel appui sur les touches SHIFT+F11 permet d'arrter l'encodage, et
    affiche le nombre d'images encodes. Pour le moment, la vitesse est fixe
     25 images par secondes (soit une image toutes les 2 vbl pour le CPC).



Arguments ligne de commande :
-----------------------------
-disk nom_fichier_avec_chemin_complet.dsk : permer de charger un fichier .dsk
    au dmarrage

-snapshot nom_fichier_avec_chemin_complet.sna : permet de charger un snapshot
    au dmarrage pour lancement automatique

-run fichier : permet de dmarrer automatiquement le fichier dont le nom est
    "fichier".

Nouvelles commandes RSX disponnibles
------------------------------------
PC-CPC contient une nouvelle rom dvelope spcialement qui contient 7
nouvelles commandes RSX ajoutes au BASIC Amstrad :

|PACKSCR,adr_buffer,adr_longueur
Permet de compacter l'cran affich sur le cpc (adresse #C000->#FFCF).
adr_buffer reprsente l'adresse o sera stocke l'image compacte,
adr_longueur reprsente l'adresse o sera stocke sur 16 bits
la longueur de l'image compacte. adr_longueur peut tre l'adresse
d'une variable basic entire (ex : @longueur%)

|DEPKSCR,adr_buffer
Permet de dcompacter l'cran stock  l'adresse adr_buffer.

|PACKWIN,xd,yd,xa,ya,adr_buffer,adr_longueur
Permet de compacter la fentre affiche sur le cpc en choisissant
les coordonnes (xd,yd) comme point de dpart et (xa,ya) comme
point d'arrive de la fentre. xd varie de 0  79 quel que soit
le mode cran (xd reprsente la colonne de dpart en octets),
xa varie de 0  79 et doit tre suprieur ou gal  xd.
yd varie de 0  199 quel que soit le mode cran (yd reprsente
la ligne de dpart en octets), ya varie de 0  199 et doit tre
suprieur ou gal  yd.
adr_buffer reprsente l'adresse o sera stocke la fentre compacte,
adr_longueur reprsente l'adresse o sera stocke sur 16 bits
la longueur de l'image compacte. adr_longueur peut tre l'adresse
d'une variable basic entire (ex : @longueur%)

|DEPKWIN,adr_buffer
Permet de dcompacter la fentre stock  l'adresse adr_buffer.

|PACKWINDC,adr_buffer,adr_longueur
Permet de compacter la fentre affiche sur le cpc en calculant
automatiquement les coordonnes de celle-ci en fonction des points
prsents sur l'cran. Pour rsumer, il suffit d'afficher la fentre
que l'on veut compacter sur un cran vierge, et ce RSX calculera
automatiquement les coordonnes. Le format de la fentre compacte
est le mme qu'avec l'instruction |PACKWIN.
adr_buffer reprsente l'adresse o sera stocke l'image compacte,
adr_longueur reprsente l'adresse o sera stocke sur 16 bits
la longueur de l'image compacte. adr_longueur peut tre l'adresse
d'une variable basic entire (ex : @longueur%)

|PACKWINDIFF,adr_buffer,adr_diff,adr_longueur
Permet de compacter la fentre affiche sur le cpc en calculant
automatiquement les coordonnes de celle-ci en fonction des diffrences
entre l'image affiche  l'cran et l'image situe  l'adresse adr_diff.
Le format de la fentre compacte est le mme qu'avec l'instruction
|PACKWIN. adr_buffer reprsente l'adresse o sera stocke l'image
compacte, adr_longueur reprsente l'adresse o sera stocke sur 16 bits
la longueur de l'image compacte. adr_longueur peut tre l'adresse
d'une variable basic entire (ex : @longueur%)

|INITBUFFDIFF,adr_buffer
Permet d'initialiser le buffer des diffrences inter-images.
Ceci permet, lors du premier appel de |PACKWINDIFF, d'avoir un buffer
initialis avec un cran par dfaut. En gnral, on pourra faire :
MODE 1:|INITBUFFDIFF,&C000

|PACKBUFF,adr_source,longueur,adr_dest,adr_longueur
Permet de compacter une zone mmoire d'adresse et de longueur
dtermine vers une zone de destination.
adr_source reprsente l'adresse de la zone mmoire  compacter,
longueur reprsente la longueur de la zone mmoire  compacter,
adr_dest reprsente l'adresse de la zone de destination (qui
contiendra les donnes compactes)
adr_longueur reprsente l'adresse o sera stocke sur 16 bits
la longueur de l'image compacte. adr_longueur peut tre l'adresse
d'une variable basic entire (ex : @longueur%)
Ces nouveaux RSX font appel  une fonction de compactage LZW, code
en C, et donc performante et rapide. Il est galement possible d'appeler
les fonctions de compactage-dcompactage en assembleur via les
op-codes suivants :

|DEPKBUFF,adr_source,adr_dest,adr_longueur
Permet de dcompacter la zone mmoire stock  l'adresse adr_source vers
adr_dest.
adr_longueur reprsente l'adresse o sera stocke sur 16 bits
la longueur de la zone dcompacte. adr_longueur peut tre l'adresse
d'une variable basic entire (ex : @longueur%)

|CONVERTBITMAP,"nom_image"[,"paramtres"]
Permet de convertir une image bitmap (.BMP) depuis son emplacement sur
le disque dur du PC et de l'afficher  l'cran du cpc (dans la mmoire
vido) convertie avec le mode courant.
"nom_image" est une chaine de caractres ou une variable alphanumrique
contenant le nom et le chemin complet de l'image source (par exemple:
"C:\WINNT\WINNT256.BMP" (sur cpc azerty, le '\' est remplac par '')
Les paramtres doivent tre mis dans une chaine de caractres, spars
par des espaces, exemple :
"-T1 -X2"
Les paramtres sont :
-Bnnn   valeur de la composante bleue (en %)
-L      bloquer la palette (utiliser les valeurs courantes)
-Pnnn   pourcentage de tramage (en %)
-Rnnn   valeur de la composante rouge (en %)
-Tnnn   type de trame (de 0  3, 0=rien)
-Vnnn   valeur de la composante verte (en %)
-Xnnn   type de matrice de tramage (2 ou 3)

|CONVLIGNE,Etat,ModeAdresse
Permet de charger l'tat de conversion des donnes mmoire cran vers les
fentres pour compactage : si Etat=0, la conversion sera effectue par colonnes
(mode par dfaut) sinon, la conversion sera effectue par lignes (plus rapide,
mais moins efficace  la compression.).
Si ModeAdresse=0, les coordonnes XD,YD,XA,YA seront stockes au dbut des
donnes de la fentre (mode par dfaut), sinon, l'adresse cran (2 octets),
le nombre de lignes et le nombre de colonnes seront stockes.

|SAUVEBITMAP,"NomFic"
Pemet de sauvegarder l'image courante ( l'cran de l'mulateur) dans un fichier
au format BMP.

|TURBOON
Permet d'activer le mode turbo. (Equivalent touche F1)

|TURBOOFF
Permet de dsactiver le mode turbo. (Equivalent touche F2)

|READSNAP,"NomFicSna"
Permet de lire un fichier snapshot. (Equivalent touche F4)

|SAVESNAP,"NomFicSna"
Permet de sauvegarder un fichier snapshot. (Equivalent touche F5)

|DEBUGON
Permet d'activer le mode debug. (Equivalent touche F6)

|SETDSKFILE,"NomFicDsk"
Permet de choisir un fichier .DSK  utiliser. (Equivalent touche F7)

|SAVEAVI,"NomFicAvi"
Permet de dmarrer l'enregistrement de l'cran d'mulation dans un fichier avi.
(Equivalent touches SHIFT+F11)

|ENDAVI
Permet d'arrter l'enregistrement du fichier avi.
(Equivalent touches SHIFT+F11)

|SAVEYM,NomFicYM
Permet de dmarrer l'enregistrement de la sortie sonore dans un fichier au
format YM5.
(Equivalent touches SHIFT+F5)

|ENDYM
Permet d'arrter l'enregistrement du fichier YM.
(Equivalent touches SHIFT+F5)

|SETDIRECTDIR,"Directory"
Permet de choisir le rpertoire vers lequel seront dirigs les accs disques.
(accs direct  un rpertoire, quivalent touche F12)


Certains OP-CODE Z80 ont ts redfinis pour pouvoir utiliser directement les
nouvelles fonctionnalits de la ROM-PACK en assembleur :


ED 01 : quivalent de |PACKSCR, avec en entre :
HL = adresse du buffer de compactage
IX = adresse contenant la longueur compacte
Aucun registre n'est modifi au retour.

ED 02 : quivalent de |PACKWIN, avec en entre :
E  = xd
D  = yd
C  = xa
B  = ya
HL = adresse du buffer de compactage
IX = adresse contenant la longueur compacte
Aucun registre n'est modifi au retour.

ED 03 : quivalent de |DEPKSCR, avec en entre:
HL = adresse du buffer des donnes compactes
Aucun registre n'est modifi au retour.

ED 04 : quivalent de |DEPKWIN, avec en entre:
HL = adresse du buffer des donnes compactes
Aucun registre n'est modifi au retour.

ED 05 : quivalent de |PACKWINDC, avec en entre:
HL = adresse du buffer de compactage
IX = adresse contenant la longueur compacte
Aucun registre n'est modifi au retour.

ED 06 : quivalent de |PACKBUFF, avec en entre:
HL = adresse de la zone  compacter (source)
DE = adresse de la zone destination
BC = longueur de la zone  compacter.
IX = adresse contenant la longueur compacte
Aucun registre n'est modifi au retour.

ED 07 : quivalent de |DEPKBUFF, avec en entre:
HL = adresse de la zone source (zone compacte)
DE = adresse de la zone destination
IX = adresse contenant la longueur dcompacte
Aucun registre n'est modifi au retour.

ED 08 : quivalent de |PACKWINDIFF, avec en entre:
HL = adresse du buffer de compactage
DE = adresse du buffer cran pour comparaison des diffrences
IX = adresse contenant la longueur compacte
Aucun registre n'est modifi au retour.

ED 09 : quivalent de |INITBUFFDIFF, avec en entre:
HL = adresse du buffer d'initialisation
Aucun registre n'est modifi au retour.

ED 0A : quivalent de |CONVERTBITMAP, avec en entre:
HL = Pointeur vers nom du fichier BMP
B = Longueur nom fichier BMP
DE = Pointeur vers chaine contenant les arguments
C = Longueur chaine contenant les arguments
Aucun registre n'est modifi au retour.

ED 0B : quivalent de |CONVLIGNE, avec en entre:
A = Etat
B = ModeAdresse
Aucun registre n'est modifi au retour.

ED 0C : quivalent de |SAUVEBITMAP, avec en entre:
HL = Pointeur vers nom du fichier BMP
B = Longueur nom fichier BMP
Aucun registre n'est modifi au retour.

ED 0D : quivalent de |TURBOON ou de |TURBOOFF, avec en entre:
A = mode turbo (0 = OFF, sinon ON)
Aucun registre n'est modifi au retour.

ED 0E : quivalent de |READSNAP, avec en entre:
HL = Pointeur vers nom du fichier SNA
B = Longueur nom fichier SNA
Aucun registre n'est modifi au retour.

ED 0F : quivalent de |SAVESNAP, avec en entre:
HL = Pointeur vers nom du fichier SNA
B = Longueur nom fichier SNA
Aucun registre n'est modifi au retour.

ED 10 : quivalent de |DEBUGON
Aucun registre n'est modifi au retour.

ED 11 : quivalent de |SETDSKFILE, avec en entre:
HL = Pointeur vers nom du fichier DSK
B = Longueur nom fichier DSK
Aucun registre n'est modifi au retour.

ED 12 : quivalent de |SAVEAVI, avec en entre:
HL = Pointeur vers nom du fichier AVI
B = Longueur nom fichier AVI
Aucun registre n'est modifi au retour.

ED 13 : quivalent de |ENDAVI
Aucun registre n'est modifi au retour.

ED 14 : quivalent de |SAVEYM, avec en entre:
HL = Pointeur vers nom du fichier YM
B = Longueur nom fichier YM
Aucun registre n'est modifi au retour.

ED 15 : quivalent de |ENDYM
Aucun registre n'est modifi au retour.

ED 16 : quivalent de |SETDIRECTDIR, avec en entre:
HL = Pointeur vers chemin complet
B = Longueur chemin complet
Aucun registre n'est modifi au retour.


* Exemple : Compactage d'un cran :

BUFFER  EQU     #4000
        LD      HL,BUFFER
        LD      IX,TAILLE
        DB      #ED,#01
        RET
TAILLE  DW      0

* Exemple : Dcompactage d'un cran

BUFFER  EQU     #4000
        LD      HL,BUFFER
        DB      #ED,#02
        RET


Il existe galement un source assembleur Z80 des routines de dcompactage,
donc utilisable sur un vrai CPC. (Me contacter pour l'obtenir)


Lancement d'un jeu sur un CPC
-----------------------------
Pour obtenir le "catalogue" d'une disquette, taper
[CAT], suivi de [enter]
La liste des fichers prsents sur la disquette s'affiche
alors. Pour excuter le programme dsir, il sufit de
taper : 
[RUN "nomdufichier"] [enter]
Les fichier excutables sont en gnral :
- des programmes crit en basic, avec une extension .BAS
- des programmes crit en assembleur, avec une extension .BIN

Infos techniques
-----------------
- L'mulateur utilise un fichier de configuration nom "Config.cpc",
qui doit se trouver dans le mme rpertoire que l'excutable.
Le dtail du paramtrage se trouve crit dans le fichier en lui-mme.
- L'mulateur est crit 100% en C, sous environement Windows 32 bits,
et de manire  tre port facilement sur d'autres plateformes (ex: Amiga).
Les fonctions muls sont les suivantes :
- Processeur Z80 : 99% des instructions,
- AY3-8912 (processeur sonore) : 3 voies + bruits blancs + enveloppes,
- CRTC 6845 (controlleur cran ) : Les registres fondamentaux  50% 
    (1, 2, 6, 7, 9, 12, 13),
- PPI 8255 (interface parallle ): 90% (Seul le mode 0 du 8255 est mul,
    car c'est le seul utilisable dans un CPC),
- UPD 765 (controlleur disque ) : 70% (Permet la lecture des fichiers
    images standard),
- VGA (Video gate array) : 90 % (Slection encres, Mode cran, Roms)
- Timings Hsync et Vsync (synchro horizontale et verticale),
- Gestion disquettes par fichier image standard (.DSK)
- Gestion sauvegarde tat en cours par fichier snapshot standard (.SNA)
- Gestion cassettes par fichier au format WAV
- Utilisation du disque de la machine hote pour lecture/criture de fichiers
