CpcAlive es
un sistema de
programación
compatible
 Amstrad
CPC para 
la
creación de
animaciones
gráficas.







Cpc Online

CpcAlive instalador
para Windows y DosBox






















Français                          English



"Los invito a abrirse a Mí y a convertirse, en mis manos, en...


...un instrumento para la salvación del mundo."




* CpcAlive V1.19b * DOCUMENTATION (V2025)
EVOLUCIÓN:
V1.19b- 19/02/2025 - correcciones
V1.19a- 09/02/2025 -
 correctiones y implementación de programación en C++
V1.18 - 27/01/2025 - creación de animaciones GIF 320*200*256 colores y correcciones
V1.17 - 07/01/2024 - nueva resolución de pantalla 1024*768*256 (MODE 3)
V1.16 - 16/12/2014 - corrección compilador Z80
                             - agregue "." a las directivas LISTHEX,NOLIST,DEBUG,DUMP,TAB
V1.15 - 30/11/2014 - correctiones
V1.14 - 20/11/2014 - Muestra los archivos .ASM en el depurador Z80
V1.13 - 20/9/2014 - mejora del pedido basic TRON (basic debugger) y correcciones
V1.12 - 02/3/2014 - gestión programas basic con etiquetas y correcciones









nota: Esta documentación utiliza dos tipos de notación de los valores hexadecimales. La primera notación añade la señal "&" ante el valor, ex:&3F. La segunda notación añade la carta "h" detrás del valor, ex:3Fh.



CONTENIDO  (haga clic en el margen para volver aquí)

I - 
Presentación del emulador CpcAlive
II - Ficheros reconocidos por el emulador

        II - 1 - Ficheros de programas basic con etiquetas
        II - 2 - Ficheros assembler Z80
        II - 3 - Ficheros al formato intel hex  -
        II - 4 - Ficheros de pedidos CpcAlive
        II - 5 - Ficheros al formato texto
        II - 6 - Ficheros binarios
        II - 7 - Disquetes virtuales al formato. DSK -
        II - 8 - ROMs CPC -
        II - 9 - Ficheros al formato AMSDOS
III - Pedidos CpcAlive a partir del interpretador BASIC del Cpc
IV - Pedidos a partir de la línea de pedido del DOS
CpcAlive [ficheros_de_entrada[:X ]] [pedidos CpcAlive] [pedidos Cpc] [>fichero_de_salida]
V - Carácters acentuados
VI - Acceso a las interruptiones del Bios y del Dos con el procesador Z80
VII - Entorno de programación
X86

VIII - Programas utilitarios
    - 1 -
CreaDisc: crea un disquete virtual virginal al formato dató
    - 2 -
Extract: Para extraer los ficheros de un disquete virtual.
    - 3 -
AniCrea: es un programa que añade comandos para grabar la pantalla del emulador y crear animaciones gráficas en formato GIF.
    - 4 - GIF conversiones (GIF>MP4)
    - 5 - Teclado completo para uso en Android

    - 6 - Dza:  Desensamblador Z80 Dos/Win32
    - 7 -
Concatenación de ficheros




I - Presentación del emulador CpcAlive

CpcAlive es un sistema de programación compatible Amstrad CPC para la creación de animaciones gráficas.
La originalidad del emulador es que puede funcionar en todos los medios aceptando el emulador de Dos "Dosbox".

Especificidades del emulador CpcAlive

gestión basic con etiquetas
* resolución de pantalla 320*200*256, 160*200*16, 640*200*16 y 1024*768*256 (MODE 3)
* entorno de programación X86 (16Mo)
* acceso a las interrupciones del Bios y del Dos mediante instrucciones añadidas al Z80
* salidas pantalla al formato BMP y animaciones gráficas GIF 256 colores

* BASIC programable
* posibilidad de tratar a partir del interpretador BASIC del CPC, todo fichero presente en el disco duro u otro soporte.
* cree salvaguardias ejecutables
compilador/debugger Z80 y debugger BASIC
* gestión de los ficheros creados por el compilador C PhrozenC


Configuración de DosBox en el archivo INI\DOSBOX\DOSBOX.CONF
Si el modo "pantalla completa" es demasiado lento o no funciona, cambie el comando fulldouble = true/false
Si el tempo de lanzamiento del emulador es excesivo o si el lanzamiento es imposible (pantala azul),
reemplazar el comando cpuspeed = max. por un valor (ex: cpuspeed =16000)
Instalatión en android y linux


II - Ficheros reconocidos por el emulador

Cargamento a partir de la línea de pedido DOS:
CpcAlive directory\NombreDeFichero[:X]
Es tan posible utilizar el sintaxis: ! directory\NombreDeFichero[:X]

- NombreDeFichero = 8 caracteres máximo + 3 caracteres de extensión
- El marcador representado por el carácter X es facultativo, depende del tipo de fichero que debe encargarse.
(No poner espacio entre el nombre de fichero y el marcador).

Cargamento a partir de un fichero de pedidos CpcAlive:
directory\NombreDeFichero[:X]

Cargamento a partir del interpretador BASIC del Cpc:
|INPUT, "directory\NombreDeFichero[:X]"[,@er%]

El parámetro de vuelta de error @er% es faculatif. Si se pone, el significado de los valores recuperados en la variable er% son:
        0 = ok
        1 = 
error en los parámetros
        2 = fichero no encontrado
        3 = camino o fichero no encontrado
        4 = más de handle disponible
        5 = acceso denegado

No olvidar inicializar un er% al principio del programa o antes el pedido.

p.ej.:     10 er%=0
            20 |INPUT,"disque.dsk:A",@er%
            30 if er%<>0 then PRINT"error":STOP

Es posible poner vario nombre de ficheros a la consecuencia, basta con separarlos de un espacio. En este caso, el código de error er% se referirá solamente al último fichero mencionado. Ha tan posible de obtener información sobre el último fichero encargado con el siguiente pedido:

info$=string$(12,"X"):|INFO,@info$:PRINT info$

II - 1 - Cargamento Ficheros de programas basic con etiquetas

Estos ficheros deben comenzar con la secuencia "BAS:" sin las comillas y la primera línea está reservada.


Cargamento a partir de la línea de pedido DOS:
! PROGRAMA.BAS

El emulador solicitar al final de la bota Cpc para cargar el archivo y pondrá en marcha automáticamente.
Cargamento a partir de un fichero de pedidos CpcAlive:
PROGRAMA.BAS
Cargamento a partir del interpretador BASIC del Cpc:
|INPUT, "
PROGRAMA.BAS"
|RUN, "PROGRAMA.BAS"

El pedido |RUN pone en marcha automáticamente el programa.

notas:
 - encabezado BAS:REMOFF previene la carga de las REMs en memoria
 - ficheros con los números de línea también se aceptan.
 - el pedido basic TRON lanza un debugger. Normal retorno con la tecla [F12] o si el programa encuentra una instrucción TROFF.
 - es posible romper los programas mediante la integración de las diferentes partes en un
fichero de pedidos utilizando la siguiente plantilla:
(consulte el capitulo ficheros de pedidos CpcAlive para mas precisión en los ficheros de pedidos)
 
