Benchmarko Logo
Benchmarko Logo
Home
Projects
CPCEMU
Software
Download
Contact
Links

Alemán Inglés Francés
 
back

CPCEMU - Interna

7. Información Interna de CPCEMU

Este capítulo da información más detallada y contesta la pregunta, “¿POR QUE haría yo esto o aquello ahora?”
También se describe el potente menú de depuración. Asimismo encontrarás las estructuras de las imágenes de disco y los ficheros snapshot.
Esta información no está orientada a los usuarios de CPCEMU sin conocimiento de los interiores de un CPC. Podría ser útil alguna vez.
He colocado esta información al final, incluso después de las marcas registradas, en un intento por mostrar su “relativa insignificancia”.
Si no te gusta leer frases ininteligibles e información desordenada, ¡no sigas leyendo! Ve directamente al Apéndice.

 

AVISO: ¡ Continúa leyendo a tu propio riesgo !

 

7.1 Lista de contenidos para el capítulo 7

7.2 Minidescripción de las características Internas de CPCEMU
7.2.1 La CPU Z80 (El Procesador)
7.2.2 El Gate Array (El “Co-Procesador”)
7.2.3 El PAL (Programmable Logic Array) (Array Lógico Programable)
7.2.4 El CRTC 6845 (Cathode Ray Tube Controller) (Controlador del Tubo de Rayos Catódicos)
7.2.5 El PIO 8255 (Programmable Input Output) (Entrada Salida Programable)
7.2.6 El PSG AY 3-8912 (Programmable Sound Generator) (Generador de Sonido Programable)
7.2.7 El FDC 765 (Floppy Disc Controller) (Controlador de Unidad de Disco)
7.2.8 El interface de impresora Centronics (Centronics printer interface)
7.3 El menú de Depuración
Breve descripción del menú de depuración
Preliminares
Breve descripción de los commandos
Manipulación de registros
7.4 Gestión de la memoria
7.4.1 Una vez más: configuración de EMS
7.4.2 ¿Cómo se ha realizado el Banking?
7.5 Modificación de ROM
7.5.1 Ignorando la ROM con el casete
7.5.2 Modificaciones de la ROM AMSDOS
7.6 Miscelánea
7.6.1 Otra vez: El fichero de configuración
7.6.2 El adaptador paralelo
7.6.3 CPCTRANS
7.7 Estructura de los fichero elegidos para CPCEMU
7.7.1 Imágenes de Disco
7.7.2 Ficheros Snapshot
7.7.3 Cabecera AMSDOS
7.7.4 Fichero de Pokes
7.8 Histórico Interno

 


 

7.2 Minidescripción de las características Internas de CPCEMU

¿Qué grado de compatibilidad tiene CPCEMU realmente?

 

7.2.1 La CPU Z80 (El Procesador)

  • Todas las instrucciones del Z80 están emuladas, incluyendo las conocidas como ilegales.
  • Puedes elegir entre una emulación lenta del Z80 escrita en C y una emulación del Z80 rápida escrita en ensamblador por Juergen Weber.
  • Mediante la técnica COCPU cada instrución del Z80 se emula simultáneamente por la versión lenta y la rápida, de esta forma se ralentiza mucho, pero comparando los registros después de cada instrucción se han encontrado muchos errores. Obviamente esto se ha usado sólamente durante el desarrolo del programa.
  • Instrucciones adicionales ‚ED FC xx‘ sólo las conoce el emulador.
  • Entre ellas la de ruptura de usuario ‚ED FC FC USER &BCFC‘.
  • No hay un temporizador exacto de las instrucciones sino calibración de tiempo en el modo tiempo real.

 

7.2.2 El Gate Array (El “Co-Procesador”)

  • Los 32 colores del CPC (27 diferentes)
  • Los tres modos de video (X x Y x COLORES):
    • modo 0 = 160x200x16
    • modo 1 = 320x200x4
    • modo 2 = 640x200x2
  • TRANSLATE: simple multi modes
  • Banking de ROM (16KB OS, 16KB BASIC, 16KB AMSDOS y ROMs adicionales)
  • Parpadeo en los haces de colores

 

7.2.3 El PAL (Programmable Logic Array)

El PAL se encuentra lógicamente en la misma dirección que el gate array pero en hardware distinto a éste.

  • Banking de RAM (128 KB, hasta 576 KB) con memoria EMS o convencional.
  • Con emulación mediante EMS los bloques se mapean por hardware, de modo que la velocidad es adecuada. CPCEMU proporciona una RAM de expansión compatible Dk‘tronics de hasta 576 KB.
  • Sin EMS, el banking de RAM es muy lento, puesto que los bloques de memoria han de moverse de aquí para alla en la memoria base del PC. Además, tan sólo se dispone de 128 KB RAM.

 

7.2.4 El CRTC 6845 (Cathode Ray Tube Controller)

  • Base y desplazamiento de pantalla para scroll por hardware
  • Varios tamaños de pantalla desde 0x0 hasta 80x25 con los registros 1 y 6 del CRTC
  • Direfentes tamaños de carácteres (1..7) con el registro 9 del CRTC
  • Múltiples modos (usan otros registros)
  • El Overscan no está aún implementado

 

7.2.5 El PIO 8255 (Programmable Input Output)

  • Teclado (connectado al PSG)
  • Emulación de VSYNC: Un bit que se activa entre dos interrupciones durante un refresco de pantalla. Puedes cambiar su posición.
  • El casete es muy rápido, ignorar la ROM permite acceder a cualquier fichero del DOS.
  • El bit VSYNC está activado demasiado tiempo
  • Los puertos de casete no están emulados, por lo que la mayoría de los programas que acceden a los puertos directamente no funcionan.

 

7.2.6 El PSG AY 3-8912 (Programmable Sound Generator)

  • Bien por el altavoz interno del speaker (pésimo, puesto que los 3 canales se combinan en uno y el volumen no puede cambiarse), o por una tarjeta GUS o Soundblaster. Cualquier sonido digital con todo el ruido o la parte FM compatible Adlib sin ruido.
  • Sin sonido digital o demasiado bajo.

 

