Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » CPU HALT Timing » Themenansicht

Autor Thread - Seiten: -1-
000
11.06.2018, 14:35 Uhr
Early8Bitz

Avatar von Early8Bitz

Hallo,

mal eine spezielle Frage zum Bustiming der Z80-/U880-CPU bei HALT.

So richtig habe ich zu meiner Frage nichts gefunden, aber schlagt
mich bitte nicht so toll, wenn ich's bei der Suche übersehen habe.

Wenn die CPU einen HALT-Befehl ausführt (Opcode 76h),
dann passiert ja lt. Manual der CPU Folgendes:

************
Whenever a software halt instruction is executed the CPU begins executing
NOP's until an interrupt is received (either a nonmaskable or a maskable
interrupt while the interrupt flip flop is enabled). The two interrupt
lines aresampled with the rising clock edge during each T4 stateas shown
in figure 4.0-7. If a non maskable interrupt has been received or a
maskableinterrupt has been received and the interrupt enable flip-flop is set,
then the halt state will be exited on the next rising clockedge.
The following cycle will then be an interrupt acknowledge cycle corresponding
to the type of interrupt that was received. If both are received at this time,
then the nonmaskable one will beacknowledged since it has highest priority.

The purpose of executing NOP instructions while in the halt state is
to keep the memory refresh signals active.

Each cycle in the halt state is a normal M1 (fetch) cycle except that the
data received from the memory is ignored and a NOP instruction is forced
internally to the CPU.

The halt acknowledge signal is active during this time to indicate that
the processor is in the halt state.
************

Das ist erst mal ziemlich eindeutig beschrieben.
Was mich jetzt interessiert, ist, welche Adresse liegt während der
M1-Zyklen, die zum Aufrecht erhalten des Memory Refreshs
während des HALTs ausgeführt werden, während T1 und T2 auf A0..A15.
Im Text steht nur, dass das, was da vom Speicher gelesen wird, ignoriert
und durch interne NOPs ersetzt wird.

Drei Möglichkeiten fallen mir da ein:
1.) Konstant die Adresse, auf der der HALT Befehl steht
2.) Konstant die Adresse unmittelbar nach dem Halt Befehl
3.) eine bei jedem M1 respektive internen NOP weitergezählte
Adresse.

Möglichkeit 2.) wäre damit zu erklären, dass ja nach Ausführung jedes Befehls
der PC auf die Adresse des nächsten zu lesenden Befehls zeigt.
Nach Ausführg des HALT Befehls steht der PC also auf PC(halt)+1.
Die Adresse unmittelbar nach dem HALT Befehl ist ja auch die Adresse,
die im Falle eines (den Halt beendenden Interrupts) beim Int-Ack. auf
den Stack gelegt und beim RETN oder RETI in den PC zurück geholt wird
und das Programm dort normal fortgesetzt wird.

Möglichkeit 3.) wäre eigentlich ähnlich zu erklären, aber mit der
Betrachtung, dass auch nach jedem intern ausgeführten NOP ja ein
Befehl ausgeführt wurde und somit gelten müsste PC=PC+1. Somit
würde auf dem Adressbus die Adresse fortlaufend hoch bzw. im
Kreis gezählt werden.

Hat das von Euch schon mal einer genauer gelesen oder mit einem
Logikanalyzer oder Oszi näher untersucht?
--
Gruß
Ralf

Dieser Beitrag wurde am 11.06.2018 um 14:36 Uhr von Early8Bitz editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
11.06.2018, 15:07 Uhr
Wusel_1



Bei einem Halt-Befehl steht der Adresszähler auf der Adresse, wo der Halt-Befehl gelesen wurde, denn nach dem "holen" des Bytes kommt automatisch der Refresh-Zyklus und dann wird erst die Adresse erhöht.
Der Refresh-Zyklus hat einen eigenen Adresszähler und beeinflußt damit nicht die Adresse des PC. Die Adresse des PC wird auch nicht auf den Stak gelegt. Somit läuft der M1-Zyklus ständig durch (T1 - T4) ohne das was an den Registern verändert wird (außer R-Register).
--
Beste Grüße Andreas
______________________________________
DL9UNF ex Y22MF es Y35ZF
JO42VP - DOK: Y43 - LDK: CE

