die Software zu unserer ALU

zurück

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.

x x
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:
TasteFunktion
ADRZahl A eingeben
DATZahl B eingeben
+aktuellen Wert um 1 erhöhen
-aktuellen Wert um 1 verringern
STSteuerwort eingeben
LDCn-Status ändern (an/aus)
EXM-status ändern (an/aus)
0 bis FEingabe der Zahl

Registerverwendung:

RegisterVerwendung
AA ist das arme Register, was für alle möglichen Taten herhalten muss, es hat keine besondere Funktion
BB ist eigentlich nur dafür da um etwas für eine gewisse Zeit anzuzeigen (DJNZ)
Cglobales Statusregister => gibt an, welche Zahl gerade eingegeben wird (00H für A, 01H für B und 10h für das Steuerwort)
IXIX verwenden wir für die Anzeige (braucht man ja für die DAK1)

Routinen- /Sprungmarkenübersicht / -erklärung:

Eigentlich erklärt sich das Programm von selbst, aber für unseren Lieblingsinformatiklehrer gibt es eine (natürlich) Übersicht der Einsprungmarken:
SprungmarkeFunktion
PIOINITSetzen der PIO-Betriebsart (Byteausgabe)
ABFRAGEAnzeigen der aktuellen Eingabe und warten auf Tastendruck
EXECUTEProzedur für den Fall, dass die "EXECUTE"-Taste gedrückt wurde, d.h. den aktuellen Status von "M" ändern
M1Hilfssprungmarke beim Ändern des "M"-Statusses => Einsprungmarke für "An"
M2Hilfssprungmarke beim Ändern des "M"-Statusses => Einsprungmarke für "Aus"
M3Einsprung zur Anzeige vom "M"-Status (für Schleife)
LOADProzedur für den Fall, dass die LOAD-Taste gedrückt wurde, d.h. den aktuellen Status von "Cn" ändern
M4Hilfssprungmarke beim ändern des "Cn"-Statusses => Einsprungmarke für "An"
M5Hilfssprungmarke beim ändern des "Cn"-Statusses => Einsprungmarke für "Aus"
M6Einsprung zur Anzeige vom "Cn"-Status (für Schleife)
STOREProzedur für den Fall, dass die STORE-Taste gedrückt wurde, d.h. auf die Eingabe des Steuerwprtes wechseln
ADDRESSProzedur für den Fall, dass die ADR-Taste gedrückt wurde, d.h. auf die Eingabe der Zahl A wechseln
DATAProzedur für den Fall, dass die STORE-Taste gedrückt wurde, d.h. auf die Eingabe der Zahl B wechseln
ZAHLWenn eine Zahlentaste gedrückt wurde, ist dies die Routine, die entscheidet was gerade eingegeben wurde (Zahl A/Zahl B/Steuerwort)
STINFalls "ZAHL" entschieden hat, dass das Steuerwort eingegeben wird, wird das hier geändert
M8Genauso Steuerwortanpassung wie "STIN", nur, dass hier die Rückholung vom Stack nicht drin ist => von STPLUS/STMINUS angesprungen
AINFalls "ZAHL" entschieden hat, dass Zahl A eingegeben wird, wird das hier geändert
M9Genauso "Zahl-A"-passung wie "STIN", nur, dass hier die Rückholung vom Stack nicht drin ist => von APLUS/AMINUS angesprungen
BINFalls "ZAHL" entschieden hat, dass Zahl B eingegeben wird, wird das hier geändert
M10Genauso "Zahl-B"-passung wie "STIN", nur, dass hier die Rückholung vom Stack nicht drin ist => von BPLUS/BMINUS angesprungen
PLUSFalls die Taste "PLUS" gedrückt wurde, entscheidet diese Routine was erhöht werden soll (Zahl A/Zahl B/Steuerwort)
MINUSFalls die Taste "MINUS" gedrückt wurde, entscheidet diese Routine was verringert werden soll (Zahl A/Zahl B/Steuerwort)
APLUSDiese Routine erhöht die Zahl A
PLUS10Diese 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.)
BPLUSFalls "ZAHL" entschieden hat, dass Zahl A eingegeben wird, wird das hier geändert
STPLUSDiese Routine erhöht das Steuerwort
AMINUSDiese Routine verringert die Zahl A
BMINUSDiese Routine verringert die Zahl B
STMINUSDiese Routine verringert das Steuerwort
MINUSFFDiese 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)
ANZAAnzeigewerte für die Zahl A
ANZBAnzeigewerte für die Zahl B
ANZSTAnzeigewerte für das Steuerwort
MONAnzeigewerte wenn M angeschaltet ist
MOFFAnzeigewerte wenn M ausgeschaltet ist
CNONwenn Cn angeschaltet ist
CNOFFwenn Cn ausgeschaltet ist
ZAHLAAblage der aktuellen Zahl A
STAblage des aktuellen Steuerworts
MSAblegen des aktuellen M-Zustands
CNAblegen des aktuellen Cn-Zustands
STOUTSteuerwort-Ausgabe-Abspeicherplatz für Kontrollzwecke
ANZUnsere Startanzeige "ALU"
DONEAnzeige, für wenn die Ausgabe funktioniert hat
OUTSTGenerierung des Ausgabesteuerwortes auf dem PIO
OUTZAHLGenerierung der Ausgabezahlen für den PIO
M7Hilfssprungmarke 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:
Steuerwort-Übersicht für die ALU 74181

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.

zurück