Tentoraz som si pripravil pre vas nieco prakticke. Tento
program vyuziju najme ti, ktori vela programuju v basicu.
Uz sa vam urcite stala situacia, ze ste mali v pocitaci nejaky
rozsiahly program v basicu a potrebovali ste najst vsetky
vyskyty nejakeho prikazu - napriklad ste si chceli popozerat a
skontrolovat vsetky prikazy POKE - skratka co sa kde "poukuje".
Neostavalo vam nic ine ako pracne prezerat cely basic. Pritom
sa vam mohlo velmi lahko stat, ze ste daco prehliadli. Ti, ktori
maju Beta Basic to maju ovela jedoduchsie - mozu pouzit prikaz
REF ktory dokaze v basicu najst vsetky vyskyty daneho objektu.
Lenze Beta Basic zabera v pameti nieco vyse 18 kB (verzia 3.0)
co nie je zrovna malo a preto sa pri dlhsich basicovych
programoch do pameti proste nevojde.
Riesenie tejto situacie vam ponuka nasledujuci program. Tento
program spolahlivo "vynucha" aj ten najzasitejsi prikaz alebo
znak. Pritom ma iba nieco vyse 1200 bajtov.
Staci ho len prikazom MERGE nahrat k prehladavanemu basicovemu
programu a spustit od riadku 7901. Po spusteni si program sam
vypyta potrebne udaje - interval riadkov, v ktorom sa ma
prehladavat a potom hladany znak.
Ako hladany znak mozete zadat prakticky lubovolny znak z celej
ASCII tabulky Spektra - teda nielen prikazy, ale aj pismena,
znamenka, zatvorky, graficke znaky, riadiace kody...
Akonahle sa zisti vyskyt hladaneho znaku v hladanom programe,
vypise sa na obrazovku cislo riadku, cislo prikazu a potom
samotny prikaz aj s parametrami, v ktorom sa hladany znak
nasiel.
7901
BORDER 7: POKE 23693,56: CLS
7902
LET f=1: LET n=PEEK 23635+256*PEEK 23636: LET vars=PEEK 23627+256*PEEK 23628
7903
LET k=16383: INPUT CHR$ 8;" LINE start: ";od;" koniec: ";do;AT 0,0;"Hlada sa: ";a$: CLS
7904
LET g=0: IF od<>ABS od OR do<>ABS do THEN LET g=1: LET od=ABS od: LET do=ABS do
7905
IF n>=vars THEN STOP
7906
GO SUB 7917: LET n=n+1: GO SUB 7918: IF l<od THEN LET n=n+b+1: GO TO 7905
7907
IF l>7900 AND l<7930 THEN LET n=n+b+1: GO TO 7907
7908
LET t=n: LET n=n+1: IF l>do THEN STOP : STOP : STOP
7909
LET m=PEEK n
7910
IF m=CODE a$ THEN GO SUB 7919
7911
IF m=CODE """" THEN LET f=1-f
7912
IF f AND (m=CODE ":" OR m=CODE " THEN ") THEN LET s=s+1: LET t=n
7913
IF m=14 THEN LET n=n+5
7914
LET n=n+1
7915
IF m=13 THEN GO TO 7905
7916
GO TO 7909
7917
LET s=1: LET l=PEEK (n+1)+256*PEEK n: LET n=n+1: RETURN
7918
LET b=PEEK n+256*PEEK (n+1): LET n=n+1: RETURN
7919
PRINT PAPER 5;l;",";s;: PRINT TAB 8;: LET f=1: LET n=t
7920
LET n=n+1: LET m=PEEK n
7921
IF m=CODE """" THEN LET f=1-f
7922
IF f AND (m=58 OR m=13) THEN PRINT : RETURN
7923
IF m=14 THEN GO SUB 7926: LET n=n+5: PRINT PAPER 6;"=";c;: GO TO 7920
7924
IF g THEN POKE 23692,255
7925
PRINT CHR$ m;: GO TO 7920
7926
IF NOT PEEK (n+1) THEN LET c=PEEK (n+3)+256*PEEK (n+4): RETURN
7927
LET c=2*(.5+PEEK (n+2)/256+PEEK (n+3)/65536+PEEK (n+4)/16777216+PEEK
(n+5)/4.2949673e9)*2^(PEEK (n+1)-129): RETURN
Tento program dokaze este jednu velmi uzitocnu vec - pri
vsetkych ciselnych konstantach v programe vypise ich skutocnu
hodnotu danu piatimi bajtami nasledujucimi po kode 14. Pomocu
tejto funkcie mozete odhalovat tie zakerne basicy, ktore pri
listingu ukazuju ine hodnoty nez v nich skutocne su. Ked zadate
prave CHR$ 14 ako hladany znak, tak vam tento program najde
vsetky ciselne konstanty v basicu.
Iste ste si vsimli pomerne nezvycajne cisla riadkov. Tieto
cisla riadkov boli volene tak, aby sa dal tento program bez
problemov "primergnut" do prehladavaneho basicu. Malo by to byt
bez problemov, pretoze pravdepodobnost vyskytu takychto riadkov
v inych programoch je velmi mala.
Na riadku 7907 je test ktory zabezpeci aby pri prehladavani
daneho basicu tento program sam seba preskocil. Na poslednych
dvoch riadkoch programu je vypocet ciselnej hodnoty z piatich
bajtov po kode 14.
Komu by sa zdalo, ze program pracuje prilis pomaly, moze si ho
skompilovat. Cely program pracuje iba s celymi cislami okrem
vypoctu hodnoty piatich bajtov po kode 14 na poslednych dvoch
riadkoch.
Na zaver jedna drobna rada: Ak by ste pri zadavani hladaneho
znaku nevedeli napisat nejaky prikaz ktory sa pise kurzorom "K"
tak najprv napiste THEN - za tymto THEN sa vam objavi kurzor
"K" - potom napiste dany prikaz a THEN deletnite.