*** wer glaubt hört auf zu denken ***

Dieser Beitrag wurde am 11.06.2018 um 15:18 Uhr von Wusel_1 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
11.06.2018, 16:47 Uhr
Early8Bitz

Avatar von Early8Bitz


Zitat:
Wusel_1 schrieb
Bei einem Halt-Befehl steht der Adresszähler auf der Adresse, wo der Halt-Befehl gelesen wurde, denn nach dem "holen" des Bytes kommt automatisch der Refresh-Zyklus und dann wird erst die Adresse erhöht.



Gelesen oder gemessen oder vermutet?

Im Z80-CPU-Manual steht aber bei der Beschreibung der Register:

************************************
SpecialPurposeRegisters
1. Program Counter (PC).
The program counter holds the 16-bit address
of the current instruction being fetched from memory. The PC is automatically
incremented after its contents have been transferred to the address lines.
When a program jump occurs the new value is automatically placed in the PC,
overriding the incrementer.
************************************

Lese ich so:
Der M1-Zyklus von der Adresse, auf der der HALT-Opcode steht beginnt.
Nach den Timing Diagrammen wird der PC mit der steigenden Flanke von T1
ausgegeben (durch entsprechende Signallaufzeiten etwas verzögert auf dem
Bus stabil anliegend). Danach wird der PC (lt. Manual) schon in Vorbereitung
des Lesens des nächsten Befehls oder eines Operanden (M2-Zyklus bei
Mehrbyte-Befehlen) incrementiert. Aber erst mit der steigenden Flanke von T3
wird der Speicherinhalt des Programmspeichers von der CPU übernommen.
Also "weiß" die CPU frühestens da (der Opcode muss ja auch noch
decodiert werden), dass es sich um einen HALT-Befehl handelt. Zu dem
Zeitpunkt ist aber intern der PC schon PC+1.

Also müsste nach Deiner Theorie die Wirkung des HALT-Befehls sein:
- Aktivieren des HALT-Pin (da sind wir uns einig)
- Decrementiere den PC (PC=PC-1)

Letzteres, damit beim nächsten M1 (dem Dummy-NOP) wieder die
Adresse des HALT-Befehls auf den Bus gegeben wird. Das ist allerdings
so nirgends beschrieben.

Die Frage ist also, wird das Autoincrement des PC in jedem M1 Zyklus
durch den HALT-Befehl für sich selbst aufgehoben und für die Dummy-Refresh-NOPs abgeschaltet;
oder rennt der PC Round Robin durch den Speicher. Wäre ja auch egal,
weil der sonstwo gelesene Befehl eh ignoriert und intern durch NOPs ersetzt wird.
--
Gruß
Ralf

Dieser Beitrag wurde am 11.06.2018 um 16:49 Uhr von Early8Bitz editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
11.06.2018, 18:13 Uhr
kaiOr

Avatar von kaiOr

Hallo,

habe es mal kurz auf dem LC80 getestet:

ADR: 2000h
DAT: 76h (HALT)
EX: 2000h

Die CPU lässt sich nicht nachträglich vom ausgeführten HALT-Befehl ablenken, wenn ich (beliebige) Datenleitungen der SRAMs auf LOW ziehe, d.h. sie wechselt tatsächlich auf interne Befehlsausführung und handhabt den HALT-Befehl nicht nur wie einen abgewandelten NOP.
Die oszillograph. Kontrolle des Signales /RD in Kombination mit A0....A15 ergibt A0 + A13 sind auf HIGH. D.h. der PC steht auf 2001h. Letzteres ergibt auch Sinn, da nach Rückkehr aus einer evtl. vorhandenen Interrupt-Routine mit RETI das Programm nicht mit HALT fortgesetzt werden soll.

MfG
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
11.06.2018, 18:15 Uhr
MS05



Moin allerseits,

aus der Erinnerung:

1. Von PC wird HALT gelesen, PC+1, HALT-pin wird aktiviert.

