clanky/co-v-man-neni

Co v manuálu nenajdete

Jiří Greif, Josef Böhm

Interpret jazyka BASIC mikropočítače ZX SPECTRUM poskytuje mnohem širší možnosti, než by se mohlo jevit i po důkladném přečtení manuálu. Jen dokonalá znalost systému počítače umožní plně využívat jeho schopností. Především příkaz POKE s vhodnými parametry "donutí" systém k dosti neobvyklým činnostem. V příspěvku se záměrně vyhýbáme strojovému kódu a detailnímu vysvětlování, které by mnohdy bylo zdlouhavé a složité. Pokus si zapnete vaše ZX SPECTRUM a vyzkoušíte uvedené příklady, zjistíte, že jakékoli podrobnější vysvětlování je zbytečné.
Studiem uvedené literatury, firemních programů a převážně vlastním laborováním jsme nalezli mnoho zajímavých programátorských obratů. Uvádíme zde jen ty nejjednodušší, které mají časté praktické použití.

1.

Je-li zapotřebí za běhu programu změnit mód kurzoru, například pro příkaz INPUT, na 'C', příkazem POKE 23658,8 se změní obsah systémové proměnné FLAGS2. Do módu 'L' se lze vrátit příkazem POKE 23658,0.

2.

Pomocí funkce CHR$ je možno do řetězce znaků vložit nejen řídicí znaky pro INK, PAPER, BRIGHT, FLASH, OVER a INVERSE, které jsou uvedeny v manuálu v kapitole 16 a které lze s výhodou vložit přímo z klávesnice v módu 'E', ale i řídicí znaky pro AT, TAB, 'PRINT comma', 'cursor left' a 'ENTER'. Interpret se snaží při tisku řetězce, tedy i při "listingu", intereretovat všechny nalezené znaky. Proto lze pomocí rídicích znaku vytvořit řetězce, jejichž tisk nebude záviset ani na předchozím stavu, ani na parametrech příkazu PRINT.

Příklad:

10 LET a$=CHR$ 22+CHR$ 10+CHR$ 10+"TEXT"
20 PRINT AT 0,0;0$
30 LET b$="A"+CHR$ 8+CHR$ 21+CHR$ 1+"V"
40 PRINT b$
50 SAVE CHR$ 13+"J"+CHR$ 13+"M"+CHR$ 13+"E"+CHR$ 13+"N"+CHR$ 13+"0"
60 CLS : LOAD ""

Za řídicími znaky musí následovat parametry, jejichž počet a rozsah hodnot odpovídá příslušnému příkazu. Tyto parametry lze opět vložit funkcí CHR$, viz příklad. Chybný parametr způsobí chybu a výpis chybového hlášení. Hodnoty kódů řídících znaků jsou uvedeny v manuálu, příloha A.

Řídicí znaky lze vkládat přímo do programu.
Příklad (bez Interface I).

  10 REM 123TEXT

a z editační zóny:

  POKE 23760,22: POKE 23761,0: POKE 23762,0

Pro zjišťování adres pro příkazy POKE lze použít

9999 FOR n=23755 TO 30000: PRINT n,PEEK n; TAB 22;CHR$ (PEEK n+32*(PEEK n<32)): NEXT n

Hodnota 23755 je uložena v systémové proměnné PROG a udává první adresu použitou v BASICU. Aktuální hodnotu lze zjistit:

  PRINT PEEK 23635+256*PEEK 23636

Horní mez cyklu si upravte podle vlastní potřeby. Adresu posledního bajtu použitého pro program zjistíte příkazem:

  PRINT PEEK 23627+256*PEEK 23628

Výraz...

  CHR$ (PEEK n+32 (PEEK n<32))

...zajistí, ze nedojde k chybovému hlášení. Při použití pouze CHR$ PEEK n by systém interpretoval na příklad 17 jako kód řídicího znaku PAPER a pokud následující bajt obsahuje hodnotu větší než 9, dojde k chybě (podobně pro ostatní kódy řídicích znaků).

Zmíněný výraz lze nahradit výrazem...

  CHR$ (PEEK n+(32 PEEK n) PEEK n<32))

...který znaky s kódem menším než 32 nahradí mezerou a nikoli neodpovídajícím znakem ASCII. Tento program vám umožní prohlédnout si strukturu programu v BASICU, například u méně chráněných firemních zaváděcích programů.

3.