CMD:WAITSYS (** CpcAlive command file - WAITSYS=wait end of cpc boot **)
INC\MAINJUMP.BAS    ;This file contain just a jump to the first line of the last file loaded. The "goto" line address will be defined by the loader.
FILE1.BAS    ;** PROGRAM FILE 1 **

FILE2.BAS    ;** PROGRAM FILE 2 **

;in this file, labels can only be called by files loaded before (FILE1.BAS)
(.... ....)

MAIN
.BAS    ;** MAIN FILE **
; !! THE MAIN FILE MUST BE PLACED IN LAST PLACE !!
TEXT    ;Text mode. After this command, this file will be interpreted trough the cpc keyboard
RUN

ejemplo: (cargamento a partir de la línea de pedido DOS: ! demo)
CMD:WAITSYS (** CpcAlive command file - WAITSYS=wait end of cpc boot **)

INC\MAINJUMP.BAS    ; never remove this line. This file contain just a jump to the first line of the last
file loaded. The "goto" line address will be defined by the loader.

;(do not load commands files between basic files)

INC\IBMP.BAS    ;** DISPLAY BMP IMAGES 16/256 COLORS NOT COMPRESSED **
;in this file, labels can only be called by files loaded before
;Basic lignes will be numbered greater than 1000 in cpc if no files loaded before is larger than 1000 lines

EX\STAR.BAS    ;** STAR LOADER **
;in this file, labels can only be called by files loaded before
;Basic lignes will be numbered greater than 2000 in cpc if no files loaded before is larger than 1000 lines

EX\ANI.BAS    ;** DEMO ANIMATION (MAIN FILE) **
; !! THE MAIN FILE MUST BE PLACED IN LAST PLACE !!
;Basic lignes will be numbered greater than 3000 in cpc if no files loaded before is larger than 1000 lines

TEXT    ;Text mode. After this command, this file will be interpreted trough the cpc keyboard

RUN

 - otros ejemplos de programa basic: Display images .BMP, Intel hex to binary conversion, Merge multiple files into one file


II - 2 - Cargamento de ficheros assembler Z80

El emulador utiliza la secuencia "org & " en cartas minúsculas en la primera línea del fichero para determinar que eso es uno fichero assembler creado con el compilador C PhrozenC. Para las otras ficheros, el emulador buscará la secuencia ".org " o "org " en cartas minúsculas o capitales sobre los quatres primeras cartas del fichero.

El compilador interno utiliza las directivas assembler
DB, DEFB, DW, DEFW, DS, DEFS, END, EQU, ORG, IF, IFDEF, IFNDEF, ELSE, ENDIF
y:
.LISTHEX : lista el programa al formato Intel Hex en el fichero de salida
.NOLIST : decida el listado
.DEBUG : empiece el débuggeur
.DUMP dirección :
inicializa el dump memoria del debugger
.TAB valor : conjuntos mostrarán las pestañas a los archivos de ASM en el depurador (valor por defecto 8)

Es posible definir macros-instrucción de esta manera:
P.ej.:
MACRO ADD (X, Y)
LD HL, X
LD DE,Y
ADD HL, DE
ENDM

El compilador interno reconoce las siguientes directivas Tasm (8bits):
.BYTE, .DB, .DW, .DS, .END, .EQU, .FILL,.ORG, .WORD, #IF, #IFDEF, #IFNDEF, #ELSE, #ENDIF, #INCLUDE, #DEFINE y #DEFCONT así como los siguientes operadores: =, +, -, *,/, |, &
Los paréntesis y las prioridades matemáticas no se gestionan.

Para compilar un fichero assembler Z80 en memoria Ram, hacer seguir el nombre de fichero del marcador :X donde X representa el tipo de configuración de la memoria Ram destinatario seguido de la dirección de cargamento deseada. Por defecto, el cargamento se hace en memoria Ram con la configuración 0C0h a la dirección indicada por el pedido ORG. (véase Cargamento en memoria Ram para los distintos tipos de configuración memoria Ram)

Cargamento en memoria Ram con
configuración normal:
Cargamento a partir de la línea de pedido DOS:
! PROGRAMA.ASM

El emulador solicitar al final de la bota Cpc para cargar el archivo y pondrá en marcha automáticamente. (Un solo archivo en un tiempo posible)
Cargamento a partir de un fichero de pedidos CpcAlive:
PROGRAMA.ASM
Cargamento a partir del interpretador BASIC del Cpc:
|INPUT, "
PROGRAMA.ASM"
|RUN, "PROGRAMA.ASM"

El pedido |RUN pone en marcha automáticamente el programa y es efectivo solamente en caso de cargamento en Ram normal. El pedido |RUN, "
PROGRAMA.ASM: 0C0h, 02000h" fuerza el cargamento a la dirección 02000h y pone en marcha el programa. Es posible obtener la dirección memoria siguiente el bloque encargado de la siguiente manera:
info$=string$(20,"X"):|INFO,@info$:EndBloc=val("&"+mid$(info$,17,4)):?hex$(EndBloc)


Para compilar un fichero assembler Z80
 en rom, hacer seguir el nombre de fichero del marcador:R. CpcAlive buscará el primer sitio disponible.

Cargamento a partir de la línea de pedido DOS:
!
ROM.ASM:R
Cargamento a partir de un fichero de pedidos CpcAlive:
ROM.ASM:R
Cargamento a partir del interpretador BASIC del Cpc:
|INPUT, "
ROM.ASM:R"

El número del sitio de ROM estado cargada puede obtenerse de la siguiente manera:
info$=string$(16,"X"):|INFO,@info$:RomSitio=val("&"+mid$(info$,15,2)):PRINT RomSitio
En el caso es necesario tener un número de sitio fijo, sustituir a la carta "R" por el número de sitio deseado. (Valores admitidos de 0 a 191)  ejemplo a partir de la línea de pedido DOS: ! ROM.ASM:10
La dirección memoria siguiente el bloque encargado quizá obtienese de la misma forma que para el cargamento en Ram. Es tan posible elegir la dirección de cargamento indicando ésta en segundo parámetro.

Ejemplo de creación de una ROM que contiene instrucciones BASIC programables



II - 3 - Cargamento ficheros al formato Intel Hex  -

El formato Intel Hex es línea orientada y utiliza solamente caracteres ASCII imprimibles.

línea al formato INTEL hex:

:LLAAAA00DDDD...CC   ; ' : ' = carácter inicial                                
                                        ; LL = taille bloque
(2 dígitos hexa)
                                        ; AAAA = dirección inicial (4 dígitos hexa)
                                        ; 00 = tipo de registro (00)
                                        ; DDDD = datos (
2 dígitos hexa para cada octeto de datos)
                                        ; CC = CRC
(Checksum) de la línea (2 dígitos hexa)

ejemplo:

:18A600000109A62111A6C3D1BC15A6C31EA6C335A6000000004F5049A2
:18A61800D8495049D800DD5603DD5E02DD4605DD4E043E0C4052DD7E97
:18A6300000404810C9D5DD5603DD5E02DD4605DD4E043E0D40524048AD
:07A6480010D11213AF12C97B
:00000001FF

