MILC logo

IndexVorigeVolgendeLeeg

R800 [1/2]
Stefan Boer, 01-09-94


    
                        DE R800
                      -----------

                      INLEIDING

Het hart  van de  MSX turbo  R wordt gevormd door een nieuwe 
processor:  de R800.  In dit  artikel wordt  alles uitgelegd 
over het  selecteren van de processor, de DRAM, kloksnelheid 
en nog  veel meer.  In de  Sunrise Times vindt u de complete 
instructietabellen  van  de  R800, die  nog nooit  eerder in 
Nederland werden gepubliceerd!


                TWEE  PROCESSORS

De  turbo R bezit twee microprocessors, een Z80 (een Z80A om 
precies te zijn) en een R800. Het is dus niet zo dat tijdens 
de  Z80   mode  gewoon   de  R800  wordt  vertraagd,  er  is 
daadwerkelijk een andere processor actief.

De   R800  is  upwards  compatible  met de  Z80, en  kan dus 
alle Z80  instructies verwerken.  Maar de R800 kan meer. Ten 
eerste  kan hij  de instructies  gemiddeld acht keer sneller 
uitvoeren,  en ten  tweede heeft  de R800  een aantal nieuwe 
instructies. Om  het verschil  in snelheid  beter te  kunnen 
uitleggen ga ik u eerst uitleggen wat de term "kloksnelheid" 
nu eigenlijk precies betekent.


                   KLOKSNELHEID

Dit  zal u wel een beetje vreemd in de oren klinken, maar de 
kloksnelheid  zegt   eigenlijk  weinig  over  de  werkelijke 
snelheid van de microprocessor, en nog minder over de totale 
snelheid van de computer.

De  Z80A heeft	een kloksnelheid  van 3.579.545  Hz (meestal
afgekort tot 3.58 MHz). Dit betekent dat de Z80A per seconde 
3.579.545 (ruim  3,5 miljoen!) klokpulsen genereert. Tijdens 
zo'n  klokpuls  kan  de processor  een bepaalde  hoeveelheid 
taken  verrichten. En  de truuk  is nu, dat deze hoeveelheid 
taken per processor niet gelijk is!

Daarom kan  een processor  met een  lagere kloksnelheid toch 
sneller  zijn. Een  voorbeeld: een R800 die draait op 2 MHz, 
is  sneller  dan  een  Z80 op  3.58 MHz!  Zo ziet  u dat  de 
kloksnelheid  slechts  weinig zegt.  Alleen bij  processoren 
waarvan  alleen   de  kloksnelheid  verschilt,  is  dat  een 
duidelijke  maatstaf voor  de snelheid. Een Z80B die op 7.16 
MHz draait  is uiteraard  wel twee keer zo snel als een Z80A 
die  op 3.58  MHz draait,  omdat het  hier om dezelfde soort 
processor gaat.

Voor de snelheid van de totale computer zegt de kloksnelheid 
zoals gezegd  nog minder.  Daar is  namelijk ook de snelheid 
van  bijvoorbeeld de  videochip, en het geheugen van belang. 
We kunnen  stellen dat  een gemiddeld  programma op  een MSX 
turbo R vijf  zes keer sneller is dan op een MSX2.


    DE KLOKSNELHEID VAN DE R800

De kloksnelheid  van de  R800 (dus het aantal klokpulsen van 
de  R800 per seconde), is 7.159.090 Hz, oftewel precies twee 
maal de kloksnelheid van de Z80A. Dit wordt meestal 7.16 MHz 
genoemd. Dit  betekent overigens dat een klokpuls 1 seconde/ 
7159090 = 140 ns (nanoseconde, miljardste seconde) duurt.

Waarom	lees je  dan overal  (zelfs in	de officiele Japanse
handboeken van Panasonic!) dat de klokfrequentie van de R800 
28.636.360 Hz  (28.6 MHz) bedraagt? Dit lijkt onzin, maar is 
toch ook weer niet zo heel vreemd.