7.2.7 El FDC 765 (Floppy Disc Controller)

  • Todos los comandos FDC necesarios para controlar dos unidades A y B (incluyendo lectura/escritura de sector, búsqueda/formateo de pista, lectura de sector-ID, ...)
  • Formatos de disco muy flexibles (hasta 18 sectores por pista).
  • Incluyendo formatos de doble cara, p.ej. VORTEX.
  • No están soportados los formatos de protección contra copia complicados.

 

7.2.8 El interface de impresora Centronics

  • Salida de impresora, con parche para impresoras de 8-bits, redirigida a un fichero definido en PRINTER.

 


 

7.3 El menú de Depuración

Se muestra el juego completo de registros de la CPU y puede modificarse. Puedes “volcar” la memoria, desensamblarla o modificarla. Puedes cargar o guardar áreas en memoria.

Y la cosa más interesante:!
¡Puedes ejecutar paso a paso los programas! (Parecido a un depurador de verdad.)

 

Breve descripción del menú de depuración


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 primera línea muestra los comandos disponibles, usa las letras mayúsculas. Las dos siguientes líneas muestran los valores actuales de los registros del Z80. La siguiente desensambla la instrucción que hay en ese momento en la posición PC y la última es un indicador de espera para meter tus comandos. (la ‚f‘ indica que estás usando la CPU rápida.)

 

Preliminares

  • Los parámetros entre corchetes son opcionales [opt].
  • Usa sólo valores hexadecimales, p.ej. <dirección> = 0000-ffff
  • “<ret>” indica que estás en un modo especial. Puedes pulsar <intro> para continuar. <Cadena><Intro> mantiene este modo (usar p.ej. b<intro>).
  • Las letras son comandos, muchas veces seguidos de una dirección opcional. Entre la letra y esta dirección debe haber un espacio o tabulador.
  • Sin una dirección se toma por defecto el PC (contador de programa).

 

Breve descripción de los commandos

R)un: (Ejecutar)
r [<dirección>] : comienza la emulación a partir de PC o de una dirección opcional Ejemplos:
  • f-> r comienza la emulación a partir de PC
  • f-> r 100 pone PC a 0x100 y comienza la emulación
T)race (trazar dentro de): (Trazar)
t [<dirección>] : ejecuta sólo la instrucción mostrada en ese momento. Usar <intro> para continuar en este modo, y así sucesivamente. <cadena><intro> vuelve al estado normal. Todos los comandos de un solo paso se ejecutan en la CPU lenta (incluso cuando se muestra “-f->”), debido a que ya no hay contador en la CPU rápida.
S)tep (paso adelante): (Paso)
s [<dirección>] : ejecuta la siguiente instrucción. Más bien todas las instrucciones hasta que PC se iguala a la siguiente instrucción. Esto puede llevar mucho tiempo, p.e después de un ‚Ret‘. En este caso F10 puede ser útil (como de costumbre).
Todos los comandos de un solo paso se ejecutan en la CPU lenta (incluso cuando se muestra “-f->”), debido a que ya no hay contador en la CPU rápida.
A)ssemble (en realidad desensamblar): (Ensamblar)
a [<dirección>] : desensambla las 16 instrucciones siguientes. Usa <intro> para continuar en este modo, y así sucesivamente. <cadena><intro> vuelve al modo normal.
D)ump: (Volcar)
d [<dirección>] : muestra un volcado hex/ASCII de los siguientes 256 bytes a partir de dirección (o PC). Usa <intro> para continuar en este modo, y así sucesivamente. <cadena><intro> vuelve al modo normal.
I)nput (modificando memoria): (Entrada)
i [<dirección>] : muestra la dirección de memoria en la que se está en ese momento con su valor correspondiente, el cual puedes aceptar con <intro> o cambiar con <valor-hex><intro>. Sal de este modo introduciendo un número incorrecto como ‚-1‘: 1<intro>.
L)oad (cargando un programa): (Cargar)
l [<dirección>] : aparece un indicador para que introduzcas un nombre de fichero <nombre> y lo carga desde el directorio TAPE_PATH a <dirección> Es capaz de reconocer una cabecera AMSDOS. Si pulsas <Intro> en el indicador aparecerá el más que conocido menú de selección de ficheros ... Ejemplos:
  • f-> l<intro> demo<intro> :
    carga fichero ‚demo‘ al PC actual
  • f-> l a000<Intro> miprog<Intro> :
    carga fichero ‚miprog‘ a la dirección 0xA000
saV)e (guardando un programa): (Guardar)
v [<dirección>] : aparece un indicador para que introduzcas un nombre <nombre> y la longitud del bloque de memoria. Este bloque se guarda desde <dirección> (o PC) como fichero binario en el directorio TAPE_PATH, el cual incluye una cabecera AMSDOS. Ejemplo:
  • f-> v<intro> demo<intro> 4000<intro> :
    guarda fichero “demo” desde PC con longitud 0x4000.
TRANSLATE: fiN)d (Find a byte string):
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.
TRANSALTE: REMOVE? M)ode (cambiando el modo de video): (Modo)
m : Cambia el modo de video: visualización de registros, desensamblado de instructiones activado/desactivado.
F)ast (seleccionando el tipo de emulación): (Rápido)
f : Intercambia la emulación rápida del Z80 (desarrollada en ensamblador por Juergen Weber, por defecto) y la lenta (escrita en C).
El indicativo cambia a “-f->” para rápida y “-s->” para lenta.
Todos los comandos r, s, y t se refieren al tipo de emulación elegida en ese momento.
Q)uit (saliendo del programa): (Salir)
q : sale del emulador.

 

Manipulación de registros

Además de los comandos de una letra puedes cambiar los valores de los registros con la siguiente sintaxis: ‚<registro>=<valor-hex>‘ Ejemplos:

  • af=345 : pone el registro AF a 0x0345
  • pc=a000 : pone le contador de programa a 0xA000

También puedes escribir ‚<registro><espacio><valor-hex>‘. Puedes modificar todos los registros mostrados, p.ej. AF, BC, DE, HL, IX, IY, SP, PC, IR, AF', BC', DE', HL', y también IFF1, IFF2 y IMD.

 


 

7.4 Gestión de la memoria

 

7.4.1 Una vez más: configuración de EMS

