Dies ist ein Beispielproblem in meinem Buch. Unter der Annahme, dass Pin 5 von Port 4 mit einem Verstärker verbunden ist, der einen Lautsprecher ansteuert, wird die Lösung wie folgt angegeben:
Die Frequenz des mittleren C ist
Das Programm zur Erzeugung einer Rechteckwelle mit dieser Periode lautet:
LOOP1: OUT 4H ;Send bit to speaker
MVI C,86H ;Set count to 134
LOOP2: DCR C ;Count down
JNZ LOOP2 ;Test count
CMA ;Reset bit 5
NOP ;Fine tune
NOP ;Fine tune
JMP LOOP1 ;Go for next half cycle
Die Anzahl der T-Zustände ist gegeben als OUT (10), MVI (7), DCR (4), JNZ (10, falls wahr, sonst 7), CMA (4), NOP (4), JMP (10).
Mit einer Taktfrequenz von 1 MHz läuft LOOP2 (für Halbzyklen) 1912 Mikrosekunden, was nahe genug ist. LOOP1 sollte erneut ausgeführt werden und das Komplement von dem senden, was zuvor in Bit 5 von Port 4 war. Aber ich denke, das ist nicht der Fall.
Wenn LOOP2 endet, hat der Akku 00H vom C-Register übrig. CMA ändert den Akku in FFH. NOP und JMP ändern den Akku nicht. Dann iteriert der LOOP1 für den nächsten Halbzyklus, OUT sendet den Akkumulatorinhalt jedes Mal an Port 4, dh FFH, dessen Bit 5 jedes Mal 1 ist. Es gibt also keine Rechteckwelle, sondern nur ein hohes Signal. Wie erzeugt es dann ein mittleres C?
Antworten:
DCR C
dekrementiert das C-Register und setzt Flags; Es hat keinen Einfluss auf den Akku (auch bekannt als A-Register). Der einzige Befehl in dieser Sequenz, der den Akkumulator betrifft, ist derCMA
. Somit wird bei jedem DurchgangLOOP1
der Akkumulator ergänzt - Bit 5 hoch in einem Zyklus und niedrig in dem nächsten.Viele Quellen, einschließlich des 8085-Datenblattes, beschreiben die 8080/8085-ALU als direkt am Akku arbeitend, dies ist jedoch eine übermäßige Vereinfachung. Wie in diesem Artikel von Ken Shirriff beschrieben , verfügt die ALU über zwei temporäre Register:
Für die
DCR
Anweisungen hält die ACT eine Konstante, der TMP empfängt den aktuellen Inhalt des Operandenregisters und eineADD
Operation wird ausgeführt; dennDCR C
der Akku bleibt unberührt:Es gibt nur einen einzigen Satz von Flags im 8080;
DCR
wirkt sich auf die Flags Zero, Sign, Parity und Aux-Carry aus.quelle
DCR C
erste kopiert den Inhalt des C-Registers in den Akkumulator, dekrementiert ihn und speichert die Daten dann wieder im C-Register. Weil die ALU nur am Akku arbeiten kann. AußerdemJNZ
ist ein ALU-Flag, das nur den Akkumulator überprüft. WennDCR C
der Akku nicht betroffen ist, wird derJNZ LOOP2
Befehl für immer ausgeführt.JNZ
also: "springen, wenn die zuletzt ausgeführte arithmetische Anweisung nicht zu 0 geführt hat". In Ihrem Fall war die letzte arithmetische Anweisung dannDCR C
, also werden die Flags gemäß dem Ergebnis dieser Anweisung gesetzt. Beim Testen der Flags ist außer dem Statusregister kein anderes Register beteiligt.