Pokud v programu čekáte na stisk nějaké klávesy, zkuste...

  10 BORDER 2: BORDER 4: BORDER 5: BORDER 6: BORDER 7: PAUZE 1:	IF INKEY$ ="" THEN GO TO 10

...a na dalším řádku následuje obsluha patřičné klávesy. Jestliže čekáte na konkrétní klávesu, například A, nahraďte podmínku INKEY$="" podmínkou INKEY$<>"A" (pro ENTER podmínkou CODE INKEY$<>13) Podmínku nelze příliš zkomplikovat, neboť provedení celého řádku může trvat nejvýše 20 ms. Efekt způsoben tím, že příkaz PAUSE 1 čeká na přerušení, které je synchronní s TV obrazem.

4.

Velkou výhodou jazyka BASIC na ZX SPECTRUM je jeho ortogonalita. Libovolný aritmetický, výraz lze vždy umístit tam, kde se pozaduje číselná hodnota, někdy dokonce i řetězec znaků. Chceme-li během programu tisknout jen za určitých podmínek, nemusíme použít příkazu IF THEN:

10 IF LEN INKEY$ THEN PRINT "ZX";"SPECTRUM" AND INKEY$ CHR$ 13
20 GO TO 10

Celý řetězec se vytiskne jen při stisknutí klávesy 'ENTER'. Chceme-li místo dotazu 'scroll?' začít tisk znovu od řádky O, použijeme:

  PRINT AT 24-PEEK 23689 AND PEEK 23689=2,0;"TEXT"

Použití logických výrazů demonstruje následující příklad. Program napíšeme nejprve "normálním" způsobem:

20 LET x=127: LET y=87
30 LET a$=INKEY$
40 IF a$="8" AND x<255 THEN LET x=x+1
50 IF a$="5" AND x>0 THEN LET x=x-1
60 IF a$="7" AND y<175 THEN LET y=y+1
70 IF a$="6" AND y>0 THEN LET y=y-1
80 PLOT x,y
90 GO TO 30

Stejný program s využitím logických výrazů:

20 LET x=127: LET y=87
30 LET a$ INKEY$
40 LET x=x+(x<255)*(a$="8")-(x>0)*(a$="5")
60 LET y=y+(y<155)*(a$="7")-(y>0)*(a$="6")
80 PLOT x,y
90 GO TO 30

Chceme-li kreslit i šikmo:

20 LET x=VAL "127": LET y=VAL "87"
30 LET l=VAL "63486": LET r=VAL "6143
40 LET x=x+(x<255)*(NOT INT (IN r/4)-2*INT (IN r/8))-(x>0)*(NOT INT (IN l/16)-2*INT (IN l/32))
60 LET y=y+(y<175)*(NOT INT	(IN r/8)-2*INT (IN r/16))-(y>0)*(NOT INT (IN r/16)-2*INT (IN r/32))
80 PLOT x,y 
90 GO TO 40

Toto verze je ale pomalejší, proto ji přepíšeme:

20 LET x=VAL "127": LET y=VAL "87"
30 LET l=VAL "63486": LET r=VAL "61438"
40 LET x=x+(x<255)*(IN r=251 OR IN r=243 OR IN r=235)-(x>0)*(IN l=239)
60 LET y=y+(y<175)*(IN r=247 OR IN r=243)-(y>0)*(IN r=239 OR IN r= 235)
80 PLOT x,y: IF IN 65278<>255 THEN PLOT OVER l;x,y
90 GO TO 40

Pokud tato verze chodí, máte patrně poslední, 6. verzi počítače, u které bylo odstraněno rušení na 6. bitu brány 254 (bity 0. 1, 2 - border, bit 3 - mic, bit 4 - ear, bity 5, 6, 7 - nepoužity). Nechodí-li, umístěte na řádek 40 příkaz OUT 254,255 (248 + barva borderu). U poslední verze programu se při současném stisku kláves 'CAPS LOCK' a kurzorových kláves posouvá jen bod.

Pokud vás zaujal počet závorek ve třetí verzi, určete hodnoty těchto výrazů:

NOT 0+NOT 0, 23 AND 0+10 o 23 OR 1-1.

Pro kontrolu, hodnota prvního výrazu je rovno 0, druhého 23 a třetího rovněž 23. Na první pohled je to zajímavé chování, ale tabulka priorit operátorů a funkcí v příloze C vše objasní. Priority logických operátorů jsou velmi nízké, a proto se vyraz nejprve vyčíslí zleva a teprve potom se uplatní logický operátor.