Necesitas un gestor de memoria expandida que soporte el estándar LIM 4.0 (LIM EMS 4.0). Este gestor de memoria debe suministrar páginas EMS extensas en cualquier región, ya que CPCEMU buscará 6 páginas físicas en direcciones contiguas. Si el uso de EMS es posible aparecerá un contador de memoria ‚EMS xxx Bytes ok.‘ durante la inicialización.
Se te indicó que usarás los siguientes parámetros bajo OS/2:

EMS_FRAME_LOCATION = auto
EMS_HIGH_OS_MAP_REGION = 32 (o más)
EMS_LOW_OS_MAP_REGION = 0   (o más)

¿Qué significa eso?

“Low region” es para páginas EMS en memoria convencional. Si CPCEMU ha de usar estas páginas pon al menos 6*16KB = 84KB.
“High region” es para páginas EMS por encima de los 640K, añadidos a los 64KB del marco estándard. Pon al menos 2*16KB = 32KB.

Para DOS Se te indicó que incluyeras las siguientes líneas en tu CONFIG.SYS:

DEVICE=C:\DOS\HIMEM.SYS
DEVICE=C:\DOS\EMM386.EXE 1024
...

Modifica el 1024, dependiendo de la cantidad de memoria disponible en tu ordenador.

Comentarios:

EMM386 suministra varias páginas extra en memoria convencional. La dirección mínima puede cambiarse con la opción /B=<segmento> (por defecto es 4000).
Con /P<número>=<segmento> es posible cambiar los segmentos de páginas físicas.

 

7.4.2 ¿Cómo se ha realizado el Banking?

El Banking se usa para permitir que algunos ordenadores domésticos tengan RAM y ROM en las mismas direcciones. De modo que la lectura se haga en ROM y la escritura en RAM.

El Amtrad CPC tiene 64K de RAM, una ROM de 16K en 0-3fff y otra en 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

La idea básica es tener diferentes segmentos y desplazamientos para leer y escribir. Para cada acceso de lectura se añade un desplazamiento de lectura a la dirección deseada, y se hace lo mismo con un desplazamiento de escritura para cada acceso de escritura.


           estado 0            estado 1

bloque 5   M       L   c          0       <
bloque 4   M    W  C   c          C   c    | intercambio
bloque 3   M    W  8 b c       W  8 a c    | en el cambio
bloque 2   M    W  4 b c       W  4 a c    | de estado
bloque 1   M    W  0 b         W  L a c   <
bloque 0   M       U b         W  U a

(M = memoria convencional o páginas EMS físicas)

a = ROM baja activada, ROM alta activada
b = ROM baja desactivada, ROM alta activada
c = ROM baja activada, ROM alta desactivada
W = ROM baja desactivada, ROM alta desactivada
  • Para cambiar de uno a otro estado el bloque ‚0‘ y el ‚L‘ deben intercambiarse.
  • Para banking de RAM un ‚0‘ nuevo debe intercambiarse con el viejo. La selección de ROM se realiza copiando la nueva ROM a ‚U‘.
  • Con memoria EMS, el banking se realiza por el hardware de EMS (o por su emulación). Esto incrementa la velocidad de la emulación en BASIC y en CP/M Plus.

Ahora puedes comprender porqué se hacen necesarios 6 páginas físicas de EMS contiguas; el marco estándar de 4 páginas es insuficiente.

 


 

7.5 Modificación de ROM

 

7.5.1 Ignorando la ROM con el casete

Introduciendo el comando ‚|TAPE‘, o si la ROM AMSDOS está desactivada, se direcciona el casete. Los accesos del casete se transforman en acceso a ficheros de un directorio.
Esta redirección se consigue ignorando una ROM.

Con ‚TAPE_BYPASS=1‘ activas que se ignore la ROM en los vectores del casete. Si CPCEMU encuentra una ROM conocida de un CPC 464/664/6128, ésta se modifica según el caso.
Es necesario ignorar la ROM si quieres usar el casete.

Algunas instrucciones especiales están implementadas en la emulación del Z80. Estas realizan llamadas a funciones especiales que sólo están soportadas por el emulador. Tales funciones se introducen directamente en la ROM, por lo que sigue siendo posible parchear los vectores de la RAM. Están disponibles las siguientes instruciones:

ED FC xx USER &BCxx (sólo válidos para algunos vectores de la RAM)

Parecido a una instrucción de llamada a una función interna. Los siguientes valores para xx son legales:

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

Además de eso, puedes utilizar la instrucción de ruptura de usuario ED FC FC USER &BCFC. Esto detiene la emulación enseguida.

 

7.5.2 Modificaciones de la ROM AMSDOS

  • Con ‚AMSDOS_DISABLE=1‘ inhabilitas la inicialización del AMSDOS.

    Por lo que se desactiva el parcheo de los vectores de casete por la ROM AMSDOS. (Luego los vectores de casete siguen apuntando al casete, aun cuando la ROM AMSDOS se inicialice.) Esto es necesario si quieres seguir cargando de casete después de un reset de disco, pero sin haber introducido el comando ‚|TAPE‘ antes. (Esto se hace con ‚poke &CCF2,&18: poke &CCF3,&05‘ en la ROM AMSDOS.) Las instrucciones para sector no se ven afectadas, ya que siempre direccionan el disco.

  • ‚AMSDOS_SPEEDUP=1‘ habilita una modificación de la ROM AMSDOS, la cual minimiza los tiempos de espera del motor lo que redunda en un acceso a disco más rápido. (La gestión de estas cosas la reliza DOS, por lo que no son necesarios los bucles de espera.)

    Los bytes siguientes se modifican en la ROM AMSDOS:

    • POKE &C5D4,&01 : tiempo de carga del motor
    • POKE &C5D8,&01 : tiempo de formateo de pista
    • POKE &C5D9,&01 : espera corta
    • POKE &C5DA,&01 : espera corta
    • POKE &C602,&01 : sólo 1 reintento en caso de error
    • POKE &C784,&01 : búsqueda rápida
    • POKE &C7E2,&01 : búsqueda rápida

 


 

7.6 Miscelánea

 

7.6.1 Otra vez: El fichero de configuración

Puede que recuerdes que los comentarios empiezan con punto y coma ‚;‘, y pueden comenzar en cualquier sitio de una línea. El resto de la línea se ignora. Los blancos, tabuladores, nuevas líneas y ‚;‘ son delimitadores, y no importa cuantos uses.

Muchas de las definiciones tienen la forma sintáctica

