Forum

Z PMD 85 Infoserver

:: späť na zoznam tém ::
Správa
Autor  Autor ::  Libor L.A.
Poslaná  Poslaná ::  14.07.2017 19:52:46
Predmet  Predmet ::  Počitadlo taktů CPU v emulátoru
Když ve vašem emulátoru PMD-85 krokuji jednu určitou proceduru instrukci za instrukcí, počitadlo taktů CPU ukáže 1294T, což je správná hodnota, určená teoretickým výpočtem. Když u stejné procedury nastavím breakpointy a změřím počet taktů mezi nimi, dostanu v emulátoru verze 2.2.8.301 počet 1390T a v emulátoru verze 3.0.1.142 dokonce 1443T. Procentuální rozdíly jsou -7% a -10%. Je to náhoda, nebo to souvisí s bržděním CPU videoprocesorem?
 
Správa
Autor  Autor ::  Roman Bórik
Poslaná  Poslaná ::  15.07.2017 10:36:33
Predmet  Predmet ::  Re: Počitadlo taktů CPU v emulátoru
V pracovnej verzii emulátora 3.0.1.142 je vyšší počet Taktov daný zohľadňovaním brzdenia CPU Video-procesorom podľa analýzy Tomáša Pecinu. Nemalo by záležať na tom, či sa trasuje po inštrukciách, cez volania CALL, alebo za normálneho behu a počet taktov by mal byť rovnaký. Aj v Profileri.
Pri tejto analýze Tomáš Pecina vytvoril program, ktorý overoval skutočné trvanie inštrukcií, ak sa nemýlim, počítaním taktov za pomocí časovača. Tento program som spúšťal aj na reálnom PMD 85 a aj v Emulátore s upraveným počítaním taktov a výsledok bol rovnaký.
Netvrdím ale, že ešte stále nemôže byť niekde nejaká chyba. Či už v Emulátore alebo v danom testovacom programe (kde ho vôbec mám?...).
 
Správa
Autor  Autor ::  Roman Bórik
Poslaná  Poslaná ::  18.07.2017 22:27:34
Predmet  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
 
pre:    ds   1   ; NOP alebo MOV B,B
ins:    ds   1   ; kod samotnej instrukcie
post:   ds   2   ; argument instrukcie
 
cont:   in  c1
        cma

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  Autor ::  Zdeněk
Poslaná  Poslaná ::  19.07.2017 08:23:24
Predmet  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  Autor ::  Libor L.A.
Poslaná  Poslaná ::  18.07.2017 22:42:00
Predmet  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é.
 
Správa
Autor  Autor ::  Zdeněk
Poslaná  Poslaná ::  14.07.2017 23:19:42
Predmet  Predmet ::  Re: Počitadlo taktů CPU v emulátoru
Nevím, jak to mají kluci v emulátoru nastavené, ale dá se odvodit, že kvůli spolupráci s videoprocesorem platí nová tabulka taktů pro každou instrukci (nedá se tedy říct, že je to přesně 7 nebo 10 procent - některé instrukce nejsou bržděné vůbec). Zkus znova propočítat teoretický předpoklad podle tabulky tady:

http://maximalne.8u.cz/jak-to-s-temi-takty-u-pmd85-vlastne-je/

Snad jsou tady v příspěvcích povolené odkazy...

Asi je zjevné, že jsem trochu posedlý měřením taktů (nejen u 8251 ;-)
 
Správa
Autor  Autor ::  Libor L.A.
Poslaná  Poslaná ::  15.07.2017 08:03:26
Predmet  Predmet ::  Re: Počitadlo taktů CPU v emulátoru
Myslel jsem to trochu jinak. Když v emulátoru instrukce krokuji, je počet taktů správný. Když pustím program plnou rychlostí a měřím počet taktů mezi dvěma breakpointy, je naměřený počet taktů o těch několik procent vyšší. Čili ještě jinak, počet naměřených taktů závisí na tom, zda krokuji, nebo program běží plnou rychlostí.

Určitou logiku to dává.. Když krokuji, zajímají mě fyzické počty taktů jednotlivých instrukcí. Když program běží plnou rychlostí, spíše mě (co se týče počtu taktů) bude zajímat skutečný čas a tím pádem tam budou zahrnuty i brzdicí WAIT STATES od videoprocesoru.
:: späť na zoznam tém ::