Nadherny clanek, jako vzdy. diky moc.
Nejakou dobu mi vrta hlavou prikaz SCALE. Nejak jsem mel pocit , ze patril prave do sady prikazu ZXek. Bohuzel v litarature kterou mam doma je k nemu pouze napsano (slovensky) „Zmena mirky“. VTF? Nevite prosim nekdo co presne tenhle program delal a jak se s nim pracovalo? Dik
V BASICU G na PMD 85 2A prikaz
SCALE 0,10,0,10
nastavil soustavu souradnic tak, ze bod (0,0) byl v levem dolnim rohu a (10,10) v pravem hornim rohu monitoru.
resp. prvni dve cisla urcovala rozsah souradnic na ose X a druha dve cisla na ose Y.
jejej to bylo programovani.. :)
jeste me napada ze ty parametry mozna vubec nebyly oddeleny carkou..
a nebylo to z PMD? Kazdopadne na pmd85, pokud me pamet neklame, tak SCALE ma 4 parametry Xmin, Xmax, Ymin, Ymax. Bez pouziti prikazu SCALE se souradnice pro graficke funkce jako napr PLOT, MOVE zadavali v rozmezi x= 0 az 255 a y = 0 az 242 SCALE meni meritko tak ze levy okraj bude mit Xmin, pravy Xmax atd. Anebo jinak, defaultne je SCALE 0,255,0,242 a napr. po prikazu SCALE 100,500,200,600 bude levy okraj zacinat na 100, pravy koncit na 500, spodni bude 200 a horni 600 = levy spodni roh ma soradnice 100,200 a pravy horni 500,600. Nedojde k zadne zmene rozliseni, vsechno prepocitava do rastru 255×242
Spectrum nemalo SCALE, SCALE bolo urcite na PMD-85, pozri aj moj posledny komentar v predoslom clanku – http://www.root.cz/clanky/programovaci-jazyk-basic-na-osmibitovych-mikropocitacich-2/nazory/351950/
Ano, je to nekoncepční s*it, ale mnoho, mnoho a mnoho programátorů na něm začínalo – a štvalo je omezení tohoto jazyku.
Dnes mi připadá velmi zajímavé přečíst si takový článek, zavzpomínat na „staré“ časy a rozhodně je to dobré pro srovnámí možností tehdejší a dnešní výpočetní techniky.
PS: Zvyk je železná košile: při pročítání těch BASICových instrukcí jsem automaticky přeřadil na CESTINU, tedy bez háčků a čárek, byť takto už pár let nepíšu :)
Kdysi na konci 80. let jsem vedl kroužek programování v pionýráku. Byly tam Didaktiky Gama. Pln „koncepčního“ nadšení jsem je začal učit Forth. To jsem dopadl. Tak jsem zkusil alespoň Pascal „HiSoft“ i tak jsem dopadl špatně. Nakonec jsme skončili u BASICU.
Basic je totiž nejrychlejší programovací jazyk, jak dostat rychle výsledek ( když nebyly tabulkové procesory ) .Potřebuji-li si něco rychle a jednorázově spočítat, tak bezkonkurenčně nejrychleji na to udělám program v Basicu.
Když jsem něco potřeboval rychle a pro jedno, nebo pár použití, vždy jsem použil Basic. Jinak jsem programy na Spectru dělal většinou v HiSoft Pascalu.
Přesně tak. Asi se nás většina shodne na tom, že „Spaghetti code“ je špatný. Ale lze vůbec u programu na 20 řádků mluvit o „Spaghetti code“? Jako programovatelná kalkulačka je BASIC výborný. Tedy do doby, než člověk začne pošilhávat po „knihovnách funkcí“, kdy mu začnou globální proměnné podrážet nohy.
Což je ostatně jedna věc, kterou BASIC na ZX Spectru neuměl, a která se dá považovat za zásadní věc a celý BASIC tím poslat na věčnost. Konkrétněji je to volání podprogramů s parametry, základní to kámen rekurze. Například klasický faktoriál:
fact(a): a <= 1 ? a : (a * fact(a-1))
Tohle ZX Spectrum BASIC skutečně neuměl a nedal se k tomu žádným způsobem znásilnit. Proto jsem, coby odchovanec ZX Spectrum BASICU, měl v Pascalu i C trochu problémy s tím, že jsem všechno psal jako iterace. Teprve na VŠ jsem pochopil, k čemu ta rekurze může být dobrá.
Dá se znásilnit.
DEF FN f(n)= VAL ((„1“ AND n<2)+(„n*FN f(n-1)“ AND n >= 2))
viz http://busy.speccy.cz/tvorba/rekurzia.htm
Tak i po 18 letech člověk nachází novinky. Rekurzi jediného výrazu jsem znal, teď už znám i způsob jak zvládnout složitější výraz. Sice to je pořád jen rekuzivní výraz a ne rekurzivní podprogram, ale řada věcí by s tím již řešit šla. Akorát to tedy nevypadá moc hezky a asi bych zůstal u iteračních verzí… Ladit takovouhle rekurzi by se mi nechtělo :-) Každopádně beru zpět své tvrzení, že znásilnit se BASIC nedal.
Je samozřejmě pravda, že BASIC (ten klasický, ne třeba Beta BASIC) na jednu stranu nutil programátory dělat „ústupky“, například používat globální proměnné a řízení běhu programu pomocí GOTO, ale jen velmi málo jazyků bylo možné spolu se základním operačním systémem nacpat například do 4 kB ROM (ZX80) nebo 8 kB (spousta dalších osmibitů).
Napadá mě jedině FORTH, ale ten se (bohužel) nerozšířil tak jako BASIC, i když zrovna v CSSR měl poměrně velkou podporu. No a vzhledem k tomu, že o FORTHu už se tady psalo, tak se doplnil BASICem :-), určitě za tím nehledej agitačku na VB nebo něco podobného.
Ještě bych doplnil myšlenku o zničení programovacího stylu – tak to promin, ale někdo, kdo se nedokáže „přepínat“ mezi různými styly, si nemůže říkat programátor (i když dneska mají mladší raději slovo vývojář :-).
I při programování v současných mainstreamových jazycích (tím myslím strukturované programování trošku říznuté jednou z větví OOP) je nutné pracovat s různými minijazyky a problémově orientovanými jazyky, které mají zcela odlišnou filozofii a programátoři by měli po relativně krátkém čase zvládnout i tyto jazyky a styly.
(nehledě na to, že právě díky omezenostem „osmibitových“ BASICů se programátoři celkem rychle přesouvali směrem k assembleru a například po přechodu na PC k Pascalu, což ovšem mnohdy bylo z bláta do louže :-)
Podle mě víš o programování kulový. Programovací jazyk vždy byl, je a bude jen nástrojem. Při přechodu z BASICu na vyšší jazyky měli někteří ze začátku problémy s přivyknutím na strukturované programování, ale opravdu neznám jediný program v jazyku podporující strukturované programování, přesahující rozsahem nějak výrazněji „hello, world“, který by se hemžil GOTO a byl bez lokálních proměnných. Kromě toho, z BASICu se nejčastěji přecházelo na Assembler a pro ten byl BASIC naopak velmi dobrým předstupněm. A až mi předvedeš nějakou machrovinku, jakou dokázali ti lidé tenkrát vymáčknout ze svých 8bitů, tak teprve bude tvůj názor aspoň trochu relevantní.
Znám spoustu výtvorů, které se dnes dokonce prodávají za peníze a jsou vydávány za práci profesionálů, jejichž autoři o BASICu sice jen četli v historické literatuře, ale ten pravověrný BASICář z doby před 20 lety by to napsal v BASICu elegantněji a lépe, než co zplodili oni v Javě nebo C++ – naprosto zprasený návrh hierarchie tříd a dědických vztahů, indikující, že analytické a abstraktní myšlení je těmto lidem úplně cizí věcí, z toho plynoucí nezbytnost dále to celé prasit a činit ještě neefektivnějším, nepřehlednějším a děravějším. Dneska se holt do programování cpe každé nemehlo, které by před 20 lety nemilosrdně bylo vyřazeno v praktickém životě neschopností konkurovat ostatním a ve školním pomocí matematiky, která se velmi správně považovala za základní předpoklad pro schopnost programovat a analytické uvažování.
ale houby, to je stejne jako ptat se, proc je v muzeu parni stroj …
mimochodem, je celkem zajimave, jakym zpusobem se vlastnosti BASICu obchazely (komentare, fejkovani lokalnich promennych pomoci recyklace nekolika malo globalnich promennzch, dusledne komentovani zacatku podprogramu, pouzivani promennych v prikazu GOSUB jako nahrada za neexistujici procedury, fejkovani struktur pomoci prikazu DATA a RESTORE atd.)
cite: „Nechapu, proc se na rootu pise nekonecny serial o takovem nekoncepcnim shitu, jako je BASIC. Krome toho, ze to je jazyk, ktery rade programatoru nakurvil programovaci styl na cely zbytek zivota, neni nicim zajimavy.“
…
No mozna proto, ze to bylo a podle me asi porad je nejlepsi reseni splnujici pozadavky na nej kladene a bezici na tehdejsim hardwaru.
1) Nahrazoval OS, bash. Takze to musel byt interpret.
2) Slo by udelat asi jen nejaky monitor, text. editor a par zakladnich prikazu na nahravani souboru a spousteni programu, ale mezi tehdejsi zakladni pozadavky na pocitac bylo ze na tom budes moci (konecne) programovat! A to vsichni, vcetne uplnych zacatecniku, takze podle me FORTH odpadava. A pokazde nahravat 5 minut nejaky programovaci jazyk z pasky by se nikomu nechtelo, zvlast kdyz konkurence ho ma implementovany v ROM.
3) IF THEN ELSE, lokalni promene, podprogramy a dalsi „vymozenosti“ tam nejsou proste proto, ze tyhle veci maji svoji rezii a podle me nejdou udelat v interpretu tak, aby nebyly pomalejsi nebo nezabiraly vic pameti. A to si uz rozmyslis jestli budes mit lokalni promene a pomaly program, nebo si promene budes hlidat sam a mit vic pameti a rychlejsi program..
4) Kdo to myslel vazne tak stejne programoval primo v asembleru, ale ten podle tebe musi byt stejne nekoncepcni. :)
Eh.. a odpoved proc se vubec pise o Basicu? No asi proto, ze to nekoho zajima. :) Pro me osobne (kdo to jako maly kluk zazil) je to jeden z nejzajimavejsich clanku na rootu za posledni dobu. Rad jsem si zavzpominal a pokud vim (kdyz jsem se nenapadne vetrel na prednasku) tak se o tomhle tematu uci dodnes. Napr. na FITu http://www.fit.vutbr.cz/study/course-l.php.cs?id=6295 (I kdyz prednasejici jen prezentoval nevyhody a vetsina studentu stejne nevedela o co slo, pokud zrovna nehrala poker ve flashi :) )
Nechapu… ano, skutečně nechápeš.
1) V roce 1964 kdy BASIC vznikl měl koncepci zatraceně dobrou, umožňoval neprogramátorům používat počítače v interaktivním režimu, navíc hromadně, protože to byl první jazyk navržený speciálně pro systém sdílení času. Podobal se pochopitelně FORTRANu, který v té době a ještě pár desetiletí potom počítačům vládl, a umožňoval tak snadný přechod na něj.
2) V sedmdesátých letech patřil k povinné výbavě minipočítačů (i některých mainframů), a používali ho často i profesionálové, zejména proto, jak už tu napsali jiní, že je to jazyk ve kterém se programy tvoří nejsnadněji a nejrychleji, aspoň ty jednoduché. Takže pro zpracování pár stovek nebo tisíc údajů nemá smysl týden něco datlit a odlaďovat v nějakém „skutečném“ programovacím jazyce, když totéž zvládnu za jedno odpoledne v BASICu. Dnes za dvě odpoledne v nějakém spreadsheetu.
3) Právě kvůli té jednoduchosti a přístupnosti laikům byl zvolen jako hlavní jazyk nově vzniklých mikropočítačů (které byly určené „normálním*“ lidem) a spolu s nimi ovládal svět po celé desetiletí jejich slávy, dokonce i originální IBM-PC ho měly v ROM, odkud se spouštěl automaticky, pokud nebyla v mechanice bootovací disketa. Jednu takovou 386ku tady také mám.
4) Root čte spousta lidí kteří s BASICem začínali a dodnes na něj vzpomínají, a také dost takových kteří si aspoň postesknou že tyhle časy bohužel nezažili, a ti mladší se aspoň poučí jak to bylo před lety, kdy se frekvence procesorů měřily ma megahertzy (někdy ani to ne) a velikosti pamětí na kilobajty, neboť „Staré-li seznáš, pro nové sílíš“, jak se tady u nás píše na jedné staré vilce, aspoň jim dojde že problémy se kterými se dnes střetávají dávno před nimi vyřešili jiní, a často lépe.
5) Pokud jde o kurvení stylu, spíš bych nadával na objektové programování a některé „moderní“ jazyky, které sice jako novinky přinášejí funkce, které měl BASIC před skoro padesáti lety, ale z programátorů vychovávají líné lemply, neschopné si ohlídat ani kolik paměti jejich aplikace žere, natož aby je napadlo že přeházením pár vnořených smyček můžou ušetřit stamiliony zbytečných oběhů. Že to v době gigahertzových vícejádrových procesorů a gigabajtových pamětí není třeba? Ale je, a já jsem se to naučil právě v BASICU!
6) Vezmi si příklad z Billa Gatese, ten se „svým“ BASICem protlačil Micro-Soft co počítačového průmyslu, dalo by se říct že to bylo jeho první dílo, a naopak jeho poslední dílo byl GW-Basic, na jehož vývoji se podílel v osmdesátých letech, čímž skončila jeho desetiletá kariéra programátora. Pak následoval Quick Basic a jeho krippleware verze QBasic, potom Visual Basic, C# a .NET. které toho bohužel z BASICu obsahují o dost víc, než by jim bylo ku prospěchu.
7) A navrch aspoň jeden příklad z historie, letoun Voyager, který v roce 1986 jako první obletěl Zeměkouli bez mezipřistání (na jednu nádrž), počítal jeho tvůrce Burt Rutan ve vlastnoručně napsaném programu v BASICu na Apple II.
* Kdo normální by tehdy chtěl mít doma počítač ;-)
P.S. kdyby to jednou někdo četl, tak jsem narazil na zajímavý článek o tom kurvení stylu: programatorske-schopnosti-absolventov-klesaju-problemom-je-java
nj. taky bych osobne Javu jako prvni programovaci jazyk nevolil, ale svadet nedostatecne znalosti studentu na Javu IMHO nejde, je to veci osnov te ktere skoly (a pokud se dnes IT typicky uci v kombinaci napriklad s managementem, tak se neni cemu divit ne?).
Vzdyt Java/BASIC/C/assembler/LISP/… jsou jen nastroje, na kterych se da rozumne stavet az po projiti kurzu o datovych strukturach, grafovych aj. algoritmech, automatech, gramatikach atd. To se doufam na IT skolach jeste uci :-)
Jde o to, co to je IT škola. „IT“ má ve studijním programu dnes každá soukromá VŠ, aby přitáhla zájemce. Ale samozřejmě Vámi naznačené věci se tam neučí a pokud se o nich někdo na nějaké přednášce zmíní, rozhodně je nezkouší. Absolventi pak propadnou přesvědčení, že jsou z nich IT experti, aniž by se computer science vůbec dotkli. To pak samozřejmě deformuje celé odvětví. Navíc – při množství absolventů „IT“ oborů ani není možné, aby se tam ty věci učily – tolik lidí, kolik jich absolvuje, na to prostě tu hlavu v žádném případě nemá a praxe to jen potvrzuje.
Otazkou potom ovšem je, co se tam těch pět let učí :-) Tvorba grafů v Excelu a dělání prezentací v PowerPointu? ;-)
Asi už jsem trošku starý, ale základy algoritmizace, výuku datových struktur (aby student například pochopil, že když bude cpát do asociativního pole prvky se stejným hashem, tak z toho udělá lineární seznam :-), gramatik, automatů a trošku té složitosti (aspoˇn tušit že něco se složitostí O(n3) už může být fuj, raději brát třeba alogritmus s O(n log n)) si myslím patří do „základního IT vzdělání“ nebo to už taky neplatí?
Před delším časem jsem snad v nějakém blogu četl zajímavý zážitek, jak autor nahlédl do skript na výpočetní techniku kamarádovi, co studoval ekonomiku. Jakou byste si tipl odpověď na otázku „Co je to mikroprocesor?“
Správná byla tahle: „Mikroprocesor je hybná síla počítače.“ 8-O
Já jsem (skoro) poznal jednoho človíčka na VS, co po svých studentech na písemné zkoušce chtěl, aby mu napsali, ve kterém menu se nachází různé příkazy Wordu a jak se přesně ty příkazy v tom menu jmenují.
To jsem ovšem považoval za úlet a buzeraci někoho, kdo IT neznal do té míry aby se tím mohl živit nebo to učit na IT-pozitivní škole (tady šlo o farmaceutickou fakultu a IT předmět tam byl jen do počtu).
O tom, že se v tom Wordu učili formátovat bez stylů ani nemluvím.
UGH! Doufám že tenhle „odborník“ také udal ve které verzi MSO to požaduje!
Já jsem se s Wordem nikdy nesžil, na rozdíl od zlaté T602, takže když jsem kdysi potřeboval něco jako VYSIWIG editor, tak jsem si to radši napsal a zformátoval v Notepadu v čistém HTML (aspoň jsem se ho pořádně naučil), a pak vytiskl přímo z IE.
Zajímavé pak byly pokusy o načtení mých výtvorů do Wordu, který systém vnořených tabulek totálně nepobral a nedokázal z nich ani vycucnout holý text, což se s problémy podařilo Excelu :-D
Možná by stálo za to zmínit, že obr. 10 pochází ze ZX80. ZX Spectra nemají invertovaný znak > jako řádkový kurzor. Invertovaný je ještě použit v Beta Basicu.
Co se týká vkládání znaků, tak Beta Basic 1.0 umí vkládat klíčová slova jenom stiskem jedné klávesy. Popisovaný režim, kdy se po stisku mezerníku změní režim na vkládání po jednotlivých znacích je jeden ze tří režimů. První je klasický, kdy se klíčová slova vkládají stiskem jedné klávesy, druhý je vkládáním po jednotlivých písmen (bez nutnosti stisku mezerníku) a třetí je zmíněný kombinovaný, kdy při vkládání nového příkazu je moźnio vložit klíčové slovo jednou klávesou a po stisku mezerníku je možné vkládat příkazy vypsáním.
Co se týká zobrazování znaků, tak je také možné definovat oblast, do které příkaz PRINT vypisuje znaky a je možné také vypsat znaky na libovolnou pixelovou pozici pomocí příkazu PLOT. Je také možné „měnit“ počátel a velikost souřadného systému, při vykreslování se pak provádí přepočet na rozlišení 256×192.
No, nejsoíš to bude tím, že 128 BASIC žádné přepínání nemá. 128 BASIC (a stejně tak +3 BASIC) má jenom celoobrazovkový editor s vypisováním příkazů po písmenech. Na klávesnici nejsou ani klíčová slova (teda, jsou tam tři: RUN, LOAD, CODE), takže nějaké režimy vkládání nebyly ani zamýšleny. Režim 48 BASIC mají tyto počítače kvůli kompatibilitě některých programů, takže jiné použití než nahrání programu a jeho spuštění se v tomto režimu nepředpokládalo.
Zajímavé je, že na počítačích 128+ a +2 příkaz SPECTRUM přepne do režimu 48 BASIC se zákazem všech 128 rozšíření, zatímco na počítačích +2A a +3 tato rozšíření zakázána nejsou (není zakázáno stránkování paměti, takže pokud nejsou přepsány sytémové proměnné, lze se přepnout zpět do režimu +3 BASIC, nicméně nejedná se o oficiální funkci – prostě se spustí jedna stránkovací rutinka)
Myslím, že by mělo být zmíněno velmi zajímavé rozšíření Sinclair Basicu – tzv. ProDOS neboli Professional Display Operating System.
Využívalo obsluhu zpracování chyby, takže se nové příkazy zadávaly pomocí takzvané hvězdičkové notace – prostě před novým příkazem byl znak ‚*‘. ProDOS pochopitelně už před editací musel být v RAM a inicializovaný. Podobně fungovaly i příkazy Interface1 – tam byla ale obsluha chyby ve stínové RAM, překlápěná podle toho, zda se na sběrnici vyskytl kód instrukce tuším RST8 (je to tak dávno…).
ProDOS uměl spoustu věcí pro práci s grafikou – byla hračka s ním např. dělat grafy – sloupcové, koláčové atd…, vyplňovat vzory bitmapou atd…prostě vše co Sinclair Basic v tomto směru neuměl.
K nám se to dostalo tak, že jsme to přepsali z dlouhatánského hexa výpisu v jednom zahraničním časopise – pak pochopitelně disassemblovali a něco z toho použili i jinde – např. pro vytvoření příkazů pro plotter Alfi či SHARP MZ 1P16 byla obsluha chyby a hvězdičková notace vynikající nápad…
Možná proto, že u ZX80 by to znamenalo pár integrovaných obvodů navíc, a to bylo přesně to, čemu se v Sinclairu chtěli vyhnout. Tahle firma byla svými minimalistickými řešeními proslulá dávno předtím než se vrhla na počítače, v roce 1971 vyráběla například nejmenší tranzistorové rádio na světě (menší než krabička zápalek) Micromatic, v roce 1975 přišla s unikátními digitálními hodinkami Black Watch, které se (dávno před ZX81) daly pořídit také jako stavebnice! O kapesních kalkulačkách a přenosných miniaturních televizích nemluvě…
Ono pisatele zmátl popis obrázku. Na něm nejsou znaky uložené v ROM, ale zobrazitelné znaky. A poznámka, že to umí jen 64 znaků a že dalších 64 znaků šlo dosáhnout inverzním zobrazením těchto 64 znaků. Takže v ROM skutečně nebyly uložené invertované znaky, ale jen těch 64 neinvertovaných :-)
jak jsem tak četl o těch nestrukturovaných šitech, vzpomněl jsem si na své krátké, ale velmi zajímavé působení v jedné české bance, kde jsem viděl poprvé a naposled v životě ibm mainframe v „akci“…
takže kdyby vám náhodou docházely nápady o čem psát (a o tom pochybuju, takhle podrobně se dá o historii počítačů psát pěkných pár let), tak byste mohl ukázat čtenářům, v jakém nestrukturovém shitu (COBOL+asm+jakýsi interpret, který si napsal zaměstnanec banky, aby to nemusel všechno bušit v asm) se píšou/psaly programy, na jejichž správné funkci zavisí jejich, moje, vaše existence :) (ve smyslu fungování v světě, v němž každý spoléhá na svou bankovní kartu )
No ono když něco funguje, třeba bankovní program v Cobolu, nebo třeba nějaký matematicko-fyzikální Fortranovský věc na PDP-11, tak úplně nejlepší, co může člověk udělat, je místo PDP vzít něco od Dellu, místo RTOSu 11 Windows Vista a z Fortranu přepisovat do PHP, že.
Proto se taky pro průmysl a enterprise společnosti dodnes vyrábějí zařízení nahrazující osmipalcové disketovky, OmniBusové disky, VLSI náhrady procesorových jednotek šestnáctibitových nebo dvanáctibitových PDP, a další maličkosti. Mechanické části se opotřebovávají, ale funkční sestava je funkční sestava a neradno ji předělávat.
Řešením průserů zdánlivých pak člověk vyrobí průser skutečný.
Článek o BASICu by mohl pokračovat jeho praktickým využitím
k tomu, aby v Basicu psané programy měly jistý uživatelský komfort, je potřebná i plynulost i rychlost
chce to kompilery: Hisoft, COLT, mcoder, softek FP…
http://sam.speccy.cz/csdocs.html
To USR byla funkce (na rozdíl od příkazu nešla spustit samostatně) která spustila strojový kód od zadané adresy a po jeho skončení vrátila hodnotu myslím dvojregistru BC (kdyžtak mě opravte), a pokud jsí jí nepotřeboval (jako třeba nechtěl vypsat na obrazovku tím PRINT USR), tak se musela někam „zamést“. No a tím RANDOMIZE se zametla do nastavení generátoru náhodných čísel. Stejně tak bys mohl použít třeba nějakou nepotřebnou proměnnou: LET null = USR 65000
A pokud člověk chtěl ušetřit pár bajtů paměti, tak místo 65000 napsal VAL"65e3" ;-)
Přesně tak jak píše kolega pode mnou, USR vracela hodnotu, tudíž RUN USR nebo GOTO USR bylo možné použít ovšem člověk musel (a nebo to tak udělal schválně) počítat s tím že po návratu do Basicu se příkaz RUN/GOTO provedl s vrácenou hodnotou – tedy pokud se vůbec s návratem do Basicu počítalo. Typicky u her existoval návrat pouze přes reset nebo vytažení ze zástrčky.
Navíc, při PRINT se „usr“ vykonávalo v „print“ rutinách a v tu chvíli byly tuším exx-ované registry (tedy používalo se bc' místo bc, …). S tím, že obsah původních bc,de,hl potřeboval být zachován. Což mohlo být nebezpečné, pokud pak ten volaný asm program sám využíval exx (jako dočasné zálohy registrů) či volal ROM rutiny které použily exx, resp. předpokládaly nějaký přesný stav.
Pokud se nemýlím – zmatení nevylučuji, už je to nějaké doba, jestli to bylo u PRINT či LET či někde jinde, musel bych se znovu prohrabat výpisem ROMky. Ale něco takového tam bylo.
RANDOMIZE byl v tomto ohledu nejméně „agresivní“.
Ano, pokud to byl „random“ pro nějakou hru, resp. všude tam, kde bylo celkem jedno jak kvalitní ta pseudonáhodná hodnota bude.
Ale to už fakt bylo jednodušší použít LET či něco jiného. Pokud se nemohl obsadit RANDOMIZE. V exx-ovaném stavu to zůstane (dostane se do naší rutiny) jen při RST10, tedy u tisku znaku (či tokenu) na otevřený kanál (CURCHL). Při PRINT. Nad vše ostatní je ok, k dispozici.
Případně v BC vracet aktuální (SEED) hodnotu /pak je problém jen při nulové, kdy se pro randomize 0 použije hodnota aktuálního 20ms čítače (FAMES) a ne „0“/.
Těch možností je mnoho.
V dobe, ked som mal ZX, som si robil niektore programy do skoly na nom, rozne vypocty, grafy a tak. Dostal som sa k nejakemu prekladacu Basicu, zial nepamatam si na nazov, pamatam si ale, ako velmi ma nadchlo, ked som si v tom prelozil svoje basicove vytvory, lebo zrychlenie bolo skoro 10×.
Ještě v době kdy už jsem měl doma svoje první PC jsem občas vyhrabal staré Atari a pěkně se na něm vyblbnul, bohužel už je v pánu a emulátor ho nikdy nenahradí :)
Vzpomínám si že jsem se párkrát jako zapřísáhlý atarista dostal k nějakému Didaktiku ale ten zápis příkazů pomocí stisku jedné klávesy mne neskutečně štval, kamarád ho používal jen na hry a nevěděl o něm zhola nic (což já taky ne) takže jsem mu třeba chtěl napsat nějaký jednoduchý prográmek a kvůli tomuhle způsobu zápisu mi to trvalo děsivě dlouho…
Vzpoměl jsem si na takovou zajímavost. Na ZX Spectru se číselné konstanty v programu ukládaly dvakrát, jednou binárně a jednou jako String. Při psaní programu se po „zaentrování“ převedl řetězec na binární číslo, jež se ve výpisu nezobrazovalo. Program při běhu pak používal jen tato čísla. Šlo tedy program „zamaskovat“, tak, že se všechny stringy konstant „napoukovaly“ třeba na 0, což programu nevadilo, stejně je nepoužíval, ale z vypisu pak nikdo nepoznal, jak to funguje. Když jsem to poprvé viděl, tak jsem se docela lekl. Byl i prográmek, který to rekonstruoval zpátky.
… ako sa vlastne volal ten program, ktorý načítal BASIC-ový loader hry a NESPUSTIL ho? Tie napokované programy ktoré sa nedali normálne ani vylistovať ani nahrať pomocou merge. Vlastne si spomínam, že som tiež do svojho loadera dal na napokovaný riadok číslo nula skok na AT 0,0 nejaký nápis a potom biele na bielom… jój, to boli srandičky. :-D
To veru boli. Dosť som si obzeral niektoré loadery a bolo to územie nekončiaceho majstrovstva :-) Základným levelom boli fintičky, kedy sa vložením nejakého „zlého“ znaku (alebo aj viacerých znakov) do programového kódu BASICu docielilo, že pri pokuse o listing to blblo, dlho otravne pískalo pri každom kroku (či skôr vrčalo…), ale toto sa ešte dalo obísť, napríklad si napoukovať kratší chybový zvuk. Kombinovalo sa to s nastavením atribútov farieb na bielu na bielej, v niektorých prípadoch to bolo urobené tak šikovne, že sa mi to ani nepodarilo zrušiť :-) Videl som aj také loadery, kde chýbalo číslovanie riadkov, alebo bolo zdanlivo opačné, čo editor BASICu nerozchodil a vyhadzoval chyby.
Vrcholom umenia pre mňa boli loadery, kde sa vyskytovali úplne nezmyselné, v BASICu neexistujúce príkazy, ktoré však vyzerali úplne autenticky.
To už ani pravda nie je…
Ešte doplním pre mladšiu generáciu, o čo išlo.
Počítač bol po zapnutí v režime interpretera BASICu. Keď bolo treba nahrať nejaký program, zadal sa príkaz LOAD"" a pustila sa magnetofónová páska s príslušným programom. Príkaz zabezpečil nahratie a spustenie najbližšieho BASICovského programu z pásky. Hry boli programované samozrejme v assembleri (kvôli výkonu), ktorý si tento príkaz nevšímal, takže najprv musel byť na páske uložený krátky BASICovský program, ktorý zabezpečil nahratie nasledujúcej strojovej časti programu a jej spustenie (preto sa mu hovorilo loader – nahrávač).
Výrobcovia všemožne zabezpečovali BASICovský loader proti nahliadnutiu nepovolaným okom, pretože obsahoval adresu spustenia strojového programu. Prečo to robili? Kvôli ochrane proti kopírovaniu. Ak chcel niekto (zvyčajne nelegálne) skopírovať hru, musel to urobiť pomocou špeciálneho programu, ktorý dokázal načítať celú hru BEZ JEJ SPUSTENIA (čiže načítať z pásky v správnom poradí niekoľko sekvenčne nasledujúcich blokov kódu aj s ich zavádzačmi) z pásky do pamäte, a až keď bol program v pamäti, dal sa, opäť sekvenčne, uložiť na inú pásku. Existovalo niekoľko fínt, ako programátori ukladali hru na pásku tak, aby zmiatli kopírovací program a spôsobili, že sa kopírovanie nepodarilo (falošné zavádzače, prekročenie kapacity pamäte apod).
Samozrejme, bolo možné jednoducho skopírovať magnetofónovú pásku na dvojkazetovom magnetofóne, ale vtedy boli len veľmi vzácne (a šialene drahé) také prístroje, ktoré boli dosť kvalitné aby dokázali vytvoriť funkčnú kópiu. Zvyčajne bola funkčná aj tak len prvá, nanajvýš druhá generácia takýchto „audio“ kópií.
Takže ak sa podarilo zabezpečiť hru tak, aby sa nedala kopírovať bežnými kopírovacími programami, tak to domácich používateľov dostatočne odradilo od kopírovania.
Samozrejme, aj vtedy existovali hackerské spolky, ktoré sa pretekali v prelamovaní ochrán, a na prelomenie najlepších ochrán boli potrebné rôzne hi-tech úpravy počítača apod, takže to vyžadovalo značné vedomosti o konštrukcii počítača a znalosť assembleru. Akonáhle bola ochrana prelomená, hackeri dokázali vyrobiť takú kópiu programu, ktorá sa už dala ďalej kopírovať. Tak ako aj neskôr v dobe PC, hackerské skupiny boli rôzne schopné a tí menej šikovní nezriedka svojimi zásahmi poškodili zaujímavé efekty hry pri nahrávaní, obrázky, alebo poškodili samotný program, takže v nejakých častiach sa zasekával apod.
No a tu sa dostávame na začiatok – loader sa po nahratí z pásky rovno spustil a už neumožnil listing. Ale pre prípad, že by sa niekomu podarilo načítať ho do pamäte bez spustenia, autor programu čo najviac znepríjemnil prípadnému „nepovolanému oku“ nahliadnutie do loadera, najrôznejšími spôsobmi, zvyčajne zámerným „poškodením“ BASICovského programu tak, aby bol plne funkčný, ale aby zmiatol interpreter. Využívala sa na to „hardcore“ zmena rôznych pomocných kódov a hodnôt.
Tuším se místo „LOAD“ použil příkaz „MERGE“. Ten připojil nahraný program k tomu již existujícímu a nespouštěl ho. Tím jste obešel ochranu, kdy jako první příkaz byla nastavena „příkazová řádka“ mimo viditelnou obrazovku, čímž editor basicu vytuhl. Takový program normálně běžel až do chvíle, kdy jste ho zastavil. Basic se pokusil zobrazit „příkazovou řádku“ a umřel.
Ale i proti příkazu MERGE se dalo chránit – neporadil si, pokud v načítaném programu bylo více řádků se stejným číslem. Pak bylo nutné si pomocí nějakého programu načíst program jen jako data někam do paměti, vzít do ruky referenční příručku a začít dekódovat :-) Pak několika POKE umrtvit problematickou instrukci, změněný blok dat uložit zpět na kazetu a teprve pak to nahrát jako program. Jó to byly časy :-) Nikdy později už mě nic nemotivovalo tolik, jako potřeba rozchodit AY hudbu ze ZX Spectrum 128K na Didaktiku s AY interfacem. Po několika desítkách „cracklých“ her jsem se cítil býti odborníkem a je pravdou, že jsem rozchodil kde co a nějaký ten „kódovaný“ basic mě tenkrát nerozhodil. A nebyl jsem sám, v té době podobné zkušenosti, znalosti a úspěchy vykazovala značná část „uživatelů“. Tenkrát bylo například běžné, že mnoho lidí assembler umělo, a ten zbytek alespoň věděl, co to je. Dnes se naopak setkávám s tím, že mě někteří jedinci přesvědčují, že imperativní programování je přežitek a kdyby tu nebyla lobby Intelu a AMD, tak by už dávno procesory místo strojového kódu (vrchol to imperativního programování) nativně zpracovávaly Haskell. Z počítače je spotřební zboží a na poli software se čím dál tím více uplatňují programátoři, kteří neznají základy technologie. Jasně, HW abstrakce, netypované jazyky, to vše je krok předem. Ale zatrne mi, když chlapec s VŠ neví, čím se liší typy byte a int a i když mu to vysvětlíte, tak není schopen převést sled 4 bytů na int a na otázku zda ví, co je „little endian“ a „big endian“ odpoví, že tenhle spor je už dávno vyřešen tím, že současné počítače mají všechny Harvardskou architekturu. Člověk pak s pláčem vzpomíná na ty stovky kluků, kteří trávili dny s osmibitovým počítačem a snažili se pochopit jak to funguje.
Na jednu stranu dobry programator musi umet navrhovat algoritmy a nejake inty a byte ho nemusi zajimat. Ono zalezi v jake urovni toho programovni clovek je. Jestli to jen vymysli a jini koduji, obcas si sam neco nakoduje, aby overil zakladni myslenky svych algoritmu, nebo jestli je clovek koder a implementuje algoritmus pro konkretni architekturu/jazyk.
Vetsina programatoru je nekde mezi a je tedy pro ne vyhodne vedet co je „za tim“. I kdyz prijde mlady programator a nevi rozdil mezi int a byte, ale umi vymyslet dobre algoritmy, tak se jiste rad nauci dalsi veci a bude z nej opravdu dobry programator. Kdyz vyleze nejaky trotl z VS, tvrdi ze vystudoval informatiku, myslis si cert vi co neumi, tak s tim uz se neda nic delat, ten je ztracen jako clovek ;-).
A ted trochu nostalgie. Mi prijde, ze dobry spravce site/programator byva ten, kdo to mel opravdu jako konicka. Nestaci napsat ukoly do skoly. Tak to citim ja a tak to zatim vidim kolem sebe. Kazdopadne jen ten konicek nestaci, clovek se musi dale aktivne vzdelavat.
Jaj, driv sem podle zvuku Turba 2000 dokazal poznat, jestli se nahravaji same nuly, kod, znakova sada nebo obrazek :-). Dnes uz pomalu patrim do stareho zeleza.
V povrchní rovině máte pravdu. Jenže já jsem zaujatý a trvám na tom, že bez znalosti principů fungování nemůžete dlouhodobě vytvářet efektivní algoritmy. Bohužel mi příroda dá čas od času za pravdu. Měl jsem kolegu, výborný kluk. Nerozuměl sice základům (byte, int), ale programoval dobře. Jenže pak jsme řešili nějaké výkonnostní problémy a zjistili, že pro chlapce je každý datový typ tak nějak atomickým. Zjednodušeně řečeno, v jeho vnímání bylo porovnání dvou čísel stejně náročné jako porovnání dvou stringů. A protože stringy jsou univerzálnější, tak navrhl aplikaci s tím, že tam měl řadu obrovských tabulek, kde primární klíče byly typu VARCHAR2. Oracle to docela dlouho zvládal, pak jsme mu pomáhali indexy, ale prostě jednoho dne to celé umřelo. Po algoritmické stránce výborně udělaná aplikace, ale proč tam doprčic dal texty? Než to po něm předělávat, to jsme radši celý modul odepsali a udělali znovu a jinak.
A to je právě problém lidí bez základů – odvádějí často výbornou práci, ale v nečekané chvíli udělají hroznou krpu, které si nikdo včas nevšimne.
Skoro me to pripada, jako jeden projekt, na kterym jsem spolupracoval – vsude se to hemzilo samymi varchary2 i v pripade, ze ve skutecnosti tam byly ulozeny ciselne identifikatory (kvuli varcharum nekontrolovane).
Ale nejvic me dostala jedna aplikace, v niz si programator(ka) ukladala data do listboxu (GUI prvku s nastavenou neviditelnosti :-). Bylo to psany v Delphi, takze kazde ulozeni/smazani polozky z listboxu znamenalo nekde uvnitr volani funkce WinAPI, jeho prekresleni atd. Kolega to prepsal na pouziti poli a zrychleni celeho programu bylo nekolikanasobne.
Chtel bych se zastat navrhare datoveho modelu one aplikace, nutno podotknout, ze VARCHARu bylo o poznani mene nez CHARu. A kupodivu na dotaz, proc se nepouziva nejaky number se mi dostalo odpovedi, ze z vykonostnich duvodu a pro udrzeni konzistence. To jsem si musel honem sednout. Holt 30 let praxe ve foxce nemam, abych mohl oponovat.
Az Pavlovi dojdou namety na serialy, tak by urcite mohl do sekce zdrojaku psat vtipne historky a ukazky kodu, jak se nema psat enterprise aplikace, treba to v te dobe jiz nebude vyzrazovani know how. Ja bych pak v diskuzi pomohl rozptylovat pochybnosti, ze si to vymyslel…
Na to proč dělat něco blbě jsem už slyšel tolik věcných argumentů …
Ten nejpravdivější je ovšen ten, který Vám nikdo neřekne (kromě toho, že lidská blbost je nekonečná) – když máte zprzněných tisíce řádků, tak se skoro žádný manager (pokud není idealista) nepustí do zásadního refaktoringu (u enterprise aplikace) – takže pak nezbývá než pokračovat ve starých chybách :(.
To máš pravdu, ale v důsledku to mnohdy vede k tomu, že se další vývoj aplikace strašně prodraží, zvláště tehdy, když odejdou původní tvůrci, kteří ví, kam vložili různé obezličky atd.
Btw ta aplikace, o které se tady s Vlastou A. zminujeme, měla další skvělou vlastnost – když bylo zapotřebí přidat další atributy k objektům, se kterými se pracovalo, tak už se každý bál šahat do struktury tabulek. Namísto toho se nové atributy zapisovaly jako „strukturované poznámky“ do VARCHAR2ového sloupce POZNAMKA, takže se to v aplikaci na x místech parsovalo a zpracovávalo (co vím, tak s minimální kontrolou chyb).
To si dovedu živě představit – možná jsem viděl něco podobného, i když ne tak strašného. Je otázkou, jestli se má cenu nad tím nějak pozastavovat. Ono k tomu refaktoringu – aby byl úspěšný, tak firma musí mít k dispozici alespoň jednoho výborného programátora a alespoň pár dobrých dobrých – a musí být k dispozici alespoň základní čas a klid. Pokud tyto podmínky neplatí, tak cokoliv je už jen nějaké špatné řešení.
Nehanil bych tak kategoricky použití VARCHAR2 u Oracle v klíčích. Oracle má čísla uložená v BCD a žádný int, nebo byte nezná. Uložení toho stejného klíče uloženého jako VARCHAR2 je max 2× delší než NUMBER. Dám ruku do ohně, že v ta aplikace umřela kvůli něčemu jinému, než jsou klíče ve VARCHAR2. Tipuju na blbý model zamykání. Na tom lidé v ORACLU pohoří mnohem častěji.
Podílel jsem se na vývoji aplikace, kde jedním z požadavků bylo, že musíme být schopni data oddělit, respektive mergovat z jiné pobočky a rozhodovali jsme se jaký budeme vytvářet klíče a rozhodli jsme se, že klíč bude obsahovat id pobočky a id objektu. A protože jsme potřebovali věti než 32b čísla, tak jsme volili VARCHAR, protože byť ORACLE dokázal uložit číslo s libovolnou přesností, myslím, že jsme potřebovali 12cifer, nedokázali jsme čísla s touto přesností zpracovat mimo databázi. Rozdělit klíč do dvou polí jsme nechtěli z důvodu horší čitelnosti kódu a chybám. Báli jsme se, že na jedné pobočce to fungovat bude a až je sloučíme, tak to přestane, protože se někde zapomenou použít klíče v páru. Dělal jsem tehdy výkonnostní testy (také dnes málokdo provádí) a výsledkem bylo, že použití VARCHAR2 klíče je jenom o 20% pomalejší než čísla.
Měl jsem kolegu, který v SQL ke třídění používal GROUP BY místo ORDER BY. Prostě to našel viděl, vyzkoušel a všiml si, že výsledek je pak seřazen. Když jsem to viděl šel jsem do kolen.
Jinak databázové aplikace jsou pěkný příklad toho, že je velice vhodné znát architekturu a jak to vevnitř pracuje. Pokud to neznáte a navrhnete aplikaci tak, že databáze je pouze uložiště dat, tak to velice dlouho může fungovat a jak se zvyšují objemy, tak se to jednou složí a oprava je složitá, nebo i nemožná.
Heh, podle poctu prispevku nize koukam ze „poukovani“ her byla oblibena zabava vsech majitelu ZX :)
Puvodni clanek z MIKROBAZE 03 (1986)
http://img62.imageshack.us/img62/4881/mikrobaze03341986.jpg
http://img51.imageshack.us/img51/2602/mikrobaze03351986.jpg
http://img195.imageshack.us/img195/306/mikrobaze03361986.jpg
http://img13.imageshack.us/img13/9924/mikrobaze03371986.jpg
http://img717.imageshack.us/img717/6789/mikrobaze03381986.jpg
PS: nemam scaner ani fotak tak pred chvili foceno mobilem..
Novější programy měly jen BASICový zavaděč a přímo v něm strojový kód, který zaváděl bezhlavičkový záznam. Ten kód byl třeba v REM řádce, nebo se pomocí READ-DATA a smyčky někam napoukoval a spustil.Tak nešlo poukovat v BASICU. Pak se POKE pro hry musely provést až po doběhu tohoto strojákového zavaděče. Já to dělal tak,že jsem modifikoval odskok s konce zavaděče na poke-program, který jsem ve strojáku vkládal přímo do obrazovky ( kde nepatrně narušil obr. ) a pak skok na hru.
Největší výzva byly hry, které se nahrávaly v celku i s obrázkem a cestou plynule přepsaly stejným ( skoro ) kódem zavaděč i zásobník a loader končil instrukcí RET. Dokonce jsem se setkal se hrou, která se nahrávala v jednom bloku, po nahrátí zavaděče se tento aktivoval a chytil data z pásku letmo, bez nějakého zaváděcího tónu. Tyto hry se daly kopírovat jen kopírovacímy programy s komprimací ( třeba TF-kopy ).
Tohle všechno mi v paměti udkvělo, ale jak se jmenovaly ty hry , které jsem „poukoval“ už si nevzpomenu. Stejně jsem tím strávil víc času než hraním.
Podobný trik se používá třeba v TRDOSových booterech. Principielně to funguje tak, že je jeden BASICový řádek a jedna proměnná třeba a$ v níž je uložený stroják. Po načtení BASICu se provede RANDOMIZE USR na adresu a stroják se spustí, modifikuje BASICový řádek podle toho, co uživatel udělá a nakonec se vrátí zpět, provede CLEAR, čímž sám sebe odstraní a zbyde jen výsledný příkaz, kterým se spustí zvolený program z diskety.
http://cygnus.speccy.cz/popis_cygnusboot.phpNerozumim presne otazce. Ale Kladivo na programy http://www.grandjihlava.cz/tmp/kladivo.pdf obsahuje v podstate totozne informace. (dokonce to nekdy vypada ze jeden z nich od druheho opisoval)
Hmm tak na netu nakonec jsou ty Mikrobaze.
http://www.mikrobaze03.szm.com/
To jsem si mohl usetrit praci.. No pokud chce nekdo prvni i s dotaznikem tak je:
http://rapidshare.com/files/402406540/mikrobaze1.pdf.html jen 10 stazeni..
http://?????.wz.cz/mikrobaze1.pdf a tady to taky nemusi byt dlouho .)
Je legracni jak si tenkrat nekteri predstavovali dalsi vyvoj pocitacu:
http://www.mikrobaze03.szm.com/imagepages/p12.html
Ze budem mit za 20 let transistory mensi nez vlnova delka svetla je asi nenapadlo ani ve snu.
Dnes se optika hodi spis na propojovani jader na chipu, jak se o to snazi IBM.
Nikoliv. Ale využil jsem to co je popsáno v článku.
Začátek slova je TAB, což je klíčové slovo a jednom bajtu. Bohužel za TAB je mezera, takže musí následovat zpětná mezera. Výsledkem je tedy
TAB,bk,U,L,K,O,V,A,N,I
má 10 bajtů :-)
Chtěl jsem navázat tím, že tohle býval hodne používaný trik i u her. Nevím už co to bylo za hru, ale pamatuji si napis
Program: GO TO HELL!!!
Aha, pekne reseni :-), to me nenapadlo (Atarko to melo jinak, tam byl Basic od loaderu, konkretne Turba 2000, uplne oddelenej, ale poukovani se samozrejme taky delo pri prevodu do formatu Turba)
jeste bych to rozsiril na LET'S GO TO HELL :-)
Popremyslim o dalsich vetach, ktere jdou slozit ze Sinclair Basicovych prikazu…
Což mi připomíná zavaděč hry Heroes od George'K, kde byl vylistovatelný tuším jen jeden řádek obsahující REM IF NOT THEN CAT & DOG … a zbytek programu byl ukrytý :-) … ale už jsem to dlouho neviděl, možná si to pamatuju blbě.
Samotná hra Heroes 92' byla soutěžní k 10 letům existence ZX Spectra a kromě samotného řešení hry obsahovala ještě jednu „crackerskou soutěž“ v podobě velmi důmyslné ochrany. Ovšem nikoli proti kopírování, ale proti analýze samotného programu a dat. Po skončení soutěže autor podrobně vysvětlil, jak ochrana funguje – je to v nějakém ZX magazínu z roku 1993.
ZX Spectrum nemá příkaz ASC, doporučuji si prohlédnout jeho klávesnici:
http://slady.net/Sinclair-ZX-Spectrum-keyboard/layout/
pro převod znaku na jeho ASCII hodnotu se používá příkaz CODE s parametrem znaku, například tento interaktivní výpis stištěné klávesy:
10 PRINT AT 0,0;CODE INKEY$;" "; GOTO 10
RUN
jo, to byly časy :-)