Als  men zou  schrijven dat de R800 een klokfrequentie heeft 
van 7.16  MHz (de  waarheid!), dan  zouden de meeste MSX'ers 
waarschijnlijk  denken dat  deze CPU  dus net zo snel is als 
een 7.16 MHz Z80. En dat is niet zo, met zuiver rekenwerk is 
de R800  gemiddeld (!)  acht keer  sneller dan  een 3.58 MHz 
Z80. En zo komt men aan 28.636.360 Hz, dat is namelijk exact 
8 maal 3.579.545 Hz!


                   HOE KAN DAT

Hoe  kan het  dat de  R800 acht  maal zo snel is als de Z80, 
maar toch  maar een twee keer zo hoge kloksnelheid heeft? De 
oplettende lezertjes weten het antwoord al: de R800 kan meer 
doen in een klokpuls dan de Z80! Een voorbeeld:

De  instructie LD A,B neemt op de zowel de Z80 als de R800 1 
zogenaamde "machine  cycle" (M-cycle) in beslag. Bij de R800 
duurt een M-cycle ook n T-State, maar bij de Z80 duurt die 
M-cycle maar liefst vier T-States.

Het aantal klokpulsen is gelijk aan het aantal T-States plus 
eventuele  extra klokpulsen.  Bij de  Z80 is  dat er  altijd 
minimaal  1  (voor  de  refresh), bij  de R800  zijn er  een 
heleboel  instructies  waarbij geen  extra klokpulsen  nodig 
zijn (de refresh vindt daar niet bij elke instructie plaats, 
maar ongeveer   32 keer   per seconde).

Bij  deze instructie  (LD A,B)  is er  bij de  Z80 een extra 
klokpuls nodig,  waardoor het  totaal op  vijf komt,  bij de 
R800 is het gewoon n klokpuls. Hierdoor is de R800 (bij de 
instructie LD A,B) dus vijf keer zo snel als de Z80.

Bovendien is de klokfrequentie van de R800 twee keer zo hoog 
(zoals we al eerder hebben vastgesteld). De instructie wordt 
op  de  R800  dus  twee  maal  vijf  is  TIEN  keer zo  snel 
uitgevoerd!  Even narekenen:  een klokpuls duurt bij de R800 
140 ns, en bij de Z80 280 ns. We berekenen nu hoe lang beide 
processoren doen  over het  uitvoeren van  de instructie  LD 
A,B:

Z80:    5 klokpulsen * 280 ns = 1397   ns
R800:   1 klokpuls   * 140 ns =  139,7 ns

Dit is dus inderdaad precies tien maal zo snel!

Een overzicht van een aantala andere instructies:

Instructie:     Z80:            R800:           Versnelling:
------------------------------------------------------------
LD A,B          5       (1,1)   1       (1,0)   10
LD A,(HL)       8       (2,1)   3       (2,1)   5,3
LD A,(IX+0)     21      (5,2)   5       (5,0)   8,4
PUSH HL         12      (3,1)   4       (4,0)   6
LDIR (BC<>0)    23      (5,2)   7       (4,3)   6,6
ADD A,B         5       (1,1)   1       (1,0)   10
INC A           5       (1,1)   1       (1,0)   10
ADD HL,DE       12      (3,1)   1       (1,0)   24 (!!!)
INC HL          7       (1,1)   1       (1,0)   14
JP              11      (3,1)   3       (3,0)   7,3
JR              13      (3,1)   3       (3,0)   8,7
DJNZ (B<>0)     14      (3,1)   3       (2,1)   9,3
CALL            18      (5,1)   6       (5,1)   6
RET             11      (3,1)   4       (3,1)   5,5
------------------------------------------------------------
Gemiddeld                                       9,36

