Hogyan írta Woz a BASIC-et az eredeti Apple gépek számára?

Ez a cikk legalább 1 éve frissült utoljára. A benne szereplő információk a megjelenés idején pontosak voltak, de mára elavultak lehetnek.

Az alábbi írást Steve Wozniak publikálta a gizmodo.com-on a BASIC nyelv 50. születésnapja alkalmából. Az írás egy visszatekintés abba az időbe, amikor Woz a BASIC nyelvvel ismerkedett, valamint szót ejt arról is, hogy hogyan írta meg a saját fordítóprogram (compiler) verzióját az Apple I és II gépek számára, teljesen az alapoktól indulva.

1967-ben vagy 1968-ban, középiskolai végzősként, az elektronikatanárunk (életem legjobb tanára, sokféle tekintetben), megszervezett számomra egy gyakorlatot Sunnyvale-be, hogy megírjak egy számítógép programot, mert már mindent tudtam, amiről az elektronika órákon szó volt. Mr. McCollum minden évben olyan helyi cégeket és mérnököket keresett fel a jó képességű diákjai számára, akik szívesen fogadták a fiatalokat, ezáltal tapasztalatszerzési és tanulási lehetőséget biztosítva. Ezen az IBM gépen tanultam és programoztam FORTRAN nyelven.

qjbldl0vlsmlpvft5nmo

A BASIC-kel először középiskolában találkoztam, szintén abban az évben. Nekünk nem volt saját gépünk, azt hiszem, a GE hozott be egyet, modemmel együtt, hogy reklámozzák a time-share megoldásukat. Csak kevesünknek, a kiváló matekosoknak adatott meg a lehetőség, hogy néhány oldal információt kapjunk azért, hogy ezután írhassunk néhány nagyon egyszerű BASIC programot. Ráeszméltem, hogy ez egy egyszerűen és könnyen tanulható nyelv, de a gép csak néhány napig volt az iskolában. A matematika tanár megkért, hogy írjak néhány oldalt arról, miért gondolom azt, hogy az iskolánknak szüksége van egy ilyen eszközre. A kérésnek eleget téve, írtam is egy oldalt a logikus gondolkodásról és problémamegoldásról, de az iskola ennek ellenére nem csatlakozott a time-share programhoz.

Egyetemi éveim alatt a magasszintű nyelvek közül a tudományos célúakat használtam, úgy mint a FORTRAN-t, a PL-1-et vagy az Algolt. Persze rengeteget programoztam többféle assembly nyelven is, szabadidőmben és a egyetmen egyaránt.

A Homebrew Számítógép klubban volt néhány könyvünk, amelyek kézről-kézre jártak, és amelyeket én csak “bibliák”-nak hívok. Az egyik ilyen könyv Ted Nelson – Computer Lib/Dream Machine című könyve, a hiperlinkek jövőbeli világáról. Az ötletei sci-fi-nek tűntek, de mind tudtuk, hogy a leírtakat meg lehet valósítani. Gyakorlatilag a nézeteink miatt mi voltunk a jövő számítástechnikájának az apostolai. A másik ilyen “biblia” a 101 Games in BASIC című könyv volt. Már akkor is nagy rajongója voltam a számítógépes játékoknak és tudtam, amint lesz egy saját gépem, az összes kódot bepötyögöm, hogy játszani tudjak ezekkel a játékokkal. A saját érzéseimből következtetve úgy gondoltam, ez lehet a kulcsa az otthoni számítógépek forradalmának. A bennem lévő anti-üzletember azonban megakadályozza, hogy piacról és pénzügyekről beszéljek.

Nem voltam benne biztos, hogy mit kell tudnia egy igazi számítógépnek ahhoz, hogy elvégezze a cégek számára a komoly pénzügyi műveleteket, amelyekre azok ezeket a hatalmas összegekért értékesített számítógépeket használták. Azok a gépek értékesek voltak. Én csak azt ismertem, ami kéznél volt, amivel magam is foglalkoztam. A HP-nál, számológépeket fejlesztve, chip- és logikai tervek szimulációit futtattam. Ezt az én számítógépemnek is tudnia kellett, valamint képesnek kellett lennie játékokat futtatni. Biztos voltam benne, hogy a számítógépem képes lehet minden fontosabb dologra, amire egy drága gép is, de ebben nem voltam 100%-ig biztos.

A kulcs a játékokhoz a BASIC volt. A hobbielektronikai világ kivételével Bill Gates akkoriban még nem volt ismert. A klubunkban mindenki tudta, hogy írt egy BASIC fordítót Intel mikroprocesszorra. Kiszagoltam, hogy a jó (népszerű) számítógép alapja egy magas szintű programnyelv alkalmazása és ez nem lehet más, mint a BASIC. Biztos voltam benne, hogy nem a FORTRAN nyelven programozó mérnökök lesznek az otthoni számítógépek forradalmárai.

A nyelv megtanulása és a BASIC értelmező megírása