<palabra-clave> "=" <valor> {T}

{T} es una secuencia de al menos un delimitador.

Ejemplo:

ROM_PATH = ".\ROM"
  • <número> puede especificarse en formato decimal, hexadecimal (con 0x) o binario (%).
  • <nombrepath> puede tener una longitud de hasta 80 caracteres y
  • <nombre de fichero> hasta 20 caracteres.

Información suplementaria para seleccionar palabras-clave:

BREAK_MASK = <número> (3)

De cara a depuración sólo.

Algunos eventos interrumpen la emulación normal. Con esta flag puedes desactivar tales eventos.

¡Usalo con precaución!

Deja todos los bits activados excepto aquellos para los eventos que no quieras que ocurran.
b2 = 0 -> desactiva la visualización de errores en el puerto (usa 3)
¡El significado de los bits puede cambiar más adelante!

 

7.6.2 El adaptador paralelo

Lo primero, la construcción del adaptador, ahora con descripción funcional:


PC  D-SUB   Cent.   CPC           Función
--------------------------------  ---------------------------
GND    19 ---- 19   GND           GND
BUSY   11 <--- 1    -STROBE       Synchro (Dato disponible)
 ACK   10 <--- 8    D6            |
PE     12 <--- 7    D5            | Data
SELECT 13 <--- 6    D4            |
 ERROR 15 <--- 5    D3            |
D0      2 ---> 11   BUSY          Synchro (Listo para recibir)

 

Dirección CPC->PC

De normal el adaptador está diseñado para esta dirección solamente. El envío en un CPC es, en principio, lo mismo que imprimir en una impresora en línea. Si el PC activa Not-BUSY (no ocupado), el CPC escribe un nibble (4 bits de un byte) al puerto, activa STROBE como señal de que el dato ya está ahí, y lo desactiva a continuación. De modo que el PC tan solo necesita desactivar BUSY (con D0), esperar el STROBE (su línea BUSY) y tomar el nibble (de la línea de entrada impresora->PC), y activar BUSY.

Pregunta: ¿Por qué no enviar 8 bits en paralelo?

Respuesta:

  1. El puerto de impresora del PC debe reprogramarse para la entrada y no estoy seguro de que esto sea posible en todos los PCs y
  2. El CPC tan solo tiene un puerto de impresora de 7 bits.

 

Dirección PC->CPC

Un día me planteé la posibilidad de enviar datos en la otra dirección. Desgraciadamente el CPC únicamente tiene una sola línea de entrada en el puerto de impresora, llamada señal BUSY. Así que no mejoraría la situación si se intentara diseñar un adaptador mejor para esta dirección. Por lo tanto, toma lo que ya tienes y sácale todo lo que puedas desarrollando un protocolo más sofisticado.

Un interface serie también tiene una única línea de entrada para cada dirección.

Pero, el interface serie usa sincronización por hardware, normalmente mediante cuarzo, y ambos lados han de usar exactamente la misma velocidad en baudios (p.ej. 1200 baudios).

Es muy complicado hacer todo eso por software solamente.

¿Qué puedo hacer?

La idea es aprovechar la ventaja de velocidad del PC respecto del CPC. Cada byte se divide en 8 bits y se transmiten en serie, el PC tiene que activar la línea BUSY según cada caso.

Durante estos 8 bits el CPC funciona a su máxima velocidad y el PC ha de adaptarse a ésta. El CPC escribe una “solicitud de bit” con una instrucción en ensamblador. En ese momento el PC debe reaccionar puntualmente activando la línea BUSY de acuerdo al siguiente bit. Puesto que con la siguiente-excepto-una (?) instrucción el CPC lo leerá. Para no tener que inhabilitar las interrupciones durante toda la transferencia se establece una conexión por cada byte. El CPC dice “¡Oye, envíame algo¡”, y el PC responde “De acuerdo, pero esperaré hasta que tu lo quieras.” activando la línea BUSY. El proceso entero está protegido con un temporizador, de modo que ningún extremo pueda bloquearse cuando este esperando una señal que nunca se ha enviado. Por esto puedes salir de los programs con <ESC> o <CRTC>+<BREAK> en cualquier momento.

 

7.6.3 CPCTRANS

Otra opción no mencionada es “/d 0” or “/d 1”. Con 1 se selecciona un modo especial de doble paso, en unidades de 80 pistas cada segunda pista se omite al trabajar con discos de 40 pistas. Esta opción no debería hacer falta, ya que CPCTRANS cambia automáticamente a doble paso cundo detecta un disco de 5.25” de 360 KB.

Normalmente es muy simple leer o escribir sectores usando la BIOS. Pero la BIOS no puede manejar la cara B de discos con marca-cabezal = 0.

Por esto tuve que programar las funciones del FDC yo mismo, con la ayuda del fuente del MINIX como esquema base. Desgraciadamente el fuente del MINIX contiene algunos errores, y la temporización en partes críticas estaba hecha mediante simples bucles de retardo, posiblemente diseñados para un procesador 8086.

 


 

7.7 Estructura de los fichero elegidos para CPCEMU

 

7.7.1 Imágenes de Disco

Las imágenes de disco se componen de un bloque de información de disco de 0x100 bytes, y para cada pista un bloque de información de pista de 0x100 bytes, seguido de los datos para cada sector en esa pista. El nuevo formato extendido de disco está orientado a los discos protegidos contra copia. Las partes que son nuevas en el formato extendido están marcadas con E (sacado de nuestra Propuesta de Formato Extendido de DISCO, Rev.5.)

 

El bloque de Información de Disco
Byte (Hex): Significado:
00 - 21 “MV - CPCEMU Disk-File\r\nDisk-Info\r\n”
(“MV - CPC” es lo distintivo)

*E* -- “EXTENDED CPC DSK File\r\n\Disk-Info\r\n”
(“EXTENDED” es lo distintivo)
22 - 2F sin usar (0)

*E* -- creador del DSK (nombre de la utilidad)
(¡no hace falta que termine en \0 !)
30 número de pistas (40, 42, puede que 80)
31 número de cabezales (1 ó 2)
32 - 33 tamaño de una pista (incluyendo los 0x100 bytes de la información de pista)
Con 9 sectores * 0x200 bytes + 0x100 bytes por pista info = 0x1300.