Zoals  u ziet is de gemiddelde versnelling in deze tabel dus 
9,36  maal,   maar  u  moet  niet  vergeten  dat  niet  elke 
instructie   evenveel  voorkomt   in  een  routine,  dus  de 
versnelling zal  van routine tot routine verschillen. Het is 
in   ieder  geval  zeer  onwaarschijnlijk  dat  bovenstaande 
instructies (en  soortgelijke, want  LD D,E duurt natuurlijk 
net  zo lang  als LD  A,B) allemaal  evenveel voorkomen.  De 
totale versnelling  van een programma is ook nog afhankelijk 
van  andere  zaken,  zoals bijvoorbeeld  de snelheid  van de 
videochip (die overigens ongewijzigd is t.o.v. MSX2/2+!).

Hoe  moet  u  bovenstaande tabel  nu lezen?  Links staat  de 
mnemonic, in Z80 formaat. Daarnaast het aantal klokpulsen op 
de  Z80. De tijd die zo'n instructie vergt kunt u uitrekenen 
door dit  getal te  delen door  de kloksnelheid  van de Z80. 
Daarnaast  staan twee  getallen tussen  haakjes. Het  eerste 
getal is  het aantal  M-cycles, het  tweede getal het aantal 
extra klokpulsen. U kunt het aantal T-states dus vinden door 
van het opgegeven aantal klokpulsen dat getal af te trekken.

De  volgende kolom  geeft het aantal klokpulsen van dezelfde 
instructie op  de R800.  De tijd kunt u weer uitrekenen door 
dit  getal te delen door de kloksnelheid van de R800 (wel de 
goede nemen  natuurlijk). Het eerste getal tussen haakjes is 
het  aantal M-cycles.  Het aantal  T-states is  bij de  R800 
altijd  gelijk  aan het  aantal M-cycles!  Het tweede  getal 
geeft aan hoeveel extra klokpulsen er zijn. Een voorbeeld:

DJNZ (B<>0)     14      (3,1)   3       (2,1)   9,3

Dit moet als volgt worden gelezen:

                Z80:                    R800: 
-----------------------------------------------------------
Klokpulsen:     14                      3
Tijd:           3.91 microseconde       0.42 microseconde
M-cycles:       3                       2
T-states:       13 (14-1)               2 (3-1)
Extra pulsen:   1                       1
Versnelling:                    9,3
------------------------------------------------------------

Over  het algemeen  is het  aantal M-cycles  op de Z80 en de 
R800 gelijk,  en komt  de versnelling vooral doordat de R800 
maar  een T-state  nodig heeft per M-cycle, en die bij de
Z80 meestal  3 a 4 zijn.  Bovendien wordt  er soms  ook nog
"bezuiningd" op de extra klokpulsen.




                             BIT

De meest  opvallende versnelling  is toch  wel de  ADD HL,DE 
instruktie,  die  op  de R800  maar liefst  24 keer  sneller 
wordt.  Deze instructie is vooral sneller doordat het aantal 
M-cycles drastisch  is verminderd van 3 naar 1. Hoe kan dat? 
Bij de meeste instructies is het aantal M-cycles bij de R800 
en de Z80 gelijk, zoals eerder opgemerkt.

Dit  komt  door  de  R800  zoveel  mogelijk (!)  16 bits  is 
gemaakt. In  Japan wordt  er ook geadverteerd dat de R800 16 
bit  is. Toch  is de  R800 niet  helemaal 16 bit, de externe 
adresbus  is  namelijk  nog  steeds acht  bits. De  hele MSX 
computer is  acht bits,  en als  je een processor met een 16 
bits externe adresbus in een MSX zou plaatsen, dan lijkt het 
niet  veel  meer  op  een  MSX!  Er  zouden dan  veel (dure) 
aanpassingen nodig zijn.

Vandaar dat men de externe adresbus ongemoeid heeft gelaten. 
Maar intern  is de  R800 wel 16 bits, en daardoor gaan de 16 
bits instructies (zoals ADD HL,DE) zo ontzettend snel!


          DE  INSTRUCTIETABELLEN

