24Bře2017
 

Asi tušíte správně, řeč bude o programovacím jazyku BASIC V2, který je implementovaný v počítači Commodore 64. Jeho kvality bych vám rád v kostce popsal. Předně ale něco z historie. Jak se takový softwarový zmetek ocitl v tak sofistikovaném stroji, jakým je Commodore 64? Za všechno můžou samozřejmě peníze. Náš milý, tlustý a ošklivý Jack Tramiel, majitel firmy Commodore, se v sedmdesátých letech rozhodl, že se bude zabývat výrobou počítačů, protože v tom viděl lukrativní příležitost. To mu nakonec vyšlo, o tom není pochyb. Protože to byl ale velký skrblík, obracel v kapse každý dolar a každou kupní smlouvu firmy osobně revidoval a schvaloval. Stalo se, že do svých prvních počítačů potřeboval programovací jazyk. Tehdy se všeobecně dával BASIC. A kdo jiný uměl BASIC nejlépe, než Microsoft? Microsoft ale svůj software licencoval. Mohli jste použít jejich BASIC, ale platili jste jim za to výpalné. Bill Gates tehdy Tramielovi nabízel $3 za jednu licenci, na což mu Jack odpověděl, že již ženatý je a tak Commodore nakonec získal základní interpret BASICu za $25 000 a mohl si s ním dělat, co chtěl. Inženýři v Commodoru dostali za úkol zakoupený software upravit pro potřeby počítačů Commodore a ten se objevil v počítači PET 2001 ve verzi 1.0, která ale nebyla oficiální. Prvním oficiálním BASICem od Commodoru je právě verze 2.0.  Následovala verze 4.0, která byla rovněž v řadě PET. Na začátku osmdesátých let, po úspěchu VIC-20 s BASICem 2.0 přišel o dost vylepšený počítač Commodore 64 (64 v názvu určuje velikost paměti v kilobajtech, a 64kB bylo tehdy opravdu ohromně moc, proto se marketing rozhodl pro toto číslo přímo do názvu). Jak byl a je C64 dobrý, BASIC V2.0 je jedna z jeho nejslabších stránek. Je pravda, že dnes už je to jedno, prakticky všichni, kteří chtějí s tímto počítačem dělat něco seriózního, programují ve strojovém kódu, nicméně nic to nemění na faktu, že tento BASIC je velmi špatný. Není špatný na to, abyste se naučili základům programování, ale jakmile budete chtít programovat hardware počítače, jako je grafický nebo zvukový čip, BASIC V2.0 vám to na rozdíl od konkurenčních počítačů té doby (Atari, ZX Spectrum, Amstrad) neumožní a chtě nechtě budete muset sáhnout po příkazu POKE a adresovat přímo hardware.

Začnu tím, co je na BASICu V2 na Commodoru 64 dobré.

– Okamžitá dostupnost po zapnutí počítače. Zapnete C64 a naskočí BASIC. Možná řeknete, že to je běžná věc, ale není, viz. Sharp MZ, Atari.
– Celoobrazovkový editor, který je zvládnutý velmi dobře. Pro editaci řádku hotového programu i jednotlivého již napsaného příkazu stačí najet kurzorem na něj, provést změnu a odRETURNovat.
– Pohodlné psaní, pohodlné umístění důležitých interpunkčních znamének (+-*/) na klávesnici, klávesnice C64 je nejkvalitnější z dobových stejně rozšířených osmibitů.

…no, a to je asi tak všechno. Bod jedna se tak nějak předpokládá, poslední bod se netýká ani tak BASICu samotného, jako hardwaru, na kterém běží. Moc toho není, že?

Tak a teď nevýhody. Ale že jich je.

– Na jednom programovém řádku může být pouze 80 znaků včetně odřádkování, čili 79.
– Uvozovkový režim (vkládání řídících znaků za uvozovky, např. změna barev) a neuvozovkový režim je nepřehledný. Zvlášť pak to, že uživatel neví, ve kterém módu se zrovna nachází, pokud si nepamatuje svůj poslední krok, to zjistíte jen třeba stisknutím šipky. Pokud se vypíše řídící znak v podobě nějakého symbolu semigrafiky, je režim aktivní. Uvozovkový režim lze ukončit stiskem SHIFT+RETURN.
– Výpis programu příkazem LIST nezastavuje, pouze jde pozdržet klávesou CTRL nebo úplně zastavit klávesou RUN/STOP.
– Názvy proměnných můžou mít pouze dva znaky, AA-ZZ, F2$, X8, QC$, apod., kromě TI a TI$, které jsou definované předem a nelze je měnit. Pokud použijete delší název, BASIC to spapá, ale v potaz bere pouze první dva znaky. Příklad:

