Led 212005
 

V dnešnom diely si ukážeme, ako je organizovaná videoram a a ko sa s ňou pracuje. Popíšeme si niektoré rutiny na prácu s adresami vo videoram a tiež prevody súradníc na adresy vo videoram. Taktiež bude dobré, keď si zoženiete tabuľky adries videoram. Nájdete ich napr. v ZXM 6/1994 alebo na adrese http://nairam.sk/vram.pdf.

Pre začiatok si preložte tento program:

      ld   hl,#4000


      ld   bc,6144/2+768/2
V_ONE ld   (hl),255
      inc  l
      ld   (hl),255
      ei
      halt
      inc  hl
      dec  bc
      ld   a,b
      or   c
      jr   nz,V_ONE
      ret

Program postupne zapisuje do videoram hodnoty 255. Po spustení je vidieť, že videoram nie je organizovaná lineárne. Keď si pozorne prezriete tabuľku adries videoram, môžete si odvodiť takúto schému adresy z videoram:

0100 0000  0000 0000

Význam bitov:
číslo tretiny
číslo riadku v ATTR
číslo ATTR riadku v tretina
číslo stĺpca

Znalosť takto zakódovaných informácií v adrese nám umožní vytvoriť (alebo odvodiť) rutinu na posun o jeden pixelový riadok vo videoram. Algoritmus je nasledovný:

  1. zvýš horný bajt adresy o 1
  2. ak sú spodné 3 bity rôzne od nuly, skonči
  3. odčítaj od horného bajtu adresy 8 – korekcia pretečenia „čísla riadku v ATTR“
  4. pričítaj k spodnému bajtu adresy 32
  5. ak nenastane carry, skonči
  6. pričítaj k hornému bajtu adresy 8 (ak nepožadujeme test opustenia obrazovky, algoritmus môže skončiť)
  7. ak je horný byte menší ako #58, skonči
  8. odčítaj od horného bajtu #18

Skúsme si tento algoritmus naprogramovať:

1. DOWNHL inc  h
2.        ld   a,h
          and  7
          ret  nz
3.        ld   a,h
          sub  8
          ld   h,a
4.        ld   a,l
          add  a,32
          ld   l,a
5.        ret  nc
6.        ld   a,h
          add  a,8
          ld   h,a
7.        cp   #58
          ret  c
8.        sub  #18
          ld   h,a
          ret

Uvedenú rutinu si porovnajte s rutinou DOWNDE z minulého dielu.

Ďalšia vec, ktorá sa nám môže zísť je prevod zo súradníc pixelu na adresu vo videoram. Súradnice majú údaje zakódované takto:

súradnica X    súradnica Y
0000 0000      0000 0000

Význam bitov:
číslo stĺpca
pixel v bajte
číslo tretiny
číslo ATTR riadku v tretine
číslo riadku v ATTR

Teda finta na prevod súradníc na adresu je iba vo vhodnom narotovaní a sčítaní bitov súradníc. Program môže vyzerať nasledovne:

;vstup: e - súradnica X, d - súradnica Y
;výstup: hl - adresa vo videoram
  ld   a,d
  rra
  rra
  rra
  and  %00011000
  or   %01000000
  ld   h,a
  ld   a,d
  and  %00000111
  or   h
  ld   h,a
  ld   a,d
  add  a,a
  add  a,a
  and  %11100000
  ld   l,a
  ld   a,e
  rra
  rra
  rra
  and  %00011111
  or   l
  ld   l,a
  ret

Podobnú rutinu na prevod súradníc na adresu videoram môžete nájsť v článku Prevod atribútových súradníc na pixelovú adresu.

Po pixelovej časti videoram nasleduje atribútová. Štruktúra atribútov je snáď samozrejmá. Formát uloženia farieb už bol popísaný Sweetom v 1. dieli.

Pri kreslení do videoram sa jej nelinearita môže zdať ako problém. Zväčša sa ale vykreslujú grafické elementy (napr. písmená textu) do atribútových políčok a pohyb na ďalšiu vertikálnu pozíciu sa deje prostým ‚inc h‘, čo neskutočne zrýchľuje grafické operácie.

