★ APPLICATIONS ★ CREATION GRAPHIQUE ★ SCREEN ENCODER V3 (MOJ MICRO) ★ |
Screen Encoder v3 (Moj Micro) | Applications Creation Graphique |
Stisnimo zaslon CPC 6128 Za program Screen Encoder 3.1 sem dobil idejo v programu Stlačimo zaslon (Moj mikro, 10/1985). Ta je bil namenjen spectrumu. a me je precej zanimal in sem ga priredil za svoj CPC 6128. S predelanim programom je bilo mogoče shraniti poljuben zaslon (screen) v komprimirani obliki, se pravi tako. da je slika na disketi namesto 17 zasedla povprečno 9 K. Algoritem pa je bil zapleten in je bilo treba čakati kar 30 sekund, da je program analiziral in kodiral zaslon. Tudi dekodiranje je bilo počasno. Zato sem sklenil narediti boljši program. Malo teorije, da bi bila ideja bolj razumljiva. Na kateremkoli zaslonu, tudi najbolj zapletenem. se nekateri byti ponavljajo, npr. na področju enake barve. Take byte je pametno zapisati v obliki število ponovitev byta, byte. To ne velja za raznolika področja zaslona, kjer se zaporedni byti med seboj razlikujejo. Splača se kodirati le tiste byte, ki se ponovijo vsaj trikrat, saj v kodirani obliki potrebujemo za podatek dva byta. Zato je na kodiranem zaslonu na začetku katerekoli skupine bytov t. i. kontrolni byte. V njem je zapisano, ali mu bodo sledili različni ali enaki byti. To informacijo shranimo v bitu 0 (če so byti različni: LSB 0; če so enaki: LSB=1). V drugih sedmih bitih zapišemo, koliko različnih' bytov sledi oziroma kolikokrat se bo byte ponovil. S takim bytom lahko zapišemo le 128 različnih ali 130 enakih bytov (najmanj pa 3). Če je enakih bytov npr. 200, jih moramo kodirati v štirih bytih. Prihranek prostora je precejšen. Pri zapisu kontrolnega byta pomaknemo 7 bitov v levo. v LSB pa vstavimo 0 ali 1. Pri tem uporabimo ilegalni ukaz SLSO. opisan v Mojem mikru 4/1985. str. 42. S programom je mogoče kodirati ne samo zaslon, temveč tudi poljuben pravokotnik na zaslonu. Zato sem vnesel rutine, ki poiščejo naslov byta na zaslonu z danimi koordinatami X in Y. Oglišča okna (window) na zaslonu definiramo s koordinatami X1. X2. Y1, Y2. ki so v prvem delu programa shranjene v (IY+0 IY+4). Tu so zapisani po vrsti: začetni in končni X. končni Y ter trenutna X in Y. Tabela je postavljena v nevidnem delu zaslona. Rutini FARD in FINDAD poiščeta iz danih X in Y (z izhodiščem v zgornjem levem kotu) naslov na zaslonu. Pri tem se lahko zahvalimo načrtovalcem grafičnega čipa, da niso toliko zapletli te operacije kot sir Clive pri spectrumu. Če gresta Y od 0 do 199 in X od 0 do 79 (ker je v vrstici 80 bytov), zaslon pa se začne normalno* na #C000,izračunamo naslov z izrazom NASLOV = #C000+(Y MOD 8)*2048 + INT(Y/8)#80 + X. Končna rutina za izračun naslova je NASLOV = #C000 + (Y AND %111)#2048+(Y AND %11111000)#10 + X. Program, ki dekodira zaslon, uporablja več ilegalnih ukazov, opisanih v Mojem mikru 3/1985. str. 36. Parametri za izračun naslova so začetni X (XH). dolžina A »osnovnice« pravokotnega okna (C. XL). začetni Y (YH) in dolžina B »višine« okna (YL). S tem sem dosegel, da se ves zaslon dekodira izredno hitro, v približno 27 stotinkah sekunde. Zgled, kako se uporablja proqram v zbirniku. je program v basicu SCREEN ENCODER 3.1. Dela z modeli CPC 464. 664 in 6128 (v vrsticah 50 in 140 sta simulirana ukaza, ki ju 464 nima). Program v zbirniku je enak tistemu v vrsticah DATA. Če ga boste uporabili v lastnih programih, boste morali sami vnesti vrednosti okna tako kot v vrsticah 80 in 90 programa v basicu. Navodila za uporabo: poženite program v basicu. Najprej vas vpraša za ime zaslona, ki ste ga shranili na disketi ali kaseti, in grafični način, v katerem običajno »gledamo« zaslon. Če vpišete napačen modus, se vam prikaže slika z navpičnim rastrom. V tem primeru pritisnite tipko DEL. da se začne slika nalagati znova. Potem se odločite, kakšno velikost okna boste kodirali. Če je to ves zaslon, samo pritisnite RETURN ali ENTER. Program vam bo pokazal dolžino kodiranega zaslona in vas bo vprašal za ime novega kodiranega zaslona. Okno zmanjšate tako. da hkrati s tipko COPY pritisnete eno od kurzorskih tipk. Ko COPY spustite, se zaslon poveča. Kodirati se da katerikoli del zaslona, program pa sam izračuna naslov, na katerega je treba sliko dekodirati. S pritiskom na presledek dobite negativ vsega zaslona (rutina je v vrstici 630 programa v zbirniku). To je uporabno pri Hobbitu ali Rambu. Napake sporoča program sam. Amstradovci brez disketnika bodo najbrž morali nekoliko spremeniti ali izpustiti del v vrsticah 160-240. Stavkov REM ni treba prepisovati. Dekodiranje zaslona je zelo preprosto: Hl-MEM morate postaviti pod 20000, npr. z ukazom MEMORY 19999. Nato naložite strojni del z ukazom LOAD »ime slike« in poženete program s CALL 20000. Če ste komprimirali uvodno sliko, normalno naložite ostanek igre. Nekaj zgledov stlačene kode (normalna dolžina je 17 K): FRIDAY THE 13th zasede 5, ARABIAN NIGHTS 7, HOBBIT 10, CHOPPER SQUAD 6. PING-PONG 4. COMMANDO 12, MONTY ON THE RUN 8. ATLANTIS 6. SABOTEUR 6. ALIEN 8 pa 8 K. Najdaljšli je Opozorilo: če imate CPC 6128 in vnašate program v zbirniku z Devpackom 3.0. bo nekaj težav. GENA za CPC 464 uporablja za vnos in shranjevanje programov vmesni pomnilnik (buffer). ki leži v modelu 6128 tik pod pomnilnikom, prihranjenim za delo AMSDOS. Če je program v zbirniku predolg, vmesni pomnilnik pri ukazih PUT in GET prekorači mejo HIMEM in onemogoči vse ukaze v zvezi z disketo ali kaseto (RSX). Začetek vmesnega pomnilnika je treba spremeniti takole: GENA vnesite na lokacijo 1000. vrnite se v basic in natipkajte POKE 1118,&00 in POKE 1119,&C0 Program poženite s CALL 1004. Vmesni pomnilnik se zdaj začenja na #C000. Če vas ne motijo packe na zaslonu, ko vnašate ali shranjujete programe, je to najboljša rešitev Pri Devpacku 3.1 ali poznejših verzijah pa teh problemov sploh ni.
|