S Display Listom na večné časy

Najhoršie sú tie nevinné otázky. Gyro spomenul svoj návrat k programovaniu na Atari 800 a začal robiť textovú hru. Vraj či by som mu nevedel poradiť ako je robený Nekonečný príbeh. No veď to je jasné použiješ Display List! Hore dáš grafický mód a dole textový. Čo to je? Display List je krátky program pre čip ANTIC a nastavuje ako sa má videopamäť interpretovať. Videopamäť môže byť umiestnená kdekoľvek v pamäti. Pred rokom som predsa zostavoval DL. Škrípalo to, ale nakoniec vďaka Fandalovi začal fungovať. Používam ho stále, samozrejme všetko som už zabudol, takže je to typická čierna skrinka. Zavolám to a ono to urobí presne to čo chcem, ako? To už vyfučalo z hlavy 🙂

Upozorňujem že nasledujúci text bude taká laická archeológia. Pre znalých to nebude, ale mohli by prípadne uviesť na pravú mieru moje nesprávne dohady.

Prečítal som pár nedostatočných článkov, pozrel DL ktorý používam a nič. Výsledok sa nedostavil. Mám napísať niekomu kto nám poradí? Nie skúsil som starú osvedčenú metódu, proste to ukradnem a upravím 😉 ako za starých čias. Ten najlepší spôsob ako sa niečo naučiť.

Nahral som NS do emulátora, zapol monitor a pozrel som help.

monitor

Hurá veď tu je .dumpdlist

display list

Veľa mi to nehovorí, ale 300 to bude adresa kde je umiestnený. Pozriem na to db 300

display list

Keďže viem kde končí a že posledné dve hodnoty určujú adresu začiatku DL, nie je problém to orezať. Previesť všetko z HEX na DEC a máme dáta do basicu.

Potom prišlo na radu experimentovanie. Vedel som že obidva grafické módy tam musia mať svoju adresu grafickej pamäte. Keď som ich konečne identifikoval, nastal ďalší problém. Ako docieliť aby v textovom okne fungoval systémový print a scroll? Nakoniec ma napadlo použiť VRAM existujúceho grafického módu 0 a hľa začalo to fungovať.

Nič nemôže byť také jednoduché, ďalší problém. Systém vie že má mať 24 riadkov a neprispôsobí sa novému stavu. Našťastie je na adrese ROWCRS/84 pozícia kurzora. Keď sa bude vypisovať po riadkoch a následne sa skontroluje pozícia, stačí predsa “odenterovať” tak aby bolo všetko vidieť. Všetko funguje, ale je to také nešikovné.

Tu sa do toho vložil Holyna. Vymámil informácie od Fly a ten to má vraj od Fandala. Extrémne jednoduché riešenie, nastavenie grafickej pamäte sa posunie o počet riadkov ktoré nie sú dole viditeľné. Osobne preferujem posunúť o jeden riadok menej, print potom vypisuje mimo viditeľnej oblasti a až následne jemne doscroluje do viditeľnej.

No a čo tá grafika? To už bolo jednoduché, nahrá sa MIC z diskety priamo do video pamäte. Super, ale… celé je to také málo farebné. Grafický mód 15 má 4 farby. Problém je že 2 farby zdieľa s textovým oknom. Keď sa budú meniť obrázky, tak sa bude meniť aj farba spodného okna. Nepekné, ale čo s tým?

upraveny DL z NS

Našťastie som si spomenul kde som videl rutinky, ktoré počas prerušenia zmenia hodnotu farebných registrov. Uložil som ich rovno za DL a konečne je to dokonalé. 4 farby v grafike, 2 v textovom okienku. Ak je niekomu málo, môže ešte použiť PMG na ďalšie ofarbenie, ale od toho už dávam ruky preč.

upraveny DL z NP

Okrem Nekonečného príbehu som DL vystrihol aj z Videopoly, Rychlé Šípy aneb Záhada hlavolamu a Red Moon.

Všetko nájdete na GitHube.

Prvá verzia DL je funkčná no druhá zahŕňa aj jemný scroll a ofarbenie pomocou DLI.

Krátke vysvetlivky:

  • ANTIC – mikroprocesor určený na tvorbnu obrazu
  • GTIA – obvod zlučuje obrazové dáta z ANTICu s informáciou o farbe, ovláda PMG a iné
  • PMG – player misile graphics, v skratke sprity
  • Display List – program pre ovládanie ANTICu, umiestnený na adrese SDLSTL
  • SDLSTL, PEEK(560)+PEEK(561)*256 – adresa display listu
  • Display List Interrupt – program využívajúci prerušenie je na adrese VDSLST a spustí ho POKE 54286,192 (v DL je nutné na vyvolanie nastavenie 7meho bitu, teda +128)
  • VDSLST, PEEK(512)+PEEK(513)*256 – adresa display list prerušenia
  • ANTIC mód 3 – v basicu cez GRAPHICS nedostupný. Mód 10×8 pixelov.
  • RAMTOP, PEEK(106) – počet stránok voľnej pamäte
  • SAVMSC, PEEK(88)+PEEK(89)*256 – adresa video pamäte
  • FINE, POKE 622 – povolenie vertikálneho jemného scrollingu (je nutné povoliť ho v DL nastavením 5teho bitu, +32)
  • ROWCRS, PEEK(84) – adresa aktuálneho riadku
  • 1536 – šiesta stránka v pamäti, obsahuje voľných 256bytov