Az egyetlen probléma az volt, hogy semmi ismeretem nem volt a BASIC-ről azon a 3 napos középiskolai tesztelésen kívül. Egy késő esti műszak alkalmával a HP-nál, felkaptam egy BASIC kézikönyvet és elkezdtem kijegyzetelni a nyelvspecifikus parancsokat. Ne felejtsük el, hogy soha nem tanultam, hogyan kell fordító- vagy értelmezőprogramot írni, de szerencsére a barátom, Allen Baum elküldte a témába vágó MIT-s dokumentumainak másolatait, így ráfoghatjuk, hogy MIT-s képzésben részesültem. A főiskola második évében analízis órákon próbáltam rájönni, hogyan kezdjek neki FORTRAN fordító írni, mit sem tudva a fordító írás tudományáról. Erre visszaemlékezve olyan kódot kezdtem írni a 6502-es mikroprocesszoromra, ami a felhasználó által begépelt sorokat elemezte és hibaellenőrzést végzett rajtuk.

Ismertem a szintaxis-diagramokat, és készítettem is egyet BASIC-re. Azt viszont nem tudtam, hogy a HP BASIC totálisan különbözött a 101 Games in BASIC című könyv és Bill Gates által használt DEC BASIC-től. Azt gondoltam, hogy minden BASIC egyforma, de a HP verziója nagyban eltért a többitől a stringek kezelésében. Elkészültem a szintaxis-diagramokkal, de nem hagyott nyugodni a tudat, hogy ha elkészítem az első BASIC fordítást a 6502-re, én is sztár lehetek, és szerezhetek egy kis hírnevet a hobbielektronika világában, mint Bill Gates. Annak érdekében, hogy időt nyerjek, a lebegőpontos műveleteket kivettem a szintaxis-diagramból. A HP-nál csak egész számokat használó szimulációkat kellett írnom, illetve a játékok is logikai alapon működnek, amelyeket szintén egész számokkal lehet leírni. Szóval kihagytam a lebegőpontos számokat, csak azért, hogy nyerjek magamnak néhány hét időt, ezzel növelve az esélyeimet, hogy elsőként készülök el a 6502-re írt BASIC fordítóval. Visszatekintve észrevehetitek, hogy az Apple ROM-jába beépítettem a lebegőpontos számtani műveleteket, ugyanakkor ezeket már nem írtam bele a BASIC kódjába. Amikor kézzel írod a kódod (mert a time-share programot nem engedhettem meg magamnak), nehéz változtatásokat eszközölni a kód közepén, amikor mindennek fix címe kell, hogy legyen.

 Breakout az eredeti Apple II-n

 

Breakout az eredeti Apple II-n

Ahogy már említettem, nem igazán értettem a fordító íráshoz, csupán felületesen. Ismertem azonban a stackeket, és azt is, hogy hogyan tudunk kifejezéseket lengyel formára (RPN) hozni ezek segítségével. A HP számológépek is ezt használták. Ahogy azon gondolkodtam, hogy hogyan írjam meg ezt a nyelvet, megszületett a saját technikám, ami egyáltalán nem hasonlított a könyvekben leírtakra. Az egyszerűság kedvéért Főnévnek és Igének neveztem az operandusokat és operátorokat. A szintaxis-diagramban címkéket helyeztem el, de minden benne lévő operátornak volt egy száma, aszerint, hogy hányadik pozíciót foglalta el a 256 vagy 512 (erre már nem emlékszem) bájtos táblában. A 41. számú operandusnak #41 volt az operátor kódja.

Volt ezen kívül még egy lista is, amelyben minden operátorral kapcsolatosan két precedencia-érték szerepelt. Az egyik jelölte, hogy melyik operátornak van elsőbbsége, például a + operátort megelőzi a * operátor. Szükségem volt viszont egy második precedencia-táblára is, ami a zárójeleket kezelte. Fogalmam sem volt, hogy jó úton járok-e, de megfelelően működött és elvégezte azt, amit szerettem volna. Nem kellett, hogy a könyv szerint csináljam.

Élveztem a BASIC fordító bemutatását a Homebrew Computer Club-ban. Nem láttam viszont a nevemet nyomtatásban, szóval nem kaptam meg a “Bill Gates” hírnevet, de a klubon belül ismert lettem. Ez még azelőtt volt, hogy Steve Jobs tudta volna, hogy az én számítógépem létezik. Ahogy telt az idő, csak írnom kellett a szubrutinokat, egyiket a másik után, a számozott operátorokhoz. Minden klubgyűlésen volt néhány új, teljesen működő parancs.

Mivel az Apple II-ben közös volt az operatív és videó memória, ezért mivel a processzor másodpercenként nagyjából egymilliószor tudta ezt írni, így a megjelenített képben is ugyanennyit tudott megváltoztatni. Akkoriban az Atari játékgépek hardver alapúak voltak, de a játékok immár szoftveresen is megoldhatóvá váltak, a 6502 gépi kódú programozása által. A BASIC egy interpretált nyelv, ezért minden egyes programsoron végigmegy karakterenként, és eldönti, hogy mit kell tennie. Éppen ezért százszor vagy akár ezerszer is lassabb, mint a gépi kód, de kíváncsi voltam, hogy egy nap lehetséges lesz-e mozgó elemeket valósághű animációkkal leprogramozni csak a BASIC használatával.