En este ejemplo, la primera línea contiene 018h octetos de datos (01h,09h,0A6h... 049h) que se encargarán a partir de la dirección 0A600h. El crc
(Checksum) de la línea es igual a 0A2h. El emulador ignora el crc normalmente presente a cada final de línea en la norma Intel Hex. El tipo de registro igual a 1 indica la última línea del fichero. Esta línea no es necesaria en los ficheros encargados por el emulador.

Cargamento en rom:

Para encargar un fichero al formato intel hex en rom, hacer seguir el nombre de fichero del marcador:X dónde X representa el número de rom destinatario. P.ej. para encargar en la rom número 10:
Cargamento a partir de la línea de pedido DOS:
! FICHERO.HEX:10

Cargamento a partir de un fichero de pedidos CpcAlive:
FICHERO.HEX:10
Cargamento a partir del interpretador BASIC del Cpc:
|INPUT, "
FICHERO.HEX:10"

Si la rom no existe, CpcAlive lo crea. Es tan posible utilizar al marcador:R , CpcAlive buscará el primer sitio disponible. (véase cargamento roms)


Cargamento en ram:

El 6128 poseen una memoria de 128 Ko divididos en ocho bloques de 16 Ko cada uno, numerados de 0 a 7. Sólo cuatro bloques pueden seres conectados simultáneamente.

Cuadro por el que se muestra la localización de los bloques Ram en foncion del tipo
de configuración:
                tipo      posiciones bloques
                0C0h          0,1,2,3             
<= configuración normal
                0C1h          0,1,2,7
                0C2h          4,5,6,7
                0C3h          0,3,2,7
                0C4h          0,4,2,3
                0C5h          0,5,2,3
                0C6h          0,6,2,3
                0C7h          0,7,2,3

valores mediante puerto & 7F añadidas a l' emulador:

                &C8           0,8,2,3
                &C9           0,9,2,3
                ...
                &FF           0,&3F,2,3

El sistema de Cpc so'lo explota el primer tipo de configuración. En esta configuración el bloque 0 ocupa el espacio 0 a 03FFFh de la memoria, el bloque 1 el espacio 04000h a 07FFFh, el bloque 2 el espacio 08000h a 0BFFFh, el bloque 3 el espacio 0C000h a 0FFFFh. La pantalla explota el bloque 3. La parte superior del bloque 2 contiene las variables sistema. La parte inferior del bloque 0 es utilizada por el sistema. Los programas BASIC son encargados por el sistema a partir de la dirección 0170h. Los datos binarios pueden seres encargadas a partir de la dirección definida con ayuda del pedido Basic "MEMORY". Si se trata de programas, podrán llamarse con la instrucción "CALL".

Para encargar un fichero al formato intel hex en ram,
hacer seguir el nombre de fichero del marcador:X dónde X representa el tipo de configuración del Ram destinatario. Los valores hexadecimales válidos para el cargamento en Ram van de 0C0h a 0FFh. Por defecto, el cargamento se hace en Ram con la configuración 0C0h


Cargamento a partir de la línea de pedido DOS:
! FICHERO.HEX
El emulador solicitar al final de la bota Cpc para cargar el archivo. (Un solo archivo en un tiempo posible)
Cargamento a partir de un fichero de pedidos CpcAlive:
FICHERO.HEX
Cargamento a partir del interpretador BASIC del Cpc:
|INPUT, "
FICHERO.HEX"


notas:
- Es posible ver la memoria del Cpc con el emulador CpcAlive utilizando el pedido |DEBUG,&f a partir del interpretador BASIC.
- El assembler 8 bites "tasm" es un assembler Z80 que genera ficheros al formato Intel hex.



II - 4 - Cargamento de ficheros de pedidos CpcAlive

Los pedidos internos del emulador válidos a partir de la línea de pedido del sistema DOS o de un fichero de pedidos CpcAlive son:

CpuFast selecciona la velocidad máximo                  - [F12]
CpuSlow selecciona la velocidad del ordenador CPC - [F11]
Sleep puesta en víspera del emulador                  - [AltGr][S]
Exit dejar el emulador                              - [Ctrl][Alt][End]
ROM=X selecciona un sitio de ROM (X=256 para el Bios)
RAM=X selecciona el tipo de RAM
ver capítulo "Cargamento en ram" para los valores de configuración disponibles.
:LLAAAA00DDDD... cargamento datos. (línea al formato Intel Hex)
Make:nombre_de_fichero.EXE cree una salvaguardia ejecutable (salvaguarde dejando el emulador).
MakeCont sigue un fichero creado con el pedido Make o |MAKE
Debug:adr empieza el debugger cuando el procesador Z80 encuentra la dirección(ADR) especificada (ram)
Debug:rom,adr empieza el debugger cuando el procesador Z80 encuentra la dirección especificada en la rom especificada (rom superior)
Z80 Para pasar del método "pedidos CpcAlive" al método "Compilador Z80".
La interpretación del fichero se restablecerá en método 
"pedidos CpcAlive" para la instrucción End o .End
PhrozencOrg=ADR ADR=dirección de cargamento por defecto de los ficheros assembler generados por el compilador C PhrozenC.
End  indica el final de un fichero de pedido.
Text Para pasar del método "pedidos CpcAlive" al método "Texto".
El fichero ya no se interpretará como un fichero de pedidos, sino como un fichero Texto. Será posible restablecer la interpretación del fichero en método "pedido" con la instrucción |COMMAND o |CMD. Los pedidos End y Text restablecen la configuración memoria del CPC efectiva al lanzamiento del fichero de pedidos.


ejemplo a partir de la línea de pedido del DOS:
Seleccionar la rom BIOS y colocar 2 en 0B13h (
modo pantalla de comienzo), luego seleccionar el velocidad lenta.

! ROM=256
:010B130002 CpuSlow
(no olvidar el espacio entre los pedidos)

nota:
- colocar en Ram en los bloques 0,1,2 ó 3 antes de la inicialización del sistema CPC es inútil puesto que ésta se borra al comienzo. Para colocar en Ram a partir de la línea de pedido del DOS, es necesario que el sistema se haya lanzado luego puesta en víspera antes.


ficheros de pedidos CpcAlive

Estos ficheros están destinados, como su nombre lo indica, a encargar el emulador a partir de un fichero. Este fichero debe comenzar con la secuencia "CMD:" sin las comillas y la primera línea está reservada.

Cargamento a partir de la línea de pedido DOS:
! FICHERO.CMD

Cargamento a partir de un fichero de pedidos CpcAlive:
FICHERO.CMD
Cargamento a partir del interpretador BASIC del Cpc:
|INPUT, "
FICHERO.CMD"

ejemplo1:
CMD:               ; encabezamiento
ROM=256        ; seleccionar rom bios
:010B130002    ; 0B13h=2 (modo pantalla de comienzo)
CpuSlow          ; selección velocidad
End                 ; indica el final del fichero de pedido

ejemplo2:
CMD:
ROM=256        ; seleccionar rom bios
:010B130002    ; 0B13h=2 (modo pantalla de comienzo)
CpuSlow          ; selección velocidad
Text                ; pasa en método texto
PRINT"ok"

ejemplo3:
PRINT"ok1"
|CMD               ; pasa en método "pedidos CpcAlive"
ROM=256        ; seleccionar rom bios
:010B130002    ; 0B13h=2 (modo pantalla de comienzo)
CpuSlow          ; selección velocidad
Text                ; pasa en método texto
PRINT"ok2"