In de Sunrise Times staan de complete instructietabellen van 
de  R800.  Dit  is  de  eerste  keer  dat  deze  tabellen in 
Nederland worden gepubliceerd!!

Als  u  de instructietabellen  bekijkt, zult  u zien  dat de 
meeste  mnemonics   zijn  veranderd.   De  instructies  zijn 
hetzelfde  gebleven, maar  de namen zijn gemoderniseerd. Een 
overzicht van de instructies die een naamsverandering hebben 
ondergaan:

R800: (nieuwe naam)             Z80: (oude naam)
------------------------------------------------------------
XCH                             EX
XCHX                            EXX
MOVE (HL++),(DE++)              LDI
MOVE (HL--),(DE--)              LDD
MOVEM (HL++),(DE++)             LDIR
MOVEM (HL--),(DE--)             LDDR
CMP A,(HL++)                    CPI
CMP A,(HL--)                    CPD
CMPM A,(HL++)                   CPIR
CMPM A,(HL--)                   CPDR
ADDC                            ADC
SUBC                            SBC
AND A,                          AND
OR A,                           OR
XOR A,                          XOR
CMP A,                          CP
CLR                             RES
ROLA                            RLCA
RORA                            RRCA
ROLCA                           RLA
RORCA                           RRA
ROL                             RLC
ROR                             RRC
ROLC                            RL
RORC                            RR
ROL4 (HL)                       RLD
ROR4 (HL)                       RRD
SHL                             SLA
SHR                             SRL
SHRA                            SRA
BR                              JP
BNZ                             JP NZ,
BZ                              JP Z,
BNC                             JP NC,
BC                              JP C,
BPO                             JP PO,
BPE                             JP PE,
BP                              JP P,
BM                              JP M,
SHORT BR                        JR
SHORT BNZ                       JR NZ,
SHORT BZ                        JR Z,
SHORT BNC                       JR NC,
SHORT BC                        JR C,
DBNZ                            DJNZ
BRK                             RST
IN (HL++),(C)                   INI
IN (HL--),(C)                   IND
INM (HL++),(C)                  INIR
INM (HL--),(C)                  INDR
OUT (C),(HL++)                  OUTI
OUT (C),(HL--)                  OUTD
OUTM (C),(HL++)                 OTIR
OUTM (C),(HL--)                 OTDR
ADJ A                           DAA
NOT A                           CPL
NEG A                           NEG
NOTC                            CCF
SETC                            SCF
------------------------------------------------------------


           UITLEG BIJ TABELLEN

Voor degenen die nog nooit een instructietabel hebben gezien 
is een  beetje uitleg  wel op z'n plaats. In de eerste kolom 
staat  de mnemonic, de "syntax" van de instructie. Daarnaast 
een symbolische  notatie van de werking van deze instruktie. 
In  de volgende kolom wordt aangegeven hoe de vlaggen worden 
beinvloedt. Daarvoor worden de volgende tekens gebruikt:

stip    vlag wordt niet beinvloedt
pijltje stand van vlag wordt bepaald door de uitkomst van
        de instructie
0       vlag staat op 0 na instructie
1       vlag staat op 1 na instructie
?       vlag onbekend
P       P/V vlag geeft pariteit
V       P/V vlag geeft overflow

In de  volgende kolommen  wordt de opcode gegeven, in binair 
en  in hexadecimaal. De kolom "B" geeft aan hoeveel bytes de 
instructie in beslag neemt, de kolom "C" het aantal M-cycles 
(C is  dus een afkorting van Cycles). Zoals we eerder hebben 
vastgesteld  is dit  altijd gelijk  aan het aantal T-states, 
maar het aantal klokpulsen kan een paar meer zijn.

Verder  worden  nog  een  heleboel  symbolen  gebruikt.  Een 
overzicht:

