[SharpMZ] Neco noveho o PSG

Michal Hucik - ORDOZ ordoz na ordoz.com
Úterý Únor 7 15:48:13 CET 2017


Ahoj,

diky jednomu programku od Jirky Cervinky jsem dnes objevil jednu 
zajimavou zaludnost nachazejici se v MZ-800 a zrejme i v MZ-1500. 
Kdykoliv provedete IORQ na port 0xf2 (PSG), tak jste za to odmeneni 
signalem /WAIT, jehoz delka sice na prvni pohled vypada trochu random, 
nicmene neni tomu tak. Je zajimave, ze si mlhave vybavuju, ze jsem si 
neceho takoveho uz kdysi vsimnul, ale nakonec jsem to pustil z hlavy s 
tim, ze slo mozna jen o nejake ruseni na sondach analyzeru :)

Podle schematu MZ-800 jsme to sice meli celou dobu na ocich, nicmene 
zrejme nikdo si nevsimnul, ze /WAIT, ktery jde do CPU muze byt 
vygenerovan bud z /EXWAIT, nebo z /WTGD (GDG), nebo z pinu READY od 
SN76489AN.

Dokumentace k PSG, kterou jsem nasel na netu je docela skromna - docetl 
jsem se, ze PSG potrebuje k naloadovani 32 CPU taktu a po tuto dobu ma 
vystaven READ=0 - neni tomu tak :)

Trochu jsem meril, pocital, premyslel ... prokrastinoval a dospel jsem k 
nasledujicimu zaveru:

Do PSG jdou stejne hodiny, jako do CPU: 17734475/5/16 = 221680.9 - 
rikejme tomu treba procesni perioda, jeden jeji pultakt ma 16 CPU taktu, 
coz je u nas standardne 80 GDG taktu.

PSG zvukovy vystup se generuje zrejme vzdy pri sestupne hrane techto 
hodin (uz nevim odkud tohle mam - bud jsem si to nekdy vymyslel, nebo 
zmeril, ale proste to vim :), takze 17734475/5/16/2 = 110840.4

PSG neni zadnym zpusobem synchronizovana s Z80 a jeji procesni perioda 
muze byt libovolne posunuta proti procesni periode Z80 (napr. PIOZ80 se 
s CPU srovnava podle /M1)

IORQ na port 0xf2 je dekodovano v GDG, ktere okamzite s /IORQ=0 posle 
/CE + /WR do PSG, ktery okamzite posle do CPU /WAIT. PSG nyni potrebuje, 
aby uplynuly minimalne 2 libovolne hrany procesnich hodin. READY (/WAIT) 
jde do normalu presne s druhou sestupnou, ci nabeznou hranou procesnich 
hodin. Budu-li tedy zapisovat do PSG, tak u prvniho zapisu je vylozene 
nahoda jak dlouhy WAIT obdrzim, nicmene po uvolneni WAITu uz vim, ze 
jsem s PSP procesnima hodinama synchronni a dokazu v podstate presne 
urcit delku jednotlivych WAITu.

V priloze je obrazek z analyzeru pri nasledujicim programku. Rozmisteni 
sipek, ktere jsem domaloval je bajocko, nicmene casy mezi jednotlivyma 
hranama jsou presne delitelne 80 GDU CLK.


      ; doba mezi IORQ je myslena mezi nabeznou hranou konciciho out 
(n),a a sestupnou hranou zacinajiciho

    out (0xf2),a ; nahodne dlouhy WAIT
     out (0xf2),a ; mezi IORQ je 8 CPU taktu (42 GDG), WAIT = 106
     nop
     out (0xf2),a ; mezi IORQ je 12 CPU taktu (62 GDG), WAIT = 166
     nop
     nop
     out (0xf2),a ; mezi IORQ je 16 CPU taktu (82 GDG), WAIT = 146
     nop
     nop
     nop
     out (0xf2),a ; mezi IORQ je 20 CPU taktu (102 GDG), WAIT = 126
     nop
     nop
     nop
     nop
     out (0xf2),a ; mezi IORQ je 24 CPU taktu (122 GDG), WAIT = 106
     nop
     nop
     nop
     nop
     nop
     out (0xf2),a ; mezi IORQ je 30 CPU taktu (142 GDG), WAIT = 166
     nop
     nop
     nop
     nop
     nop
     nop
     out (0xf2),a ; mezi IORQ je 34 CPU taktu (162 GDG), WAIT = 146


------------- další část ---------------
HTML příloha byla odstraněna...
URL: http://mail.ordoz.com/pipermail/sharpmz/attachments/20170207/7bcca254/attachment-0001.html 
------------- další část ---------------
Netextová příloha byla odstraněna...
JmĂŠno: psg_ready_timing.png
Typ: image/png
Velikost: 69115 bytes
Popis: [Şådný popis není k dispozici]
Url : http://mail.ordoz.com/pipermail/sharpmz/attachments/20170207/7bcca254/attachment-0001.png 


Další informace o konferenci SharpMZ