notas:
- Es tan posible encargar a partir de un fichero de pedidos CpcAlive los siguientes tipos de ficheros:
 ficheros Basic,
ficheros assembler Z80ficheros al formato INTEL hex, ficheros de pedidos CpcAlive, documentos texto y ficheros binario disquetes virtual al formato. DSKficheros Rom CPC. El traslapo de los ficheros de pedidos CpcAlive se autoriza con los límites de 15 ficheros máximos (los ficheros de texto incluidos). Un buen ejemplo es el fichero ROM INI que es un fichero de pedido que se destina a la inicialización del emulador. Es a partir de éste que están cargados por ejemplo los roms del Cpc se interpreta Cada línea de la misma manera que para los pedidos "CpcAlive" a partir de la línea de pedido DOS. Note la presencia del separador ';' para los comentarios. (no utilizar el método "Texto" en el fichero ROM INI). El fichero de pedidos CPC INI situado en el directorio principal es un fichero usuario que puede recibir pedidos de configuración.

-
Encabezado "CMD:WAITSYS" solicitar al final de la bota Cpc para cargar el archivo. (Un solo archivo en un tiempo posible)


II - 5 - Cargamento de ficheros al formato texto

En caso de que el tipo de fichero no es reconocido por CpcAlive como uno de ficheros enumerados más arriba, CpcAlive consideran que se trata de un fichero al formato texto.
CpcAlive trata estos ficheros del mani siguiente:
se lee cada carácter del documento, luego enviado al gestor teclado del sistema CPC. Es así posible, por ejemplo, transmitir por esta función un fichero BASIC al formato texto (sin encabezado "BAS:") o controlar un programa que vuelve en el emulador.

Cargamento a partir de la línea de pedido DOS:
! ejemplo.bas
Cargamento a partir de un fichero de pedidos CpcAlive:
ejemplo.bas
Cargamento a partir del interpretador BASIC del Cpc:
|INPUT, "
ejemplo.bas"

Estos pedidos encargan el programa nombrado exemple.bas si existe, a través el gestor teclado del Cpc en este ejemplo, el fichero "
ejemplo.bas" se sitúa en el directorio CpcAlive.  Si el fichero no existe, la cadena "ejemplo.bas" será transmitida al gestor teclado del Cpc, lo que desembocará probablemente sobre un mensaje "Syntax error".

ejemplo a partir del interpretador BASIC:

MODE 2
10 |INPUT, "SETASM.BAT"
20 LINE INPUT a$:IF INSTR(a$,"hardware")<>0 THEN 
|INPUT,":CLOSE":END ELSE GOTO 20
run


Este ejemplo muestra el documento "SETASM.BAT" hasta que encuentra una línea que contenga la palabra "hardware". El pedido |INPUT,":CLOSE" detiene la carga del archivo a través del teclado.

El traslapo de los ficheros de texto se autoriza con los límites de 15 ficheros máximos (los ficheros de pedidos CpcAlive incluidos).

Cómo encargar programas en el emulador CpcAlive a partir de la función copiar/clavar de Windows XP


II - 6 - Cargamento de ficheros binarios

Es posible utilizar al marcador ":D" ('D'atas) para encargar datos en la memoria del Cpc utilizando el siguiente sintaxis:

a partir del interpretador BASIC del Cpc:
|INPUT,"nombre_de_fichero:D,longitud_bloque,dirección_bloque_en_fichero,dirección_cargamento_en_memoria_Cpc"

a partir de un fichero de pedidos CpcAlive:
nombre_de_fichero:D,longitud_bloque,dirección_bloque_en_fichero,dirección_cargamento_en_memoria_Cpc

Pensar por proteger el bloque encargado con el pedido MEMORY dirección_cargamento - 1. El tamaño real del bloque estado cargado puede obtenerse de la siguiente manera:
info$=string$(16,"X"):|INFO,@info$:LongBloque=val("&"+mid$(info$,13,4))

Es así posible tratar todo tipo de fichero. El ejemplo aqui encarga una imagen BMP y lo indica sobre la pantalla CPC.

El marcador :D solo
tras el nombre de fichero indica al emulador que debe transmitir el valor de cada octeto del fichero a través del teclado del Cpc al formato decimal. Esta función se desarrolló para permitir tratar fácilmente los datos de un fichero a partir del interpretador BASIC del CPC.

Aquí es un pequeño programa que extrae información de una imagen BMP:

BAS:
10 '** INFO BMP IMAGE **
20 mode 2:|Input,"IMAGE.BMP:D"
30 |GO,"&12":'go to address &12 in file = width/height image
40 input a:input b:imgwith=a+256*b
50 input a:input b:imgheight=a+256*b
60 print"image width=";imgwidth
70 print"image height=";imgheight


El pedido |GO,"cadena numerica"[,@er% ] desplaza al indicador de fichero. En este caso, "cadena numerica" representa el valor del desplazamiento con relación al principio del fichero. El parámetro de vuelta de error @er% es faculatif. Si se pone, el significado de los valores recuperados en la variable er% son:
0 = ok
1 = error
(No olvidar inicializar un er% al principio del programa o antes del pedido)

p.ej.: |GO,"&12"   desplaza al indicador de fichero a la posición &12. El valor máximo es &FFFFFFFF. El indicador de fichero quizá también escrito en decimal.



II - 7 - Cargamento disquetes virtuales al formato. DSK -

Hacer seguir el nombre de fichero del marcador:A o:B para elegir el lector
destino. (lector A por defecto)

Cargamento a partir de la línea de pedido DOS:
! NombreDeDisquete:A
Cargamento a partir de un fichero de pedidos CpcAlive:
NombreDeDisquete:A
Cargamento a partir del interpretador BASIC del Cpc:
|INPUT, "NombreDeDisquete:A"

Este pedido lanza el emulador encargando el disquete virtual "disque.dsk" en el lector A del emulador.


II - 8 - Cargamento ROMs CPC -

El Cpc 6128 se proporciona en norma de 48Ko (3 bloques de 16Ko cada uno) de memorias ROM. Uno de estos bloques contiene el sistema de explotación que se conecta en la zona 0 a 03FFFh (rom inferior). Los dos bloques restantes (BASIC y sistema disco) se conectan en la zona 0C000h a 0FFFFh (roms superiores). El sistema puede explotar en esta última zona 252 bloques de 16Ko cada uno. Una particularidad interesante estos de roms es que pueden recibir instrucciones BASIC programables (Resident System eXtension).

Para encargar un fichero en rom, hacer seguir el nombre de fichero del marcador:R. CpcAlive buscará el primer sitio disponible.

Cargamento a partir de la línea de pedido DOS:
! ROMZ80.ROM:
R
Cargamento a partir de un fichero de pedidos CpcAlive:
ROMZ80.ROM:R
Cargamento a partir del interpretador BASIC del Cpc:
|INPUT, "
ROMZ80.ROM:R":call 0

El número del sitio de ROM estado cargada puede obtenerse de la siguiente manera:
info$=string$(16,"X"):|INFO,@info$:RomSitio=val("&"+mid$(info$,15,2)):PRINT RomSitio
En el caso es necesario tener un número de sitio fijo, sustituir a la carta "R" por el número de sitio deseado. (Valores admitidos de 0 a 191)  ejemplo a partir de la línea de pedido DOS: ! ROMZ80.ROM:10

Los roms serán reconocidos por el sistema CPC solamente después de un réinitialisation del CPC por ejemplo con un CALL 0 o impulsando la secuencia de teclas [ CTRL][ALT][Home]. El emulador acepta instrucciones RSX en la totalidad de los roms superiores. Los números de roms ya utilizados por la CPC son 0 para la rom BASIC y 7 para la rom disco. Los módulos X86 (véase capítulo "ENTORNO DE PROGRAMACIÓN X86") con mnemotecnias utilizan también sitios de roms Z80. Los roms Z80 con un número de sitio específico deben pues estar cargados antes de los módulos X86. El mejor medio de evitar los conflictos es encargarlos al principio del fichero de pedidos ROM INI situado en el directorio principal.

En la interpretación de un programa en ROM, CpcAlive redirige por defecto los accesos en escritura del microprocesador Z80 hacia la RAM. El pedido |UNLOCK,-número de sitio de rom- autoriza los accesos en escritura del microprocesador Z80 en la ROM especificada. El funcionamiento de la ROM se vuelve entonces similar a una RAM.

Ejemplo de creación de una ROM que contiene instrucciones BASIC programables


II - 9 - Cargamento Ficheros al formato AMSDOS

Es de archivos .BIN o .BAS que puede ser extraído de un disco virtual .DSK por ejemplo usando el programa "Extract".

Cargamento a partir de la línea de pedido DOS:
! PROGRAMA.BIN o .BAS

El emulador solicitar al final de la bota Cpc para cargar el archivo y pondrá en marcha automáticamente si es ejecutable.
Cargamento a partir de un fichero de pedidos CpcAlive:
PROGRAMA.BIN o .BAS
Cargamento a partir del interpretador BASIC del Cpc:
|INPUT, "
PROGRAMA.BIN o .BAS"
|RUN, "PROGRAMA.BIN o .BAS"

El pedido |RUN pone en marcha automáticamente el programa si es ejecutable.




III - Pedidos a partir del interpretador BASIC del Cpc:

Los pedidos CpcAlive apelables a partir del interpretador BASIC deben precederse de la barra vertical " | ".

