home *** CD-ROM | disk | FTP | other *** search
/ Flop Magazin 52 / Flop_Magazin_52_2009_03_Raster_cs_Side_A.atr / problik.tch < prev    next >
Text File  |  2023-02-26  |  9KB  |  51 lines

  1. VBI, DLI, problik⇧v⇧n     a co s t    m¢raster/c.p.u., 2009¢---------------------------------------¢¢Kaəd⑨ kod⑦r na mal⑦m At⇧rku naraz     d②    ve ⇨i pozd❎ji na n❎jak⑦ z⇧hadn⑦ probl⑦my. Zd⇧ se, əe jeho program ned❎l⇧ to co by m❎l, n❎co se n❎kde p②episuje, procesor zatuh⇧v⇧ na kdu v m    stech, kam by se teoreticky nikdy nem❎l dostat, a tak podobn❎. Tohle b⑨vaj     chyby, kter⑦ ⇨lov❎k hled⇧ t②eba i hodn❎ dlouho, ale obecn⇧ rada, jak je ned❎lat nebo jak je rychle naj    t, neexistuje.¢¢Pak je v③ak jin⇧ skupina probl⑦m
  2. , se kter⑨mi program⇧to②i velmi ⇨asto bojuj     (podle e-mail dotaz
  3.  co mi chod    ), p②itom jsou zbyte⇨n⑦ a lze se jich vyvarovat. Mluv    m o problik⇧v⇧n     obrazovek p②i zm❎n⇧ch DListu a o z⇧pasen     s rutinami ve VBI ⇨i DLI (oboje jsou tzv. NMI).¢¢⑥asto je d
  4. vodem jen pouh⇧ neznalost z⇧kladn    ch princip
  5. , p②    padn❎ v    ra v myln⑦ informace, kter⑦ jsme zaslechli n❎kdy p②ed mnoha lety, ale v❎②    me jim dodnes. Mezi nej⇨ast❎j③     m⑨ty t②eba pat②    , əe VBI se prov⇧d     jen v dob❎ kdy je vykreslovac     paprsek mimo viditeln⑨ obraz, nebo əe vyuəit    m kdu ve VBI z    sk⇧me n❎jak⑨ v⑨po⇨etn     v⑨kon nav    c (cca 20000 takt
  6. ), kter⑨ by se jinak promrhal.¢¢P②itom si sta⇨     uv❎domit, əe to "I" ve zkratk⇧ch VBI, DLI, znamen⇧ interrupt, neboli p②eru③en    . Procesor tedy v tomto okaməiku p②eru③     pr⇧ci na kdu, kter⑨ zpracov⇧val doposud, odsko⇨     si n❎kam jinam, a pot⑦ se op❎t vr⇧t     k p
  7. vodn    mu kdu. Aby v❎d❎l, kam se m⇧ na konci p②eru③en     vr⇧tit, mus     si na z⇧sobn    k uloəit n⇧vratovou adresu (stejn❎ jako p②i JSR instrukci), nav    c v③ak i "flag" status (jako instrukce PHP). Proto se rutiny pracuj    c     v p②eru③en     ukon⇨uj     instrukc     RTI, kter⇧ ze z⇧sobn    ku vybere a obnov     status a n⇧vratovou adresu, narozd    l od RTS, kter⑦ pouəije jen n⇧vratovou adresu. Je to nutn⑦ proto, aby p
  8. vodn     kd mohl spr⇧vn❎ pokra⇨ovat, nebo④ p②eru③en     m
  9. əe nastat v libovoln⑦m okaməiku. Ze stejn⑦ho d
  10. vodu je nutn⑦ v rutin❎ p②eru③en     zachovat obsah v③ech registr
  11.  (A,X,Y), proto ty, kter⑦ chceme vyuə    vat, mus    me t⑦ə nejprve uschovat (nej⇨ast❎ji na z⇧sobn    k) a p②ed koncem rutiny p②eru③en     jejich obsah obnovit.¢¢Okaməik, kdy se NMI p②eru③en     vyvol⇧vaj    , je p②esn❎ dan⑨. U DLI je to na za⇨⇧tku posledn    ho mikro②⇧dku displaylist instrukce, kter⇧ m⇧ nastaven sedm⑨ bit. Toto je tak⑦ ⇨ast⑨ d
  12. vod z⇧pasen     s kdem, kdy si program⇧tor nastav     v displaylistu u prvn    ho textov⑦ho ②⇧dku sedm⑨ bit a div     se, pro⇨ jeho rutina m❎n     barvu aə od ②⇧dku druh⑦ho.¢¢VBI se vyvol⇧v⇧ na za⇨⇧tku vertik⇧ln    ho zatemn❎n    , coə je, zjednodu③en❎ ②e⇨eno, na prvn    m mikro②⇧dku pod spodn     viditelnou hranou obrazu. To je v③ak jen jeho za⇨⇧tek a nikde nen     zaru⇨eno, əe bude tato rutina i v dob❎ mimo viditeln⑨ obraz dokon⇨ena - z⇧leə     jen na jej     d⑦lce. Op❎t velmi ⇨ast⑨ ⑤div program⇧tora, jakto əe se ⇨innost jeho kdu ve VBI projevuje b❎hem vykreslov⇧n    . A odpov❎⇦ jednoduch⇧: M⇧ rutinu p②    li③ dlouhou, takəe se prov⇧d     i b❎hem vykreslov⇧n     dal③    ho sn    mku. On❎ch ⇨asto zmiovan⑨ch 20 tis    c takt
  13.  pro rutinu ve VBI vych⇧z     z prost⑦ho zaokrouhlen⑦ho v⑨po⇨tu: 105 takt
  14.  na mikro②⇧dek kr⇧t 312 mikro②⇧dk
  15.  (PAL), m    nus cca 8000 takt
  16.  DMA ANTICu b❎hem vykreslov⇧n     obrazu, m    nus cca 1000 takt
  17.  ⇨innost OS ROM, rovn⇧ se 23760, tedy zhruba 20 tis    c. Z nich v③ak jen cca pouh⑨ch 6 tis    c ((312-256)*105) p②ipad⇧ na dobu p②ed za⇨⇧tkem vykreslov⇧n     dal③    ho sn    mku, del③     akce uə mohou b⑨t "viditeln⑦".¢¢P②itom VBI i DLI jsou nemaskovateln⇧ (NMI), tud    ə n⇧sleduj    c     DLI m
  18. əe p②eru③it i p②edch⇧zej    c     DLI, p②    padn❎ se mohou navz⇧jem p②eru③ovat s VBI a naopak. Pokud to tedy nap②    klad s d⑦lkou VBI p②eəenete drsn❎, m
  19. əe v⇧m jeho prov⇧d❎n     p②eru③it VBI zah⇧jen⑦ na konci n⇧sleduj    c    ho sn    mku, kter⑦ bude op❎t tak dlouh⑦, əe ho p②eru③     aə dal③     VBI, a dal③    ... a jestli nedo③lo k zamrznut    , p②eru③uj     se dodnes. ;-)¢¢Vyuəit    m rutin v p②eru③en     se tedy nez    sk⇧v⇧ ə⇧dn⑨ v⑨kon nav    c, ale sebere se "hlavn    " rutin❎.¢¢Od spr⇧vn⑦ho pochopen     v⑨③e uveden⑨ch skute⇨nost     je jiə jen kr
  20. ⇨ek k ⑤sp❎③n⑦mu vy②e③en     v③ech probl⑦m
  21.  druh⑦ho typu, coə je neə⇧douc     o③kliv⑦ "probliknut    " ⇨i nepochopiteln⑦ ob⇨asn⑦ z⇧tuhy p②i zm❎n❎ displaylistu a/nebo vektor
  22.  p②eru③en    . Probl⑦m je v chyb❎j    c     synchronizaci.¢¢Jak je zn⇧mo, vektor pro displaylist se nastavuje p②es adresy $230 a $231. Zm❎na obsahu t❎chto bun❎k v③ak sama o sob❎ v
  23. bec nic neprovede. Teprve aə p②i prvn    m n⇧sleduj    c    m VBI, kdyə se vyvol⇧ p②    slu③n⇧ OS ROM rutina, se v r⇧mci jej    ho kdu obsah buky $230 zkop    ruje do $d402 a obsah $231 do $d403. Aə toto je skute⇨n⑨ vektor pro displaylist ⇨ipu ANTIC, jehoə zm❎na se projev     vykreslov⇧n    m odpov    daj    c    ho displaylistu.¢¢Metoda z⇧pisu na doln     registry a p②episu ve VBI do registr
  24.  ⇨ipu se pouə    v⇧ proto, nebo④ kdybychom m❎nili p②    mo obsah registr
  25.  ⇨ipu zrovna b❎hem vykreslov⇧n    , za⇨al by se od toho okaməiku vykreslovat nov⑨ obraz, klidn❎ od poloviny rozkreslen⑦ho aktu⇧ln    ho sn    mku. VBI n⇧m tedy zajist    , əe se tento p②epis provede aə po dokon⇨en     vykreslov⇧n    , a projev     se to aə p❎kn❎ shora od za⇨⇧tku n⇧sleduj    c    ho sn    mku. Jenoməe na n❎co jsme zapomn❎li.¢¢Pokud nebudeme ⇨innost na③eho kdu ə⇧dn⑨m zp
  26. sobem synchronizovat s vykreslov⇧n    m, m
  27. əe doj    t k VBI zrovna v t⑦ ne③④astn⑦ chv    li, kdy m⇧me teprve nastaven jeden ze dvou doln    ch registr
  28.  adresy displaylistu. OS ROM rutina tedy zap    ③e ANTICu niə③     bajt hodnoty pro nov⑨ displaylist, zat    mco vy③③     bajt nastav     je③t❎ dle star⑦ho displaylistu. V⑨sledkem je vykreslen     cel⑦ho n⇧sleduj    c    ho sn    mku obrazu displaylistem dle obsahu pam❎ti [nov⑨ niə③     bajt, p②edchoz     vy③③     bajt], coə se m
  29. əe projevit velmi divoce, a aə po tomto sn    mku, kdy dojde k dal③    mu VBI, se p②ep    ③e spr⇧vn❎ i ten vy③③     bajt a teprve dal③     sn    mek bude spr⇧vn❎.¢¢Obdobn❎ nehezky m
  30. əe dopadnout, kdyə nap②    klad p②ed VBI stihneme nastavit oba bajty displaylistu, ale z⇧pis barvov⑨ch registr
  31.  (adresy $2c0 aə $2c8) nebo p②epnut     ③    ②ky obrazu (adresa $22f) se jiə p②ed t    m sam⑨m VBI nestihne. V⑨sledkem je probliknut     jednoho sn    mku se ③patn⑨mi barvami, neodpov    daj    c     ③    ②kou obrazu atd. Pravd❎podobnost, əe k tomu dojde, nemus     b⑨t ani p②    li③ velk⇧, ale t    m h
  32. ②e pro program⇧tora. Probliknut     barev nebo jeden sn    mek zmaten⑦ho obrazu by se je③t❎ s p②imhou②en    m obou o⇨     dalo strp❎t, jenoməe d
  33. sledky mohou b⑨t fat⇧ln    . Nap②    klad m
  34. əe displaylist z nespr⇧vn⑦ adresy obsahovat hodnoty vyvol⇧vaj    c     n❎kolik DLI, s jejichə vyvol⇧n    m se nepo⇨    talo, p②    padn❎ zmaten⑨ obraz m
  35. əe nastavit obsahy PMG kolizn    ch registr
  36. , ze kter⑨ch se vyvod     kolize k nimə doj    t nem❎lo atd.¢¢Chud⇧k program⇧tor pak stoj     p②ed probl⑦mem, əe "vədycky to fungovalo" (i kdyə to v⑨jime⇨n❎ n❎jak divn❎ probliklo), ale te⇦ to ob⇨as zatuh⇧v⇧, nebo t②eba p②i h②e raketka vybuchuje, aniə by k tomu m❎la m    t d
  37. vod.¢¢Rada zn     jednodu③e: Neignorujte podivn⑦ neə⇧douc     jevy a snaəte se zjistit kdy a pro⇨ k nim doch⇧z    .¢¢A jak takov⑦ chyby odstranit, nebo l⑦pe v
  38. bec ned❎lat? Je d
  39. leəit⑦ si d
  40. sledn❎ uv❎domovat, zda prov⇧d    te zm❎nu doln    ch registr
  41. , jejichə p②epis do ⇨ip
  42.  se prov⇧d     aə ve VBI, nebo zda nastavujete p②    mo horn     registry ⇨ip
  43. . A vədy synchronizovat zm❎ny s vykreslov⇧n    m!¢¢Pokud p②ed inicializa⇨n     ⇨⇧st p②id⇧te t②eba jen jednoduchou synchroniza⇨n     podm    nku¢¢lda $14¢waicmp $14¢beq wai¢¢m⇧te zaru⇨eno, əe v⇧③ kd bude proveden vədy ihned po dokon⇨en     VBI OS ROM rutiny (kter⇧ obsah registru $14 inkrementuje). Pokud ve VBI neprov⇧d    te i n❎jakou vlastn     akci, zb⑨v⇧ procesoru do okaməiku za⇨⇧tku vykreslov⇧n     n⇧sleduj    c    ho sn    mku cca 6000 takt
  44. , tedy dost ⇨asu na proveden     zm❎n mimo viditelnou oblast a bez hrozby p②eru③en     inicializace dal③    m VBI. ⑧⇧dn⇧ ze zm❎n doln    ch registr
  45.  se v③ak neprojev     ihned v n⇧sleduj    c    m sn    mku, ale aə v o jedna dal③    m. Proto mus    te bu⇦to prov⑦st zm❎ny sou⇨asn❎ v doln    ch i ve sleduj    c    ch registrech, nebo na uskute⇨n❎n     zm❎ny po⇨kat je③t❎ jeden sn    mek. Prvn     synchro ⇨ek⇧n     tedy zajist    , əe n⇧③ kd nebude p②eru③en VBI, a po druh⑦m ⇨ek⇧n     si m
  46. əeme b⑨t jisti, əe jiə v③echny p②episy hodnot z doln    ch registr
  47.  byly (b❎hem toho n⇧sleduj    c    ho VBI) provedeny.¢¢P②    klad vyuəit     dvou synchronizac    :¢¢;1.synchro¢lda $14¢wa1cmp $14¢beq wa1¢;¢;displaylist¢lda #<dlist¢sta $230¢lda #>dlist¢sta $231¢;¢;barvy¢lda #$04¢sta $2c5¢lda #$08¢sta $2c6¢lda #$0c¢sta $2c7¢¢Nyn     jsou hodnoty adresy nov⑦ho displaylistu a t②ech barvov⑨ch registr
  48.  zaps⇧ny do doln    ch registr
  49. , n⇧sleduj    c     cel⑨ sn    mek v③ak bude je③t❎ vykreslen star⑨m displaylistem a p②edchoz    mi barvami. Po⇨k⇧me tedy na dokon⇨en     tohoto sn    mku a proveden     n⇧sleduj    c    ho VBI:¢¢;2.synchro¢lda $14¢wa2cmp $14¢beq wa2¢¢Nyn     je jiə po dal③    m VBI, takəe v③echny hodnoty z doln    ch registr
  50.  byly p②eps⇧ny do sleduj    c    ch. N⇧sleduj    c     sn    mek tedy bude vykreslen cel⑨ spr⇧vn❎ na③    m nov⑨m displaylistem a se v③emi zm❎n❎n⑨mi barvami.¢¢Neberte pros    m zm    n❎n⑦ p②    klady jako n❎jak⑦ dogma. Jde jen o to uv❎domit si, əe pokud m❎n    te doln     a horn     registry souvisej    c     s vykreslov⇧n    m obrazu bez jak⑦koliv synchronizace, koledujete si v lep③    m p②    pad❎ o nehezky problik⇧vaj    c     zmaten⑨ sn    mek, ⇨ast❎ji v③ak i o z⇧hadn⑦ nahodil⑦ z⇧tuhy. Je p②itom ⑤pln❎ jedno, zda budete synchronizovat p②es zji③④ov⇧n     zm❎ny hodnoty adresy $14 nebo t②eba porovn⇧v⇧n    m obsahu VCOUNT registru (⇨    ta⇨ vertik⇧ln    ch ②⇧dk
  51. ) s n❎jakou konstantou, ale m❎jte vədy na pam❎ti, kter⑦ registry m❎n    te a kdy se tato zm❎na skute⇨n❎ projev    .¢