# R800 (CPU)

El R800 es la CPU principal de los ordenadores domésticos MSX Turbo-R (tienen además como CPU secundaria un Zilog Z80A). Fue diseñado por ASCII Corporation de Japón, con el objetivo de tener la CPU más rápida posible, pero que mantuviera la compatibilidad con el hardware y software de los MSX existentes (basados en el Zilog Z80).
Para preservar la compatiblidad con el viejo software MSX, el R800 utiliza un superconjunto del conjunto de instrucciones del Z80. Además de todos los opcodes del Z80, se le añaden dos nuevas instrucciones de multiplicación, MULUB (8 bits), y MULUW (16 bits). Además, muchas de las instrucciones no documentadas del Z80 se convierten en oficiales, lo que incluye todos los opcodes que usan IX e IY como registros de 8 bits (IXh, IXl, IYh, IYl).
Puesto que el R800 no está basado directamente en el Z80, sino en la familia del Zilog Z800, le faltan varias otras prestaciones no documentadas del Z80. Por ejemplo, la bandera indocumentada representada por los bits 3 y 5 del registro F no asume los mismos valores que en un Z80 (siendo la causa de fallar en los test ZEXALL) y el opcode indocumentado llamado SLL es reemplazado por otro opcode indocumentado llamado TST.
En la parte hardware, se realizan cambios radicales. La ULA interna de 4 bits del Z80 es reemplazada por una nueva de 16 bits. Opcodes como ADD HL, BC, que anteriormente ocupaban 11 ciclos de reloj, pasan a durar solo un ciclo en determinadas condiciones. La frecuencia de reloj máxima se incrementa a 7,16 MHz, el doble que los 3,57 MHz del Z80 usado en los MSX. El bus de datos permanece de 8 bits para mantener la compatibilidad con el viejo hardware.
Además se hicieron cambios en el modo en que la CPU trata los opcodes. El Z80 original usa 4 ciclos para tratar una instrucción simple como OR A, además de emplear un estado de espera adicional debido a la arquitectura MSX. Si revisamos el tratamiento del Z80 en un ambiente MSX comprenderemos mejor al R800:
* Z80, ciclo 1: se establecen los 8 bits superiores de una dirección
* Z80, ciclo 2: se establecen los 8 bits inferiores de una dirección
* Z80, ciclo 3: estado de espera (waitstate)
* Z80, ciclo 4: refresco, parte 1
* Z80, ciclo 5: refresco, parte 2
Puesto que muchas implementaciones del MSX usan memoria RAM dispuesta en bloques de 256×256 bytes, se necesitan dos ciclos para componer la dirección a leer. El R800 evita esto recordando el último estado conocido de los 8 bits más altos. Si la siguiente instrucción está en el mismo bloque de 256 bytes, los 8 bits superiores no se direccionan, ahorrando un ciclo. Sin embargo en el Z80, los ciclos de refresco destruyen la información de los bits altos por lo que es necesario un trabajo adicional.
La solución implementada en el R800 es refrescar bloques enteros de RAM, en lugar de refrescar una línea de RAM por instrucción publicada. Cada 30 us (microsegundos), la CPU se detiene por 4us, y este tiempo es usado para refrescar un bloque de la RAM. Puesto que no hay refresco entre el direccionamiento de dos instrucciones, y el estado de espera (waitstate) es removido debido a los chips de RAM más rápidos, las instrucciones simples son tratadas usando solo un ciclo de reloj. Este ciclo sería el ciclo 2 del ejemplo anterior del Z80; el ciclo 1 deviene en opcional y solo es utilizado cuando el programa cruza un límite de 256 bytes.
Todo esto se aplica a la RAM rápida usada en los MSX Turbo-R. El hardware externo, conectado por los slots de cartuchos, utiliza tiempos similares a los del Z80. Ni siquiera la ROM interna de los Turbo-R es suficientemente rápida para este esquema, por lo que su utilizan chips adicionales para copiar la ROM en RAM, para hacer que se ejecute más rápidamente.