5.

Chcete-li ochránit nějaký kratší program (viz zaváděcí firemní programy) před vylistováním, je nejjednodušší znemožnit 'BREAK" a 'MERGE ""'. Jeden z mnoho způsobů (vyžaduje, aby program obsahoval alespoň jednu proměnnou):

1 POKE VAL "23635"+VAL "256"*PEEK VAL "23636"+VAL "42",PI-PI
2 CLS: POKE 23659,CODE ""

10 FOR n=0 TO 1 STEP NOT PI: PRINT AT RND *21,RND*31;PAPER RND*8;INK 9;"*": NEXT

Po vložení programu vyeditujeme řádek 1, zrušíme číslo řádku, najedeme kurzorem na konec a výraz PI - PI nahradíme číslem větším než 237 (například 255) a stiskneme 'ENTER'. Program nahrajeme příkazem SAVE "NO MERGE" LINE 1. Chování si ověříme při LOAD "" a MERGE "". Příkazy VAL "23635", PI - PI atd. budou vysvětleny později.

6.

Následující program demonstruje, že i v BASICu lze, i když se značným omezením, naprogramovat jemný "scrolling":

 10 BORDER NOT PI: PAPER NOT PI: INK VAL "7": CLS
 20 FOR i=NOT PI TO INT PI: READ a$
 30 FOR m=PI/PI TO LEN a$ STEP 1+LEN a$*(i>0) 
 40 LET s=0: FOR r=0 TO 4+5*i
 50 FOR n=s TO 8: BEEP .005,2*n+30
 60 LET a=14335+n*256+m+32*(i+4*(i=3)) 
 70 POKE 23688,32: POKE 23689,24-n
 80 RANDOMIZE a: POKE 23684,PEEK 23670: POKE 23685,PEEK 23671
 90 PRINT (a$(m) AND i=0)+(a$ AND i<>)
100 NEXT n: LET s=7: NEXT r: NEXT m: NEXT i 
110 BEEP .01,RND*20+40: GO TO 110
120 DATA " VAS MIKROPOCITAC ZX SPECTRUM", 
         " UMI VICE, NEZ SI MOZNA MYSLITE",
         " MNOHO USPECHU VASI PRACI PREJE",
         "MENTAL HOUSE SOFTWARE, Plzen 86"

Řádky 70 a 80 mění obsah systémových proměnných $ POSN a DF CC, které obsahují informace systému o aktuální tiskové pozici, čímž je dosaženo výsledného efektu. Na řádku 50 se provádí výpočet fyzické adresy pro tisk, počtem násobku hodnoty 32 určujeme číslo řádku (rozsah hodnot 0 až 7) a hodnota m určuje pozici tisku na řádku: tyto hodnoty souvisejí s adresní reprezentací pro zobrazování. Tento obrat lze použít pouze pro horní třetinu obrazovky, pro zbývající dvě třetiny sice použít lze, ale jeho chování je odlišné.

7.

Animaci, kterou známe z firemních programů, lze v BASICu realizovat ještě snadněji:

   1 BORDER 3: PAPER 5: INK 0: CLEAR 65199: PRINT AT 10,10;"MOMENT"
   2 RESTORE 6000: FOR n=USR "a" TO USR "a"+151 :READ a: POKE n,a: NEXT n
   3 FOR m=0 TO 151: PRINT AT 12,12;152-M;TAB 15
   4 LET c=PEEK (USR "a"+m)
   5 LET a=0: FOR n=a TO 7:
   6 LET d=INT (c/2): LET a=2*a+(2*d<>c): LET c=d: NEXT n
   7 POPE USR "a"+m-168,a: NEXT m
   8 LET p=23675: LET b=1: LET n=0: RESTORE 6200
   9 CLS: PRINT #1;AT 11,0: GO TO 90
  10 GO TO (INKEY$ ="7")*20*(n>31)+(INKEY$ ="6")*10*(n>0)+10
  20 RESTORE 6300: LET b=-1:	POKE p,176: POKE p+1,254: GO TO 90
  30 RESTORE 6200: LET b=1: POKE p,88: POKE p+1,255
  90 FOR i=1 TO 6: READ a$,b$: PRINT AT 10,n; a$;AT 11,n;b$
 100 BEEP .004,i: NEXT i
 110 LET n=n+b: GO TO 10
