Martin K. mně upozornil na zajímavý článek zabývající se problematikou falešných čínských CPU Z80. A protože to vypadá, že i v našich končinách je to bouřlivé téma, rozhodl jsem se v článku zmiňovaný test vyzkoušet a napsal v rychlosti malý prográmek pro Zeta SBC V2 pod CP/M v mém oblíbeném Turbo Pascalu.
Princip je poměrně jednoduchý. Na Z80 existuje nedokumentovaná instrukce OUT ( C ), 0 , která na NMOS CPU na port určený registrem C napíše hodnotu 0x00, zatímco na CMOS CPU hodnotu 0xFF. Zapsat hodnoty na port je tedy celkem jednoduché, ale otázkou je, jak tyto hodnoty přečíst. To je samozřejmě věc konkrétního počítače a implementace jeho portů. Já jsem použil Zeta SBC V2, kde na portech 0x64-0x67 sedí PPI 8255. Port B tohoto obvodu v Mode 0, pokud je nastavený jako výstup lze číst a přečte se z něj předchozí zapsaná hodnota, bez ohledu na fyzický stav výstupních pinů. Toho jsem využil a napsal malý testovací prográmek v Turbo Pascal 3.0 pod CP/M.
var B: Byte; const CtrlPort = $67; PortB =$65; begin WriteLn('Test Z80 CPU'); WriteLn('(c) 2015 Martin www.8bity.cz'); WriteLn; Port[CtrlPort]:=$80; {Zeta 8255 Mode 0 port B OUT} inline($3E/$00/ { LD A,0 } $D3/PortB); { OUT (0x65),A } WriteLn('Test Zeta 8255, 0x00 = ',Port[PortB]); inline($3E/$FF/ { LD A,0xFF } $D3/PortB); { OUT (0x65),A } WriteLn('Test Zeta 8255, 0xFF = ',Port[PortB]); WriteLn; inline($0E/PortB/ { LD C,0x65 } $ED/$71); { OUT (C),0 - undocumented instruction} { outputs 0 on NMOS and 0xFF on CMOS CPU } B:=Port[PortB]; WriteLn('OUT (C),0 on Zeta 8255 Port B = ',B); WriteLn; if B=0 then begin WriteLn('NMOS Z80 CPU detected'); end else begin WriteLn('CMOS Z80 CPU detected'); end; end.
Stáhnout si ho, včetně zdrojového i přeloženého kódu můžete tady.
Vyzkoušel jsem jak falešné 20 MHz CPU, tak i ty korektní a vše fungovalo dle očekávání. UA880D, Zilog Z8400APS Z80A CPU, SHARP LH0080A a falešné 20 MHz CPU se jeví všechny jako NMOS, zatímco pravé Zilog Z84C0020PEC z eBay (od UTsource i vyměněné od pic_hitechworld) nebo Zilog Z84C0010PEG z Mouser se jeví jako CMOS. Spotřeba Zeta SBC V2 s CMOS CPU taktovaném na 4 MHz je okolo 120 mA, zatímco s NMOS CPU při stejné frekvenci se pohybuje (dle CPU) mezi 190-200 mA.
UPDATE:
Martin K. mi poslal svůj testík, který si napsal na Didaktik a myslím, že se dá použít na jakémkoli Speccy, kdybyste si chtěli svoje podezřelé CPU otestovat v něm. Využívá portu na změnu barvy borderu. NMOS CPU by mělo dávat černý border, zatímco CMOS CPU bílý border.
Za predpokladu, ze je procesor v patici, co je pri Didaktikoch asi v polovici pripadov, vacsinou, ked je tam osadeny iny procak ako UB (ten ide do patice iba s pouzitim nasilia).
K programu pre ZX/Didaktik je dobre na zaciatok doplnit zmenu borderu
5 BORDER 4
aby bola zrejma zmena farby na bielu resp. ciernu.
Mne sa podarilo odhalit 4ks fake Z84C0020, dalsie 3ks testom presli.
Když už se tu probírají Z80, tak jsem náhodou narazil na docela zajímavý projekt. Jen to není zrovna levné: https://www.kickstarter.com/projects/501038458/ziloghino
(Jestli je to moc OT post, tak jej prosím Martine smaž.)
Zdar chlapi,
právě se snažím z Číňanů dostat Z84C0020FEC. Tam mi asi nehrozí narazit na NMOS, páčto se v tomto pouzdře nikdy nedělaly. Co mně tak může postihnout, krom toho, že v tom nebude ani ten křemík? 🙂
Pingback: Z80 CPU Tester s identifikací typu/výrobce Z80 | Martinův 8-bitový blog