Opisi:
Moj Mikro, #6, Junij 1987, Uporabni Programi, Marjan Šic
PROGRAM MENU ZA C 64
Preprostejša izbira vsakršnih opcij
Program Menu je namenjen preprosti izbiri raznih opcij v menijih. Meniji so
pri 8-bitnih mlinčkih navadno v naslednji obliki: »1. ... prva opcija, 2. ....
druga opcija, itd.« Običajno sledi stavek »Pritisni ustrezno številko za
izbrano opcijo!« Vendar ostajajo za malčke tudi povsem drugačne oblike menijev
(spomnite se npr. na Art studio), ki že spominjajo na »prijazne« menije v
grafično močnih 16-bitnikih. Program Menu vam omogoča, da pri C 64 uporabite za
izbiro opcij v svojih programih podobno obliko menijev, obenem pa je najbrž
jasno, da zadeva s svojimi 950 byti ne more uspešno konkurirati omenjenim
menijem.
Po klicu programa se pojavita na zaslonu puščica in glavni meni s svojimi
opcijami v prvi zgornji vrstici zaslona. S puščico, ki jo vodimo s palico v
vratih 3, »povozimo« kako opcijo glavnega menija in s tem »odpremo« nov
podmeni. Opcijo podmenija nato enostavno izberemo tako, da se zapeljemo do nje,
opcija se invertira, pritisnemo še sprožilec na palici ter prepustimo dogajanje
programu, ki izbrano opcijo izvršuje - to pa že ni več stvar Menija samega,
ampak problem vašega programa.
Obdelajmo najprej glavni meni. Na naslova $9FF8 (desetiško 40952) in $9FF9
postavimo kazalec (nižji, višji byte), ki kaže na začetek podatkovnega polja v
glavnem meniju. Polje je sestavljeno iz 40 kod teksta ASCII - to je vrstica, ki
bo kasneje v prvi vrsti zaslona - ter štirih kazalcev na začetke podatkov v
podmenijih (glej tabelo!). Zaradi enostavnejšega spreminjanja ASCII v DISPLAY
naj bodo kode manjše od 96 - dovolj za velike črke, številke in ločila.
Upoštevajte, da ima glavni meni štiri opcije (za začetek), zato je za eno
opcijo namenjen prostor 10 znakov. Ker pa so posamezne opcije ločene še s
pregradami, je znakov, ki sestavljajo sporočilo, lahko le devet.
Prvi kazalec (LO,HI) na polje prvega podmenija je na naslovu ($9FF8)+40,
drugi pa so oddaljeni n*2 byta.
Prva byta v podatkovnem polju nekega podmenija povesta koordinati X in Y,
naslednji podatek je širina, četrti byte pa število opcij kasneje odprtega
menija. Ko se bo podmeni narisal, bo njegova oblika nekoliko drugačna, kot bi
pričakovali po prvih štirih podatkih. Ker je podmeni obrobljen, bo njegova
širina za ena večja, kot smo navedli, višina (boljši izraz bi bil globina) pa
bo 2*število opcij+3. Opcije so namreč v vsaki drugi vrstici, trojka pa je tu
zaradi okvira. Paziti morate, da bo podmeni ostal v mejah zaslona. Vsota
koordinate X in širine ne sme presegati cifre 39 (tj. meja X zaslona), vsota Y
(ki mora obvezno biti večji od nič) in višine pa ne večja od 24.
Za temi štirimi bvti sledi na naslovu ($9FF8)+40+n*2)+4) tekst ASCII, ki
predstavlja opcije podmenija. Kode so manjše od 96, prvi znak vsake opcije pa
naj bo presledek (koda 32).
Ko ste pripravili ustrezne pogoje za delo Menuja, Menu lahko poženete z JSR
(SYS) 40572 ter počakate, da bo nekdo poklical neko opcijo v meniju. Katera
opcija je bila izbrana, je moč ugotoviti po vsebini dveh byjtov. Vsebina
naslova $9FF7 (40951) pove številko (od 0 do ...) odprtega podmenija, na
naslovu $9FF6 pa je shranjena zaporedna številka izbrane opcije v tem
podmeniju. Na temelju teh dveh vrednosti lahko usmerite tok dogajanja v
podprogram, ki bo izbrano opcijo izvršil.
Program ne razlikuje med morebitnimi opozorili v menijih in pravimi opcijami,
vendar lahko to kontrolirate sami. Če imate v nekem meniju ali v le eni izmed
opcij zapisano npr. copyright in ime programa, ter je nekdo poklikal ravno to
ime, lahko njegove odločitev ignorirate s skokom na $9E97 (40599). Stanje na
zaslonu se zaradi tega ne bo prav nič spremenilo, le uporabnik bo imel občutek,
da klikanje po nekem tekstu noče »prijeti«.
Vsem morda ne bo všeč, da ima glavni meni le štiri opcije, zato obstaja
možnost, da s štirimi poki dodelite glavnemu meniju tudi 2, 5, 8 ali 10 opcij
(in s tem enako število možnih podmenijev). Na naslov 40176 pride izbrano
število manj ena, naslov 40178 popokate z (40/izbrano število) manj ena, na
naslova 40188 in 40612 pa postavite za ena večje vrednost kot na drugi naslov.
Po tem posegu morate ustrezno spremeniti tudi število kazalcev in podatkovnih
polj podmenijev.
Prvi pogoj, da bo program normalno deloval, je seveda ta, da pravilno
prepišete vrstice DATA. Demo program je poleg stavkov DATA tudi v obliki
asemblerskega listinga - kot primer, kaj približno morate storiti, da bo Menu
normalno deloval. Demo poleg nekaterih obveznih stvari preverja v vrstici 16,
ali je bila poklikana kakšna vrstica menija št. 3 (tu sta zapisani imeni
programa in avtorja) ter po potrebi vašo odločitev ignorira za JSR $9E97.
Večja pomanjkljivost Menuja je najbrž ta, da ne shranjuje vsebine tistega
dela zaslona, kjer odpre podmeni, zato tudi ne morete imeti na zaslonu
istočasno drugih podatkov, ker jih bo Menu pobrisal. Problem bi se dalo sicer
uspešno rešiti z uvedbo dveh podprogramov (shrani-vrni), ki bi ju klicali pred
oz. po risanju podmenija, vendar bi program počasi postal predolg za
prepisovanje.
Morda komu tudi ne bo všeč, kako invertiramo opcije, vendar se to na navadnem
tekstovnem zaslonu dosti bolje ne da urediti.
Pa še nekaj! Če boste Menu uporabljali iz kakšnih mamutskih basicovih
programov s stavki v stilu DIM xyz (1000), ga je priporočljivo zaščititi z
ukazi: POKE 55,43: POKE 56,156: CLR. S tem znižamo basicu dostopen prostor na
naslovu 39979 ter mu onemogočimo, da bi pobrisal strojno kodo, ki se sicer
začenja na 39980.
naslovi vsebina komentar
-------------------------------------------------------------------------------
$9FF8 <>glav. meni ;kazalec na podatkovno polje
glavnega menija
glav. meni "DESK FILE ..." ;40 ASCII kod za opcije
glavnega menija
glav. meni+40 <>podmen0 ;kazalci na začetke polj
glav. meni+40+2 <>podmen1 podmenijev podatkovna
glav. meni+40+4 <>podmen2 polja podmenijev
glav. meni+40+6 <>podmen3
podmenO X,Y,širina, št. opcij ;ASCII tekst
podmenO+4 " OPCIJA 0"
podmen0+4+1*širina " OPCIJA 1 "
podmen0+4+2*širina " OPCIJA 2 "
itd.
podmen1 X1,Y1,širina1,št. opcij
podmeni1+4 " in tako dalje ... "
|