Autor ::Roman Bórik Poslaná :: 18.07.2017 22:27:34 Predmet ::Re: Počitadlo taktů CPU v emulátoru
Všetko je asi/nejako/celkom inak... A som z toho rozhodený a "mierne" demotivovaný :-(
Spomínaný program Tomáša Pecinu (mnou mierne upravený a učesaný) timing-pmd-full.ptp timing-pmd-full.a8080
dáva rozdielne výsledky na reálnom PMD 85, v RM-TEAM Emulátore a aj v ePMD85 Zdeňka Šestáka.
Na reálnom PMD 85 som to spúšťal na modeloch 2A a 3 a oba dávali identický výsledok.
Určenie trvania inštrukcie nie je exaktné pre jednotlivú inštrukciu a je riešené takto:
mvi a,0
out c1
Na začiatku sa "vynuluje" časovač a vykoná sa NOP alebo MOV B,B (pre), čím sa testovaná inštrukcia posúva na párny/nepárny takt. Vykoná sa samotná inštrukcia (ins) a ak je to 1 alebo 2 bytová inštrukcia, tak sa za ňou vykonajú 2 alebo 1 NOP (post). U inštrukcií CALL a RST k tomu patrí aj "návrat" z volanej rutiny. Nakoniec sa prečíta hodnota čítača.
Získaná hodnota tak zahŕňa (pre) inštrukciu, testovanú inštrukciu, dodatočné NOPy a zrejme aj "časť" IN/OUT čítača. To by ale asi ani nevadilo.
Podstatné je, že tie rozdiely hodnôt emulátorov od originálu sú často diametrálne odlišné. Takže je pravdepodobné, že jednak je chyba v definícii Taktov pre jednotlivé inštrukcie a (možno hlavne) v emulácii i8253.
Naviac mám obavy, že pri nulovaní čítača a čítaní jeho obsahu, nie je úplne jasné, v ktorom takte pri vykonávaní IN/OUT sa daná operácia udeje. Teoreticky by to malo byť pred posledným taktom (alebo počas), ale tie hodnoty tomu nejako nezodpovedajú, alebo sa na to pozerám úplne zle.
A vôbec, keďže emulátor (aspoň ten náš) inkrementuje počítadlo taktov naraz po vykonaní inštrukcie, tak prakticky nemôže čítanie hodnoty čítača vrátiť reálnu hodnotu...
Suma-sumárum, ak budem brať rozdiely výsledkov testovacieho programu vážne, tak môžem konštatovať, že emulátor "časuje" inštrukcie nesprávne...
Správa
Autor ::Zdeněk Poslaná :: 19.07.2017 08:23:24 Predmet ::Re: Počitadlo taktů CPU v emulátoru
Jak jsem zkoušel měřit instrukce podle i8253 (na reálném PMD):
nejprve jsem změřil, kolik si vezme zbytek IN/OUT:
xra a
out c1
in c1
mov b,a
Tento rozdíl jsem pak odečítal od vkládaných instrukcí:
xra a
out c1
nop ; testovaná instrukce
in c1
sub b
Zkoušel jsem i různé kombinace dvou instrukcí s lichým taktem (mov) + sudým, abych "rozhodil" VIDEO a vždy se mi potvrdil předpoklad, že každá instrukce si vezme sudý počet taktů (byť jeden takt je TW v T1 následující instrukci). Návíc jsem časování pár instrukcí sledoval i v logickém analyzátoru. Ještě vyzkouším ten program pana Peciny, proč nemám stejné takty v ePMD oproti reálnému PMD. I když už teď vidím, že tabulka taktů se mi liší ve zdrojácích ePMD právě u instrukce IN (má být 12, teď mám 10).
Správa
Autor ::Libor L.A. Poslaná :: 18.07.2017 22:42:00 Predmet ::Re: Počitadlo taktů CPU v emulátoru
Viděl bych to asi následovně: Drtivé většině obou našich národů je to jedno. A my, co píšeme programy pro PMD-85 budeme o těchto rozdílech vědět a nebudeme psát programy tak, aby striktně trvaly na časování instrukcí CPU, 8251, 8253 a rychlosti vzorkování zvuku a... Prostě to beru tak, že emulátor funguje na 99,99%. Vzato do důsledku, ony ani jednotlivé verze PMD nebo klony ZX Spectra nejsou úplně totožné z hlediska hardware samy mezi sebou. Míra složitosti emulátoru a tím i věrné napodobení originálu má vždy své meze.
Spíše mě to zajímalo pro potvrzení určité pracovní hypotézy, abych našel přesný princip pro časování UARTem. Což se povedlo (díky vám oběma). A to, jestli výsledek pojede na emulátoru o 1 nebo 5% pomaleji či rychleji to už není podle mne zase až tak důležité.