# ASCII R800

De R800 is een door het Japanse ASCII ontwikkelde processor, die werd toegepast in MSX turbo-R-computers. De belangrijkste doelstelling tijdens de ontwerpfase was het ontwerpen van de snelst mogelijke processor maar met behoud van compatibiliteit met de Z80-processor, aangezien deze tot dan toe in MSX-hard- en software werd toegepast.
Om softwarecompatibiliteit met MSX-software te behouden maakt de R800 gebruik van een superset van de Z80-instructieset. Naast alle bestaande Z80-opcodes werden twee vermenigvuldigingsinstructies toegevoegd, namelijk MULUB (8-bits) en MULUW (16-bits). Verder werden veel van de ongedocumenteerde Z80-instructies officieel gemaakt, waaronder zowel alle opcodes met betrekking tot IX en IY als 8-bits registers (IXh, IXl, IYh, IYl).
Aangezien de R800 niet rechtstreeks op Z80 is gebaseerd maar feitelijk afstamt van de Z800-familie, ontbreken enkele van de andere ongedocumenteerde Z80 eigenschappen. Bijvoorbeeld, de ongedocumenteerde vlaggen in bit 3 en 5 van het F-register representeren niet dezelfde waarden als bij Z80 (dit veroorzaakt het mislukken van de ZEXALL-test) en de niet-gedocumenteerde opcode, vaak SLL genoemd is vervangen door een andere niet-gedocumenteerde opcode, TST.
Aan de hardwarezijde werden radicale wijzigingen doorgevoerd. De interne 8-bits ALU van de Z80 werd vervangen door een 16-bits ALU. Opcodes als ADD HL,BC, die eerder 11 klokcycli in beslag namen kunnen nu, onder bepaalde voorwaarden, in slechts één cyclus worden uitgevoerd.
Tevens werd de maximale kloksnelheid van de processor verhoogd naar 7,16 MHz, tweemaal zo snel als de oorspronkelijke snelheid van 3,56 MHz van de in MSX toegepaste Z80-processor. De gegevensbus bleef echter 8-bits om de compatibiliteit met oude hardware te behouden.
Additionele wijzigingen werden aangebracht in de wijze waarop de processor opcodes ophaalt. De oorspronkelijke Z80 gebruikt 4 cycli om een eenvoudige instructie als OF op te halen, en een extra waitstate wordt uitgegeven op de MSX-architectuur. Een overzicht van het Z80-fetchmechanisme in een typische MSX-omgeving is noodzakelijk om de R800 te doorgronden:
* Z80, cyclus 1: instellen van de hogere 8 bits van het adres
* Z80, cyclus 2: instellen van de lagere 8 bits van het adres
* Z80, cyclus 3: waitstate
* Z80, cyclus 4: verversing, deel 1
* Z80, cyclus 5: verversing, deel 2
Aangezien de meeste MSX-toepassingen het RAM-geheugen gebruiken in een 256 × 256 bytesblokswijze, zijn twee cycli vereist om het adres voor de fetch te plaatsen. De R800 omzeilt dit door het onthouden van de laatst bekende status van de hogere 8 bits. Indien de volgende instructie in hetzelfde 256-byte-gebied plaatsvindt, worden deze hogere 8 bits niet geplaatst en wordt aldus een cyclus bespaard. Nochtans, op de Z80 vernietigen de ververscycli de informatie over de hogere bits, zodat een alternatieve actie noodzakelijk is.
De oplossing die de R800 voor dit probleem toepast is het verversen van volledige geheugenblokken van het RAM-geheugen in plaats van het verversen van slechts RAM-regel bij het uitvoeren van iedere instructie. Elke 30μs wordt de processor voor 4μs opgehouden, een tijd die benut wordt om een blok RAM-geheugen te verversen. Aangezien er geen verversing plaatsvindt tussen ophaalinstructies (fetchinstructies) en de waitstate vanwege snellere RAM-chips achterwege blijft, kunnen de eenvoudige instructies in slechts één cyclus worden opgehaald. Deze cyclus zou in het hierboven weegegeven Z80-voorbeeld cyclus 2 zijn; cyclus 1 werd facultatief en wordt slechts uitgegeven wanneer het programma een 256-bytegrens kruist.
Elk van de genoemde voorbeelden is slechts van toepassing op het snelle RAM-geheugen dat door de MSX turbo-R wordt gebruikt. Externe hardware, verbonden middels de cartridgesleuven, maakt gebruik van een timing die vergelijkbaar is met die van de Z80. Zelfs het interne RAM-geheugen van de MSX turbo-R is niet snel genoeg voor deze ophaalregeling, waardoor, op de MSX turbo-R aanwezige, extra geheugenchips de ROM-inhoud kunnen spiegelen naar het RAM-geheugen met als doel het geheel sneller te kunnen uitvoeren.