<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <p><font size="+1">Ahoj,</font></p>
    <p><font size="+1">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 :)</font></p>
    <p><font size="+1">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  </font>SN76489AN.</p>
    <p>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 :)<br>
    </p>
    <p>Trochu jsem meril, pocital, premyslel ... prokrastinoval a dospel
      jsem k nasledujicimu zaveru:</p>
    <p>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.<br>
      <br>
      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<br>
      <br>
      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)<br>
      <br>
      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.</p>
    <p>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. <br>
    </p>
    <p><br>
           ; doba mezi IORQ je myslena mezi nabeznou hranou konciciho
      out (n),a a sestupnou hranou zacinajiciho<br>
    </p>
    <p>   out (0xf2),a ; nahodne dlouhy WAIT<br>
          out (0xf2),a ; mezi IORQ je 8 CPU taktu (42 GDG), WAIT = 106<br>
          nop<br>
          out (0xf2),a ; mezi IORQ je 12 CPU taktu (62 GDG), WAIT = 166<br>
          nop<br>
          nop<br>
          out (0xf2),a ; mezi IORQ je 16 CPU taktu (82 GDG), WAIT = 146<br>
          nop<br>
          nop<br>
          nop<br>
          out (0xf2),a ; mezi IORQ je 20 CPU taktu (102 GDG), WAIT = 126<br>
          nop<br>
          nop<br>
          nop<br>
          nop<br>
          out (0xf2),a ; mezi IORQ je 24 CPU taktu (122 GDG), WAIT = 106<br>
          nop<br>
          nop<br>
          nop<br>
          nop<br>
          nop<br>
          out (0xf2),a ; mezi IORQ je 30 CPU taktu (142 GDG), WAIT = 166<br>
          nop<br>
          nop<br>
          nop<br>
          nop<br>
          nop<br>
          nop<br>
          out (0xf2),a ; mezi IORQ je 34 CPU taktu (162 GDG), WAIT = 146<br>
      <br>
      <br>
    </p>
  </body>
</html>