proměnné

– Příkaz PRINT lze sice nahradit znakem ? a ušetřit si tím práci, ale interpret jej stejně sám po odřádkování přeloží do podoby PRINT. To se dá využít v případě, že chcete na jeden programový řádek vměstnat víc, než 79 znaků. Pokud ve psaný řádek obsahuje jeden nebo víc PRINTů, lze místo nich použít otazníky a přitom se vejít do regulerních 80 znaků. Po odřádkování (RETURN) a vylistování vidíme, že řádek je delší, než 80 znaků (přibyly PRINTy místo otazníků), ale řádek je stále funkční. To samé platí i pro příkazové zkratky typu rU (RUN), lI (LIST), nE (NEXT), apod. Po znovueditaci takto uloženého řádku se ale uloží jen 79 znaků, takže je třeba řádek napsat zkratkami znovu.

Screen Shot 2017-03-23 at 17.48.58

– V celém programu může existovat pouze jedna skupina příkazů READ/DATA/RESTORE. Interpret totiž neumí syntaxi RESTORE číslo_řádku, jako tomu je v jiných BASICích.
– Nelze jednoduše nastavit pozici kurzoru na libovolném místě obrazovky, myšleno programově. Neexistuje příkaz, který by to dělal, např. POSITION, LOCATE, PRINT AT, atd. Namísto toho je třeba použít buď řídící znaky v uvozovkovém režimu, což značně znepřehledňuje program a naráží na omezení 80 znaků na řádek nebo použít příkaz POKE a nastavit kurzor hardwarově.
– Nelze kreslit grafiku ani sprajty. Neexistuje na to příkaz. Jediné, co můžete, je namalovat si nějaký PETSCII art znakovou grafikou, dostupnou přes různé shifty z klávesnice.
– Nelze ovládat zvukový čip. Řešení je opět jen POKE přímo na hardware.
– Neexistuje Key Repeat, tedy psaní více znaků za sebou pouhým držením klávesy. Toto jde pouze u mezerníku, Backspace a Insertu. Keyrepeat se ale dá pomocí POKE nastavit.
– Pokud napíšete PRINTem (nebo ?) textový řádek, který chcete mít na obrazovce tak, aby začínal v úplně levém rohu (sloupec 0) a končil úplně napravo (sloupec 39) a pod ním chcete mít další takový řádek, je nutné takový PRINT ukončit středníkem, jinak si bude BASIC myslet, že má odřádkovat a udělá mezi takovými řádky mezeru.

Screen Shot 2017-03-23 at 18.06.35

Screen Shot 2017-03-23 at 18.08.22– BASIC V2.0 vloží vše, co napíšete a jak to napíšete (kromě ?, který přeloží na PRINT a ostatních příkazových zkratek). Takže pokud budete psát neúsporně, může se stát, že vám jednoho dne dojde paměť, a to úplně zbytečně.

Screen Shot 2017-03-23 at 18.18.51– BASIC, který na C64 začíná víceméně skoro na začátku adresního prostoru paměti, si vaše proměnné ukládá do paměti úplně na konec a tak čím máte v programu víc proměnných, tím méně máte paměťového prostoru na váš program a tvoří se jakési pomyslné zavírající se nůžky, kdy zdola se paměť zaplňuje psaným programem a shora se plní proměnnými. Je to dost nevhodné řešení např. pro případné vložení externího kódu, jako je hudba, font či jiná grafika nebo rutina ve strojovém kódu. Další zádrhel je v tom, že proměnné se do paměti zapíší až po spuštění programu, což je celkem logické, ale je třeba s tím předem počítat.

V Commodoru si nešikovnost zakoupeného BASICu od Microsoftu nicméně asi uvědomili a vybavili jej různými divnostmi a obezličkami, kterými lze některá omezení obejít:

– Příkazové zkratky

Příkazy lze psát úsporněji, většinou prvními dvěma znaky, přičemž druhý znak se zadává se SHIFTem. Tedy např. příkaz RUN lze napsat jako rU, příkaz RESTORE jako reS, NEXT jako nE, POKE jako pO, atd. Při nastavené velké znakové sadě, např. po zapnutí C64, se tyto zkratky jeví jako písmeno a znak semigrafiky.

– Nepovinný příkaz LET

Příkaz LET je nepovinný ve většině BASICů nejen na Commodoru. Lze jej vynechat a přímo psát název proměnné.

