eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingDo osób znających instrukcje procesora Z80Do osób znających instrukcje procesora Z80
  • Data: 2011-06-18 18:13:05
    Temat: Do osób znających instrukcje procesora Z80
    Od: "Piotrek" <p...@p...onet.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie 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 -&gt; mamy przeniesienie z bitu 0 na 1
    - na pozycji 1 sumę 1 + 1 + 1 (przeniesienie) -&gt; mamy przeniesienie z 1 na 2
    - na pozycji 2 sumę 0 + 0 + 1 (przeniesienie) -&gt; 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 &quot;jest
    tak samo&quot;. 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

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: