Code Verständniss Frage (z80/8080)

04/11/2012 19:05 Cyb0r#1
Hey,
Arbeite mich gerade in die Emulator Programmierung ein und hab hier ein Beispielcode vorliegen um etwas die Logik des Z80 Chips anzusehen;)
Jetzt habe ich hier allerdings eine verständnissfrage diesbezüglich weil ich diesen Vergleichsoperator noch nie benutzt & gesehen habe und nicht weiß was genau er tut :p

Code:
if(!(Z80._r.a & 255)) Z80._r.f |= 0x80;
1) Z80._r.f |= 0x80; <-- Lässt sich das so verstehen das er versucht 0x80 in z80._r.f zu packen, sofern nicht schon 0x80 drin steht? Oder wie darf man das verstehen :rolleyes:

2) if(!(z80._r.a & 255){} Da habe ich nun wirklich relativ keine Ahnung davon.. Was genau wird hier getan? Ist es mit einem
Code:
if(z80._r.a != "" && z80._r.a != 255){
}
zu vergleichen? Oder wie genau lässt sich dies verstehen :D

lg
04/11/2012 19:13 xNopex#2
[Only registered and activated users can see links. Click Here To Register...]
04/11/2012 19:39 Cyb0r#3
Also ich verstehe 1. nun so ->
WENN Flags in Binär NICHT "11111111" sind -> Zeroflag setzen (Z80._r.f |= 0x80)
Verstehe ich das richtig so?..

Mal Pseudocode..
Code:
ConvertDecToBin(Flag);
if(flag != 11111111){
SetZeroFlag(flag);
}
Müsste doch so stimmen..oder?
04/11/2012 19:51 xNopex#4
Nein. Wenn Z80._r.a gleich 00000000 ist, dann setze Z80._r.f zu 10000000.

false = 00000000;
255 = 11111111;
0x80 = 10000000;

Du kannst das so übersetzen:

Code:
if((Z80._r.a & 255) == false)
Also wenn (Z80._r.a & 255) false ist, also wenn (Z80._r.a & 255) == 00000000 ist. (Z80._r.a & 255) ist genau dann 00000000, wenn Z80._r.a == 00000000 ist. Denn AND ergibt 1, wenn beide 1 sind und 255 entspricht ja 11111111.
04/11/2012 20:03 Cyb0r#5
Das Zeroflag ist ja 0x80, sprich wenn (z80._r.a & 255) = 00000000 ist, dann wird der Zeroflag gesetzt (0x80) was dann ja 10000000 entspricht. Okay ich glaube ich hab es einigermaßen verstanden. Vielen Dank :)


Edit:
So das habe ich nun verstanden, nun stellt sich mir jedoch nur eine Frage ;)!
Wenn ich den Emulator Programmiere (z80/8080 Chip vom Gameboy) muss ich ja jede einzelne
Assembler Funktion nachprogrammieren.. und in diesen Funktionen muss ich immer jenach Funktion
einen Check machen, z.b auf Carryflag, Zeroflag usw - wo kann ich erkennen in welcher Funktion ich welche Checks machen muss? Steht dies irgendwo in einer Art Dokumentation,oder muss ich das selbst erkennen / rausfinden anhand der Funktion..?
04/12/2012 01:18 ms​#6
Code:
Z80._r.a & 255
Das hier führt dazu, dass nur die unteren 8 Bits von Z80._r.a betrachtet werden. Die If-Bedingung trifft also dann zu, wenn die unteren 8 Bits alle 0 sind.

Mit dem |=-Operator wird wie du schon bemerkt hast oft ein Bit gesetzt. Um den Quelltext übersichtlich zu halten schreibt man gerne sowas wie
Code:
Z80._r.f |= 0x80
als
Code:
Z80._r.f |= 1 << 7
Beides führt zu dem selben Ergebnis. Bei der letzteren Version sieht man allerdings auf den ersten Blick direkt, dass das 7. Bit gesetzt wird.

Quote:
Originally Posted by Cyb0r View Post
Edit:
So das habe ich nun verstanden, nun stellt sich mir jedoch nur eine Frage ;)!
Wenn ich den Emulator Programmiere (z80/8080 Chip vom Gameboy) muss ich ja jede einzelne
Assembler Funktion nachprogrammieren.. und in diesen Funktionen muss ich immer jenach Funktion
einen Check machen, z.b auf Carryflag, Zeroflag usw - wo kann ich erkennen in welcher Funktion ich welche Checks machen muss? Steht dies irgendwo in einer Art Dokumentation,oder muss ich das selbst erkennen / rausfinden anhand der Funktion..?
Wenn man nach "Z80 Instruction Set" googlet findet man einiges zu diesem Thema.

[Only registered and activated users can see links. Click Here To Register...]
04/12/2012 01:27 Cyb0r#7
Gibts diese Flag-Infos zu jeder Anweisung auch etwas Informativer / Übersichtlicher?
Komme damit nicht richtig klar^^