[{"c":" Verzia dokumentácie: 1.0.0.208\nČo je Atari Atari 800XL a 130XE sú domáce počítače z osemdesiatych rokov. Majú procesor 6502, 64 alebo 128 kilobajtov pamäte a pripájali sa k televízoru. Po zapnutí na nich nebeží žiadny Windows – počítač čaká, kým mu napíšeš program alebo mu ho dáš z kazety, z diskety či zo zásuvného modulu (cartridge).\nDnes tie počítače stále fungujú a kto ich nemá, používa emulátor: program, ktorý sa na dnešnom počítači správa ako Atari.\nČo je BASIC BASIC je programovací jazyk vymyslený pre začiatočníkov. Program v ňom sa číta skoro ako anglické vety:\nAtari BASIC 10 PRINT \"Hello, Atari!\" 20 GOTO 10 Atari XL a XE majú BASIC zabudovaný – volá sa Atari BASIC. Zapneš počítač, na obrazovke sa objaví READY a môžeš písať. Tisíce programov a hier z časopisov tých čias sú napísané v ňom.\nBASIC na Atari je interpreter: program číta riadok po riadku a každý riadok zakaždým znova lúšti. Je to pohodlné, ale pomalé.\nČo je Turbo-BASIC XL V roku 1985 napísal Frank Ostrowski Turbo-BASIC XL. Rozumie všetkému, čo Atari BASIC, je niekoľkokrát rýchlejší a pridáva desiatky príkazov: slučky WHILE a REPEAT, procedúry, kreslenie kruhov, vypĺňanie plôch. Nahrával sa z diskety.\nPrvé dve tretiny tejto knihy vystačia s Atari BASICom. Turbo-BASIC XL príde na rad v kapitole 26.\nČo je Basic26 Basic26 je prekladač oboch jazykov, ktorý beží na počítači s Windows.\nProgram píšeš v ľubovoľnom textovom editore (Poznámkový blok, Visual Studio Code, Sublime Text …). Basic26 ho preloží za zlomok sekundy. Výsledok je súbor, ktorý sa dá spustiť na Atari alebo v emulátore – bez BASICu, bez Turbo-BASICu, sám. Preložený program robí to isté, čo by s tým istým textom robil interpreter: vypíše tie isté čísla, nakreslí tie isté obrázky, ohlási tie isté chyby. Len beží rýchlejšie. Prekladač vie prečítať aj staré programy z diskiet (kapitola 41).\nNiekoľko slov, ktoré budeš stretávať Slovo Čo znamená program zoznam príkazov, ktoré počítač vykoná jeden po druhom zdroják (zdrojový text) program tak, ako ho píše človek – obyčajný textový súbor s príponou .abas (Atari BASIC) alebo .tbas (Turbo-BASIC XL) prekladač program, ktorý zdroják premení na príkazy pre počítač; tu je to Basic26 interpreter pôvodný BASIC na Atari, ktorý program číta a vykonáva riadok po riadku XEX súbor s preloženým programom pre Atari (prípona .xex) simulátor časť Basic26, ktorá preložený program hneď spustí a jeho výpis ukáže v okne príkazového riadka emulátor samostatný program (atari800), ktorý ukáže celé Atari aj s obrazovkou, farbami a zvukom Ďalšie slová vysvetlí kniha vtedy, keď ich bude treba. Všetky sú v slovníčku.\nČo potrebuješ Počítač s Windows 10 alebo 11. Súbor Basic26.exe. Je to jeden súbor, nič sa neinštaluje. Skopíruj si ho do priečinka, kde budeš mať svoje programy, alebo do priečinka, ktorý máš v systémovej ceste (PATH) – potom ho môžeš volať odkiaľkoľvek. Súbor ATARIXL.ROM v priečinku atari800 vedľa Basic26.exe. Je to kópia programov, ktoré má Atari v sebe; simulátor z nej berie počítanie s číslami. Keď ho nemáš, vezme altirraos-xl.rom, ktorý je pri Basic26.exe – voľne šíriteľnú náhradu od autora emulátora Altirra; počíta takmer rovnako, len niekedy sa líši v poslednej číslici, a prekladač ťa na to upozorní. Textový editor. Stačí Poznámkový blok. Pohodlnejší je editor, ktorý ukazuje čísla riadkov a stĺpcov, lebo prekladač nimi hlási chyby. Príkazový riadok – okno, do ktorého sa píšu príkazy. Vo Windows je to Terminál alebo PowerShell (nájdeš ho v ponuke Štart). Na kapitoly o grafike, zvuku a joysticku navyše:\nEmulátor atari800 (atari800.exe) v tom istom priečinku atari800. Do kapitoly 19 sa bez neho zaobídeš. Skúška, či všetko funguje Otvor príkazový riadok a napíš:\nBasic26 --version Mal by odpovedať štyrmi riadkami, napríklad:\nBasic26 1.0.0.150 Atari BASIC and Turbo-BASIC XL cross compiler for Atari 8-bit (XEX) Copyright (C) 2026 Pedro. MIT License. Built from main 00f00945163050e23e1f460beedab775a5ecf909 Ak namiesto toho príde hlásenie, že príkaz Basic26 nie je známy, príkazový riadok nevie, kde Basic26.exe leží. Najjednoduchšia náprava: prejdi v príkazovom riadku do priečinka, kde ten súbor máš, a píš .\\Basic26 namiesto Basic26.\ncd C:\\Atari .\\Basic26 --version Ako je kniha usporiadaná Každá kapitola má tie isté časti:\nNa čo to je – o čom príkaz je, jednou vetou. Ako sa to píše – tvar príkazu. Celý program – nie úryvok; dá sa preložiť tak, ako je. Preklad a spustenie – príkaz, ktorý stačí skopírovať. Čo uvidíš – skutočný výpis programu. Ako to funguje – program riadok po riadku. Časté chyby – čo sa pokazí najčastejšie a čo na to povie prekladač. Vyskúšaj si – malé úlohy. Zhrnutie. Všetky programy sú hotové v priečinku examples/. Texty, ktoré programy vypisujú, sú po anglicky: Atari nemá slovenské písmená s dĺžňami a mäkčeňmi.\nĎalej: 2. Prvý program\n","t":"1. Úvod","u":"01-uvod/"},{"c":"Na čo to je Prejdeš celú cestu od prázdneho súboru po bežiaci program: napísať, uložiť, preložiť, spustiť. Všetky ďalšie kapitoly robia to isté, len s inými príkazmi.\nCelý program Otvor textový editor a napíš (alebo si otvor hotový súbor examples/hello.abas):\nAtari BASIC 10 REM My first program in BASIC 20 PRINT \"Hello, Atari!\" Ulož ho ako hello.abas. Prípona .abas hovorí, že je to zdroják v Atari BASICu.\nPozor pri ukladaní z Poznámkového bloku: v okne Uložiť ako zvoľ typ Všetky súbory, inak sa súbor uloží ako hello.abas.txt.\nPreklad a spustenie V príkazovom riadku prejdi do priečinka, kde súbor leží, a napíš:\nBasic26 hello.abas --sim Prekladač program preloží a voľba --sim ho hneď spustí vo vstavanom simulátore.\nČo uvidíš Hello, Atari! To je všetko, čo program robí: vypíše jeden riadok a skončí.\nAko to funguje Program v BASICu sa skladá z riadkov a každý riadok sa začína číslom. Počítač ich vykonáva od najmenšieho čísla po najväčšie.\nAtari BASIC 10 REM My first program in BASIC REM (z anglického remark, poznámka) je komentár. Všetko za ním až do konca riadka počítač preskočí. Je to poznámka pre človeka.\nAtari BASIC 20 PRINT \"Hello, Atari!\" PRINT vypíše na obrazovku to, čo za ním nasleduje, a prejde na nový riadok. Text sa píše do úvodzoviek.\nZa posledným riadkom program skončí sám.\nPrečo 10 a 20, a nie 1 a 2 Na skutočnom Atari sa program písal rovno do počítača a riadok sa nedal „vsunúť“ medzi dva iné – jeho miesto určovalo číslo. Preto sa čísluje po desiatich: keď neskôr zistíš, že medzi riadky 10 a 20 treba ešte niečo, dáš tomu číslo 15.\nV textovom editore riadok vsunieš, kam chceš, ale číslo mu dať musíš aj tak – a prekladač riadky zoradí podľa čísel, nie podľa poradia v súbore. Číslo môže byť od 0 do 32767.\nČo vzniklo na disku Po preklade pribudol vedľa zdrojáka súbor hello.xex. To je hotový program pre Atari – má 1005 bajtov. Dá sa skopírovať na disketu alebo spustiť v emulátore.\nKeď chceš program len preložiť a nespúšťať, voľbu --sim vynechaj:\nBasic26 hello.abas Keď sa preklad podarí, prekladač nevypíše nič. Ticho znamená „v poriadku“.\nSpustenie v emulátore Simulátor ukáže len to, čo program vypíše. Emulátor ukáže celé Atari – modrú obrazovku, písmo, farby. Ak ho máš (priečinok atari800 vedľa Basic26.exe), spustíš program takto:\nBasic26 hello.abas --run Otvorí sa okno emulátora a v ňom tvoj text. Keď program skončí, obrazovka ostane tak, ako ju nechal; emulátor zavrieš klávesom F9 alebo krížikom okna.\nKeď prekladač nájde chybu Chyby sú pri programovaní bežné. Skús úmyselne jednu spraviť: namiesto PRINT napíš PRIT.\nAtari BASIC 10 REM My first program in BASIC 20 PRIT \"Hello, Atari!\" Prekladač odpovie:\nhello.abas(2,9): error B26017: expected '=' after a string Každé hlásenie má štyri časti:\nČasť V príklade Čo znamená súbor hello.abas v ktorom súbore je chyba miesto (2,9) druhý riadok súboru, deviaty znak (nie číslo riadka programu!) druh a číslo error B26017 error je chyba, warning len upozornenie; číslo sa dá nájsť v prílohe C popis expected '=' after a string čo prekladaču vadí (po anglicky) Popis tu na prvý pohľad nesedí – veď chýba písmeno, nie rovná sa. Prekladač však slovo PRIT nepozná, a tak si myslí, že je to meno premennej, do ktorej chceš niečo uložiť (o tom je kapitola 4); za takým menom čaká znak =. Z toho plynú dve rady:\nOpravuj vždy prvú chybu. Ďalšie sú často len jej následkom. Chyba je na označenom mieste alebo tesne pred ním. Prekladač si ju všimne, až keď mu prestane dávať zmysel to, čo číta. Kým má program chybu (error), súbor .xex nevznikne a nič sa nespustí. Upozornenie (warning) preklad nezastaví.\nČasté chyby Čo sa stalo Čo povie prekladač preklep v príkaze (PRIT namiesto PRINT) error B26017: expected '=' after a string riadok nemá číslo error B26044: line does not start with a number príkaz malými písmenami (print) error B26017: Atari BASIC takes no lower case in \"print\" chýba úvodzovka na konci textu warning B26048: missing double quote in string – len upozornenie, text sa berie do konca riadka súbor sa volá inak, ako píšeš v príkaze error B26201: hello.abas: file not found Príkazy Atari BASICu sa píšu veľkými písmenami. Malé písmená smú byť len v texte v úvodzovkách a za REM. Turbo-BASIC XL malé písmená berie (kapitola 26).\nVyskúšaj si Zmeň text v úvodzovkách na svoje meno a program znova prelož a spusti. Pridaj riadok 30 PRINT \"…\" s iným textom. Pridaj riadok s číslom 15 na koniec súboru, až za riadok 30, a pozri, kedy sa vypíše. Prekladač na to upozorní hlásením warning B26230. Zhrnutie Program je textový súbor s príponou .abas; každý riadok sa začína číslom. Riadky sa vykonávajú podľa čísel, od najmenšieho. Basic26 meno.abas ho preloží do meno.xex; --sim ho hneď spustí v simulátore, --run v emulátore. PRINT \"text\" vypíše riadok textu, REM je komentár. Príkazy sa píšu veľkými písmenami. Chybové hlásenie hovorí súbor, riadok, stĺpec a dôvod. Opravuj od prvého. Späť: 1. Úvod · Ďalej: 3. Výpis\n","t":"2. Prvý program","u":"02-prvy-program/"},{"c":"Na čo to je PRINT je najpoužívanejší príkaz BASICu: vypíše na obrazovku text, číslo alebo výsledok výpočtu. V tejto kapitole k nemu pribudnú tri drobnosti, bez ktorých sa žiadny program nezaobíde: komentár REM, dvojbodka medzi príkazmi a END.\nAko sa to píše Atari BASIC PRINT čo;čo,čo Zápis Význam PRINT \"text\" vypíše text a prejde na nový riadok PRINT 5+3 vypočíta a vypíše číslo PRINT A;B bodkočiarka: druhá vec hneď za prvou, bez medzery PRINT A,B čiarka: druhá vec v ďalšom stĺpci (stĺpce sú po desiatich znakoch) PRINT \"text\"; bodkočiarka na konci: neprejde na nový riadok PRINT samotné: prázdny riadok ? \"text\" otáznik je skratka za PRINT A k tomu:\nZápis Význam REM text komentár až do konca riadka príkaz:príkaz dvojbodka oddeľuje viac príkazov na jednom riadku END ukončí program Celý program Súbor examples/print.abas:\nAtari BASIC 10 REM PRINT: writing on the screen 20 PRINT \"One line\" 30 PRINT \"Two \";\"parts \";\"joined\" 40 PRINT \"Left\",\"Right\" 50 PRINT 5 60 PRINT \"Five plus three is \";5+3 70 PRINT 80 PRINT \"No new line: \"; 90 PRINT \"it goes on here\" 100 ? \"A question mark is PRINT too\" 110 PRINT \"One\":PRINT \"Two\":REM two statements on a line 120 END 130 PRINT \"Never printed\" Preklad a spustenie Basic26 print.abas --sim Čo uvidíš One line Two parts joined Left Right 5 Five plus three is 8 No new line: it goes on here A question mark is PRINT too One Two Ako to funguje Riadok 30: bodkočiarka lepí veci tesne za seba. Medzery medzi slovami sú preto vo vnútri úvodzoviek (\"Two \"), BASIC žiadne nepridá. Riadok 40: čiarka posunie výpis na ďalšiu zarážku. Zarážky sú po desiatich znakoch, takže Right sa začína na jedenástom mieste. Hodí sa to na jednoduché tabuľky. Riadok 50: číslo sa píše bez úvodzoviek. PRINT 5 vypíše číslo 5, PRINT \"5\" vypíše znak 5 – na obrazovke vyzerajú rovnako, ale len s prvým sa dá počítať. Riadok 60: text a výpočet v jednom príkaze. BASIC najprv vypočíta 5+3 a vypíše výsledok. Riadky 80 a 90: bodkočiarka na konci drží kurzor na riadku, ďalší PRINT pokračuje tam, kde prvý skončil. Riadok 110: tri príkazy na jednom riadku. Za REM je však komentárom všetko až do konca riadka, aj dvojbodka a čokoľvek za ňou – REM teda musí byť na riadku posledný. Riadok 120: END program ukončí. Riadok 130 sa už nevykoná. Na konci programu END písať nemusíš; hodí sa, keď za hlavnou časťou programu nasleduje ešte niečo, kam program nemá „dobehnúť“ (kapitola 11). Časté chyby Čo sa stalo Čo sa stane medzi dvoma textami nie je ; ani , (PRINT \"A\" \"B\") preloží sa a vypíše AB, ako s bodkočiarkou – píš ju však, je to čitateľnejšie medzera chýba v úvodzovkách (PRINT \"Sum is\";8) vypíše Sum is8 chýba druhá úvodzovka warning B26048: missing double quote in string; text sa berie do konca riadka príkaz za REM na tom istom riadku nevykoná sa, je súčasťou komentára Vyskúšaj si Vypíš tri mená pod seba, potom tie isté tri mená na jeden riadok oddelené čiarkou a medzerou. Vypíš malú tabuľku s dvoma stĺpcami pomocou čiarky: v prvom mená, v druhom čísla. Čo vypíše PRINT \"2+2\" a čo PRINT 2+2? Najprv si tipni, potom vyskúšaj. Zhrnutie PRINT vypíše texty v úvodzovkách a čísla alebo výpočty bez nich. Bodkočiarka lepí, čiarka posúva na ďalšiu zarážku; na konci príkazu zabránia novému riadku. ? je to isté ako PRINT. REM je komentár do konca riadka, : oddeľuje príkazy, END končí program. Späť: 2. Prvý program · Ďalej: 4. Premenné a čísla\n","t":"3. Výpis: PRINT, REM, END","u":"03-print/"},{"c":"Na čo to je Premenná je pomenované miesto v pamäti, do ktorého si program odloží číslo, aby ho mohol neskôr použiť alebo zmeniť. Predstav si škatuľku s menovkou: APPLES a v nej číslo 5.\nAko sa to píše Atari BASIC LET meno=hodnota meno=hodnota Slovo Význam LET „nech je“ – slovo je nepovinné a skoro nikto ho nepíše meno meno premennej: začína písmenom, ďalej písmená a číslice = priradenie: vypočítaj pravú stranu a ulož ju do premennej vľavo hodnota číslo, iná premenná alebo výpočet Premennú netreba vopred ohlasovať. Vznikne tým, že ju použiješ, a kým do nej nič neuložíš, je v nej nula.\nCelý program Súbor examples/variables.abas:\nAtari BASIC 10 REM Variables: boxes with a name 20 LET APPLES=5 30 PRICE=0.25 40 PRINT \"Apples: \";APPLES 50 PRINT \"Price of one: \";PRICE 60 COST=APPLES*PRICE 70 PRINT \"Together: \";COST 80 APPLES=APPLES+1 90 PRINT \"One more apple: \";APPLES 100 BIG=1500000000000 110 PRINT BIG 120 THIRD=1/3 130 PRINT THIRD 140 PRINT EMPTY Preklad a spustenie Basic26 variables.abas --sim Čo uvidíš Apples: 5 Price of one: 0.25 Together: 1.25 One more apple: 6 1.5E+12 0.333333333 0 Ako to funguje Riadky 20 a 30: to isté dvoma spôsobmi, s LET a bez neho. Desatinné číslo sa píše s bodkou, nie s čiarkou. Riadok 60: vpravo je výpočet. BASIC vezme, čo je práve v APPLES a PRICE, vynásobí to (* je krát) a výsledok uloží do COST. Riadok 80: APPLES=APPLES+1 nie je rovnica – tá by nemala riešenie. Je to príkaz: „zober, čo je v APPLES, pripočítaj 1 a ulož späť do APPLES“. Takto sa v programoch počíta. Riadok 110: veľmi veľké a veľmi malé čísla vypisuje BASIC skrátene. 1.5E+12 znamená 1,5 krát desať na dvanástu, teda 1,5 a dvanásť miest doprava. Rovnako ich môžeš aj písať: BIG=1.5E12. Riadok 130: jedna tretina má nekonečne veľa trojok, ale Atari si pamätá len desať číslic (a Atari BASIC ich vypíše deväť). Na bežné počítanie to stačí; pri peniazoch a dlhých výpočtoch sa občas na poslednom mieste objaví drobná odchýlka. Riadok 140: do EMPTY nikto nič neuložil, je v nej nula. Čísla môžu byť od približne 1E-98 po 9.99999999E+97, kladné aj záporné.\nNa mene záleží Meno môže byť dlhé, ale nesmie sa začínať slovom, ktoré BASIC pozná ako príkaz. Atari BASIC totiž medzery nepotrebuje – PRINTX číta ako PRINT X. Preto:\nAtari BASIC 10 LETTER=4 20 PRINT LETTER vypíše 0. Riadok 10 sa prečíta ako LET TER=4, takže štvorka skončí v premennej TER, a riadok 20 vypíše inú, prázdnu premennú LETTER. Program je správny, len robí niečo iné, než si chcel. Prekladač na to upozorní, lebo meno LETTER program inde používa:\nwarning B26236: LETTER is read as LET TER here, as the interpreter reads it: a statement begins with the statement word its text begins with, and LETTER elsewhere in the program is another variable Väčšinou sa však na také meno príde hneď, lebo zvyšok riadka prestane dávať zmysel:\nRiadok Ako ho BASIC číta Čo povie prekladač 10 ONE=1 ON E=1 error B26017: expected GOTO, GOSUB, EXEC or GO# after ON 10 FORM=7 FOR M=7 error B26017: expected TO in FOR 10 IFFY=2 IF FY=2 error B26043: expected THEN 10 ENDING=5 END ING=5 error B26017: expected ':' or end of line, found variable ING 10 NOTE=5 príkaz NOTE error B26017: expected #channel Meno sa teda nesmie začínať slovom, ktorým sa môže začínať príkaz (LET, ON, FOR, IF, END, REM, DIM, RUN, GET, PUT, POP, NEW, DOS, BYE … – všetky sú v prílohe A). Uprostred mena slovo nevadí (COST, SCORE, TOTAL sú v poriadku).\nZvláštny prípad je slovo NOT (kapitola 8). Na začiatku príkazu sa meno s NOT na začiatku berie ako meno, ale vo výpočte ho BASIC rozdelí:\nAtari BASIC 10 NOTHING=5 20 PRINT NOTHING vypíše 1. Riadok 10 uloží päťku do premennej NOTHING; riadok 20 sa však číta ako PRINT NOT HING – „opak“ prázdnej premennej HING, teda 1. K svojej päťke sa už nedostaneš. Tak to robia oba interpretery a tak to preloží aj Basic26, s upozornením:\nwarning B26230: NOTHING is read as NOT HING here, as the interpreter reads it: a name that begins with NOT is one only where a value is stored Keď program počíta čudne, podozrievaj najprv meno.\nDobové programy mávajú premenné s jedným-dvoma písmenami (A, X1, SC). Šetrilo to pamäť. V programe pre prekladač si pokojne dovoľ meno, ktoré niečo hovorí.\nČasté chyby Čo sa stalo Čo sa stane desatinná čiarka (PRICE=0,25) error B26017: expected ':' or end of line, found ',' meno malými písmenami (price=5) error B26017: Atari BASIC takes no lower case in \"price\" preklep v mene (APLES) nič nehlási – vznikne nová premenná s nulou a výpočet vyjde zle meno sa začína príkazom (LETTER, ONE) hodnota skončí v inej premennej (prekladač upozorní, B26236), alebo chyba prekladu meno sa začína na NOT (NOTHING) vo výpočte sa číta ako NOT HING; prekladač upozorní (B26230) číslo vľavo (5=A) error B26017: a statement cannot start with number 5 – vľavo od = musí byť premenná Atari BASIC unesie v jednom programe najviac 128 rôznych premenných.\nVyskúšaj si Pridaj premennú PEARS s počtom hrušiek a vypíš, koľko je ovocia spolu. Zmeň cenu na 0.3 a pozri, čo vyjde. Potom skús PRICE=1/3. Vymeň hodnoty dvoch premenných A a B. (Budeš potrebovať tretiu, pomocnú.) Zhrnutie Premenná je pomenované miesto na číslo; vznikne použitím a začína s nulou. meno=výpočet vypočíta pravú stranu a uloží ju; LET je nepovinné. A=A+1 zväčší premennú o jedna. Desatinné čísla sa píšu s bodkou; Atari počíta na desať číslic. Meno sa nesmie začínať slovom BASICu. Späť: 3. Výpis · Ďalej: 5. Počítanie\n","t":"4. Premenné a čísla: LET","u":"04-premenne/"},{"c":"Na čo to je BASIC je aj kalkulačka. Všade, kde môže stáť číslo, môže stáť výraz – výpočet z čísel, premenných, znamienok a funkcií.\nAko sa to píše Znak Význam Príklad Výsledok + sčítanie 7+3 10 - odčítanie 7-3 4 * násobenie 7*3 21 / delenie 7/3 2.33333333 ^ umocnenie 7^2 49 ( ) zátvorky: to vnútri sa počíta najprv (2+3)*4 20 Funkcia je hotový výpočet s menom. Číslo, s ktorým má počítať, sa píše za ňu do zátvoriek:\nFunkcia Čo vráti Príklad Výsledok INT(x) najbližšie celé číslo smerom nadol INT(2.7) 2 ABS(x) číslo bez znamienka ABS(-8) 8 SGN(x) znamienko: -1, 0 alebo 1 SGN(-8) -1 SQR(x) druhú odmocninu SQR(16) 4 Celý program Súbor examples/expr.abas:\nAtari BASIC 10 REM Arithmetic 20 PRINT \"7+3 = \";7+3 30 PRINT \"7-3 = \";7-3 40 PRINT \"7*3 = \";7*3 50 PRINT \"7/3 = \";7/3 60 PRINT \"7^2 = \";7^2 70 PRINT \"2+3*4 = \";2+3*4 80 PRINT \"(2+3)*4 = \";(2+3)*4 90 PRINT \"INT(7/3) = \";INT(7/3) 100 PRINT \"INT(-2.5) = \";INT(-2.5) 110 PRINT \"ABS(-8) = \";ABS(-8) 120 PRINT \"SGN(-8) = \";SGN(-8) 130 PRINT \"SQR(16) = \";SQR(16) 140 REM The remainder after dividing 17 by 5 150 A=17:B=5 160 PRINT \"17 = \";INT(A/B);\"*5 + \";A-INT(A/B)*B 170 REM Rounding to two decimal places 180 X=3.14159 190 PRINT INT(X*100+0.5)/100 Preklad a spustenie Basic26 expr.abas --sim Čo uvidíš 7+3 = 10 7-3 = 4 7*3 = 21 7/3 = 2.33333333 7^2 = 49 2+3*4 = 14 (2+3)*4 = 20 INT(7/3) = 2 INT(-2.5) = -3 ABS(-8) = 8 SGN(-8) = -1 SQR(16) = 4 17 = 3*5 + 2 3.14 Ako to funguje Poradie počítania Riadok 70 dá 14, nie 20: BASIC počíta ako v škole, násobenie a delenie pred sčítaním a odčítaním. Celé poradie:\nzátvorky, umocnenie ^, násobenie a delenie * /, sčítanie a odčítanie + -. Rovnako silné znamienka sa počítajú zľava doprava: 10/4*2 je (10/4)*2, teda 5. Keď si nie si istý, daj zátvorky – nič nestoja a program je čitateľnejší.\nDelenie nie je celé 7/3 je 2.33333333. BASIC na Atari nemá zvláštne „celé čísla“, každé číslo môže mať desatinnú časť. Keď chceš celý podiel, odrež zvyšok funkciou INT.\nINT ide nadol, nie k nule INT(2.7) je 2, ale INT(-2.5) je -3: najbližšie celé číslo, ktoré je menšie. Pri kladných číslach je to to isté ako „odrezať desatinnú časť“, pri záporných nie.\nDva užitočné triky s INT Zvyšok po delení (riadok 160): A-INT(A/B)*B. Sedemnásť delené piatimi je 3 a zvyšok 2. Zvyškom sa zisťuje, či je číslo párne (N-INT(N/2)*2 je 0), a robí sa ním všetko, čo sa má „točiť dokola“. Zaokrúhlenie (riadok 190): INT(X+0.5) zaokrúhli na celé číslo. Na dve desatinné miesta sa číslo najprv vynásobí stomi, zaokrúhli a zasa vydelí. Časté chyby Čo sa stalo Čo sa stane delenie nulou program skončí s ERROR- 11 AT LINE 20 odmocnina zo záporného čísla ERROR- 3 AT LINE 20 výsledok je väčší než 9.99999999E+97 ERROR- 11 chýba zátvorka (PRINT (2+3) error B26041: expected ')' výraz nie je dokončený (PRINT 5+) error B26040: expected a value, found end of line násobenie bez hviezdičky (2(3+4)) BASIC to neuhádne: vypíše 27 – dvojku a za ňou sedmičku -3^2 je 9, nie -9: mínus pred číslom má v BASICu prednosť pred umocnením. Píš -(3^2) ERROR- s číslom je chyba za behu: program sa preložil, ale počas behu narazil na niečo, čo sa vypočítať nedá. Vypíše číslo chyby a riadok programu, na ktorom sa stala, a skončí. Čísla sú v prílohe C; kapitola 17 ukáže, ako chybu zachytiť.\nVyskúšaj si Vypočítaj, koľko sekúnd má deň a koľko rok. Obdĺžnik má strany A a B. Vypíš jeho obvod, obsah a dĺžku uhlopriečky (SQR(A*A+B*B)). Rozmeň 187 sekúnd na minúty a sekundy pomocou INT a zvyšku. Zhrnutie + - * / ^ a zátvorky; násobenie a delenie majú prednosť pred sčítaním a odčítaním. Delenie dáva desatinné číslo; INT ho oreže nadol. Zvyšok po delení je A-INT(A/B)*B, zaokrúhlenie INT(X+0.5). Funkcia má svoje číslo v zátvorkách: SQR(16), ABS(-8). Čo sa vypočítať nedá, skončí chybou za behu: ERROR- a číslo. Späť: 4. Premenné a čísla · Ďalej: 6. Reťazce\n","t":"5. Počítanie: + - * / ^, INT, ABS, SGN, SQR","u":"05-pocitanie/"},{"c":"Na čo to je Reťazec je premenná, ktorá nedrží číslo, ale text: meno, slovo, celú vetu. Spoznáš ju podľa znaku dolára na konci mena: NAME$.\nAko sa to píše Atari BASIC DIM meno$(dĺžka) meno$=\"text\" Zápis Význam DIM A$(20) priprav reťazec A$, do ktorého sa zmestí najviac 20 znakov A$=\"text\" ulož text LEN(A$) funkcia: koľko znakov v reťazci práve je A$(3) časť reťazca od tretieho znaku do konca A$(2,4) časť od druhého po štvrtý znak A$(2,2) jeden znak, druhý A$(LEN(A$)+1)=B$ pripoj B$ na koniec A$ Na rozdiel od čísla treba reťazec vopred ohlásiť príkazom DIM (z anglického dimension, rozmer). Počítač mu musí vyhradiť miesto a potrebuje vedieť koľko. Jeden DIM môže ohlásiť viac reťazcov, oddelených čiarkou.\nCelý program Súbor examples/strings.abas:\nAtari BASIC 10 REM Strings: variables that hold text 20 DIM NAME$(20),GREETING$(40) 30 NAME$=\"Atari\" 40 PRINT NAME$ 50 PRINT \"Length: \";LEN(NAME$) 60 PRINT \"First letter: \";NAME$(1,1) 70 PRINT \"Letters 2 to 4: \";NAME$(2,4) 80 PRINT \"From the 3rd on: \";NAME$(3) 90 GREETING$=\"Hello, \" 100 GREETING$(LEN(GREETING$)+1)=NAME$ 110 PRINT GREETING$ 120 NAME$(1,1)=\"a\" 130 PRINT NAME$ 140 DIM SHORT$(3) 150 SHORT$=\"ABCDEFGH\" 160 PRINT SHORT$ Preklad a spustenie Basic26 strings.abas --sim Čo uvidíš Atari Length: 5 First letter: A Letters 2 to 4: tar From the 3rd on: ari Hello, Atari atari ABC Ako to funguje Riadok 20: NAME$ má miesto na 20 znakov, GREETING$ na 40. To je najviac; koľko znakov v reťazci naozaj je, závisí od toho, čo doň uložíš. Hneď po DIM je prázdny a LEN je 0. Riadok 50: v NAME$ je päť znakov, hoci miesta je na dvadsať. Riadky 60 až 80: znaky sa číslujú od jednotky. NAME$(2,4) je druhý až štvrtý znak. S jedným číslom ide časť až do konca. Riadok 100: Atari BASIC nemá znamienko na spájanie textov. Spája sa tak, že druhý text zapíšeš za koniec prvého: GREETING$ má 7 znakov, zápis začína na ôsmom mieste. Riadok 120: zápis do časti reťazca prepíše len tú časť – tu prvé písmeno. Riadky 140 až 160: do reťazca sa zmestí len toľko, koľko povolil DIM. Zvyšok sa bez hlásenia odreže: z ôsmich písmen ostali tri. Časté chyby Čo sa stalo Čo sa stane reťazec bez DIM preloží sa, ale za behu ERROR- 9 AT LINE 30 DIM toho istého reťazca dvakrát error B26009: A$ is DIMensioned twice text dlhší než DIM odreže sa, bez hlásenia čítanie za koncom textu (A$(7), keď LEN(A$) je 5) ERROR- 5 AT LINE 20 zápis za hranicu z DIM (A$(9)=\"X\" pri DIM A$(5)) error B26005: A$(9) is past DIM A$(5) spájanie plusom (A$=\"AB\"+\"CD\") error B26042: a string cannot be used in an arithmetic expression chýba $ (NAME=\"Atari\") error B26042: expected a number – NAME bez dolára je číselná premenná A$ a A sú dve rôzne premenné: jedna na text, druhá na číslo. Môžu existovať naraz.\nPozor na pascu pri spájaní: A$(LEN(A$)+1)=B$ zapisuje za koniec A$. Ak je A$ už plný po DIM, zápis je mimo a program skončí chybou 5.\nVyskúšaj si Ulož do reťazca svoje meno a vypíš jeho posledné písmeno. (Je na mieste LEN(NAME$).) Zlož z dvoch reťazcov, mena a priezviska, tretí s medzerou medzi nimi. Vypíš prvé tri písmená slova, potom posledné tri. Zhrnutie Reťazec má meno s $ a pred použitím potrebuje DIM meno$(najviac znakov). LEN(A$) je počet znakov, ktoré v ňom práve sú. A$(i,j) je časť od i-teho po j-ty znak, A$(i) od i-teho do konca; počíta sa od 1. Spája sa zápisom za koniec: A$(LEN(A$)+1)=B$. Čo sa nezmestí, sa ticho odreže. Späť: 5. Počítanie · Ďalej: 7. Vstup\n","t":"6. Reťazce: DIM, LEN, A$(i,j)","u":"06-retazce/"},{"c":"Na čo to je Doteraz boli všetky čísla a texty napísané v programe. S INPUT sa program spýta – počká, kým človek niečo napíše a stlačí RETURN, a to, čo napísal, uloží do premennej.\nAko sa to píše Atari BASIC INPUT premenná INPUT premenná,premenná Zápis Význam INPUT A vypíše otáznik, počká na číslo a uloží ho do A INPUT A$ to isté s textom; reťazec musí mať DIM INPUT A,B dve čísla naraz, pri písaní oddelené čiarkou INPUT vypíše len otáznik. O čo ide, musí povedať PRINT pred ním – s bodkočiarkou na konci, aby otáznik ostal na tom istom riadku.\nCelý program Súbor examples/input.abas:\nAtari BASIC 10 REM INPUT: the program asks 20 DIM NAME$(20) 30 PRINT \"What is your name\"; 40 INPUT NAME$ 50 PRINT \"How old are you\"; 60 INPUT AGE 70 PRINT \"Hello, \";NAME$;\"!\" 80 PRINT \"Next year you will be \";AGE+1 90 PRINT \"Give me two numbers\" 100 INPUT A,B 110 PRINT A;\" + \";B;\" = \";A+B Preklad a spustenie Tento program potrebuje klávesnicu, a tú simulátor nemá. Sú dve možnosti.\nV emulátore píšeš odpovede sám, na klávesnici Atari:\nBasic26 input.abas --run V simulátore dostane program odpovede zo súboru. Súbor examples/input.in má tri riadky – na každý INPUT jeden:\nPeter 12 3,4 Basic26 input.abas --sim --sim-input input.in Čo uvidíš What is your name?Peter How old are you?12 Hello, Peter! Next year you will be 13 Give me two numbers ?3,4 3 + 4 = 7 Ako to funguje Riadky 30 a 40: PRINT s bodkočiarkou na konci nechá kurzor za textom, INPUT zaň pripíše otáznik a čaká. Preto v texte otázky otáznik nie je. Riadok 40: do NAME$ sa uloží celý riadok, ktorý človek napísal – aj s medzerami a čiarkami. Ak je dlhší než DIM, odreže sa. Riadok 60: AGE je číselná premenná, takže INPUT čaká číslo. S číslom z klávesnice sa dá hneď počítať (riadok 80). Riadok 100: dve premenné v jednom INPUT. Človek napíše 3,4 a RETURN; môže však napísať aj len 3, stlačiť RETURN, a program sa na druhé číslo spýta ďalším otáznikom. Časté chyby Čo sa stalo Čo sa stane namiesto čísla príde text (abc) program skončí s ERROR- 8 AT LINE 60 číslo s desatinnou čiarkou (3,5 na jedno číslo) INPUT A zoberie 3 a zvyšok zahodí; pri INPUT A,B je to 3 a 5 INPUT A$ bez DIM ERROR- 9 simulátor bez --sim-input, alebo v súbore je málo riadkov ERROR- 136 na INPUT, ktorý už nemá čo čítať Chyba 8 je nepríjemná: stačí preklep pri písaní a program skončí. Kapitola 17 ukáže, ako ju zachytiť a spýtať sa znova.\nTurbo-BASIC XL vie otázku napísať rovno v INPUT (INPUT \"Name\";N$, kapitola 26). Atari BASIC to nevie.\nVyskúšaj si Spýtaj sa na dve strany obdĺžnika a vypíš jeho obsah. Spýtaj sa na meno a vypíš, koľko má písmen. Spýtaj sa na rok narodenia a vypíš vek. Uprav si input.in alebo program spusti v emulátore. Zhrnutie INPUT premenná počká na riadok z klávesnice a uloží ho. Do číselnej premennej musí prísť číslo, inak je to chyba 8. Otázku vypíše PRINT \"…\"; pred ním. V simulátore dáva odpovede súbor: --sim-input súbor, riadok na každý INPUT. Späť: 6. Reťazce · Ďalej: 8. Podmienka\n","t":"7. Vstup: INPUT","u":"07-input/"},{"c":"Na čo to je Program, ktorý robí vždy to isté, je nudný. IF mu dáva možnosť rozhodnúť sa: niečo vykoná, len keď platí podmienka.\nAko sa to píše Atari BASIC IF podmienka THEN príkazy IF podmienka THEN číslo riadka Slovo Význam IF „ak“ podmienka otázka, na ktorú sa dá odpovedať áno alebo nie: AGE\u003c18 THEN „tak“ príkazy čo sa má vykonať, keď podmienka platí – všetko až do konca riadka číslo riadka skratka: THEN 100 je to isté ako THEN GOTO 100 (kapitola 9) Keď podmienka neplatí, program pokračuje ďalším riadkom.\nPorovnania:\nZnak Význam = rovná sa \u003c\u003e nerovná sa \u003c \u003e menšie, väčšie \u003c= \u003e= menšie alebo rovné, väčšie alebo rovné Podmienky sa dajú spájať:\nSlovo Platí, keď A AND B platí A a zároveň B A OR B platí aspoň jedno z nich NOT A A neplatí Celý program Súbor examples/if.abas:\nAtari BASIC 10 REM IF: deciding 20 DIM ANSWER$(10) 30 PRINT \"How old are you\"; 40 INPUT AGE 50 IF AGE\u003c0 THEN PRINT \"That cannot be\":END 60 IF AGE\u003c18 THEN PRINT \"You are a child\" 70 IF AGE\u003e=18 THEN PRINT \"You are an adult\" 80 IF AGE\u003e=13 AND AGE\u003c=19 THEN PRINT \"You are a teenager\" 90 IF AGE=7 OR AGE=77 THEN PRINT \"A lucky number!\" 100 IF NOT (AGE=100) THEN PRINT \"Not a hundred yet\" 110 PRINT \"Do you like BASIC\"; 120 INPUT ANSWER$ 130 IF ANSWER$=\"YES\" THEN PRINT \"So do I\" 140 IF ANSWER$\u003c\u003e\"YES\" THEN PRINT \"You will\" 150 PRINT \"13\u003c18 is \";13\u003c18;\", 13\u003e18 is \";13\u003e18 Preklad a spustenie V emulátore, s vlastnými odpoveďami:\nBasic26 if.abas --run V simulátore s odpoveďami zo súboru examples/if.in (15 a YES):\nBasic26 if.abas --sim --sim-input if.in Čo uvidíš How old are you?15 You are a child You are a teenager Not a hundred yet Do you like BASIC?YES So do I 13\u003c18 is 1, 13\u003e18 is 0 Ako to funguje Riadok 50: za THEN sú dva príkazy oddelené dvojbodkou. Oba patria k podmienke – keď vek nie je záporný, nevykoná sa ani PRINT, ani END. To je dôležité pravidlo: IF rozhoduje o celom zvyšku riadka. Riadky 60 a 70: Atari BASIC nemá „inak“ (ELSE). Opačný prípad sa napíše ako druhý IF s opačnou podmienkou. (Turbo-BASIC XL ELSE má, kapitola 27.) Riadok 80: AND – musia platiť obe podmienky. Pozor: nedá sa napísať 13\u003c=AGE\u003c=19 ako v matematike, každé porovnanie musí byť celé. Riadok 90: OR – stačí jedna. Riadok 100: NOT obráti odpoveď. Porovnanie za ním daj do zátvorky: v Atari BASICu sa NOT viaže len na to, čo stojí tesne za ním, takže NOT AGE=100 by znamenalo (NOT AGE)=100. Riadky 130 a 140: reťazce sa porovnávajú rovnako ako čísla. Rovnajú sa, len keď sú rovnaké znak po znaku – \"YES\" a \"yes\" sú rôzne. Riadok 150: podmienka je pre BASIC tiež číslo: 1, keď platí, a 0, keď neplatí. A naopak, IF berie každé nenulové číslo ako „platí“ – IF A THEN … znamená „ak A nie je nula“. Reťazce sa dajú porovnávať aj na menší a väčší; rozhoduje poradie znakov v tabuľke Atari, kde sú veľké písmená pred malými. \"B\"\u003c\"C\" platí a \"abc\"\u003e\"ABC\" tiež.\nČasté chyby Čo sa stalo Čo sa stane chýba THEN error B26043: expected THEN porovnanie reťazca s číslom (IF A$=5) error B26042: cannot compare a string with a number príkaz za dvojbodkou mal platiť vždy nevykoná sa, keď podmienka neplatí – daj ho na ďalší riadok NOT A=B bez zátvorky počíta sa (NOT A)=B IF A=1 OR 2 platí vždy: číta sa „A je 1, alebo 2“ a dvojka je nenulová. Píš A=1 OR A=2 porovnanie vypočítaných čísel na rovnosť 1/3*3 je 0.999999999, nie 1, takže IF X=1 neplatí; porovnávaj ABS(X-1)\u003c0.0001 Vyskúšaj si Spýtaj sa na číslo a vypíš, či je kladné, záporné alebo nula. Spýtaj sa na číslo a vypíš, či je párne. (Zvyšok po delení dvoma je v kapitole 5.) Spýtaj sa na heslo a vypíš Welcome, len keď sedí. Zhrnutie IF podmienka THEN príkazy vykoná zvyšok riadka, len keď podmienka platí. Porovnania: = \u003c\u003e \u003c \u003e \u003c= \u003e=, pre čísla aj reťazce. AND – obe, OR – aspoň jedna, NOT – naopak (so zátvorkou). Platí je 1, neplatí je 0. „Inak“ sa v Atari BASICu píše druhým IF s opačnou podmienkou. Späť: 7. Vstup · Ďalej: 9. Skok\n","t":"8. Podmienka: IF, THEN, AND, OR, NOT","u":"08-if/"},{"c":"Na čo to je Program beží po riadkoch zhora nadol. GOTO (anglicky go to, „choď na“) toto poradie poruší: prikáže pokračovať na inom riadku. Skokom dozadu vznikne opakovanie, skokom dopredu sa kus programu preskočí.\nAko sa to píše Atari BASIC GOTO číslo riadka Dá sa písať aj oddelene, GO TO 100. Spolu s IF je to všetko, čo treba na ľubovoľne zložitý program:\nAtari BASIC IF podmienka THEN GOTO 100 IF podmienka THEN 100 Druhý tvar je skratka prvého.\nCelý program Súbor examples/goto.abas vypisuje mocniny dvojky, kým neprekročia tisíc:\nAtari BASIC 10 REM GOTO: jumping to another line 20 N=1 30 PRINT N;\" \"; 40 N=N*2 50 IF N\u003e1000 THEN GOTO 70 60 GOTO 30 70 PRINT 80 PRINT \"Done, N is \";N Preklad a spustenie Basic26 goto.abas --sim Čo uvidíš 1 2 4 8 16 32 64 128 256 512 Done, N is 1024 Ako to funguje Riadky 30 až 60 sa opakujú. Riadok 60 posiela program späť na riadok 30 – to je slučka. Riadok 50 je východ zo slučky: keď N prekročí tisíc, skočí sa dopredu na riadok 70, za slučku. Keby riadok 50 chýbal, program by sa točil donekonečna. Na Atari sa taký program zastaví klávesom BREAK; simulátor sa po desiatich miliónoch krokov vzdá sám. Druhý program: hádaj číslo S INPUT, IF a GOTO sa už dá napísať hra. Súbor examples/guess.abas:\nAtari BASIC 10 REM A guessing game with IF and GOTO 20 SECRET=37:TRIES=0 30 PRINT \"Guess my number (1-100)\"; 40 INPUT G 50 TRIES=TRIES+1 60 IF G\u003cSECRET THEN PRINT \"Too small\":GOTO 30 70 IF G\u003eSECRET THEN PRINT \"Too big\":GOTO 30 80 PRINT \"Yes! It took you \";TRIES;\" tries\" Basic26 guess.abas --run alebo s odpoveďami zo súboru examples/guess.in:\nBasic26 guess.abas --sim --sim-input guess.in Guess my number (1-100)?50 Too big Guess my number (1-100)?25 Too small Guess my number (1-100)?37 Yes! It took you 3 tries Riadky 60 a 70 sú typický tvar: „ak niečo nesedí, povedz to a choď späť“. Na riadok 80 sa program dostane, len keď neplatí ani jedno – číslo je uhádnuté. Tajné číslo je zatiaľ vždy 37; náhodné príde v kapitole 16.\nPrečo s GOTO šetriť GOTO je silný a ľahko sa ním spraví neporiadok. Program, v ktorom sa skáče krížom-krážom, sa nedá čítať – hovorí sa mu „špagetový“. Niekoľko zvykov, ktoré pomáhajú:\nNa opakovanie so známym počtom použi FOR (kapitola 10). Skákaj dozadu len na začiatok slučky a dopredu len za jej koniec. Cieľ skoku označ komentárom: 500 REM Game over. V Turbo-BASICu XL sa dá väčšina GOTO nahradiť slučkami WHILE, REPEAT a DO (kapitoly 28 a 29).\nČasté chyby Čo sa stalo Čo sa stane skok na riadok, ktorý nie je error B26012: line 50 does not exist slučka bez východu program neskončí; simulátor to po desiatich miliónoch krokov vzdá: error B26213: instruction limit reached GOTO na vlastný riadok (30 GOTO 30) program stojí na mieste – niekedy sa to robí naschvál, aby obrazovka ostala po prečíslovaní riadkov ukazuje GOTO inam pri vsúvaní riadkov nemeň čísla tých, na ktoré sa skáče Interpreter na Atari by skok na neexistujúci riadok ohlásil až počas behu (chyba 12), a len keby naň program naozaj prišiel. Prekladač to vidí hneď.\nVyskúšaj si Vypíš čísla od 10 do 1 pomocou IF a GOTO. Uprav guess.abas, aby po šiestich pokusoch prezradil číslo a skončil. Spýtaj sa na číslo; kým nie je medzi 1 a 10, pýtaj sa znova. Zhrnutie GOTO n pokračuje riadkom n. Skok dozadu je slučka; potrebuje IF, ktorým sa z nej dá vyjsť. IF … THEN 100 je skratka za IF … THEN GOTO 100. Riadok, na ktorý sa skáče, musí existovať. Späť: 8. Podmienka · Ďalej: 10. Slučka s počítadlom\n","t":"9. Skok: GOTO","u":"09-goto/"},{"c":"Na čo to je Najčastejšia slučka zo všetkých: „sprav toto desaťkrát“ alebo „prejdi čísla od 1 do 100“. FOR sa o počítanie postará sám.\nAko sa to píše Atari BASIC FOR premenná=začiatok TO koniec príkazy NEXT premenná alebo s krokom:\nAtari BASIC FOR premenná=začiatok TO koniec STEP krok príkazy NEXT premenná Slovo Význam FOR začína slučku s počítadlom premenná počítadlo – obyčajná číselná premenná začiatok hodnota, ktorú počítadlo dostane pred prvým prechodom TO koniec posledná hodnota, pri ktorej sa telo ešte vykoná STEP krok o koľko sa počítadlo po každom prechode zmení; bez STEP o 1 NEXT premenná koniec tela: zmeň počítadlo a ak ešte neprekročilo koniec, choď späť za FOR Telo slučky je všetko medzi FOR a NEXT. Môže byť na ďalších riadkoch, alebo na tom istom riadku za dvojbodkou.\nCelý program Súbor examples/for.abas:\nAtari BASIC 10 REM FOR: a loop with a counter 20 FOR I=1 TO 10 30 PRINT I;\" \"; 40 NEXT I 50 PRINT 60 FOR I=0 TO 20 STEP 5:PRINT I;\" \";:NEXT I 70 PRINT 80 FOR I=5 TO 1 STEP -1:PRINT I;\" \";:NEXT I 90 PRINT \"Go!\" 100 PRINT 110 PRINT \"The 7 times table:\" 120 FOR ROW=1 TO 10 130 PRINT ROW;\" x 7 = \";ROW*7 140 NEXT ROW 150 PRINT 160 FOR ROW=1 TO 4 170 FOR COL=1 TO ROW 180 PRINT \"*\"; 190 NEXT COL 200 PRINT 210 NEXT ROW 220 SUM=0 230 FOR I=1 TO 100:SUM=SUM+I:NEXT I 240 PRINT \"1+2+...+100 = \";SUM Preklad a spustenie Basic26 for.abas --sim Čo uvidíš 1 2 3 4 5 6 7 8 9 10 0 5 10 15 20 5 4 3 2 1 Go! The 7 times table: 1 x 7 = 7 2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35 6 x 7 = 42 7 x 7 = 49 8 x 7 = 56 9 x 7 = 63 10 x 7 = 70 * ** *** **** 1+2+...+100 = 5050 Ako to funguje Riadky 20 až 40: I ide od 1 do 10 vrátane. Počítadlo sa dá v tele normálne používať – tu sa vypisuje. Riadok 60: celá slučka na jednom riadku. STEP 5 zväčšuje I po piatich. Riadok 80: záporný krok počíta nadol. Bez STEP -1 by to nešlo. Riadky 120 až 140: počítadlo ROW vstupuje do výpočtu ROW*7. Riadky 160 až 210: slučka v slučke. Vonkajšia ide po riadkoch, vnútorná vypíše toľko hviezdičiek, aké je číslo riadka. Vnútorná slučka má ako koniec premennú ROW – koniec nemusí byť číslo. Vnútorná slučka musí byť celá vo vonkajšej: najprv NEXT COL, potom NEXT ROW. Riadky 220 až 240: zbieranie súčtu. Pred slučkou sa SUM vynuluje a v každom prechode sa k nemu pripočíta I. Telo slučky je odsadené o dve medzery za číslom riadka. BASIC tie medzery ignoruje (Atari BASIC ich pri písaní zahodí, Turbo-BASIC XL vo výpise odsadzuje sám), ale je z nich na prvý pohľad vidieť, čo k čomu patrí – a ktorá slučka nemá NEXT.\nZačiatočníci často volajú počítadlá I, J, K. Je to zvyk z matematiky; meno ako ROW alebo COL však hovorí viac.\nŠtyri vlastnosti, ktoré treba poznať 1. Telo sa vykoná vždy aspoň raz. FOR I=5 TO 1 bez záporného kroku telo jedenkrát vykoná (s I = 5) a až NEXT zistí, že je za koncom. Tak sa správa Atari BASIC aj Turbo-BASIC XL.\n2. Po skončení slučky je počítadlo o krok ďalej. Po FOR I=1 TO 3 je v I číslo 4.\n3. Koniec a krok sa vypočítajú raz, pri vstupe do slučky. Keď v tele zmeníš premennú, ktorá bola koncom, počet prechodov sa už nezmení.\n4. Krok môže byť desatinný: FOR X=0 TO 1 STEP 0.25 prejde 0, 0.25, 0.5, 0.75 a 1.\nČakacia slučka V starých programoch často nájdeš prázdnu slučku:\nAtari BASIC 500 FOR W=1 TO 300:NEXT W Nerobí nič, len počíta – a tým spomaľuje. V interpreteri trvalo tristo prechodov asi pol sekundy a programátori si tak robili prestávky. Preložený program je však mnohokrát rýchlejší, takže prestávka skoro zmizne. Presné čakanie, ktoré od rýchlosti nezávisí, je v kapitolách 18 (časovač Atari) a 33 (PAUSE v Turbo-BASICu XL); pre dobové programy má prekladač voľbu --line-delay (kapitola 42).\nČasté chyby Čo sa stalo Čo sa stane chýba NEXT error B26024: FOR I has no NEXT NEXT bez FOR error B26013: NEXT without FOR slučky sa krížia (NEXT I pred NEXT J) error B26013: NEXT I does not match FOR J počítanie nadol bez STEP -1 telo sa vykoná raz a slučka skončí v tele meníš počítadlo slučka preskakuje hodnoty – radšej to nerob z tela sa skáče von cez GOTO funguje; slučka ostane rozrobená, kým ju nenahradí nový FOR s tým istým počítadlom Vyskúšaj si Vypíš párne čísla od 2 do 20. Vypíš malú násobilku celú: desať riadkov a v každom desať čísel. (Slučka v slučke a čiarka v PRINT.) Spýtaj sa na číslo N a vypíš súčin čísel od 1 do N (faktoriál). Zhrnutie FOR I=a TO b … NEXT I vykoná telo pre I od a po b vrátane. STEP n mení krok; bez neho je 1, záporný počíta nadol. Telo sa vykoná aspoň raz. Slučky sa smú vnárať, nie krížiť. Čakacia slučka je v preloženom programe oveľa kratšia než v interpreteri. Späť: 9. Skok · Ďalej: 11. Podprogramy\n","t":"10. Slučka s počítadlom: FOR, TO, STEP, NEXT","u":"10-for/"},{"c":"Na čo to je Keď program potrebuje tú istú vec na viacerých miestach – podčiarknuť nadpis, počkať na kláves, nakresliť panáčika –, nemusí ju písať zakaždým znova. Napíše ju raz ako podprogram a z rôznych miest ju volá.\nAko sa to píše Atari BASIC GOSUB číslo riadka … RETURN Slovo Význam GOSUB n zapamätaj si, kde si, a pokračuj riadkom n RETURN vráť sa tam, odkiaľ ťa posledný GOSUB poslal – k príkazu hneď za ním POP zabudni posledný GOSUB bez návratu GOSUB je GOTO s pamäťou. Rozdiel je práve v tom návrate: podprogram nemusí vedieť, kto ho zavolal.\nCelý program Súbor examples/gosub.abas:\nAtari BASIC 10 REM GOSUB: a piece of program with a way back 20 DIM T$(30) 30 T$=\"First\":GOSUB 1000 40 T$=\"Second title\":GOSUB 1000 50 N=3:GOSUB 2000 60 N=10:GOSUB 2000 70 END 1000 REM Print T$ underlined 1010 PRINT T$ 1020 FOR I=1 TO LEN(T$):PRINT \"-\";:NEXT I 1030 PRINT 1040 RETURN 2000 REM Print the square and the cube of N 2010 PRINT N;\" squared is \";N*N;\", cubed \";N*N*N 2020 RETURN Preklad a spustenie Basic26 gosub.abas --sim Čo uvidíš First ----- Second title ------------ 3 squared is 9, cubed 27 10 squared is 100, cubed 1000 Ako to funguje Riadky 30 až 60 sú hlavný program. Je krátky a číta sa ako zoznam úloh. Riadky 1000 až 1040 sú podprogram, ktorý vypíše text z T$ a podčiarkne ho pomlčkami. Volá sa dvakrát, zakaždým s iným textom. Ako podprogram dostane údaje: cez obyčajné premenné. Hlavný program pred volaním uloží text do T$ (alebo číslo do N) a podprogram si ho odtiaľ vezme. BASIC nemá „parametre“; všetky premenné sú spoločné pre celý program. Riadok 70, END, je tu nutný. Bez neho by program po riadku 60 pokračoval ďalej na riadok 1000, vbehol do podprogramu a jeho RETURN by sa nemal kam vrátiť. Zvykom je dávať podprogramy na vysoké čísla riadkov (1000, 2000 …) a každý začať komentárom, čo robí a ktoré premenné číta.\nPodprogram môže volať ďalší podprogram. Návraty sa pamätajú v poradí – každý RETURN sa vráti k tomu GOSUB, ktorý bol posledný.\nPozor na spoločné premenné Podprogram na riadku 1000 používa počítadlo I. Keby hlavný program volal GOSUB 1000 z vnútra vlastnej slučky FOR I=…, podprogram by mu počítadlo prepísal. Pomôcť si musíš sám: podprogramy nech používajú iné mená premenných než hlavný program.\nPOP Niekedy sa z podprogramu nechceš vrátiť – napríklad hráč v ňom prehral a program má skočiť rovno na koniec hry. Obyčajný GOTO z podprogramu by nechal zapamätaný návrat „visieť“. POP ho zahodí:\nAtari BASIC 1050 IF LIVES=0 THEN POP:GOTO 5000 Je to zriedkavý príkaz; v dobových programoch ho občas stretneš.\nČasté chyby Čo sa stalo Čo sa stane chýba END pred podprogramami program do podprogramu „dobehne“ a skončí s ERROR- 16 AT LINE 1040 RETURN bez GOSUB ERROR- 16 GOSUB na riadok, ktorý nie je error B26012: line 1000 does not exist do podprogramu sa skočí cez GOTO RETURN sa nemá kam vrátiť: ERROR- 16 podprogram zmení premennú, ktorú používa volajúci výpočet vyjde zle, bez hlásenia Vyskúšaj si Napíš podprogram, ktorý vypíše riadok z N hviezdičiek, a zavolaj ho pre 5, 10 a 15. Pridaj do gosub.abas podprogram, ktorý T$ vypíše v rámčeku z pomlčiek nad aj pod textom. Zmaž riadok 70 a pozri, na ktorom riadku a s akou chybou program skončí. Zhrnutie GOSUB n zavolá podprogram na riadku n, RETURN sa vráti za GOSUB. Údaje sa podprogramu odovzdávajú v premenných; všetky premenné sú spoločné. Pred podprogramami musí byť END (alebo GOTO), aby do nich program nevbehol. Chyba 16 znamená RETURN, ktorý sa nemá kam vrátiť. Späť: 10. Slučka s počítadlom · Ďalej: 12. Výber z možností\n","t":"11. Podprogramy: GOSUB, RETURN, POP","u":"11-gosub/"},{"c":"Na čo to je Ponuka s piatimi možnosťami by potrebovala päť riadkov IF C=1 THEN …, IF C=2 THEN …. ON to spraví jedným príkazom: podľa čísla vyberie jeden riadok zo zoznamu.\nAko sa to píše Atari BASIC ON výraz GOTO riadok1,riadok2,riadok3 ON výraz GOSUB riadok1,riadok2,riadok3 Hodnota výrazu Čo sa stane 1 skok na prvý riadok zo zoznamu 2 skok na druhý 3 skok na tretí 0 alebo viac, než je riadkov nič – program pokračuje ďalším príkazom ON … GOSUB volá vybraný riadok ako podprogram a po RETURN pokračuje za príkazom ON.\nCelý program Súbor examples/on.abas je malá kalkulačka s ponukou:\nAtari BASIC 10 REM ON: choosing one of several lines 20 PRINT \"1 Add 2 Multiply 3 Quit\" 30 PRINT \"Your choice\"; 40 INPUT C 50 IF C=3 THEN PRINT \"Bye\":END 60 PRINT \"Two numbers\"; 70 INPUT A,B 80 ON C GOSUB 200,300 90 GOTO 20 200 PRINT A;\" + \";B;\" = \";A+B 210 RETURN 300 PRINT A;\" * \";B;\" = \";A*B 310 RETURN Preklad a spustenie Basic26 on.abas --run alebo v simulátore s odpoveďami zo súboru examples/on.in:\nBasic26 on.abas --sim --sim-input on.in Čo uvidíš 1 Add 2 Multiply 3 Quit Your choice?1 Two numbers?3,4 3 + 4 = 7 1 Add 2 Multiply 3 Quit Your choice?2 Two numbers?3,4 3 * 4 = 12 1 Add 2 Multiply 3 Quit Your choice?3 Bye Ako to funguje Riadok 80: keď je C jedna, zavolá sa podprogram na riadku 200; keď dva, na riadku 300. Riadok 90: po návrate z podprogramu sa ide späť na ponuku. Keď človek napíše číslo, ktoré v ponuke nie je (napríklad 7), ON neurobí nič a ponuka sa ukáže znova. Program sa teda nepokazí, len na voľbu nereaguje. Hodnota nemusí byť celá – zaokrúhli sa. ON 2.7 GOTO … vyberie tretí riadok. Za ON môže byť ľubovoľný výraz. Často sa hodnota najprv upraví, aby začínala jednotkou:\nAtari BASIC ON K-48 GOTO 100,200,300 (Kláves s číslicou 1 má kód 49, o kódoch je kapitola 15.)\nČasté chyby Čo sa stalo Čo sa stane riadok zo zoznamu neexistuje error B26012: line 300 does not exist za ON chýba GOTO alebo GOSUB error B26017: expected GOTO, GOSUB, EXEC or GO# after ON hodnota je 0 alebo priveľká nič sa nevyberie, program ide ďalej – ošetri to, ak to vadí premenná sa volá ONE, ONLY … číta sa ako ON E, ON LY (kapitola 4) Vyskúšaj si Pridaj do kalkulačky odčítanie a delenie; Quit nech je päťka. Ošetri voľbu mimo ponuky: vypíš No such choice. Napíš program, ktorý sa spýta na číslo dňa (1–7) a cez ON … GOTO vypíše jeho meno. Zhrnutie ON X GOTO a,b,c skočí na riadok podľa hodnoty X: 1 je prvý, 2 druhý … ON X GOSUB a,b,c ho zavolá ako podprogram. Hodnota mimo zoznamu neurobí nič. Hodí sa na ponuky a všade, kde by bol dlhý rad IF. Späť: 11. Podprogramy · Ďalej: 13. Polia\n","t":"12. Výber z možností: ON … GOTO, ON … GOSUB","u":"12-on/"},{"c":"Na čo to je Sedem teplôt za týždeň by potrebovalo sedem premenných a sedem skoro rovnakých riadkov na každú vec, ktorú s nimi chceš urobiť. Pole je rad čísel pod jedným menom: TEMP(0), TEMP(1) … TEMP(6). Číslo v zátvorke – index – môže byť premenná, a tak pole prejde jedna slučka.\nAko sa to píše Atari BASIC DIM meno(najväčší index) DIM meno(riadky,stĺpce) meno(index)=hodnota Zápis Význam DIM A(6) pole so siedmimi prvkami: A(0) až A(6) DIM T(3,3) tabuľka: prvky T(0,0) až T(3,3), teda 4 × 4 A(2)=11 uloží 11 do prvku s indexom 2 A(I) prvok, ktorého index je práve v premennej I CLR vynuluje všetky premenné a zruší všetky DIM Indexy sa počítajú od nuly. Veľa programov nulu nepoužíva a počíta od jednotky – nevadí, jeden prvok ostane nevyužitý.\nPole môže držať len čísla. Pole reťazcov Atari BASIC nemá; ako ho obísť, je na konci kapitoly.\nCelý program Súbor examples/arrays.abas:\nAtari BASIC 10 REM Arrays: many numbers under one name 20 DIM TEMP(6) 30 TEMP(0)=12:TEMP(1)=14:TEMP(2)=11:TEMP(3)=17 40 TEMP(4)=19:TEMP(5)=16:TEMP(6)=13 50 SUM=0:HIGH=0 60 FOR D=0 TO 6 70 SUM=SUM+TEMP(D) 80 IF TEMP(D)\u003eTEMP(HIGH) THEN HIGH=D 90 NEXT D 100 PRINT \"Average: \";SUM/7 110 PRINT \"Warmest day: \";HIGH;\" with \";TEMP(HIGH) 120 REM A table with rows and columns 130 DIM T(3,3) 140 FOR R=1 TO 3:FOR C=1 TO 3 150 T(R,C)=R*C 160 NEXT C:NEXT R 170 FOR R=1 TO 3 180 PRINT T(R,1),T(R,2),T(R,3) 190 NEXT R Preklad a spustenie Basic26 arrays.abas --sim Čo uvidíš Average: 14.5714285 Warmest day: 4 with 19 1 2 3 2 4 6 3 6 9 Ako to funguje Riadok 20: DIM TEMP(6) vyhradí sedem čísel. Tak ako pri reťazcoch, pole treba ohlásiť skôr, než ho použiješ. Riadky 30 a 40: naplnenie po jednom. Pohodlnejšie to pôjde s DATA v kapitole 14. Riadky 60 až 90: jedna slučka prejde celé pole. TEMP(D) je zakaždým iný prvok, lebo D sa mení. Riadok 80: hľadanie najväčšieho. HIGH si nepamätá teplotu, ale index dňa, kedy bola najvyššia; samotnú teplotu potom dá TEMP(HIGH). Riadok 130: dvojrozmerné pole je tabuľka. Prvé číslo je riadok, druhé stĺpec. Riadky 140 až 160: dve slučky v sebe prejdú všetky políčka. Po DIM v poli nemusia byť nuly Atari BASIC pole pri DIM nevynuluje – ostane v ňom, čo bolo v pamäti predtým. Kým do prvku niečo neuložíš, nespoliehaj sa, že je nulový. Ak nuly potrebuješ, daj ich tam slučkou:\nAtari BASIC 30 FOR I=0 TO 6:TEMP(I)=0:NEXT I Koľko pamäte pole zaberie Každé číslo má šesť bajtov. DIM A(1000) je šesť kilobajtov, a sedem takých polí sa už do Atari nezmestí – program skončí chybou 2. Jedno pole smie mať najviac 32 767 bajtov: DIM T(100,100) by ich chcelo vyše šesťdesiattisíc a skončí chybou 9.\nCLR CLR vráti program do stavu ako na začiatku: číselné premenné sú nula, reťazce a polia neexistujú a treba ich ohlásiť znova. Zabudne aj otvorené slučky FOR a podprogramy GOSUB – NEXT za CLR je chyba 13, RETURN chyba 16; TRAP ostane. Použije sa zriedka – napríklad v hre, ktorá po skončení začína odznova a chce si polia pripraviť nanovo.\nZoznam slov bez poľa reťazcov Viac textov sa v Atari BASICu drží v jednom dlhom reťazci a vyberajú sa z neho časti rovnakej dĺžky:\nAtari BASIC 10 DIM D$(21) 20 D$=\"MonTueWedThuFriSatSun\" 30 FOR N=1 TO 7 40 PRINT D$(N*3-2,N*3) 50 NEXT N Každý deň má tri písmená; N-tý sa začína na mieste N*3-2.\nČasté chyby Čo sa stalo Čo sa stane pole bez DIM ERROR- 9 AT LINE 10 index za koncom, napísaný číslom (A(6) pri DIM A(5)) error B26009: A(6) is past DIM A(5) index za koncom, vypočítaný za behu ERROR- 9 AT LINE 20 záporný index ERROR- 3 DIM toho istého poľa dvakrát error B26009: A( is DIMensioned twice (po CLR je to len upozornenie) pole je príliš veľké ERROR- 2 (nie je pamäť) alebo ERROR- 9 (viac než 32 767 bajtov v jednom poli) slučka FOR I=1 TO 7 pri DIM A(6) chyba 9 pri poslednom prechode: prvkov je sedem, ale posledný má index 6 Vyskúšaj si Nájdi v arrays.abas aj najchladnejší deň. Naplň pole desiatimi číslami z klávesnice (INPUT v slučke) a vypíš ich v opačnom poradí. Vypíš z tabuľky T len uhlopriečku: T(1,1), T(2,2), T(3,3). Zhrnutie Pole je rad čísel pod jedným menom; DIM A(n) má prvky 0 až n. Index môže byť premenná, preto pole prejde jedna slučka FOR. DIM A(r,s) je tabuľka. Index mimo poľa je chyba 9. Polia sú len číselné; viac textov sa drží v jednom reťazci. Späť: 12. Výber z možností · Ďalej: 14. Dáta v programe\n","t":"13. Polia: DIM A(n), DIM A(n,m), CLR","u":"13-polia/"},{"c":"Na čo to je Program často potrebuje zoznam hodnôt, ktoré sa nemenia: mená mesiacov, noty melódie, body obrázka. Namiesto dvadsiatich riadkov A(0)=12:A(1)=14… ich napíšeš za sebou do riadkov DATA a program si ich po jednej číta.\nAko sa to píše Atari BASIC DATA hodnota,hodnota,hodnota READ premenná,premenná RESTORE RESTORE číslo riadka Slovo Význam DATA zoznam hodnôt oddelených čiarkami; sám nič nerobí, len ich drží READ A vezmi ďalšiu hodnotu zo zoznamu a ulož ju do A RESTORE začni čítať znova od prvého DATA v programe RESTORE n pokračuj čítaním od DATA na riadku n Všetky DATA v programe tvoria jeden dlhý zoznam v poradí čísel riadkov. Program si pamätá, pokiaľ dočítal; každý READ vezme ďalšiu hodnotu.\nCelý program Súbor examples/data.abas:\nAtari BASIC 10 REM DATA: values written in the program 20 DIM NAME$(10) 30 FOR I=1 TO 4 40 READ NAME$,AGE 50 PRINT NAME$;\" is \";AGE 60 NEXT I 70 RESTORE 1010 80 READ NAME$,AGE 90 PRINT \"Again: \";NAME$ 100 END 1000 DATA Anna,12 1010 DATA Boris,15,Cyril,9 1020 DATA Dana,11 Preklad a spustenie Basic26 data.abas --sim Čo uvidíš Anna is 12 Boris is 15 Cyril is 9 Dana is 11 Again: Boris Ako to funguje Riadok 40: jeden READ vezme dve hodnoty za sebou – text do NAME$ a číslo do AGE. Štyri prechody slučky prečítajú osem hodnôt. Riadky 1000 až 1020: na tom, ako sú hodnoty rozdelené do riadkov, nezáleží. Riadok 1010 má dve dvojice, ostatné po jednej; READ ide jednoducho ďalej. Text v DATA sa píše bez úvodzoviek. Všetko medzi čiarkami je hodnota tak, ako je – vrátane medzier. Preto text v DATA nemôže obsahovať čiarku. Riadok 70: RESTORE 1010 vráti čítanie na začiatok riadka 1010, takže ďalší READ dostane Borisa. Riadok 100: END tu nie je nutný – DATA sa nevykonáva, program cez ne prejde bez účinku. Zvykom je však dávať dáta na koniec, za END. Typický vzor: naplnenie poľa Atari BASIC 10 DIM TEMP(6) 20 FOR D=0 TO 6:READ X:TEMP(D)=X:NEXT D 30 DATA 12,14,11,17,19,16,13 Číta sa do pomocnej premennej X a tá sa uloží do poľa. Tak sa v kapitole 13 dali nahradiť dva riadky priradení.\nKoniec zoznamu značkou Keď nechceš počítať, koľko hodnôt v DATA je, daj na koniec hodnotu, ktorá sa inak nevyskytne, a čítaj, kým na ňu nenarazíš:\nAtari BASIC 10 READ X 20 IF X=-1 THEN END 30 PRINT X 40 GOTO 10 50 DATA 5,8,13,21,-1 Časté chyby Čo sa stalo Čo sa stane READ a žiadne hodnoty už nie sú ERROR- 6 AT LINE 40 do číselnej premennej príde text (READ A a v dátach Anna) ERROR- 8 poradie v READ nesedí s poradím v DATA chyba 8, alebo sa číslo načíta ako text – program beží, ale s nezmyslami text v úvodzovkách (DATA \"Anna\") úvodzovky sa stanú súčasťou textu medzera za čiarkou (DATA Anna, Boris) druhé meno sa začína medzerou RESTORE na riadok, za ktorým už žiadne DATA nie sú error B26006: there is no DATA at or after line 500 Vyskúšaj si Pridaj do DATA piatu osobu a uprav slučku. Prečítaj z DATA desať čísel a vypíš ich súčet. Napíš program, ktorý sa spýta na číslo mesiaca a z DATA vypíše jeho meno. (Čítaj mená v slučke a zastav sa pri správnom.) Zhrnutie DATA drží hodnoty, READ ich číta jednu po druhej. Všetky DATA v programe sú jeden zoznam v poradí riadkov. RESTORE vráti čítanie na začiatok, RESTORE n na riadok n. Text v DATA je bez úvodzoviek a bez čiarok. Čítanie za koniec je chyba 6. Späť: 13. Polia · Ďalej: 15. Znaky a čísla\n","t":"14. Dáta v programe: DATA, READ, RESTORE","u":"14-data/"},{"c":"Na čo to je Počítač nepozná písmená, len čísla. Každý znak má svoj kód – A je 65, B je 66, medzera 32. Tabuľka kódov na Atari sa volá ATASCII. Štyri funkcie tejto kapitoly prevádzajú medzi znakom a jeho kódom a medzi číslom a textom.\nAko sa to píše Funkcia Čo vráti Príklad Výsledok ASC(text) kód prvého znaku ASC(\"A\") 65 CHR$(kód) znak s tým kódom CHR$(66) B STR$(číslo) číslo ako text STR$(1234) \"1234\" VAL(text) text ako číslo VAL(\"12\") 12 Funkcie s dolárom na konci mena vracajú text, ostatné číslo.\nCelý program Súbor examples/chars.abas:\nAtari BASIC 10 REM CHR$, ASC, STR$, VAL 20 DIM A$(20),D$(10) 30 PRINT \"The code of A is \";ASC(\"A\") 40 PRINT \"Character 66 is \";CHR$(66) 50 FOR C=65 TO 90:PRINT CHR$(C);:NEXT C 60 PRINT 70 A$=\"hello\" 80 REM Small letters to capitals: 32 less 90 FOR I=1 TO LEN(A$) 100 C=ASC(A$(I,I)) 110 IF C\u003e=97 AND C\u003c=122 THEN A$(I,I)=CHR$(C-32) 120 NEXT I 130 PRINT A$ 140 REM A number into text and back 150 N=1234 160 D$=STR$(N) 170 PRINT D$;\" has \";LEN(D$);\" digits\" 180 PRINT \"The last digit is \";D$(LEN(D$)) 190 PRINT VAL(\"12\")+VAL(\"30\") 200 PRINT VAL(\"3.5 apples\") Preklad a spustenie Basic26 chars.abas --sim Čo uvidíš The code of A is 65 Character 66 is B ABCDEFGHIJKLMNOPQRSTUVWXYZ HELLO 1234 has 4 digits The last digit is 4 42 3.5 Ako to funguje Riadok 50: kódy 65 až 90 sú veľké písmená A až Z. Slučka cez kódy vypíše celú abecedu. Riadky 90 až 120: malé písmená majú kódy 97 až 122, presne o 32 viac než veľké. Slučka prejde text znak po znaku, a kde nájde malé písmeno, prepíše ho znakom s kódom o 32 menším. A$(I,I) je jeden znak – na čítanie aj na zápis. Riadok 160: STR$ spraví z čísla text. S textom sa dajú robiť veci, ktoré s číslom nejdú: spočítať číslice (LEN), vybrať poslednú, zarovnať stĺpec. Riadok 190: VAL robí opak. Dva texty, z ktorých sa stanú čísla, a tie sa sčítajú. Riadok 200: VAL číta číslo od začiatku textu a skončí pri prvom znaku, ktorý do čísla nepatrí. Užitočné kódy Kód Znak 32 medzera 48–57 číslice 0–9 65–90 veľké písmená 97–122 malé písmená 125 zmaže obrazovku (kapitola 19) 155 koniec riadka (RETURN) 253 pípnutie PRINT CHR$(125) teda nevypíše znak, ale zmaže obrazovku. Atari má takých riadiacich kódov viac; všetky sú v prílohe D. Kódy 0 až 31 a 123 až 127 sú grafické znaky – čiarky, rohy a srdiečka, z ktorých sa skladali rámčeky.\nÚvodzovka sa v texte v úvodzovkách napísať nedá. Keď ju chceš vypísať, pomôže jej kód: PRINT CHR$(34);\"Hello\";CHR$(34).\nČasté chyby Čo sa stalo Čo sa stane VAL textu, ktorý sa nezačína číslom (VAL(\"ABC\")) ERROR- 18 AT LINE 10 výsledok STR$ sa nezmestí do reťazca odreže sa ako každý text: DIM A$(3) a A$=STR$(123456) nechá 123 ASC prázdneho textu vráti 0 číslo sa „sčíta“ ako text \"12\"+\"30\" nejde; najprv VAL Vyskúšaj si Vypíš kódy všetkých znakov slova, ktoré človek napíše. Otoč text naopak: prejdi ho od posledného znaku po prvý. Spočítaj ciferný súčet čísla: preveď ho cez STR$ na text a sčítaj VAL jednotlivých znakov. Zhrnutie Každý znak má kód ATASCII; ASC dá kód, CHR$ znak. Veľké písmená sú 65–90, malé o 32 viac, číslice 48–57. STR$ robí z čísla text, VAL z textu číslo. VAL textu bez čísla je chyba 18. Niektoré kódy sú príkazy pre obrazovku: CHR$(125) ju zmaže. Späť: 14. Dáta v programe · Ďalej: 16. Matematika a náhoda\n","t":"15. Znaky a čísla: CHR$, ASC, STR$, VAL","u":"15-funkcie-retazcov/"},{"c":"Na čo to je Funkcie pre všetko, čo nejde štyrmi základnými znamienkami: uhly (kreslenie kruhov, pohyb po oblúku), mocniny a logaritmy – a RND, bez ktorého by nebola žiadna hra, lebo dáva náhodné číslo.\nAko sa to píše Slovo Čo robí SIN(x), COS(x) sínus a kosínus uhla x ATN(x) arkustangens: uhol, ktorého tangens je x DEG príkaz: odteraz sú uhly v stupňoch (celý kruh je 360) RAD príkaz: odteraz sú uhly v radiánoch (celý kruh je 2π); tak program začína EXP(x) číslo e (2,718…) umocnené na x LOG(x) prirodzený logaritmus – opak EXP CLOG(x) desiatkový logaritmus: CLOG(1000) je 3 RND(0) náhodné číslo od 0 (vrátane) po 1 (bez nej) Tangens BASIC nemá, je to SIN(X)/COS(X). Číslo π tiež nie – ulož si ho do premennej.\nCelý program Súbor examples/math.abas:\nAtari BASIC 10 REM Mathematics and chance 20 DEG 30 PRINT \"SIN(30) = \";SIN(30) 40 PRINT \"COS(60) = \";COS(60) 50 PRINT \"ATN(1) = \";ATN(1) 60 RAD 70 PI=3.14159265 80 PRINT \"SIN(PI/2) = \";SIN(PI/2) 90 PRINT \"EXP(1) = \";EXP(1) 100 PRINT \"LOG(10) = \";LOG(10) 110 PRINT \"CLOG(1000) = \";CLOG(1000) 120 PRINT \"2^10 = \";2^10 130 REM Throwing a die: a whole number from 1 to 6 140 FOR I=1 TO 10 150 PRINT INT(RND(0)*6)+1;\" \"; 160 NEXT I 170 PRINT Preklad a spustenie Basic26 math.abas --sim Čo uvidíš SIN(30) = 0.499999999 COS(60) = 0.50000001 ATN(1) = 45.0000003 SIN(PI/2) = 1 EXP(1) = 2.71828179 LOG(10) = 2.30258509 CLOG(1000) = 3 2^10 = 1024 5 6 1 2 2 3 6 2 1 2 Ako to funguje Riadok 20: DEG prepne na stupne. Platí, kým ho nezmení RAD. Riadky 30 až 50: sínus tridsiatich stupňov je presne jedna polovica, ale Atari vypíše 0.499999999. Nie je to chyba prekladača – takto počíta Atari BASIC a preložený program dáva do poslednej číslice to isté. Funkcie sa počítajú približne a posledné miesto býva o kúsok vedľa. Preto výsledky funkcií neporovnávaj znakom = (kapitola 8). Riadok 70: π ako premenná. Na kreslenie v stupňoch ho nepotrebuješ. Riadok 150: najdôležitejší riadok kapitoly. RND(0) dá číslo ako 0.7312…; vynásobené šiestimi je od 0 po 5,99…; INT z neho spraví celé číslo 0 až 5; plus jedna je 1 až 6. Všeobecne: Atari BASIC INT(RND(0)*N)+1 je náhodné celé číslo od 1 do N. Na čísle v zátvorke RND nezáleží, zvykne sa písať nula.\nNáhoda v simulátore a v emulátore V simulátore dostaneš pri každom spustení tie isté „náhodné“ čísla – preto môže táto kapitola ukázať, čo program vypíše. Na Atari a v emulátore sú zakaždým iné.\nHádanka s náhodným číslom Hra z kapitoly 9 potrebovala zmeniť jediný riadok:\nAtari BASIC 20 SECRET=INT(RND(0)*100)+1:TRIES=0 Časté chyby Čo sa stalo Čo sa stane uhol v stupňoch bez DEG SIN(30) vyjde -0.988…, lebo 30 sa berie ako radiány logaritmus nuly alebo záporného čísla ERROR- 3 AT LINE 10 EXP príliš veľkého čísla (EXP(300)) ERROR- 3 – výsledok sa nezmestí RND(0)*6 bez INT desatinné číslo, nie hod kockou INT(RND(0)*6) bez +1 čísla 0 až 5 premenná PI bez priradenia je nula, a s ňou všetky výsledky Vyskúšaj si Vypíš tabuľku sínusov pre uhly 0, 15, 30 … 90 stupňov. Hoď dvoma kockami stokrát a spočítaj, koľkokrát padol súčet 7. (Spusti v emulátore viackrát.) Vyber náhodné písmeno abecedy: náhodné číslo 0–25, pripočítaj 65 a daj do CHR$. Zhrnutie SIN, COS, ATN počítajú v radiánoch, po DEG v stupňoch. EXP, LOG a CLOG sú mocniny a logaritmy; umocňovať sa dá aj znakom ^. RND(0) je náhodné číslo medzi 0 a 1; INT(RND(0)*N)+1 je celé od 1 do N. Výsledky funkcií sú približné – posledná číslica býva vedľa. Späť: 15. Znaky a čísla · Ďalej: 17. Chyby za behu\n","t":"16. Matematika a náhoda: SIN, COS, ATN, DEG, RAD, EXP, LOG, CLOG, RND","u":"16-matematika/"},{"c":"Na čo to je Niektoré chyby sa pri preklade zistiť nedajú: človek napíše písmená namiesto čísla, delí sa nulou, súbor na diskete nie je. Program vtedy vypíše ERROR- a skončí. S TRAP (anglicky „pasca“) sa chyba dá zachytiť: namiesto konca program skočí na riadok, ktorý si určíš, a tam sa rozhodne, čo ďalej.\nAko sa to píše Atari BASIC TRAP číslo riadka Zápis Význam TRAP 200 keď nastane chyba, pokračuj riadkom 200 TRAP 40000 zruš pascu (číslo väčšie než 32767 znamená „žiadna“) PEEK(195) číslo chyby, ktorá nastala PEEK(186)+256*PEEK(187) číslo riadka, na ktorom nastala PEEK číta bajt z pamäte počítača (kapitola 18); Atari si číslo chyby a riadok ukladá na tieto miesta. Zatiaľ ich ber ako zaklínadlo.\nPasca je na jedno použitie. Keď chyba nastane a program skočí, pasca je zrušená – ak ju chceš znova, musíš ju znova nastaviť.\nA tri príkazy okolo konca programu:\nPríkaz Význam END ukončí program STOP ukončí program a vypíše, na ktorom riadku RUN spustí program odznova, s vynulovanými premennými Celý program Súbor examples/trap.abas:\nAtari BASIC 10 REM TRAP: catching an error 20 TRAP 200 30 PRINT \"Divide 100 by (999 ends)\"; 40 INPUT N 50 IF N=999 THEN PRINT \"Bye\":END 60 PRINT \"100/\";N;\" = \";100/N 70 GOTO 20 200 REM An error brought us here 210 E=PEEK(195):L=PEEK(186)+256*PEEK(187) 220 PRINT \"Error \";E;\" at line \";L 230 IF E=8 THEN PRINT \"That was not a number\" 240 IF E=11 THEN PRINT \"Cannot divide by zero\" 250 GOTO 20 Preklad a spustenie Basic26 trap.abas --run alebo v simulátore s odpoveďami zo súboru examples/trap.in (4, abc, 0, 999):\nBasic26 trap.abas --sim --sim-input trap.in Čo uvidíš Divide 100 by (999 ends)?4 100/4 = 25 Divide 100 by (999 ends)?abc Error 8 at line 40 That was not a number Divide 100 by (999 ends)?0 100/0 = Error 11 at line 60 Cannot divide by zero Divide 100 by (999 ends)?999 Bye Ako to funguje Riadok 20 nastaví pascu. Kým nenastane chyba, nerobí nič. Odpoveď abc: INPUT N čaká číslo, takže je to chyba 8. Bez pasce by program skončil hlásením ERROR- 8 AT LINE 40. S pascou skočí na riadok 200. Riadok 210 si hneď odloží číslo chyby a riadok do premenných. Riadok 250 sa vracia na riadok 20, nie 30 – aby sa pasca nastavila znova. Odpoveď 0: PRINT na riadku 60 stihol vypísať začiatok (100/0 = ), až potom prišlo delenie a s ním chyba 11. Preto je hlásenie na tom istom riadku obrazovky. Najčastejšie čísla chýb Číslo Čo znamená 2 nie je pamäť (priveľký DIM) 3 hodnota mimo rozsahu (SQR(-1), LOG(0), záporný index) 5 reťazec: čítanie alebo zápis mimo jeho dĺžky 6 READ a žiadne DATA 8 text tam, kde malo byť číslo (INPUT, READ) 9 pole alebo reťazec: chýba DIM, alebo index mimo 11 delenie nulou alebo príliš veľké číslo 12 riadok neexistuje (vypočítaný GOTO) 13 NEXT bez FOR 16 RETURN bez GOSUB 18 VAL textu, ktorý nie je číslo 128 a viac chyby zariadení: súbor nie je, disk je plný … (kapitola 24) Celý zoznam je v prílohe C.\nSTOP a END Oba program ukončia. STOP k tomu vypíše, kde:\nAtari BASIC 10 PRINT \"A\":STOP:PRINT \"B\" A STOPPED AT LINE 10 Hodí sa pri hľadaní chyby: vieš, že program došiel až sem. Na Atari sa po STOP dalo pokračovať príkazom CONT; preložený program už pokračovať nevie.\nKláves BREAK na Atari robí to isté ako STOP – zastaví program a vypíše riadok.\nRUN RUN v programe ho spustí odznova: premenné sú nula, polia a reťazce neexistujú, DATA sa čítajú od začiatku, pasca je zrušená. Hra tak môže po skončení začať novú:\nAtari BASIC 900 PRINT \"Again (Y/N)\";:INPUT A$ 910 IF A$=\"Y\" THEN RUN Časté chyby Čo sa stalo Čo sa stane pasca sa po chybe nenastavila znova druhá chyba program ukončí obsluha chyby sama spôsobí chybu program skončí – pasca už neplatí TRAP na riadok, ktorý nie je pasca nič nezachytí a chyba program ukončí pasca zakryje chybu, s ktorou si nepočítal program sa správa čudne a nič nehlási; pri hľadaní chýb TRAP vypni obsluha sa vráti doprostred slučky alebo podprogramu FOR a GOSUB ostali rozrobené; vráť sa radšej na začiatok tej časti programu Vyskúšaj si Uprav program, aby pri chybe 8 vypísal Please type a number a inú chybu vypísal číslom. Zmaž riadok 20 a zadaj abc. Ako vyzerá hlásenie bez pasce? Napíš slučku, ktorá číta DATA bez toho, aby poznala ich počet: TRAP zachytí chybu 6 na konci zoznamu. Zhrnutie TRAP n pošle program pri chybe na riadok n namiesto toho, aby skončil. Pasca platí na jednu chybu; potom ju treba nastaviť znova. Číslo chyby je v PEEK(195), riadok v PEEK(186)+256*PEEK(187). STOP skončí s výpisom riadka, END potichu, RUN začne odznova. Späť: 16. Matematika a náhoda · Ďalej: 18. Pamäť počítača\n","t":"17. Chyby za behu: TRAP, STOP, END, RUN","u":"17-chyby/"},{"c":"Na čo to je Pamäť Atari je rad 65 536 očíslovaných priehradok. Číslo priehradky je adresa (0 až 65535) a v každej je jeden bajt – číslo od 0 do 255. V pamäti je tvoj program, jeho premenné, obrazovka aj nastavenia počítača: farby, okraje, hodiny, posledný stlačený kláves.\nPEEK sa do priehradky pozrie a POKE do nej zapíše. Tak sa z BASICu dostaneš k veciam, na ktoré nemá príkaz.\nAko sa to píše Zápis Význam PEEK(adresa) funkcia: bajt, ktorý je na adrese POKE adresa,hodnota príkaz: zapíš bajt (0–255) na adresu PEEK(a)+256*PEEK(a+1) číslo väčšie než 255 uložené v dvoch susedných bajtoch FRE(0) funkcia: koľko bajtov pamäte je ešte voľných ADR(A$) funkcia: adresa, na ktorej leží text reťazca Celý program Súbor examples/memory.abas:\nAtari BASIC 10 REM PEEK and POKE: the memory of the computer 20 PRINT \"Left margin: \";PEEK(82) 30 PRINT \"Right margin: \";PEEK(83) 40 SCR=PEEK(88)+256*PEEK(89) 50 PRINT \"The screen starts at \";SCR 60 DIM A$(5):A$=\"HELLO\" 70 PRINT \"The first byte of A$ is \";PEEK(ADR(A$)) 80 POKE ADR(A$),74 90 PRINT A$ 100 POKE 82,10 110 PRINT \"Margin 10 from the next line on\" 120 PRINT \"Here it is\" 130 POKE 82,2 140 PRINT \"And back\" Preklad a spustenie Tentoraz s voľbou --sim-screen: simulátor na konci neukáže, čo program postupne vypísal, ale ako vyzerá obrazovka – aj s medzerami na začiatku riadkov.\nBasic26 memory.abas --sim --sim-screen Čo uvidíš Left margin: 2 Right margin: 39 The screen starts at 48192 The first byte of A$ is 72 JELLO Margin 10 from the next line on Here it is And back Ako to funguje Riadky 20 a 30: na adresách 82 a 83 si Atari drží ľavý a pravý okraj textu. Ľavý okraj je 2 – preto každý riadok na obrazovke začína dvoma medzerami. (Staré televízory okraj obrazu orezávali.) Riadok 40: adresa pamäte obrazovky je väčšia než 255, takže zaberá dva bajty, 88 a 89. Druhý bajt má váhu 256. Tento vzorec stretneš v dobových programoch stále. Riadok 70: ADR(A$) je adresa prvého znaku reťazca. Je na nej 72 – kód písmena H. Riadok 80: POKE tam zapíše 74, kód písmena J, a z HELLO je JELLO. Reťazec sa zmenil bez toho, aby sa ho dotkol príkaz priradenia. Riadok 100: POKE 82,10 posunie ľavý okraj. Platí od najbližšieho nového riadka – preto je riadok 110 ešte na starom mieste a až riadok 120 odsadený. Riadok 130: okraj späť. Aj tu zmena platí až od ďalšieho riadka, takže And back je ešte odsadený. Užitočné adresy Adresa Čo tam je Príklad 18, 19, 20 hodiny: bajt 20 sa zväčší 50-krát za sekundu, 19 raz za 5 sekúnd POKE 20,0 82, 83 ľavý a pravý okraj textu POKE 82,0 84, 85 riadok a stĺpec kurzora PEEK(84) 88, 89 adresa pamäte obrazovky 106 koniec pamäte v stránkach po 256 bajtoch PEEK(106) 186, 187 riadok, na ktorom nastala chyba kapitola 17 195 číslo poslednej chyby 708–712 farby (to isté, čo nastavuje SETCOLOR 0–4) POKE 710,0 752 1 skryje kurzor, 0 ho ukáže POKE 752,1 764 kód naposledy stlačeného klávesu, 255 = žiadny kapitola 22 53279 klávesy START, SELECT, OPTION kapitola 22 Viac je v prílohe D. Najlepšia kniha o adresách Atari sa volá Mapping the Atari.\nHodiny a presné čakanie Bajt na adrese 20 sa sám od seba zväčší o jedna päťdesiatkrát za sekundu (na amerických strojoch šesťdesiatkrát). Keď doň zapíšeš nulu a počkáš, kým v ňom bude 50, prešla sekunda – nech je program akokoľvek rýchly. Súbor examples/wait.abas:\nAtari BASIC 10 REM Waiting by the clock of the computer 20 FOR N=5 TO 1 STEP -1 30 PRINT N 40 S=50:GOSUB 1000 50 NEXT N 60 PRINT \"Go!\" 70 END 1000 REM Wait S fiftieths of a second (S up to 255) 1010 POKE 20,0 1020 IF PEEK(20)\u003cS THEN 1020 1030 RETURN Basic26 wait.abas --run Program odpočíta od päť do jedna, s presne sekundovou prestávkou medzi číslami. Podprogram na riadku 1000 budú používať aj ďalšie kapitoly.\nTento program spúšťaj v emulátore. Hodiny poháňa obrazovka Atari a simulátor obrazovku nemá – bajt 20 v ňom stojí a riadok 1020 by sa točil donekonečna.\nFRE(0) PRINT FRE(0) vypíše, koľko bajtov ostáva pre reťazce a polia, teda koľko ešte zoberie DIM. Preložený program dá iné číslo než ten istý program v interpreteri, lebo v pamäti leží inak. Na čísle v zátvorke nezáleží.\nČasté chyby Čo sa stalo Čo sa stane POKE hodnoty nad 255 alebo zápornej ERROR- 3 AT LINE 80 adresa nad 65535 ERROR- 3 POKE na náhodnú adresu čokoľvek: nič, rozsypaná obrazovka, zamrznutý program. Pamäť nie je chránená čakanie na hodiny v simulátore program neskončí (instruction limit reached) dobový program robí POKE 106,… posúva koniec pamäte, aby si za ním schoval znakovú sadu; prekladač na to upozorní (kapitola 42) Vyskúšaj si Vypíš, na ktorom riadku a stĺpci je kurzor (PEEK(84), PEEK(85)). Zmeň wait.abas, aby medzi číslami čakal pol sekundy. Zisti kód posledného znaku reťazca: je na adrese ADR(A$)+LEN(A$)-1. Zhrnutie Pamäť sú bajty (0–255) na adresách 0–65535. PEEK(a) číta, POKE a,v zapisuje. Dvojbajtové číslo: PEEK(a)+256*PEEK(a+1). Na adrese 20 tikajú hodiny, 50 za sekundu – čakanie podľa nich nezávisí od rýchlosti programu. ADR(A$) je adresa textu reťazca, FRE(0) voľná pamäť. Späť: 17. Chyby za behu · Ďalej: 19. Textová obrazovka\n","t":"18. Pamäť počítača: PEEK, POKE, FRE, ADR","u":"18-pamat/"},{"c":"Na čo to je PRINT píše tam, kde práve stojí kurzor – riadok za riadkom, zhora nadol. Na hru, ponuku alebo tabuľku to nestačí: chceš písať na presné miesto, obrazovku zmazať a zmeniť jej farby.\nAko sa to píše Príkaz Čo robí GRAPHICS 0 zapne obyčajnú textovú obrazovku a zmaže ju PRINT CHR$(125) zmaže obrazovku (kurzor ide vľavo hore) POSITION stĺpec,riadok postaví kurzor; ďalší PRINT píše odtiaľ SETCOLOR 2,odtieň,jas farba pozadia SETCOLOR 1,0,jas jas písmen (odtieň majú vždy ako pozadie) SETCOLOR 4,odtieň,jas farba okraja okolo obrazovky POKE 752,1 skryje kurzor Obrazovka má 40 stĺpcov (0 až 39) a 24 riadkov (0 až 23). Miesto 0,0 je vľavo hore.\nOdtieň je číslo 0 až 15, jas párne číslo 0 (tmavá) až 14 (svetlá):\nOdtieň Farba Odtieň Farba 0 sivá 8 modrá 1 zlatá 9 svetlomodrá 2 oranžová 10 tyrkysová 3 červená 11 modrozelená 4 ružová 12 zelená 5 fialová 13 žltozelená 6 modrofialová 14 olivová 7 modrá 15 svetlooranžová Celý program Súbor examples/screen.abas:\nAtari BASIC 10 REM The text screen 20 GRAPHICS 0 30 SETCOLOR 2,12,2:REM background: dark green 40 SETCOLOR 1,0,14:REM letters: bright 50 SETCOLOR 4,3,6:REM border: red 60 POKE 752,1:REM hide the cursor 70 POSITION 14,2:PRINT \"A T A R I\" 80 FOR X=10 TO 26 90 POSITION X,4:PRINT \"-\"; 100 NEXT X 110 FOR Y=6 TO 10 120 POSITION Y,Y:PRINT \"Row \";Y 130 NEXT Y 140 POSITION 2,20:PRINT \"Bottom line\"; Preklad a spustenie Farby ukáže len emulátor:\nBasic26 screen.abas --run Rozloženie textu ukáže aj simulátor s voľbou --sim-screen:\nBasic26 screen.abas --sim --sim-screen Čo uvidíš A T A R I ----------------- Row 6 Row 7 Row 8 Row 9 Row 10 Bottom line V emulátore je to isté svetlými písmenami na tmavozelenom pozadí s červeným okrajom, bez kurzora.\nAko to funguje Riadok 20: GRAPHICS 0 začne s čistou obrazovkou a pôvodnými farbami. Na začiatku programu je to dobrý zvyk. Riadky 30 až 50: tri z piatich farebných registrov. V textovom režime má register 2 pozadie, register 1 jas písmen a register 4 okraj. Po zapnutí je obrazovka modrá: SETCOLOR 2,9,4. Riadok 70: POSITION 14,2 – najprv stĺpec, potom riadok. PRINT hneď za ním píše od toho miesta. Riadok 90: bodkočiarka na konci PRINT je tu dôležitá. Bez nej by kurzor po každej pomlčke prešiel na nový riadok – a keby to bolo v poslednom riadku obrazovky, celá obrazovka by sa posunula nahor. Riadky 110 až 130: pozícia môže byť vypočítaná. Zmazanie obrazovky GRAPHICS 0 zmaže obrazovku a vráti farby. PRINT CHR$(125) ju len zmaže – farby aj skrytý kurzor ostanú. V dobových programoch nájdeš za PRINT v úvodzovkách zvláštny znak (zahnutú šípku); je to ten istý kód 125 napísaný rovno z klávesnice Atari.\nInverzné písmo Znaky s kódom o 128 väčším sa vypíšu inverzne – tmavé na svetlom. PRINT CHR$(65+128) je inverzné A. Tak sa robia zvýraznené nadpisy a „tlačidlá“.\nČasté chyby Čo sa stalo Čo sa stane poradie POSITION riadok,stĺpec text je inde; správne je stĺpec prvý pozícia mimo obrazovky (POSITION 50,5) ERROR- 141 AT LINE 70 pri najbližšom PRINT PRINT bez bodkočiarky v riadku 23 obrazovka sa posunie o riadok nahor text presiahne pravý okraj pokračuje na ďalšom riadku od ľavého okraja (stĺpec 2) SETCOLOR 1 s odtieňom odtieň sa ignoruje, písmená majú farbu pozadia v inom jase malý rozdiel jasu písmen a pozadia text nevidno Vyskúšaj si Nakresli z pomlčiek a znakov ! rámček okolo nadpisu. Vypíš svoje meno do stredu obrazovky. (Stĺpec je (40-LEN(N$))/2.) Vyskúšaj v slučke všetkých 16 odtieňov pozadia; medzi nimi čakaj pol sekundy podprogramom z kapitoly 18. Spusti v emulátore. Zhrnutie Obrazovka má 40 × 24 znakov, 0,0 je vľavo hore. POSITION stĺpec,riadok určí, kam bude písať ďalší PRINT. GRAPHICS 0 alebo PRINT CHR$(125) zmaže obrazovku. SETCOLOR 2 je pozadie, 1 jas písmen, 4 okraj. --sim-screen ukáže obrazovku tak, ako ju program nechal. Späť: 18. Pamäť počítača · Ďalej: 20. Grafika\n","t":"19. Textová obrazovka: POSITION, GRAPHICS 0, SETCOLOR","u":"19-obrazovka/"},{"c":"Na čo to je Atari vie obrazovku prepnúť z písmen na body. Každý bod sa dá rozsvietiť jednou z niekoľkých farieb a z bodov a čiar vzniká obrázok.\nAko sa to píše Príkaz Čo robí GRAPHICS režim prepne obrazovku do grafického režimu a zmaže ju COLOR n vyberie „pero“, ktorým sa bude kresliť; 0 je farba pozadia (guma) PLOT x,y rozsvieti jeden bod DRAWTO x,y nakreslí čiaru od posledného bodu do bodu x,y SETCOLOR register,odtieň,jas zmení skutočnú farbu pera alebo pozadia LOCATE x,y,premenná zistí, akým perom je bod x,y nakreslený Bod 0,0 je vľavo hore. x rastie doprava, y nadol – naopak ako v matematike.\nRežimy Režim Bodov (šírka × výška) Pier Poznámka 0 40 × 24 znakov – obyčajná textová obrazovka 1, 2 20 × 20, 20 × 10 znakov 5 veľké farebné písmená 3 40 × 20 4 veľké štvorce 5 80 × 40 4 7 160 × 80 4 najpoužívanejší na obrázky a hry 8 320 × 160 2 najjemnejší, len jedna farba v dvoch jasoch 9, 10, 11 80 × 192 16, 9, 16 bez textového okna 15 160 × 160 4 ako 7, dvojnásobne jemný na výšku Režimy 4, 6 a 14 sú dvojfarebné verzie režimov 5, 7 a 15. Úplná tabuľka je v prílohe D.\nPod obrázkom ostávajú štyri riadky textu – textové okno, do ktorého píše PRINT. Keď ho nechceš, pripočítaj k režimu 16: GRAPHICS 7+16 má obrázok cez celú obrazovku a 96 riadkov bodov namiesto 80.\nCelý program Súbor examples/graphics.abas:\nAtari BASIC 10 REM Graphics: a house in mode 7 20 GRAPHICS 7 30 SETCOLOR 4,9,2:REM background: dark blue 40 SETCOLOR 2,3,8:REM COLOR 3: red 50 COLOR 1 60 PLOT 50,70:DRAWTO 110,70:DRAWTO 110,40:DRAWTO 50,40:DRAWTO 50,70 70 COLOR 2 80 PLOT 45,40:DRAWTO 80,15:DRAWTO 115,40 90 COLOR 3 100 PLOT 75,70:DRAWTO 75,52:DRAWTO 87,52:DRAWTO 87,70 110 COLOR 1:PLOT 62,50:PLOT 98,50 120 LOCATE 80,15,C 130 PRINT \"The roof top has colour \";C 140 PRINT \"A house in GRAPHICS 7\" Preklad a spustenie Obrázok ukáže len emulátor:\nBasic26 graphics.abas --run Simulátor kreslí do pamäte, ktorú nevidíš, ale to, čo program vypíše do textového okna, ukáže:\nBasic26 graphics.abas --sim Čo uvidíš V emulátore: na tmavomodrom pozadí oranžový obrys domu, zelená strecha, červené dvere a dve bodky ako okná. Pod obrázkom v textovom okne dva riadky. V simulátore len tie dva riadky:\nThe roof top has colour 2 A house in GRAPHICS 7 Ako to funguje Riadok 20: režim 7 má 160 bodov na šírku (x od 0 do 159) a 80 na výšku (y od 0 do 79). Riadok 50: COLOR 1 vyberie prvé pero. Bez COLOR by sa kreslilo perom 0, teda farbou pozadia – a nebolo by vidieť nič. To je najčastejšia chyba prvého grafického programu. Riadok 60: PLOT postaví pero do ľavého dolného rohu domu a štyri DRAWTO obídu obdĺžnik. Každý DRAWTO pokračuje tam, kde predošlý skončil. Riadky 70 až 100: iné pero, iná farba: strecha a dvere. Riadok 110: samotný PLOT je jeden bod. Riadok 120: LOCATE je opak PLOT: neuloží bod, ale prečíta ho. Vrchol strechy je nakreslený perom 2. Riadky 130 a 140: PRINT v grafickom režime píše do textového okna pod obrázkom. Perá a farby COLOR nevyberá farbu, ale pero – číslo, ktoré sa uloží do bodu. Akú farbu to číslo na obrazovke má, hovorí farebný register a mení ho SETCOLOR. V režime 7:\nCOLOR Register Farba po zapnutí 1 0 oranžová 2 1 svetlozelená 3 2 modrá 0 4 čierna (pozadie a okraj) SETCOLOR register,odtieň,jas: odtieň je 0 až 15 (0 sivá, 1 zlatá, 3 červená, 5 fialová, 7 a 9 modrá, 12 zelená, 14 žltozelená), jas párne číslo 0 (tmavá) až 14 (svetlá). Riadok 30 teda mení pozadie na tmavomodré a riadok 40 pero 3 na červené.\nZmena registra prefarbí všetko, čo je tým perom už nakreslené – okamžite a bez prekresľovania. Tak sa robili blikajúce a pulzujúce obrázky.\nVypĺňanie plôch Atari BASIC na vyplnenie plochy vlastný príkaz nemá (ide to len krkolomne cez XIO 18). Turbo-BASIC XL má FILLTO a PAINT, a tiež CIRCLE – kapitola 35.\nČasté chyby Čo sa stalo Čo sa stane chýba COLOR kreslí sa farbou pozadia, obrazovka ostane prázdna bod mimo obrazovky (PLOT 200,10 v režime 7) ERROR- 141 AT LINE 30 DRAWTO bez predošlého PLOT čiara začne v bode 0,0 PRINT v režime bez textového okna (+16) Atari nemá kam písať: prepne obrazovku späť na textovú a obrázok zmizne číslo pera väčšie, než režim má použije sa len jeho spodná časť: v režime 7 je COLOR 5 to isté ako COLOR 1 Vyskúšaj si Dokresli domu komín a slnko z niekoľkých čiar. Nakresli v režime 7 sto náhodných bodov náhodným perom 1 až 3. Nakresli lúče: čiary zo stredu obrazovky (80,40) do bodov na hornom okraji, FOR X=0 TO 159 STEP 8. Zhrnutie GRAPHICS n prepne režim; +16 zruší textové okno. COLOR vyberie pero, PLOT kreslí bod, DRAWTO čiaru z posledného bodu. Bod 0,0 je vľavo hore. SETCOLOR mení farbu pera aj všetkého, čo ním už je nakreslené. Obrázok ukáže emulátor (--run), nie simulátor. Späť: 19. Textová obrazovka · Ďalej: 21. Zvuk\n","t":"20. Grafika: GRAPHICS, COLOR, PLOT, DRAWTO, SETCOLOR, LOCATE","u":"20-grafika/"},{"c":"Na čo to je Atari má štyri hlasy – štyri nezávislé zdroje zvuku. Každý vie hrať čistý tón alebo šum, a to naraz s ostatnými. Jeden príkaz hlas zapne a hrá, kým ho iný príkaz nezmení alebo nevypne.\nAko sa to píše Atari BASIC SOUND hlas,výška,skreslenie,hlasitosť Hodnota Rozsah Význam hlas 0–3 ktorý zo štyroch hlasov výška 0–255 menšie číslo je vyšší tón skreslenie párne 0–14 10 je čistý tón, 14 trochu drsnejší; 0, 2, 4, 6, 8 a 12 sú rôzne šumy a bzukoty hlasitosť 0–15 0 je ticho, 8 príjemne nahlas SOUND hlas,0,0,0 hlas vypne.\nVýšky pre tóny jednej oktávy (so skreslením 10):\nTón C D E F G A H C Výška 121 108 96 91 81 72 64 60 O oktávu vyššie sú čísla približne polovičné, o oktávu nižšie dvojnásobné.\nCelý program Súbor examples/sound.abas zahrá stupnicu:\nAtari BASIC 10 REM SOUND: a scale 20 FOR I=1 TO 8 30 READ P 40 SOUND 0,P,10,8 50 S=15:GOSUB 1000 60 NEXT I 70 SOUND 0,0,0,0 80 END 1000 REM Wait S fiftieths of a second 1010 POKE 20,0 1020 IF PEEK(20)\u003cS THEN 1020 1030 RETURN 2000 DATA 121,108,96,91,81,72,64,60 Preklad a spustenie Zvuk počuť len v emulátore (alebo na skutočnom Atari):\nBasic26 sound.abas --run V simulátore tento program nespúšťaj: čaká na hodiny počítača a tie v simulátore stoja (kapitola 18).\nČo uvidíš Nič – ale budeš počuť osem tónov stupnice C dur, každý necelú tretinu sekundy.\nAko to funguje Riadok 30: výšky tónov sú v DATA na riadku 2000 a čítajú sa po jednej. Riadok 40: hlas 0 začne hrať tón. SOUND nečaká – program ide hneď ďalej a tón znie. Riadok 50: preto treba počkať. Podprogram na riadku 1000 čaká podľa hodín Atari, tu 15 päťdesiatin sekundy. Dĺžka čakania je dĺžka noty. Riadok 70: po poslednom tóne treba hlas vypnúť, inak by posledný tón znel ďalej. (Keď program skončí, preložený program zvuk vypne sám.) Prečo nie čakacia slučka Dobové programy držia notu prázdnou slučkou FOR W=1 TO 100:NEXT W. V preloženom programe by takú melódiu nebolo počuť – prebehla by niekoľkokrát rýchlejšie. Čakanie podľa hodín trvá rovnako v interpreteri, v preloženom programe aj na rýchlejšom stroji.\nViac hlasov naraz Akord sú tri hlasy zapnuté po sebe:\nAtari BASIC 10 SOUND 0,121,10,8 20 SOUND 1,96,10,8 30 SOUND 2,81,10,8 Súčet hlasitostí všetkých hlasov by nemal prekročiť asi 32, inak zvuk chrčí.\nZvukové efekty Efekt vzniká rýchlou zmenou výšky alebo hlasitosti v slučke:\nAtari BASIC 10 REM A falling bomb 20 FOR P=30 TO 200:SOUND 0,P,10,8:NEXT P 30 REM An explosion 40 FOR V=15 TO 0 STEP -1:SOUND 0,90,8,V:S=4:GOSUB 1000:NEXT V Skreslenie 8 je šum; s klesajúcou hlasitosťou znie ako výbuch.\nČasté chyby Čo sa stalo Čo sa stane chýba čakanie medzi tónmi je počuť len posledný tón, ostatné prebehnú príliš rýchlo hlas sa nevypne tón hrá, kým program beží hlas mimo 0–3 ERROR- 3 AT LINE 40 nepárne skreslenie hlas mlčí – nepárne hodnoty zvuk nevytvárajú, len nastavia hlasitosť čakacia slučka FOR namiesto hodín melódia je v preloženom programe príliš rýchla Vyskúšaj si Zahraj stupnicu aj nadol. Pridaj do DATA ku každej výške aj dĺžku noty a zahraj jednoduchú pesničku. Sprav sirénu: výška stúpa od 60 po 120 a zasa klesá, päťkrát za sebou. Zhrnutie SOUND hlas,výška,skreslenie,hlasitosť zapne tón, ktorý hrá, kým ho nevypneš. Menšia výška je vyšší tón; skreslenie 10 je čistý tón. Dĺžku noty robí čakanie – podľa hodín, nie prázdnou slučkou. Štyri hlasy (0–3) môžu hrať naraz. Späť: 20. Grafika · Ďalej: 22. Joystick a klávesy\n","t":"21. Zvuk: SOUND","u":"21-zvuk/"},{"c":"Na čo to je Hra potrebuje vedieť, čo robí hráč – práve teraz, bez čakania na RETURN. Joystick, jeho tlačidlo aj klávesnica sa preto nečítajú príkazom INPUT, ale funkciami, ktoré vrátia okamžitý stav.\nProgramy tejto kapitoly sú pre emulátor. V emulátore atari800 sa joystick zvyčajne ovláda číselnou klávesnicou alebo šípkami a tlačidlo pravým klávesom Ctrl – presné nastavenie nájdeš v jeho ponuke (kláves F1).\nAko sa to píše Funkcia Čo vráti STICK(n) smer joysticku v porte n (0 alebo 1) STRIG(n) tlačidlo joysticku: 0 = stlačené, 1 = pustené PADDLE(n) otočný ovládač (paddle) 0–7: poloha 1 až 228 PTRIG(n) tlačidlo paddle: 0 = stlačené PEEK(764) kód naposledy stlačeného klávesu; 255 = žiadny PEEK(53279) klávesy START, SELECT, OPTION Hodnoty STICK:\n14 10 6 11 15 7 9 5 13 15 je pokoj, 14 hore, 13 dole, 11 vľavo, 7 vpravo; uhlopriečky sú 10, 6, 9 a 5.\nCelý program Súbor examples/joystick.abas:\nAtari BASIC 10 REM Joystick: move a star, the button ends 20 GRAPHICS 0:POKE 752,1 30 X=20:Y=12 40 POSITION 2,0:PRINT \"Joystick moves, the button ends\"; 50 POSITION X,Y:PRINT \"*\"; 60 S=STICK(0) 70 IF STRIG(0)=0 THEN POSITION 2,22:PRINT \"Bye\":END 80 IF S=15 THEN 60 90 POSITION X,Y:PRINT \" \"; 100 IF S=14 AND Y\u003e2 THEN Y=Y-1 110 IF S=13 AND Y\u003c21 THEN Y=Y+1 120 IF S=11 AND X\u003e2 THEN X=X-1 130 IF S=7 AND X\u003c38 THEN X=X+1 140 W=3:GOSUB 1000 150 GOTO 50 1000 REM Wait W fiftieths of a second 1010 POKE 20,0 1020 IF PEEK(20)\u003cW THEN 1020 1030 RETURN Preklad a spustenie Basic26 joystick.abas --run V simulátore program nespúšťaj – joystick tam nie je (STICK vracia stále 15) a program by nikdy neskončil.\nČo uvidíš Na obrazovke je hviezdička, ktorá sa hýbe podľa joysticku. Tlačidlo program ukončí.\nAko to funguje Je to kostra každej hry – slučka, ktorá dookola:\nnakreslí hráča (riadok 50), prečíta ovládač (riadky 60 a 70), ak sa nič nedeje, číta znova (riadok 80), zmaže hráča na starom mieste medzerou (riadok 90), posunie súradnice, ale len ak neprejdú za okraj (riadky 100 až 130), chvíľu počká (riadok 140) a ide odznova. Čakanie v kroku 6 určuje rýchlosť hry. Bez neho by hviezdička v preloženom programe preletela obrazovku skôr, než pustíš joystick. Tri päťdesiatiny sekundy dávajú asi 17 krokov za sekundu.\nPodmienky ako Y\u003e2 držia hviezdičku na obrazovke. Bez nich by POSITION dostal súradnicu mimo a program by skončil chybou 141.\nUhlopriečky Program reaguje len na štyri základné smery. Aby šiel aj šikmo, testuj zvlášť vodorovný a zvislý smer:\nAtari BASIC 100 IF (S=14 OR S=10 OR S=6) AND Y\u003e2 THEN Y=Y-1 110 IF (S=13 OR S=9 OR S=5) AND Y\u003c21 THEN Y=Y+1 120 IF (S=11 OR S=10 OR S=9) AND X\u003e2 THEN X=X-1 130 IF (S=7 OR S=6 OR S=5) AND X\u003c38 THEN X=X+1 Klávesy bez RETURN Atari si kód posledného stlačeného klávesu ukladá na adresu 764. Kým nikto nič nestlačil, je tam 255.\nAtari BASIC 10 PRINT \"Press any key\" 20 POKE 764,255 30 IF PEEK(764)=255 THEN 30 40 PRINT \"The key code was \";PEEK(764) 50 POKE 764,255 Riadok 20 „vyprázdni“ pamäť klávesu, riadok 30 čaká, kým sa v nej niečo objaví. Pozor: číslo na adrese 764 nie je kód ATASCII, ale číslo klávesu na klávesnici (A je 63, medzera 33, RETURN 12). Tabuľka je v prílohe D. Skutočný znak prečítaš cez zariadenie K: – kapitola 24.\nTri klávesy vpravo sa čítajú zvlášť, z adresy 53279:\nPEEK(53279) Stlačené 7 nič 6 START 5 SELECT 3 OPTION Atari BASIC 10 PRINT \"Press START\" 20 IF PEEK(53279)\u003c\u003e6 THEN 20 30 PRINT \"Here we go\" V simulátore sa tieto klávesy dajú „stlačiť“ voľbou --sim-console (kapitola 39).\nČasté chyby Čo sa stalo Čo sa stane IF STRIG(0)=1 namiesto =0 program reaguje, keď tlačidlo nie je stlačené chýba čakanie v slučke pohyb je príliš rýchly stará pozícia sa nezmaže hviezdička za sebou necháva stopu súradnice nie sú strážené ERROR- 141 na okraji obrazovky port 2 alebo 3 Atari XL a XE majú len dva porty (0 a 1) PEEK(764) sa neprepíše na 255 ten istý kláves sa prečíta znova a znova Vyskúšaj si Pridaj pohyb po uhlopriečkach. Nech stlačené tlačidlo neukončí program, ale zanechá na mieste hviezdičky znak #. Sprav z toho hru: na náhodnom mieste je $; keď naň hviezdička príde, pripočítaj bod, pípni (SOUND) a daj $ inam. Zhrnutie STICK(0) vráti smer (15 = pokoj), STRIG(0) tlačidlo (0 = stlačené). Hra je slučka: nakresli, prečítaj, zmaž, posuň, počkaj. Kláves bez RETURN je v PEEK(764); START, SELECT a OPTION v PEEK(53279). Tieto programy patria do emulátora. Späť: 21. Zvuk · Ďalej: 23. Strojový kód\n","t":"22. Joystick a klávesy: STICK, STRIG, PADDLE, PTRIG","u":"22-ovladace/"},{"c":"Na čo to je Procesor Atari rozumie len strojovému kódu – radu bajtov, z ktorých každý je jednoduchý pokyn. Je stokrát rýchlejší než BASIC v interpreteri, ale píše sa ťažko. Dobové programy ním robili to, čo BASIC nestíhal: rýchly presun obrazovky, hudbu, pohyb postavičiek.\nUSR je most: funkcia BASICu, ktorá zavolá strojový kód na danej adrese a vráti, čo jej kód odovzdá.\nTúto kapitolu nemusíš vedieť naspamäť. Stačí, keď USR v cudzom programe spoznáš a vieš, že taký program sa dá preložiť tiež.\nAko sa to píše Atari BASIC výsledok=USR(adresa) výsledok=USR(adresa,hodnota,hodnota) Časť Význam adresa kde v pamäti strojový kód začína hodnota čísla 0–65535, ktoré kód dostane; môže ich byť viac alebo žiadne výsledok číslo 0–65535, ktoré kód vráti USR je funkcia, takže musí stáť vo výraze. Keď výsledok nepotrebuješ, píše sa X=USR(1536) a X sa jednoducho nepoužije.\nCelý program Súbor examples/usr.abas má v DATA krátku rutinu, ktorá sčíta dve čísla:\nAtari BASIC 10 REM USR: calling machine code 20 FOR I=0 TO 20:READ B:POKE 1536+I,B:NEXT I 30 PRINT \"5 + 7 = \";USR(1536,5,7) 40 PRINT \"1000 + 234 = \";USR(1536,1000,234) 50 END 1000 REM A routine that adds two numbers 1010 DATA 104,104,133,213,104,133,212 1020 DATA 104,170,104,24,101,212,133,212 1030 DATA 138,101,213,133,213,96 Preklad a spustenie Basic26 usr.abas --sim Čo uvidíš 5 + 7 = 12 1000 + 234 = 1234 Ako to funguje Riadok 20: 21 bajtov z DATA sa cez POKE uloží do pamäte od adresy 1536. Adresy 1536 až 1791 (šestnástkovo $0600–$06FF, „šiesta stránka“) Atari necháva voľné práve na takéto krátke rutiny. Riadok 30: USR(1536,5,7) rutinu zavolá a odovzdá jej čísla 5 a 7. Čo rutina robí (pre zvedavých): BASIC jej pripraví na zásobník procesora počet hodnôt a potom každú hodnotu ako dva bajty. Rutina si ich musí všetky vyzdvihnúť – pokynom PLA, bajt 104. Súčet uloží na adresy 212 a 213; čo tam nájde BASIC po návrate (pokyn RTS, bajt 96), to je výsledok USR. Rutina, ktorá si hodnoty zo zásobníka nevyzdvihne, sa nevráti tam, kam má, a počítač zamrzne. Na skutočnom Atari rovnako ako v preloženom programe.\nStrojový kód v reťazci Druhý obľúbený spôsob: bajty rutiny sú znaky reťazca a volá sa USR(ADR(M$)). Vo výpise takého programu vidíš v úvodzovkách zhluk čudných znakov – to je strojový kód. Prekladač taký reťazec nechá bajt po bajte tak, ako je.\nČo s tým robí prekladač Preložený program volá USR rovnako ako interpreter, takže rutiny z dobových programov fungujú. Niektoré z nich však čítajú veci, ktoré patria interpreteru – napríklad text programu v riadkoch REM, alebo čakajú strojový kód či znakovú sadu nahraté z iného súboru. Na to má prekladač voľby --keep-rem, --embed a --reserve (kapitoly 42 a 43).\nČasté chyby Čo sa stalo Čo sa stane preklep v DATA strojového kódu zamrznutie alebo nezmysly; chybu nehlási nikto iný počet hodnôt, než rutina čaká rutina sa vráti na zlé miesto – zamrznutie USR ako príkaz (USR(1536) bez X=) error B26017 – je to funkcia hodnota nad 65535 alebo záporná ERROR- 3 rutina na adrese, kde leží niečo iné prepíše to; šiesta stránka je bezpečná Vyskúšaj si Zavolaj rutinu s inými číslami. Čo vráti USR(1536,65535,1)? (Výsledok sa do dvoch bajtov nezmestí a „pretečie“.) Nájdi v priečinku examples program, ktorý používa USR, a pozri, odkiaľ berie strojový kód – z DATA, z reťazca, alebo z REM. Zhrnutie USR(adresa,…) zavolá strojový kód a vráti jeho výsledok. Kód sa do pamäte dostane z DATA cez POKE, alebo je v reťazci. Šiesta stránka (1536–1791) je miesto na krátke rutiny. Preložený program volá USR tak isto ako interpreter. Späť: 22. Joystick a klávesy · Ďalej: 24. Súbory\n","t":"23. Strojový kód: USR","u":"23-strojovy-kod/"},{"c":"Na čo to je Premenné žijú, len kým program beží. Čo má prežiť vypnutie počítača – tabuľka najlepších výsledkov, uložená hra, zoznam adries –, musí ísť do súboru na diskete.\nAtari sa na disketu, klávesnicu, obrazovku aj tlačiareň pozerá rovnako: ako na zariadenie, z ktorého sa číta alebo do ktorého sa píše. Program si k zariadeniu otvorí kanál a ďalej už pracuje s číslom kanála.\nAko sa to píše Atari BASIC OPEN #kanál,režim,0,\"zariadenie:meno\" PRINT #kanál;čo INPUT #kanál,premenná GET #kanál,premenná PUT #kanál,hodnota CLOSE #kanál Časť Význam kanál číslo 1 až 7, ktoré si vyberieš; kanál 0 je obrazovka a klávesnica a je otvorený stále režim 4 čítanie, 8 zápis (starý súbor sa prepíše), 9 pripísanie na koniec, 12 čítanie aj zápis 0 tretie číslo, takmer vždy nula \"D:NOTES.TXT\" zariadenie a meno súboru Zariadenia:\nMeno Čo to je D: disketa (D1: prvá mechanika, D2: druhá) K: klávesnica – znak po znaku, bez RETURN E: editor: obrazovka a klávesnica po riadkoch S: obrazovka P: tlačiareň C: kazeta Meno súboru na diskete má najviac 8 znakov, bodku a najviac 3 znaky prípony; len veľké písmená a číslice.\nPríkazy:\nPríkaz Čo robí PRINT #1;A$ zapíše riadok textu (alebo číslo) do súboru INPUT #1,A$ prečíta riadok PUT #1,65 zapíše jeden bajt GET #1,K prečíta jeden bajt do K CLOSE #1 zavrie kanál – až teraz je súbor na diskete celý STATUS #1,S do S dá stav kanála (1 je v poriadku) NOTE #1,S,B zapamätá si miesto v súbore (sektor a bajt) POINT #1,S,B vráti sa na zapamätané miesto XIO príkaz,#1,0,0,\"D:MENO\" zvláštne operácie zariadenia: premenovať, zmazať, zamknúť LPRINT čo vypíše riadok na tlačiareň, bez OPEN Celý program Súbor examples/files.abas zapíše tri riadky do súboru a prečíta ich späť:\nAtari BASIC 10 REM Files: writing and reading 20 DIM L$(40) 30 OPEN #1,8,0,\"D:NOTES.TXT\" 40 PRINT #1;\"First line\" 50 PRINT #1;\"Second line\" 60 PRINT #1;12345 70 CLOSE #1 80 OPEN #1,4,0,\"D:NOTES.TXT\" 90 TRAP 140 100 INPUT #1,L$ 110 PRINT \"Read: \";L$ 120 GOTO 100 140 CLOSE #1 150 PRINT \"End of the file, error \";PEEK(195) Preklad a spustenie Simulátor má disketu D: len v pamäti – súbor v nej vydrží do konca behu, čo na vyskúšanie stačí:\nBasic26 files.abas --sim V emulátore potrebuje program skutočnú disketu a na nej DOS – program, ktorý na Atari s disketami pracuje. Voľba --atr vyrobí obraz diskety s DOS-om, uloží naň preložený program tak, aby sa po zapnutí spustil sám, a --run z tej diskety emulátor naštartuje:\nBasic26 files.abas --atr files.atr --run Viac o disketách je v kapitole 41.\nČo uvidíš Read: First line Read: Second line Read: 12345 End of the file, error 136 Ako to funguje Riadok 30: kanál 1 sa otvorí na zápis (režim 8). Ak súbor NOTES.TXT existuje, zmaže sa a začne odznova. Riadky 40 až 60: PRINT #1; píše do súboru presne to, čo by PRINT napísal na obrazovku. Za #1 je bodkočiarka (čiarka by vložila medzery ako na obrazovke). Číslo sa zapíše ako text. Riadok 70: CLOSE zapíše na disketu posledný kúsok dát a uvoľní kanál. Súbor, ktorý nezavrieš, je poškodený. Na konci programu (END alebo za posledným riadkom) zavrú kanály 1 až 7 oba interpretery aj preložený program; preložený navyše aj po STOP a chybe. Kým však program beží – a hlavne keď ho niekto zastaví klávesom RESET –, súbor bez CLOSE celý nie je. Riadok 80: ten istý kanál, teraz na čítanie (režim 4). Riadok 100: INPUT #1,L$ číta riadok po riadku. Riadok 90: program nevie, koľko riadkov v súbore je. Číta, kým to ide; pokus čítať za koniec je chyba 136 a pasca TRAP ju zachytí. To je bežný a správny spôsob, ako nájsť koniec súboru. Riadok 140: aj po chybe treba kanál zavrieť. Čísla v súbore Číslo zapísané cez PRINT #1;N sa číta cez INPUT #1,N. Viac čísel na jednom riadku oddeľ čiarkou, ktorú zapíšeš sám: PRINT #1;A;\",\";B a potom INPUT #1,A,B.\nZnak z klávesnice Zariadenie K: vráti kód ATASCII stlačeného klávesu a čaká, kým nejaký príde – bez RETURN a bez toho, aby sa znak objavil na obrazovke:\nAtari BASIC 10 OPEN #2,4,0,\"K:\" 20 PRINT \"Press a key\" 30 GET #2,K 40 PRINT \"You pressed \";CHR$(K);\" (code \";K;\")\" 50 CLOSE #2 Na rozdiel od PEEK(764) z kapitoly 22 dostaneš skutočný znak.\nTlačiareň LPRINT \"text\" pošle riadok na tlačiareň. Robí to isté ako OPEN #7,8,0,\"P:\", PRINT #7;\"text\", CLOSE #7. Emulátor tlač ukladá do súboru.\nXIO: operácie so súbormi Príkaz Čo robí XIO 32,#1,0,0,\"D:OLD.TXT,NEW.TXT\" premenuje súbor XIO 33,#1,0,0,\"D:NOTES.TXT\" zmaže súbor XIO 35,#1,0,0,\"D:NOTES.TXT\" zamkne súbor proti zmazaniu XIO 36,#1,0,0,\"D:NOTES.TXT\" odomkne Kanál za XIO musí byť zavretý. Tieto operácie robí DOS, takže ich skúšaj v emulátore s disketou, nie v simulátore. Turbo-BASIC XL má na ne obyčajné príkazy RENAME, DELETE, LOCK, UNLOCK a DIR (kapitola 37).\nČasté chyby Čo sa stalo Čo sa stane súbor na čítanie neexistuje ERROR- 170 AT LINE 80 zariadenie neexistuje, alebo v emulátore chýba DOS ERROR- 130 OPEN kanála, ktorý je už otvorený ERROR- 129 PRINT #1 alebo INPUT #1 na neotvorenom kanáli ERROR- 133 čítanie za koncom súboru ERROR- 136 čítanie zo súboru otvoreného na zápis ERROR- 131; opačne 135 disketa je plná ERROR- 162 chýba CLOSE po zápise koniec súboru sa na disketu dostane až na konci programu; po RESET alebo vypnutí nikdy Chyby od 128 vyššie neprichádzajú z BASICu, ale z operačného systému a DOS-u. Všetky sú v prílohe C.\nVyskúšaj si Pripíš do NOTES.TXT štvrtý riadok režimom 9 a prečítaj súbor znova. Ulož do súboru desať čísel z poľa a prečítaj ich späť do iného poľa. Napíš program, ktorý sa spýta na meno a pri ďalšom spustení (v emulátore, s tou istou disketou) ťa ním pozdraví. Ak súbor ešte nie je, chybu 170 zachyť cez TRAP. Zhrnutie OPEN #kanál,režim,0,\"D:MENO\" – režim 4 číta, 8 píše, 9 pripisuje. PRINT # a INPUT # pracujú s riadkami, PUT # a GET # s bajtmi. CLOSE #kanál patrí za každý zápis; koniec programu kanály zavrie tiež, RESET nie. Koniec súboru je chyba 136; zachytí sa cez TRAP. Program s disketou sa do emulátora dáva s --atr disk.atr --run. Späť: 23. Strojový kód · Ďalej: 25. Príkazy editora\n","t":"24. Súbory: OPEN, CLOSE, PRINT #, INPUT #, GET, PUT, STATUS, NOTE, POINT, XIO, LPRINT","u":"24-subory/"},{"c":"Na čo to je Na skutočnom Atari je BASIC zároveň aj editor: píšeš doň riadky programu a medzi nimi príkazy, ktorými program vypíšeš, uložíš, spustíš. Niektoré z týchto príkazov nájdeš aj vo vnútri dobových programov – program sa sám vypíše, nahrá ďalšiu časť, alebo po skončení odíde do DOS-u.\nPreložený program však nemá ani editor, ani svoj text. Táto kapitola hovorí, čo také príkazy urobia v ňom. Nie je to kapitola na učenie – je na nahliadnutie, keď ich stretneš.\nČo ktorý príkaz robí Príkaz V interpreteri na Atari V preloženom programe LIST vypíše text programu vypíše čísla 1 až 30 a NOT IN COMP PRG SAVE \"D:MENO\", CSAVE uloží program na disketu, kazetu vypíše NOT IN COMP PRG a ide ďalej LOAD \"D:MENO\", CLOAD nahrá iný program vypíše NOT IN COMP PRG a ide ďalej ENTER \"D:MENO\" prečíta program zapísaný ako text vypíše NOT IN COMP PRG a ide ďalej RUN \"D:MENO\" nahrá a spustí iný program nepreloží sa (chyba B26099) RUN spustí program odznova spustí program odznova (kapitola 17) NEW zmaže program z pamäte ukončí program CONT pokračuje po STOP alebo BREAK nerobí nič DOS odíde do ponuky DOS-u zavrie kanály a odíde do DOS-u BYE odíde do vstavaného testu počítača ukončí program Prekladač na príkazy z hornej polovice tabuľky upozorní.\nCelý program Súbor examples/editor.abas:\nAtari BASIC 10 REM Commands of the editor in a compiled program 20 PRINT \"Before LIST\" 30 LIST 40 PRINT \"Before SAVE\" 50 SAVE \"D:PROGRAM.BAS\" 60 PRINT \"Still running\" 70 NEW 80 PRINT \"Never printed\" Preklad a spustenie Basic26 editor.abas --sim Prekladač pri tom vypíše dve upozornenia:\neditor.abas(3,4): warning B26219: LIST only says it is not available: a compiled program has no program text editor.abas(5,4): warning B26219: SAVE only says it is not available: a compiled program has no program text Upozornenie preklad nezastaví; hovorí len, že tento riadok nebude robiť to, čo v interpreteri.\nČo uvidíš Before LIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 NOT IN COMP PRG Before SAVE NOT IN COMP PRG Still running Ako to funguje Riadok 30: program, ktorý sa sám vypisuje, to zvyčajne robí, aby ukázal svoj text na obrazovke. Tridsať čísel zaplní obrazovku rovnako ako výpis a hláška povie prečo: not in compiled program. Riadok 50: uložiť nie je čo; program pokračuje. Riadok 70: NEW program ukončí, riadok 80 sa nevykoná. Program z viacerých častí Väčšie dobové programy sa delili na časti, ktoré sa nahrávali za sebou: úvodná časť nakreslila titulný obrázok a skončila príkazom RUN \"D:GAME.BAS\". To je jediná vec z BASICu, ktorú prekladač odmietne – v preloženom programe nie je interpreter, do ktorého by sa ďalší program nahral.\nRiešenie je preložiť každú časť zvlášť a spojiť ich inak: strojový kód a obrázky pribaliť k hlavnému programu (--embed, kapitola 43), alebo časti preložiť do samostatných súborov a spúšťať ich z DOS-u.\nTri slová, ktoré nie sú príkazmi editora, ale patria sem Slovo Čo robí LET nepovinné slovo pred priradením (kapitola 4); v dobových programoch ho nájdeš tam, kde sa meno premennej začína slovom BASICu: LET TOP=5 COM to isté ako DIM – iné meno toho istého príkazu GO TO to isté ako GOTO Prísny režim Keď chceš mať istotu, že program nerobí nič, čo by v preloženej podobe nedávalo zmysel, prelož ho s --strict: z upozornení na príkazy editora sa stanú chyby.\nBasic26 editor.abas --strict Časté chyby Čo sa stalo Čo sa stane program končí príkazom RUN \"D:MENO\" error B26099 – preklad sa nepodarí program sa spolieha, že LIST ukáže jeho text ukáže čísla a hlášku program čaká, že CONT niečo spraví nespraví DOS v programe spustenom bez DOS-u počítač sa reštartuje alebo skončí vo vstavanom teste Zhrnutie Príkazy na prácu s textom programu (LIST, SAVE, LOAD, ENTER …) v preloženom programe len vypíšu NOT IN COMP PRG. NEW a BYE program ukončia, DOS odíde do DOS-u, CONT nerobí nič. RUN \"D:MENO\" sa nepreloží. Prekladač na to všetko upozorní; s --strict to hlási ako chybu. Tým sa končí časť o Atari BASICu. Všetko, čo si sa doteraz naučil, platí aj v Turbo-BASICu XL – a ten pridáva veľa pohodlia.\nSpäť: 24. Súbory · Ďalej: 26. Turbo-BASIC XL\n","t":"25. Príkazy editora: LIST, LOAD, SAVE, NEW, CONT, DOS, BYE …","u":"25-prikazy-editora/"},{"c":"Na čo to je Turbo-BASIC XL je rozšírený BASIC, ktorý v roku 1985 napísal Frank Ostrowski. Vie všetko, čo Atari BASIC – každý program z kapitol 1 až 25 v ňom beží rovnako –, a pridáva okolo sedemdesiat nových príkazov a funkcií. Najdôležitejšie z nich robia program čitateľnejším: slučky bez GOTO, podmienky na viac riadkov, podprogramy s menami.\nKapitoly 26 až 38 ich prejdú. Táto prvá ukazuje, čo si všimneš hneď.\nAko prekladaču povedať, že je to Turbo-BASIC XL Príponou súboru:\nPrípona Jazyk .abas Atari BASIC .tbas Turbo-BASIC XL Alebo voľbou --dialect turbo (či --dialect atari), ktorá má pred príponou prednosť.\nNa jazyku záleží aj vtedy, keď program žiadny nový príkaz nepoužije. Slová Turbo-BASICu sú totiž v súbore .abas obyčajné mená: DELKA=5 je v Atari BASICu premenná DELKA, ale v Turbo-BASICu XL sa číta ako príkaz DEL KA=5 a prekladač ohlási chybu. Program písaný pre Atari BASIC preto nechaj v .abas.\nLíšia sa aj drobnosti: Turbo-BASIC XL vypisuje čísla s desiatimi číslicami (Atari BASIC s deviatimi) a k chybe pridá slovo – ERROR- 11 OVERFLOW AT LINE 10.\nČo je nové na prvý pohľad Novinka Príklad malé písmená v príkazoch a menách print x podčiarkovník v mene total_sum šestnástkové číslo $FF je 255, $0600 je 1536 konštanty %0 až %3 čísla 0, 1, 2, 3, ktoré v pamäti interpretera zaberali menej miesta otázka rovno v INPUT INPUT \"Your name\";N$ -- príkaz, ktorý nerobí nič: oddeľovacia čiara vo výpise CLS zmaže obrazovku až 256 premenných Atari BASIC ich mal 128 Celý program Súbor examples/turbo.tbas:\nTurbo Basic XL 10 REM Turbo-BASIC XL: what you notice first 20 -- 30 total_sum=0 40 for i=1 to 5:total_sum=total_sum+i:next i 50 print \"Sum: \";total_sum 60 print \"$FF is \";$FF;\", $0600 is \";$0600 70 print \"%0+%1+%2+%3 = \";%0+%1+%2+%3 80 dim name$(20) 90 input \"Your name\";name$ 100 input \"Your age, please: \",age 110 print \"Hello, \";name$;\", \";age 120 -- Preklad a spustenie Basic26 turbo.tbas --run alebo v simulátore s odpoveďami zo súboru examples/turbo.in:\nBasic26 turbo.tbas --sim --sim-input turbo.in Čo uvidíš Sum: 15 $FF is 255, $0600 is 1536 %0+%1+%2+%3 = 6 Your name?Peter Your age, please: 12 Hello, Peter, 12 Ako to funguje Riadky 20 a 120: -- nerobí nič. Turbo-BASIC XL ho vo výpise programu nakreslí ako čiaru z tridsiatich pomlčiek, takže oddeľuje časti programu. Riadky 30 až 50: príkazy malými písmenami. Turbo-BASIC XL ich pri písaní sám prevádzal na veľké; print, Print a PRINT je to isté, a total_sum a TOTAL_SUM je tá istá premenná. V tejto knihe ostanú príkazy veľkými písmenami, aby sa odlíšili od textov. Riadok 60: číslo so znakom dolára vpredu je šestnástkové – zapísané v sústave so základom 16, kde po deviatke nasledujú A až F. Adresy v pamäti sa tak píšu oveľa pohodlnejšie: $0600 je začiatok šiestej stránky, $D000 adresa obvodov. Nepomýľ si to s dolárom na konci mena reťazca. Riadok 90: text pred premennou sa vypíše ako otázka. So stredníkom zaň INPUT pridá otáznik. Riadok 100: s čiarkou otáznik nepridá. Časté chyby Čo sa stalo Čo sa stane program pre Turbo-BASIC XL má príponu .abas nové príkazy sa berú ako mená premenných: error B26017 na prvom z nich meno premennej sa začína slovom Turbo-BASICu (DELKA, DOOR, EXITS) error B26017: DOOR=1 sa číta ako DO OR=1, EXITS=2 ako EXIT S=2 INPUT \"text\";A v Atari BASICu error B26008: INPUT needs a variable to read into – tam otázka v INPUT nie je $ pred desiatkovým číslom zo zvyku ($100 namiesto 100) je to 256 Slov, ktorými sa nesmie začínať meno, je v Turbo-BASICu XL viac: DO, DEL, DIR, TIME, EXIT, EXEC, PROC, LOOP, MOVE, TEXT, CLS, PAUSE, PAINT, WHILE, WEND a ďalšie z prílohy A.\nVyskúšaj si Vypíš šestnástkové čísla $10, $100 a $FFFF desiatkovo. Prelož turbo.tbas s voľbou --dialect atari a pozri, na čom sa prekladač zastaví. Prepíš program guess.abas z kapitoly 9 tak, aby otázku písal INPUT, a ulož ho ako .tbas. Zhrnutie Súbor .tbas je Turbo-BASIC XL, .abas Atari BASIC; --dialect to prebije. Všetko z Atari BASICu platí ďalej. Navyše: malé písmená, _ v menách, $FF, INPUT \"otázka\";X, CLS, --. Mená premenných sa nesmú začínať ani slovami Turbo-BASICu. Späť: 25. Príkazy editora · Ďalej: 27. Podmienka na viac riadkov\n","t":"26. Turbo-BASIC XL","u":"26-turbo/"},{"c":"Na čo to je V Atari BASICu patrí k IF len zvyšok jedného riadka a „inak“ sa píše druhým IF s opačnou podmienkou. Turbo-BASIC XL vie podmienku, ktorá má telo cez viac riadkov a vetvu inak.\nAko sa to píše Turbo Basic XL IF podmienka príkazy, keď platí ELSE príkazy, keď neplatí ENDIF Slovo Význam IF podmienka bez THEN – tým sa začína blok ELSE „inak“; táto časť je nepovinná ENDIF koniec bloku; povinný Starý tvar IF … THEN … na jednom riadku platí ďalej. Rozhoduje slovo THEN: keď tam je, ide o jednoriadkovú podmienku; keď nie je, o blok.\nCelý program Súbor examples/else.tbas:\nTurbo Basic XL 10 REM IF ... ELSE ... ENDIF 20 INPUT \"A number\";N 30 IF N\u003c0 40 PRINT \"Negative, I turn it round\" 50 N=-N 60 ELSE 70 PRINT \"Not negative\" 80 ENDIF 90 IF N\u003e100 100 PRINT \"Big\" 110 ELSE 120 IF N\u003e10 130 PRINT \"Medium\" 140 ELSE 150 PRINT \"Small\" 160 ENDIF 170 ENDIF 180 IF N=42 THEN PRINT \"The answer\" Preklad a spustenie Basic26 else.tbas --run alebo v simulátore; súbor examples/else.in odpovie -25:\nBasic26 else.tbas --sim --sim-input else.in Čo uvidíš A number?-25 Negative, I turn it round Medium Ako to funguje Riadky 30 až 80: keď je číslo záporné, vykonajú sa riadky 40 a 50; inak riadok 70. Potom program pokračuje za ENDIF. Riadky 90 až 170: blok v bloku. Vnútorný IF (riadky 120 až 160) je celý vo vetve ELSE vonkajšieho. Každý IF bez THEN má svoj ENDIF. Riadok 180: starý tvar s THEN nepotrebuje ENDIF. Odsadenie Medzery za číslom riadka BASIC ignoruje. Odsadením tela o dve medzery je však na prvý pohľad vidieť, čo k čomu patrí – a kde chýba ENDIF. Turbo-BASIC XL takto odsadzoval výpis programu sám.\nNa jednom riadku Blok môže byť aj na jednom riadku, príkazy oddelené dvojbodkou:\nTurbo Basic XL 50 IF A\u003eB:PRINT \"A\":ELSE:PRINT \"B\":ENDIF Časté chyby Čo sa stalo Čo sa stane chýba ENDIF error B26024: IF without ENDIF ELSE alebo ENDIF bez IF error B26023: there is nothing for this to close THEN na konci riadka bloku (IF N\u003c0 THEN a telo na ďalších riadkoch) je to jednoriadkový IF s prázdnym telom; riadky pod ním sa vykonajú vždy ELSE za jednoriadkovým IF … THEN error B26023 – ELSE patrí len k bloku bez THEN súbor má príponu .abas ELSE a ENDIF sú v Atari BASICu mená premenných: error B26017 Vyskúšaj si Spýtaj sa na dve čísla a vypíš väčšie z nich; ak sú rovnaké, vypíš Equal. Prepíš if.abas z kapitoly 8: dvojice IF s opačnými podmienkami nahraď blokmi s ELSE. Spýtaj sa na známku 1–5 a vypíš slovné hodnotenie. Skús to vnorenými blokmi aj cez ON … GOTO a porovnaj, čo sa lepšie číta. Zhrnutie IF podmienka bez THEN začína blok, ktorý končí ENDIF. ELSE oddeľuje vetvu „inak“. Bloky sa dajú vnárať; každý má vlastný ENDIF. Starý IF … THEN na jednom riadku funguje ďalej. Späť: 26. Turbo-BASIC XL · Ďalej: 28. Slučky s podmienkou\n","t":"27. Podmienka na viac riadkov: IF, ELSE, ENDIF","u":"27-else/"},{"c":"Na čo to je FOR sa hodí, keď vieš, koľkokrát opakovať. Často to však nevieš: „opakuj, kým hráč neuhádne“, „čítaj, kým nie je koniec“. V Atari BASICu na to bol IF a GOTO (kapitola 9). Turbo-BASIC XL má dve slučky, ktoré to povedia priamo.\nAko sa to píše Turbo Basic XL REPEAT príkazy UNTIL podmienka „Opakuj …, až kým podmienka nezačne platiť.“ Podmienka sa skúša na konci, takže telo sa vykoná aspoň raz.\nTurbo Basic XL WHILE podmienka príkazy WEND „Kým podmienka platí, opakuj …“ Podmienka sa skúša na začiatku, takže telo sa nemusí vykonať ani raz. WEND je skratka z while end.\nREPEAT … UNTIL WHILE … WEND kedy sa skúša podmienka po tele pred telom telo sa vykoná najmenej raz možno ani raz slučka končí, keď podmienka platí neplatí Celý program Súbor examples/loops.tbas:\nTurbo Basic XL 10 REM REPEAT ... UNTIL and WHILE ... WEND 20 N=1 30 REPEAT 40 PRINT N;\" \"; 50 N=N*2 60 UNTIL N\u003e1000 70 PRINT 80 REM The greatest common divisor of two numbers 90 A=84:B=36 100 WHILE A\u003c\u003eB 110 IF A\u003eB 120 A=A-B 130 ELSE 140 B=B-A 150 ENDIF 160 WEND 170 PRINT \"The divisor is \";A 180 REM WHILE may not run at all, REPEAT runs at least once 190 K=10 200 WHILE K\u003c5:PRINT \"WHILE ran\":WEND 210 REPEAT:PRINT \"REPEAT ran\":UNTIL K\u003e5 Preklad a spustenie Basic26 loops.tbas --sim Čo uvidíš 1 2 4 8 16 32 64 128 256 512 The divisor is 12 REPEAT ran Ako to funguje Riadky 30 až 60: ten istý výpočet ako goto.abas v kapitole 9, ale bez čísel riadkov, na ktoré sa skáče. Slučku je vidieť: začína REPEAT, končí UNTIL a podmienka konca stojí hneď pri ňom. Riadky 100 až 160: najväčší spoločný deliteľ starým Euklidovým postupom – od väčšieho čísla odčítaj menšie, kým nie sú rovnaké. WHILE sa hodí, lebo keby boli čísla rovnaké hneď, netreba robiť nič. Riadok 200: K\u003c5 neplatí už na začiatku, telo sa nevykoná. Riadok 210: REPEAT telo najprv vykoná a až potom skúša. Obe slučky sa dajú napísať na jeden riadok. Ktorú použiť Treba telo vykonať aspoň raz (spýtaj sa, potom skontroluj odpoveď)? REPEAT. Môže sa stať, že netreba robiť nič? WHILE. Vieš počet? FOR. Časté chyby Čo sa stalo Čo sa stane chýba WEND error B26024: WHILE without WEND chýba UNTIL error B26024: REPEAT without UNTIL UNTIL alebo WEND bez začiatku error B26023: there is nothing for this to close podmienka sa v tele nikdy nezmení nekonečná slučka podmienka UNTIL napísaná ako pre WHILE UNTIL N\u003c1000 skončí hneď po prvom prechode – UNTIL hovorí, kedy prestať slučky sa krížia (WHILE … REPEAT … WEND … UNTIL) error B26023: WEND without WHILE – vnútorná musí skončiť skôr Vyskúšaj si Prepíš hru guess.abas so slučkou REPEAT … UNTIL G=SECRET. Spýtaj sa na heslo; pýtaj sa znova, kým nie je správne. Zisti, koľkokrát treba zdvojnásobiť číslo 1, aby prekročilo milión. (WHILE a počítadlo.) Zhrnutie REPEAT … UNTIL podmienka opakuje, kým podmienka nezačne platiť; telo beží aspoň raz. WHILE podmienka … WEND opakuje, kým podmienka platí; telo nemusí bežať vôbec. Slučky sa vnárajú do seba aj do IF … ENDIF. Späť: 27. Podmienka na viac riadkov · Ďalej: 29. Slučka bez konca\n","t":"28. Slučky s podmienkou: REPEAT, UNTIL, WHILE, WEND","u":"28-repeat-while/"},{"c":"Na čo to je Niektoré slučky nemajú prirodzenú podmienku na začiatku ani na konci: hlavná slučka hry beží „stále“, a vyskočiť z nej treba zo stredu – keď hráč stlačí tlačidlo, keď dôjdu životy. Na to je DO … LOOP a príkaz EXIT.\nAko sa to píše Turbo Basic XL DO príkazy IF podmienka THEN EXIT príkazy LOOP Slovo Význam DO začiatok slučky LOOP koniec: choď späť na DO EXIT okamžite opusti slučku; program pokračuje za jej koncom Samotné DO … LOOP sa opakuje donekonečna. EXIT môže byť kdekoľvek v tele a môže ich byť viac.\nEXIT funguje aj v slučkách REPEAT … UNTIL, WHILE … WEND a FOR … NEXT.\nCelý program Súbor examples/do.tbas:\nTurbo Basic XL 10 REM DO ... LOOP and EXIT 20 SUM=0:N=0 30 DO 40 N=N+1 50 SUM=SUM+N 60 IF SUM\u003e100 THEN EXIT 70 LOOP 80 PRINT \"1+2+...+\";N;\" = \";SUM 90 REM EXIT leaves FOR, REPEAT and WHILE as well 100 FOR I=1 TO 100 110 IF I*I\u003e200 THEN EXIT 120 NEXT I 130 PRINT \"The first square over 200 is \";I;\"*\";I Preklad a spustenie Basic26 do.tbas --sim Čo uvidíš 1+2+...+14 = 105 The first square over 200 is 15*15 Ako to funguje Riadky 30 až 70: program sčítava 1, 2, 3 … a po každom pripočítaní pozrie, či súčet prekročil sto. Keď áno, EXIT preskočí za LOOP na riadok 80. Riadky 100 až 120: slučka má dva východy. Riadny, keď I prejde stovku, a predčasný cez EXIT, keď sa našlo, čo sa hľadalo. Počítadlo po EXIT ostane na hodnote, pri ktorej sa odišlo – preto riadok 130 vie vypísať 15. EXIT opúšťa len najvnútornejšiu slučku, v ktorej stojí. Z dvoch vnorených slučiek naraz ním nevyskočíš. Hlavná slučka hry Kostra z kapitoly 22 v Turbo-BASICu XL:\nTurbo Basic XL 100 DO 110 S=STICK(0) 120 IF STRIG(0)=0 THEN EXIT 130 EXEC MOVE_PLAYER 140 EXEC DRAW 150 PAUSE 2 160 LOOP 170 PRINT \"Game over\" Žiadne čísla riadkov, na ktoré sa skáče, a hneď je vidieť, kde slučka začína a končí. (EXEC a PAUSE sú v kapitolách 30 a 33.)\nEXIT a FOR V Atari BASICu sa zo slučky FOR predčasne odchádzalo skokom GOTO za NEXT. Slučka tým ostala „rozrobená“ – počítač si ju ďalej pamätal. EXIT to robí čisto: slučku naozaj ukončí a pokračuje za jej NEXT. Príkaz NEXT I vykonaný po EXIT by už svoju slučku nenašiel (chyba 13).\nEXIT patrí dovnútra slučky – medzi jej FOR a NEXT. Keby program do tela slučky skočil cez GOTO a FOR nevykonal, EXIT nemá čo ukončiť a program skončí chybou 26.\nČasté chyby Čo sa stalo Čo sa stane chýba LOOP error B26024: DO without LOOP LOOP bez DO error B26023: there is nothing for this to close EXIT mimo slučky error B26030: EXIT outside a loop EXIT v slučke, do ktorej sa skočilo bez jej FOR ERROR- 26 ?EXIT za behu DO … LOOP bez EXIT nekonečná slučka – niekedy naschvál, na konci programu, aby obrazovka ostala EXIT vo vnorenej slučke opustí len vnútornú premenná sa volá DOOR, DONE, LOOPS, EXITS číta sa ako DO OR, DO NE, LOOP S, EXIT S Vyskúšaj si Čítaj čísla cez INPUT a sčítavaj ich; nula slučku ukončí. Nájdi najmenšie číslo, ktoré je deliteľné 2, 3, 5 aj 7. (Skúšaj od jednotky, EXIT pri prvom, ktoré vyhovie.) Prepíš program on.abas z kapitoly 12 bez GOTO: ponuka v DO … LOOP, voľba Quit je EXIT. Zhrnutie DO … LOOP opakuje donekonečna. EXIT slučku opustí; býva za IF … THEN. EXIT platí aj v REPEAT, WHILE a FOR, vždy pre najvnútornejšiu slučku. Späť: 28. Slučky s podmienkou · Ďalej: 30. Procedúry a návestia\n","t":"29. Slučka bez konca: DO, LOOP, EXIT","u":"29-do/"},{"c":"Na čo to je GOSUB 1000 nehovorí, čo sa na riadku 1000 deje. V Turbo-BASICu XL môže mať podprogram meno – volá sa EXEC UNDERLINE a hneď je jasné, čo robí. Rovnako môže mať meno aj cieľ skoku: namiesto GOTO 500 je GO# FINISH.\nAko sa to píše Turbo Basic XL PROC meno príkazy ENDPROC EXEC meno Slovo Význam PROC meno začiatok procedúry; musí byť prvým príkazom na riadku ENDPROC koniec procedúry: vráť sa za EXEC, ktorý ju zavolal EXEC meno zavolaj procedúru (ako GOSUB) Návestia:\nZápis Význam # meno návestie: pomenované miesto v programe; musí byť prvým príkazom na riadku GO# meno skoč na návestie (ako GOTO) TRAP #meno pri chybe skoč na návestie RESTORE #meno čítaj DATA od návestia ON X EXEC a,b,c podľa hodnoty zavolaj jednu z procedúr ON X GO# a,b,c podľa hodnoty skoč na jedno z návestí Mená procedúr a návestí sú samostatné – nepletú sa s premennými.\nCelý program Súbor examples/proc.tbas je program z kapitoly 11 prepísaný s menami:\nTurbo Basic XL 10 REM PROC: subroutines with names 20 DIM T$(30) 30 T$=\"First\":EXEC UNDERLINE 40 T$=\"Second title\":EXEC UNDERLINE 50 N=3:EXEC POWERS 60 GO# FINISH 70 PRINT \"Skipped\" 80 # FINISH 90 PRINT \"Done\" 100 END 1000 PROC UNDERLINE 1010 PRINT T$ 1020 FOR I=1 TO LEN(T$):PRINT \"-\";:NEXT I 1030 PRINT 1040 ENDPROC 2000 PROC POWERS 2010 PRINT N;\" squared is \";N*N;\", cubed \";N^3 2020 ENDPROC Preklad a spustenie Basic26 proc.tbas --sim Čo uvidíš First ----- Second title ------------ 3 squared is 9, cubed 27 Done Ako to funguje Riadky 30 až 50: EXEC zavolá procedúru menom. Údaje sa jej stále odovzdávajú v premenných (T$, N) – procedúry Turbo-BASICu XL nemajú parametre a všetky premenné sú spoločné, tak ako pri GOSUB. Riadok 60: GO# FINISH preskočí riadok 70. Riadok 80: návestie. Medzi # a menom môže byť medzera. Riadok 100: END je aj tu nutný, aby program nevbehol do procedúr pod ním. Riadky 1000 až 1040: telo procedúry. Čísla riadkov sú tu už len kvôli BASICu – nikto sa na ne neodvoláva. Druhý program: ponuka Súbor examples/menu.tbas spája všetko z tejto kapitoly so slučkou DO:\nTurbo Basic XL 10 REM A menu with ON ... EXEC, TRAP # and RESTORE # 20 DIM W$(10) 30 DO 40 TRAP #OOPS 50 INPUT \"1 Colours 2 Animals 3 Quit: \",C 60 IF C=3 THEN EXIT 70 ON C EXEC COLOURS,ANIMALS 80 LOOP 90 PRINT \"Bye\" 100 END 200 # OOPS 210 PRINT \"Error \";ERR;\" at line \";ERL 220 GOTO 30 1000 PROC COLOURS 1010 RESTORE #CDATA 1020 EXEC THREE 1030 ENDPROC 2000 PROC ANIMALS 2010 RESTORE #ADATA 2020 EXEC THREE 2030 ENDPROC 3000 PROC THREE 3010 FOR I=1 TO 3:READ W$:PRINT W$;\" \";:NEXT I 3020 PRINT 3030 ENDPROC 4000 # CDATA 4010 DATA red,green,blue 5000 # ADATA 5010 DATA cat,dog,fox Basic26 menu.tbas --sim --sim-input menu.in Súbor examples/menu.in odpovie 2, 1, x a 3:\n1 Colours 2 Animals 3 Quit: 2 cat dog fox 1 Colours 2 Animals 3 Quit: 1 red green blue 1 Colours 2 Animals 3 Quit: x Error 8 at line 50 1 Colours 2 Animals 3 Quit: 3 Bye Riadok 70: ON C EXEC zavolá prvú alebo druhú procedúru zo zoznamu. Riadok 40: pasca na návestie. Odpoveď x nie je číslo, program skočí na # OOPS. ERR a ERL sú číslo chyby a riadok – pohodlnejšie než PEEK(195) (kapitola 38). Riadky 1010 a 2010: RESTORE #CDATA nastaví čítanie na DATA za návestím. Procedúra THREE potom číta tri slová a nevie ani nemusí vedieť, ktoré. Riadok 1020: procedúra môže volať inú procedúru. Časté chyby Čo sa stalo Čo sa stane EXEC alebo GO# na meno, ktoré nie je error B26028: there is no PROC or #NOPE in this program PROC nie je prvý na riadku error B26017: PROC has to be the first statement on its line chýba END pred procedúrami program do procedúry vbehne a skončí chybou na jej ENDPROC dve procedúry alebo návestia s rovnakým menom platí prvé; prekladač upozorní (B26046) GO# 30 s číslom error B26017: GO# needs a name – na číslo riadka je GOTO procedúra zmení premennú volajúceho ako pri GOSUB: premenné sú spoločné Vyskúšaj si Pridaj do ponuky tretiu skupinu slov a posuň Quit na štvorku. Napíš procedúru WAIT_KEY, ktorá vypíše Press a key a počká na kláves (kapitola 22). Prepíš gosub.abas a on.abas tak, aby v nich neostalo žiadne GOSUB ani GOTO. Zhrnutie PROC meno … ENDPROC je podprogram s menom, EXEC meno ho zavolá. # meno je návestie, GO# meno naň skočí; mená berú aj TRAP a RESTORE. ON X EXEC … a ON X GO# … vyberajú podľa čísla. Parametre nie sú; údaje idú cez spoločné premenné. Späť: 29. Slučka bez konca · Ďalej: 31. Celé čísla a bity\n","t":"30. Procedúry a návestia: PROC, ENDPROC, EXEC, #MENO, GO#","u":"30-proc/"},{"c":"Na čo to je V Atari BASICu sa celý podiel a zvyšok skladali z INT a delenia. Turbo-BASIC XL má na ne vlastné slová – a k nim funkcie na orezanie čísla, celé náhodné číslo, prácu s bitmi a šestnástkový zápis.\nAko sa to píše Zápis Čo dá Príklad Výsledok A DIV B celý podiel 17 DIV 5 3 A MOD B zvyšok po delení 17 MOD 5 2 TRUNC(X) odreže desatinnú časť (smerom k nule) TRUNC(-2.7) -2 FRAC(X) len desatinná časť FRAC(3.25) 0.25 RAND(N) náhodné celé číslo od 0 do N-1 RAND(6) 0 až 5 A \u0026 B bitové „a“ 12 \u0026 10 8 A ! B bitové „alebo“ 12 ! 10 14 A EXOR B bitové „buď – alebo“ 12 EXOR 10 6 HEX$(N) číslo šestnástkovo, ako text HEX$(255) FF DEC(A$) šestnástkový text ako číslo DEC(\"FF\") 255 DIV a MOD sú operátory – stoja medzi dvoma číslami ako + alebo * a majú rovnakú prednosť ako násobenie.\nCelý program Súbor examples/integers.tbas:\nTurbo Basic XL 10 REM Whole numbers and bits 20 PRINT \"17 DIV 5 = \";17 DIV 5 30 PRINT \"17 MOD 5 = \";17 MOD 5 40 PRINT \"TRUNC(-2.7) = \";TRUNC(-2.7);\", INT(-2.7) = \";INT(-2.7) 50 PRINT \"FRAC(3.25) = \";FRAC(3.25) 60 PRINT \"12 \u0026 10 = \";12\u002610 70 PRINT \"12 ! 10 = \";12!10 80 PRINT \"12 EXOR 10 = \";12 EXOR 10 90 PRINT \"HEX$(255) = \";HEX$(255) 100 PRINT \"HEX$(4096) = \";HEX$(4096) 110 PRINT \"DEC of FF = \";DEC(\"FF\") 120 PRINT \"$10+$10 = \";$10+$10 130 FOR I=1 TO 10:PRINT RAND(6)+1;\" \";:NEXT I 140 PRINT Preklad a spustenie Basic26 integers.tbas --sim Čo uvidíš 17 DIV 5 = 3 17 MOD 5 = 2 TRUNC(-2.7) = -2, INT(-2.7) = -3 FRAC(3.25) = 0.25 12 \u0026 10 = 8 12 ! 10 = 14 12 EXOR 10 = 6 HEX$(255) = FF HEX$(4096) = 1000 DEC of FF = 255 $10+$10 = 32 5 3 1 6 3 3 6 1 2 6 (Posledný riadok je v simulátore vždy rovnaký, na Atari zakaždým iný.)\nAko to funguje Riadky 20 a 30: sedemnásť delené piatimi je 3, zvyšok 2. N MOD 2 je 0 pre párne a 1 pre nepárne číslo – najčastejšie použitie MOD. Riadok 40: TRUNC odreže desatinnú časť, INT ide vždy nadol. Pri kladných číslach je to to isté, pri záporných nie. Riadok 130: RAND(6)+1 je hod kockou – kratšie než INT(RND(0)*6)+1. Bity Každé číslo 0 až 255 je v pamäti osem bitov – prepínačov, ktoré sú zapnuté (1) alebo vypnuté (0). Bity majú váhy 128, 64, 32, 16, 8, 4, 2 a 1; číslo je súčet váh zapnutých bitov.\n12 = 8+4 = 0000 1100 10 = 8+2 = 0000 1010 Operácia Bit výsledku je zapnutý, keď 12 a 10 \u0026 je zapnutý v oboch 0000 1000 = 8 ! je zapnutý aspoň v jednom 0000 1110 = 14 EXOR je zapnutý práve v jednom 0000 0110 = 6 Načo to je: veľa adries Atari drží v jednom bajte viac nastavení naraz, každé v inom bite. Bitovými operáciami sa dá jedno zmeniť a ostatné nechať:\nTurbo Basic XL 100 X=PEEK(A) 110 POKE A,X!4:REM switch bit 2 on 120 POKE A,X\u0026251:REM switch bit 2 off (251 = 255-4) 130 IF X\u00264 THEN PRINT \"bit 2 is on\" \u0026, ! a EXOR pracujú s celými číslami 0 až 65535. Nepomýľ si ich s AND a OR: tie hovoria len „platí – neplatí“ (1 alebo 0).\nŠestnástkové čísla Jedna šestnástková číslica sú presne štyri bity, takže bajt sú vždy dve číslice: $FF je 255, $0C je 12. HEX$ vráti dve číslice pre čísla do 255 a štyri pre väčšie.\nČasté chyby Čo sa stalo Čo sa stane DIV alebo MOD nulou ERROR- 11 OVERFLOW AT LINE 10 HEX$ záporného čísla alebo nad 65535 ERROR- 3 VALUE DEC textu, ktorý nie je šestnástkový vráti 0 RAND(6) bez +1 čísla 0 až 5 \u0026 namiesto AND v podmienke IF A=1 \u0026 B=2 počíta s bitmi, nie s pravdou; píš AND -7 DIV 2 je -3 (odreže sa k nule), zvyšok -7 MOD 2 je -1 Vyskúšaj si Vypíš čísla 1 až 30 a ku každému, či je deliteľné tromi. Vypíš číslo 0 až 255 dvojkovo: skúšaj N\u0026128, N\u002664 … N\u00261. Vypíš tabuľku čísel 0 až 15 desiatkovo a šestnástkovo. Zhrnutie DIV je celý podiel, MOD zvyšok. TRUNC odreže desatinnú časť, FRAC ju vráti. RAND(N) je náhodné celé číslo 0 až N-1. \u0026, !, EXOR pracujú s bitmi; AND, OR s pravdou. HEX$ a DEC prevádzajú medzi číslom a šestnástkovým textom. Späť: 30. Procedúry a návestia · Ďalej: 32. Hľadanie v texte a klávesy\n","t":"31. Celé čísla a bity: DIV, MOD, TRUNC, FRAC, RAND, \u0026, !, EXOR, HEX$, DEC","u":"31-cele-cisla/"},{"c":"Na čo to je Dve veci, ktoré v Atari BASICu chýbali: zistiť, či a kde sa v texte nachádza iný text, a prečítať kláves bez čakania a bez otvárania kanála.\nAko sa to píše Zápis Čo vráti INSTR(A$,B$) miesto, kde sa v A$ prvýkrát začína B$; 0, keď tam nie je INSTR(A$,B$,N) to isté, ale hľadá až od N-tého znaku UINSTR(A$,B$) ako INSTR, ale nerozlišuje veľké a malé písmená INKEY$ znak práve stlačeného klávesu; prázdny text, keď nie je stlačené nič GET K počká na kláves a jeho kód ATASCII uloží do K Celý program Súbor examples/instr.tbas:\nTurbo Basic XL 10 REM INSTR and UINSTR: looking for a text in a text 20 DIM A$(40) 30 A$=\"The quick brown fox\" 40 PRINT \"quick is at \";INSTR(A$,\"quick\") 50 PRINT \"QUICK is at \";INSTR(A$,\"QUICK\") 60 PRINT \"QUICK without case is at \";UINSTR(A$,\"QUICK\") 70 PRINT \"The first o is at \";INSTR(A$,\"o\") 80 PRINT \"The next o is at \";INSTR(A$,\"o\",14) 90 PRINT \"cat is at \";INSTR(A$,\"cat\") 100 REM Cut the text into words 110 P=1 120 REPEAT 130 S=INSTR(A$,\" \",P) 140 IF S=0 THEN S=LEN(A$)+1 150 PRINT A$(P,S-1) 160 P=S+1 170 UNTIL P\u003eLEN(A$) Preklad a spustenie Basic26 instr.tbas --sim Čo uvidíš quick is at 5 QUICK is at 0 QUICK without case is at 5 The first o is at 13 The next o is at 18 cat is at 0 The quick brown fox Ako to funguje Riadok 40: slovo quick sa začína na piatom znaku. Riadok 50: veľkými písmenami tam nie je – INSTR porovnáva presne. Výsledok 0 znamená „nenašlo sa“, a keďže nula je v podmienke „neplatí“, dá sa písať rovno IF INSTR(A$,\"fox\") THEN …. Riadok 60: UINSTR na veľkosti písmen nehľadí. Riadok 80: tretie číslo hovorí, odkiaľ hľadať. Prvé o je na mieste 13; hľadanie od 14 nájde ďalšie. Riadky 110 až 170: rozdelenie vety na slová – základ každej textovej hry. P je začiatok slova, S miesto najbližšej medzery za ním. Keď už medzera nie je, slovo siaha po koniec textu. Klávesy Súbor examples/keys.tbas je pre emulátor:\nTurbo Basic XL 10 REM INKEY$ and GET: keys without RETURN 20 DIM K$(1) 30 PRINT \"Press keys, Q ends\" 40 DO 50 K$=INKEY$ 60 IF K$\u003c\u003e\"\" 70 PRINT K$;\" has the code \";ASC(K$) 80 IF K$=\"Q\" THEN EXIT 90 ENDIF 100 LOOP 110 PRINT \"One more key to finish\" 120 GET K 130 PRINT \"It was \";CHR$(K) Basic26 keys.tbas --run Riadok 50: INKEY$ nečaká. Keď nie je stlačené nič, vráti prázdny text a program beží ďalej – slučka sa točí a môže medzitým robiť iné veci (hýbať príšerami, počítať čas). To je rozdiel oproti INPUT. Riadok 120: GET K bez kanála naopak čaká, kým kláves príde. Hodí sa na „stlač kláves a pokračujeme“. Vráti kód ATASCII, nie číslo klávesu ako PEEK(764). V Atari BASICu bolo na to isté treba otvoriť kanál na zariadenie K: (kapitola 24).\nOpačným smerom funguje PUT bez kanála: PUT 65,66 vypíše na obrazovku znaky s kódmi 65 a 66, teda AB.\nČasté chyby Čo sa stalo Čo sa stane hľadané slovo má iné veľké a malé písmená INSTR vráti 0; použi UINSTR IF INSTR(…)=1 namiesto \u003c\u003e0 platí, len keď je text na samom začiatku INKEY$ do reťazca bez DIM ERROR- 9 slučka s INKEY$ nič iné nerobí funguje, ale GET je na čakanie jednoduchší GET K v simulátore ERROR- 136 – klávesnica tam nie je Vyskúšaj si Spýtaj sa na vetu a slovo a vypíš, či veta slovo obsahuje. Spočítaj, koľkokrát sa vo vete nachádza písmeno e (INSTR s tretím číslom v slučke). Uprav joystick.abas z kapitoly 22 na ovládanie klávesmi W, A, S, D cez INKEY$. Zhrnutie INSTR(A$,B$) vráti miesto B$ v A$, alebo 0; UINSTR nerozlišuje veľkosť písmen. Tretie číslo určuje, odkiaľ hľadať. INKEY$ vráti kláves bez čakania, GET K naň počká. Späť: 31. Celé čísla a bity · Ďalej: 33. Čas\n","t":"32. Hľadanie v texte a klávesy: INSTR, UINSTR, INKEY$, GET","u":"32-retazce-turbo/"},{"c":"Na čo to je V kapitole 18 sa čakalo zápisom do adresy 20 a slučkou s PEEK. Turbo-BASIC XL má na hodiny Atari pohodlné slová: koľko času uplynulo a počkaj.\nAko sa to píše Zápis Čo robí TIME funkcia: počet päťdesiatin sekundy od zapnutia počítača TIME$ funkcia: ten istý čas ako text HHMMSS – hodiny, minúty, sekundy PAUSE n príkaz: počkaj n päťdesiatin sekundy Päťdesiatina sekundy je čas, za ktorý Atari nakreslí jeden obraz na televízore. PAUSE 50 je teda sekunda, PAUSE 25 pol sekundy, PAUSE 1 najkratšia možná prestávka.\nCelý program Súbor examples/time.tbas:\nTurbo Basic XL 10 REM TIME, TIME$ and PAUSE 20 T=TIME 30 FOR I=1 TO 100:X=SQR(I):NEXT I 40 PRINT \"A hundred square roots took \";(TIME-T)/50;\" s\" 50 PRINT \"Since the start: \";TIME$ 60 FOR N=3 TO 1 STEP -1 70 PRINT N 80 PAUSE 50 90 NEXT N 100 PRINT \"Go!\" Preklad a spustenie Basic26 time.tbas --run Hodiny v simulátore stoja, takže tento program patrí do emulátora: v simulátore by PAUSE nikdy neskončil.\nČo uvidíš Na európskom Atari (PAL) toto:\nA hundred square roots took 2.86 s Since the start: 000003 3 2 1 Go! Medzi číslami 3, 2, 1 a Go! je vždy presne sekunda.\nAko to funguje Riadok 20: zapamätaj si čas na začiatku merania. Riadok 40: rozdiel TIME-T je počet päťdesiatin, ktoré medzitým ubehli; delené 50 sú to sekundy. Takto sa meria rýchlosť kusu programu – a porovnáva sa interpreter s preloženým programom. Riadok 50: TIME$ má vždy šesť číslic: 000003 sú tri sekundy od zapnutia. Hodiny a minúty z neho vyberieš ako z každého reťazca – po priradení do premennej T$ sú minúty T$(3,4). Riadok 80: PAUSE 50 čaká sekundu, nech je počítač akokoľvek rýchly. Je to náhrada čakacej slučky FOR W=1 TO 500:NEXT W, ktorá v preloženom programe trvá len zlomok toho, čo v interpreteri. PAUSE v hre Hlavná slučka hry potrebuje rovnomerné tempo. PAUSE 1 alebo PAUSE 2 na jej konci ju „prilepí“ na obraz televízora: pohyb je plynulý a rovnako rýchly v interpreteri aj v preloženom programe.\nTurbo Basic XL 100 DO 110 EXEC MOVE_ALL 120 EXEC DRAW_ALL 130 PAUSE 2 140 LOOP Stopky Turbo Basic XL 10 PRINT \"Press a key to start\":GET K 20 T=TIME 30 PRINT \"Press a key to stop\":GET K 40 PRINT (TIME-T)/50;\" seconds\" Časté chyby Čo sa stalo Čo sa stane PAUSE bez čísla error B26040: expected a value, found end of line – počet treba napísať PAUSE alebo čakanie na TIME v simulátore program neskončí: instruction limit reached PAUSE 1 v dlhej slučke tisíc prechodov je dvadsať sekúnd čakania TIME sa berie ako sekundy sú to päťdesiatiny; del 50 premenná sa volá TIME error B26017: a statement cannot start with TIME – je to meno funkcie americké Atari (NTSC) obraz sa tam kreslí 60-krát za sekundu, takže PAUSE 50 je o šestinu kratšia Vyskúšaj si Zmeraj, ako dlho trvá slučka FOR I=1 TO 5000:NEXT I. Napíš odpočítavanie od 10 do 0, pri nule pípni (PRINT CHR$(253)). Prepíš sound.abas z kapitoly 21: podprogram na čakanie nahraď príkazom PAUSE. Zhrnutie TIME je čas od zapnutia v päťdesiatinách sekundy, TIME$ ako HHMMSS. PAUSE n počká n päťdesiatin sekundy, presne a nezávisle od rýchlosti programu. Rozdielom dvoch TIME sa meria, ako dlho niečo trvalo. Hodiny bežia len v emulátore a na Atari, nie v simulátore. Späť: 32. Hľadanie v texte a klávesy · Ďalej: 34. Bloky pamäte\n","t":"33. Čas: TIME, TIME$, PAUSE","u":"33-cas/"},{"c":"Na čo to je PEEK a POKE pracujú s jedným bajtom. Turbo-BASIC XL pridáva príkazy pre dva bajty naraz a pre celé kusy pamäte: skopírovať ich inam, zapísať do súboru, prečítať zo súboru. Čo v Atari BASICu trvalo slučkou sekundy, je tu jeden príkaz.\nAko sa to píše Zápis Čo robí DPEEK(a) funkcia: dvojbajtové číslo z adries a a a+1 – to isté ako PEEK(a)+256*PEEK(a+1) DPOKE a,v zapíše číslo 0–65535 do dvoch bajtov MOVE odkiaľ,kam,koľko skopíruje koľko bajtov; postupuje od začiatku -MOVE odkiaľ,kam,koľko to isté, ale postupuje od konca BPUT #k,adresa,koľko zapíše kus pamäte do súboru BGET #k,adresa,koľko prečíta kus súboru do pamäte %PUT #k,číslo zapíše číslo do súboru v šiestich bajtoch, tak ako ho drží pamäť %GET #k,premenná prečíta ho späť Celý program Súbor examples/blocks.tbas:\nTurbo Basic XL 10 REM DPEEK, DPOKE, MOVE, BPUT, BGET, %PUT, %GET 20 PRINT \"The screen is at \";DPEEK(88) 30 DPOKE 1536,12345 40 PRINT DPEEK(1536);\" = \";PEEK(1536);\" + 256*\";PEEK(1537) 50 DIM A$(12),B$(12) 60 A$=\"HELLO, WORLD\":B$=\"............\" 70 MOVE ADR(A$),ADR(B$),5 80 PRINT B$ 90 -MOVE ADR(A$),ADR(A$)+2,10 100 PRINT A$ 110 REM A block of memory and a number into a file and back 120 OPEN #1,8,0,\"D:BLOCK.DAT\" 130 BPUT #1,ADR(B$),12 140 %PUT #1,3.14159 150 CLOSE #1 160 B$=\"????????????\":X=0 170 OPEN #1,4,0,\"D:BLOCK.DAT\" 180 BGET #1,ADR(B$),12 190 %GET #1,X 200 CLOSE #1 210 PRINT B$;\" \";X Preklad a spustenie Basic26 blocks.tbas --sim Čo uvidíš The screen is at 48192 12345 = 57 + 256*48 HELLO....... HEHELLO, WOR HELLO....... 3.14159 Ako to funguje Riadok 20: adresa obrazovky jedným slovom namiesto PEEK(88)+256*PEEK(89). Riadky 30 a 40: DPOKE rozdelí číslo na dva bajty: 12345 je 57 + 256 × 48. Menší bajt je na nižšej adrese. Riadok 70: MOVE skopíruje päť bajtov zo začiatku A$ na začiatok B$. Pracuje s pamäťou, nie s reťazcami – o dĺžkach ani o DIM nevie nič, takže nepíš viac bajtov, než má cieľ miesta. Riadok 90: zdroj a cieľ sa prekrývajú: desať bajtov sa posúva o dve miesta doprava v tom istom reťazci. Obyčajný MOVE by si pri kopírovaní od začiatku prepísal to, čo ešte len má skopírovať. -MOVE ide od konca a prekrytie mu nevadí. Pravidlo: pri posune k vyšším adresám -MOVE, k nižším MOVE. Riadok 130: BPUT zapíše 12 bajtov pamäte do súboru jedným príkazom. Tak sa ukladá obrázok, znaková sada alebo pole. Riadok 140: %PUT zapíše číslo presne tak, ako je v pamäti – šesť bajtov. Oproti PRINT #1;X sa nič nestratí zaokrúhlením a číta sa rýchlejšie. Riadky 180 a 190: to isté naspäť, v tom istom poradí. Na čo sa MOVE používa Obrazovka: MOVE zdroj,DPEEK(88),960 prekreslí celú textovú obrazovku naraz z pripravenej predlohy. Znaková sada: MOVE 57344,nová,1024 skopíruje písmo Atari do pamäte, kde ho môžeš zmeniť. Polia a reťazce: vynulovanie alebo kópia bez slučky. Časté chyby Čo sa stalo Čo sa stane MOVE pri prekrývaní smerom nahor začiatok bloku sa rozkopíruje cez celý zvyšok viac bajtov, než má cieľ miesta prepíše sa, čo leží za ním – iné premenné, program BGET za koncom súboru ERROR- 136 %GET číta niečo, čo nezapísal %PUT nezmyselné číslo poradie MOVE kam,odkiaľ kopíruje sa opačne; prvý je zdroj DPOKE hodnoty nad 65535 ERROR- 3 Vyskúšaj si Ulož pole desiatich čísel do súboru cez %PUT v slučke a prečítaj ho späť. Vyplň reťazec hviezdičkami: zapíš jednu na začiatok a zvyšok sprav cez MOVE s prekrytím o jeden bajt. (Tu sa „chyba“ z prvého riadka tabuľky hodí.) V emulátore: zaplň obrazovku textom a cez MOVE skopíruj jej hornú polovicu do dolnej. Zhrnutie DPEEK a DPOKE čítajú a píšu dva bajty naraz. MOVE odkiaľ,kam,koľko kopíruje pamäť; pri prekrytí smerom nahor -MOVE. BPUT a BGET presúvajú kus pamäte do súboru a späť. %PUT a %GET ukladajú číslo presne, v šiestich bajtoch. Späť: 33. Čas · Ďalej: 35. Kruhy a výplne\n","t":"34. Bloky pamäte: DPEEK, DPOKE, MOVE, -MOVE, BPUT, BGET, %PUT, %GET","u":"34-pamat-turbo/"},{"c":"Na čo to je Atari BASIC vie v grafike bod a čiaru. Turbo-BASIC XL pridáva kruh, vyplnenie plochy dvoma spôsobmi a písanie textu do obrázka.\nAko sa to píše Príkaz Čo robí CIRCLE x,y,r kružnica so stredom x,y a polomerom r CIRCLE x,y,rx,ry elipsa: rx je vodorovný, ry zvislý polomer PAINT x,y vyleje farbu z bodu x,y: vyplní celú plochu až po hranice inej farby FCOLOR n pero pre FILLTO FILLTO x,y ako DRAWTO, ale od každého bodu čiary vypĺňa doprava, kým nenarazí na nakreslený bod TEXT x,y,text napíše text do grafiky; x,y je ľavý horný roh prvého písmena CLS #6 zmaže grafickú obrazovku Kreslí sa perom z COLOR, tak ako PLOT a DRAWTO (kapitola 20).\nCelý program Súbor examples/circle.tbas:\nTurbo Basic XL 10 REM CIRCLE, PAINT, FILLTO and TEXT 20 GRAPHICS 7 30 COLOR 1 40 CIRCLE 40,40,25 50 CIRCLE 110,30,40,12 60 COLOR 2 70 PAINT 40,40 80 COLOR 3:FCOLOR 3 90 PLOT 130,75:DRAWTO 130,60 100 PLOT 90,60:FILLTO 90,75 110 COLOR 1 120 TEXT 96,27,\"HI\" 130 LOCATE 40,40,C:PRINT \"Inside the circle: \";C 140 LOCATE 110,70,C:PRINT \"Inside the box: \";C Preklad a spustenie Obrázok ukáže emulátor:\nBasic26 circle.tbas --run Simulátor kreslí do pamäte a ukáže len textové okno:\nBasic26 circle.tbas --sim Čo uvidíš V emulátore: vľavo oranžová kružnica vyplnená zelenou, vpravo hore plochá elipsa s nápisom HI vo vnútri a pod ňou plný modrý obdĺžnik. V textovom okne (a v simulátore):\nInside the circle: 2 Inside the box: 3 Ako to funguje Riadok 40: kružnica s polomerom 25 bodov. Riadok 50: štyri čísla dajú elipsu – 40 bodov na šírku od stredu, 12 na výšku. Riadok 70: PAINT začne v strede kružnice a rozleje pero 2 všetkými smermi, kým nenarazí na body inej farby než pozadie. Kružnica je uzavretá, takže farba ostane vnútri. Keby mala hranica dieru, farba by vytiekla a zaliala celú obrazovku. Riadky 90 a 100: FILLTO potrebuje najprv pravú hranu. Riadok 90 ju nakreslí ako zvislú čiaru na x=130. Riadok 100 postaví pero na ľavý horný roh a FILLTO kreslí ľavú hranu smerom nadol; z každého jej bodu vyplní riadok doprava, až po hranu z riadka 90. Farbu výplne určuje FCOLOR. Riadok 120: TEXT nakreslí písmená z bodov, v každom grafickom režime a na ľubovoľnom mieste – nie len v textovom okne. Písmeno má 8 × 8 bodov. Riadky 130 a 140: LOCATE potvrdí, že vnútro kruhu má pero 2 a vnútro obdĺžnika pero 3. PAINT alebo FILLTO PAINT FILLTO tvar ľubovoľný uzavretý to, čo je medzi ľavou čiarou a prvým bodom vpravo farba COLOR FCOLOR rýchlosť pomalší rýchly nebezpečenstvo diera v hranici chýbajúca pravá hrana – vyplní sa až po okraj obrazovky Časté chyby Čo sa stalo Čo sa stane hranica pre PAINT nie je uzavretá farba zaleje celú obrazovku PAINT do bodu, ktorý už nie je farbou pozadia nevyplní sa nič FILLTO bez pravej hrany výplň ide až po pravý okraj obrazovky polomer 256 a viac ERROR- 3 VALUE AT LINE 40 chýba COLOR kreslí sa farbou pozadia – nevidno nič súbor má príponu .abas CIRCLE, PAINT a TEXT sú v Atari BASICu mená premenných Kruh, ktorý presahuje okraj obrazovky, sa nakreslí len z tej časti, ktorá sa zmestí.\nVyskúšaj si Nakresli terč: päť sústredných kružníc s polomermi 5, 10 … 25. Nakresli panáčika: hlava je kruh, telo a končatiny čiary. Nakresli dom z kapitoly 20 a vyfarbi steny, strechu aj dvere cez PAINT. Zhrnutie CIRCLE x,y,r kreslí kružnicu, so štvrtým číslom elipsu. PAINT x,y vyplní uzavretú plochu perom COLOR. FILLTO vypĺňa doprava od kreslenej čiary perom FCOLOR; potrebuje pravú hranu. TEXT x,y,\"…\" píše do obrázka. Späť: 34. Bloky pamäte · Ďalej: 36. Zvuk v šestnástich bitoch\n","t":"35. Kruhy a výplne: CIRCLE, FCOLOR, FILLTO, PAINT, TEXT","u":"35-grafika-turbo/"},{"c":"Na čo to je Výška tónu v príkaze SOUND je číslo 0 až 255. To je málo: vysoké tóny sú od seba ďaleko a ladia falošne, hlboké sa nedajú zahrať vôbec. Atari vie dva hlasy spojiť do jedného s výškou 0 až 65535 – jemnejšou 256-krát. Turbo-BASIC XL má na to DSOUND (double sound).\nAko sa to píše Turbo Basic XL DSOUND hlas,výška,skreslenie,hlasitosť DSOUND Hodnota Rozsah Význam hlas 0 alebo 1 hlas 0 je spojenie obyčajných hlasov 0 a 1, hlas 1 spojenie hlasov 2 a 3 výška 0–65535 menšie číslo je vyšší tón skreslenie párne 0–14 10 je čistý tón, ako pri SOUND hlasitosť 0–15 DSOUND bez čísel vypne všetko. Aj SOUND bez čísel vypne všetky štyri hlasy naraz.\nZ dvoch dvojíc sú len dva spojené hlasy, takže naraz zahráš najviac dva jemne ladené tóny namiesto štyroch hrubých.\nČísla výšky nie sú tie isté ako pri SOUND. Približne platí: výška pre DSOUND je 28-násobok výšky pre SOUND s tým istým tónom. Stredné C (SOUND 121) je asi 3413.\nCelý program Súbor examples/dsound.tbas zahrá plynule stúpajúci tón – sirénu, akú SOUND plynulo nespraví:\nTurbo Basic XL 10 REM DSOUND: two voices joined into one finer one 20 FOR P=2000 TO 500 STEP -20 30 DSOUND 0,P,10,8 40 PAUSE 1 50 NEXT P 60 DSOUND 70 SOUND Preklad a spustenie Basic26 dsound.tbas --run Zvuk počuť len v emulátore alebo na Atari. Program navyše čaká cez PAUSE, takže do simulátora nepatrí.\nČo uvidíš Nič – budeš počuť tón, ktorý asi sekundu a pol plynule stúpa.\nAko to funguje Riadok 20: výška ide od 2000 po 500 po dvadsiatich – 76 krokov. S obyčajným SOUND by ten istý rozsah mal len asi päťdesiat stupňov a bolo by počuť „schody“. Riadok 40: PAUSE 1 počká jednu päťdesiatinu sekundy (kapitola 33). Riadky 60 a 70: vypnutie. Po DSOUND ostane Atari prepnuté do režimu spojených hlasov; SOUND bez čísel ho vráti do obyčajného. Kedy DSOUND a kedy SOUND Melódia, ktorá má ladiť (najmä vo vyšších polohách) alebo basová linka: DSOUND. Efekty, šumy, akordy zo štyroch hlasov: SOUND. Miešať sa dajú: DSOUND 0,… zaberie hlasy 0 a 1, hlasy 2 a 3 ostanú pre SOUND 2,… a SOUND 3,…. Časté chyby Čo sa stalo Čo sa stane výška z tabuľky pre SOUND tón je skoro o päť oktáv vyššie – nepríjemné pískanie SOUND 0,… počas DSOUND 0,… bijú sa o ten istý hlas chýba čakanie v slučke tón prebehne príliš rýchlo po DSOUND hrá SOUND falošne vypni najprv všetko príkazom SOUND bez čísel hlas 2 alebo 3 spojené hlasy sú len dva: 0 a 1 Vyskúšaj si Sprav sirénu, ktorá stúpa a klesá päťkrát za sebou. Zahraj stupnicu: výšky 3413, 3040, 2708, 2555, 2276, 2027, 1805, 1703, každú na štvrť sekundy. Zahraj dva spojené hlasy naraz (DSOUND 0,… a DSOUND 1,…) s výškami 3413 a 2276. Zhrnutie DSOUND hlas,výška,skreslenie,hlasitosť hrá tón s výškou 0 až 65535. Hlasy sú len dva (0 a 1), každý zaberie dva obyčajné. DSOUND aj SOUND bez čísel všetko vypnú. Späť: 35. Kruhy a výplne · Ďalej: 37. Disketa\n","t":"36. Zvuk v šestnástich bitoch: DSOUND","u":"36-zvuk-turbo/"},{"c":"Na čo to je V Atari BASICu sa súbory mazali a premenovávali krkolomným XIO (kapitola 24) a zoznam súborov na diskete sa z programu vypísať skoro nedal. Turbo-BASIC XL má na prácu s disketou obyčajné príkazy.\nAko sa to píše Príkaz Čo robí DIR vypíše všetky súbory na diskete D: DIR \"D:*.TXT\" vypíše len súbory, ktoré sedia na vzor DELETE \"D:MENO.TXT\" zmaže súbor RENAME \"D:STARE.TXT,NOVE.TXT\" premenuje súbor; nové meno je za čiarkou, bez D: LOCK \"D:MENO.TXT\" zamkne súbor: nedá sa zmazať ani prepísať UNLOCK \"D:MENO.TXT\" odomkne ho BLOAD \"D:MENO.OBJ\" nahrá do pamäte súbor so strojovým kódom alebo dátami BRUN \"D:MENO.OBJ\" nahrá ho a spustí Vo vzore znamená * „čokoľvek“ a ? „jeden ľubovoľný znak“: D:*.TXT sú všetky súbory s príponou TXT, D:LEVEL?.DAT sú LEVEL1.DAT, LEVEL2.DAT …\nCelý program Súbor examples/disk.tbas:\nTurbo Basic XL 10 REM DIR, RENAME, LOCK, UNLOCK, DELETE 20 OPEN #1,8,0,\"D:FIRST.TXT\":PRINT #1;\"Hello\":CLOSE #1 30 PRINT \"After writing:\":DIR \"D:*.TXT\" 40 RENAME \"D:FIRST.TXT,SECOND.TXT\" 50 LOCK \"D:SECOND.TXT\" 60 PRINT \"Renamed and locked:\":DIR \"D:*.TXT\" 70 TRAP #LOCKED 80 DELETE \"D:SECOND.TXT\" 90 PRINT \"Deleted\" 100 END 110 # LOCKED 120 PRINT \"Cannot delete, error \";ERR 130 UNLOCK \"D:SECOND.TXT\" 140 DELETE \"D:SECOND.TXT\" 150 PRINT \"Unlocked and deleted:\":DIR \"D:*.TXT\" Preklad a spustenie Tieto príkazy vykonáva DOS, takže program potrebuje disketu s DOS-om. Voľba --atr ju vyrobí, uloží na ňu preložený program a --run z nej emulátor naštartuje (kapitola 41):\nBasic26 disk.tbas --atr disk.atr --run Simulátor operácie DOS-u nevie, v ňom tento program neskúšaj.\nČo uvidíš After writing: FIRST TXT 001 611 FREE SECTORS Renamed and locked: * SECOND TXT 001 611 FREE SECTORS Cannot delete, error 167 Unlocked and deleted: 612 FREE SECTORS Ako to funguje Riadok 20: program si najprv vyrobí malý súbor, aby mal s čím pracovať. Riadok 30: DIR so vzorom vypíše súbory s príponou TXT. Každý riadok je meno, prípona a veľkosť v sektoroch (sektor má 125 bajtov dát). Posledný riadok hovorí, koľko sektorov je na diskete ešte voľných. Riadok 40: staré meno aj nové v jednom texte, oddelené čiarkou. Riadok 60: zamknutý súbor má vo výpise na začiatku hviezdičku. Riadok 80: zamknutý súbor zmazať nejde – chyba 167. Pasca na riadku 70 pošle program na návestie LOCKED. Riadky 130 až 150: po odomknutí už DELETE prejde a súbor zo zoznamu zmizne; voľných sektorov je o jeden viac. DIR bez vzoru vypíše všetko, čo na diskete je – aj súbory DOS-u (DOS.SYS, DUP.SYS) a tvoj program (AUTORUN.SYS).\nBLOAD a BRUN Súbory so strojovým kódom majú na Atari vlastný formát: nesú v sebe adresy, kam sa majú nahrať (je to ten istý formát ako .xex). BLOAD taký súbor nahrá na jeho miesto a program pokračuje – takto si dobové programy nahrávali rutiny pre USR, znakové sady a obrázky. BRUN ho po nahratí aj spustí; keď sa strojový kód vráti, pokračuje program ďalším príkazom.\nTurbo Basic XL 10 BLOAD \"D:FONT.OBJ\" 20 POKE 756,152 V preloženom programe býva pohodlnejšie taký súbor pribaliť voľbou --embed (kapitola 43) – nahrá sa spolu s programom a disketu netreba.\nČasté chyby Čo sa stalo Čo sa stane súbor neexistuje ERROR- 170 ?FILE súbor je zamknutý ERROR- 167 LOCKED program beží bez DOS-u (--run bez --atr) ERROR- 130 ?DEV RENAME s D: aj pred novým menom chyba 165 – nové meno sa píše bez zariadenia meno dlhšie než 8 znakov alebo s malými písmenami ERROR- 165 NAME DIR počas otvoreného kanála 7 DIR si kanál 7 berie pre seba a zavrie ho Vyskúšaj si Vyrob tri súbory A.TXT, B.TXT, C.DAT a vypíš najprv všetky, potom len *.TXT. Napíš „správcu súborov“: ponuka s voľbami zoznam, zmazať, premenovať; meno sa pýta cez INPUT. Zachyť chybu 170 pri DELETE súboru, ktorý nie je, a vypíš No such file. Zhrnutie DIR vypíše súbory na diskete, so vzorom len niektoré. DELETE, RENAME, LOCK, UNLOCK robia to, čo hovoria. BLOAD nahrá strojový kód alebo dáta, BRUN ich aj spustí. Program s disketou sa skúša v emulátore: --atr disk.atr --run. Späť: 36. Zvuk v šestnástich bitoch · Ďalej: 38. Hľadanie chýb\n","t":"37. Disketa: DIR, DELETE, RENAME, LOCK, UNLOCK, BLOAD, BRUN","u":"37-disk/"},{"c":"Na čo to je Program, ktorý sa preloží, ešte nemusí robiť, čo má. Turbo-BASIC XL má niekoľko pomôcok, ktoré pomáhajú zistiť, kadiaľ program ide a čo sa pokazilo.\nAko sa to píše Zápis Čo robí ERR funkcia: číslo poslednej chyby (to isté ako PEEK(195)) ERL funkcia: riadok, na ktorom nastala TRACE zapne stopovanie: pred každým riadkom sa vypíše jeho číslo v hranatých zátvorkách TRACE - vypne stopovanie *B kláves BREAK sa dá zachytiť cez TRAP ako chyba 128 *B - BREAK program zastaví ako zvyčajne *F slučka FOR, ktorej začiatok je už za koncom, sa nevykoná ani raz *F - FOR sa správa ako v Atari BASICu: telo prebehne aspoň raz *L, *L - zapína a vypína odsadzovanie výpisu v editore – v preloženom programe nemá čo robiť Celý program Súbor examples/debug.tbas:\nTurbo Basic XL 10 REM TRACE, ERR and ERL 20 TRACE 30 FOR I=1 TO 3 40 S=S+I 50 NEXT I 60 TRACE - 70 PRINT 80 PRINT \"Sum \";S 90 TRAP #FAULT 100 DIM A(5) 110 FOR I=4 TO 7:A(I)=I*I:NEXT I 120 END 130 # FAULT 140 PRINT \"Error \";ERR;\" at line \";ERL;\", I was \";I Preklad a spustenie Basic26 debug.tbas --sim Čo uvidíš [30][40][50][40][50][40][50][60] Sum 6 Error 9 at line 110, I was 6 Ako to funguje Riadok 20: od tohto miesta program pred každým riadkom, na ktorý príde, vypíše jeho číslo. Prvý riadok výstupu je stopa: 30, potom trikrát 40 a 50 (telo slučky), a 60, kde sa stopovanie vypne. Vidíš presne, koľkokrát slučka prebehla a kam sa skákalo. Keď program „niekam zmizne“, stopa ukáže kam. Riadok 110: pole má prvky 0 až 5. Pre I = 6 je to chyba 9. Riadok 140: ERR a ERL povedia, čo a kde sa stalo. Vypísať si pri chybe aj hodnoty premenných býva najrýchlejšia cesta k príčine. Stopa spomaľuje a zaplní obrazovku, preto sa zapína len okolo podozrivého miesta.\n*F: slučka, ktorá nemusí prebehnúť V kapitole 10 bolo, že FOR I=5 TO 1 telo raz vykoná. S *F nie:\nTurbo Basic XL 10 FOR I=5 TO 1:PRINT \"once\":NEXT I 20 *F 30 FOR I=5 TO 1:PRINT \"never\":NEXT I 40 PRINT \"after, I=\";I once after, I=5 Prvá slučka (bez *F) vypíše once, druhá sa preskočí celá. Je to rozumnejšie správanie a v nových programoch sa *F oplatí dať na začiatok; dobové programy však niekedy s jedným prechodom počítajú.\n*B: BREAK ako chyba Bežne kláves BREAK program zastaví s hlásením STOPPED AT LINE …. Po *B sa BREAK stane chybou číslo 128, ktorú zachytí TRAP. Program tak môže pred koncom upratať – zavrieť súbory, vypnúť zvuk – alebo BREAK úplne ignorovať:\nTurbo Basic XL 10 *B 20 TRAP #BRK 30 DO:PRINT \"Press BREAK \";:PAUSE 25:LOOP 40 # BRK 50 PRINT:PRINT \"Break caught, error \";ERR Čo patrilo editoru DUMP (výpis všetkých premenných), RENUM (prečíslovanie riadkov), DEL (zmazanie riadkov) a *L sú príkazy editora Turbo-BASICu. V preloženom programe len vypíšu NOT IN COMP PRG, tak ako LIST v kapitole 25.\nPomôcky prekladača Pri hľadaní chýb pomáha aj prekladač sám:\n-v vypíše, čo pri preklade robil a ktoré slová Turbo-BASICu program používa, --strict upozorní na miesta, ktoré by pôvodný interpreter odmietol, --listing súbor zapíše, čo z ktorého riadka vzniklo, simulátor s --sim-screen ukáže obrazovku na konci. Viac v kapitole 39.\nČasté chyby Čo sa stalo Čo sa stane TRACE ostal zapnutý obrazovka plná čísel v zátvorkách ERR a ERL pred prvou chybou sú 0 *F v programe, ktorý počíta s jedným prechodom slučka sa nevykoná a program sa správa inak *B bez TRAP BREAK program zastaví ako vždy obsluha chyby nevypíše nič chyba je „zjedená“ a program pokračuje s nezmyslami – pri ladení vždy vypíš aspoň ERR a ERL Vyskúšaj si Zapni TRACE v programe menu.tbas z kapitoly 30 a sleduj, kadiaľ ide pri voľbe 1 a 2. Pridaj do debug.tbas na začiatok *F a zmeň slučku na riadku 30 na FOR I=3 TO 1. Aká bude stopa? Napíš obsluhu chyby, ktorá vypíše ERR, ERL a podľa čísla aj slovný popis aspoň pre chyby 3, 5, 8, 9 a 11. Zhrnutie ERR a ERL sú číslo a riadok poslednej chyby. TRACE vypisuje čísla vykonávaných riadkov, TRACE - to vypne. *F opraví FOR, aby vedel prebehnúť nula ráz; *B spraví z BREAK chybu 128. Príkazy editora (DUMP, RENUM, DEL, *L) v preloženom programe nerobia nič užitočné. Tým sa končí časť o Turbo-BASICu XL. Zvyšok knihy je o prekladači.\nSpäť: 37. Disketa · Ďalej: 39. Prekladač Basic26\n","t":"38. Hľadanie chýb: ERR, ERL, TRACE, *B, *F, *L","u":"38-ladenie/"},{"c":"Na čo to je Doteraz si prekladač volal dvoma spôsobmi: Basic26 program.abas --sim a --run. Vie toho viac. Táto kapitola prejde voľby, ktoré sa píšu na príkazový riadok – najprv tie, ktoré použiješ často, potom tie na zvláštne príležitosti. Všetky sú zhrnuté v prílohe B.\nAko sa to píše Basic26 [voľby] program Voľby sa začínajú pomlčkou a môžu stáť pred menom programu aj za ním. Dlhé voľby majú dve pomlčky (--sim), niektoré aj krátky tvar s jednou (-o, -v).\nBasic26 --help vypíše všetky.\nProgram na skúšanie Súbor examples/options.abas:\nAtari BASIC 10 REM A program to try the options of the compiler on 20 FOR I=1 TO 5 30 PRINT I;\" squared is \";I*I;\", its root \";SQR(I) 40 NEXT I 50 PRINT \"Press START\" 60 IF PEEK(53279)\u003c\u003e6 THEN 60 70 PRINT \"Thank you\" Riadok 60 čaká na kláves START (kapitola 22). V simulátore ho „stlačí“ voľba --sim-console:\nBasic26 options.abas --sim --sim-console 6@20000 1 squared is 1, its root 1 2 squared is 4, its root 1.41421356 3 squared is 9, its root 1.7320508 4 squared is 16, its root 2 5 squared is 25, its root 2.23606797 Press START Thank you 6@20000 znamená: po dvadsaťtisíc krokoch procesora nech PEEK(53279) vracia 6 (START). Viac klávesov za sebou sa oddelí čiarkou: 6@20000,7@30000,5@40000.\nVýstup Voľba Čo robí -o súbor meno výsledného súboru; bez nej je to meno programu s príponou .xex -v vypíše, čo prekladač robí --list súbor zapíše program ako čitateľný text --scramble zakóduje výsledný súbor, aby sa v ňom nedalo nič prečítať (kapitola 48) Basic26 options.abas -o start.xex -v reading options.abas (7 lines, text, Atari BASIC) peephole: 7 change(s); runtime: 14845 byte(s) left out wrote start.xex (3555 bytes, 5 segment(s), 3527 bytes of program) Prvý riadok hovorí, ako prekladač program prečítal – tu ako text v Atari BASICu. Pri programe v Turbo-BASICu XL pribudne riadok so slovami, ktoré z neho program naozaj používa (Turbo-BASIC XL: DIV MOD WHILE). Druhý riadok hovorí, koľko zo svojej knižnice prekladač vynechal: do programu sa dostanú len tie rutiny, ktoré naozaj potrebuje. Tretí je veľkosť výsledku.\nJazyk Voľba Čo robí --dialect atari program je Atari BASIC, nech má akúkoľvek príponu --dialect turbo program je Turbo-BASIC XL --strict upozorní (a zastaví preklad) tam, kde by pôvodný interpreter program odmietol alebo kde preložený program robí len náhradu --quirks prijme aj to, čo interpreter prijme a čo zlyhá až počas behu --no-line-numbers program v Turbo-BASICu XL bez čísel riadkov (kapitola 47) Na dialekte záleží viac, než sa zdá:\nTurbo Basic XL 10 X=5:PRINT X DIV 2 Ako Turbo-BASIC XL vypíše 2. Ako Atari BASIC vypíše 502 – tam je DIV meno premennej (s nulou) a PRINT vypíše tri veci za sebou.\n--quirks je pre dobové programy. Príklad: GOTO 100 v programe, ktorý riadok 100 nemá. Interpreter taký program spustí a chybu 12 ohlási, až keď na GOTO príde – a veľa programov naň nepríde nikdy. Prekladač to bežne odmietne (error B26012: line 100 does not exist); s --quirks z toho spraví upozornenie a chybu 12 nechá na beh.\nVeľkosť a rýchlosť Voľba Čo robí -O2 (predvolené) najrýchlejší program -O1 program o niečo menší (až o 500 bajtov) a o niečo pomalší -O0 nič sa nevynecháva ani nezlepšuje; len na skúmanie prekladača --rom-fp počíta rutinami operačného systému namiesto vlastných: pomalšie, ale asi o 1 700 bajtov menej Program options.abas:\nVoľby Veľkosť .xex (žiadne) 3 555 bajtov --rom-fp 2 078 bajtov -O0 19 640 bajtov Kedy na tom záleží: veľký dobový program, ktorý sa s interpreterom do pamäte zmestil a preložený skončí chybou 2 pri DIM. Vtedy skús -O1 a --rom-fp (a kapitolu 42). Výsledky výpočtov sú pri všetkých voľbách do poslednej číslice rovnaké.\nSimulátor Voľba Čo robí --sim spustí preložený program vo vstavanom simulátore --sim-input súbor odpovede pre INPUT, riadok na každý --sim-screen na konci vypíše obrazovku namiesto toho, čo program postupne písal --sim-console K@N „stlačí“ START (6), SELECT (5) alebo OPTION (3) od kroku N --sim-trig T@N stlačí tlačidlo joysticku 0 alebo 1 od kroku N; T=1@N ho pustí --sim-stick S=V@N joystick 0 alebo 1 od kroku N: 15 stred, 11 vľavo, 7 vpravo, 14 hore, 13 dole --sim-ntsc stroj je NTSC; predvolene je PAL (PEEK(53268) je 1) --sim-limit N po koľkých krokoch sa simulátor vzdá (predvolene 10 miliónov) --sim-mem stroj pamäť simulovaného stroja: 64, 130xe, rambo320 … (kapitola 44) --rom súbor kde je ATARIXL.ROM, ak ho simulátor nenájde sám (bez neho vezme altirraos-xl.rom) Čo simulátor vie a nevie:\nVie Nevie výpis, INPUT zo súboru, počítanie písať na klávesnici – kláves je len to, čo je v --sim-input súbory na D: (v pamäti, do konca behu) ukázať obrázok, zahrať zvuk kreslenie do pamäte: PLOT, DRAWTO, LOCATE, CIRCLE, PAINT; obrazovka a zoznam displeja ležia tam, kde ich má operačný systém nárazy hráčov a striel (PMHIT je vždy 0) joystick a tlačidlá z --sim-stick a --sim-trig (bez nich stojí: STICK 15, STRIG 1) operácie DOS-u: DIR, RENAME, DELETE hodiny: snímka je 10 000 krokov, PEEK(20), TIME a PAUSE bežia banky a RAM pod ROM (--sim-mem) Náhodné čísla sú v ňom pri každom spustení rovnaké. Keď program neskončí, simulátor to po limite vzdá hlásením error B26213: instruction limit reached.\nEmulátor Voľba Čo robí --run po preklade spustí program v emulátore atari800 --emulator cesta kde je atari800.exe, ak nie je v priečinku atari800 vedľa prekladača --atr disk.atr uloží program na obraz diskety; s --run z nej emulátor naštartuje (kapitola 41) Emulátor sa dá určiť aj premennou prostredia ATARI800. Hotový .xex sa dá spustiť bez prekladu: Basic26 hra.xex --run.\nUpozornenia a chyby Voľba Čo robí --werror upozornenie je chyba: preklad sa zastaví --max-errors N po koľkých chybách prestať (predvolene 20, 0 = bez obmedzenia) Výpisy pre zvedavých Voľba Čo zapíše --listing súbor strojový kód, ktorý z programu vznikol, aj s riadkami BASICu --map súbor mapu pamäte: čo leží na ktorej adrese --lab súbor mená adries pre ladiace nástroje emulátorov atari800 a Altirra --mads súbor celý program ako zdroják pre assembler MADS Na programovanie v BASICu ich nepotrebuješ. Hodia sa, keď chceš vidieť, čo prekladač z programu spravil, alebo hľadáš chybu so strojovým kódom.\nVoľby zo súboru Dlhý rad volieb sa dá uložiť do súboru a odovzdať so zavináčom. Súbor book.args:\n# options for the book -o start.xex --sim --sim-console 6@20000 Basic26 options.abas @book.args Voľby v súbore oddeľujú medzery alebo konce riadkov; riadok so znakom # na začiatku je komentár. Voľby, ktoré patria k programu natrvalo, je lepšie napísať rovno doň – kapitola 40.\nČasté chyby Čo sa stalo Čo sa stane chýba meno programu prekladač vypíše návod neznáma voľba error B26200 a návod --sim a program čaká na kláves alebo hodiny error B26213: instruction limit reached .xex na vstupe bez --run nič sa neprekladá; prekladač nikdy neprepíše súbor, ktorý dostal ako vstup -o s menom vstupného súboru chyba ešte pred zápisom Vyskúšaj si Prelož options.abas s -v a s --rom-fp -v a porovnaj veľkosti. Spusti ho v simulátore bez --sim-console. Čo sa stane a po akom čase? Zapíš si --listing a nájdi v ňom riadok 30 svojho programu. Zhrnutie -o určuje výstup, -v hovorí, čo sa deje. --dialect vyberá jazyk, --strict sprísňuje, --quirks povoľuje. -O1 a --rom-fp zmenšia program, keď chýba pamäť. Simulátor: --sim, --sim-input, --sim-screen, --sim-console, --sim-trig, --sim-stick, --sim-limit. Emulátor: --run, s disketou --atr. Späť: 38. Hľadanie chýb · Ďalej: 40. Nastavenia v zdrojáku\n","t":"39. Prekladač Basic26","u":"39-prekladac/"},{"c":"Na čo to je Niektoré voľby patria k programu natrvalo: hra potrebuje svoju znakovú sadu, veľký program sa bez --rom-fp nezmestí, textovka má texty v skrytej pamäti. Písať ich zakaždým na príkazový riadok je otravné a ľahko sa na niektorú zabudne. Program si ich preto môže niesť sám, v komentári na svojom začiatku.\nAko sa to píše Turbo Basic XL 0 REM @COMPILE voľby Časť Význam REM pre interpreter je to obyčajný komentár – program ostáva platným BASICom @COMPILE značka, podľa ktorej riadok spozná prekladač voľby to isté, čo by si napísal na príkazový riadok Pravidlá:\nRiadky REM @COMPILE musia byť na začiatku programu, pred prvým príkazom. Môže ich byť viac za sebou. Číslo riadka nie je povinné: REM @COMPILE --rom-fp na úplne prvom riadku súboru platí tiež. Hodí sa to pre dobové výpisy, kde nechceš meniť čísla riadkov. Cesty k súborom (--embed font.fnt) sa počítajú od priečinka, v ktorom leží program – nie od miesta, kde stojíš v príkazovom riadku. Celý program Súbor examples/config.abas:\nAtari BASIC 0 REM @COMPILE --rom-fp 10 REM Options written in the program itself 20 PRINT \"This program asks for --rom-fp\" 30 PRINT \"in its first line\" Preklad a spustenie Na príkazovom riadku už --rom-fp netreba:\nBasic26 config.abas --sim -v Čo uvidíš S -v prekladač najprv povie, čo si z programu prečítal:\nREM @COMPILE: --rom-fp reading config.abas (4 lines, text, Atari BASIC) peephole: 7 change(s); runtime: 17620 byte(s) left out wrote config.xex (935 bytes, 4 segment(s), 911 bytes of program) a potom program beží:\nThis program asks for --rom-fp in its first line Ktoré voľby smú byť v programe Len tie, ktoré hovoria, ako sa program prekladá a čo k nemu patrí:\nSkupina Voľby jazyk --dialect, --quirks, --strict, --no-line-numbers veľkosť a rýchlosť -O0, -O1, -O2, --rom-fp miesto v pamäti --origin, --ramtop, --reserve, --basic-screen, --keep-rem pribalené súbory --embed, --patch, --file písmená a texty --charmap, --screen-codes skrytá pamäť a texty --xmem, --text-under-rom, --text-in-banks, --pack-text správanie --exit-to-dos, --line-delay disketa --atr, --dos nečitateľný súbor --scramble, --scramble-fx, --scramble-level, --scramble-key Voľby, ktoré hovoria, čo chceš práve teraz – -o, --sim, --run, -v, --list –, do programu nepatria a prekladač ich tam odmietne:\nconfig.abas(1,1): error B26232: '--sim' cannot be given in the program, only on the command line Kto má prednosť Príkazový riadok. Keď má program REM @COMPILE -O1 a ty napíšeš -O2, platí -O2 a prekladač na to upozorní. Voľby, ktoré sa dajú zopakovať (--embed, --file, --line-delay), sa sčítajú – platia tie z programu aj tie z príkazového riadka.\nKeď chceš hlavičku programu na jeden preklad vypnúť:\nBasic26 config.abas --no-source-options Najstaršia verzia prekladača: REM @VERSION Program, ktorý používa niečo nové, môže povedať, od ktorej verzie prekladača ho treba prekladať:\nTurbo Basic XL 0 REM @VERSION 1.0.0.150 Starší prekladač ho odmietne s jasnou správou, namiesto aby hlásil chyby v riadkoch, ktorým ešte nerozumie:\nconfig.abas(1,1): error B26232: this program needs Basic26 1.0.0.150 or newer, this is 1.0.0.140 Verziu svojho prekladača zistíš cez Basic26 --version (kapitola 1). Stačia aj prvé tri čísla (1.0.0). Rovnako ako REM @COMPILE platí len v riadkoch, ktorými sa program začína, a pre interpreter je to komentár. V prekladači Action26 je to ;@version.\nDesatinné premenné: REM @FLOAT Program preložený s --int počíta celými číslami. Ktoré premenné majú predsa držať desatinné čísla, povie ďalší riadok na začiatku programu, REM @FLOAT X,Y,A( – podrobne v kapitole 50.\nNa čo je to dobré Program sa prekladá vždy rovnako, nech ho prekladá ktokoľvek a odkiaľkoľvek: z príkazového riadka, z editora, zo skriptu. Stačí poslať jeden priečinok – program, jeho súbory a nič viac. Žiadny návod „prelož to s týmito desiatimi voľbami“. Príklady v priečinku examples k prekladaču sú urobené práve takto. Otvor si niektorú z textových hier a pozri sa na jej prvé riadky. Typická hlavička väčšej hry:\nTurbo Basic XL REM @COMPILE --embed hokuf.fnt@$9800 --reserve $7530-$797C REM @COMPILE --text-under-rom --pack-text Čo tie voľby znamenajú, vysvetlia kapitoly 42 až 48.\nČasté chyby Čo sa stalo Čo sa stane REM @COMPILE až za prvým príkazom warning B26232: REM @COMPILE counts only before the first statement of the program; this one is left out voľba, ktorá do programu nepatrí (-o, --sim) error B26232 REM @VERSION s verziou novšou než prekladač error B26232: this program needs Basic26 … or newer, this is … preklep v @COMPILE (@COMPIL) je to obyčajný komentár; voľby sa nepoužijú a nikto nič nehlási riadok bez čísla nie je úplne prvý v súbore iný riadok bez čísla je chyba (B26044) cesta k súboru od príkazového riadka hľadá sa od priečinka programu Vyskúšaj si Prelož config.abas s -v a potom s -v --no-source-options. O koľko bajtov sa líši výsledok? Pridaj do programu druhý riadok 1 REM @COMPILE -O1 a prelož ho s -O2 na príkazovom riadku. Čo prekladač vypíše? Zmaž z prvého riadka číslo 0. Preloží sa program rovnako? Zhrnutie REM @COMPILE voľby na začiatku programu sú voľby prekladu, ktoré program nesie so sebou. REM @VERSION 1.0.0.150 povie, od ktorej verzie prekladača sa program dá preložiť. Pre interpreter je to komentár. Príkazový riadok má prednosť; --no-source-options hlavičku vypne. Smú tam byť len voľby o tom, ako sa program prekladá – nie -o, --sim, --run. Späť: 39. Prekladač Basic26 · Ďalej: 41. Diskety a dobové programy\n","t":"40. Nastavenia v zdrojáku: REM @COMPILE","u":"40-nastavenia-v-zdrojaku/"},{"c":"Na čo to je Atari ukladalo programy na diskety. Dnes sa disketa uchováva ako jeden súbor na PC – obraz diskety s príponou .atr. Emulátor s ním zaobchádza ako so skutočnou disketou a na internete sú v tomto tvare tisíce diskiet s dobovými programami.\nBasic26 vie s obrazmi diskiet tri veci:\nuložiť preložený program na disketu tak, aby sa po zapnutí Atari sám spustil, pozrieť, čo na diskete je, prečítať program rovno z diskety – a to aj v tvare, v akom ho uložil interpreter. Voľby Voľba Čo robí --atr disk.atr uloží preložený program na obraz diskety; ak disketa neexistuje, vyrobí ju aj s DOS-om --dos meno ktorý DOS má byť na novej diskete (predvolene dos25) --exit-to-dos po skončení programu sa vráti do DOS-u --dir disk.atr vypíše obsah diskety disk.atr:MENO.BAS namiesto mena programu: súbor na diskete --list súbor zapíše program ako čitateľný text --list-atascii výpis nechá v kódoch Atari namiesto prevodu do UTF-8 --save súbor zapíše program v tvare, v akom ho ukladá SAVE --from-cp1250 výpis písaný na PC s českými písmenami prevedie do českej znakovej sady Atari Program na disketu Program, ktorý pracuje so súbormi, potrebuje DOS – a emulátor spustený cez --run ho sám nemá. Preto:\nBasic26 files.abas --atr files.atr --run Čo sa stane:\nPrekladač preloží files.abas. Obraz files.atr neexistuje, tak ho vyrobí: čistá disketa s DOS 2.5. Uloží na ňu preložený program pod menom AUTORUN.SYS – súbor s týmto menom DOS po štarte sám spustí. --run naštartuje emulátor z tejto diskety. Disketa ostane vedľa programu. Súbory, ktoré na ňu program zapíše, na nej sú aj pri ďalšom spustení (kým files.atr nezmažeš).\nBasic26 --dir files.atr DOS 2, single density DOS.SYS\t37\t? DUP.SYS\t42\t? AUTORUN.SYS\t17\t? NOTES.TXT\t1\t? 610 free sector(s) Meno, veľkosť v sektoroch a voľné miesto. NOTES.TXT je súbor, ktorý program vyrobil pri behu v emulátore.\nVoľba --atr patrí do hlavičky programu, ktorý disketu potrebuje vždy:\nTurbo Basic XL 0 REM @COMPILE --atr files.atr Iný DOS DOS 2.5 je ten, ktorý Atari dodávalo. --dos vyberie iný: mydos, sparta (SpartaDOS), bwdos, litedos, wolfdos, alebo cestu k vlastnému obrazu diskety, ktorý sa použije ako vzor. Každý DOS spúšťa programy po štarte pod iným menom; prekladač to vie a použije správne.\nNávrat do DOS-u Preložený program po skončení stojí a nechá obrazovku tak, ako je. Program, ktorý sa má spúšťať z DOS-u ako nástroj a po skončení sa doň vrátiť, sa prekladá s --exit-to-dos.\nStarý program z diskety Súbor examples/oldies.atr je disketa, na ktorú niekto kedysi uložil program z Atari BASICu. Čo na nej je?\nBasic26 --dir oldies.atr DOS 2, single density DOS.SYS\t37\t? DUP.SYS\t42\t? STARS.BAS\t2\t? 626 free sector(s) Program STARS.BAS sa dá preložiť a spustiť rovno z diskety – meno súboru sa napíše za meno obrazu a dvojbodku:\nBasic26 oldies.atr:STARS.BAS -o stars.xex --sim * ** *** **** ***** Program uložený cez SAVE nie je text Keby si STARS.BAS z diskety vytiahol a otvoril v editore, uvidel by si nezmysly. Interpreter totiž program neukladá ako text, ale tak, ako ho má v pamäti: každý príkaz je jeden bajt, čísla sú v šiestich bajtoch, mená premenných v tabuľke na začiatku. Prekladač tento tvar pozná a číta ho priamo.\nKeď chceš program vidieť – a upravovať –, nechaj si ho vypísať:\nBasic26 oldies.atr:STARS.BAS --list stars.abas Vznikne súbor examples/stars.abas:\nAtari BASIC 10 REM STARS - AN OLD PROGRAM SAVED ON A DISK 20 FOR R=1 TO 5 30 FOR S=1 TO R:PRINT \"*\";:NEXT S 40 PRINT 50 NEXT R To je ten istý text, aký by na Atari vypísal príkaz LIST. Dá sa upraviť a preložiť ako každý iný program:\nBasic26 stars.abas --sim * ** *** **** ***** Výpis je v kódovaní UTF-8: grafické znaky Atari, ktoré v dobových programoch bývajú v textoch, sa prevedú na podobné znaky, ktoré editor na PC vie ukázať, a pri preklade zasa naspäť. Z výpisu vznikne bajt po bajte ten istý program ako z pôvodného súboru. --list-atascii nechá bajty tak, ako sú – to treba, keď má výpis ísť späť na disketu pre skutočné Atari.\nS voľbou -v prekladač povie, čo o programe zistil:\nreading oldies.atr:STARS.BAS (5 lines, ATASCII, SAVEd, Atari BASIC) Či ide o Atari BASIC alebo Turbo-BASIC XL, spozná sám podľa príkazov, ktoré v uloženom programe nájde.\nČo sa z uloženého programu nedá dostať Interpreter pri ukladaní zahodil medzery (okrem tých v textoch a komentároch) a všetko previedol na veľké písmená. Výpis ich preto nemá. Niektoré programy boli proti čítaniu chránené – zmazané mená premenných, pokazené dĺžky riadkov. Prekladač si s bežnými ochranami poradí; premenné bez mien dostanú vo výpise mená V0, V1$, V2(.\nProgram schovaný v .xex Dobové nástroje vedeli program v BASICu „zabaliť“ do spustiteľného súboru, ktorý si so sebou niesol kópiu pamäte interpretera. Aj z takého súboru sa dá program dostať:\nBasic26 hra.xex --save hra.bas --list hra.abas --save zapíše program tak, ako by ho uložil SAVE, --list ako text. (Samotný .xex na vstupe sa neprekladá – len sa z neho číta.)\nČeské výpisy z PC Texty českých hier sa na Atari písali vlastnou znakovou sadou, v ktorej písmená s diakritikou ležia na miestach iných znakov. Výpis, ktorý niekto prepísal na PC s normálnymi českými písmenami (v kódovaní Windows-1250), prevedie na kódy tejto sady voľba --from-cp1250.\nČasté chyby Čo sa stalo Čo sa stane program s D: spustený cez --run bez --atr ERROR- 130 – DOS nie je v pamäti súbor na diskete nie je (oldies.atr:NOFILE.BAS) error B26201: … file not found on the disk: NOFILE.BAS disketa je plná program sa na ňu neuloží; prekladač to ohlási --list s menom vstupného súboru error B26202 – prekladač nikdy neprepíše to, čo číta uložený program otvorený v editore nezmysly; použi --list .bas z Turbo-BASICu XL prečítaný ako Atari BASIC nestane sa – prekladač dialekt uloženého programu spozná sám Vyskúšaj si Daj hello.abas na disketu a spusti ju: Basic26 hello.abas --atr hello.atr --run. Potom si pozri jej obsah cez --dir. Vypíš STARS.BAS z diskety do súboru, zmeň počet riadkov hviezdičiek na 10 a prelož ho. Skús --dos mydos a porovnaj --dir s disketou s DOS 2.5. Zhrnutie .atr je obraz diskety; --atr disk.atr naň uloží program tak, aby sa spustil sám. Program so súbormi sa skúša cez --atr disk.atr --run. --dir disk.atr vypíše obsah diskety. disk.atr:MENO.BAS prekladá program rovno z diskety, aj uložený cez SAVE. --list súbor spraví z uloženého programu čitateľný text. Späť: 40. Nastavenia v zdrojáku · Ďalej: 42. Miesto v pamäti\n","t":"41. Diskety a dobové programy: --atr, --dir, --list, --save","u":"41-disky/"},{"c":"Na čo to je Program, ktorý si napíšeš sám, sa do pamäte zmestí a o tom, kde v nej leží, nemusíš vedieť nič. Túto kapitolu budeš potrebovať v dvoch prípadoch:\nveľký program, ktorému pri DIM dôjde pamäť (chyba 2), dobový program, ktorý počíta s tým, ako pamäť vyzerala v interpreteri: na pevnú adresu si dáva znakovú sadu, číta vlastné riadky REM, alebo má tempo postavené na pomalosti interpretera. Ako pamäť vyzerá Atari XL má 64 kilobajtov pamäte, ale program ich nemá všetky:\nAdresy Čo tam je $0000–$06FF pracovná pamäť operačného systému; šiesta stránka ($0600) je voľná pre krátky strojový kód $0700–$1FFF DOS, keď je nahratý $2000 … tvoj preložený program, za ním jeho texty a dáta … voľná pamäť pre reťazce a polia (DIM) – to, čo vracia FRE(0) $BC40–$BFFF obrazovka (v textovom režime; grafika zaberie viac a siaha nižšie) $C000–$FFFF operačný systém (ROM) a obvody Program na skúšanie Súbor examples/place.abas:\nAtari BASIC 10 REM Where the program lies and how much is left 20 PRINT \"Free for DIM: \";FRE(0) 30 PRINT \"Top of memory: \";PEEK(106)*256 40 PRINT \"The screen is at \";PEEK(88)+256*PEEK(89) Basic26 place.abas --sim Free for DIM: 37879 Top of memory: 49152 The screen is at 48192 Prvé číslo sa bude s verziou prekladača trochu meniť; dôležité je, ako ho menia voľby:\nVoľby Free for DIM (žiadne) 37 879 --rom-fp 38 605 --origin $0700 44 279 --reserve $8000-$8FFF 22 563 Keď dôjde pamäť Program skončí s ERROR- 2 pri DIM, hoci v interpreteri bežal. Preložený program totiž nie je vždy menší než ten istý program v interpreteri – nesie si so sebou knižnicu. Čo skúsiť, v tomto poradí:\n--rom-fp – asi o 1 700 bajtov menej, program počíta o niečo pomalšie. -O1 – až o 500 bajtov menej. --origin $0700 – program sa začne nižšie a získa 6 400 bajtov. Na adrese $0700 však býva DOS, takže to ide len pre program, ktorý nepracuje s disketou a spúšťa sa bez DOS-u (z emulátora cez --run, alebo zo zavádzača hier). --pack-text – texty zbalené na dve tretiny (kapitola 46). --text-under-rom – texty v pamäti, ktorú inak nevyužiješ (kapitola 46). Koľko pamäte zostáva: --memory a --memory-map Netreba čakať, kým program spadne na DIM. Voľba --memory po preklade povie, koľko pamäte program zaberá a koľko jej zostáva:\nBasic26 place.abas --memory Basic26: memory [#-----------------------------] 5 % full used by the program: 2121 bytes still free: 37847 bytes of it for DIM: 37847 bytes (the heap, which FRE(0) shows at the start) biggest free piece: 37847 bytes (counted between $2000 and $BC1F; --mem-lo and --mem-top change that, --memory-map lists every piece) Riadok of it for DIM je pamäť pre reťazce a polia – približne to, čo program na začiatku uvidí vo FRE(0). Biggest free piece je najväčší súvislý kus: nové pole sa musí zmestiť do jedného.\n--memory-map vypíše každý kus pamäte s adresami. Tu s pamäťou, ktorú si program necháva voľnú (--reserve, nižšie):\nBasic26 place.abas --memory-map --reserve '$8000-$8FFF' Basic26: memory $2000-$BC1F Basic26: program $2000-$27DB 2012 bytes Basic26: free $27DC-$7FFF 22564 bytes (the heap: DIM and strings) Basic26: reserved $8000-$8FFF 4096 bytes Basic26: program $9000-$9070 113 bytes Basic26: free $9071-$BC1F 11183 bytes Vidno z neho, prečo s --reserve klesne FRE(0) na 22 563: halda nepreskočí vyhradenú pamäť a nad ňou ostane 11 KB, na ktoré DIM nedosiahne. S oboma voľbami naraz príde najprv zoznam a za ním súhrn.\nPočíta sa od začiatku programu (--origin) po obrazovku ($BC1F); inak to povedia --mem-lo a --mem-top. Číslo sa s verziou prekladača trochu mení. Voľby sú tie isté ako v prekladači jazyka Action! Action26.\nVoľby Voľba Čo robí --origin adresa kde sa program začína (predvolene $2000) --ramtop adresa kde končí pamäť stroja, pre ktorý prekladáš (predvolene $C000) --reserve A-B pamäť od A po B nechaj voľnú – program ani jeho dáta tam nebudú; --memory ju počíta ako zabratú --memory po preklade súhrn: koľko pamäte program zaberá a koľko zostáva --memory-map každý kus pamäte s adresou: program, vyhradená, voľná, halda --mem-lo A, --mem-top A odkiaľ a pokiaľ --memory počíta (predvolene od --origin po obrazovku) --basic-screen obrazovka tam, kde ju mal program s interpreterom: $9C40 namiesto $BC40 --keep-rem riadky REM ostanú v pamäti tak, ako ich držal interpreter --line-delay N každý riadok programu chvíľu počká --exit-to-dos po skončení programu návrat do DOS-u (kapitola 41) Adresy sa píšu šestnástkovo s dolárom ($9800) alebo desiatkovo (38912). V PowerShelli daj adresu s dolárom do apostrofov ('$9800'), inak si ju PowerShell vyloží po svojom; v hlavičke REM @COMPILE apostrofy netreba.\n--reserve: pamäť, na ktorú program siaha sám Dobová hra si cez POKE ukladá mapu na adresy $7530–$797C. V interpreteri tam bolo voľno; preložený program by tam mohol mať svoje dáta a hra by si ich prepísala.\nBasic26 hra.abas --reserve '$7530-$797C' Prekladač tú oblasť obíde. Kód programu sa však rozdeliť nedá: musí sa celý zmestiť pred rezervu, za ňu idú už len texty, dáta a voľná pamäť.\nPOKE 106: posunutý koniec pamäte Najčastejší dobový trik: program zníži číslo na adrese 106 (koniec pamäte v stránkach), zavolá GRAPHICS a tým si nad obrazovkou vyhradí miesto na znakovú sadu alebo postavičky. Prekladač na to upozorní:\nwarning B26230: this program moves the top of memory (POKE 106); the compiled program reaches $2622, and whatever it reserves below that lands inside it Hlásenie hovorí, pokiaľ preložený program siaha. Ak je vyhradená oblasť nad touto adresou, je všetko v poriadku. Ak nie, treba program zmenšiť voľbami vyššie.\n--basic-screen: program písaný pre cartridge S cartridge BASICu končila pamäť na $A000 a obrazovka ležala na $9C40. Program, ktorý tie adresy má napísané natvrdo (vlastný zoznam displeja na $9C20, POKE rovno do obrazovky), sa prekladá s --basic-screen. Pamäť $A000–$BFFF, kde bola cartridge, pritom preložený program ďalej využíva.\n--keep-rem: program, ktorý číta sám seba Niektoré programy majú v riadkoch REM schované dáta – znakovú sadu alebo strojový kód – a čítajú ich rovno z pamäte, kde mal interpreter text programu. Prekladač komentáre bežne zahadzuje. Keď v úvodných riadkoch REM nájde bajty, ktoré nie sú text, nechá ich sám a upozorní:\nwarning B26231: this REM line holds bytes rather than text, so the REM lines the program begins with (10 to 10) are kept in memory the way the interpreter holds them --keep-rem nechá všetky riadky REM, --keep-rem=0-9,500 len vymenované, --keep-rem=none žiadne.\n--line-delay: tempo interpretera Melódia alebo animácia v dobovom programe je často načasovaná len tým, ako dlho interpreteru trvalo vykonať riadok. Preložená prebehne niekoľkokrát rýchlejšie. Lepšie je program opraviť – čakať podľa hodín (kapitola 18). Keď to nejde, dá sa spomaliť zvonka:\nBasic26 hra.abas --line-delay 369@9165-9190 Každý vykonaný riadok s číslom 9165 až 9190 počká 369 × 100 cyklov procesora (asi päťdesiatinu sekundy). Bez rozsahu (--line-delay 50) čaká každý riadok programu. Voľba sa dá zopakovať pre rôzne časti programu. Správne číslo treba nájsť skúšaním proti originálu.\nČasté chyby Čo sa stalo Čo sa stane --origin $0700 a program otvára D: DOS v pamäti nie je: ERROR- 130 --reserve uprostred kódu programu error B26227: the code runs from $2000 to $27DC and would have to keep out of $2100-$2200, which it cannot – pomôže nižší --origin alebo menší program adresa s $ bez apostrofov v PowerShelli PowerShell $9800 nahradí prázdnou premennou; prekladač dostane nezmysel --line-delay na celý program spomalí sa všetko, aj to, čo malo byť rýchle zabudnuté --basic-screen pri programe pre cartridge obraz je rozsypaný alebo program píše mimo obrazovky Vyskúšaj si Spusti place.abas s --origin '$0700' a s --rom-fp a porovnaj voľnú pamäť. Pridaj do place.abas riadok 15 DIM A(5000),B(1400) – dve polia, spolu vyše 38 kilobajtov – a zisti, s ktorými voľbami prejde a s ktorými skončí chybou 2. Pridaj --line-delay 2000 k programu for.abas z kapitoly 10 a spusti ho v emulátore. Zhrnutie Preložený program leží od $2000, za ním je voľná pamäť pre DIM. Na chybu 2 pomáha --rom-fp, -O1, --origin $0700 a voľby pre texty. --reserve A-B chráni pamäť, do ktorej program píše sám. --memory a --memory-map ukážu, koľko pamäte zostáva a kde. --basic-screen, --keep-rem a --line-delay sú pre dobové programy, ktoré počítajú s interpreterom. Späť: 41. Diskety a dobové programy · Ďalej: 43. Pribalené súbory\n","t":"42. Miesto v pamäti: --origin, --reserve, --memory, --basic-screen, --keep-rem, --line-delay","u":"42-miesto-v-pamati/"},{"c":"Na čo to je Hra nie je len program. Patrí k nej znaková sada, obrázok, mapa, hudba, kus strojového kódu. V interpreteri sa to všetko nahrávalo z diskety – zvlášť, po častiach, často zavádzačom, ktorý dnes nikto nemá. Prekladač vie také súbory pribaliť do výsledného .xex: nahrajú sa spolu s programom a program ich nájde tam, kde ich čaká.\nAko sa to píše Voľba Čo robí --embed súbor@adresa nahrá súbor do pamäte na danú adresu; program sa tomu miestu vyhne --embed súbor.xex nahrá časti iného .xex tam, kam samy patria (strojový kód, ktorý program volá cez USR) --patch adresa=bajt,bajt zmení bajty v tom, čo --embed nahral --file MENO=súbor pribalí súbor, ktorý program otvára menom (OPEN #1,4,0,\"D:MENO\") Voľby sa dajú opakovať. Patria do hlavičky REM @COMPILE (kapitola 40) – súbory sú súčasťou programu.\nCelý program: dáta na adrese Súbor examples/level.dat má 40 bajtov – mapu miestnosti, päť riadkov po osem znakov:\n######## #..$...# #.##.#.# #....*.# ######## (V súbore sú za sebou bez koncov riadkov.) Súbor examples/embed.abas ho má pribalený na adrese $9000, desiatkovo 36864:\nAtari BASIC 0 REM @COMPILE --embed level.dat@$9000 10 REM A file carried in the program: a map at address $9000 20 A=36864 30 FOR R=0 TO 4 40 FOR C=0 TO 7 50 PRINT CHR$(PEEK(A+R*8+C)); 60 NEXT C 70 PRINT 80 NEXT R Preklad a spustenie Basic26 embed.abas --sim Čo uvidíš ######## #..$...# #.##.#.# #....*.# ######## Ako to funguje Riadok 0: prekladač pri preklade prečíta level.dat z priečinka programu a vloží ho do embed.xex. Pri nahrávaní programu sa tých 40 bajtov uloží na adresy $9000–$9027. Riadok 50: program ich číta obyčajným PEEK. Nemusel nič otvárať ani nahrávať – dáta sú v pamäti skôr, než sa vykoná prvý riadok. Prekladač vie, že na $9000 niečo leží, a vyhne sa tomu: voľná pamäť pre DIM sa rozdelí tak, aby reťazce a polia súbor neprepísali. Znaková sada Najčastejšie použitie. Znaková sada Atari má 1 024 bajtov (128 znakov po 8 bajtoch) a musí začínať na adrese deliteľnej 1024:\nTurbo Basic XL 0 REM @COMPILE --embed myfont.fnt@$9800 10 POKE 756,152:REM 152 = $98, the page the font begins on 20 PRINT \"Text in my own letters\" Adresa 756 hovorí Atari, na ktorej stránke pamäte (adresa delená 256) znaková sada leží. Jeden POKE – a celá obrazovka má iné písmo. Tak sú urobené české a slovenské textové hry: písmená s diakritikou sú nakreslené v sade na miestach menej používaných znakov.\nPísmená s diakritikou: --charmap Atari písmená ako č alebo š nemá. Keď ich napíšeš do textu programu, prekladač nevie, na ktorom mieste ich tvoja znaková sada má – urobí z nich otáznik a upozorní na to:\nwarning B26210: a character ATASCII does not have is a '?' in the program (--charmap says where the program's character set keeps it) Povedz mu to súborom s mapou znakov. Je to obyčajný text (UTF-8), na každom riadku znak, medzera a jeho kód v sade – desiatkovo, alebo so znakom $ šestnástkovo. Riadok, ktorý sa začína bodkočiarkou, je poznámka. Súbor examples/letters.map:\n; letters.map - where the character set keeps the Czech letters á $01 č $03 ě $05 š $13 ž $1A Program examples/letters.abas si ho pýta voľbou --charmap:\nAtari BASIC 0 REM @COMPILE --charmap letters.map 10 REM Czech letters go where the program's character set keeps them 20 DIM A$(10) 30 A$=\"čaj\" 40 FOR I=1 TO LEN(A$) 50 PRINT ASC(A$(I,I)) 60 NEXT I 3 97 106 Písmeno č je v programe jeden bajt s kódom 3 – so znakovou sadou, ktorá má na tom mieste nakreslené č, ho PRINT ukáže správne. Mapa platí pre texty v úvodzovkách aj pre DATA. Smú v nej byť len znaky, ktoré Atari nemá; obyčajné písmená a číslice ostávajú, čím sú.\nText rovno do pamäte obrazovky: --screen-codes Pamäť obrazovky nedrží znaky v tých istých kódoch ako PRINT (kapitola D): medzera je tam 0 a A 33. Program, ktorý píše na obrazovku sám – cez POKE alebo MOVE –, musí každý znak prepočítať, a to je v BASICu pomalé.\nS voľbou --screen-codes uloží prekladač každý text v úvodzovkách už prepočítaný. Celé slovo alebo riadok potom zapíše jeden príkaz:\nTurbo Basic XL T$=\"Ahoj\" MOVE ADR(T$),DPEEK(88)+40,LEN(T$) Platí to pre všetky texty v programe naraz. Čo ide cez PRINT alebo ako meno súboru do OPEN, vyjde zle – voľba je pre program, ktorý nič z toho nerobí. DATA ostávajú, ako boli.\nStrojový kód z iného súboru Turbo Basic XL 0 REM @COMPILE --embed engine.xex Súbor .xex nesie v sebe adresy, kam jeho časti patria, preto sa adresa nepíše. Prekladač z neho vezme všetky časti okrem pokynu „spusti sa“ – spustiť sa má tvoj program, nie pribalený. Tak sa k preloženej hre pripája pôvodný strojový kód (rutiny na zvuk, kreslenie, hudbu), ktorý hra volá cez USR.\nKeď má pribalený kód bajt, ktorý v preloženom programe prekáža – napríklad zapína BASIC, ktorý už netreba –, opraví ho --patch:\nTurbo Basic XL 0 REM @COMPILE --embed engine.xex --patch $9168=$FF Súbor, ktorý program otvára Niektoré programy svoje dáta nečítajú z pamäte, ale zo súboru: OPEN #1,4,0,\"D:LEVEL.DAT\". Aby si k takému programu nemusel robiť disketu, dá sa súbor pribaliť aj tak. Súbor examples/carried.abas:\nAtari BASIC 0 REM @COMPILE --file D:LEVEL.DAT=level.dat 10 REM A file the program opens by name, carried inside it 20 OPEN #1,4,0,\"D:LEVEL.DAT\" 30 TRAP 90 40 FOR C=1 TO 8 50 GET #1,K:PRINT CHR$(K); 60 NEXT C 70 PRINT 80 GOTO 40 90 CLOSE #1 100 PRINT \"That was the whole file\" Basic26 carried.abas --run Program vypíše tú istú mapu a pod ňu That was the whole file – bez diskety a bez DOS-u. OPEN mena D:LEVEL.DAT číta z pamäte programu; čítanie za koncom je chyba 136 ako pri skutočnom súbore. Pribalený súbor sa dá len čítať; zápis doň je chyba 135. Iné mená idú ďalej na skutočnú disketu, ak nejaká je.\nTento program skúšaj v emulátore: simulátor má vlastné zaobchádzanie so súbormi a pribalený súbor nevidí.\n--embed alebo --file? --embed súbor@adresa --file MENO=súbor program dáta číta z pamäte (PEEK, USR, POKE 756) otvára menom (OPEN) kde ležia na adrese, ktorú určíš v programe, miesto vyberie prekladač typické použitie znaková sada, strojový kód, obrázok dobový program, ktorý si dáta nahráva sám Súbory sa dajú pribaliť aj do pamäte, ktorú program bežne nevidí – pod operačný systém a do rozšírenej pamäte (--embed súbor@$C000, --embed súbor@1:$4000). O tom je kapitola 44.\nČasté chyby Čo sa stalo Čo sa stane súbor nie je v priečinku programu error B26201: súbor sa nenašiel znaková sada na adrese, ktorá nie je násobkom 1024 písmená sú rozsypané písmeno s diakritikou v texte a žiadna mapa warning B26210, v programe je namiesto neho ? v mape je obyčajné písmeno (a $01) error B26200: mapa je len pre znaky, ktoré Atari nemá --screen-codes a PRINT \"TEXT\" na obrazovke sú iné znaky – text je v kódoch pamäte obrazovky adresa zasahuje do kódu programu chyba prekladu ako pri --reserve (kapitola 42) adresa zasahuje do obrazovky ($BC40 a vyššie) súbor sa prepíše pri prvom výpise program s --file v simulátore ERROR- 170 – skúšaj v emulátore --embed hra.xex vrátane pokynu na spustenie netreba sa báť: adresu spustenia prekladač vynechá Vyskúšaj si Zmeň v level.dat mapu (v ľubovoľnom editore, 40 znakov bez koncov riadkov) a prelož embed.abas znova. Prelož embed.abas s voľbou --patch '$9000=65,66' a pozri, čo sa zmenilo v prvom riadku mapy. Uprav embed.abas, aby v mape našiel znak $ a vypísal jeho riadok a stĺpec. Zhrnutie --embed súbor@adresa nahrá súbor s programom na danú adresu; program ho číta cez PEEK. --embed súbor.xex pripojí strojový kód iného programu. --patch zmení v pribalenom jednotlivé bajty. --file MENO=súbor pribalí súbor, ktorý program otvára cez OPEN. --charmap súbor povie, kde má znaková sada programu písmená s diakritikou; --screen-codes uloží texty tak, ako ich drží pamäť obrazovky. Voľby patria do REM @COMPILE, cesty sú od priečinka programu. Späť: 42. Miesto v pamäti · Ďalej: 44. Skrytá pamäť\n","t":"43. Pribalené súbory: --embed, --patch, --file","u":"43-pribalene-subory/"},{"c":"Na čo to je Atari XL má 64 kilobajtov pamäte, ale štvrtinu z nich zakrýva operačný systém: na adresách $C000–$FFFF procesor vidí ROM, a RAM, ktorá leží „pod ňou“, je bežne nedostupná. Atari 130XE a rôzne rozšírenia majú navyše desiatky až stovky kilobajtov v bankách – kusoch pamäte, z ktorých je naraz vidieť len jeden, cez okno na adresách $4000–$7FFF.\nV interpreteri sa k tejto pamäti dalo dostať len strojovým kódom a s rizikom, že počítač zamrzne. Basic26 má na ňu vlastné slová, ktoré nepozná žiadny interpreter. Program cez ne číta a zapisuje skrytú pamäť tak jednoducho ako cez PEEK a POKE – obrazovka, zvuk aj klávesnica pritom bežia ďalej.\nNa čo to je dobré: 14 kilobajtov pod ROM je miesto na texty hry, mapy, obrázky, uloženú pozíciu. Program v hlavnej pamäti tak môže byť väčší.\nZapnutie Slová platia len s voľbou --xmem:\nTurbo Basic XL 0 REM @COMPILE --xmem Bez nej sú XPEEK, XBANKS a ostatné obyčajné mená premenných – tak, ako mohli byť v dobovom programe.\nBanka a adresa Každé slovo dostane dve čísla: banku a adresu.\nBanka Čo to je 0 hlavná pamäť; od adresy $C000 (49152) vyššie je to RAM pod ROM 1 až XBANKS banky rozšírenej pamäte; adresa musí byť v okne $4000–$7FFF (16384–32767) Pod ROM nie je voľné všetko:\nAdresy Desiatkovo Čo tam je $C000–$CFFF 49152–53247 voľné, 4 KB $D000–$D7FF 53248–55295 obvody počítača – nedá sa čítať ani písať $D800–$DFFF 55296–57343 voľné, 2 KB $E000–$E3FF 57344–58367 kópia znakovej sady – nezapisovať $E400–$FFF9 58368–65529 voľné, 7 KB Koľko bánk stroj má, povie funkcia XBANKS:\nStroj XBANKS 800XL, 65XE (64 KB) 0 130XE 4 rozšírenia na 320 KB 16 rozšírenia na 1 MB 64 Jedna banka má 16 kilobajtov.\nSlová Zápis Čo robí XBANKS funkcia: počet bánk rozšírenej pamäte XPEEK(b,a) funkcia: bajt z banky b, adresy a XDPEEK(b,a) funkcia: dvojbajtové číslo XPOKE b,a,v zapíše bajt XDPOKE b,a,v zapíše dvojbajtové číslo XFILL b,a,n,v vyplní n bajtov hodnotou v XMOVE sb,s,db,d,n skopíruje n bajtov z banky sb, adresy s do banky db, adresy d XPUT b,a,A$ zapíše znaky reťazca XGET$(b,a,n) funkcia: reťazec z n bajtov Celý program Súbor examples/xmem.abas:\nAtari BASIC 0 REM @COMPILE --xmem 10 REM Hidden memory: the RAM under the ROM and the banks 20 PRINT \"Banks of extended memory: \";XBANKS 30 REM Bank 0 from 49152 on is the RAM under the operating system 40 XPOKE 0,49152,123 50 PRINT \"Under the ROM: \";XPEEK(0,49152) 60 PRINT \"The ROM itself: \";PEEK(49152) 70 XDPOKE 0,49154,12345 80 PRINT \"Two bytes: \";XDPEEK(0,49154) 90 DIM A$(20):A$=\"HELLO, HIDDEN RAM\" 100 XPUT 0,55296,A$ 110 PRINT XGET$(0,55296,5) 120 XFILL 0,58368,100,42 130 XMOVE 0,55296,0,58368,5 140 PRINT XGET$(0,58368,8) 150 IF XBANKS=0 THEN PRINT \"This machine has no banks\":END 160 FOR B=1 TO XBANKS:XPOKE B,16384,B*10:NEXT B 170 FOR B=1 TO XBANKS:PRINT XPEEK(B,16384);\" \";:NEXT B 180 PRINT Preklad a spustenie Simulátor vie byť rôznymi strojmi. Voľba --sim-mem hovorí ktorým:\nBasic26 xmem.abas --sim --sim-mem 130xe Čo uvidíš Na Atari 130XE:\nBanks of extended memory: 4 Under the ROM: 123 The ROM itself: 17 Two bytes: 12345 HELLO HELLO*** 10 20 30 40 A na obyčajnom 800XL (--sim-mem 64):\nBasic26 xmem.abas --sim --sim-mem 64 Banks of extended memory: 0 Under the ROM: 123 The ROM itself: 17 Two bytes: 12345 HELLO HELLO*** This machine has no banks Ako to funguje Riadky 40 až 60: XPOKE zapíše 123 do RAM pod ROM na adrese 49152. XPEEK ho odtiaľ prečíta. Obyčajný PEEK na tej istej adrese vidí ROM – iný bajt, 17. Sú to dve rôzne pamäte na jednej adrese. Riadky 70 a 80: dvojbajtové číslo, ako DPOKE a DPEEK v Turbo-BASICu XL. Riadok 100: XPUT uloží text reťazca pod ROM – len znaky, bez dĺžky. Riadok 110: XGET$ z nich spraví reťazec, ktorý sa dá vypísať, priradiť alebo porovnať. Dĺžku treba povedať. Riadok 120: sto hviezdičiek (kód 42) od adresy 58368. Riadok 130: XMOVE skopíruje päť bajtov spod ROM inde pod ROM. Zdroj a cieľ môžu byť v rôznych bankách, alebo jeden z nich v hlavnej pamäti – napríklad XMOVE 0,ADR(A$),1,16384,LEN(A$) skopíruje reťazec do banky 1. Riadok 150: program, ktorý má bežať aj na stroji bez rozšírenia, sa najprv spýta. Slučka na riadku 160 by na 64 KB stroji prebehla raz (FOR v Atari BASICu vždy aspoň raz) a skončila chybou. Riadky 160 a 170: do každej banky iné číslo na tú istú adresu 16384 – a z každej sa prečíta to svoje. Nové chyby Číslo Kedy 60 banka, ktorú stroj nemá 3 adresa mimo povoleného rozsahu: obvody, kópia znakovej sady, banka s adresou mimo okna 2 XGET$ dlhší, než je voľnej pamäte Dajú sa zachytiť cez TRAP ako každá iná.\nNa čo si dať pozor RAM-disk. DOS na 130XE vie banky používať ako rýchlu „disketu“ D8:. Program o nej nevie a zápisom do banky jej súbory zničí. XGET$ si miesto požičiava z voľnej pamäte, len na chvíľu. Dlhý reťazec potrebuje aspoň toľko voľného miesta (FRE(0)). Strojový kód pod ROM. Ak pribalený strojový kód (kapitola 43) používa RAM pod ROM sám, pobije sa s tvojimi XPOKE o miesto. Prekladač to nevidí. Emulátor. Program, ktorý používa len RAM pod ROM, beží na každom XL a XE. Program s bankami potrebuje emulátor nastavený ako 130XE alebo stroj s rozšírením. Časté chyby Čo sa stalo Čo sa stane chýba --xmem error B26017 na prvom slove – berie sa ako meno premennej banka 1 na stroji bez rozšírenia ERROR- 60 AT LINE 160 zápis do obvodov alebo znakovej sady (XPOKE 0,53248,…, XPOKE 0,57344,…) ERROR- 3 hodnota nad 255 ERROR- 3 banka 0 a adresa pod 49152 to isté ako PEEK a POKE – obyčajná hlavná pamäť adresa v banke mimo 16384–32767 banka sa overí, ale číta sa hlavná pamäť Vyskúšaj si Ulož pod ROM desať čísel (XPOKE v slučke od adresy 49152) a prečítaj ich v opačnom poradí. Spusti program so --sim-mem rambo320. Koľko bánk hlási? Ulož text do banky 1 cez XPUT, do banky 2 iný, a vypíš oba cez XGET$. Skús to aj so --sim-mem 64 a chybu 60 zachyť cez TRAP. Zhrnutie --xmem zapne slová pre RAM pod ROM a banky rozšírenej pamäte. Banka 0 s adresou od 49152 je RAM pod ROM (14 KB voľných); banky 1 až XBANKS majú okno 16384–32767. XPEEK, XPOKE, XDPEEK, XDPOKE pre bajty a čísla; XFILL, XMOVE pre bloky; XPUT, XGET$ pre texty. Chyba 60 znamená banku, ktorá nie je. Simulátor skúša rôzne stroje cez --sim-mem. Späť: 43. Pribalené súbory · Ďalej: 45. Skrytá pamäť v praxi\n","t":"44. Skrytá pamäť: XBANKS, XPEEK, XPOKE, XDPEEK, XDPOKE, XMOVE, XFILL, XPUT, XGET$","u":"44-skryta-pamat/"},{"c":"Na čo to je Kapitola 44 ukázala, ako do skrytej pamäte zapísať bajt a prečítať ho. Táto ukazuje, ako ju naozaj využiť: dáta sa do nej nahrajú spolu s programom, texty sa vypisujú rovno z nej a obrazovka sa dá pripraviť v banke, kým sa díva iná.\nDáta nahraté s programom Voľba --embed z kapitoly 43 vie súbor uložiť aj do skrytej pamäte:\nZápis Kam súbor pôjde --embed súbor@$C000 pod ROM, od danej adresy --embed súbor@1:$4000 do banky 1 (číslo banky, dvojbodka, adresa v okne $4000–$7FFF) Program, ktorý potrebuje banky, to pri štarte overí sám. Na stroji, ktorý ich nemá, vypíše napríklad 1 BANKS OF EXTENDED MEMORY NEEDED a skončí.\nSlová Zápis Čo robí XPRINT b,a,s vypíše text od adresy a v banke b až po bajt s hodnotou s (ten už nie) XPRINT #k,b,a,s to isté do kanála k (súbor, tlačiareň) XBGET #k,b,a,n prečíta n bajtov zo súboru do banky alebo pod ROM XBPUT #k,b,a,n zapíše n bajtov z banky alebo spod ROM do súboru XBANK b banka b ostane v okne natrvalo: PEEK a POKE na $4000–$7FFF siahajú do nej XANTIC b obrazovka sa číta z banky b, procesor ostáva v hlavnej pamäti Celý program: texty pod ROM Textová hra má stovky viet. V hlavnej pamäti zaberajú miesto programu; pod ROM neprekážajú nikomu. Súbor examples/rooms.dat obsahuje tri texty za sebou, každý ukončený bajtom 0. Súbor examples/xprint.abas:\nAtari BASIC 0 REM @COMPILE --xmem --embed rooms.dat@$C000 10 REM Texts kept under the ROM and printed from there 20 A=49152 30 FOR R=1 TO 3 40 PRINT R;\": \"; 50 XPRINT 0,A,0 60 PRINT 70 REM Step over the text and the nought that ends it 80 IF XPEEK(0,A)\u003c\u003e0 THEN A=A+1:GOTO 80 90 A=A+1 100 NEXT R 110 PRINT \"The texts take \";A-49152;\" bytes under the ROM\" Preklad a spustenie Basic26 xprint.abas --sim --sim-mem 64 Čo uvidíš 1: You are in a dark cellar. 2: A narrow corridor leads north. 3: Daylight at last! The texts take 75 bytes under the ROM Ako to funguje Riadok 0: rooms.dat sa nahrá pod ROM od adresy $C000 (49152). Program beží na každom XL a XE, banky nepotrebuje. Riadok 50: XPRINT 0,A,0 vypíše text od adresy A po najbližší bajt 0. Dĺžku netreba vedieť a text nikdy neprejde cez hlavnú pamäť programu – môže byť ľubovoľne dlhý. Koniec riadka XPRINT nepridáva, preto je za ním PRINT. Riadky 80 a 90: program si nájde začiatok ďalšieho textu: preskočí znaky až po nulu a nulu samu. Skutočná hra by si začiatky textov nehľadala zakaždým, ale mala by ich v poli alebo v DATA: XPRINT 0,T(ROOM),0.\nTretie číslo je znak, ktorým text končí. Nula je zvyk; hodí sa aj 155 (koniec riadka) pre texty uložené po riadkoch.\nDruhý program: banky a súbory Súbor examples/xbank.abas má tie isté texty v banke 1 a ukazuje presun medzi bankou a súborom:\nAtari BASIC 0 REM @COMPILE --xmem --embed rooms.dat@1:$4000 10 REM The same texts in a bank of extended memory 20 PRINT \"Banks: \";XBANKS 30 XPRINT 1,16384,0 40 PRINT 50 REM A file into a bank and back out of it 60 OPEN #1,8,0,\"D:COPY.DAT\" 70 XBPUT #1,1,16384,25 80 CLOSE #1 90 OPEN #1,4,0,\"D:COPY.DAT\" 100 XBGET #1,2,16384,25 110 CLOSE #1 120 PRINT XGET$(2,16384,25) Basic26 xbank.abas --sim --sim-mem 130xe Banks: 4 You are in a dark cellar. You are in a dark cellar. Riadok 70: XBPUT zapíše 25 bajtov z banky 1 do súboru – ako BPUT v Turbo-BASICu XL (kapitola 34), ale zdroj je v banke. Riadok 100: XBGET ich prečíta do banky 2. Takto sa do bánk nahráva, čo sa do programu pribaliť nedá alebo nechce: ďalšia úroveň hry, uložená pozícia. Na stroji bez bánk:\nBasic26 xbank.abas --sim --sim-mem 64 1 BANKS OF EXTENDED MEMORY NEEDED XBANK: banka ako obyčajná pamäť Po XBANK 1 je banka 1 v okne $4000–$7FFF stále. Obyčajné PEEK, POKE, MOVE aj strojový kód cez USR tam potom pracujú s bankou; XBANK 0 vráti hlavnú pamäť.\nTurbo Basic XL 0 REM @COMPILE --xmem --reserve $4000-$7FFF 10 XBANK 1:POKE 16384,77:XBANK 0 20 PRINT PEEK(16384);\" \";XPEEK(1,16384) vypíše 0 77. Háčik je v hlavičke: XBANK smie len program preložený s --reserve $4000-$7FFF. Bez toho by v okne ležal sám program a banka by ho zakryla – prekladač to odmietne (error B26056). S rezervou musí kód programu skončiť pod $4000 a voľná pamäť pre DIM začína až na $8000.\nXANTIC: obrazovka v banke Atari 130XE vie niečo zvláštne: obvod, ktorý kreslí obraz (ANTIC), sa môže dívať do inej banky než procesor. XANTIC 1 povie: „obraz ber z banky 1“. Program tak môže mať v bankách pripravených niekoľko obrazoviek a prepínať medzi nimi okamžite, alebo novú obrazovku kresliť tam, kam sa práve nikto nedíva. XANTIC 0 to vráti.\nFunguje to na 130XE a rozšíreniach, ktoré to tiež vedia; na ostatných (napríklad RAMBO) skončí chybou 60. Obrazovka v banke sa nedá vyskúšať v simulátore – ten obraz nekreslí.\nProgram a dáta zvlášť Hra s veľa dátami v bankách sa dlho nahráva. Dá sa preložiť na dva súbory:\nBasic26 xbank.abas --data-only -o xbank.dat Basic26 xbank.abas --code-only -o xbank.xex xbank.dat obsahuje len to, čo ide do bánk a pod ROM. xbank.xex je program bez dát. Na Atari sa nahrá najprv xbank.dat, potom xbank.xex. Program pri štarte skontroluje, či dáta na mieste sú; ak nie, vypíše THE DATA FILE IS NOT LOADED a skončí. Pri ladení potom stačí znova nahrať len krátky program. Oba súbory musia byť preložené s rovnakými voľbami.\nČasté chyby Čo sa stalo Čo sa stane program s bankami na stroji bez nich 1 BANKS OF EXTENDED MEMORY NEEDED text pre XPRINT nemá ukončovací bajt vypisuje sa ďalej, kým nenarazí na obvody alebo koniec pamäte: ERROR- 3 XBANK bez --reserve $4000-$7FFF error B26056 XANTIC na stroji, ktorý to nevie ERROR- 60 súbor pre banku je dlhší než 16 KB do okna sa nezmestí – chyba prekladu --data-only a --code-only s rôznymi voľbami program dáta hľadá inde: THE DATA FILE IS NOT LOADED, alebo nezmysly Vyskúšaj si Pridaj do rooms.dat štvrtý text (v editore, ktorý vie vložiť bajt 0, alebo si súbor vyrob programom z kapitoly 24 cez PUT #1,0). Uprav xprint.abas: najprv prejdi texty a zapamätaj si ich začiatky v poli, potom ich vypíš v opačnom poradí. Prelož xbank.abas s -v a pozri, čo prekladač hovorí o bankách. Zhrnutie --embed súbor@$C000 a --embed súbor@1:$4000 nahrajú dáta pod ROM a do banky spolu s programom. XPRINT b,a,s vypíše text rovno zo skrytej pamäte, po ukončovací bajt. XBGET a XBPUT presúvajú dáta medzi súborom a skrytou pamäťou. XBANK dá banku do okna natrvalo (s --reserve $4000-$7FFF), XANTIC z nej berie obraz. --data-only a --code-only rozdelia hru na dáta a program. Späť: 44. Skrytá pamäť · Ďalej: 46. Kompresia\n","t":"45. Skrytá pamäť v praxi: XPRINT, XBGET, XBPUT, XBANK, XANTIC","u":"45-skryta-pamat-2/"},{"c":"Na čo to je Pamäte je na Atari málo a dáta sa často opakujú: obrazovka je z polovice prázdna, texty sa skladajú z tých istých slov. Kompresia (zbalenie) také dáta zapíše úspornejšie; pred použitím sa rozbalia naspäť.\nBasic26 vie dve veci:\nzbaliť ľubovoľný súbor (obrázok, mapu, obrazovku) a v programe ho rozbaliť príkazom XUNPACK, zbaliť texty programu – bez jedinej zmeny v programe, len voľbou prekladača. Zbalenie súboru: --pack Basic26 súbor --pack -o zbalený Basic26 zbalený --unpack -o pôvodný S --pack prekladač nič neprekladá: vstup je hocijaký súbor a výstup ten istý súbor zbalený. --unpack robí opak (na kontrolu).\nSúbor examples/title.scr je titulná obrazovka: 960 bajtov, presne toľko, koľko má textová obrazovka (40 × 24).\nBasic26 title.scr --pack -o title.pak -v packed title.scr: 960 -\u003e 82 bytes (ZX02) Z 960 bajtov je 82. (Obrazovka plná medzier a hviezdičiek sa balí výborne; fotografia by dopadla horšie.) Metóda sa volá ZX02 – je to obľúbený formát malých počítačov, lebo rozbaľovací program je kratučký. Keď sa súbor zbaliť nedá, uloží sa tak, ako je, a XUNPACK si poradí aj s tým.\nRozbalenie v programe: XUNPACK Turbo Basic XL XUNPACK zdrojová banka,zdrojová adresa,cieľová banka,cieľová adresa Banka a adresa sú tie isté ako v kapitole 44: banka 0 je hlavná pamäť a od $C000 RAM pod ROM. Dĺžku si zbalené dáta nesú samy. XUNPACK je jedno zo slov rozšírenej pamäte, takže program potrebuje --xmem.\nCelý program Súbor examples/unpack.abas má zbalenú obrazovku pod ROM a rozbalí ju rovno do pamäte obrazovky:\nAtari BASIC 0 REM @COMPILE --xmem --embed title.pak@$C000 10 REM A packed screen under the ROM, unpacked onto the screen 20 GRAPHICS 0:POKE 752,1 30 SCR=PEEK(88)+256*PEEK(89) 40 XUNPACK 0,49152,0,SCR Preklad a spustenie Basic26 unpack.abas --run alebo v simulátore, ktorý na konci ukáže obrazovku:\nBasic26 unpack.abas --sim --sim-mem 64 --sim-screen Čo uvidíš ************************************** * * * * * THE CELLAR * * * * A SMALL ADVENTURE * * * * PRESS START * * * ************************************** . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ako to funguje Riadok 0: 82 bajtov zbalenej obrazovky sa nahrá pod ROM na adresu $C000. V hlavnej pamäti nezaberajú nič. Riadok 30: adresa pamäte obrazovky (kapitola 18). Riadok 40: XUNPACK číta zbalené dáta spod ROM (banka 0, adresa 49152) a rozbalených 960 bajtov píše do hlavnej pamäte od adresy obrazovky. Celá obrazovka sa objaví naraz – žiadnych 24 príkazov PRINT. Zdroj aj cieľ môžu byť kdekoľvek: v hlavnej pamäti, pod ROM, v rôznych bankách. Obrázok sa dá rozbaliť z banky 1 na obrazovku, mapa spod ROM do reťazca (ADR(M$)).\nPoznámka k súboru title.scr: sú v ňom kódy obrazovky, nie ATASCII. Obrazovka Atari si znaky ukladá pod inými číslami, než aké má CHR$ – medzera je 0, A je 33. Najjednoduchšie je nechať si obrazovku nakresliť programom a uložiť ju cez BPUT #1,DPEEK(88),960 (kapitola 34).\nTexty programu Textová hra je z veľkej časti text v príkazoch PRINT. Tri voľby s ním vedia naložiť úspornejšie – program sa pritom nemení:\nVoľba Čo robí --pack-text zbalí texty slovníkom častých dvojíc znakov; zaberú asi dve tretiny --text-under-rom presunie texty do RAM pod ROM; hlavná pamäť ostane programu --text-in-banks presunie texty do bánk rozšírenej pamäte (--text-in-banks=2 najviac do dvoch) Týkajú sa textov v úvodzovkách dlhých 8 až 255 znakov. Pri použití sa text na chvíľu skopíruje (a rozbalí) do voľnej pamäte, vypíše a miesto sa uvoľní.\nSúbor examples/texts.abas má dvadsať viet:\nAtari BASIC 10 REM A program with a lot of text 20 PRINT \"You are standing in a dark cellar under the old house.\" 30 PRINT \"The walls are wet and the air smells of earth and mould.\" 40 PRINT \"A narrow corridor leads north, deeper under the house.\" 50 PRINT \"Somewhere in the dark you can hear water dripping slowly.\" 60 PRINT \"On the floor lies an old rusty key and a broken lantern.\" 70 PRINT \"The stairs behind you have fallen in. There is no way back.\" 80 PRINT \"The corridor turns east and ends at a heavy wooden door.\" 90 PRINT \"The door is locked. Its keyhole is full of rust and dust.\" 100 PRINT \"You are in a small round room with a well in the middle.\" 110 PRINT \"The water in the well is black and you cannot see the bottom.\" 120 PRINT \"A rope hangs down into the well. It looks old but strong.\" 130 PRINT \"You climb down the rope into the dark and the cold.\" 140 PRINT \"At the bottom of the well there is a low tunnel going west.\" 150 PRINT \"The tunnel is so low that you have to go on your knees.\" 160 PRINT \"You are in a large cave. Something is shining in the corner.\" 170 PRINT \"In the corner of the cave stands an old chest bound with iron.\" 180 PRINT \"The chest is open. It is full of old coins and broken glass.\" 190 PRINT \"A cold wind is blowing from a crack in the wall of the cave.\" 200 PRINT \"Behind the crack you can see daylight and hear the birds.\" 210 PRINT \"You are out in the garden behind the old house. Well done!\" Basic26 texts.abas --pack-text -v texts packed: 20, 1145 -\u003e 712 bytes with the dictionary wrote texts.xex (2110 bytes, 6 segment(s), 2078 bytes of program) Dvadsať textov, 1 145 znakov, sa zmestilo do 712 bajtov vrátane slovníka. Bez voľby má program 2 289 bajtov, s ňou 2 110 – hoci pribudol rozbaľovač. Pri skutočnej hre s desiatkami kilobajtov textu sú to kilobajty.\nBasic26 texts.abas --text-under-rom --pack-text -v texts under the ROM: $E400-$E631 (562 bytes) texts left in the program: 0 bytes texts packed: 20, 1145 -\u003e 712 bytes with the dictionary Teraz texty neležia v hlavnej pamäti vôbec. Výstup programu je pri všetkých voľbách ten istý:\nBasic26 texts.abas --text-under-rom --pack-text --sim --sim-mem 64 Ktorú voľbu kedy --pack-text samotná: program je menší, beží na každom stroji a s ničím sa nebije. Dobrá prvá voľba. Program s pár riadkami textu sa nezbalí – slovník by stál viac, než by ušetril. --text-under-rom: uvoľní najviac hlavnej pamäte (až 13 KB). Nehodí sa, keď RAM pod ROM používa pribalený strojový kód. obe naraz: pod ROM sa zmestí o polovicu viac textu. --text-in-banks: pre naozaj veľké hry; program potom potrebuje stroj s bankami a inde sa nespustí. Voľby patria do hlavičky programu:\nTurbo Basic XL 0 REM @COMPILE --pack-text --text-under-rom Časté chyby Čo sa stalo Čo sa stane XUNPACK na dáta, ktoré nezbalil --pack ERROR- 3 – neznámy formát cieľ rozbalenia zasahuje do obvodov alebo znakovej sady pod ROM ERROR- 3 cieľ je menší než rozbalené dáta prepíše sa, čo leží za ním XUNPACK bez --xmem berie sa ako meno premennej: chyba prekladu --text-in-banks na 64 KB stroji 1 BANKS OF EXTENDED MEMORY NEEDED --pack-text pri krátkom programe nič sa nezbalí (texts packed: 0) a program sa nezmení Vyskúšaj si Zbaľ rooms.dat z kapitoly 45 a pozri, koľko sa ušetrilo. Prečo tak málo? Prelož texts.abas so všetkými štyrmi kombináciami volieb a s -v; porovnaj veľkosti. Nakresli v programe vlastnú titulnú obrazovku, ulož ju cez BPUT na disketu (v emulátore), zbaľ a ukáž ju cez XUNPACK. Zhrnutie --pack zbalí ľubovoľný súbor, XUNPACK sb,s,db,d ho v programe rozbalí – odkiaľkoľvek kamkoľvek. --pack-text zbalí texty programu asi na dve tretiny. --text-under-rom a --text-in-banks texty presunú zo hlavnej pamäte preč. Program sa kvôli tomu nemení; stačí riadok REM @COMPILE. Späť: 45. Skrytá pamäť v praxi · Ďalej: 47. Program bez čísel riadkov\n","t":"46. Kompresia: --pack, XUNPACK, --pack-text, --text-under-rom, --text-in-banks","u":"46-kompresia/"},{"c":"Na čo to je Čísla riadkov sú dedičstvo editora na Atari: určovali poradie riadkov a boli jediným spôsobom, ako niekam skočiť. V textovom editore na PC poradie určuje súbor, a Turbo-BASIC XL má na skoky mená – návestia a procedúry (kapitola 30). Čísla sú potom len na obtiaž: treba ich vymýšľať a pri vkladaní riadkov prečíslovať.\nBasic26 preto vie preložiť program v Turbo-BASICu XL napísaný úplne bez čísel riadkov. Je to rozšírenie prekladača – pôvodný interpreter taký súbor neprijme.\nAko sa to zapne Voľbou --no-line-numbers. Najlepšie rovno v programe, na jeho prvom riadku (kapitola 40):\nTurbo Basic XL REM @COMPILE --no-line-numbers Platí len pre Turbo-BASIC XL (súbor .tbas) a pre celý program naraz: buď má čísla každý riadok, alebo žiadny.\nČo sa mení S číslami Bez čísel poradie riadkov podľa čísel tak, ako sú v súbore skok GOTO 100 GO# MENO a návestie # MENO podprogram GOSUB 1000 … RETURN EXEC MENO a PROC MENO … ENDPROC skok v podmienke IF X=1 THEN 100 IF X=1 THEN GO# MENO výber ON X GOTO 10,20 ON X GO# A,B alebo ON X EXEC A,B pasca TRAP 200 TRAP #MENO dáta RESTORE 500 RESTORE #MENO Všetko ostatné ostáva: príkazy, slučky, bloky IF … ENDIF, dvojbodka medzi príkazmi. Prázdne riadky a odsadenie sú dovolené a nič neznamenajú.\nTRAP 40000 (zrušenie pasce) funguje ďalej – to číslo nie je riadok.\nCelý program Súbor examples/nolines.tbas:\nTurbo Basic XL REM @COMPILE --no-line-numbers REM A program without line numbers DIM NAME$(20) INPUT \"Your name\";NAME$ EXEC GREET COUNT=0 DO COUNT=COUNT+1 IF COUNT\u003e3 THEN EXIT PRINT \"Round \";COUNT LOOP RESTORE #COLOURS FOR I=1 TO 3 READ NAME$ PRINT NAME$;\" \"; NEXT I PRINT TRAP #OOPS PRINT 10/(COUNT-4) END # OOPS PRINT \"Error \";ERR;\" at line \";ERL END PROC GREET PRINT \"Hello, \";NAME$;\"!\" ENDPROC # COLOURS DATA red,green,blue Preklad a spustenie Voľba je v programe, takže na príkazový riadok ju písať netreba:\nBasic26 nolines.tbas --run alebo v simulátore s odpoveďou zo súboru examples/nolines.in:\nBasic26 nolines.tbas --sim --sim-input nolines.in Čo uvidíš Your name?Peter Hello, Peter! Round 1 Round 2 Round 3 red green blue Error 11 at line 23 Ako to funguje Prvý riadok zapína mód. Pre prekladač je to nastavenie, inak obyčajný komentár. Program sa číta zhora nadol, tak ako je napísaný. Prázdne riadky ho len rozdeľujú na časti. EXEC GREET volá procedúru na konci súboru, RESTORE #COLOURS nastaví čítanie dát na návestie, TRAP #OOPS pošle chybu na návestie. Nikde nie je číslo, na ktoré by sa dalo odvolať – a ani ho netreba. Posledný riadok výstupu: COUNT je po slučke 4, takže 10/(COUNT-4) je delenie nulou. ERL hovorí 23 – a to je presne dvadsiaty tretí riadok súboru nolines.tbas. Stačí v editore skočiť na riadok 23. Číslo riadka je riadok v súbore Program čísla riadkov nemá, ale chyba ich potrebuje: ERROR- 11 OVERFLOW AT LINE 23, funkcia ERL, stopa TRACE. Prekladač preto každému riadku pridelí číslo, ktoré má v súbore – počítajú sa aj prázdne riadky a komentáre. Hlásenie za behu aj hlásenie prekladača (nolines.tbas(23,7): error …) tak ukazujú na to isté miesto.\nProgram môže mať najviac 32 767 riadkov.\nVýpis s číslami Keď chceš ten istý program dať pôvodnému Turbo-BASICu XL – alebo niekomu, kto Basic26 nemá –, nechaj si ho vypísať:\nBasic26 nolines.tbas --list nolines-numbered.tbas Výpis má pred každým riadkom jeho číslo (prázdne riadky vynechá) a z hlavičky zmizne --no-line-numbers:\nTurbo Basic XL 1 REM @COMPILE 2 REM A program without line numbers 4 DIM NAME$(20) 5 INPUT \"Your name\";NAME$ 6 EXEC GREET 8 COUNT=0 Je to obyčajný Turbo-BASIC XL: interpreter ho načíta príkazom ENTER a Basic26 z neho preloží bajt po bajte ten istý program.\nProgram z viacerých súborov: INCLUDE Keď program narastie, oplatí sa ho rozdeliť: hlavný program hovorí, čo sa robí, a procedúry, ktoré to robia, ležia v inom súbore. Riadok\nTurbo Basic XL INCLUDE \"incltools.inc\" vloží na svoje miesto všetky riadky súboru incltools.inc, akoby tam boli napísané. Funguje to len v programe bez čísel riadkov – s číslami by dva súbory priniesli tie isté čísla a nevedelo by sa, ktorý riadok platí. Je to rozšírenie Basic26, pôvodný interpreter INCLUDE nepozná, a preto ho treba zapnúť voľbou --modern (ako hráčov a strely v kapitole 49).\nHlavný program, súbor examples/inclmain.tbas:\nTurbo Basic XL REM @COMPILE --no-line-numbers --modern REM The main program; its procedures are in incltools.inc EXEC FRAME PRINT \" Hello from two files!\" EXEC FRAME TRAP #OOPS EXEC CHECK END # OOPS PRINT \"Error \";ERR;\" at line \";ERL END INCLUDE \"incltools.inc\" A súbor, ktorý vkladá, examples/incltools.inc:\nTurbo Basic XL REM incltools.inc - procedures for inclmain.tbas PROC FRAME FOR I=1 TO 27:PRINT \"-\";:NEXT I PRINT ENDPROC PROC CHECK DIM A(3) K=5:A(K)=1 ENDPROC Prekladá sa len hlavný súbor – vložený si prekladač nájde sám:\nBasic26 inclmain.tbas --run --------------------------- Hello from two files! --------------------------- Error 9 at line 24 INCLUDE stojí na riadku sám, za ním len meno v úvodzovkách. Meno sa hľadá v adresári súboru, ktorý ho napísal; D: pred menom sa zahodí a bez prípony sa skúsi .TBAS, .BAS a .LST. Vložený súbor môže vkladať ďalší, najviac do hĺbky 16. Sám seba vložiť nemôže – ani cez iný súbor. Vložené súbory nemajú REM @COMPILE a samy sa nepreložia, preto im je dobré dať inú príponu (tu .inc). Voľby platia z hlavného programu pre celý. Číslo riadka je poradie v celom zloženom programe. INCLUDE je pätnásty riadok inclmain.tbas, takže vložený súbor začína riadkom 15 a jeho desiaty riadok K=5:A(K)=1 je riadok 24 – ten hlási ERL. Kde to je, ukáže --list: vypíše celý program v jednom súbore s číslami. Prekladač pri chybe v preklade hlási súbor a riadok v ňom, aj s riadkom, ktorý ho vložil – keby bol v CHECK riadok A(5)=1, ktorý je zlý už pri preklade: incltools.inc(10,5): error B26009: A(5) is past DIM A(3) inclmain.tbas(15,9): note: included from here Väčší program z troch súborov je medzi príkladmi: examples/turbobasic/include/.\nČasté chyby Čo sa stalo Čo povie prekladač program bez čísel a bez voľby error B26044: line does not start with a number (--no-line-numbers is for a program written without them) riadok sa začína číslom error B26044: a line begins with a number, and this program has none (--no-line-numbers) GOTO 100 error B26044: … GOTO is GO# with a label (# NAME) GOSUB 1000 error B26044: … GOSUB is PROC and EXEC with a name IF X=1 THEN 100 error B26044: … THEN with a number is THEN GO# with a label TRAP 200, RESTORE 500 error B26044: … TRAP takes a label (TRAP #NAME), … RESTORE takes a label (RESTORE #NAME) voľba pri programe v Atari BASICu (.abas) error B26200: --no-line-numbers is for Turbo-BASIC XL: Atari BASIC has only line numbers to jump to INCLUDE v programe s číslami riadkov alebo bez --modern error B26057: INCLUDE needs --modern and a Turbo-BASIC XL program without line numbers (--no-line-numbers): … vložený súbor sa nenašiel error B26057: INCLUDE file not found: … súbor vkladá sám seba error B26057: recursive INCLUDE of … návestie nie je prvé na riadku návestie # MENO aj PROC MENO musia stáť na začiatku riadka, ako vždy Príkaz musí celý ostať na jednom riadku – dlhý riadok sa nedá rozdeliť na dva.\nVyskúšaj si Prepíš menu.tbas z kapitoly 30 bez čísel riadkov. Jediné GOTO v ňom nahraď návestím a GO#. Pridaj do nolines.tbas na ľubovoľné miesto prázdny riadok a pozri, ako sa zmení číslo v hlásení chyby. Vypíš si program cez --list a prelož výpis. Porovnaj veľkosť oboch súborov .xex. Ďalší program bez čísel riadkov je medzi príkladmi pri prekladači: examples/turbobasic/nonumbers.tbas.\nZhrnutie REM @COMPILE --no-line-numbers na začiatku programu: Turbo-BASIC XL bez čísel riadkov. Skáče sa len na mená: GO#, EXEC, TRAP #, RESTORE #, ON … GO#, ON … EXEC. Číslo riadka v chybe, v ERL a v TRACE je riadok v súbore. --list vypíše ten istý program s číslami – pre pôvodný interpreter. INCLUDE \"SÚBOR\" vloží riadky iného súboru; číslo riadka je potom poradie v celom zloženom programe. Späť: 46. Kompresia · Ďalej: 48. Nečitateľný súbor\n","t":"47. Program bez čísel riadkov: --no-line-numbers","u":"47-bez-cisel/"},{"c":"Na čo to je Texty, ktoré program vypisuje alebo s ktorými porovnáva, ležia v súbore .xex tak, ako si ich napísal. Kto súbor otvorí v editore, prečíta si ich – pri textovej hre aj celé riešenie, pri programe s heslom heslo.\nVoľba --scramble urobí zo súboru taký, v ktorom sa nedá prečítať nič: ani texty, ani DATA, ani kód. Program pritom robí presne to isté a v zdrojáku nemeníš nič. Je to rozšírenie prekladača – robí sa až s hotovým súborom, takže platí pre Atari BASIC aj pre Turbo-BASIC XL.\nAko sa to píše Voľba Čo robí --scramble zakóduje výsledný súbor, aby sa v ňom nedalo nič prečítať --scramble-fx meno to isté, a kým sa program po nahratí dekóduje, na obrazovke beží efekt --scramble-level číslo to isté, s úrovňou zakódovania: 1 (predvolená) alebo silnejšia 2 --scramble-key číslo kľúč, od ktorého sa kóduje (napríklad $3A7F); s ním dá každý preklad rovnaký súbor Basic26 program.abas --scramble alebo rovno v programe, v hlavičke REM @COMPILE (kapitola 40):\nTurbo Basic XL 1 REM @COMPILE --scramble-fx bars Celý program Súbor examples/secret.abas:\nTurbo Basic XL 10 REM A file nobody can read: Basic26 secret.abas --scramble 20 DIM A$(20) 30 PRINT \"What is the password\";:INPUT A$ 40 IF A$=\"SESAME\" THEN PRINT \"The door opens.\":END 50 PRINT \"Nothing happens.\" Heslo SESAME je v programe napísané ako text, s ktorým sa porovnáva odpoveď.\nPreklad a spustenie Prelož program najprv obyčajne a nechaj Windows pohľadať v súbore slovo SESAME:\nBasic26 secret.abas findstr /m SESAME secret.xex secret.xex findstr /m vypíše meno súboru, v ktorom slovo našiel – heslo je v súbore čitateľné. Teraz to isté s --scramble:\nBasic26 secret.abas --scramble findstr /m SESAME secret.xex Tentoraz nevypíše nič: slovo v súbore nie je. Program pritom beží ako predtým – v simulátore s odpoveďou zo súboru examples/secret.in:\nBasic26 secret.abas --scramble --sim --sim-input secret.in Čo uvidíš What is the password?SESAME The door opens. Ako to funguje Prekladač hotový program prekódoval bajt po bajte a pridal k nemu krátky dekodér. Ten sa po nahratí súboru spustí ako prvý, vráti pamäť do pôvodného stavu a až potom spustí tvoj program. Program o dekodéri nevie.\nČo to stojí, povie -v:\nwrote secret.xex (1849 bytes, 4 segment(s), 1709 bytes of program) scrambled 1642 bytes (level 1, key $A7), decoder at $0600 (112 bytes), file 116 bytes longer Súbor je dlhší asi o sto bajtov – tu 1 849 namiesto 1 733. Pamäť programu sa nezmenšila. Dekodér leží mimo neho, na adrese $0600 (stránka 6). Keď tam niečo nahráva sám program – napríklad strojový kód pribalený cez --embed –, dekodér sa uloží hneď za program. V oboch prípadoch ho program po štarte môže pokojne prepísať: POKE 1536,… aj DIM fungujú ako vždy. Štart trvá o chvíľu dlhšie. Program s 25 kilobajtmi sa dekóduje asi pol sekundy. Jediné, čo ostáva čitateľné, je krátky úsek na začiatku súboru, ktorý vypína zabudovaný BASIC (65 bajtov, rovnakých v každom preloženom programe). Musí bežať ako prvý, ešte pred dekodérom.\nZakódujú sa aj dáta, ktoré idú so súborom: pribalené súbory (--embed, --file), texty pod ROM a v bankách (--text-under-rom, --text-in-banks) a oba súbory z --data-only a --code-only. Program sa dá uložiť aj na disketu (--atr), s ktorýmkoľvek DOS-om.\nZakódovaný je aj samotný dekodér. Pred ním leží krátky prvý stupeň (24 bajtov), ktorý ho pri prvom spustení vráti a potom už len pustí ďalej. V súbore sa tak nedá prečítať ani to, ako dekodér pracuje, ani jeho kľúč.\nNie je to ochrana. Kto program spustí v emulátore, vidí v jeho pamäti všetko už dekódované. Zakódovanie bráni len tomu, aby si texty niekto prečítal priamo zo súboru.\nSilnejšie zakódovanie: --scramble-level 2 Bežné --scramble kóduje každý bajt pomocou bajtu pred ním. Je to rýchle a dekodér je krátky, no kto ten postup pozná, napíše si program, ktorý súbor rozkóduje bez spúšťania. Voľba --scramble-level vyberá úroveň zakódovania:\nÚroveň Ako kóduje Dekodér 25 KB trvá 1 každý bajt XOR bajt pred ním (predvolená, to isté ako --scramble) 112 bajtov 0,48 s 2 každý bajt XOR číslo zo 16-bitového generátora pseudonáhodných čísel (LFSR) +12 asi 0,9 s Basic26 secret.abas --scramble-level 2 --scramble-level už znamená --scramble, oboje písať netreba. Efekty fungujú rovnako, napríklad --scramble-level 2 --scramble-fx bars.\nPri úrovni 2 čísla, ktorými sa bajty kódujú, vôbec nezávisia od programu a generátor beží bez prerušenia cez celý súbor – v súbore do 64 KB sa teda nikde neopakujú. Kto ich chce odstrániť, musí generátor napodobniť a poznať číslo, od ktorého začína – kľúč. Bez voľby --scramble-key si prekladač pri každom preklade vyberie nový náhodný kľúč, takže ten istý program dá zakaždým iný súbor. Ak chceš, aby bol súbor pri každom preklade rovnaký (napríklad na porovnanie dvoch verzií), kľúč zadaj sám:\nBasic26 secret.abas --scramble-level 2 --scramble-key $3A7F -v scrambled 1642 bytes (level 2, key $3A7F), decoder at $0600 (124 bytes), file 128 bytes longer Kľúč je číslo od $0001 do $FFFF; nula nejde, generátor by z nej vyrábal len nuly. Pri úrovni 1 je kľúč jeden bajt od $01 do $FF, bez voľby platí $A7.\nAni úroveň 2 nie je ochrana: emulátor ukáže pamäť už dekódovanú a kto prvý stupeň pochopí, dostane sa ďalej. Len to dá podstatne viac práce.\nCelý program so zakódovaním úrovne 2 – trezor, ktorý sa pýta na kód – je medzi príkladmi prekladača v examples/scramble/trezor.abas.\nEfekty: --scramble-fx Pol sekundy, počas ktorej sa na obrazovke nič nedeje, vyzerá ako zaseknutý počítač. Staré programy na Atari preto pri rozbaľovaní kreslili pruhy. --scramble-fx meno zakóduje súbor rovnako ako --scramble a pridá do dekodéra efekt:\nBasic26 secret.abas --scramble-fx bars --run Efekt uvidíš len v emulátore (--run) alebo na skutočnom Atari – simulátor (--sim) obrazovku nekreslí. Pri takom malom programe iba preblikne; poriadne ho vidno pri programe s desiatkami kilobajtov.\nMeno Čo je na obrazovke Dekodér 25 KB trvá none nič – to isté ako --scramble +0 bajtov 0,48 s bars farebné pásy cez celú obrazovku +6 0,64 s bars-border farebné pásy len na okrajoch +3 0,56 s mono čiernobiele pásy cez celú obrazovku +8 0,68 s mono-border čiernobiele pásy na okrajoch +5 0,60 s rainbow pravidelná dúha cez celú obrazovku +6 0,64 s rainbow-border dúha na okrajoch +3 0,56 s slow široké pomalé pásy cez celú obrazovku +6 0,48 s slow-border široké pomalé pásy na okrajoch +3 0,48 s dots bodky po celej obrazovke – znaky sa zmenia na zrnenie +3 0,56 s dots-bars bodky a farebné pásy naraz +9 0,74 s blank obrazovka zhasne, nič sa nekreslí +20 0,36 s bars-blank obrazovka zhasne, farebné pásy cez celú plochu +23 0,42 s inc obrazovka zhasne, biele čiarky na tmavočervenej ploche +28 0,46 s inc-border biele čiarky na tmavočervených okrajoch +8 0,64 s Ako si vybrať:\nČo najrýchlejší štart: blank. Zhasnutá obrazovka neberie procesoru čas, preto je dekódovanie rýchlejšie než úplne bez efektu. Efekt zadarmo: slow a slow-border. Farbu menia len raz za 256 bajtov, takže nič nespomalia. Nech obrazovka ostane čitateľná: varianty -border kreslia len do okrajov; text v strede ostane, ako bol. Ako za starých čias: bars alebo inc – ten kreslí to, čo rozbaľovač Super Packer. Tri veci, ktoré je dobré vedieť:\n„Celá obrazovka“ platí pre bežnú textovú obrazovku, na ktorej sa program nahráva. dots je vidno len v textových režimoch. Farby aj znaky sa po dekódovaní vrátia samy, program nemusí nič upratovať. Pri programe s dátami v skrytej pamäti (kapitoly 44 až 46) beží dekodér po kúskoch počas celého nahrávania. Efekty so zhasnutou obrazovkou (blank, bars-blank, inc) vtedy blikajú. Časté chyby Čo sa stalo Čo povie prekladač efekt s takým menom nie je error B26200: unknown effect for --scramble-fx: stars (none, bars, …) – v zátvorke sú všetky, ktoré prekladač pozná za --scramble-fx chýba meno error B26200: option --scramble-fx needs an effect (none, bars, …); bez efektu stačí --scramble úroveň s takým číslom nie je error B26200: unknown level for --scramble-level: 3 (1, 2) kľúč je väčší než $FFFF error B26200: invalid value for --scramble-key: $1FFFF (a number up to $FFFF, e.g. $3A7F) dvojbajtový kľúč bez úrovne 2 error B26200: --scramble-key for --scramble-level 1 is a byte from $01 to $FF kľúč 0 pri úrovni 2 error B26200: --scramble-key must not be 0 with --scramble-level 2 program si pýta jeden efekt a príkazový riadok iný warning B26232: the command line's --scramble-fx goes before the one in the program's REM @COMPILE – platí príkazový riadok stránka 6 je obsadená a program siaha až po obrazovku error B26200: --scramble: no room for the decoder: page 6 is taken and so is the memory after the program up to $BC00 pribalený program (--embed iný.xex) si počas nahrávania prepíše stránku 6 program sa po nahratí zasekne – dekodér tam musí vydržať, kým sa súbor nenahrá celý Zakódovaný súbor sa nedá vrátiť späť voľbou prekladača. Zdroják si preto nechaj; .xex z neho vyrobíš kedykoľvek znova.\nVyskúšaj si Prelož secret.abas s --scramble-fx rainbow --run a potom s --scramble-fx inc --run. Efekt trvá len okamih – pridaj do programu sto riadkov DATA a pozri, ako sa predĺži. Pridaj na začiatok programu riadok 1 REM @COMPILE --scramble-fx bars a prelož ho bez volieb. Prelož secret.abas dvakrát s --scramble-level 2 -v a porovnaj kľúče, ktoré prekladač vypíše. Potom pridaj --scramble-key $1234 a porovnaj oba súbory príkazom fc /b. Prelož secret.abas s --scramble -v --embed secret.in@$0600. Stránka 6 je tým obsadená (voľbu --embed vysvetľuje kapitola 43) – kam prekladač uložil dekodér? Zhrnutie --scramble urobí súbor nečitateľným za cenu asi sto bajtov a pol sekundy pri štarte. --scramble-fx meno k tomu pridá efekt na obrazovke; najrýchlejší je blank, zadarmo slow. --scramble-level 2 kóduje prúdom z generátora; bez --scramble-key je kľúč pri každom preklade iný. Program sa nemení a o dekodéri nevie; pamäť mu neubudne. Nie je to ochrana – v pamäti emulátora je program dekódovaný. Späť: 47. Program bez čísel riadkov · Ďalej: 49. Hráči a strely\n","t":"48. Nečitateľný súbor: --scramble","u":"48-necitatelny-subor/"},{"c":"Na čo to je Okrem obrazu má Atari ešte štyroch hráčov (anglicky players) a štyri strely (missiles). Sú to úzke zvislé pásy, ktoré čip GTIA kreslí cez obraz: každý má vlastnú farbu, vodorovnú polohu a šírku, a čip sám zistí, do čoho narazil. Na loď, ktorá letí cez hviezdy, je to ako stvorené – loď sa hýbe, a obraz pod ňou sa nemusí prekresľovať.\nV Atari BASICu aj v Turbo-BASICu XL sa s nimi dá pracovať len cez POKE: nájsť zarovnaný blok pamäte, zapísať jeho adresu do PMBASE, zapnúť ich v SDMCTL a GRACTL, kresliť tvar bajt po bajte. Basic26 má na to vlastné slová. Sú to rozšírenia prekladača – pôvodný interpreter ich nepozná.\nAko sa to zapne Voľbou --modern, najlepšie v hlavičke programu (kapitola 40):\nTurbo Basic XL REM @COMPILE --modern Bez nej sú slová PMGRAPHICS, PMX, HITCLR obyčajné mená premenných, tak ako v dobových programoch. A program, ktorý ich nepoužije, z nich v súbore .xex nemá ani bajt. Rovnaké slová má prekladač jazyka Action! Action26.\nSlová Objekt n je 0 až 3 pre hráča a 4 až 7 pre strely 0 až 3.\nSlovo Čo robí PMGRAPHICS m 0 vypne, 1 zapne s jemnými pásmi (riadok obrazu na bajt), 2 s hrubými (dva riadky na bajt) PMCREATE n,TVAR$,šírka,x,y nakreslí objekt: riadky tvaru sú bajty reťazca, šírka 1, 2 alebo 4 PMSHAPE n,TVAR$ iný tvar na tom istom mieste (animácia) PMCLEAR n zmaže objekt PMMOVE n,x,y presunie objekt PMHPOS n,x, PMVPOS n,y len vodorovne, len zvislo PMX(n), PMY(n) kde objekt je PMWIDTH n,w šírka 1, 2 alebo 4 PMCOLOR n,odtieň,jas farba ako pri SETCOLOR; strela má farbu svojho hráča PMPRIORITY p 1 hráči nad obrazom, 4 obraz nad hráčmi PMHIT(n,c) 1, keď objekt n narazil do hráča c (0–3) alebo do farby obrazu c-4 (4–7) PMHITPF(n), PMHITPM(n) to isté ako bity: farby obrazu, hráči HITCLR zabudne všetky nárazy PMWAIT počká na ďalšiu snímku PMOVERLAP(a,b) 1, keď sa objekty prekrývajú – počíta sa z polohy a veľkosti, platí hneď PMADR(n) adresa pásu objektu v pamäti Súradnice sú tie, ktoré používa čip: x od 48 po 207 je na obrazovke zľava doprava, y je riadok v páse – pri PMGRAPHICS 2 od 0 po 127, viditeľné asi 16 až 111.\nCelý program Kameň padá zhora na loď. Na konci program povie, do čoho narazil.\nSúbor examples/players.tbas:\nTurbo Basic XL REM @COMPILE --no-line-numbers --modern REM A ship, a rock and what they hit DIM SHIP$(8),ROCK$(6) RESTORE #SHAPES FOR I=1 TO 8:READ B:SHIP$(I)=CHR$(B):NEXT I FOR I=1 TO 6:READ B:ROCK$(I)=CHR$(B):NEXT I GRAPHICS 0 POSITION 2,2:? \"XXXXXXXXXXXXXXXXXXXXXXXX\" PMGRAPHICS 2 PMCREATE 0,SHIP$,1,120,90 PMCREATE 1,ROCK$,2,116,24 PMCOLOR 0,1,10:PMCOLOR 1,3,6 FOR Y=24 TO 86 PMWAIT PMMOVE 1,116,Y NEXT Y PMWAIT:HITCLR:PMWAIT:PMWAIT POSITION 2,10:? \"Rock hits the text: \";PMHIT(1,6) ? \"Rock hits the ship: \";PMHIT(1,0) ? \"Ship is at \";PMX(0);\",\";PMY(0) END # SHAPES DATA 24,60,126,255,219,255,36,66 DATA 60,126,255,255,126,60 Preklad a spustenie Hráčov treba vidieť, takže v emulátore:\nBasic26 players.tbas --run Čo uvidíš Žltú loď dole, kameň, ktorý k nej pomaly padne cez riadok písmen, a pod písmenami:\nRock hits the text: 0 Rock hits the ship: 1 Ship is at 120,90 Ako to funguje Tvar je reťazec. Každý bajt je jeden riadok: bit 7 vľavo, bit 0 vpravo. Loď 24,60,126,255,… je v dvojkovej sústave 00011000, 00111100, 01111110… – špička hore a krídla dole. Reťazec musí ostať, kým sa objekt používa: prekladač si pamätá, kde leží, a pri PMMOVE ho číta znova. Pamäť pridelí prekladač. Hráči potrebujú blok, ktorý začína na násobku 1 KB (pri PMGRAPHICS 1 2 KB). Prekladač ho dá hneď za program a FRE(0) je o toľko menšie; --memory ho ukáže ako PM graphics (kapitola 42). Pohyb prekreslí len to, čo sa zmenilo. PMMOVE vodorovne zapíše jeden register, zvislo prepíše riadky tvaru – nie celý pás. Nárazy hlási čip, a až po snímke. GTIA si náraz poznačí, keď objekty kreslí, a drží ho, kým program nezavolá HITCLR. Preto PMWAIT, potom čítanie, potom HITCLR. Prečítať náraz hneď po PMMOVE nemá zmysel – nová poloha ešte nebola nakreslená. Písmo je farba 2. V GRAPHICS 0 čip hlási písmená ako farbu obrazu 2, preto PMHIT(1,6) (6 = 4 + 2). Kameň na začiatku cez písmená preletel, ale HITCLR po slučke to zabudol. GRAPHICS hráčov nevypne, hoci operačný systém pri otvorení obrazovky vypne ich kreslenie – prekladač ho zapne znova. Návrat do DOS-u ich vypne. Časté chyby Čo sa stalo Čo sa stane program bez --modern PMGRAPHICS 2 je pre prekladač priradenie premennej: error B26017: expected '=' … hodnota nad 255 (PMHPOS 0,300) chyba za behu 3 náraz čítaný bez PMWAIT PMHIT ukáže nárazy z minulej polohy alebo nič tvar z textu v úvodzovkách s --pack-text tvar sa rozbalí na chvíľu do voľnej pamäte a potom ho niečo prepíše – použi premennú s DIM strela a strela čip ich zrážku nehlási; pomôže PMOVERLAP Vyskúšaj si Zmeň PMCOLOR 0,1,10 na iné farby. Ktorý odtieň je červený? Daj lodi PMWIDTH 0,4. Narazí kameň do lode aj vtedy, keď ho posunieš o kúsok vedľa? Pridaj strelu: PMCREATE 4,SHOT$,1,123,80 s tvarom CHR$(3) štyrikrát a nechaj ju letieť hore cez PMVPOS. Väčšia hra so strieľaním je medzi príkladmi pri prekladači: examples/turbobasic/pmg/.\nZhrnutie --modern zapne slová, ktoré pôvodný interpreter nemá: INCLUDE a hráčov a strely. PMGRAPHICS 2 zapne hráčov a strely, pamäť pridelí prekladač. PMCREATE, PMMOVE, PMCOLOR a ďalšie ich kreslia a posúvajú; PMHIT po PMWAIT povie, do čoho narazili. Späť: 48. Nečitateľný súbor · Ďalej: 50. Rýchle celé čísla\n","t":"49. Hráči a strely: --modern a PMGRAPHICS","u":"49-hraci-a-strely/"},{"c":"Na čo to je Každé číslo je v Atari BASICu aj v Turbo-BASICu XL šesť bajtov v desiatkovej sústave (kapitola 4). Vďaka tomu 1/3 vyjde na desať trojok – ale aj I=I+1 znamená sčítanie desiatkových čísel po bajtoch, a to je na procesore 6502 pomalé.\nVäčšina programov však počíta len s celými číslami: počítadlá slučiek, súradnice, adresy, body v hre. Voľba --int povie prekladaču, že číslo je celé číslo v štyroch bajtoch, tak ako ho počíta procesor. Program je potom dva- až trikrát rýchlejší, ak počíta, a o kúsok menší. Pôvodný interpreter nič také nemá – je to rozšírenie prekladača.\nKde program desatinné čísla naozaj potrebuje, povie riadok REM @FLOAT, ktoré premenné ich majú držať.\nAko sa to zapne Voľbou --int, najlepšie v hlavičke programu (kapitola 40):\nTurbo Basic XL 0 REM @COMPILE --int Bez nej je všetko po starom.\nAko počíta Čo S --int číslo celé, od −2 147 483 648 po 2 147 483 647 výsledok mimo tohto rozsahu (+ - *, /, READ, INPUT, VAL) chyba 11 / delí celé čísla a zlomok zahodí smerom k nule: 7/2 je 3, -7/2 je −3 delenie nulou chyba 11 adresa pre PEEK, POKE, MOVE …, index poľa, GRAPHICS 0 až 65 535, inak chyba 3 ako v BASICu POKE s hodnotou mimo 0–255, DPOKE mimo 0–65 535 chyba 3 FOR I=1 TO 2147483647 slučka ako každá iná; NEXT za najväčším číslom skončí bez chyby READ, INPUT, VAL s desatinným číslom zlomok sa zahodí (1.9 je 1) \u0026, !, EXOR (Turbo-BASIC XL) na všetkých 32 bitoch, aj záporné čísla MOD, DIV (Turbo-BASIC XL) DIV je /, MOD je zvyšok so znamienkom delenca premenná osem bajtov v tabuľke premenných ako vždy prvok poľa štyri bajty namiesto šiestich Čísla napísané v programe sa počítajú pri preklade presne: 320*160/8 je 6400. Číslo, ktoré sa do 32 bitov nezmestí, je chyba už pri preklade.\nDesatinné čísla vo výpočte Výraz s desatinným číslom (0.5, 2.0, 1E3), so SIN, COS, ATN, SQR, LOG, CLOG, EXP, RND alebo ^ sa počíta po starom, v šiestich bajtoch, a až výsledok sa zmení na celé číslo – zlomok sa zahodí smerom k nule. X=INT(100*RND(0)) tak funguje ako vždy. INT, TRUNC, FRAC, ABS a SGN desatinného čísla dajú desatinné číslo (INT(-1.5) je −2), porovnanie a AND, OR, NOT dajú 1 alebo 0. PRINT desatinného výrazu vypíše desatinné číslo.\nDo celej premennej sa však zlomok neuloží: X=0.5 je chyba, STEP so zlomkom pri celej premennej tiež.\nREM @FLOAT: premenné so zlomkom Premenné a polia, ktoré majú držať desatinné čísla, vymenuje riadok REM @FLOAT na začiatku programu, pole s otvorenou zátvorkou:\nTurbo Basic XL 0 REM @COMPILE --int 1 REM @FLOAT X,Y,A( Taká premenná má šesť bajtov a počíta sa s ňou ako v BASICu – aj FOR s STEP 0.25. Pole má šesť bajtov na prvok. Celé číslo sa do nej uloží presne, jej hodnota v celej premennej stratí zlomok. Riadkov REM @FLOAT môže byť viac, platia len tie pred prvým príkazom programu. Reťazec v nich byť nemôže.\nPozor na delenie: Y=X/2, keď je X celé, delí celé čísla, aj keď je Y vo @FLOAT. Kto chce zlomok, napíše X/2.0.\nCelý program Súčet štvorcov, delenie, plocha kruhu a číslo, ktoré sa už nezmestí.\nSúbor examples/whole.abas:\nAtari BASIC 0 REM @COMPILE --int 1 REM @FLOAT R,P 10 REM Whole numbers in four bytes, two variables with a fraction 20 S=0:FOR I=1 TO 1000:S=S+I*I:NEXT I 30 PRINT \"SUM OF SQUARES: \";S 40 PRINT \"7/2 = \";7/2;\", -7/2 = \";-7/2 50 R=10:P=3.14159265*R*R 60 PRINT \"CIRCLE AREA: \";P 70 PRINT \"WHOLE PART: \";INT(P) 80 X=2147483647:PRINT \"LARGEST: \";X 90 TRAP 120:X=X+1 100 PRINT \"NEVER HERE\" 110 END 120 PRINT \"ERROR \";PEEK(195);\": IT DID NOT FIT\" Preklad a spustenie Basic26 whole.abas --sim Čo uvidíš SUM OF SQUARES: 333833500 7/2 = 3, -7/2 = -3 CIRCLE AREA: 314.159265 WHOLE PART: 314 LARGEST: 2147483647 ERROR 11: IT DID NOT FIT Ten istý program bez --int (Basic26 whole.abas --sim --no-source-options) vypíše 7/2 = 3.5, ako najväčšie číslo 2147483640 – v šiestich bajtoch BASIC z napísaného čísla prečíta len deväť číslic – a NEVER HERE, lebo o jednotku väčšie číslo sa do šiestich bajtov ešte zmestí.\nAko to funguje Riadok 0 zapne --int, riadok 1 dá premenným R a P desatinné čísla. Riadok 20 počíta len s celými číslami – tu je --int najrýchlejší. Riadok 40: / medzi celými číslami zahodí zlomok smerom k nule. Riadky 50–70: P je vo @FLOAT, takže si plochu pamätá aj so zlomkom; INT(P) je celá časť. Riadky 80–90: 2 147 483 647 je najväčšie číslo v štyroch bajtoch, o jednotku viac je chyba 11, ktorú zachytí TRAP. Ako rýchlo Čas v sekundách v emulátore (PAL), ten istý program preložený bez voľby a s --int:\nProgram Bez --int --int 500× PRINT 10,26 10,18 X=X+1 v slučke 1,76 1,24 B*2, (C-B)/2 11,64 5,28 sito prvočísel v reťazci 54,54 20,14 POKE do obrazovky 8,12 3,78 práca s reťazcami 21,92 13,34 náhodné bajty do GRAPHICS 8 4,64 2,98 bublinkové triedenie 8,1 5,8 posun hráča cez PEEK a POKE 15,10 5,94 Čím viac program počíta, tým viac získa. Výpis textu sa nezrýchli – čas tam ide do operačného systému. Prekladač FastBASIC, ktorý celými číslami počíta vždy, zvládne bajty do GRAPHICS 8 za 2,34 s a triedenie za 6,58 s.\nČasté chyby Čo sa stane Prečo error B26011: with --int, 0.5 is no whole number of 32 bits; add X to REM @FLOAT do celej premennej ide zlomok – pridaj ju do REM @FLOAT error B26011: with --int, a STEP with a fraction needs a floating point loop variable (REM @FLOAT) FOR so STEP 0.25 potrebuje premennú vo @FLOAT error B26011: 2147483648 does not fit in 32 bits číslo v programe je väčšie než štyri bajty warning B26233: with --int, / leaves no fraction for the * to multiply … A/B*C stratí zlomok skôr, než sa násobí; C*A/B nie warning B26233: with --int this asks whether N divides X … X/N=INT(X/N) je v starých programoch otázka „delí N číslo X?“ – prekladač to tak preloží; jasnejšie je X MOD N=0 v Turbo-BASICu XL, X-X/N*N=0 v Atari BASICu warning B26233: with --int, X=RND(...) is always 0 … RND je zlomok; do celej premennej INT(N*RND(0)) error B26042: REM @FLOAT A$: a string is not a number reťazec do @FLOAT nepatrí ERROR- 11 za behu výsledok sa nezmestil do štyroch bajtov, alebo delenie nulou program počíta inak než bez --int niekde delí celé čísla a zlomok čakal; premennú daj do @FLOAT alebo pridaj .0 Vyskúšaj si Zmeň riadok 40 na 7/2.0. Čo vypíše? Vyhoď z riadku 1 premennú P. Čo povie prekladač? Prelož svoj program z kapitoly 10 s --int a bez neho a porovnaj, čo vypíšu. Zhrnutie --int: číslo je celé, v štyroch bajtoch, od −2 147 483 648 po 2 147 483 647; čo sa nezmestí, je chyba 11. / zahodí zlomok smerom k nule. Desatinné čísla vo výraze fungujú, výsledok sa zmení na celé číslo. REM @FLOAT X,Y,A( dá vymenovaným premenným a poliam desatinné čísla. Program, ktorý veľa počíta, je dva- až trikrát rýchlejší. Tu sa kniha končí. V prílohách nájdeš všetko ešte raz v tabuľkách – a v priečinku examples pri prekladači stovky programov, na ktorých si to môžeš vyskúšať.\nSpäť: 49. Hráči a strely · Ďalej: A. Jazyk na jednej strane\n","t":"50. Rýchle celé čísla: --int a REM @FLOAT","u":"50-cele-cisla-int/"},{"c":"Všetky príkazy, funkcie a operátory na jednom mieste. Stĺpec AB hovorí, či slovo pozná Atari BASIC (súbory .abas); Turbo-BASIC XL (.tbas) pozná všetky. Stĺpec Kap. je kapitola, kde je slovo vysvetlené.\nSlovami z týchto tabuliek sa nesmie začínať meno premennej (kapitoly 4 a 26); meno začínajúce na NOT sa vo výpočte číta ako NOT a zvyšok.\nPríkazy Atari BASICu Príkaz Tvar Čo robí Kap. BYE BYE ukončí program 25 CLOAD, CSAVE (editor) len hláška 25 CLOSE CLOSE #k zavrie kanál 24 CLR CLR vynuluje premenné, zruší DIM 13 COLOR COLOR n vyberie pero na kreslenie 20 COM COM A(n) to isté ako DIM 25 CONT CONT (editor) nerobí nič 25 DATA DATA a,b,c hodnoty pre READ 14 DEG, RAD DEG uhly v stupňoch, v radiánoch 16 DIM DIM A$(n),B(n),C(r,s) vyhradí reťazec, pole, tabuľku 6, 13 DOS DOS odíde do DOS-u 25 DRAWTO DRAWTO x,y čiara z posledného bodu 20 END END ukončí program 3 ENTER, LOAD, SAVE (editor) len hláška 25 FOR … NEXT FOR I=a TO b STEP c … NEXT I slučka s počítadlom 10 GET GET #k,A prečíta bajt z kanála 24 GOSUB … RETURN GOSUB n zavolá podprogram 11 GOTO GOTO n skok na riadok 9 GRAPHICS GRAPHICS režim prepne režim obrazovky 19, 20 IF … THEN IF podmienka THEN príkazy podmienka 8 INPUT INPUT A, INPUT #k,A prečíta riadok z klávesnice, z kanála 7, 24 LET LET A=5 priradenie; slovo je nepovinné 4 LIST (editor) čísla 1–30 a hláška 25 LOCATE LOCATE x,y,A zistí pero bodu 20 LPRINT LPRINT čo výpis na tlačiareň 24 NEW NEW ukončí program 25 NOTE, POINT NOTE #k,S,B zapamätá a nastaví miesto v súbore 24 ON ON X GOTO a,b, ON X GOSUB a,b výber podľa čísla 12 OPEN OPEN #k,režim,0,\"D:MENO\" otvorí kanál 24 PLOT PLOT x,y bod 20 POKE POKE adresa,hodnota zapíše bajt do pamäte 18 POP POP zabudne posledný GOSUB 11 POSITION POSITION stĺpec,riadok postaví kurzor 19 PRINT, ? PRINT a;b,c, PRINT #k;a výpis 3, 24 PUT PUT #k,hodnota zapíše bajt do kanála 24 READ READ A,B$ prečíta hodnoty z DATA 14 REM REM text komentár 3 RESTORE RESTORE, RESTORE n DATA od začiatku, od riadka 14 RUN RUN spustí program odznova 17 SETCOLOR SETCOLOR register,odtieň,jas nastaví farbu 19, 20 SOUND SOUND hlas,výška,skreslenie,hlasitosť tón 21 STATUS STATUS #k,S stav kanála 24 STOP STOP ukončí program s výpisom riadka 17 TRAP TRAP n pri chybe skoč na riadok 17 XIO XIO príkaz,#k,a,b,\"D:MENO\" zvláštna operácia zariadenia 24 Príkazy Turbo-BASICu XL Príkaz Tvar Čo robí Kap. -- -- nerobí nič (čiara vo výpise) 26 *B, *F, *L *B, *B - BREAK ako chyba; FOR s nula prechodmi; odsadenie výpisu 38 BGET, BPUT BGET #k,adresa,koľko blok pamäte zo súboru, do súboru 34 BLOAD, BRUN BLOAD \"D:MENO\" nahrá, nahrá a spustí strojový kód 37 CIRCLE CIRCLE x,y,r, CIRCLE x,y,rx,ry kružnica, elipsa 35 CLOSE CLOSE bez čísla zavrie kanály 1–7 24 CLS CLS, CLS #6 zmaže obrazovku 26, 35 DEL, DUMP, RENUM (editor) len hláška 38 DELETE DELETE \"D:MENO\" zmaže súbor 37 DIR DIR, DIR \"D:*.TXT\" vypíše súbory na diskete 37 DO … LOOP slučka bez konca 29 DPOKE DPOKE adresa,hodnota zapíše dva bajty 34 DSOUND DSOUND hlas,výška,skreslenie,hlasitosť tón so šestnásťbitovou výškou 36 ELSE, ENDIF IF podmienka … ELSE … ENDIF podmienka na viac riadkov 27 EXEC EXEC meno zavolá procedúru 30 EXIT EXIT opustí slučku DO, WHILE, REPEAT, FOR 29 FCOLOR FCOLOR n pero pre FILLTO 35 FILLTO FILLTO x,y čiara s výplňou doprava 35 GET GET K bez kanála: počká na kláves 32 GO# GO# meno skok na návestie 30 INPUT INPUT \"text\";A, INPUT \"text\",A otázka v príkaze 26 LOCK, UNLOCK LOCK \"D:MENO\" zamkne, odomkne súbor 37 MOVE, -MOVE MOVE odkiaľ,kam,koľko skopíruje pamäť 34 ON ON X EXEC a,b, ON X GO# a,b výber procedúry, návestia 30 PAINT PAINT x,y vyplní uzavretú plochu 35 PAUSE PAUSE n počká n päťdesiatin sekundy 33 PROC … ENDPROC PROC meno procedúra 30 PUT PUT 65,66 bez kanála: vypíše znaky na obrazovku 32 RENAME RENAME \"D:STARE,NOVE\" premenuje súbor 37 REPEAT … UNTIL UNTIL podmienka slučka s podmienkou na konci 28 RESTORE, TRAP RESTORE #meno, TRAP #meno s návestím 30 SOUND, DSOUND SOUND bez čísel: vypne všetky hlasy 36 TEXT TEXT x,y,text text v grafike 35 TRACE TRACE, TRACE - výpis čísel riadkov 38 WHILE … WEND WHILE podmienka slučka s podmienkou na začiatku 28 # meno # meno návestie 30 %PUT, %GET %PUT #k,číslo číslo v šiestich bajtoch do súboru a späť 34 Funkcie Funkcia Čo vráti AB Kap. ABS(x) číslo bez znamienka áno 5 ADR(A$) adresa textu reťazca áno 18 ASC(A$) kód prvého znaku áno 15 ATN(x) arkustangens áno 16 CHR$(n) znak s kódom n áno 15 CLOG(x) desiatkový logaritmus áno 16 COS(x) kosínus áno 16 EXP(x) e na x áno 16 FRE(0) voľná pamäť áno 18 INT(x) celé číslo smerom nadol áno 5 LEN(A$) počet znakov áno 6 LOG(x) prirodzený logaritmus áno 16 PADDLE(n), PTRIG(n) otočný ovládač a jeho tlačidlo áno 22 PEEK(a) bajt z pamäte áno 18 RND(0) náhodné číslo 0 až 1 áno 16 SGN(x) znamienko: -1, 0, 1 áno 5 SIN(x) sínus áno 16 SQR(x) druhá odmocnina áno 5 STICK(n), STRIG(n) joystick a jeho tlačidlo áno 22 STR$(x) číslo ako text áno 15 USR(a,…) zavolá strojový kód áno 23 VAL(A$) text ako číslo áno 15 DEC(A$) šestnástkový text ako číslo – 31 DPEEK(a) dva bajty z pamäte – 34 ERR, ERL číslo a riadok poslednej chyby – 38 FRAC(x) desatinná časť – 31 HEX$(n) číslo šestnástkovo – 31 INKEY$ stlačený kláves, bez čakania – 32 INSTR(A$,B$,n), UINSTR miesto textu v texte – 32 RAND(n) náhodné celé číslo 0 až n-1 – 31 TIME, TIME$ čas od zapnutia – 33 TRUNC(x) odreže desatinnú časť – 31 Operátory Od tých, ktoré sa počítajú najskôr, po tie, ktoré sa počítajú naposledy. Rovnako silné idú zľava doprava.\nPoradie Atari BASIC Turbo-BASIC XL navyše 1 ( ) 2 porovnanie dvoch reťazcov 3 mínus pred číslom, NOT (NOT až na úrovni 8) 4 ^ 5 \u0026 ! EXOR 6 * / DIV MOD 7 + - 8 = \u003c\u003e \u003c \u003e \u003c= \u003e= potom NOT 9 AND 10 OR Tri veci, ktoré prekvapia:\n-3^2 je 9: mínus pred číslom sa počíta pred umocnením. 2^3^2 je 64: umocnenie ide zľava. NOT je v Atari BASICu „znamienko“ (NOT A=B je (NOT A)=B), v Turbo-BASICu XL až za porovnaniami. So zátvorkou to vyjde v oboch rovnako. Porovnanie dáva 1 (platí) alebo 0 (neplatí). AND, OR a NOT berú každé nenulové číslo ako „platí“.\nČísla a mená Atari BASIC Turbo-BASIC XL čísla 10 číslic, od 1E-98 po 9.99999999E+97 to isté čísla s --int celé, od −2 147 483 648 po 2 147 483 647; desatinné len premenné z REM @FLOAT (kapitola 50) to isté zápis 12, 0.5, 1.5E6 navyše $FF, %0–%3 mená premenných písmeno, potom písmená a číslice; len veľké navyše _ a malé písmená reťazec MENO$, pred použitím DIM to isté pole MENO(n) alebo MENO(r,s), pred použitím DIM, index od 0 to isté počet premenných 128 256 číslo riadka 0 až 32767 to isté; s --no-line-numbers žiadne (kapitola 47) skratka príkazu PR. je PRINT, . je REM to isté program z viacerých súborov nie s --modern a --no-line-numbers riadok INCLUDE \"SÚBOR\" (kapitola 47) Slová Basic26 pre skrytú pamäť Platia len s voľbou --xmem, v oboch jazykoch. Kapitoly 44 až 46.\nSlovo Tvar Čo robí XBANKS funkcia počet bánk rozšírenej pamäte XPEEK, XDPEEK XPEEK(b,a) bajt, dva bajty XPOKE, XDPOKE XPOKE b,a,v zapíše bajt, dva bajty XFILL XFILL b,a,n,v vyplní n bajtov XMOVE XMOVE sb,s,db,d,n skopíruje n bajtov XPUT XPUT b,a,A$ zapíše znaky reťazca XGET$ XGET$(b,a,n) reťazec z n bajtov XPRINT XPRINT b,a,s, XPRINT #k,b,a,s vypíše text po bajt s XBGET, XBPUT XBGET #k,b,a,n blok zo súboru, do súboru XUNPACK XUNPACK sb,s,db,d rozbalí dáta z --pack XBANK XBANK b banka v okne natrvalo XANTIC XANTIC b obraz z banky Slová Basic26 pre hráčov a strely Platia len s voľbou --modern, v oboch jazykoch. Kapitola 49.\nSlovo Tvar Čo robí PMGRAPHICS PMGRAPHICS m 0 vypne, 1 jemné pásy, 2 hrubé PMCREATE PMCREATE n,T$,w,x,y nakreslí objekt (0–3 hráči, 4–7 strely) PMSHAPE, PMCLEAR PMSHAPE n,T$, PMCLEAR n iný tvar, zmaže objekt PMMOVE, PMHPOS, PMVPOS PMMOVE n,x,y poloha PMWIDTH, PMCOLOR, PMPRIORITY PMCOLOR n,odtieň,jas šírka, farba, poradie s obrazom PMX, PMY, PMADR funkcie poloha, adresa pásu PMHIT, PMHITPF, PMHITPM PMHIT(n,c) nárazy od HITCLR HITCLR, PMWAIT zabudne nárazy, počká na snímku PMOVERLAP PMOVERLAP(a,b) prekrývajú sa? Späť: 50. Rýchle celé čísla · Ďalej: B. Voľby prekladača\n","t":"A. Jazyk na jednej strane","u":"a-jazyk/"},{"c":"Basic26 [voľby] program Program môže byť výpis (.abas, .tbas), program uložený cez SAVE (.bas), súbor na obraze diskety (disk.atr:MENO.BAS) alebo hotový .xex na spustenie. Basic26 --help vypíše voľby po anglicky.\nStĺpec V programe hovorí, či voľba smie stáť v hlavičke REM @COMPILE (kapitola 40).\nVýstup Voľba Čo robí V programe Kap. -o súbor meno výsledného súboru (inak meno programu s .xex) – 39 -v, --verbose vypíše, čo prekladač robí – 39 --list súbor program ako text (UTF-8) – 41 --list-atascii --list nechá v kódoch Atari, bajt po bajte – 41 --save súbor program tak, ako ho ukladá SAVE (zo SAVEd programu alebo z .xex, v ktorom je schovaný) – 41 --listing súbor vygenerovaný strojový kód s riadkami BASICu – 39 --map súbor mapa pamäte – 39 --memory po preklade súhrn: koľko pamäte program zaberá a koľko zostáva – 42 --memory-map každý kus pamäte s adresou – 42 --mem-lo A, --mem-top A odkiaľ a pokiaľ počíta --memory – 42 --lab súbor mená adries pre ladiace nástroje emulátorov – 39 --mads súbor zdroják pre assembler MADS – 39 --scramble zakóduje súbor, aby sa v ňom nedalo nič prečítať; po nahratí ho vráti krátky dekodér áno 48 --scramble-fx meno --scramble a efekt na obrazovke počas dekódovania: none, bars, bars-border, mono, mono-border, rainbow, rainbow-border, slow, slow-border, dots, dots-bars, blank, bars-blank, inc, inc-border áno 48 --scramble-level n --scramble s úrovňou zakódovania: 1 (predvolená) alebo silnejšia 2 áno 48 --scramble-key číslo kľúč zakódovania: pri úrovni 1 $01–$FF (bez neho $A7), pri úrovni 2 $0001–$FFFF (bez neho pri každom preklade iný) áno 48 Jazyk Voľba Čo robí V programe Kap. --dialect atari | turbo ktorý BASIC to je (inak podľa prípony) áno 26 --strict hlási, čo by pôvodný interpreter odmietol, a príkazy editora áno 25 --quirks prijme, čo prijme interpreter; chyba príde až za behu áno 39 --xmem zapne slová skrytej pamäte (XPEEK …) áno 44 --no-line-numbers program v Turbo-BASICu XL bez čísel riadkov; skáče sa len na mená áno 47 --modern rozšírenia jazyka: INCLUDE (s --no-line-numbers) a hráči a strely (PMGRAPHICS …) áno 47, 49 --int čísla sú celé, v štyroch bajtoch; desatinné len premenné z REM @FLOAT áno 50 --charmap súbor písmená s diakritikou v textoch dostanú kódy, na ktorých ich má znaková sada programu áno 43 --screen-codes texty v úvodzovkách sú uložené ako kódy pamäte obrazovky, pre program, ktorý ich tam zapisuje sám áno 43 --from-cp1250 výpis písaný na PC vo Windows-1250: české písmená sa prevedú na kódy českej znakovej sady Atari – 41 --no-source-options nečíta REM @COMPILE v programe – 40 Veľkosť a rýchlosť Voľba Čo robí V programe Kap. -O2 najrýchlejší program (predvolené) áno 39 -O1 až o 500 bajtov menší, o niečo pomalší áno 39 -O0 bez zlepšení a s celou knižnicou áno 39 --rom-fp počíta rutinami operačného systému: pomalšie, asi o 1 700 bajtov menej áno 39 Miesto v pamäti Voľba Čo robí V programe Kap. --origin adresa kde program začína (predvolene $2000; $0700 bez DOS-u) áno 42 --ramtop adresa kde končí pamäť (predvolene $C000) áno 42 --reserve A-B pamäť A až B nechať voľnú áno 42 --basic-screen obrazovka na $9C40 ako s cartridge BASICu áno 42 --keep-rem[=ktoré] riadky REM ostanú v pamäti: všetky, none, alebo 0-9,500 áno 42 --line-delay N[@OD-DO] riadky (všetky alebo z rozsahu) čakajú N × 100 cyklov áno 42 --exit-to-dos po skončení programu návrat do DOS-u áno 41 Pribalené súbory Voľba Čo robí V programe Kap. --embed súbor.xex nahrá časti iného .xex áno 43 --embed súbor@adresa nahrá súbor na adresu áno 43 --embed súbor@$C000 … pod ROM áno 45 --embed súbor@banka:adresa … do banky rozšírenej pamäte áno 45 --patch adresa=b,b,… zmení bajty v tom, čo --embed nahral áno 43 --file MENO=súbor pribalí súbor, ktorý program otvára menom áno 43 Texty a kompresia Voľba Čo robí V programe Kap. --pack-text zbalí texty programu (8–255 znakov) áno 46 --text-under-rom texty do RAM pod ROM áno 46 --text-in-banks[=N] texty do bánk (najviac N, bez čísla 4) áno 46 --pack vstup je ľubovoľný súbor, výstup -o je zbalený pre XUNPACK – 46 --unpack opak --pack – 46 --data-only zapíše len dáta pre banky a RAM pod ROM – 45 --code-only zapíše program bez nich – 45 Diskety Voľba Čo robí V programe Kap. --atr disk.atr uloží program na obraz diskety tak, aby ho DOS spustil sám; disketu, ktorá nie je, vyrobí áno 41 --dos meno ktorý DOS na novú disketu: dos25 (predvolené), mydos, sparta, bwdos, litedos, wolfdos, alebo súbor .atr áno 41 --dir disk.atr vypíše obsah obrazu diskety a nič iné – 41 Spustenie Voľba Čo robí Kap. --run spustí program v emulátore atari800 2 --emulator cesta kde je atari800.exe 39 --sim spustí program vo vstavanom simulátore 2 --sim-input súbor odpovede pre INPUT 7 --sim-screen na konci vypíše obrazovku 18 --sim-console K@N,… klávesy START (6), SELECT (5), OPTION (3) od kroku N 39 --sim-trig T[=V]@N,… tlačidlo joysticku 0 alebo 1 stlačené od kroku N (=1 ho pustí) 39 --sim-stick S=V@N,… joystick 0 alebo 1 od kroku N: 15 stred, 11 vľavo, 7 vpravo, 14 hore, 13 dole 39 --sim-ntsc simulovaný stroj je NTSC (predvolene PAL) 39 --sim-limit N najviac N krokov (predvolene 10 000 000) 39 --sim-mem stroj 64, 130xe, 192, rambo320, compy320, 576, 1088 44 --sim-profile súbor koľkokrát sa vykonala ktorá adresa (číta sa s --lab) – --rom súbor ROM operačného systému pre simulátor 39 Ostatné Voľba Čo robí --werror upozornenia sú chyby --max-errors N po N chybách prestať (predvolene 20, 0 = bez obmedzenia) --assemble vstup je zdroják v assembleri 6502, nie BASIC @súbor ďalšie voľby zo súboru -h, --help návod --version verzia Najčastejšie príkazy Basic26 program.abas --sim Basic26 program.abas --sim --sim-input odpovede.txt Basic26 program.abas --run Basic26 program.abas --atr disk.atr --run Basic26 stara.atr:HRA.BAS --list hra.abas Späť: A. Jazyk na jednej strane · Ďalej: C. Chyby\n","t":"B. Voľby prekladača","u":"b-volby/"},{"c":"Chyby sú dvojaké:\npri preklade – prekladač program neprijme a vypíše hlásenie s kódom B26…; súbor .xex nevznikne, za behu – program sa preložil, ale počas behu narazil na niečo, čo sa nedá vykonať; vypíše ERROR- a číslo. Chyby za behu Preložený program hlási tie isté čísla ako interpreter. Takto vyzerá hlásenie:\nERROR- 11 AT LINE 60 Program pre Turbo-BASIC XL (.tbas) pridá k číslu slovo:\nERROR- 11 OVERFLOW AT LINE 60 Chybu možno zachytiť príkazom TRAP (kapitola 17); jej číslo je potom v PEEK(195), v Turbo-BASICu XL aj v ERR.\nChyby BASICu Číslo Slovo v Turbo-BASICu XL Čo znamená Najčastejšia príčina 2 MEM nie je pamäť priveľký DIM; pozri kapitolu 42 3 VALUE hodnota mimo rozsahu SQR(-1), LOG(0), POKE s číslom nad 255, záporný index 4 \u003e#VARS priveľa premenných viac než 128 (Atari BASIC) alebo 256 5 $LEN reťazec: mimo dĺžky A$(7) pri texte dlhom 5; zápis za hranicu DIM 6 ?DATA došli dáta READ a žiadne DATA už nie sú 7 \u003e32767 číslo väčšie než 32767 tam, kde sa čaká číslo riadka 8 INPUT text namiesto čísla INPUT alebo READ do číselnej premennej 9 DIM pole alebo reťazec chýba DIM, DIM dvakrát, index mimo poľa 10 STACK priveľa vnorení príliš veľa GOSUB alebo FOR do seba 11 OVERFLOW číslo sa nezmestí delenie nulou, výsledok nad 1E98 12 ?LINE riadok neexistuje vypočítaný GOTO, alebo --quirks 13 ?FOR NEXT bez FOR skok doprostred slučky 14 TOO LONG riadok je príliš dlhý 15 ?DEL zmizol riadok slučky alebo podprogramu 16 ?GOSUB RETURN bez GOSUB chýba END pred podprogramami 17 GARBAGE riadok nedáva zmysel chybný riadok preložený s --quirks 18 ?CHR zlý znak VAL textu, ktorý nie je číslo 20 # zlé číslo kanála kanál 8 a viac; v Atari BASICu kanál 0 mimo PRINT a INPUT Turbo-BASIC XL navyše:\nČíslo Slovo Čo znamená 22 ?NEST zle vnorené slučky 23 ?WHILE WEND bez WHILE 24 ?REPEAT UNTIL bez REPEAT 25 ?DO LOOP bez DO 26 ?EXIT EXIT v slučke, ktorá nie je otvorená (skok do jej tela) 27 XPROC program vbehol do procedúry 28 ?EXEC ENDPROC bez EXEC 29 ?PROC procedúra neexistuje 30 ?# návestie neexistuje Väčšinu chýb 22 až 30 nájde prekladač už pri preklade.\nBasic26 navyše:\nČíslo Čo znamená 60 banka rozšírenej pamäte, ktorú stroj nemá (kapitola 44) Chyby zariadení Čísla od 128 prichádzajú z operačného systému a z DOS-u (kapitola 24).\nČíslo Slovo Čo znamená 128 stlačený BREAK (po *B) 129 IS OPEN kanál je už otvorený 130 ?DEV zariadenie neexistuje (chýba DOS?) 131 WR ONLY čítanie z kanála otvoreného na zápis 132 CMD zariadenie taký príkaz nepozná 133 NOT OPEN kanál nie je otvorený 134 # zlé číslo kanála 135 RD ONLY zápis do kanála otvoreného na čítanie 136 EOF koniec súboru 137 TRUNC riadok v súbore je dlhší, než sa dá prečítať 138 TIMEOUT zariadenie neodpovedá (tlačiareň, mechanika) 139 NAK zariadenie príkaz odmietlo 141 CURSOR kurzor alebo bod mimo obrazovky 144 DONE zariadenie hlási chybu (disketa chránená proti zápisu) 145 MODE zlý grafický režim 146 NOT IMPL zariadenie túto funkciu nemá 147 RAM na grafický režim nie je pamäť 160 zlé číslo mechaniky 161 \u003e#FILES priveľa otvorených súborov 162 DSK FULL disketa je plná 164 FILE# poškodený súbor 165 NAME zlé meno súboru 167 LOCKED súbor je zamknutý 169 \u003eDIR adresár diskety je plný 170 ?FILE súbor neexistuje Hlásenia, ktoré nie sú chyba Hlásenie Čo znamená STOPPED AT LINE n príkaz STOP alebo kláves BREAK NOT IN COMP PRG príkaz editora, ktorý v preloženom programe nemá čo robiť (kapitola 25) n BANKS OF EXTENDED MEMORY NEEDED program potrebuje stroj s bankami (kapitola 45) THE DATA FILE IS NOT LOADED program z --code-only nenašiel svoje dáta Hlásenia prekladača program.abas(2,9): error B26017: expected '=' after a string Súbor, v zátvorke riadok a stĺpec v súbore (nie číslo riadka BASICu), error alebo warning, kód a popis po anglicky. Opravuj vždy prvú chybu; ďalšie bývajú jej následkom.\nKódy 2 až 30 zodpovedajú číslam chýb interpretera – prekladač tú istú chybu našiel skôr, než program spustil.\nChyby Kód Kedy Čo s tým B26005 index reťazca za hranicou DIM zväčši DIM alebo oprav index B26011 s --int: zlomok do celej premennej, STEP so zlomkom pri celej premennej, číslo za hranicou 32 bitov premennú do REM @FLOAT (kapitola 50) B26006 RESTORE na riadok, za ktorým nie sú DATA B26008 INPUT bez premennej v Atari BASICu nie je INPUT \"text\";A B26009 DIM dvakrát; index poľa za hranicou B26012 GOTO, GOSUB, THEN na riadok, ktorý nie je oprav číslo; pre dobový program --quirks B26013 NEXT bez FOR, alebo s inou premennou slučky sa nesmú krížiť B26017 riadku nerozumie – najčastejšia chyba preklep v príkaze; malé písmená v Atari BASICu; meno premennej začína slovom BASICu; príkaz Turbo-BASICu v súbore .abas B26023 koniec bez začiatku: WEND, UNTIL, LOOP, ELSE, ENDIF B26030 EXIT mimo slučky B26024 začiatok bez konca: FOR, WHILE, REPEAT, DO, IF doplň NEXT, WEND, UNTIL, LOOP, ENDIF B26028 EXEC, GO# na meno, ktoré nie je B26040 čakala sa hodnota; s --int porovnanie X/N\u003cINT(X/N), ktoré vyjde vždy rovnako výraz nie je dokončený (PRINT 5+) B26041 chýba zátvorka B26042 text tam, kde má byť číslo, alebo naopak; reťazec v REM @FLOAT chýba $ v mene; spájanie textov plusom B26043 chýba THEN B26044 riadok sa nezačína číslom; alebo príkaz menuje číslo riadka v programe s --no-line-numbers kapitola 47 B26056 XBANK bez --reserve $4000-$7FFF kapitola 45 B26057 INCLUDE: súbor sa nenašiel, vkladá sám seba, priveľa úrovní, za menom ešte niečo, alebo program má čísla riadkov či nemá --modern kapitola 47 B26099 RUN \"D:MENO\"; s --int *F preložený program nevie nahrať iný program; *F bez --int B26200 zlá voľba na príkazovom riadku Basic26 --help B26201 súbor sa nenašiel alebo sa nedá čítať B26202 výstup by prepísal vstup daj -o s iným menom B26213 simulátor: program neskončil čaká na kláves, hodiny, alebo je v nekonečnej slučke; --sim-limit B26227 kód programu sa nezmestí pred --reserve nižší --origin, menší program B26232 voľba v REM @COMPILE, ktorá tam nepatrí daj ju na príkazový riadok Upozornenia Preklad nezastavia (ak nie je zapnuté --werror).\nKód Kedy B26046 dve návestia alebo procedúry s rovnakým menom; platí prvé B26048 textu chýba úvodzovka na konci B26210 v texte je znak, ktorý Atari nemá (písmeno s diakritikou); v programe z neho bude ? – kde ho má znaková sada programu, povie --charmap (kapitola 43) B26219 príkaz editora (LIST, SAVE …) – s --strict je to chyba B26230 program robí niečo, čo interpreter znesie, ale stojí za pozornosť: riadky nie sú v poradí, POKE 106, meno začínajúce na NOT vo výpočte, skok na neexistujúci riadok s --quirks B26231 riadok REM s dátami ostáva v pamäti B26232 REM @COMPILE alebo REM @FLOAT za prvým príkazom; príkazový riadok prebil voľbu z programu; REM @FLOAT bez --int alebo s menom, ktoré program nemá B26233 s --int: A/B*C stratí zlomok A/B skôr, než násobí; X/N=INT(X/N) sa preloží ako „N delí X“; INT(A/B) je A/B; X=RND(…) je vždy 0; delenie celých čísel do premennej z REM @FLOAT (kapitola 50) B26234 POKE, DPOKE alebo MOVE na pevnú adresu v zásobníku procesora ($0100–$01F9), kde program aj interpreter držia návratové adresy B26235 číslo v DATA s medzerou za sebou (DATA 1,2 na konci riadku): READ ho ako číslo neprečíta a skončí chybou 8, aj v interpreteri. Editor Atari medzery na konci riadku zahodí, výpis upravený na PC ich môže mať B26236 meno na začiatku príkazu sa začína príkazom: LETTER=4 je LET TER=4, a LETTER inde v programe je iná premenná. Hlási sa, len keď program také celé meno inde používa – zhustené IFA\u003c\u003eB alebo FORI=1TO3 nie Späť: B. Voľby prekladača · Ďalej: D. Atari v číslach\n","t":"C. Chyby","u":"c-chyby/"},{"c":"Tabuľky, do ktorých sa pri programovaní pre Atari nahliada najčastejšie.\nZnaky ATASCII Kód znaku je to, čo vracia ASC a čo berie CHR$ (kapitola 15).\nKódy Znaky 0–26 grafické znaky (čiary, rohy, srdce, trojuholníky) – na klávesnici Atari cez CTRL a písmeno 27–31 riadiace kódy (pozri nižšie) 32 medzera 33–47 ! \" # $ % \u0026 ' ( ) * + , - . / 48–57 číslice 0–9 58–64 : ; \u003c = \u003e ? @ 65–90 veľké písmená A–Z 91–95 [ \\ ] ^ _ 96 grafický znak (kosoštvorec) 97–122 malé písmená a–z 123–124 grafický znak (pik), zvislá čiara 125–127 riadiace kódy 128–255 tie isté znaky inverzne (kód + 128); niektoré sú riadiace kódy Riadiace kódy – PRINT CHR$(kód) nevypíše znak, ale niečo urobí:\nKód Čo urobí 27 ESC: nasledujúci riadiaci kód sa vypíše ako znak, nevykoná sa 28, 29, 30, 31 kurzor hore, dole, vľavo, vpravo 125 zmaže obrazovku 126 zmaže znak pred kurzorom 127 tabulátor 155 koniec riadka (RETURN) 156, 157 zmaže riadok, vloží riadok 253 pípne 254, 255 zmaže znak, vloží znak Pamäť obrazovky drží znaky pod inými číslami (kódy obrazovky): znaky 32–95 majú kód o 32 menší (medzera 0, A 33), znaky 0–31 o 64 väčší, 96–127 rovnaký.\nKódy klávesov PEEK(764) dáva číslo klávesu, nie kód znaku (kapitola 22). 255 znamená, že nič stlačené nebolo. So SHIFT je kód o 64 väčší, s CTRL o 128.\nKláves Kód Kláves Kód Kláves Kód Kláves Kód A 63 K 5 U 11 1 31 B 21 L 0 V 16 2 30 C 18 M 37 W 46 3 26 D 58 N 35 X 22 4 24 E 42 O 8 Y 43 5 29 F 56 P 10 Z 23 6 27 G 61 Q 47 medzera 33 7 51 H 57 R 40 RETURN 12 8 53 I 13 S 62 ESC 28 9 48 J 1 T 45 TAB 44 0 50 Klávesy START, SELECT a OPTION sú na adrese 53279: 7 nič, 6 START, 5 SELECT, 3 OPTION; pri viacerých naraz sa čísla „odčítajú“ (START + SELECT je 4).\nJoystick Hodnoty STICK(0):\nvľavo stred vpravo hore 10 14 6 stred 11 15 7 dole 9 13 5 STRIG(0) je 0, keď je tlačidlo stlačené.\nGrafické režimy Režim Druh Rozmery s oknom Bez okna (+16) Pier Pamäť 0 text 40 × 24 – 1 farba, 2 jasy 1 KB 1 text 20 × 20 20 × 24 5 0,5 KB 2 text 20 × 10 20 × 12 5 0,3 KB 3 body 40 × 20 40 × 24 4 0,3 KB 4 body 80 × 40 80 × 48 2 0,5 KB 5 body 80 × 40 80 × 48 4 1 KB 6 body 160 × 80 160 × 96 2 2 KB 7 body 160 × 80 160 × 96 4 4 KB 8 body 320 × 160 320 × 192 1 farba, 2 jasy 8 KB 9 body – 80 × 192 16 jasov jednej farby 8 KB 10 body – 80 × 192 9 8 KB 11 body – 80 × 192 16 farieb jedného jasu 8 KB 12 text 40 × 20 40 × 24 5 1 KB 13 text 40 × 10 40 × 12 5 0,5 KB 14 body 160 × 160 160 × 192 2 4 KB 15 body 160 × 160 160 × 192 4 8 KB +16 zruší textové okno, +32 nezmaže obrazovku. Pamäť obrazovky si Atari berie z konca voľnej pamäte, takže režim 8 a 15 uberie programu 8 KB.\nFarby SETCOLOR register,odtieň,jas (kapitoly 19 a 20). To isté sa dá zapísať priamo: POKE 708+register,odtieň*16+jas.\nRegister Adresa Režim 0 Režimy 3, 5, 7, 15 Režim 8 Po zapnutí 0 708 – COLOR 1 – oranžová (2,8) 1 709 jas písmen COLOR 2 jas bodov svetlozelená (12,10) 2 710 pozadie COLOR 3 pozadie modrá (9,4) 3 711 – – – červená (4,6) 4 712 okraj pozadie a okraj (COLOR 0) okraj čierna (0,0) Odtiene: 0 sivá, 1 zlatá, 2 oranžová, 3 červená, 4 ružová, 5 fialová, 6 modrofialová, 7 modrá, 8 modrá, 9 svetlomodrá, 10 tyrkysová, 11 modrozelená, 12 zelená, 13 žltozelená, 14 olivová, 15 svetlooranžová. Jas: párne čísla 0 (najtmavšia) až 14 (najsvetlejšia).\nZvuk SOUND hlas,výška,skreslenie,hlasitosť (kapitola 21). Výšky pri skreslení 10:\nTón Nízka oktáva Stredná oktáva Vysoká oktáva C 243 121 60 D 217 108 53 E 193 96 47 F 182 91 45 G 162 81 40 A 144 72 35 H 128 64 31 Užitočné adresy Adresa Meno Čo tam je 18, 19, 20 RTCLOK hodiny; bajt 20 sa zväčší 50-krát za sekundu 77 ATRACT po pár minútach bez klávesu začne obrazovka meniť farby; POKE 77,0 to odloží 82, 83 LMARGN, RMARGN ľavý a pravý okraj textu (2 a 39) 84 ROWCRS riadok kurzora 85, 86 COLCRS stĺpec kurzora 87 DINDEX číslo grafického režimu 88, 89 SAVMSC adresa pamäte obrazovky 106 RAMTOP koniec pamäte v stránkach (192 = $C000) 186, 187 STOPLN riadok, na ktorom program skončil chybou alebo STOP 195 ERRSAVE číslo poslednej chyby 201 PTABW šírka stĺpca pre čiarku v PRINT (10) 559 SDMCTL 0 vypne obraz (program beží rýchlejšie), 34 ho zapne 560, 561 SDLSTL adresa zoznamu displeja 702 SHFLOK 64 veľké písmená, 0 malé 708–712 COLOR0–4 farebné registre 752 CRSINH 1 skryje kurzor 756 CHBAS stránka znakovej sady (224 = sada v ROM) 764 CH číslo naposledy stlačeného klávesu, 255 = žiadny 53279 CONSOL START, SELECT, OPTION 53770 RANDOM náhodný bajt 0–255 1536–1791 šiesta stránka: voľné miesto na krátky strojový kód Pamäť Adresy Šestnástkovo Čo tam je 0–255 $0000–$00FF nultá stránka: pracovné bunky systému a BASICu 256–511 $0100–$01FF zásobník procesora; POKE sem môže program zastaviť (upozornenie B26234) 512–1535 $0200–$05FF premenné operačného systému 1536–1791 $0600–$06FF šiesta stránka, voľná 1792–8191 $0700–$1FFF DOS (ak je nahratý) 8192– $2000– preložený program, za ním voľná pamäť –49151 –$BFFF na konci obrazovka 49152–53247 $C000–$CFFF operačný systém (pod ním 4 KB RAM) 53248–55295 $D000–$D7FF obvody: GTIA, POKEY, PIA, ANTIC 55296–65535 $D800–$FFFF operačný systém (pod ním 10 KB RAM) Rozšírená pamäť sa ukazuje v okne 16384–32767 ($4000–$7FFF), kapitola 44.\nZariadenia Meno Zariadenie Režimy OPEN D:, D1:–D8: disketa 4 čítanie, 8 zápis, 9 pripísanie, 12 oboje, 6 zoznam súborov E: editor (obrazovka a klávesnica po riadkoch) 8, 12 S: obrazovka 8, 12 K: klávesnica po znakoch 4 P: tlačiareň 8 C: kazeta 4, 8 R: sériové rozhranie Späť: C. Chyby · Ďalej: E. Slovníček a kam ďalej\n","t":"D. Atari v číslach","u":"d-atari/"},{"c":"Slovníček Slovo Čo znamená adresa číslo miesta v pamäti, 0 až 65535 ANTIC obvod Atari, ktorý kreslí obraz ATASCII tabuľka znakov Atari: každý znak má kód 0 až 255 ATR súbor na PC, ktorý je obrazom celej diskety Atari bajt jedno miesto v pamäti; číslo 0 až 255 banka 16 kilobajtov rozšírenej pamäte, ktoré sa dajú „zasunúť“ do okna na adresách $4000–$7FFF bit jeden z ôsmich prepínačov, z ktorých sa skladá bajt BREAK kláves, ktorý zastaví bežiaci program cartridge zásuvný modul s programom; Atari BASIC bol pôvodne v ňom dialekt ktorý BASIC program používa: Atari BASIC alebo Turbo-BASIC XL DOS program, ktorý na Atari pracuje s disketami emulátor program na PC, ktorý sa správa ako celé Atari (tu atari800) funkcia hotový výpočet s menom: SQR(16), LEN(A$) index číslo prvku v poli alebo znaku v reťazci interpreter pôvodný BASIC na Atari: číta program riadok po riadku a hneď ho vykonáva kanál číslo 0 až 7, pod ktorým má program otvorené zariadenie alebo súbor knižnica hotové rutiny, ktoré prekladač pribalí k programu (výpis, počítanie, kreslenie) komentár poznámka pre človeka; počítač ju preskočí (REM) návestie pomenované miesto v programe (# MENO v Turbo-BASICu XL) pero číslo, ktorým sa kreslí v grafike (COLOR); akú má farbu, hovorí farebný register podprogram časť programu, ktorá sa volá z rôznych miest (GOSUB, PROC) pole rad čísel pod jedným menom: A(0), A(1) … POKEY obvod Atari, ktorý robí zvuk a číta klávesnicu prekladač program, ktorý zdroják premení na program pre počítač; tu Basic26 premenná pomenované miesto na číslo alebo text RAM pamäť, do ktorej sa dá zapisovať; po vypnutí sa stratí RAM pod ROM 14 kilobajtov RAM na adresách, kde procesor bežne vidí operačný systém register miesto v obvode alebo v pamäti, ktoré niečo nastavuje – napríklad farbu reťazec premenná na text; meno sa končí znakom $ riadok jeden očíslovaný riadok programu v BASICu ROM pamäť len na čítanie; je v nej operačný systém Atari simulátor časť prekladača, ktorá preložený program hneď spustí a ukáže, čo vypísal slučka časť programu, ktorá sa opakuje strojový kód pokyny priamo pre procesor stránka 256 bajtov pamäte; stránka 6 sú adresy 1536 až 1791 šestnástkové číslo číslo v sústave so základom 16, píše sa s $: $FF je 255 výraz výpočet z čísel, premenných, znamienok a funkcií XEX súbor s preloženým programom pre Atari zariadenie to, s čím program komunikuje: disketa D:, klávesnica K:, obrazovka S:, tlačiareň P: zdroják text programu tak, ako ho píše človek znaková sada 1 024 bajtov, ktoré hovoria, ako vyzerá každý znak na obrazovke Kam ďalej Príklady Priečinok examples pri prekladači obsahuje stovky programov. Ku každému je krátky popis v súbore .md a hotový .xex.\nexamples/ – programy v Atari BASICu: krátke ukážky príkazov, grafické efekty, hry. examples/turbobasic/ – to isté v Turbo-BASICu XL. examples/textovky/ – veľké textové hry; pozri si ich hlavičky REM @COMPILE, používajú skoro všetko z kapitol 42 až 46. examples/benchmarks/ – testy rýchlosti BASICu (dobové Rugg/Feldman, Byte Sieve, Ahlov test z Creative Computing, bench64 a ďalšie), každý v Atari BASICu aj v Turbo-BASICu XL; na konci vypíšu, ako dlho bežali, takže si môžeš porovnať interpreter s preloženým programom. Čítať cudzie programy je najrýchlejší spôsob, ako sa učiť. Vyber si krátky, prelož ho, spusti – a potom v ňom niečo zmeň.\nVyskúšať program v pôvodnom interpreteri Preložený program má robiť presne to, čo interpreter. Keď si chceš overiť, ako sa program správa v pôvodnom Atari BASICu:\nSpusti emulátor atari800 so zapnutým BASICom (bez voľby -nobasic); objaví sa READY. Program buď napíš rovno do emulátora, alebo ho načítaj zo súboru: ulož výpis do priečinka, ktorý má emulátor nastavený ako zariadenie H:, a napíš ENTER \"H:PROGRAM.LST\". Napíš RUN. Turbo-BASIC XL sa nahráva z diskety; jeho obraz nájdeš na stránkach venovaných Atari.\nČítanie Atari BASIC Reference Manual – pôvodná príručka od Atari; stručný popis každého príkazu. Your Atari Computer (Lon Poole) – veľká kniha o BASICu a počítači pre začiatočníkov. Mapping the Atari (Ian Chadwick) – čo je na ktorej adrese pamäte; nenahraditeľná pri PEEK a POKE. De Re Atari – ako funguje grafika, zvuk a operačný systém, od ľudí z Atari. Turbo-BASIC XL – Expanded Documentation – popis všetkých príkazov Turbo-BASICu XL. AtariAge, Atari8.info, AtariOnline.pl, atari.cz – stránky a fóra, kde sa 8-bitovému Atari venujú dodnes. Iné jazyky Keď ti BASIC začne byť malý: Action! je rýchly jazyk podobný Pascalu, pre ktorý existuje sesterský prekladač action26 a rovnako písaná príručka. A úplne dole je assembler 6502 – jazyk, v ktorom sú napísané hry, na ktoré si z Atari pamätáš.\nSpäť: D. Atari v číslach · Obsah\n","t":"E. Slovníček a kam ďalej","u":"e-slovnik/"}]