a{7}            bit 7 van register a
a{4..7}         bit 4 t/m 7 van register a
de:hl           een 32 bits waarde, waarbij DE de hoogste
                16 bits bevat
(ix+d)          d is de 8 bits offset
C               carry vlag
Z               zero vlag
P/V             parity/overflow vlag
S               sign vlag
N               subtract vlag
H               half-carry vlag
IFF             interrupt flipflop
r,r'            A,B,C,D,E,H,L
u,u'            A,B,C,D,E,IXH,IXL
v,v'            A,B,C,D,E,IYH,IYL
p               IXH,IYL
q               IYH,IYL
ss              BC,DE,HL,SP
pp              BC,DE,IX,SP
rr              BC,DE,IY,SP
qq              BC,DE,HL,AF
e               offset bij SHORT BR (JR bij Z80)
k               adres bij BRK (RST bij Z80)
nn              16 bits constante
n               8 bits constante
b               bitnummer (0-7)
NOT             logische bewerking
tmp             tijdelijke opslag van een bit
B               aantal bytes
C               aantal (M) cycles

Voor  de  logische  bewerkingen  OR,  XOR  en AND  worden de 
wiskundige  notaties  gebruikt  (OR  is  een  "V",  XOR  een 
"omgekeerde A" en AND een "omgekeerde V").


          OPCODES SAMENSTELLEN

De  instructietabellen zouden  wel erg  lang worden  als per 
mogelijke instructie  de opcode  zou zijn vermeld. Bovendien 
is  dan de logica in de opcodes niet meer uit de tabel op te 
maken. Vaak  moet de  opcode dan ook (op binaire wijze) zelf 
worden  samengesteld.  Met  een voorbeeld  kan ik  het beste 
laten zien hoe dat gaat.

U  wilt  bijvoorbeeld  de  opcode van  de instructie  LD C,H 
weten. Als u de instructietabellen in de Sunrise Times erbij 
pakt, kunt u daar LD r,r' vinden. In de kolom opcode staat:

7   6   5   4   3   2   1   0    <-- bitnummers
0   1       r           r'       <-- opcode

Onderaan ziet  u de  tabel voor r en r'. U ziet daar dat 001 
staat  voor C  en 100  voor H.  U vervang  nu r  en r' in de 
binaire opcode door de gevonden codes voor C en H. De opcode 
wordt dan:

7   6   5   4   3   2   1   0    <-- bitnummers
0   1   0   0   1   1   0   0    <-- opcode

U heeft de opcode gevonden, het is &B01001100.


            NIEUWE INSTRUCTIES

De R800  kent ten  opzichte van  de Z80  drie geheel  nieuwe 
instructies,  bovendien zijn de indexregisters (IX en IY) nu 
ook   per    8   bits    aanspreekbaar.   U   kunt   in   de 
instructietabellen   opzoeken  bij   welke  instructies  dat 
mogelijk is, te herkennen aan u, v, p of q.

De andere nieuwe instructies zijn:

IN F,(C)
MULUB A,r
MULUW HL,ss

De eerste  instructie is  erg handig. Routines waarbij (een) 
bepaald(e)  bit(s) in  de gaten  wordt gehouden, worden door 
deze  instructies   korter,  sneller   en  gebruiken  minder 
registers.  Een voorbeeld: stel u moet bit 0 van I/O poort C 
in de  gaten houden.  De routine moet net zolang wachten tot 
bit 0 op 0 staat. Op de Z80 zou dat er als volgt uit zien:

WACHT:  IN      A,(C)
        BIT     0,A
        JR      NZ,WACHT

Dit zijn 6 bytes en het A-register wordt gebruikt.

Op de R800 kan het ook zo:

WACHT:  IN      F,(C)
        JR      C,WACHT

Dit  zijn  4 bytes  en het  A-register wordt  niet gebruikt. 
Bovendien is deze manier sneller. (N.B. Het carry bit is bit 
0 van het F-register.)

    

Index

Vorige

Volgende