8bit-CPU: bo8
Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
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.