|CpuFast selecciona la velocidad máximo - [F12]
|CpuSlow selecciona la velocidad del ordenador CPC - [F11]
|CpuSlow,velocidad cambia velocidad |CpuSlow (0<velocidad<&FFFF)
|Sleep puesta en víspera del emulador - [AltGr][S]
|Sleep,"mensaje" puesta en vispera con mensaje
|Sleep,ERRORLEVEL puesta en vispera con código de salida para ficheros .BAT
|Exit dejar el emulador - [Ctrl][ALT][End]
|Exit,"mensaje" dejar el emulador con mensaje
|Exit,ERRORLEVEL dejar el emulador con código de salida para ficheros .BAT
|Command o |CMD para pasar del método "texto" al método "pedidos CpcAlive".
ver capítulo II - 4 - Cargamento de ficheros de pedidos CpcAlive
|INPUT,
"nombre_de_fichero[:X]"[,@er%]
carga un archivo
ver capítulo II - Ficheros reconocidos por el emulador
|RUN,
"nombre_de_fichero
[:X][,ADR]"[,@er%]
carga y ejecuta un archivo si es ejecutable
|INFO,@info$ carga el bloque de información del último fichero entrado con la función |INPUT o mediante un fichero de pedidos CpcAlive. ej: |INPUT,"Disk.dsk":info$=string$(12,"X"):|INFO,@info$:PRINT info$
|CLOCK,@clock$ clock$="HH:MM:SS":|CLOCK,@clock$ carga la hora en la cadena de caracteres clock$
|UNLOCK,-número de sitio de rom- autoriza los accesos en escritura del microprocesador Z80 en la ROM especificada. (ver capítulo II - 8 - Cargamento Roms Cpc)
|EJECT,"A" expulsa el disquete virtual presente en el lector A
|EJECT,"B" expulsa el disquete virtual presente en el lector B
|GO,"cadena numerica"[,@er% ] ver capítulo II - 6 - Cargamento de ficheros binarios
|OUTPUT, "NombreDelFicheroDeSalida"[,@er%] cambiar el nombre de fichero de salida (ver capítulo IV)
|OUTASCDOS ver capítulo V - Carácters acentuados
|OUTASCWIN ver capítulo V - Carácters acentuados
|OUTASCOFF ver capítulo V - Carácters acentuados
|PRINT, "cadena" saca una cadena de caracteres hacia fichero_de_salida. (pedido equivalente al pedido PRINT#8,"cadena";)
|LPRINT, "cadena" saca una cadena de caracteres hacia fichero_de_salida seguimiento de una vuelta a la línea. (pedido equivalente al pedido PRINT#8,"cadena")
|INK,PEN,R,V,A cambio color PEN. Las cartas R, V, A representan los componentes Rojos, Verdes y Azules (0 a 255)
ex: |INK,0,0,255,0 (PAPER)
     |INK,1,255,0,0 (PEN 1)
|INKRESTORE devuelva tintas originales
|INKCPC tintas normales CPC
|INKSOFT tintas CpcAlive (tintas por defecto). La paleta es la misma que la palet normal CPC pero con menos luminosidad y los valores PAPER y PEN 1 se modifican.
|OBMP,"nombre_de_fichero.BMP"
[,@er%]
fabrica un archivo de imagen de la pantalla en formato BMP. Ver pedido |OUTPUT para el significado de los códigos de errores.
|COPY,SpriteNúmero
|COPY,"SpriteNombre"
guarda los píxeles en la pantalla utilizando las funciones basic PLOT/DRAW (o a partir del Bios X86) en un buffer o un archivo. Un pedido |PASTE o |FRAMEOUT termina la secuencia de guarda.
- SpriteNombre=máximo de 8 caracteres sin extensión
- Sprite
Número entre 0 y 255
- tamaño máximo sprite=100000 pixeles
|PASTE,despX,despY,SpriteNúmero
|PASTE,despX,despY,"SpriteNombre"
muestra la secuencia grabada usando |COPY con desplazamiento.  despX y despY son relativos a las coordenadas guardadas.
|DEBUG,dirección empieza el debugger cuando el procesador Z80 encuentra la dirección especificada (ram)
|DEBUG,rom,dirección empieza el debugger cuando el procesador Z80 encuentra la dirección especificada en la rom especificada (rom superior)
|DEBUGSYS,dirección empieza el debugger cuando el procesador Z80 encuentra la dirección especificada (rom inferior)
|DEBUGOFF pare el debugger
|DUMP,dirección inicializa el dump memoria del debugger
|NODEBUG prohibido el debugger
|NOSLEEP prohibido el puesta en víspera del emulador
|MAKE,
"
nombre_de_fichero.exe"[,@er%] 
cree una salvaguardia ejecutable (salvaguarde dejando el emulador). Ver pedido |OUTPUT para el significado de los códigos de errores.
|MAKEMOVIE,
"nombre_de_fichero.exe"[,@er%]
cree una animacione ejecutable (salvaguarde dejando el emulador).
- cualquier movimiento del teclado poner fin a la ejecución del archivo producido.
- ver pedido |OUTPUT para el significado de los códigos de errores.

notas:
- los ficheros creados con los pedidos |MAKE o |MAKEMOVIE no pueden reelegirse con la función "rename" del sistema DOS. Para reelegir estos ficheros, utilizar su función interna a partir de la línea de pedido del DOS:
                              nombre_de_fichero.EXE rename:nuevo_nombre
                              o
                              nombre_de_fichero.EXE ren:nuevo_nombre
- para empezar un fichero .EXE creado con los pedidos |MAKE o |MAKEMOVIE con Windows XP, presionar el nombre del programa con el botón derecho del ratón y elegir: Memoria Ems <automático>
- los pedidos basic CALL 0 inicializa el sistema CPC - [Ctrl][Alt][Home]


Pedidos basic agregados con el módulo AniCrea:

AniCrea es un programa que añade comandos para grabar la pantalla del emulador y crear animaciones gráficas en formato GIF. (Pantalla MODE 1)

|ANICREA,"
nombre_de_la_animación"[,@er% ]         -     comience el fichero de animación
El parámetro el @er% de la vuelta del error es facultativo. Si se pone, la significación de los valores recuperados en el er% variable es:
0 = ok
2 = acceso denegado
(no se olvide de inicializar el er% al principio del programa o antes de la orden)
El "nombre_de_la_animación" que debe crearse puede también definirse a partir de la línea de pedido del DOS en segundo parámetro.

|ANISPEED,velocidad de la animación            (valores normales de 0 a 50)

|FRAMEOUT[,@er% ]                                     -     genera una imagen

El parámetro el @er% de la vuelta del error es facultativo. Si se pone, la significación de los valores recuperados en el er% variable es:
0 =
ok de lo contrario error

|ANICLOSE[,@er% ]                                       -     cierre el fichero de animación
El parámetro el @er% de la vuelta del error es facultativo. Si se pone, la significación de los valores recuperados en el er% variable es:
0 = ok de lo contrario error

notas:
- El pedido a partir de la línea de pedido DOS "! DEMO" crea la imagen animada DEMO.GIF
- Ver pedidos |COPY y |PASTE para el manejo de sprites.



IV - Pedidos a partir de la línea de pedido del DOS

CpcAlive
[ficheros_de_entrada[:X ]] [
pedidos CpcAlive] [pedidos Cpc] [>fichero_de_salida]
o
!
[ficheros_de_entrada[:X ]] [pedidos CpcAlive] [pedidos Cpc] [>fichero_de_salida]



Los pedidos CPC deben siempre colocarse en último en la línea de pedido.

p.ej.: ! PRINT"ok"
Lanza el emulador y hace el pedido PRINT"ok" a el CPC

Caso particular:
El carácter | es un pedido Dos. CpcAlive utiliza pues un carácter de sustitución que el § 
o carácter 245 ([Alt][245]).
p.ej.: ! §DISC lanza el emulador con el pedido |DISC

El carácter & también se utiliza por DOS de manera especial, este carácter puede pues también ser sustituido por el carácter ² 
o carácter 253 ([Alt][253]).
p.ej.: ! POKE ²C000,²FF lanza el emulador con el pedido POKE &C000,&FF

Esta tecla de sustitución siempre se utilizará en CpcAlive en razón de su facilidad de acceso. Puede pues servirte de este
"atajo teclado" a partir de la línea de pedido BASIC del Cpc. Existe otros caracteres reservados por DOS como el  < o >  no podrán utilizarse en pedidos CPC a partir de la línea de pedido DOS. Para más información, leer la documentación del sistema DOS.


 
Por defecto la salida impresora del CPC se hace en el fichero CPC.PRN situado en el directorio principal CpcAlive. Es posible cambiar el nombre del fichero de salida a partir de la línea de pedido DOS añadiendo el carácter '>' al final de la línea de lanzamiento seguido del nombre de fichero deseado.

ejemplo:
! PRINT#8,"OK" inscrito la palabra "OK" en el fichero Cpc.prn
! PRINT#8,"OK">test.prn inscrito la palabra "OK" en el fichero test.prn

Un único carácter '>' antes del nombre del fichero de salida indica al DOS que a caso o el nombre del 
fichero de salida ya existe, este fichero será reconstruye virgen antes de recibir los datos. (El antiguo fichero de salida del mismo nombre que se borra sin preaviso... prudencia).
Dos caracteres ' > > ' antes del nombre del fichero de salida indican al DOS que debe conservar el fichero y poner los nuevos datos a seguir.


ejemplo:
! PRINT#8,"OK1":§Exit>test.prn inscrito la palabra "OK1" en el fichero test.prn
! PRINT#8,"OK2":§Exit>>test.prn inscrito la palabra "OK2" que debe seguirse en el fichero test.prn

El resultado en el fichero test.prn da:
OK1
OK2

Es posible cambiar de nombre de fichero de salida a partir del interpretador BASIC del CPC mecanografiando el siguiente pedido: |OUTPUT, "directory\NombreDelFicheroDeSalida"[,@er%]

-NombreDelFicheroDeSalida = 8 caracteres máximo + 3 caracteres de extensión
-El parámetro de vuelta de error @er% es faculatif. Si se pone, el significado de los valores recuperados en la variable er% son:
0 = ok
1 = error en los parámetros
2 = acceso denegado
3 = chemin no encontrado
4 = no más handle disponible
5 = 
acceso denegado
(No olvidar inicializar un er% al principio del programa o antes del pedido)

|OUTPUT, ":GO,&100"[,@er% ] desplaza al indicador de fichero a la posición &100
|OUTPUT,":CLOSE" cierra el fichero (CPC.PRN es otra vez el archivo de salida predeterminado)

Un ejemplo de concatenación de ficheros asociando comandos |OUTPUT y |INPUT

Un otro pequeño programa que redi la salida CATalogue hacia el fichero de salida:
10 POKE &BB5C, PEEK(&BD2D):POKE &BB5B, PEEK (&BD2C)
20 CAT
30 CALL &BD37:|DISC
RUN

nota:
- el fichero CPC.PRN se vacía cada lanzamiento del emulador en el caso de reutilización de la salida de la impresora en este archivo.



 V - CARáCTERS ACENTUADOS

Inicialización a partir del DOS para obtener un teclado acentuado: ! Accent.ini

|OutAscDos y |OutAscWin a partir del BASIC CPC indican al emulador que él debe convertir los caracteres 192 a 204 (redefinidos en el fichero ROM INI) antes de dirigirlos hacia el fichero de salida. Para operar una conversión texto al formato DOS hacia el
fichero de salida utilizar |OutAscDos. Para operar una conversión texto al formato Windows hacia el fichero de salida utilizar |OutAscWin. Para cancelar esta conversión utilizar |OutAscOff. Útil si se utiliza del fichero de salida para otra cosa que del texto. (Pedido por defecto)

Los caracteres se redefinen de la siguiente forma:
carácter:                          ë     ù     û    ô     É    é     è     ê     à    â     ç     î      ï
ASCII CPC redefinido:   192.193.194.195.196.197.198.199.200.201.202.203.204
ASCII Dos:                    137.151.150.147.144.130.138.136.133.131.135.140.139
ASCII windows:             235.249.251.244.201.233.232.234.224.226.231.238.239

ejemplo:
Para convertir el documento "CreaDisc" (que es un documento texto al formato ASCII DOS) al formato ASCII windows, escrito la secuencia que sigue a partir de la línea de pedido basic:

|input,"Accent.ini"
10 |OutAscWin:|input,"nombre_de_fichero"

20 line input a$
30 print#8,a$:if a$<>"" then 20
run


El resultado se encuentra en el fichero CPC.PRN


notas:
- Sólo se reconvierten los caracteres redefinidos más arriba
- Para convertir un documento de texto ascii windows en formato ascii Dos, necesita para cargar el archivo en memoria utilizando el procedimiento 
Cargamento de ficheros binarios y recuperar los caracteres con PEEK porque manejo teclado emulador que no admite caracteres ascii que son más de 156.



VI - ACCESO a las INTERRUPCIONES del BIOS Y del DOS a través del microprocesador Z80

Las interrupciones del Bios y del DOS son accesibles gracias a opcodes específicos al emulador CpcAlive a través del microprocesador Z80 emulado y una correspondencia entre los registros Z80 y X86. El cuadro a continuación que figura la correspondencia de los registros establecida entre los dos procesadores:
registros Z80      registros X86
F                 >   F
A                 >   AL
BC               >   CX
DE               >   DX
HL               >   BX
IX                >   SI
IY                >   DI

CpcAlive añade al Z80 nuevos opcodes así como registros nombrados AH, BP, DS y ES correspondientes a los registros de los procesadores X86.

ejemplo:
opcode:             mnemotecnia:     función:
040h, 052h        LD AH, A
          carga el valor del registro A en el registro X86 AH
040h, 05Bh        LD A, AH          encarga el valor del registro X86 AH en el registro A
040h, 048h, xx    INT(xx)             llamada interrupción número xx

ejemplo de macros (aquí para el assembler 8 bites tasm)
# define LD_AH_A         db 040h \ db 052h
# define LD_A_AH         db 040h \ db 05Bh
# define INT(xx)             db 040h \ db 048h \ db xx

ejemplo:
; ** SALIDA PIXEL A través de INT 010H **
OutPix:     ld de, 12                  ; dato Y
                ld bc, 24                  ; dato X
                ld a, 0Ch                 ; FUNCIÓN 0CH = ESCRIBIR UN PUNTO GRÁFICO
                LD_AH_A              ; carga el valor del registro A en
el registro X86 AH
                ld a,3                      ; color pedido
                INT(010h)              ; LLAMADA INTERRUPCIÓN BIOS 010H
                ret

notas:
- La correspondencia de los registros Z80-X86 se respeta a la vuelta de la interrupción
- Es necesario saber también que el ram CPC se sitúa en el segmento EMS.
- La interrupción del Bios INT 10H que no acepta que las funciones:

Función 02h // Set cursor position //
Función 03h // Read cursor position //
Función 09h // Write character with color at cursor //
Función 0Ah // Write character with color at cursor //
Función 0Bh // Set color palette //
Función 0Ch // Write graphics pixel at coordinate //
Función 0Dh // Read graphics pixel at coordinate //
Función 0Eh // Write text in teletype mode //
Función 10h - 00h // set individual palette register //
Función 10h - 02h // set all palette registers and border //
Función 10h - 07h // read palette register //
Función 10h - 09h // read palette registers and border //
Función 10h - 10h // set DAC color register //
Función 10h - 12h // set block of DAC color registers //
Función 10h - 15h // read DAC color register //
Función 10h - 17h // read block of DAC color registers //
Función 10h - 1Bh // sum color values to shades of gray //
Función 
13h // Write string //

Los registros de paleta corresponden a los 16 pinceles (PEN) del Cpc. El emulador ignoran la programación del registro overscan (BORDER) que estará todavía del mismo color que el fondo de la pantalla (PEN 0).


El fichero Z80IOPix.bas situado en el directorio "EX" es un ejemplo de pedidos RSX que utilizan las interrupciones del Bios. Este fichero es un fichero de pedido CpcAlive. Se incluyen las explicaciones así como un listado.
pedido a partir de la línea de pedido del Dos:     ! EX\Z80IOPix.bas
pedido a partir del interpretador BASIC:        |input, "EX\Z80IOPix.bas"
Estos pedidos generan las funciones |OPIX,X,Y,PEN y |IPIX,X,Y,@PEN que respectivamente escrito y lee un punto gráfico sobre la pantalla a los datos X y Y.

Instrucciones añadidas al Z80 disponibles:

#define LD_HL_CPCSEG   .db 040h\ .db 047h           ; RETURN SEGMENT DIRECCIóN OF CPC MEMORY
#define INT(xx)                   .db 040h\ .db 048h\ .db xx   ; CALL BIOS/DOS INTERRUPTION XX
#define IN_A_DE                .db 040h\ .db 04Ah              ; IN A,(DE)  (DE refer to I/O PC system)
#define OUT_DE_A            .db 040h\ .db 04Bh              ; OUT (DE),A (DE refer to I/O PC system)
#define LD_AH_A              .db 040h\ .db 052h               ; LD AH,A
#define LD_A_AH              .db 040h\ .db 05Bh              ; LD A,AH
#define LD_BP_HL            .db 040h\ .db 05Ch              ; LD BP,HL
#define LD_HL_BP            .db 040h\ .db 05Dh              ; LD HL,BP
#define LD_DS_HL            .db 040h\ .db 05Eh              ; LD DS,HL
#define LD_HL_DS            .db 040h\ .db 05Fh              ; LD HL,DS
#define LD_ES_HL             .db 040h\ .db 060h              ; LD ES,HL
#define LD_HL_ES             .db 040h\ .db 061h              ; LD HL,ES
#define PUSHA                   .db 040h\ .db 071h              ; PUSH A,AH,BC,DE,HL,BP,IX,IY
#define POPA                     .db 040h\ .db 072h              ; POP IY,IX,BP,HL,DE,BC,AH,A

BP, DS, ES y AH corresponden a los registros del procesador X86. Por defecto los registros DS y ES dirigen la memoria del Cpc (Segmento Ems).



VII - ENTORNO DE PROGRAMACIÓN
X86

Es posible programar el emulador CpcAlive en assembler X86. CpcAlive acepta 256 módulos X86. Un módulo X86 es un programa al formato .EXE que contiene una tabla de instalación situada a la dirección 0200h en el código del programa, así como una tabla pudiendo contener 128 vectores de llamada X86. Los vectores de llamada X86 pueden llamarse con pedidos BASIC o opcodes Z80. El tamaño máximo de un módulo X86 es de 64K. La tabla de instalación de un módulo X86 debe constituirse como esto:

org 0200h
                db ' X86CPC '              ; 0200h marca

                dw 1                             ; 0206h versión
                dw offset X86Vec          ; 0208h tabla vectores de entrada
                dw 0                             ; 020Ah reservado
                dw 0                             ; 020Ch reservado
                dw 0                             ; 020Eh reservado
                dw offset MnemoTb      ; 0210h tabla de los nombres para llamadas con el BASIC
                db -1                             ; 0212h (*) recibe el número de módulo X86
                db -1                             ; 0213h
número de módulo complemento o número bancos Cpc
                db -1                             ; 0214h (*) recibe el número de la rom Z80 asociada
                db -1                             ; 0215h 
indicador para conexión bancos Cpc o módulos complementos
                dw -1                             ; 0216h (*) recibe el primer dirección CPC accesible (0=ningún dirección accesible)
                db 0                               ; 0218h reservado
                dw 0                              ; 0219h (*) recibe el ems handle asociado al módulo
                dw 0                              ; 021Bh (*) recibe el número lógico de la primera página 16K del módulo
                db 0                               ; 021Dh reservado
                dw 0                              ; 021Eh dirección apelar a la parada del emulador (0=no apelación)
                dw 0                              ; 0220h dirección apelar a la puesta en víspera del emulador (0=no apelación)
                dw 0                              ; 0222h 
dirección apelar a la vuelta de víspera del emulador (0=no apelación)
                dw 0                              ; 0224h dirección apelar a la carga del módulo (0=no apelación)
                dw 0                              ; 0226h reservado
                db 0                               ; 0228h recibe el cantidad de las páginas 16K asignadas al módulo (*)
                                                     ;            o cantidad de páginas para asignar (si valor <> 0 a carga del módulo)
                                                     ;            o cantidad de páginas conectados (*)
                                                     ;            o cantidad de páginas para conectar
                db 0100h-029h dup (0)   ; 0229h reservado

(*) = valor generado por el sistema

; tabla vectores de entrada
X86Vec    dw offset programa1           ; 00 1.o programa
                dw offset programa2           ; 01 2.o programa
                ;... 128 vectores máximos

; tabla de los nombres (mnemónicos)
MnemoTb db "PROGRAMA","1" or 080h          ; |PROGRAMA1
                db "PROGRAMA","2" or 080h          ; |PROGRAMA2
                db 0

; programas X86 deben declararse en "FAR"
programa1 proc far
                ;...
programa X86
                retf
programa1 endp
programa2 proc far
                ;...
programa X86
                retf
programa2 endp


Funcionamiento:
Sobre presencia del vector MnemoTb a la dirección 0210h, el emulador genera una rom Z80 interpretable por el sistema Cpc
 integrando la tabla de los nombres (MnemoTb) así como sus vectores de llamada X86. El primer vector de la tabla "X86Vec" que corresponde a la primera mnemotecnia es el vector de inicialización que se llama a cada inicialización del sistema Cpc. Cada mnemotecnia corresponde a un vector de esta tabla (en el orden). El final de cada mnemotecnia se indica gracias a la presencia del bit 7 sobre la última carta de la mnemotecnia. La tabla no debe superar 128 mnemotecnias y debe ser terminada por un octeto nulo. Para utilizar un pedido, bastará con mecanografiar el nombre del pedido precedido de la señal " barra vertical | " a partir del interpretador BASIC del CPC.

Nota: Es tan posible llamar las rutinas X86 desde el ram Cpc a través de opcodes Z80 (véase más partes bajas). En caso de que la utilización de mnemotecnias de llamada no es necesaria, sustituir al vector "MnemoTb" por un valor nulo (dirección 0210h).


El fichero X86IOPix.asm situado en el directorio "EX" es un ejemplo completo. Es este fichero que generó el módulo X86IOPix.exe situado en el mismo directorio.
pedido a partir de la línea de pedido del Dos:     ! EX\X86IOPix.exe
Este pedido genera las funciones |OPIX,X,Y,PEN y |IPIX,X,Y,@PEN que respectivamente escrito y lee un punto gráfico sobre la pantalla a los datos X y Y.


Llamar una rutina X86 a través de opcodes Z80:
La llamada de una rutina X86 a partir de la memoria del Cpc se hace con ayuda del opcode 049h siguió del número de módulo, luego del número de vector. Por ejemplo si se quiere llamar "programa2" (vector número 1) en el ejemplo aquí arriba, considerando que el emulador haya encargado el módulo al sitio 010h, eso se dará el opcode Z80: 049h, 010h, 001h

El número de sitio del módulo puede obtenerse como para el cargamento del Roms Z80:

info$=string$(16,"X"):|INFO,@info$:RomSitio=val("&"+mid$(info$,15,2)):PRINT RomSitio

Este número también se indica en el octeto de dirección 0212h de la tabla de instalación del módulo X86 (véase más arriba). El número de vector debe incluirse entre 0 y 127. Si el bit 7 se pone, se simulará una instrucción "RET" a la vuelta de la rutina X86. El funcionamiento se vuelve así similar a una instrucción de salto "JP".

Los valores de los registros del Z80 se retransmiten a las rutinas X86 de esta manera:

registros Z80     
registros X86
  F                 >   Flags
  A                 >   AL
  BC               >   CX
  DE               >   DX
  HL               >   BX
  IX                >   SI
  IY                >   DI

Se transfieren los registros X86 descréditos en el capítulo anterior también.
Los registros de segmento FS y GS están indeterminados. Los valores de los registros X86 a la vuelta de la rutina se retransmitirán al Z80 de la misma manera.


Encargar un modul en el emulador:
- a partir de la línea de pedido DOS:  ! MODULO.EXE

- a partir de un fichero de pedidos CpcAlive: MODULO.EXE
- a partir del interpretador BASIC del Cpc: |INPUT, "MODULO.EXE":call 0

Acceso a la memoria del CPC desde el entorno X86

notas:
- El periférico de salida normal (stdout) es la pantalla todavía.

- La interrupción del Bios INT 10H so'lo acepta las funciones descritas en el capítulo anterior.
- En caso de que no sea necesario que el modul esté inicializado por su primer vector al comienzo del sistema CPC, es posible utilizar al marcador ":W" (Waggon) tras el nombre del módulo. El emulador encargará entonces los vectores así como las mnemotecnias del módulo en la rom Z80 generada por el cargamento del módulo anterior. Se ahorrarán así sitios de roms Z80. (En caso de que no habría habido aún módulo encargados anteriormente, el emulador creado un primer vector "sin efecto" en la rom Z80 asociada al módulo).
- Ejemplo de implementación de un módulo de C++



VIII - PROGRAMAS UTILITARIOS

- 1 - CreaDisc: crea un disquete virtual virginal al formato dató

Pedido a partir de la línea de pedido DOS:
 ! CreaDisc

- 2 - Extract: Para extraer los ficheros de un disquete virtual.

Pedido a partir de la línea de pedido DOS:  Extract [nombre_disquete] [nombre_fichero]

- 3 - AniCrea  es un programa que añade comandos para grabar la pantalla del emulador y crear animaciones gráficas en formato GIF.

- 4 - GIF conversiones

GIF > MP4: ffmpeg (Windows)
ffmpeg.exe -r 15 -i "SrcFile.GIF" -s 320x200 "DstFile.MP4"
-r 15 for framerate
-s 320x200 for video resolution

- 5 - Teclado completo para uso en Android

- 6 - Dza:  Desensamblador Z80 Dos/Win32 Dza.zip

- 7 -
Concatenación de ficheros


Las personas que desean participar pueden fijar su trabajo aquí:  
Gracias.