Kifejlesztettem a Breakout-ot az Atarinak, hardveresen. Kíváncsi voltam, le tudom-e programozni ezt a szimpla ügyességi játékot BASIC-ben. Tudtam, hogy gépi kódban lehetséges. Lévén, hogy ez a saját BASIC fordítóm volt, a szintaxis-diagramhoz hozzáadtam a szükséges parancsokat, hogy képes legyen színeket ábrázolni, valamint függőleges és vízszintes vonalakat rajzolni. Ezután áramköri leírásokat olvastam, és olyan chipet választottam, amiben 4db, az 555-öshöz hasonlító időzítő volt. Ezeket használtam némi szoftverrel együtt, hogy kiolvassam a kontroller a potenciométereinek adatait. Amint elkészültem ezekkel, úgy, hogy új EPROM-okat írtam az új, kiegészített BASIC-kel, akkor leültem és írtam néhány FOR ciklust, ami téglákat ábrázolt, különböző színekkel. Legalább 30 különböző színkombinációt kipróbáltam, percek alatt. Ezek után hozzáadtam az ütőket, a számlálót és a labdát. Képes voltam a program paramétereinek változtatására, hogy módosítsam a labda sebességét és irányát. Azt hiszem, ekkortájt adhattam hozzá a hangszórót, 1 bites audióval, mert hallani akartam, amikor a labda eltalált egy téglát.

704484039477489991

Mikor elkészültem, áthívtam Steve Jobs-t a lakásomra, hogy bemutassam, mit is készítettem. Demonstráltam neki, hogy milyen könnyen és gyorsan lehet változtatni a játék egyes jellemzőit, mint például a téglák színét. A legfontosabb az egészben, hogy a játéknak több variációját tudtam kipróbálni csupán fél óra alatt, mint amennyit hardveresen csak több, mint 10 év alatt tudtam volna megcsinálni. Mindkettőnkben tudatosult a fontossága annak, hogy az animált játékok mostantól szoftver alapúak lehetnek. Mi több, a BASIC lehetőséget adott arra, hogy bárki, bármilyen korban járt is, képes legyen a programozására.

Körülbelül 50 irattartó mappát tartottam meg a BASIC fejlesztői munkámról, tele papírokkal. Mindegyiken a “BASIC JÁTÉK” felirat állt. Így látható, milyen úton jutottam el idáig.

Kiegészítés

Végzős lehettem, vagy talány egyetemi gólya, amikor azt mondtam édesapámnak, hogy egyszer lesz egy 4K Data General NOVA-m. Erre azt válaszolta, hogy az annyiba kerül, mint egy drága lakás előlege. Ez eléggé lelombozott és azt válaszoltam, hogy akkor inkább egy ház helyett csak egy kis lakásban fogok élni.

Miért 4KB?

Mert az volt a minimum követelmény a magas szintű nyelvek futtatásához. Számomra a számítógépnek többnek kellett lennie, mint pusztán csak kapcsolók és lámpák. Képesnek kellett lennie programok futtatására.

5 évvel az Apple I előtt megépítettem a saját kapcsolós-lámpás számítógépem. Abban az időben esélyem sem volt egy 4KB-os RAM vásárlására, így a gépben csak 256 bájt volt.

A Homebrew idején, 1975 nyarán, 3 cég mutatott be 4KB-os DRAM-ot. Ez volt az első alkalom, hogy a 4KB-os modulok elérhető áron voltak kaphatók. Ennyire volt szükségem, hogy a BASIC a számítógépem része lehessen. Nem volt más lehetőség, ezért lett 4KB a minimum RAM az Apple I és II gépekben. Ha nem törődtem volna a BASIC-kel, akkor valószínűleg csak egy újabb kapcsolók és lámpák sokasága szintű számítógépet építettem volna minimális mennyiségű statikus memóriával.

Ezek még érdekelhetnek:


  1. Régi szép idők. Akkoriban csak az lehetett programozó, aki komolyan értett a matematikához és a hardverhez. Ma már szinte a félhülye is össze tud dobni egy kisebb programot valamilyen szkript nyelvjárásában, nem kell neki néhány bájtba sűrítenie a programkódját. Egyébként érdekes, hogy az írás azzal kezdődik, hogy hogyan írt Woz BASIC compilert, de a végén csak az interpreterig jutottunk. Akkor most tényleg írt BASIC compilert, vagy nem? Vagy lesz egy második rész is? (Akinek nem világos a különbség, bár le van írva itt is: az interpreter valós időben értelmezi a kódot és hajtja végre az utasításokat, tehát a programod egy értelmező program futtatja, nem a processzor. Míg a compiler az egész magas szintű kódot gépi kóddá alakítva befejezi a működését, innentől a gépi kódot a processzor képes magától futtatni).

Írd le a véleményedet! (Moderációs elveinket ide kattintva olvashatod.)

Hozzászólás írásához be kell jelentkezned!