Nun, mein jetziger CPU hat kein richtige Jump-funktion. Man kann kein sprungziel angeben, es wird nur entweder eine 1 oder ne 0 im flagregister geschrieben...Daher hab ich mir überlegt einen einen Cpu zubauen, damit er wieder verwendbar wird soll der I/O ports bekommen, hab mir schon im mathe-unterricht was ausgetüftelt
:
1 ich geh mal davon aus das wir 16 register haben werden, also ein instuktion-set mit 8 argument-bits, und 2x 4 bit registerbits
00000000|0000|0000|0000000000000000
Argument RX RX NUM
2 Nun jetzt zum I/O port:
2.1 Es gibt 4 I/O gruppen die jeweils 8 I/O ports zusammenfassen.
Ein I/O port kann endweder ein ausgang oder ein eingang sein aber niemals beides.
Man kann die Ports über einen Opcode zu einem aus- oder einem Eingang machen, dazu später mehr
.
2.2 Nun mal zu den befehlen:
Man steuert nicht jeden I/O port an sondern seine Gruppe.
Jeder Befehl für die I/O ports sind in etwa gleich auf gebaut:
00000000|0000|0000|00000000|00000000|
Argument RX/Gruppe Num Die Ports die aktiviert werden
/\
|
Die Gruppenbits und die RX bits, wechseln je nach Befehl.
2.3 Nun jetzt mal ein Beispiel:
2.3.1 Eingang-Ports
Wir haben in der portgruppe "A" die ersten 7 bits als eingang gesetzt(für ne tastatur) und der letzte als Ausgang(löschbit für die Tastatur).
Nun wenn wir jetzt Alle 7 bits einlesen möchten wählen wir zunächst die Gruppe aus (also 0001 ) , dann die bits die wir einlesen möchten (11111110) zudem braucht man ein register wohin die daten kommen(wir nehmen mal gx).
der dazugehörige Opcode sieht dan so aus:
00000000|0011|0001|00000000|11111110
Argument RX Grup. Num Aktivierte Bit's
Eventuell kann man das ganze so bauen das man mehrende gruppen auswählen kann, das ganze wird aber dann viel komplizierter.
2.3.2 Ausgänge:
So wir haben jetzt in Gruppe B 8 bits als Ausgänge markiert(7 für ne Console und der letzte ist der löschbit).
Wir wollen Jetzt mal nen Coolen Buchstaben Ausgeben dazu wählen wir mal unsere Gruppe aus(0010) dann setzen wir der Buchstabe im Num-Feld "10110100" und dann noch die bit's die aktiviert werden sollen (11111110)
Im Opcode sieht das ganze jetzt so aus:
00000000|0010|0000|10110100|11111110
Argument Grup. RX Num Ausgewählte Bit's
Wir können aber auch ein register Wählen aus dem dann die bits kommen.
Auch ist es möglich beides zu verwenden, also RX und Num-feld, in diesem Fall haben die Num-Bit's vorrang.
Muss aber noch ne lösung für ein paar probleme finden.
2.4 I/O Ports als Ein- bzw. als ausgänge zu markieren.
Nun wir nehmen wieder das Beispiel mit der Konsole, wenn wir die ersten 7 bits als ausgänge setzen wollen müssen wir zunächnächt die Bits auswählen(11111110) und dann die Gruppe(0010)
00000000|0010|0000|00000000|11111110|
so jeder der genannten Opcodes haben ein eigenes argument, die müssen wir aber noch bestimmen.
Nun was hält ihr von der Idee bzw. gibt es bessere ?