*E* -- sin usar (0)
34 - FF sin usar (0)

*E* -- bytes altos de los tamaños de pista para todas las pistas
(calculado de la misma forma que 32-33 para el formato normal).
  • Para formatos de una sola cara la tabla contiene los tamaños de pista de una sola cara, de lo contrario es para dos caras alternantes.
  • Un tamaño con valor 0 indica una pista sin formato.
  • Tamaño real de los datos de la pista == valores de la tabla * 256
  • Hay que tener en cuenta siempre que la imagen contiene 256 bytes adicionales por cada información de pista.

 

El bloque de Información de Pista (para cada pista)
Byte (Hex) Significado:
00 - 0C Track-Info\r\n
0D - 0F sin usar (0)
10 número de pista (0 al número de pistas-1)
11 número de cabezal (0 or 1)
12 - 13 sin usar (0)
Parámetros del formato de pista:
14 BPS (bytes por sector) (2 para 0x200 bytes)
15 SPT (sectores por pista) (9, como mucho 18)
16 Formato GAP#3 (gap para formatear; 0x4E)
17 Byte de relleno (byte de relleno para formatear; 0xE5)
Información del sector (para cada sector de una vez):
18+i número de pista (información ID del sector)
19+i número de cabezal (información ID del sector)
1A+i número de Sector (información ID del sector)
1B+i BPS (información ID del sector)
1C+i Código de error en estado 1 (0)
1D+i Código de error en estado 2 (0)
1E+i,1F+i sin usar (0)

*E* -- Tamaño de los datos del sector en bytes (pequeña notación final).
Esto permite distintos tamaños de sector en una pista. /> Se calcula como (0x0080 << BPS reales).

Anotaciones:

  • Los datos del sector deben estar a continuación del bloque de información de pista en el orden de los IDs de los sectores. No puede omitirse ninguna pista o sector.
  • En los formatos de doble cara las pistas son alternativas, p.ej. pista 0 cabezal 0, pista 0 cabezal 1, pista 1 ...
  • Usa CPCTRANS para copiar discos del CPC con este formato.

 

7.7.2 Ficheros Snapshot

Los ficheros snapshot se componen de una cabecera de 0x100 bytes y un volcado de memoria.

La cabecera Snapshot:

Byte (Hex) Significado:
00 - 07 ‚MV - SNA‘ (como distintivo)
08 - 0F sin usar (0)
10 versión de snapshot (2, antes 1)
11 - 1A registros Z80 AF, BC, DE, HL, R, I
1B - 1C flags Z80 IFF0, IFF1 (0=desactivado, 1=activado)
1D - 24 registros Z80 IX, IY, SP, PC
25 modo de interrupción del Z80 IMD (0 - 2)
26 - 2D registros Z80 AF', BC', DE', HL'
2E Gate Array: número de registro de tinta
2F - 3F Gate Array: valor de registro de tinta (0, 1, ..., 15, 16)
40 Gate Array: registro de multi configuración
41 Gate Array: registro de configuración de RAM
42 CRTC: registro de dirección
43 - 54 CRTC: registro de datos (0, 1, ..., 17)
55 Número de ROM alta
56 - 59 PIO: puerto A, puerto B, puerto C, puerto de control
5A PSG: registro de dirección
5B - 6A PSG: registro de datos (0, 1, ..., 15)
6B - 6C tamaño del volcado de memoria (64K ó 128K)
Los parámetros siguientes aparecen sólo en snapshot con versión 2.0 en adelante:
6D modelo de CPC en el que se ha generado el snapshot
(0=CPC 464, 1=CPC 664, 2=CPC 6128, 3 = desconocido)
6E número de interrupción (0..5), la última interrupción
ocurrida durante un ciclo de refresco de pantalla.
6F - 74 6 bytes multimodo, por tanto modos de pantalla (0..2)
para las interrupciones 0..5.
75 - FF sin usar (0), puede que más adelante para configuración de emuladores

 

7.7.3 Cabecera AMSDOS

Byte (Hex) Significado:
00 número de usuario (0 , valores posibles 0-15)
01 - 0F nombre de fichero+extensión (posiblemente rellenado con 0)
10 número de bloque (0)
11 flag del último bloque (0)
12 tipo de fichero (0=basic, 1=basic protegido, 2=binario,...)
13 - 14 tamaño del bloque (0)
15 - 16 dirección de carga (0-FFFF)
17 primera flag de bloque (0)
18 - 19 tamaño lógico (0-FFFF)
1A - 1B dirección de entrada (0-FFFF)
1C - 3F de uso libre para el usuario (0)
40 - 42 tamaño real de un fichero (1-FFFFFF)
43 - 44 checksum de los bytes 00-42
45 - 7F sin usar (valores aleatorios del buffer del sector)

Anotación:

  • Hay una cabecera al principio de todos los ficheros que no son ASCII. Se le identifica calculando el checksum.
  • Los bytes 00-3F se originan en el “area de casete”, donde los ficheros se habrán distribuído en bloques.
  • Los bytes 12, 15-16, 1A-1B, 40-42, 43-44 son necesarios.

 

7.7.4 Fichero de Pokes:

Un elemento (una línea) se compone de 7 partes, cada un encerrada entre ‚”‘, y separadas por comas.

  1. Número de la parte (1 caracter, 0-F):
    El primer elemento tiene número 0 y es seleccionable. Si un programa necesita más de un poke el resto de elementos tiene los números 1, 2, ...
  2. Nombre del programa (hasta 20 caracteres)
  3. Descripción (hasta 20 caracteres)
  4. Tipo (1 caracter):
    (‚t‘=Cinta, ‚d‘=disco, ‚a‘=todos), actualmente ignorado.
  5. Dirección del poke (4 caracteres, hexadecimal):
    Especifica la posición de memoria a modificarse
  6. Byte para el poke (2 caracteres, hexadecimal o ‚??‘):
    Si es ‚??‘ debes introducir un valor, p.ej. número de vidas.
  7. 7. Byte antiguo (2 caracteres, hexadecimal o ‚??‘):
    Permite verificar si el poke modifica el entorno correcto. Si el byte en esa dirección es distinto al byte antiguo, se muestra un mensaje de aviso. No hay verificación cuando se usa ‚??‘.

Ejemplo:

"0","Devils Crown","inf oxygen","t","863b","00","??"
"1","","","t","863c","00","??"
"2","","","t","863d","00","??"

Aquí se mustran tres pokes para el programa “Devils Crown”, los tres van juntos. Los valores antiguos se desconocen por lo que el byte antiguo es ‚??‘. Puedes omitir el nombre y la descripción en los elementos siguientes.

 

7.8 Histórico Interno

Z80EMU (sólo un Z80 con poco CPC)

v1.0 (1991)
primera versión en Pascal (sólo emulación del Z80)
v1.2 (12/8/1992 - 16/8/1992)
primera versión en C (traducido con TPTC); problemas en el Z80: ADD HL..., DAA, LDIR activaban P-flag incorrectamente. BIT... activaba Z-flag incorrectamente, las intrucciones rotate activaban Z-flag y S-flag incorrectamente; ya es posible usar ROMs.
v1.3 (18/8/1992)
direccionamiento de puerto errónea: byte bajo incorrecto. Nueva gestión de memoria con RAM de 128 KB y ROM de 32 KB
v2.0 (18/8/1992 - 22/8/1992)
implementada la ténica de COCPU para encontrar errores (la COCPU usa memoria aparte y sólo se activa en un modo especial de depuración). problemas en el Z80: AND... activa H-flag incorrectamente, CPI... activa N-flag incorrectamente. Anteriormente la pantalla sólo estaba en blanco y negro, ahora ya es azul y amarillo como en un CPC real.
v2.1 (25/8/1992 - 27/8/1992)
Emulación de todos los pinceles, colores en todos los modos. La escritura se realiza sólo en la pantalla activa, que es la que tu ves. La COCPU encontró un error: todas las instrucciones que contenían (IX+zz) con una separación negativa ¡ eran erróneas ! Se había olvidado tomar el “caracter signo”.
v2.2 (30/8/1992 - 3/9/1992)
Nueva rutina de teclado, la paleta se actualiza sin parpadeos (esperando el HSYNC). Se introduce la “ROM necesaria” con COPYMATE.
v2.3 (15/9/1992 - 19/9/1992)
Emulación de FDC para cargar/guardar sectores. La COCPU encontró un error: LD XH,... era LD H,...
v2.3b (19/9/1992)
Se realiza actualización de pantalla sólo si la pantalla está en los bloques de RAM 0..3 (y no 4..7); Se hace el puerto FCxx un alias para FBxx (para CP/M Plus). En ese momento no sabía que OUTI... pre-decrementaba el registro B.
v2.4 test (25/10/1992)
Ya sólo se desea emular el registro R (para “DEFINE”). Ahora la actualización de pantalla se realiza cada interrupción nth y no por cada byte individual escrito en memoria. (Aún muy lento, debido a que está todo hecho en C). Nueva gestión de memoria con bloques alineados a segmentos.
v2.5 test (31/10/1992)
Se cambia la gestión de memoria. Scroll por hardware y tamaños diferentes de pantalla son ya posibles.
v2.6 test (5/11/1992)
Nuevo controlador de teclado por Arnt Gulbrandsen: son posibles todas las combinaciones de teclas. Actualización de pantalla en ensamblador.
v2.7 test
Intento sin éxito de incluir la rápida emulación del Z80 de Juergen Weber.
v2.8
Mejorada la actualización de Pantalla: Sólo las partes que cambian son modificadas en pantalla.
v2.9
Se usa el Timer del PC para generar interrupciones con 300 Hertzios. La emulación rápida funciona sólo si no se usa banking de ROM.

CPCEMU (ahora un CPC)