6000 DATA 56,62,72,68,40,112,112,88,294,252,176 .48,48,48,48,58,28,31,36,34,20,56,102,215, 149,220,222,55,
     115,97,97,113,128,192,0,0, 128,128,128,192,7,7,9,8,5,30,53,101,197, 199,15,12,24,120,96,64,0,192,0,
     128,0,0,128 .216.120,128,192,224,48,24,28,0,1,2,2,2,1, 31,62,34,98,99,3,7,62,60,32,0,192,240,64, 70,
     140,248,224,128,240,248,24,10,14,4,0.0, 0,1,1,0,3,7,5,13,25,25,3,7,14,8,12,224,248 ,32,16,160,192,96,
     118,94,224,248,28,12,4,6 ,5,56,62,72,68,40,112,232,236,174,251,249, 44,102,230,130,195
6200 DATA "C ","DE","FH","GI","JL","KM","NP","OQ"," R"," S"," A"," B"
6300 DATA "C","D",CHR$ 8+"HF",CHR$ 8+"IG",CHR$ 8+"LJ",CHR$ 8+ "MK",CHR$ 8+"PN",CHR$ 8+" QO",CHR$ 8+"R ",
     CHR$ 8+"S ",CHR$ 8+"A", CHR$ 8+"B"

Data na řádku 6200 a 6300 jsou zadávána v grafickém módu. Řádek 2 nadefinuje UDG z dat na řádku 6000 (ten vlastně obsahuje potřebné "sprajty"), řádky 3 až 7 vytvoří v paměti RAM druhé UDG zrcadlově obrácené. Cyklus na řádce 90 provádí vlastní animaci a pro zvýšení rychlosti může být nahrazen sekvencí příkazů PRINT s jednotlivými řetězci. Příkaz BEEP na řádku 100 zpomaluje v tomto případě animaci a může být nahrazen například příkazem GO SUB atp. Animaci jednoho kroku lze volat rovněž jako podprogram a pokud použijeme například M CODER 2 (po patřičných "kosmetických" úpravách programu), přiblížíme se rychlostí strojovému kódu a zbude nám čas na vedlejší činnosti.

8.

V manuálu (kapitola 22) je řečeno, že příkazy OPEN#, CLOSE#, MOVE, ERASE, CAT a FORMAT nelze použít bez připojeného Interface I. Toto tvrzení však není zcela pravdivé, neboť lze běžně používat příkazy OPEN# a CLOSE#. Syntaxe těchto příkazů je tato:

OPEN# A,B CLOSE# A

...kde A představuje výraz, jehož hodnota leží v intervalu 0 až 15 a B představuje výraz, jehož hodnotou je řetězec s obsahem buď "k", nebo "K" označení klávesnice - keyboard), nebo "s" či "S" označení obrazovky - screen), dále "p" nebo "P" označení tiskárny - printer), jakož i označení periferií dostupných s Interface I. Příkaz OPEN# připojí logický kanál (stream) daného čísla k fyzickému kanálu (channel). Příkaz CLOSE# toto připojení zruší. Systém si tyto informace ukládá od adresy 23568, systémová proměnná STRMS, a vzhledem k tomu, že popis v manuálu chybí, doplňujeme: STRMS je tvořena 38 bajty (19 dvoubajtových hodnot). Tyto hodnoty udávají posunutí v tabulce fyzických kanálů (viz další odstavec).

První tři hodnoty jsou určeny pro interní použití systémem ("K", "S" a "R"), zbývajících 16 hodnot jsou logické kanály 0 až 15. Po zapnutí počítače nebo jiné "tvrdé" inicializaci systému jsou logické kanály 0 a 1 připojeny ke "K", tj. editační zóně, logický kanál 2 je připojen k "S", tj. obrazovka, a logický kanál 3 k "P", tj. tiskárna. Kanály 4 až 15 jsou odpojeny.

Takže pomocí příkazu OPEN# 3,"P" lze vše, co má být programem tištěno na obrazovku, přesměrovat na tiskárnu. Původní stav obnovíte: CLOSE# 2 nebo OPEN# 2,"s". Máte-li v počítači nějaký program, vyzkoušejte OPEN# 2,"k": LIST: PAUSE 0. Číslo logického kanálu lze použít i jako parametr příkazů PRINT, LIST, LLIST, LPRINT, a INPUT. Příklad:

10 PRINT #1;TAB 10;"TEXT": PAUSE 0
20 INPUT "CISLO = ";a;#2;"ZADANO ";(a): GO TO 20

Řádek 10 tiskne do editační zóny, řádek 20 umožní zadat číslo a současně jej vytisknout jediným příkazem.

Systém počítače umožňuje i bez Interface I používat všech 16 logických kanálů, z nichž každý může být připojen k libovolnému dostupnému fyzickému kanálu. To však znamená, že v programu lze pro výstupy a vstupy odlišného charakteru používat různé logické kanály o ty podle momentální potřeby připojit k patřičným fyzickým kanálům: Příklad:

 10 OPEN# 10,"k" 
 20 OPEN# 15,"s" 
 30 OPEN# 8,"s" 
 40 OPEN# 7,"s" 
 50 OPEN# 6,"k"
 60 PRINT# 15;"KONTROLNI TISK"'BRIGHT 1'"TEST1" 
 70 PRINT# 10;"TISK MEZIVYSLEDKU";BRIGHT 1,test1"
 80 PAUSE 80
 90 INPUT# 6;VSTUP DAT ";LINE a$
100 PRINT# 7''"KONTROLA DAT"'BRIGHT 1'a$
110 PRINT# 8'"TISK VYSLEDKU"'BRIGHT 1;12345

Změnou řádku 30 na OPEN# 8,"p" a řádku 40 na OPEN# 7,"p" dosáhneme toho, že zadané hodnoty a výsledky budou tištěny na tiskárně.

Uvedené informace by vás mohly vést k tomu, že editační zónu lze přepojit na obrazovku a získat tak možnost zadávat data po celé obrazovce formou vyplňování tabulky, což lze, ale systém se chová zmateně (například 'DELETE'), i když pracuje správně. Problém vyřešíme příkazem:

  INPUT AT 22,0;AT n,m;"TEXT";AT n1,m1; ...

Zde však nedojde k přepojení editační zóny na obrazovku, ale k jejímu zvětšení na 23 řádky parametrem AT 22,0:, o čemž se můžete přesvědčit tím, že PAPER a BORDER obarvíte odlišnými barvami. Dalšími parametry AT nastavuje tiskovou pozici. Po skončení příkazu INPUT se celá toto oblast vymaže a nestaví se opět původní stav.

9.

Informace o fyzických kanálech jsou uloženy v paměti RAM bezprostředně za systémovými proměnnými (počátek urcuje systémová proměnná CHANS). Změnou jejich obsahu lze přimět systém k činnostem jinak neproveditelným, ale velmi užitečným. Vzhledem k jejich struktuře a snadné modifikovatelnosti uvádíme podrobně jejich tabulku:

  Délka Adresa  Obsah	 Význam
a)  2    23734   2548  adresa rutiny PRINT OUT
b)  2    23736   4264  adresa rutiny KEYB. INPUT
c)  1    23738     75	 "K"
a)  2    23739   2548  adresa rutiny PRINT OUT
b)  2    23741	 5572  adresa rutiny REPORT J
c)  1    23743	   83	 "S"
a)  2    23744   3969  adresa rutiny ADD CHAR
b)  2    23746   5572  adresa rutiny REPORT J
c)  1    23748	   82  VÝZNAM
a)  2    23749   2548  adresa rutiny PRINT OUT
b)  2    23751	 5572  adresa rutiny REPORT J
c)  1    23753	   80	 "P"
    1    23754	  128  koncová značka

Obecně:

  1. adresa podprogramu pro výstup
  2. adresa podprogramu pro vstup
  3. symbolické označení fyzického kanálu

Podprogram REPORT J je použit vždy tam, kde operace vstupu nemá smysl a způsobí chybové hlášení Invalid I/O device. Symbolické označení R přísluší pracovní oblasti, systém ji používá interně.

  Příklad: SAVEK "A": POKE 23736,181: SAVE "B"

Počítač se ohlásí standardním "Start tape, press any key" pouze u prvního příkazu SAVE, u druhého začne okamžitě ukládat, aniž by čekal na stisk klávesy. Neobvyklé chování je způsobeno tím, že modifikujeme adresu podprogramu pro vstup z klávesnice tok, že skočíme až na její 7. instrukci a systém se chová, jako kdyby klávesa bylo již stisknuta. Po vykonaní SAVE "8" si systém obnoví původní obsah. Při příkazu SAVE systém vždy vymaže editační zónu. Chceme-li její obsah zachovat, například při ukládání obrazovky, můžeme použít:

10 POKE 23659,1: CLS: REM pouze naplní obrazovku
20 POKE 23734,111: POKE 23736,20
30 PAUSE 0
40 SAVE "OBRÁZEK" SCEEN$

Nahradili jsme adresy podprogramů PRINT OUT a KEYB. INPUT adresou strojové instrukce RET (hodnota 201), vhodnou modifikaci původních hodnot je použita pamět ROM. Příkaz PAUSE zajistí, že system čeká na stisk klávesy.

Po nahrání obrazovky si často přejeme, aby se nám hlavička hlavního programu nenapsala na obrazovku a nepoškodilo tak obrázek. To můžeme zajistit tak, že před natažením hlavního programu příkazem PRINT nastavíme tiskovou pozici a stejný INK a PAPR s tím, že v obrázku máme pro hlavičku místo. Máme však i jinou možnost. Změnou kanálových informací systém přesvědčíme, že "obrazovka je na tiskárně", obvykle nepřipojené. Dosáhneme toho tak, že v kanálových informacích přepíšeme symbolické označení obrazovky "S" na označení tiskárny "P" příkazem POKE 23743,80. Vzhledem k tomu, že systém si původní hodnotu neobnoví, zajistíme návrat k původnímu stavu příkazem POKE 23743,83.
Obdobně lze na tiskárnu přemístit editační zónu, tiskárnu na obrazovku (vhodné pro odlaďování programů používajících tiskárnu, neboť zamění fyzický kanál "P" za "S"). Bližší podrobnosti získáte prostudováním tabulky uvedené výše.

10.

Při nahrávání obrazovky u firemních programů se obrázek objeví až při nahrávání atributů. Zajistíme to tím, že nastavíme stejný INK a PAPER. V editační zóně však zůstanou atributy nastaveny tak, aby byl INK co nejkontrastnější. Jestliže použijeme POKE 23624,a: CLS: LOAD "CODE, naplní se atributy pro editační zónu podle hodnoty a, kterou spočítáme: a*ink+8*paper+64*bright+128*flash, kde ing, poper, bright a flash jsou vámi požadované hodnoty parametru (manuál, kapitola 16). Hodnota 23624 je adresa systémové proměnné BORDER.

11.

Stalo se vám někdy, že jste potřebovali skočit na 5. příkaz v řádku, například za podmínku, která není splněna? Systém se orientuje podle obsahu systémových proměnných NEWPPC a NSPPC. Jestliže je vhodně změníme, program bude pokračovat tam, kam mu ukážeme. Příklad:

10 PRINT AT 0.0;"START";: PRINT "!";: BEEP .01,22: POKE 23620,2

Do proměnné NEWPPC vkládáme číslo řádku, do pro?měnné NSPPC číslo příkazu no řádku, který bude zpracováván. Těchto příkazů však používejte zřídka, pouze pro nějaké speciality, neboť používání podobných obratů je neprogramátorské.

12.

Při psaní programu občas potřebujeme převést číslo v rozsahu hodnot 1 až 65535 do dvoubajtové podoby. Můžeme využít příkazu RANDOMIZE X, kde X je číslo, které chceme převést. Odpovídající hodnoty nalezneme pomocí:

PEEK 23670	(bajt s nižší váhou)
PEEK 23671	(bajt s vyšší váhou)

Pozor však na používání v programech, neboť RANDOMIZE 0 je totéž co RANDOMIZE a dává pseudonáhodnou hodnotu (manuál, kapitola 11).

13.

Zajímavostí interpretru je to, že je schopen vyhodnotit i výrazy typu PRINT 1-----+--++--+-----1,PI -+-+-+-+-+-PI. Základní monitor "umí" 'BREAK' nejen stisknutím kláves 'CAPS SHIFT'+'SPACE', ale i 'CAPS SHIFT' s 'B'+'V', nebo s 'C'+'N', nebo s 'X'+'M', nebo s k'Z'+'SYMBOL SHIFT'. Se stejnými kombinacemi kláves 'BREAK' působí i 'SPACE'. Vzhledem k hardware mikropočítače ZX SPECTRUM můžeme měnit BORDER nebo posílat pulsy na "buzzer" nejen příkazem OUT 254,HODNOTA, ale můžeme použít libovolnou sudou adresu. Vyzkoušejte si: PRINT AT 0,0:: RANDOMIZE USR 4756.

14.

Jestliže potřebujete za běhu programu zjistit, kam se bude příště tisknout, můžete použít informace uložené v systémové proměnné S POSN. Tam si systém ukládá informaci o stavu tiskových čítačů, ale ve své vnitřní reprezentaci. Proto použijte pro zjištění sloupce: 33-PEEK 23688 a pro zjištění řádku 24-PEEK 23689.

15.

Příkaz COPY vytiskne obsah obrazovky na tiskárně, ovšem bez editační zóny. Abychom měli obrázek kompletní, musíme použít krátký podprogram ve strojovém kódu:

DI	       ;243
LD	8,192	 ;6,192	počet řádků
JP	3759   ;195,175,14	skok kdo COPY

Podprogram umístíme například do příkazu REM:

 1 REM 123456obcde
10 FOR n.23760 TO 23765: READ a: POKE n,a: NEXT n
20 DATA 243,6,192,195,175,14

Po proběhnutí programu můžeme řádky 10 a 20 zrušit. Podprogram spustíme příkazem RANDOMIZE USR 23760. Znaky 123456 vytvářejí prostor pro strojový kód, znaky abcde jsou za strojovým kódem proto, aby se systém choval "normálně". Bajt s hodnotou 14 bude interpretován jako příznak, že následuje 5 bajtů reprezentace čísla, a proto je systém při "listingu" ignoruje. Mezi těmito bajty by v našem případě byl 'ENTER' a dokonce i koncová značka BASICU a "listing" by pokračoval v oblasti E LINE.

Vzhledem k tomu, že řádky se strojovými programy nelze dost dobře editovat, lze řádek zabezpečit proti editaci tím, že mu dáme číslo 0 příkazem POKE 23756,0. Poznamenejme ještě, že kód 14 následuje na ASCII reprezentací čísla a je následován pětibajtovou binární reprezentací hodnoty (viz manuál, kapitola 24). Proto zápis čísla nemusí být z hlediska obsazení paměti nejkratší, i když opticky je kratší.
Příklady:

0 (7 bajtů)                   = NOT PI (2 bajty)
                              = CODE "" (3 bajty)
                              = PI-PI (3 bajty)
                              = LEN PI (3 bajty) 
1 (7 bajtů)                   = PI/PI (3 bajty)
                              = SIGN PI (2 bajty) 
3 (7 bajtů)                   = INT PI (2 bajty)
číslo (počet ASCII+ 6 bajtů)  = VAL "číslo" (o 3 bajty kratší)

Vyhodnocení těchto výrazů je časově náročnější, ale jejich reprezentace je paměťově úsporná.

To jsme se však dostali již ke strojovému kódu a jemným podrobnostem o systému. Protože naším cílem bylo spíše ukázat jednoduché nápady a triky v BASICU, zbývá nám již jen popřát, aby vám programování přinášelo více radostí než starostí.

LITERATURA

[1] Vickers, S.: ZX SPECTRUM BASIC programming. Sinclair Research Ltd. 1982.
[2] Logan, I., 0' Hara, F.: The Complete SPECTRUM ROM disassembly. Melbourne House Publishers 1983.
[3] Logan, I.: SPECTRUM microdrive book. Melbourne House Publishers 1983.
[4] Webb, D.: Advanced SPECTRUM machine language. Melbourne House Publishers 1984.

Stránka byla už zobrazena: 328 ×

Aktualizováno: 18. 10. 2018, 18:17



     psp-ikona.gif, 2 kB    Text to HTML converter and formatter  builder_ikonka.gif, 3 kB
           
  Best Old Games      kabelmanie.gif, 2 kB  root_ico.gif, 2 kB  český diskmag pro počítače ZX Spectrum a kompatibilní
synapse.gif, 4 kB   TuningPC.cz - Vše pro tuning a casemodding vašeho PC        pspad88x31.gif  delphix.gif, 1 kB
sgatlantis_88x31_3.jpg, 4 kB  atlan.gif, 22 kB  arkon.jpg, 12 kB  ico_abeceda.gif, 888B  blog.idnes.cz   
           
       
 
  torry_logo.gif, 4 kB  

Stránka načtena za 0.00278 sekund.