8bit-CPU: bo8

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

von:   Josef Gnadl (bome)

Die CPU ist Teil eines Gesamt-Projekts: 8bit-Computer: bo8h.
Dort findet sich auch eine erläuternde Beschreibung der CPU.

Meine Website zum Projekt: http://www.bo8h.de

Beitrag im Forum: Befehlssatz der bo8-CPU
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.

Im folgenden Text steht der Punkt in den Mnemonics für einen
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.

================================================================

P  Q R S  X Y Z    K     V            Bezeichnung:  A7 = U
|  | | |  | | |    |A                               AB = K
|  | | |  | | |    |B

P Programmzähler      Q Rückkehradresse
X Adressregister      R Schleifenstartadresse
Y Adressregister      S Schleifenzähler
Z Adressregister      A Akku   B Erweiterung   V Carry

----------------------------------------------------------------
a0 .. af     Adressleitungen   - Tristate
d0 .. d7     Datenleitungen    - Tristate
N0 .. N3     Typleitungen      - permanente Ausgänge
RES   REP    Reset  Repeat     - Eingänge
C0    C1     Takt   Takt       - Eingänge

    0     1 2     3 0     1 2     3 0
    /     / /     / /     / /     / /
====----====----====----====----====----  C0
--====----====----====----====----====--  C1
    [  tA   [  tB   [  tA   [  tB   [

--==------==------==------==------==----  Cx

An Eingängen C0 C1 darf Cx statt C0 C1 anliegen
Cx darf auch symmetrisch sein (Tastgrad 50%)

Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).

Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2
                   Einlesen von Read-Daten zum Zeitpunkt 2
                   Einlesen von REP bei HA zum Zeitpunkt 2

RES muss enden mit Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1
Zum Zeitpunkt 2 Einlesen der Startadresse nach P und R vom
Adressbus und des Akku A vom Datenbus. Folgender Zeitpunkt 0
Start des Programmms mit (FE/BN) für ersten OpCode.

REP wird eingelesen in der Mitte eines IO-Zyklus (HA/BP) oder
eines Wait-Zyklus (AR/BN). REP bewirkt Anhängen eines (AR/BN).

----------------------------------------------------------------
Typ    Name  Funktion

0/tB   BN    normal tB   inaktiv
1/tA   AR    repeat tA   inaktiv   - wiederhole input
2/tA   KA    Adressbus gibt K aus  - Datenbus inaktiv
3/tA   HA    Adressbus gibt K aus  - input A

4/tB   BP    memory-page-Umschaltung für P
5/tB   BX    memory-page-Umschaltung für X
6/tB   BY    memory-page-Umschaltung für Y
7/tB   BZ    memory-page-Umschaltung für Z

8/tA   FE    read  / Adresse ist P / OP-Code
9/tA   WX    write / Adresse ist X
a/tA   WY    write / Adresse ist Y
b/tA   WZ    write / Adresse ist Z

c/tA   RP    read  / Adresse ist P
d/tA   RX    read  / Adresse ist X
e/tA   RY    read  / Adresse ist Y
f/tA   RZ    read  / Adresse ist Z

----------------------------------------------------------------
      +0     +1     +2     +3     +4     +5     +6     +7

00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NOL
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ
80-   NO2    TK1    TK2    TK3    TK4    TK5    TK6    TK7
88-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf
90-   NO1    TA1    TA2    TA3    TA4    TA5    TA6    TA7
98-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE
e0-   ZO.U   SE.U   ZO.V   SE.V   CP.U   NE.U   CP.V   NE.V
e8-   PV.A   TZ.A   PV.B   TZ.B   RD.A   RU.A   RD.B   RU.B
f0-   ZO.A   NE.A   ZO.B   NE.B   IV.A   DV.A   SL.K   S.RP
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..

00 .. 3f     1 Byte
40 .. 67     2 Byte
68 .. ff     1 Byte

00 .. 3f     1 Zyklus   / Sonderfall 00
40 .. 53   2|3 Zyklen
54 .. 7f     2 Zyklen   / Sonderfall 57
80 .. ff     1 Zyklus   / Sonderfall 80

Während der Ausführung eines Befehls
wird der nachfolgende OpCode geladen.

----------------------------------------------------------------
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z

AN.B      A <=  A and B
NR.B      A <=  A nor B
XR.B      A <=  A xor B
AV.B      A <=  A+B+V            V <= Carry
SV.B      A <=  A-B-V            V <= Carry
LV.B      A <=  B-A-V            V <= Carry
GT.B      A <=  B
ST.B      B <=  A

AN. nn    A <=  A and nn
NR. nn    A <=  A nor nn
XR. nn    A <=  A xor nn
AV. nn    A <=  A+nn+V           V <= Carry
SV. nn    A <=  A-nn-V           V <= Carry
LV. nn    A <=  nn-A-V           V <= Carry
GT. nn    A <=  nn
AD. nn    A <=  A+nn

ANM%      A <=  A and (%)
NRM%      A <=  A nor (%)
XRM%      A <=  A xor (%)
AVM%      A <=  A+(%)+V          V <= Carry
SVM%      A <=  A-(%)-V          V <= Carry
LVM%      A <=  (%)-A-V          V <= Carry
GTM%      A <=  (%)
STM%     (%) <=  A

AV.S      K <=  K+S+V            V <= Carry
SV.S      K <=  K-S-V            V <= Carry
LV.S      K <=  S-K-V            V <= Carry

AD.S      K <=  K+S
SD.S      K <=  K-S
LD.S      K <=  S-K

AD.%      K <=  K+%
SD.%      K <=  K-%
LD.%      K <=  %-K

GT.S      K <=  S
ST.S      S <=  K
GT.%      K <=  %
ST.%      % <=  K

RS.%      S <=  %
SS.%      % <=  S

SL.K      B <=  A ,    A <= 0

SL.S      S LowByte <= A ,  S HighByte <= 0
SL.%      % LowByte <= A ,  % HighByte <= 0

GL.S      A <= LowByte  von S
GH.S      A <= HighByte von S
GL.%      A <= LowByte  von %
GH.%      A <= HighByte von %

EX.S      Austausch  K <> S
EX.%      Austausch  K <> %
ES.%      Austausch  S <> %

ZO.S      S <= 0
ZO.%      % <= 0

ZO.V      V <= 0
SE.V      V <= 1
NE.V      V <= not V
CP.V      V <= V xor U

ZO.U      U <= 0
SE.U      U <= 1
NE.U      U <= not U
CP.U      U <= V xor U

NE.A      A  wird logisch negiert
NE.B      B  wird logisch negiert
NE.K      K  wird logisch negiert

ZO.A      A <= 0
ZO.B      B <= 0
ZO.K      K <= 0

IV.A      A <=  A+V              V <= Carry
DV.A      A <=  A-V              V <= Carry

IC.A      A <=  A+1
IC.K      K <=  K+1
IC.S      S <=  S+1

DC.A      A <=  A-1
DC.K      K <=  K-1
DC.S      S <=  S-1

PV.A      A <=  8-fache Kopie von V ,  V <= 0
PV.B      B <=  8-fache Kopie von V ,  V <= 0

TZ.A      wenn nicht  A=0   dann   ( V <= 1 )
TZ.B      wenn nicht  B=0   dann   ( V <= 1 )

RD.A      A wird nach unten durch V rotiert
           Resultat V7654321      V <= Bit0
RD.B      B wird nach unten durch V rotiert
           Resultat V7654321      V <= Bit0

RU.A      A wird nach oben  durch V rotiert
           Resultat 6543210V      V <= Bit7
RU.B      B wird nach oben  durch V rotiert
           Resultat 6543210V      V <= Bit7

TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht
                      Resultat von TA3 ist 43210765

TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht

I%s  mit s= 0..7      % <=  %+s+1
D%s  mit s= 0..7      % <=  %-s-1

I%E       % <= %+1 ,  und Austausch  A <> B
D%E       % <= %-1 ,  und Austausch  A <> B

IKL nn    K <=  K+nn+1
DKL nn    K <=  K-nn-1
I%L nn    % <=  %+nn+1
D%L nn    % <=  %-nn-1

GTA nn    K <=     00nn
GTR nn    K <=     P+nn+3
ADR nn    K <=   K+P+nn+3

NO1       no operation       1 Zyklus
NO2       no operation       2 Zyklen

NOL nn    no operation    2+nn Zyklen   falls nn > 0
NOL 00    K <=  R            2 Zyklen

GT.Q      K <=  Q

S.RP        R <= P+1
O.RP nn     R <= P+2 ,   P <= P+nn+3

Bedingung cc ist    WY   always
                    VZ   V ist 0
                    VS   V ist nicht 0
                    UZ   U ist 0
                    US   U ist nicht 0
                    AZ   A ist 0
                    AS   A ist nicht 0
                    KZ   K ist 0
                    KS   K ist nicht 0

O.cc nn    wenn cc         dann ( P <= P+nn+3 )
B.cc nn    wenn cc         dann ( P <= P-nn-1 )
B.CN nn    wenn nicht S=0  dann ( P <= P-nn-1 , S <= S-1 )

R.cc    wenn cc         dann ( P <= R )
R.CN    wenn nicht S=0  dann ( P <= R , S <= S-1 )
R.I%    wenn nicht S=0  dann ( P <= R , S <= S-1 , % <= %+1 )
R.D%    wenn nicht S=0  dann ( P <= R , S <= S-1 , % <= %-1 )

Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V <= 0

Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen
           wenn der Sprung erfolgt | nicht erfolgt

J..     P <= K ,  R <= K ,    Q <= P+1 ,  K <= P+1

SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird
        statt eines BN ein B% ausgegeben.  Das soll extern
        eine memory-page-Umschaltung für %  bewirken.  Das
        Resultat muss schon beim folgenden tA bereitstehen.

H..     Nach dem Einlesen des folgenden OpCodes mit FE wird
        statt eines BN ein BP ausgegeben.  Das soll extern
        eine memory-page-Umschaltung für P  bewirken.  Das
        Resultat muss schon beim folgenden tA bereitstehen.

        Wenn der eingelesene folgende OpCode ein J.. ist,
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.

        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus
        (HA/BP). Das BP  soll die memory-page-Umschaltung
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.

        Ausnahme:  Wenn der OpCode wieder ein H.. ist,
        folgt (KA/BN) statt (HA/BP). Danach bleibt die
        CPU im Zustand BN bis ein Reset erfolgt.