2. PC+1 wird gelesen, Befehl wird als NOP interpretiert und PC wieder auf PC+1 gesetzt (also goto 2.).

Wenn jetzt ein Interrupt kommt, kommt also PC+1 auf den Stack, und nach dem RET(I/N) wird wieder von PC+1 geholt und diesmal "richtig" ausgeführt.

Die "Kerninformation" aus dem Handbuch ist wohl, dass nach HALT und Abarbeiten des Interrupts, mit dem auf HALT unmittelbar folgendem Befehl weitergemacht wird. Das schließt aus, das der PC frei dreht (dann ginge es ja irgendwo weiter) und der PC kann auch nicht mehr auf den HALT zeigen, sonst käme man da ja nie von runter.

Grüße
Matthias
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
11.06.2018, 18:28 Uhr
Wusel_1




Zitat:
Gelesen oder gemessen oder vermutet?



Mir bekannt seit 1984. Seit dieser Zeit befasse ich ich mit dem Z80 - s. auch http://www.ac1-info.de/ --> AC1-2010


Der Halt-Befehl wird mit T2 ausgeführt. Danach kommt der Refresh (T3 + T4). Durch #76 ist der CDU bekannt, dass kein weiter Code für den Befehl gebraucht wird, also kein M2 ausgeführt wird! Bei jedem NOP wird immer die gleiche Adresse auf den Bus gelegt.
Durch den /NMI o. /INT wird im Takt 4 nach H dieses ausgewertet und dann bei Takt 4 nach L (Refresh - Ende) der Halte-Befehl aufgehoben und der PC weiter gestellt.
--
Beste Grüße Andreas
______________________________________
DL9UNF ex Y22MF es Y35ZF
JO42VP - DOK: Y43 - LDK: CE

*** wer glaubt hört auf zu denken ***
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
11.06.2018, 20:57 Uhr
Early8Bitz

Avatar von Early8Bitz

Vielen Dank.

Die Aussagen in <003>+<004> und <005> widersprechen sich.

<003><004>:
HALT steht auf Adresse 2000h, nach Ausführung des HALT ist der
PC durch das übliche Increment beim M1 auf 2001h gestellt.
Diese Adresse wird bei jedem folgenden M1 (ich nenne es mal
Dummy-Refresh-M1) des ignorierten Befehlslesens auf den
Adressbus gegeben. Die Dummy-Refresh-M1 Zyklen incrementieren den
PC also effektiv nicht mehr weiter.
Kommt irgendwann ein Interrupt, der uns aus dem HALT befreit,
wird beim IntAck der aktuelle PC, also die Adresse hinter dem HALT,
auf den Stack gelegt, beim RETI/RETN zurück in den PC geholt,
und das Programm läuft genau mit dem Befehl hinter dem Halt weiter.

<005>:

Zitat:
Wusel_1 schrieb
Bei jedem NOP wird immer die gleiche Adresse auf den Bus gelegt.


Richtig, immer die Gleiche. Aber nicht die Adresse, auf der der HALT-Befehl steht, sondern die
bereits um 1 erhöhte Adresse, also die des Befehls, der dem HALT folgt.

Zitat:

Durch den /NMI o. /INT wird im Takt 4 nach H dieses ausgewertet und
dann bei Takt 4 nach L (Refresh - Ende) der Halte-Befehl aufgehoben
und der PC weiter gestellt.


Nein, genau dann nicht. An dieser Stelle ist der PC schon "weiter gestellt"
wie die Ausführungen und die Oszillografische Kontrolle in <003>
zeigen. D.h. auch wenn in einem Rechner nie ein Interrupt ausgelöst wird,
würde das Befehlslesen der Dummy-Refresh-M1 Zyklen immer von der Speicher-
adresse hinter dem HALT Befehl ausgeführt.

Ich tendiere auf Grund der schlüssigen Erklärung und des praktischen
Nachweises zum Verhalten wie in <003>+<004> beschrieben.
--
Gruß
Ralf

Dieser Beitrag wurde am 11.06.2018 um 21:00 Uhr von Early8Bitz editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek