Test NMOS/CMOS Z80 CPU

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.

testcpu

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.

cmos_test

Příspěvek byl publikován v rubrice Nezařazeno se štítky , , , . Můžete si uložit jeho odkaz mezi své oblíbené záložky.

3 Responses to Test NMOS/CMOS Z80 CPU

  1. MartinNo1 napsal:

    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.

  2. jirka napsal:

    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ž.)

  3. Timmy napsal:

    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? 🙂

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *