-
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!newsgate.m10r2.onet.pl!niu
sy.onet.pl
From: "Piotrek" <p...@p...onet.pl>
Newsgroups: pl.comp.programming
Subject: Do osób znających instrukcje procesora Z80
Date: Sat, 18 Jun 2011 20:13:05 +0200
Organization: Onet.pl
Lines: 80
Sender: n...@n...onet.pl
Message-ID: <5...@n...onet.pl>
NNTP-Posting-Host: newsgate.m10r2.onet.pl
Mime-Version: 1.0
Content-Type: text/plain; charset="iso-8859-2"
Content-Transfer-Encoding: 8bit
X-Trace: newsgate.onet.pl 1308420785 31305 213.180.150.14 (18 Jun 2011 18:13:05 GMT)
X-Complaints-To: n...@o...pl
NNTP-Posting-Date: Sat, 18 Jun 2011 18:13:05 +0000 (UTC)
Content-Disposition: inline
X-Mailer: http://niusy.onet.pl
X-Forwarded-For: 62.141.227.102, 10.174.28.54
X-User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET
CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Xref: news-archive.icm.edu.pl pl.comp.programming:191025
[ ukryj nagłówki ]Parę miesięcy temu nosiłem się z zamiarem napisania emulatora jakiejś
rzeczywistej maszyny, wybór padł na ZX Spectrum i procesor Z80. Od jakiegoś
czasu wcielam swój plan w życie, tzn. pieczołowicie emuluję kolejne instrukcje
procesora i potwierdziło się to, czego się obawiałem-nie rozumiem jak
instrukcje odejmowania oddziałują na pewne flagi (tzn. dlaczego oddziałują
inaczej niż mi się zdaje). Z manuali i stron, którymi się posiłkuję, można
wyczytać między wierszami, że odejmowanie z technicznego punktu widzenia
niczym nie różni się od dodawania, tzn. procesor Z80 operację odejmowania
wewnętrznie i tak konwertuje sobie do operacji dodawania, jedynie stan flagi N
odróżnia te działania od siebie, cała arytmetyka odbywa się w kodzie
uzupełnieniowym do 2. Coś mnie jednak tknęło i poprosiłem na pewnym
anglojęzycznym forum o zweryfikowanie moich przypuszczeń co do wyników trzech
przykładowych działań i okazało się, że we wszystkich trzech przypadkach się
myliłem (w każdym wynik był dokładnie przeciwny niż sądziłem).
Załóżmy, że ograniczymy rozważania do operacji na rejestrach 8-bitowych. Moje
wątpliwości dotyczyły zachowania flag C (przeniesienia, ustawianej gdy nastąpi
przeniesienie z bitu 7, tzn. wynik nie zmieści się na 8 bitach) i H
(półprzeniesienia, ustawianej gdy dojdzie do przeniesienia z bitu 3 na 4).
Rozpatrywane były następujące operacje:
1) działanie 3 - 5 (w praktyce załadowanie pierwszej wartości do rejestru A i
wykonanie instrukcji SUB 5).
Moim zdaniem nie dojdzie tu do półprzeniesienia, zdaniem mojego dyskutanta-tak.
Oto jak rozumowałem:
3 - 5 to dla procesora de facto 3 + (-5), 3 to bitowo 00000011,
-5 to 11111011 (działamy w U2).
Zapisując to jedno pod drugim i rachując pisemnie od prawej do lewej (od
najmłodszego bitu do najstarszego) i zakładając, że procesor liczy to tak
samo, dostaję kolejno:
- na pozycji 0 sumę 1 + 1 -> mamy przeniesienie z bitu 0 na 1
- na pozycji 1 sumę 1 + 1 + 1 (przeniesienie) -> mamy przeniesienie z 1 na 2
- na pozycji 2 sumę 0 + 0 + 1 (przeniesienie) -> brak przeniesienia z 2 na 3
Ponieważ ostatnie działanie nie wygenerowało nowego przeniesienia, a dalej nie
mamy już sytuacji, w której sumowalibyśmy dwie jedynki, nie ma bata, żeby
wygenerowało nam się nowe przeniesienie, w szczególności przeniesienie z bitu
3 na 4. Zdaniem mojego dyskutanta jednak występuje. Gdzie tu błądzę?
2) działanie 11 - (-5)
Tu według mojego rozumowania procesor tłumaczy sobie to odejmowanie na
dodawanie 11 + 5. Dalej, postępując analogicznie jak w przypadku 1), widzę jak
byk przeniesienie z bitu 3 na 4, którego zdaniem mojego dyskutanta nie ma.
Wygląda na to, że błądzę tak, jak w przypadku 1), tylko nie wiem dlaczego.
3) Postawiłem tezę, że odjęcie czegokolwiek od 0 nie może spowodować żadnego
przeniesienia. Mój argument: skoro dla Z80 0 - cokolwiek to w rzeczywistości
0 + (- cokolwiek), a 0 bitowo to po prostu 00000000, nie możemy przy
którejkolwiek parze bitów dostać sumu większej od 1, więc nie ma mowy o
przeniesieniu na którejkolwiek pozycji. Mój dyskutant oczywiście stwierdził,
że mylę się po raz trzeci i odjęcie od 0 czegokolwiek poza 0 wygeneruje i
przeniesienie, i półprzeniesienie. Za prawdziwością tego, co mówi, przemawia
niestety też jedna z oficjalnych dokumentacji, która w odniesieniu do
instrukcji NEG (która jest właśnie odjęciem wartości rejestru A od 0 i
wstawieniem do tegoż rejestru wyniku tego działania) mówi, że flaga C ma być
ustawiona zawsze z wyjątkiem sytuacji, w której przed wykonaniem instrukcji
rejestr A zawierał wartość 0.
Zastanawiające jest to, że mój tok rozumowania we wszystkich przypadkach
prowadzi do stwierdzenia będącego negacją stanu faktycznego. Wygląda na to, że
nie myślę źle, tylko moje rozumowanie opiera się na jakiejś błędnej
przesłance. Niestety, mojemu dyskutantowi nie chciało się już wczytywać w mój
tok myślenia prowadzący do złych wyników, mam nadzieję, że komuś z Was zechce
się wyprowadzić mnie z błędu. Odsyłanie mnie do literatury raczej w niczym tu
nie pomoże-przeglądam równolegle kilka manuali i właściwie żaden nie rozwiewa
moich wątpliwości. Owszem, da się w nich znaleźć przykłady na to jak operacje
dodawania wpływają na stan poszczególnych flag, ale o odejmowaniu praktycznie
się nie wspomina, ewentualnie sugeruje się tylko, że przy odejmowaniu "jest
tak samo". Wygląda na to, że jednak nie do końca, dlatego też bardzo proszę
Was o wytknięcie mi błędów w rozumowaniu.
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Następne wpisy z tego wątku
- 18.06.11 18:47 Sebastian Biały
- 18.06.11 18:54 Bronek Kozicki
- 18.06.11 23:07 Piotrek
- 18.06.11 23:11 Piotrek
- 19.06.11 07:56 Bronek Kozicki
- 19.06.11 18:50 Mariusz Kruk
- 19.06.11 21:06 Artur Muszyński
Najnowsze wątki z tej grupy
- Xiaomi [Chiny - przyp. JMJ] produkuje w całkowitych ciemnościach i bez ludzi
- Prezydent SZAP/USONA Trump ułaskawił prezydenta Hondurasu Hernandeza skazanego na 45 lat więzienia
- Rosjanie chwalą się prototypem komputera kwantowego. "Najważniejszy projekt naukowy Rosji"
- A Szwajcarzy kombinują tak: FinalSpark grows human neurons from stem cells and connects them to electrode arrays
- Re: Najgorszy język programowania
- NOWY: 2025-09-29 Alg., Strukt. Danych i Tech. Prog. - komentarz.pdf
- Na grupie comp.os.linux.advocacy CrudeSausage twierdzi, że Micro$lop używa SI do szyfrowania formatu dok. XML
- Błąd w Sofcie Powodem Wymiany 3 Duńskich Fregat Typu Iver Huitfeldt
- Grok zaczął nadużywać wulgaryzmów i wprost obrażać niektóre znane osoby
- Can you activate BMW 48V 10Ah Li-Ion battery, connecting to CAN-USB laptop interface ?
- We Wrocławiu ruszyła Odra 5, pierwszy w Polsce komputer kwantowy z nadprzewodzącymi kubitami
- Ada-Europe - AEiC 2025 early registration deadline imminent
- John Carmack twierdzi, że gdyby gry były optymalizowane, to wystarczyły by stare kompy
- Ada-Europe Int.Conf. Reliable Software Technologies, AEiC 2025
- Linuks od wer. 6.15 przestanie wspierać procesory 486 i będzie wymagać min. Pentium
Najnowsze wątki
- 2026-01-29 KSeF - 13 wątpliwości
- 2026-01-29 A ja się pochwalę
- 2026-01-29 Warszawa => Mid/Senior IT Recruiter <=
- 2026-01-29 Warszawa => Senior Java Developer <=
- 2026-01-29 Warszawa => IT Recruiter <=
- 2026-01-28 Degradacja
- 2026-01-28 Wysoki Sąd poinstruował czego unikać wyzywając Owsiaka "Równiejszego"
- 2026-01-28 Białystok => Solution Architect (Workday) - Legal Systems <=
- 2026-01-28 Białystok => Preseles Inżynier (background baz danych) <=
- 2026-01-28 Wrocław => Konsultant wdrożeniowy ERP <=
- 2026-01-28 Łódź => Microsoft Engineer <=
- 2026-01-28 Białystok => Tester manualny <=
- 2026-01-27 Tradycja ciągania posłów po sądach za wystąpienia w Sejmie będzie kontynuowana [Lepper 2]
- 2026-01-27 Pierwszy raz sprzedano więcej samochodów zeeletryfikowanych niż ice
- 2026-01-27 Elektryczny Kałasznikow




Jak kupić pierwsze mieszkanie? Eksperci podpowiadają