v0.2 (23/12/1992), continuación de Z80EMU v2.9
Después de casi 4 horas analizando con el Turbo Debugger, he encontrado el fallo que bloqueaba la emulación rápida: PUSH ES en lugar de PUSH DS.
v0.3 (28/12/1992 - 29/12/1992)
Activar N-flag para INI, OUTI. En el Z80 rápido CPI activa las flags erróneas. RL (HL) utilizaba lectura de segmento (en DS) en lugar de escritura de segmento (en ES). LD A,R ahora produce números aleatorios. Se incorporan todas las rutinas de Casete (aunque CASSETTE IN CHAR era incorrecto).
v0.4 (1/1/1993)
IN A,(n): A a b8..b15 (en lugar de B). Configuración de RAM 0xC3: corregida a 0,3,2,7 (para CP/M Plus). El KC-Compact (un compatible CPC del antiguo DDR) usa los puertos EE00 - EE3D, ¿pero para qué?
v0.5 (28/1/1993 - 8/2/1993)
INIR,... el incremento del regsitro R depende de B, no de BC. CASSETTE IN CHAR arreglado (parche erróneo para el CPC 6128).
v0.6 (23.3.1993 - 24.5.1993)
Alguien comentó que las instrucciones OUTI ¡pre-decrementaban el registro B! Se compilan las partes en C con código 386 (con Borland C++ v3.1). Las imágenes de disco llevan el sufijo .DSK. CPCREAD.PAS corregido (el cabezal no se inicializaba a 0) y convertido a CPCREAD.C. Mejorado el direccionamiento de puertos del PIO (la CPU puede leer, incluso cuando el puerto está programado para salida, ...)
v0.7 (26/7/1993 - 29/8/1993) (no publicada)
Fuente renovado completamente, modularizado, ... Fichero de configuración, es posible incluir más ROMs. Cambiado el nombre de la compañía de ‚Schneider‘ a ‚Amstrad‘. (Se puede seleccionar entre varios nombres.) Error en el banking de RAM removido. Nueva documentación en Alemán.
v0.8 (30/8/1993 - 9/9/1993)
Emulación lenta: mejoradas las instrucciones con paridad mediante el uso de una tabla que no sólo sirve para paridad. Z80: Se ignora ED xx con xx ilegales. Nueva documentación en Inglés.
v0.8a (10/9/1993 - 15/9/1993)
Error grave en la emulación rápida: Si se ejecuta una instrucción DD CB xx y se produce una interrupción, ¡la instrucción se ignora!
v0.8b (16/9/1993 - 21/9/1993)
Implementado un VSYNC “real”, si VSYNC_CT = 0. Problema en el puerto PIO A arreglado: OUT &F400,xx con el Puerto A en modo de entrada era ignorado. Nueva rutina para joystick de Martin Zacho.
v0.8c (22/9/1993 - 13/12/1993)
Verificada la documentación con “ispell”. La emulación no comenzaba si “USE_JOYSTICK=1” y no había un joystick disponible (PUSH AX en el sitio equivocado). Emulación lenta: DAA corregido (los corchetes habían desaparecido desde la versión v0.8). Parche erróneo para el CPC 664 en la rutina de interrupciones. Este parche reemplazaba EI con NOP para evitar el problema con EI (activar las interrupciones una instrucción más tarde). Ahora corregido para todos los CPCs.
v0.8d (14/12/1993 - 29/12/1993)
Emulación de FDC re-escrita para formatos de doble cara. CPCTRANS sustituye al antiguo CPCREAD y permite leer discos Vortex una vez instalado el parche 720KB.COM. Aparte de eso, se pueden escribir imágenes de disco de vuelta al disco. Nueva selección de ficheros al pulsar F3. Se introducen algunos alias para direcciones de puertos, p.ej. &7000 - &7f00 para direccionar el gate array, &0c00, &1c00, &2c00, &3c00, &bc00 para el CRTC. Se activa la emulación del registro R.
v0.9 alfa (30/12/1993 - 20/1/1994)
Memoria EMS posible con una configuración especial de EMS/UMB. Dígitos binarios en el fichero de configuración. Direccionamiento del banking de RAM arreglado: el emulador aceptaba &d0-&ff como &c0-&c7. Ahora hasta 576 KB de RAM con EMS.
v0.9b (21/1/1994 - 31/1/1994)
Uso de EMS simplificado mediante EMS extendida (o LIM EMS 4.0) con más de 4 páginas físicas de EMS. Selección de ficheros añadida a ‚l‘ (menú de depuración), RUN” .
v0.9c (1/2/1994 - 29/4/1994)
Algo de sonido pésimo por el altavoz interno del PC (desactivarlo con F4). Selección de ficheros también con ‚v‘; corregida la documentación en Inglés; sonido por Soundblaster (puede mejorarse); nuevo CPCTRANS con línea de comandos, acceso directo al FDC; testeado el adaptador paralelo y mejorado el software. Z80 rápido: INC (HL), DEC (HL), INC (IX+n), DEC (IX+n) para RAM por debajo de la ROM arreglado. PgUp, PgDn para mover pantallas demasiado grandes; se muestran partes de pantallas overscan. Ahora es posible: snapshots de 64K.
v0.9d (30/4/1994 - 12/5/1994)
Las interrupciones durante DI no se omiten, y éstas ya no se activan directamente después de una instrucción EI. Nuevas funciones para el color: ahora sin nieve en OS/2. Z80 rápido: incrementada la velocidad de lectura de código.
v1.0 (13/5/1994 - 20/5/1994)
Mejorada la parte de pantalla: direfentes tamaños de caracter desde 1 hasta 8. Selección de ficheros añadida a SAVE” , añadida selección rápida pulsando una letra. Mejorado CPCTRANS con una opción de verificación. Nuevo menú de configuración pulsando F7. De este modo se puede desactivar el parpadeo de color.
v1.0a (21/5/1994 - 9/6/1994)
Mejorado el menú de configuración con entrada directa o teclas de cursor, añadido esquema de teclado Alemán, añadida opción de retardo simple. Visualización correcta de tamaños de pantalla más pequeños (sin trozos de las más grandes). Mejorada la parte rápida del Z80: RRA,RLA, ... más rápidos, instrucciones CB xx más rápidas. Añadidas más instrucciones ilegales (ED xx). ¡ Faltaban LD D,XH y LD YL,YH ! Corregido CPDR, CPIR con BC=0 (0 equivale a 65536 en un Z80, pero ¡si que es 0 para el prefijo REPE del 80x86!). Corregidas las flags DAA. Nuevo software para el adaptador paralelo: ahora es posible enviar al CPC. Gracias a Bernd Schmidt por apuntarme que una interrupción incrementa el registro R en 1. Con esta ayuda la emulación del registro del puerto C del PIO se ha mejorado.
v1.1a (10/6/1994 - )
Surge una nueva era para CPCEMU: ¡Amstrad ha permitido el uso de las ROMs! Cambios en el fichero de configuración: ROM_BLOCKS -> ROM_BLOCK, DISC_BYPASS -> DISABLE_ADOS, ya no hace falta un espacio de separación para ‚=‘. Cambios en la parte del sonido, en la parte gráfica: tamaño vertical por el VGA-CRTC. La calibración del Joystick se encuentra ahora en el menú de configuración, se han mejorado las rutinas de casete para guardar. Mejorada la parte del FDC: ahora puede usarse COPYMATE. Puede insertarse discos con formato distinto al de datos (data) sin error de lectura (sin búsqueda de la pista 0). Un retardo más en CPCTRANS, espero que yano haga falta usar el botón de turbo; formateo de imágenes de disco. Corregido una vez más el puerto C del PIO: se desactiva después de out &7f00,n. Grandes cambios en el fichero de configuración: Ahora con configuración condicional (#IFCPC, #ENDIF). Cambiadas algunas palabras clave (VSYNC_CT -> /, DISC_PATH -> /, SNAP_PATH -> SNAPSHOT, DRV_A -> DRIVE_A, DRV_B -> DRIVE_B).
Craga de programas desde archivos ZIP. Hace falta PKUNZIP.
v1.1b (17/8/1994 - 2/9/1994)
Se introducen los multimodos, eso significa que puede haber varios modos de pantalla simultáneos en la misma pantalla. La actualización de pantalla se ha dividido en hasta 6 áreas, cada una de ellas se actualiza cuando se produce una interrupción. (Puede mejorarse.) Ahora es posible: Snapshots de 128K, ampliado para multimodos. CPCPARA mejorado: Ahora pueden transferirse ficheros binarios con cabecera. Se ha incluido detección del CPC 6128 Plus. Se han incluido más alias para puertos.
v1.2 (3/9/1994 - )
Esta versión se publicó. Fundamentalmente hay cambios en el menú de ayuda.
v1.2a (27/9/1994 - ) (estuvo disponible como UPD12A.ZIP)
Selección de Ficheros: Sólo se muestran las unidades disponibles. Y: Con el driver ANSI.SYS el fondo de algunos textos era negro. TMP_PATH: Se puede especificar una unidad sin path.
Shell de DOS (F7): CPCEMU se mueve primero a XMS, EMS o disco, de modo que hay mucha más memoria en el shell de DOS. (Esta caracteríastica se ha tomado del Programa de Dominio Público SWAP300.ZIP por Marty Del Vecchio.)
La actualización de pantalla podría corromperse si el ancho de pantalla no era divisible por 4.
Otra versión de CPCEMU para lograr más velocidad si cabe: C2.EXE. Usa una gestión de memoria distinta, con dos marcos de EMS de 64KB cada. Uno para lectura y otro para escritura. Pero funciona únicamente con EMS.
Las ROMs también tienen © de Locomotive Software, no sólo de Amstrad.
v1.2b ( )
No había sonido estéreo en una Soundblaster Pro, incluso si así lo ponía la configuración. Si no se encontraba una Soundblaster no había sonido hasta que se usaba USE_SB=0.
Z80 rápido: Cambiados algunos accesos word a accesos byte. Es un poco más lento pero no bloquea el ordenador cada vez que se realiza un acceso word a la dirección 0xffff. Z80 rápido: Corregido el problema con EI HALT DI: La dirección a HALT era metida en la stack en lugar de la de DI. Documentación en Inglés corregida.
Mejorados CPCPARA y PCPARA v1.1: test del adaptador test, mucha más velocidad en CPC->PC: approx. ¡1600 bytes por segundo leyendo de disco! (486/66) llegaron a medirse. De este modo pueden transferirse ¡16KB en 10 segundos! Gracias a Klaus Weber por apuntarme que era demasiado lento. En PCPARA había un DELAY(1) después de cada nibble para esperar un milisegundo. Esto no hace falta.
v1.2c (28/2/1995 - ) (estuvo disponible como UPD12C.ZIP)
Algunas partes de CPCEMU re-escritas en C++. Esto permite funciones inline e interface mejorado para mantener un mejor control del proyecto.
v1.2d (16/3/1995 - ) (sólo para ‚subscriptores‘ del mailing list)
Z80 rápido: Cambios internos no visibles para el usuario, excepto un pequeño incremento de velocidad. Ahora todos los datos se mantienen en el segmento de datos en lugar del segmento de código.
Por fin se introdujo el modo absolutamente necesario para ordenadores rápidos: ‚realtime CPC‘ (‚CPC a velocidad real‘) (Seleccionable en el menú de configuración o con REALTIME=1).
v1.3 (16/4/1995 - )
Fichero de pokes para pokear fácilmente, documentación en Francés, comando para formateo en el FDC (re-formatea imágenes de disco del mismo tamaño), nuevo sistema de manús con soporte de ratón (MOUSE=1), pueden insertarse imágenes de disco con atributo de sólo-lectura (deben insertarse como “read only”), menú de depuración: añadido ‚find‘
v1.3a (30/4/1995 - ) (estuvo disponible como UPD13A.ZIP)
Con la versión v1.3 Boulder Dash no funcionaba, aún cuando sí lo hacía en la v1.2. El modo 2 de interrupciones del Z80 no estaba simulado correctamente (omitido PUSH/POP). La emulación lenta del Z80 tenía un bug parecido.
CPCTRANS: Opción -f 6 activada.
v1.3b (20/5/1995 - ) (está disponible como UPD13B.ZIP)
Algunos usuarios comunicaron que no había sonido en la Soundblaster desde la versión 1.3.
v1.4a0 (21.3.1996 (v1.3c); TRANSLATE: published in the German magazin c't 6/97)
Soporte de sonido GUS por Ulrich Doewich; ayuda en línea en Inglés, Alemán, Francés y Español; documentación en Francés completa; soporte para 2 joysticks; modos de video VESA para altas resoluciones; mejorado el menú y el fichero de configuración; añadidas opciones para cargar y guardar en el menú de configuración; mejoradas las rutinas del FDC para formatos no estándares; formato de disco extendido; colores y teclas configurables por el usuario;
CPCTRANS mejorado (v2.3); nuevo SNA2GIF (v1.1);
emulación del Z80 rápida: algunas veces la pantalla no se borraba completamente después de un reset (problema con 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) TRANSLATE!
  • perfect Soundblaster sound support by Ulrich Doewich (digital sound with noise); partial Spanish documentation v1.3-v1.4, thanks to Ismael Salvador Igual;
  • autostart of BASIC programs from disk images;
  • 4DOS descriptions in file selection menus; online help now allows topics including spaces;
  • path names in configurations are saved relative;
  • set data rate with CPCTRANS v2.3g;
  • SNA2GIF v1.2: user-configurable colour palette, better auto-scale;
  • CPCPARA v1.2: possible to disable fast sending (e.g. for Vortex);
  • extended poke database; allow to use the VESA video modes even if they are not reported by the VESA bios (needed for noname S3Virge cards with standard S3 BIOS);
  • The start scripts CPCxxx.BAT use a configuration file under %TMP (this allows CPCEMU to reside on a CD-ROM);
v1.5b1
  • Complete Spanish documentation v1.5 thanks to Gerardo Briseño;
  • Complete French documentation v1.5 thanks to Jean-Pierre MARQUET;
  • Joystick problem correced (joystick did not work with v1.5b0);
  • file selection: now up to 1500 directory entries (formerly 500); direct printer port access when using PRINTER=""; early VSYNC clear removed (Platoon had no keyboard with v1.5b0 Realtime);
  • when EMS was in use you could not load a 128K snapshot with a RAM configuration different from &C0 (e.g. &C2 used by CP/M Plus);
  • CPCPARA v1.2: the flag to disable fast sending had "negative logic";

CPCEMU está escrito en C++ y ensamblador, usando Borland C 3.1 con optimización para 386 y Turbo Assembler. Para Depuración se ha usado el Turbo Debugger.

Los colores se obtuvieron mediante el programa VGAMETER por J. Stephen Shattuck, Jr., con el CPC conectado a un TV mediante un adaptador Scart.

 


 

(A partir de este punto puedes continuar leyendo sin ningún riesgo.)

 

El capítulo 8. Apéndice

 

© Marco Vieth, Mai 1998



Marco Vieth, 19.04.2008 14:18:17