Dnes mám pre vás domáce úlohy dneď dve. Vyberte si jednu z nich a skúste si ju naprogramovat.

  1. úloha: naprogramujte rutinu UPHL, ktorá bude vracať adresu vo videoram o jeden mikroriadok vyššie ako bola adresa v registri HL.
  2. úloha: naprogramujte rutinu, ktorá vráti adresu napravo od adresy v registri HL. Ak je vstupná adresa pri pravom okraji obrazovky, rutina vráti adresu na začiatku riadka (pri ľavom okraji), ale o 8 pixelov nižšie. Stačí, keď bude rutina korektne pracovať iba pre adresy najvrchnejších mikroriadkov v atribútoch (využitie bude napríklad pri vypisovaní dlhých riadkov textu).

  14 komentáre na “3.diel: videoram”

  1. Asi si cvičně střihnu domácí úlohu taky.

  2. Tak jsem dnes udělal domácí úkol hned poté, co jsem vyrobil poličku do skříňky.

  3. Kedze ja som si ulohu c. 2 nenaprogramoval, tak ma sweetove riesenie ‚righthl‘ docela prekvapilo. Vychadza z toho velmi pekna rutinka a to tam sweet pridal aj test na opustenie obrazovky (potom sa vracia na zaciatok).

  4. A víte PROČ je videoram organizovaná tak divně. Po třetinách? :))

  5. Víme. Kvůli rychlejšímu přístupu do videoram během vykreslování.

  6. Kdepák, samá voda. :)))

  7. Ve vodě jseš ty. Ačkoliv nejsem hw guru, tuto informaci od Busyho jsem si zapamatoval. Jestli máš na věc jiný názor, tak si ho laskavě nech pro sebe a nepředváděj nám tady divadýlko.

  8. Copak Cukrouši, nelíbil se ti můj přispěvek?

  9. POSPA: Chces to vysvetlit opravdu, ale opravdu do detailu? 😉 Ale vesely, natoz moudry z toho nebudes, jak tak koukam.

  10. zilogator: povídej, jsem jedno velké ucho. Ale kopi mi prosímtě pošli do mejlu, mohlo by se stát, že to tady někdo smázne a já se nic nedozvím. 😉

  11. Pospa: Nejsi jedno velke, ale jen ucho. Psal jsem to na konferenci (pandora), pokud te to zajima. Ale mel jsem dojem, ze jsi si jisty v kramflecich, a ono ne, jak se zda…

  12. to zilogator: Aha, takže zase žádná odpověď. Už si zvykám. Místo toho jenom vytáčky, "psal jsem to na pandoře…". Ehm, tak potom si dejte do http://ci5.speccy.cz/index.hatlamatla link na tu pandóru a nemusíte se s tím tady zatěžovat.

    Stačilo napsat třeba: "Ty … každej přece ví, že videoram ZX Spectra je tvořena obvody dynamických RAM 4116 a ty potřebují refresh cyklus každé 2ms. Refresh je naadresování sedmi LSB bitů RAS t.j. 128 adres. Jak jinak to stihnout než přeskládáním adres mikrolinek videoram?"

    Nebo je to supertajná informace? :))

    Nebo to tady nikdo netuší?

    V archívu dokumentací jsem našel všechno možné, ale cracker Trolera/Lamače jaksi jako by neexistoval. Doporučuji Vám se po tomto velmi elegantním kousku hw poohlédnout, stojí to za námahu. Možná budete mít potíž se sháněním jednoho vysoce sofistikovaného čipu. 🙂 Nápověda: hledejte v časopise Sdělovací Technika
    druhé půli osmdesátých let. :)))

  13. pospa: Dej si studeny obklad. normalni DRAM cipy vydrzi bez refreshe okolo 2 sekund, 2ms je ale hodne nizka hodnota, jaka ani v katalozich nebyvala.

    Ostatne, refresh videoram navrhari zajistovali z CPU, v dobe neaktivni ULA, pokud sis nevsiml u Issue 1. Krom toho, v dobe vycitani obrazu existuje tedy 8ms pauza, kdy je ULA neaktivni, takze by take nerefreshovala, prohazeni/neprohazeni.

    Skutecny duvod zprehazeni vuci ULA je page-read mode, kdy musi mit pixely pod atributem tutez ras adresu, jako atribut, aby se usetril jeden /RAS cyklus. To stale jeste ale neni duvod, protoze CPU mohl mit stejne permutovane adresy v MPLX. Duvodem zde byla snaha mit VRAM kompaktni, a strach z refreshe v dobe NEAKTIVNI ULA.

    Btw. POSPA, pokud vis o HW hovnajs, nedrazdi kobru bosou nohou – prohazena VRAM ma z hlediska refreshe, prave diky zachovavani /RAS hodnoty, DALEKO VETSI PERIODU OBCERSTVOVANI, nez by mela bez nej. Takze tesne vedle, a priste se nehadej, pokud NIC nevis.

  14. to zilogator: No jejda átributy za to můžou. A je to venku. Nebylo to nic tajnýho. :)))

    P.S. ten refresh timming u 4116 platí 2ms. 😉 To, že to museli u ZX očůrat na tom nic nemění. :))

    Chytří kluci jste tady. 🙂

Je nám líto, ale formulář pro přidávání komentářů je momentálně uzavřen.