8bit-CPU: bo8
Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Erst-Autor: bome
Die CPU ist Teil eines Gesamt-Projekts: 8bit-Computer: bo8h.
Dort findet sich auch eine erläuternde Beschreibung der CPU.
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
/ / / / / / / / /
--==------==------==------==------==---- Cx
[ tA [ tB [ tA [ tB [
====----====----====----====----====---- C0
--====----====----====----====----====-- C1
An beiden Eingängen C0 C1 kann Cx anliegen
Cx darf auch symmetrisch sein (Tastgrad 50%)
Oder es können verschiedene Takte C0 C1 anliegen
C0 liefert die fallende und C1 die steigende Flanke
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 zu jedem Zeitpunkt 2 (Mitte eines Vollzyklus)
REP bewirkt Anhängen eines (AR/BN) oder eines weiteren (AR/BN)
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.
----------------------------------------------------------------
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.