– Nepovinné uvozovky na konci příkazového řádku

Pokud máte v programu řádek, který obsahuje nějaký příkaz používající řetězec v uvozovkách a tento příkaz je na daném řádku jako poslední, nemusíte uvozovky uzavírat. Např. ?”AHOJ nebo C$=”RETEZEC

– Nepovinné středníky

V obecné syntaxi BASICu je dáno, že pokud chcete připojit k řetězci nějaký jiný řetězec nebo jej chcete přerušit a navázat na něj později, případně použijete nějakou funkci ve spojení s řetězcem, vložíte do zápisu středník. Např. 10 PRINT TAB(5);”AHOJ”. BASIC V2.0 vám ale umožní tento zápis: 10 PRINT TAB(5)”AHOJ”.

– 64000 řádků

Nevýhodu 80 znaků se zřejmě pokusili napravit také tím, že BASIC umožňuje vložení až 64000 řádků kódu, přesněji 0-63999. Tolik řádků se do paměti vyhrazené pro BASIC (38911 bajtů) nevejde ani prázdných, natož s nějakým programem.

Nakonec na C64 existuje v BASICu i takový Easter Egg. Po stisku kláves RUN/STOP a RESTORE a zadání POKE781,96:SYS58251 se začnou dít věci. Původní Easter Egg od Microsoftu, kdy se po zadání příkazu WAIT 6502,1 vypsal text MICROSOFT na C64 nefunguje.

Můžete také vyzkoušet zajímavý trik, vykreslující na obrazovku semigrafikou náhodně generované bludiště:
10 PRINT CHR$(205.5+RND(1));:GOTO 10

I když toho BASIC V2.0 moc neumí, dají se v něm s pomocí všemocného POKE a strojového kódu dělat věci, které by do něj leckdo neřekl. Ještě přidávám poděkování Silliconovi za postřehy, které jsem do článku doplnil.

  8 reakcí na “NEŠTĚSTÍ V2.0”

  1. Super clanok :) len dve male poznamky

    “Okamžitá dostupnost po zapnutí počítače. Zapnete C64 a naskočí BASIC. Možná řeknete, že to je běžná věc, ale není, viz. Sharp MZ, Atari.”
    Atari 130/800 maju po zapnuti BASIC okamzite dostupny, takze ake Atari?

    “– Pohodlné psaní, pohodlné umístění důležitých interpunkčních znamének (+-*/) na klávesnici, klávesnice C64 je nejkvalitnější z dobových stejně rozšířených osmibitů.”
    Osobne sa mi zdala Atari kalvesnica lepsia, ale to je asi o preferenciach. Pamatam ze po prechode z A1200 na PC som bol hoodne nestastny prave z klavesnice :)

    • Jasně že na Atari je Basic po zapnutí, ale taky tam být nemusí, pokud bootujeme z diskety, máme Atari 400, apod. Na C64 je Basic vždy. Co se týká klávesnice, opravdu je C64 podle mého názoru to nejlepší, ani Atari XL nemá takovou, i když některé revize XL mají také výbronou klávesnici. Ale tento článek neměl za úkol porovnávat Atari a C64.

  2. Zrovinka jsme tady s Agisí s kterou se ucime zaklady Basicu narazili na tento článek. Určitě “nezvnikl” jako protipól první lekce BASIC V2.0 na http://www.c64.cz .. ze ne :)
    Kazdopadne … Jedna veta z tveho článku je geniální : “Takže pokud budete psát neúsporně, může se stát, že vám jednoho dne dojde paměť, a to úplně zbytečně.”

    Tohle by si měl každý programátor vytetovat ať již programuje na C64 nebo PC nebo kalkulačce .. a k tomu je Basic v2.0 ideální začátek, protože tam je alespoň jasné, že ta paměť dojde :)

  3. Mimochodem .. zde je krasne srovnani jednotlivych Basicu pro pocitace Commodore

    https://www.c64-wiki.com/wiki/BASIC

  4. S tou okamžitou (ne)dostupností Basicu na Atari bych to zas tak nehrotil – především bych vyzdvihl skutečnost, že se Atari vůbec po zapnutí pokouší bootovat z diskety, To podle mě u C64 dost nevychytali, že nelze automaticky spouštět software z disketovky po zapnutí počítače.

    • Jen pro pořádek, tím jsem nechtěl zakládat další flamewar, ta okamžitá dostupnost na C64 je samozřejmě z určitého hlediska výhoda :-)

 Leave a Reply

(required)

(required)

Potvrď, že jsi člověk. Dvakrát. *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>