# Mikroprogramm für CISC Prozessor



## Kirby.exe (30. Jan 2020)

Also wir haben die Aufgabe jeweils ein Mikroprogramm für den Befehl `SWAP` und `ADDL` zu schreiben...soweit so gut, ich habe hier mal etwas pseudocode:




```
SWAP: tmp = $sp;
      $sp = $ac;
      $ac = tmp;
```

Durch diesen Befehl tauschen scheinbar der Stackpointer und das Arbeitsregister ihre Wert...Was ich mich jedoch fragen, warum tut man das und was bewirkt dieser Vorgang?


----------



## Kirby.exe (30. Jan 2020)

Meister @mihe7 schon wach Sensei? xD


----------



## mihe7 (30. Jan 2020)

LOL, ja, mihe7 bei der Arbeit...

Kurz: Ein Tauschen bewirkt... ein Tauschen  Warum macht man das? Ich sehe da verschiedene Gründe, wobei der Ausgangspunkt sein dürfte, dass im Akku ein Wert steht, der nicht verloren gehen darf.

1. Register bieten ja nur begrenzt Platz an. Ohne einen SWAP-Befehl müsstest Du temporär ein Register belegen. 
2. POP, PUSH und MOVE sind drei Befehle, ein SWAP nur einer

Ein Anwendungsbeispiel: auf dem Stack liegt ein Wert, der erhöht werden soll. Der Inhalt des Akkus darf nicht verloren gehen und der inc-Befehl funktioniert nur mit dem Akku. SWAP, INC, SWAP ist kürzer als POP rx, PUSH ac, MOVE ac, rx, INC, POP rx, PUSH ac, MOVE ac, rx


----------



## Kirby.exe (30. Jan 2020)

mihe7 hat gesagt.:


> LOL, ja, mihe7 bei der Arbeit...
> 
> Kurz: Ein Tauschen bewirkt... ein Tauschen  Warum macht man das? Ich sehe da verschiedene Gründe, wobei der Ausgangspunkt sein dürfte, dass im Akku ein Wert steht, der nicht verloren gehen darf.
> 
> ...


Was ist denn Arbeit?   Ja gut mit dem von dir genannten Beispiel macht es schon Sinn  Dankeee


----------



## Kirby.exe (31. Jan 2020)

@mihe7 irgendwie habe ich dennoch ein paar Frage Zeichen, wie würde es aussehen etwas von einer Speicherzelle ($ac) in eine irgendeine andere zu kopieren, also in Form einer Mikroprogrammzeile?

Hier sind mal ein paar weiter Infos zum Prozessor:


----------



## Meniskusschaden (31. Jan 2020)

Kirby_Sike hat gesagt.:


> irgendwie habe ich dennoch ein paar Frage Zeichen, wie würde es aussehen etwas von einer Speicherzelle ($ac) in eine irgendeine andere zu kopieren, also in Form einer Mikroprogrammzeile?


Welche Signale sind denn unklar?


----------



## Kirby.exe (31. Jan 2020)

Naja wie überhaupt etwas speichere


----------



## Meniskusschaden (31. Jan 2020)

Kirby_Sike hat gesagt.:


> Naja wie überhaupt etwas speichere


Du musst dir nur in der Grafik einen Weg von der Quelle zum Ziel suchen und dann die passenden Bitmuster für die Signale setzen, um diesen Weg zu schalten.


----------



## Meniskusschaden (31. Jan 2020)

Mal als Anfang: du willst aus der durch AC  referenzierten Speicherzelle einen Wert auslesen. Das RAM-Adressregister wird über das B-Latch befüllt. Also muss Signal B schon mal 0001 enthalten.


----------



## Kirby.exe (31. Jan 2020)

Meniskusschaden hat gesagt.:


> Mal als Anfang: du willst aus der durch AC  referenzierten Speicherzelle einen Wert auslesen. Das RAM-Adressregister wird über das B-Latch befüllt. Also muss Signal B schon mal 0001 enthalten.


Ahhhh jetzt verstehe ich es xD Danke


----------



## mihe7 (31. Jan 2020)

Und natürlich musst Du im Befehl die anderen Bits auch passend setzen (z. B. RD, MD, MA)


----------



## Kirby.exe (31. Jan 2020)

@mihe7 Könntest du mal drüber schauen? Ich bin mir nicht ganz sicher ob das überhaupt sinn macht, was ich hier aufgeschrieben habe  

```
Amux = 0, COND = 000, SHIFT = 00, ALU = 00, MD = 1, MA = 1, RD = 1, WR = 0, ENC = 0, C = 0000, A = 0000, B = 0000, ADDR = 00000000
Amux = 0, COND = 100, SHIFT = 00, ALU = 00, MD = 1, MA = 0, RD = 1, WR = 0, ENC = 0, C = 0000, A = 0000, B = 0000, ADDR = 00000001
Amux = 0, COND = 000, SHIFT = 00, ALU = 10, MD = 0, MA = 0, RD = 1, WR = 1, ENC = 1, C = 0100, A = 0010, B = 0000, ADDR = 00000000  # tir= $sp
Amux = 0, COND = 000, SHIFT = 00, ALU = 10, MD = 0, MA = 0, RD = 1, WR = 1, ENC = 1, C = 0010, A = 0001, B = 0000, ADDR = 00000000  # $sp= $ac
Amux = 0, COND = 000, SHIFT = 00, ALU = 10, MD = 0, MA = 0, RD = 1, WR = 1, ENC = 1, C = 0001, A = 0100, B = 0000, ADDR = 00000000  # $ac= tir
```


----------



## Kirby.exe (31. Jan 2020)

Das ist btw der SWAP Befehl, zumindest denke ich das xD


----------



## mihe7 (31. Jan 2020)

Ich denke mal, Du musst die Übertragung aus dem RAM in mehreren Schritten erledigen. 
1. b := sp, rd
2. warte, bis übertragung beendet
3. tir := memory-i/o-register + b (d. h. amux=1, b = 0, c = 4 (tir), enc=1, wr=1)


----------

