Autor Thema: Z80 – H-Flag  (Gelesen 5317 mal)

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« am: 01. April 2010, 00:01 »
Hallo,

derzeit beschäftige ich mich etwas mit dem Programmieren (bzw. dem Emulieren, um genau zu sein) eines Z80-Prozessors. Dieser hat ja ein Halfcarryflag, hier wäre jetzt meine Frage, was genau mit dem bei einer Subtraktion geschieht: Ein PDF-Dokument, das ich hier habe, sagt, dass es bei „No borrow from bit 4“ gesetzt wird, eine andere Quelle aus dem Internet besagt genau das Gegenteil. Beim x86-Prozessor ist es so, dass das Auxiliarycarryflag bei Borrow gesetzt wird.

Wie gesagt: Wird das Halfcarryflag gesetzt, wenn ein Borgen vom Bit 4 geschieht, oder dann eben nicht? Dies würde natürlich auch das Carryflag betreffen (ob es beim Borgen vom imaginären Bit 8 gesetzt wird).


In der Hoffnung, dass es hier einen Z80-Experten gibt,

Clici McXan

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 01. April 2010, 16:32 »
Hallo,

in den Details bin ich nicht drin,

aber ist das H-Flag nicht direkt das fünfte Bit? Also 0001 0000 ?

Genauso wie das Sign-Bit eigentlich nur das oberste Bit ist und das Carry das (oberste+1) Bit? Ich dachte, das wäre so einfach.

Die Bits sind dann jeweils bezogen auf das Ergebnis der letzten Rechnung.

Gruß,
Svenska

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #2 am: 01. April 2010, 18:07 »
Das H-Bit ist eher nicht das fünfte Bit, denn:
  0001 1000
+ 0000 1000
———————————
  0010 0000
(24 + 8 = 32)

Da hab ich eindeutig einen Übertrag vom Bit 3 nach Bit 4, im Ergebnis ist das Bit 4 aber 0. Andererseits:
  0000 1000
+ 0000 1000
———————————
  0001 0000
(8 + 8 = 16)

Hier habe ich auch einen Übertrag und im Ergebnis ist das Bit diesmal 1.


Also korrespondiert die Tatsache, ob ich einen Übertrag hab oder nicht, eher nicht mit dem Zustand des Bits (beim Carry ist das schon der Fall, aber beim Halfcarry eben nicht), soweit ich das sehe. :-)

(Und soweit ich das gehört habe, zeigt das Halfcarry ja an, ob ein Übertrag geschehen ist oder nicht)

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 08. April 2010, 17:46 »
Hallo XanClic,


Sieh Dir mal das AVR32-Architecture-Manual http://atmel.com/dyn/resources/prod_documents/doc32000.pdf an (3,1 MB). In Kapitel 8 sind alle Befehle erklärt und bei ADD und SUB findet man eine exakte Beschreibung wie die Flags "errechnet" werden. Das C-Flag ist dabei nur vom höchstwertigem Bit abhängig (auf einer 32Bit-CPU natürlich Bit 31). Da die unteren Bits nie von den oberen Bits abhängig sind (zumindest nicht bei ADD und SUB) sollte man nach dieser Methode für jede beliebige Bit-Position ein Carry-Flag bestimmen können.

Z.B. auf meiner CPU hab ich definiert das die Rechenbefehle immer das gesamte Register verarbeiten aber die Flags passend zur gewünschten Operanden-Größe gesetzt werden. Wenn ein Befehl nur 2 Bytes addieren will wird dann zwar eine vollwertige 32Bit-Rechenoperation ausgeführt aber die Flags spiegeln nur die unteren 8 Bit des Ergebnis wieder. Bis jetzt hab ich mit dieser Vorgehensweise noch keine Unstimmigkeiten gefunden.

Ich hoffe ich konnte Dir etwas helfen.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #4 am: 08. April 2010, 18:38 »
An sich gehe ich derzeit einfach davon aus, dass das H-Flag dem AF von x86 entspricht und das funktioniert soweit auch gut. :-)

Zitat von: erik.vikinger
Das C-Flag ist dabei nur vom höchstwertigem Bit abhängig (auf einer 32Bit-CPU natürlich Bit 31).
Eigentlich ist das C-Flag doch das imaginäre Bit 32, und somit von allen Bits abhängig (wenn ich 0xFFFFFFFF und 1 addiere, ist ja Carry gesetzt, wenn ich hingegen 0x80000000 und 1 addiere, ist es nicht gesetzt – in beiden Fällen sind die höchstwertigen Bits jedoch 1 bzw. 0), oder? Auf jeden Fall danke für den Link! :-)

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 08. April 2010, 18:59 »
Hallo,


Eigentlich ist das C-Flag doch das imaginäre Bit 32, und somit von allen Bits abhängig (wenn ich 0xFFFFFFFF und 1 addiere, ist ja Carry gesetzt, wenn ich hingegen 0x80000000 und 1 addiere, ist es nicht gesetzt – in beiden Fällen sind die höchstwertigen Bits jedoch 1 bzw. 0), oder?
Ich meinte von allen oberen Bits, nicht nur von den 2 Operanden sondern auch vom Ergebnis.
Die Art wie Atmel das Problem angeht finde ich jedenfalls gut. Ich hab das auch in meinem Simulator übernommen, so kann ich die Flags ermitteln ohne irgendwelche Assembler-Tricks o.ä. zu benötigen.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

 

Einloggen