die Software zu unserer ALU
Die Dokumentation der Hardware finden Sie hier.
Am 29. Mai 2007 (man höre und staune - an einem Schulfreien Tag (=Ferien)) war es endlich soweit, wir haben uns hingesetzt und das Programm zur ALU-Schaltung geschrieben. Es funktionierte beim ersten Test auch (fast) fehlerfrei. Bei der Problemsuche mussten wir den LC-80 natürlich resetten, was normalerweise kein Problem darstellt, doch leider hat unser LC-80, vermutlich aufgrund der nicht ganz stabilen Stromversorgung, den kompletten RAM-Bereich (zumindest bis 23FFh) mit FFh überschrieben und "Plopp" war die reichliche Stunde tippen für'n Arsch.
Doch nun zu den wichtigen Dingen des Projektes:
Unser Programm befindet sich in einer Endlosschleife, das heißt es gibt keinen Zustand "fertig" oder "zu Ende".
Der zentrale Punkt ist die Anzeige- und Abfrageroutine auf Basis der DAK1 und von dieser aus werden dann alle Dinge ausgeführt, die man so braucht oder auch nicht.
![]() |
![]() |
Struktogramm unseres LC-80 Programms zu ALU-Ansteuerung | Struktogramm unseres LC-80 Programms zu ALU-Ansteuerung zum Download (Strukted32-Datei) |
Das Aside-Assembler-Listing :
Das passen wir zwar ständig an, aber ich versuche immer die aktuellste Version
hier stehen zu haben.
Die Aside-Assembler-Datei:
unser komplettes Projekt in der Version des Aside-Assemblers kann man hier herunterladen.
Das Binary-File:
Das passen wir zwar ständig an, aber ich versuche immer die aktuellste Version
hier stehen zu haben.
Wie funktioniert das Ganze aber nun?
Eigentlich ist das ganz einfach, wenn man weiß welche Taste welche Funktion hat:
Taste | Funktion |
ADR | Zahl A eingeben |
DAT | Zahl B eingeben |
+ | aktuellen Wert um 1 erhöhen |
- | aktuellen Wert um 1 verringern |
ST | Steuerwort eingeben |
LD | Cn-Status ändern (an/aus) |
EX | M-status ändern (an/aus) |
0 bis F | Eingabe der Zahl |
Register | Verwendung |
A | A ist das arme Register, was für alle möglichen Taten herhalten muss, es hat keine besondere Funktion |
B | B ist eigentlich nur dafür da um etwas für eine gewisse Zeit anzuzeigen (DJNZ) |
C | globales Statusregister => gibt an, welche Zahl gerade eingegeben wird (00H für A, 01H für B und 10h für das Steuerwort) |
IX | IX verwenden wir für die Anzeige (braucht man ja für die DAK1) |
Eigentlich erklärt sich das Programm von selbst, aber für unseren Lieblingsinformatiklehrer gibt es eine (natürlich) Übersicht der Einsprungmarken:
Sprungmarke | Funktion |
PIOINIT | Setzen der PIO-Betriebsart (Byteausgabe) |
ABFRAGE | Anzeigen der aktuellen Eingabe und warten auf Tastendruck |
EXECUTE | Prozedur für den Fall, dass die "EXECUTE"-Taste gedrückt wurde, d.h. den aktuellen Status von "M" ändern |
M1 | Hilfssprungmarke beim Ändern des "M"-Statusses => Einsprungmarke für "An" |
M2 | Hilfssprungmarke beim Ändern des "M"-Statusses => Einsprungmarke für "Aus" |
M3 | Einsprung zur Anzeige vom "M"-Status (für Schleife) |
LOAD | Prozedur für den Fall, dass die LOAD-Taste gedrückt wurde, d.h. den aktuellen Status von "Cn" ändern |
M4 | Hilfssprungmarke beim ändern des "Cn"-Statusses => Einsprungmarke für "An" |
M5 | Hilfssprungmarke beim ändern des "Cn"-Statusses => Einsprungmarke für "Aus" |
M6 | Einsprung zur Anzeige vom "Cn"-Status (für Schleife) |
STORE | Prozedur für den Fall, dass die STORE-Taste gedrückt wurde, d.h. auf die Eingabe des Steuerwprtes wechseln |
ADDRESS | Prozedur für den Fall, dass die ADR-Taste gedrückt wurde, d.h. auf die Eingabe der Zahl A wechseln |
DATA | Prozedur für den Fall, dass die STORE-Taste gedrückt wurde, d.h. auf die Eingabe der Zahl B wechseln |
ZAHL | Wenn eine Zahlentaste gedrückt wurde, ist dies die Routine, die entscheidet was gerade eingegeben wurde (Zahl A/Zahl B/Steuerwort) |
STIN | Falls "ZAHL" entschieden hat, dass das Steuerwort eingegeben wird, wird das hier geändert |
M8 | Genauso Steuerwortanpassung wie "STIN", nur, dass hier die Rückholung vom Stack nicht drin ist => von STPLUS/STMINUS angesprungen |
AIN | Falls "ZAHL" entschieden hat, dass Zahl A eingegeben wird, wird das hier geändert |
M9 | Genauso "Zahl-A"-passung wie "STIN", nur, dass hier die Rückholung vom Stack nicht drin ist => von APLUS/AMINUS angesprungen |
BIN | Falls "ZAHL" entschieden hat, dass Zahl B eingegeben wird, wird das hier geändert |
M10 | Genauso "Zahl-B"-passung wie "STIN", nur, dass hier die Rückholung vom Stack nicht drin ist => von BPLUS/BMINUS angesprungen |
PLUS | Falls die Taste "PLUS" gedrückt wurde, entscheidet diese Routine was erhöht werden soll (Zahl A/Zahl B/Steuerwort) |
MINUS | Falls die Taste "MINUS" gedrückt wurde, entscheidet diese Routine was verringert werden soll (Zahl A/Zahl B/Steuerwort) |
APLUS | Diese Routine erhöht die Zahl A |
PLUS10 | Diese Routine passt die letzte Zahl an, wenn diese die maximalen 4-Bit der ALU überschreitet (wenn man 0FH um eins incrementiert, dann wird's 10H, soll aber 00H werden.) |
BPLUS | Falls "ZAHL" entschieden hat, dass Zahl A eingegeben wird, wird das hier geändert |
STPLUS | Diese Routine erhöht das Steuerwort |
AMINUS | Diese Routine verringert die Zahl A |
BMINUS | Diese Routine verringert die Zahl B |
STMINUS | Diese Routine verringert das Steuerwort |
MINUSFF | Diese Routine passt die letzte Zahl an, wenn diese die maximalen 4-Bit der ALU überschreitet (Wenn man 00H um eins decrementiert, dann wird's FFH, es darf aber nur 0Fh) |
ANZA | Anzeigewerte für die Zahl A |
ANZB | Anzeigewerte für die Zahl B |
ANZST | Anzeigewerte für das Steuerwort |
MON | Anzeigewerte wenn M angeschaltet ist |
MOFF | Anzeigewerte wenn M ausgeschaltet ist |
CNON | wenn Cn angeschaltet ist |
CNOFF | wenn Cn ausgeschaltet ist |
ZAHLA | Ablage der aktuellen Zahl A |
ST | Ablage des aktuellen Steuerworts |
MS | Ablegen des aktuellen M-Zustands |
CN | Ablegen des aktuellen Cn-Zustands |
STOUT | Steuerwort-Ausgabe-Abspeicherplatz für Kontrollzwecke |
ANZ | Unsere Startanzeige "ALU" |
DONE | Anzeige, für wenn die Ausgabe funktioniert hat |
OUTST | Generierung des Ausgabesteuerwortes auf dem PIO |
OUTZAHL | Generierung der Ausgabezahlen für den PIO |
M7 | Hilfssprungmarke für die Anzeige (Schleife) |
Die Ausgabe funktioniert über einen dritten PIO - dessen 16 Kanäle. Hierbei werden die Zahlen A und B auf Kanal A und Steuerwort und der Cn-Status und der M-Status auf Kanal B ausgegeben. von Kanal B werden Bit6 und Bit7 nicht verwendet (siehe Quelltext ganz unten).
Die Steuerworte zum Betreiben der ALU:
Um der ALU mitzuteilen, was sie eigentlich tun soll benötigt sie Stuerworte.
Diese kann man aus dieser Übersicht ableiten:
Für den "Laien" dieser Schaltung möchte ich diese Übersicht noch einmal in einer Form angeben, wie man sie dann für den LC-80 benötigt, wobei das Steuerwort HEX die niedere HEX-Zahl und M/Cn die höherwertige HEX-Zahl darstellen, z.B. für (A PLUS B) ergibt sich, da Cn auf H und M auf L und das Steuerwort 1001B das LC-80 fertige Steuerwort "29H". Die Ausgabe als 8-Bit-Zahl entfällt bei Benutzung unserer Software, da wir das Steuerort aus dem Cn und dem M-Status, sowie dem eingegebenen Steuerwort generieren. Beispiel: Eingabe von "09" als Steuerwort und solange auf die "EX"-Taste drücken, bis "M off" im Display steht und solange die "LD"-Taste drücken, bis "Cn on" im Display steht und dann einfach ausgeben und man erhält das richtige Steuerwort für F = A PLUS B
Steuerwort binär | Steuerwort HEX | logische Funktion (M=H, Cn ist beliebig) | arithmetische Funktion (M=L, Cn=H; sollte Cn=L sein, dann das Ergebnis PLUS 1) |
---|---|---|---|
0000B | 0H | F = NICHT(A) | F = A |
0001B | 1H | F = NICHT(A ODER B) | F = A ODER B |
0010B | 2H | F = NICHT(A) UND B | F = A ODER NICHT(B) |
0011B | 3H | F = 0 | F = MINUS 1 |
0100B | 4H | F = NICHT(A UND B) | F = A PLUS (A UND NICHT(B)) |
0101B | 5H | F = NICHT(B) | F = (A ODER B)PLUS(A UND NICHT(B)) |
0110B | 6H | F = A EXOR B | F = A MINUS B MINUS 1 |
0111B | 7H | F = A UND NICHT(B) | F = (A UND NICHT(B)) MINUS 1 |
1000B | 8H | F = NICHT(A) ODER B | F = A PLUS (A UND B) |
1001B | 9H | F = A EXNOR B | F = A PLUS B |
1010B | AH | F = B | F = (A ODER NICHT(B)) PLUS (A UND B) |
1011B | BH | F = A UND B | F = (A UND B) MINUS 1 |
1100B | CH | F = 1 | F = A PLUS A |
1101B | DH | F = A ODER NICHT(B) | F = (A ODER B) PLUS A |
1110B | EH | F = A ODER B | F = (A ODER NICHT(B)) PLUS A |
1111B | FH | F = A | F = A MINUS 1 |
Und zum Schluss noch einmal der Link zur Dokumentation der Hardware.