close

Commodore BASIC

Ga naar navigatie Ga naar zoeken
Commodore BASIC
Commore 64 startscherm, met Commodore BASIC V2.
Ontwikkelaar(s)
microsoft
Algemene informatie
Verscheen in 1977
Ontworpen door microsoft
Laatste stabiele versie V7.0 (1985)
implementaties van PET naar C128
Licentie privatief

Commodore BASIC , ook bekend als PET BASIC of CBM-BASIC , is het dialect van de BASIC -programmeertaal die wordt gebruikt in Commodore International's lijn van 8 - bits thuiscomputers , die zich uitstrekt van de PET uit 1977 tot de C128 uit 1985 .

De kern is gebaseerd op Microsoft BASIC 6502 en deelt als zodanig veel functies met andere BASIC 6502's uit die tijd, zoals Applesoft BASIC . Commodore heeft in 1977 BASIC van Microsoft in licentie gegeven op een "eenmalige, royaltyvrije" basis nadat Jack Tramiel het aanbod van Bill Gates voor een vergoeding van $ 3 ($ 13,42 in 2022) per eenheid afwees en zei: "Ik ben al getrouwd," en zou niet meer dan $ 25.000 ($ 111.793 in 2022) betalen voor een eeuwigdurende licentie. [ 1 ]

De originele versie van PET leek erg op de originele Microsoft-implementatie met weinig aanpassingen. BASIC 2.0 op de C64 was ook vergelijkbaar en was ook te zien op sommige C128's en andere modellen. Latere PET's implementeerden BASIC 4.0, vergelijkbaar met het origineel, maar met een reeks opdrachten voor het werken met floppy .

BASIC 3.5 was de eerste die echt ontspoorde en voegde een aantal commando's toe voor grafische en geluidsondersteuning op de C16 en Plus/4 . BASIC 7.0 werd meegeleverd met de Commodore 128 en bevatte gestructureerde programmeeropdrachten van BASIC 3.5 van de Plus/4, evenals trefwoorden die speciaal zijn ontworpen om te profiteren van de nieuwe mogelijkheden van de machine. Sprite-editor en machinetaalmonitor toegevoegd. De laatste, BASIC 10.0, maakte deel uit van de nog niet uitgebrachte Commodore 65 .

Geschiedenis

Commodore nam de broncode voor BASIC en ontwikkelde deze intern voor al hun andere 8-bits thuiscomputers. Het was pas bij de Commodore 128 (met V7.0) dat een Microsoft copyright melding werd getoond. Microsoft had echter een paasei ingebouwd in versie 2 van Commodore Basic die zijn herkomst bewees: door het (obscure) commando te typen, WAIT 6502, 1zou het Microsoft!op het scherm verschijnen. (Het paasei was goed versluierd: het bericht verscheen niet in een demontage van de tolk .) [ 2 ]

De populaire Commodore 64 implementeerde BASIC v2.0 in ROM, hoewel de computer werd uitgebracht nadat de PET/CBM-serie versie 4.0 had, omdat de 64 bedoeld was als een thuiscomputer, terwijl de PET/CBM-serie bedoeld was voor commerciële en educatieve doeleinden. gebruiken waar de ingebouwde programmeertaal het meest zou worden gebruikt. Dit bespaarde productiekosten, omdat de V2 in kleinere ROM's past.

Technische details

Programma's bewerken

Een handige functie van de ROM - ingezeten BASIC-interpreter en de KERNAL was de editor voor volledig scherm . [ 3 ] ​[ 4 ]​ Hoewel Commodore-toetsenborden slechts twee cursortoetsen hebben die van richting veranderen wanneer u op de Shift-toets drukt, stelde de schermeditor gebruikers in staat om directe opdrachten in te voeren of programmaregels in te voeren en te bewerken vanaf elke plek op het scherm. Als een regel werd voorafgegaan door een regelnummer, werd deze " tokenized " en opgeslagen in het programmageheugen. Regels die niet met een cijfer begonnen, werden uitgevoerd door elke keer dat de cursor op de regel stond op de RETURN -toets te drukken. Dit betekende een aanzienlijke verbetering van de programma-invoerinterfaces ten opzichte van andere gangbare BASIC's voor thuiscomputers in die tijd, die over het algemeen een regeleditor gebruikten , aangeroepen door een afzonderlijk commando, of een "kopieercursor"-commando, dat de regel op de cursorpositie afkapte. EDIT

Het had ook de mogelijkheid om benoemde bestanden op elk apparaat op te slaan, inclusief de cassette , een populair opslagapparaat in de dagen van PET en dat gedurende de levensduur van 8-bit Commodores in gebruik bleef als een goedkope vorm van massaopslag. De meeste systemen ondersteunden alleen bestandsnamen van diskettes , waardoor het moeilijker werd om meerdere bestanden op andere apparaten op te slaan. De gebruiker van een van deze andere systemen moest de locatie van het bestand in de teller van de recorder noteren, maar dit was onnauwkeurig en foutgevoelig. Met PET (en BASIC 2.0) konden cassettebestanden op naam worden opgevraagd. Het apparaat zou de bestandsnaam opzoeken door de gegevens opeenvolgend te lezen, waarbij eventuele bestandsnamen worden genegeerd die niet overeenkomen. Het bestandssysteem werd ook ondersteund door een krachtige registerstructuur die in bestanden kon worden geladen of opgeslagen. De gegevens op de Commodore-cassette zijn digitaal opgenomen in plaats van de goedkopere (en minder betrouwbare) analoge methoden die door andere fabrikanten worden gebruikt. Daarom was de gespecialiseerde Datasette nodig in plaats van een standaard bandrecorder. Er waren adapters beschikbaar die een analoog-naar-digitaal-omzetter gebruikten om het gebruik van een standaard bandrecorder mogelijk te maken, maar deze kosten slechts iets minder dan de Datasette.

Het LOAD - commando kan worden gebruikt met de optionele parameter ,1 die een programma laadt op het geheugenadres dat zich in de eerste twee bytes van het bestand bevindt (deze bytes worden verwijderd en niet in het geheugen bewaard). Als de parameter ,1 niet wordt gebruikt , wordt het programma geladen aan het begin van het BASIC-programmagebied, dat sterk verschilt tussen machines. Sommige varianten van Commodore BASIC leverden commando's BLOADen BSAVEdie werkten als hun tegenhangers in Applesoft BASIC , het laden of opslaan van bitmaps van gespecificeerde geheugenlocaties.

De PET ondersteunt geen verplaatsbare programma's en de opdracht LOAD laadt altijd de eerste twee bytes in het programmabestand. Dit zorgde voor een probleem bij het laden van opgeslagen BASIC-programma's op andere Commodore-machines, omdat ze op een hoger adres zouden worden geladen dan waar PET BASIC het programma verwachtte. Er waren tijdelijke oplossingen om de programma's naar de juiste locatie te "verplaatsen". Als een programma op een CBM-II- machine was opgeslagen , was de enige manier om het op een PET te laden, door de eerste twee bytes te wijzigen met een schijfsectoreditor, aangezien het BASIC-programmagebied van de CBM-II-serie was ingesteld op $ 0, wat zou ertoe leiden dat de PET probeert te laden op pagina nul en crasht.

Commodore BASIC gereserveerde woorden kunnen worden afgekort door eerst een ongewijzigde toetsaanslag in te voeren en vervolgens een gewijzigde toetsaanslag van de volgende letter. Dit stelt de hoge bit in, waardoor de interpreter stopt met lezen en de instructie ontleden volgens een opzoektabel. Dit betekende dat de instructie tot waar de hoge bit was ingesteld, werd geaccepteerd als vervanging voor het schrijven van de volledige opdracht. Omdat alle BASIC-sleutelwoorden echter als tokens van één byte in het geheugen werden opgeslagen, was dit een gemak voor het invoeren van instructies in plaats van een optimalisatie.

In de standaardtekenset met alleen hoofdletters worden verschoven tekens weergegeven als een grafisch symbool; bijv. het commando, GOTO, kan worden afgekort G{Shift-O}(wat er op het scherm uitzag). De meeste van deze commando's hadden twee letters, maar in sommige gevallen waren ze langer. In dit soort gevallen was er een ambiguïteit, dus er waren meer letters nodig van het commando zonder hoofdletters, zoals ( ) dan nodig zijn voor . Sommige commando's werden niet afgekort, hetzij vanwege de beknoptheid of onduidelijkheid met andere commando's. Het commando had bijvoorbeeld geen afkorting omdat de spelling in strijd was met het gescheiden trefwoord , dat in de correspondentietabel dichter bij het begin van het trefwoord stond . De veelgebruikte opdracht had een enkele sneltoets , zoals gebruikelijk was in de meeste dialecten van Microsoft BASIC. Opdrachtafkorting met scrollende letters is uniek voor Commodore BASIC. GΓGO{Shift-S}GO♥GOSUBINPUTINPUT#PRINT?

Deze tokenisatiemethode had een zodanig gebrek dat als men een REM(BASIC-statement om een ​​opmerking aan code toe te voegen) gevolgd door een {Shift-L}, bij het bekijken van de lijst met programma's, de BASIC-interpreter de lijst onmiddellijk zou afbreken, a zou weergeven ?SYNTAX ERRORen zou terugkeren naar het bericht READY.. Deze fout werd tot op zekere hoogte gebruikt door programmeurs die hun werk wilden testen en beschermen, hoewel het vrij eenvoudig te omzeilen was.

Door de trefwoorden in te korten, was het mogelijk om meer code in een enkele regel programma te passen (die twee regels scherm zou kunnen beslaan op schermen met 40 kolommen, d.w.z. C64 of PET, of vier regels op het 22-koloms scherm van VIC) -twintig). Dit maakte een kleine besparing mogelijk voor het opslaan van programmaregels, die anders extra regels nodig zouden hebben. Alle BASIC-opdrachten waren tokenized en bezetten 1 byte (of twee, in het geval van meerdere BASIC 7- of BASIC 10-opdrachten) in het geheugen, ongeacht hoe ze werden ingevoerd. Regels die zo lang waren, waren een gedoe om te bewerken. De opdracht LISTgaf het volledige opdrachtsleutelwoord weer, waardoor de programmaregel verder ging dan de 2 of 4 schermregels die in het programmageheugen konden worden ingevoerd.

Prestaties

Net als de Microsoft BASIC interpreter , is Commodore BASIC langzamer dan native machine code . Testresultaten hebben aangetoond dat het kopiëren van 16 kilobyte ROM naar RAM minder dan een seconde duurt in machinecode, vergeleken met meer dan een minuut in BASIC. [ nodig citaat ] Om sneller uit te voeren dan de tolk, begonnen programmeurs verschillende technieken te gebruiken om de uitvoering te versnellen. Een daarvan was om veelgebruikte drijvende-kommawaarden in variabelen op te slaan in plaats van letterlijke waarden te gebruiken, aangezien het ontleden van een variabelenaam sneller was dan het ontleden van een letterlijk getal. Aangezien drijvende komma het standaardtype is voor alle opdrachten, is het sneller om getallen met drijvende komma als argumenten te gebruiken in plaats van gehele getallen. Toen snelheid belangrijk was, hebben sommige programmeurs secties van BASIC-programma's geconverteerd naar 6502 of 6510 assembleertaal die afzonderlijk van een bestand werd geladen of in het geheugen werd geplaatst vanuit DATA-instructies aan het einde van het BASIC-programma, en uitgevoerd vanuit BASIC met behulp van de opdracht , ofwel van directe modus of vanuit het programma zelf . Wanneer de uitvoeringssnelheid van de machinetaal te hoog was, zoals voor een spel of wanneer gebruikersinvoer werd verwacht, konden programmeurs pollen door geselecteerde geheugenlocaties te lezen (zoals $ C6 [ 5 ] voor 64 of $ D0 [ 6 ] voor 128, wat de grootte van de toetsenbordwachtrij aangeeft) om de uitvoering te vertragen of te stoppen. SYS

Een uniek kenmerk van Commodore BASIC is het gebruik van besturingscodes om taken binnen een programma uit te voeren, zoals het wissen van het scherm of het positioneren van de cursor; deze kunnen worden aangeroepen door een commando te geven waarbij X overeenkomt met de uit te geven controlecode ( het is bijvoorbeeld de controlecode om het scherm te wissen) of door op de betreffende toets tussen aanhalingstekens te drukken en dus op Shift + CLR HOME te drukken na een aanhalingsteken toont de visuele weergave van de BASIC-besturingscode (in dit geval een omgekeerd hart) waarop vervolgens wordt gereageerd bij de uitvoering van het programma (het direct afdrukken van de besturingscodes gebruikt minder geheugen en werkt sneller dan een CHR$ -functie aanroepen ). Dit is in vergelijking met andere implementaties van BASIC die typisch speciale opdrachten hebben om het scherm te wissen of de cursor te verplaatsen. BASIC 3.5 en later hebben specifieke opdrachten voor het wissen van het scherm en het verplaatsen van de cursor. PRINT CHR$(X)PRINT CHR$(147)

Programmaregels in Commodore BASIC hebben nergens spaties nodig (maar het LIST -commando zal er altijd een tussen het regelnummer en de declaratie laten zien), bijv. , en het was gebruikelijk om programma's zonder spaties te schrijven. Deze functie is toegevoegd om geheugen te sparen, aangezien de tokenizer nooit spaties verwijdert die tussen trefwoorden zijn ingevoegd: de aanwezigheid van spaties resulteert in extra bytes in het tokenized-programma die tijdens de uitvoering eenvoudig worden overgeslagen. De tokenizer verwijdert de spaties tussen het regelnummer en de programmadeclaratie. 100 IFA=5THENPRINT "YES":GOTO1600x20

Programmaregels kunnen op de meeste machines in totaal 80 karakters lang zijn, maar bij machines met 40 kolomtekst zou de regel naar de volgende regel op het scherm gaan, en op de VIC-20, die een scherm van 22 kolommen had, zou het programma lijnen konden maximaal vier bezetten. BASIC 7.0 op de Commodore 128 verhoogde de limiet van een programmaregel tot 160 karakters (vier regels van 40 kolommen of twee regels van 80 kolommen). Door afkortingen zoals ?in plaats van te gebruiken PRINT, is het mogelijk om nog meer op één regel op te nemen. BASIC 7.0 geeft een ?STRING TOO LONG(string te lange) foutmelding weer als de gebruiker een programmaregel invoert die langer is dan 160 tekens. Eerdere versies produceerden geen fout en gaven eenvoudig het READY-bericht twee regels lager weer als de regellengte werd overschreden. Het regelnummer wordt meegeteld in het aantal tekens in de programmaregel, dus een regelnummer van vijf cijfers resulteert in vier minder toegestane tekens dan een nummer van één cijfer.

De volgorde van uitvoering van Commodore BASIC lijnen werd niet bepaald door lijnnummering; in plaats daarvan volgden ze de volgorde waarin de lijnen in het geheugen waren gekoppeld. [ 7 ] Programmaregels werden in het geheugen opgeslagen als een enkele gekoppelde lijst met een aanwijzer (met het adres van het begin van de volgende programmaregel), een regelnummer en vervolgens de tokenized code voor de regel. Terwijl een programma werd ingevoerd, herschikte BASIC voortdurend de regels van het programma in het geheugen, zodat de regelnummers en wijzers allemaal in oplopende volgorde stonden. Echter, na het invoeren van een programma, kan het handmatig wijzigen van regelnummers en aanwijzers met POKE -commando's leiden tot uitvoering buiten de volgorde of zelfs elke regel hetzelfde regelnummer geven. In de begindagen dat BASIC commercieel werd gebruikt, was dit een softwarebeveiligingstechniek om incidentele wijziging van het programma te ontmoedigen.

Regelnummers kunnen variëren van 0 tot 65520 en het duurt vijf bytes om op te slaan, ongeacht het aantal cijfers in het regelnummer, hoewel de uitvoering sneller is naarmate er minder cijfers zijn. Door meerdere instructies op één regel te plaatsen, wordt minder geheugen gebruikt en wordt het sneller uitgevoerd.

GOTO en GOSUB zullen vanaf de huidige regel naar beneden zoeken om een ​​regelnummer te vinden als er vooruit wordt gesprongen, maar in het geval van een sprong terug begint het zoeken vanaf het begin van het programma. Dit vertraagt ​​grotere programma's, dus het verdient de voorkeur om veelgebruikte subroutines bij de start te plaatsen.

Variabelenamen hebben alleen betekenis voor 2 tekens; daarom verwijzen de namen van variabelen VARIABLE1, VARIABLE2en VAze verwijzen allemaal naar dezelfde variabele.

Commodore BASIC ondersteunt ook de bitsgewijze AND , OR en XOR operators ; hoewel deze functie deel uitmaakte van de kerncode van Microsoft BASIC 6502, werd deze over het algemeen weggelaten in andere implementaties zoals Applesoft BASIC .

Commodore BASIC's eigen getalnotatie, net als die van zijn bovenliggende MS BASIC , was floating point . De meeste hedendaagse BASIC-implementaties gebruikten één byte voor de exponent en drie bytes voor de mantisse . De precisie van een getal met drijvende komma met een mantisse van drie bytes is slechts ongeveer 6,5 cijfers achter de komma, en afrondingsfouten komen vaak voor. De 6502 implementaties van Microsoft BASIC gebruikten 40-bit floating point rekenkunde, wat betekent dat variabelen vijf bytes nodig hadden om op te slaan (vier bytes voor de mantisse en één byte voor de exponent) in tegenstelling tot 32-bits floating point. .

Terwijl de 8080/Z80-implementaties van Microsoft BASIC dubbele precisie en integer-variabelen ondersteunden, waren de 6502-implementaties alleen drijvende-komma.

Hoewel Commodore BASIC ondertekende integer -variabelen (aangegeven door een procentteken) in het bereik van -32768 tot 32767 ondersteunt, worden ze in de praktijk alleen gebruikt voor arrayvariabelen en dienen ze om geheugen te besparen door de array-elementen te beperken tot twee bytes elk (een array van 2.000 elementen zal 10.000 bytes in beslag nemen indien gedeclareerd als een floating-point array, maar slechts 4.000 indien gedeclareerd als een integer array). Het aanduiden van een variabele als een geheel getal zorgt er simpelweg voor dat BASIC het terug converteert naar een drijvende komma, wat de uitvoering van het programma vertraagt ​​en geheugen verspilt, aangezien voor elk procentteken een extra byte moet worden opgeslagen (aangezien dit ook van toepassing is op arrays van gehele getallen, moet de programmeur vermijd ze te gebruiken, tenzij er zeer grote arrays worden gebruikt die het beschikbare geheugen zouden overschrijden als ze als drijvende komma worden opgeslagen). Het is ook niet mogelijk om geheugenlocaties boven 32767 te POKE of PEEK met het adres gedefinieerd als een geheel getal met teken.

Een punt (.) kan gebruikt worden in plaats van het cijfer 0 (dus in plaats van of in plaats van ), dit zal iets sneller lopen. 10 A=.10 A=010 FOR A=.TO 10010 FOR A=0 to 100

Commodore voegde de SYS -instructie toe , die wordt gebruikt om machinetaalprogramma's te starten, en het was niet in de oorspronkelijke BASIC-code van Microsoft, die alleen de USR-functie bevatte om machinetaalroutines aan te roepen. De SYS -instructie laadt automatisch de CPU-registers met waarden in $ 30C- $ 30F (C64, varieert op andere machines); dit kan worden gebruikt om gegevens door te geven aan routines in machinetaal of om kernelfuncties aan te roepen vanuit BASIC ( het maakt bijvoorbeeld het scherm leeg). POKE 780,147:SYS 65490

Aangezien niet-C128 8-bits Commodore-machines niet automatisch software van schijf kunnen starten, is de gebruikelijke techniek om een ​​BASIC-stub op te nemen om de uitvoering van het programma te starten. Het is mogelijk om de software automatisch te starten na het laden en de gebruiker hoeft geen RUN -statement te schrijven . Dit wordt gedaan met een codefragment dat de BASIC "ready" vector in $0302 plugt . 10 SYS 2048

Zoals met de meeste andere versies van Microsoft BASIC , als een array niet wordt gedeclareerd met een DIM -instructie , wordt deze automatisch ingesteld op tien elementen (in de praktijk 11, aangezien array-elementen vanaf 0 worden geteld) . Grotere arrays moeten worden gedeclareerd, anders geeft BASIC een fout weer wanneer het programma wordt uitgevoerd en kan de grootte van een array in een programma niet worden gewijzigd, tenzij alle variabelen worden gewist door een CLR-instructie. Numerieke arrays worden automatisch gevuld met nullen wanneer ze worden gemaakt. Er kan een tijdelijke vertraging optreden in de uitvoering van het programma als een grote array wordt gedimensioneerd.

Tekenreeksvariabelen worden weergegeven door de variabelenaam te labelen met een "$"-teken. Daarom zouden de variabelen AA$, AAen AA%als verschillend worden opgevat. Arrayvariabelen worden ook beschouwd als verschillend van eenvoudige variabelen, dus A en A(1) verwijzen niet naar dezelfde variabele. De grootte van een stringarray verwijst eenvoudigweg naar het aantal strings dat in de array is opgeslagen, niet de grootte van elk element, dat dynamisch wordt toegewezen. In tegenstelling tot andere implementaties van Microsoft BASIC, vereist Commodore BASIC geen stringruimte die gereserveerd moet worden aan het begin van een programma.

In tegenstelling tot andere 8-bit machines zoals de Apple II, hebben alle Commodore machines een ingebouwde klok die wordt geïnitialiseerd op 0 bij het opstarten en bijgewerkt met elke PIA/VIA/TED/CIA timer tick, dus 60 keer per seconde. Het krijgt twee systeemvariabelen toegewezen in BASIC, TI en TI$ , die de huidige tijd bevatten. TI is alleen-lezen en kan niet worden gewijzigd; als u dat doet, verschijnt er een syntaxisfoutbericht. TI$ kan worden gebruikt om de tijd in te stellen via een reeks van zes cijfers (er treedt een fout op bij gebruik van een andere reeks dan zes cijfers). De klok is geen erg betrouwbare methode van timing, omdat hij stopt telkens wanneer interrupts worden uitgeschakeld (uitgevoerd door sommige kernelroutines), en toegang tot de IEC-poort (of IEEE-poort op de PET) zal de klokupdate met een paar vertragen. .

De RND- functie in Commodore BASIC kan de klok gebruiken om willekeurige getallen te genereren; dit wordt bereikt door RND(0) , maar het is van relatief beperkt nut omdat alleen getallen tussen 0 en 255 worden geretourneerd. Anders werkt RND hetzelfde als andere Microsoft BASIC-implementaties doordat een reeks pseudo-willekeurig wordt gebruikt via een vaste 5 -byte seed-waarde opgeslagen bij opstarten in geheugenlocaties $ 8B- $ 8F op de C64 (locatie verschilt op andere machines). RND met een willekeurig getal groter dan 0 zal een willekeurig getal genereren dat is samengevoegd uit de waarde die is opgenomen in de RND- functie en de initiële waarde, die wordt bijgewerkt met 1 telkens wanneer een RND-functie wordt uitgevoerd. RND met een negatief getal gaat naar een punt in de volgorde van de huidige seed-waarde die door het getal wordt gespecificeerd.

Aangezien het genereren van echte willekeurige getallen onmogelijk is met de RND -instructie , is het gebruikelijker op de C64 en C128 om het witte ruiskanaal van de SID-chip te gebruiken voor willekeurige getallen.

BASIC 2.0 had berucht te maken met een extreem trage verzameling van garbage strings. Garbage collection wordt automatisch aangeroepen telkens wanneer een FRE -functie wordt uitgevoerd, en als er veel stringvariabelen en arrays zijn die in de loop van een programma zijn gemanipuleerd, kan het wissen ervan onder de slechtste omstandigheden meer dan een uur duren. Het is ook niet mogelijk om garbage collection te annuleren, aangezien BASIC de RUN/STOP-toets niet scant tijdens het uitvoeren van deze routine. BASIC 4.0 introduceerde een verbeterd afvalverzamelsysteem voor achterwaartse aanwijzers, en alle daaropvolgende Commodore BASIC-implementaties hebben dit ook.

De FRE- functie in BASIC 2.0 had een andere storing doordat deze niet overweg kan met getekende getallen groter dan 32768, dus als de functie wordt aangeroepen op een C64 (38k BASIC-geheugen), wordt een negatief getal weergegeven. 65535 naar het gerapporteerde nummer geeft u de juiste hoeveelheid vrij geheugen). De PET en VIC-20 hadden nooit meer dan 32k totaal geheugen beschikbaar voor BASIC, dus deze beperking werd pas duidelijk toen de C64 werd ontwikkeld. De FRE- functie in BASIC 3.5 en 7.0 loste dit probleem op, en FRE in BASIC 7.0 was ook "gesplitst" in twee functies, één om het vrije BASIC-programmatekstgeheugen weer te geven en de andere om vrij variabel geheugen weer te geven.

Alternatieven

Image
Het BASIC-startscherm van de Simons.

Er zijn veel BASIC-extensies uitgebracht voor de Commodore 64, vanwege de relatief beperkte mogelijkheden van de oorspronkelijke BASIC 2.0. Een van de meest populaire extensies was de DOS Wedge , die werd meegeleverd op de Commodore 1541 Test/Demo Disk . Deze uitbreiding van 1 KB aan BASIC voegde een aantal schijfgerelateerde opdrachten toe, waaronder de mogelijkheid om een ​​map van schijf te lezen zonder het programma in het geheugen te vernietigen. De functies werden later opgenomen in verschillende extensies van derden, zoals de populaire Epyx Fast Load -cartridge . Andere uitbreidingen van BASIC hebben extra trefwoorden toegevoegd om het gemakkelijker te maken om afbeeldingen met een hoge resolutie, geluid en sprites zoals Simons' BASIC te coderen .

Hoewel het gebrek aan geluid of grafische functies van BASIC 2.0 voor veel gebruikers frustrerend was, beweerden sommige critici dat het uiteindelijk gunstig was omdat het de gebruiker dwong om machinetaal te leren.

De beperkingen van BASIC 2.0 op de C64 leidden tot het gebruik van de machinetaal die in de BASIC ROM was ingebouwd. Om een ​​bestand in een aangewezen geheugenlocatie te laden, zou een oproep de bestandsnaam, het station en het apparaatnummer lezen: ; [ 8 ]​ de locatie wordt gespecificeerd in de X- en Y-registers: ; [ 9 ]​ en de bootstrap zou worden aangeroepen met: . [ 10 ] SYS57812"filename",8POKE780,0:POKE781,0:POKE782,192SYS65493

Een schijfmagazine voor de C64, Loadstar , was een ontmoetingsplaats voor amateurprogrammeurs die verzamelingen van proto-commando's voor BASIC deelden, genaamd met het commando SYS dirección + desplazamiento.

Vanuit een modern programmeerstandpunt presenteerden eerdere versies van Commodore BASIC een aantal slechte programmeertrucs voor de programmeur. Aangezien de meeste van deze problemen voortkwamen uit Microsoft BASIC , hadden vrijwel alle BASIC's voor thuiscomputers van die tijd vergelijkbare tekortkomingen. [ 11 ] De programmeur heeft een regelnummer toegewezen aan elke regel van een Microsoft BASIC-programma. Het was gebruikelijk om getallen met een bepaalde waarde (5, 10 of 100) te verhogen om het gemakkelijker te maken om regels in te voegen tijdens het bewerken of debuggen van programma's, maar een slechte planning betekende dat het invoegen van grote secties in een programma vaak een herstructurering van de hele code vereiste. Een veelgebruikte techniek was om een ​​programma te starten op een laag regelnummer met springtabel ON...GOSUB , waarbij de hoofdtekst van het programma is gestructureerd in secties die beginnen met een bepaald regelnummer, zoals 1000, 2000, enz. Als er een grote sectie moest worden toegevoegd, kon deze eenvoudig worden toegewezen aan het volgende beschikbare hoofdregelnummer en in de sprongtabel worden ingevoegd.

Latere BASIC-versies op Commodore en andere platforms bevatten een DELETE- en RENUMBER- opdracht , evenals een AUTO-regelnummeringsopdracht die automatisch regelnummers selecteert en invoegt volgens een geselecteerde stapgrootte. Ook worden alle variabelen behandeld als globale variabelen. Duidelijk gedefinieerde lussen zijn moeilijk te maken, waardoor de programmeur vaak moet vertrouwen op het GOTO -commando (dit werd later gecorrigeerd in BASIC 3.5 met de toevoeging van DO, LOOP, WHILE, UNTIL en EXIT ). Vlagvariabelen moesten vaak worden gemaakt om bepaalde taken uit te voeren. Eerdere Commodore BASIC's missen ook debugging-commando's, wat betekent dat fouten en ongebruikte variabelen moeilijk te vinden zijn. De IF...THEN...ELSE structuren , een standaard onderdeel van Microsoft BASIC Z80, werden toegevoegd aan BASIC 3.5 nadat ze niet meer beschikbaar waren in eerdere versies van Commodore BASIC.

Gebruik als gebruikersinterface

Net als andere thuiscomputers startten Commodore's machines rechtstreeks op naar de BASIC-interpreter. BASIC programmeer- en bestandscommando's kunnen in de directe modus worden ingevoerd om software te laden en uit te voeren. Als de uitvoering van het programma werd gestopt met de RUN/STOP-toets, zouden de waarden van de variabelen in het RAM worden bewaard en konden ze worden geraadpleegd met het PRINT-commando voor debugging. De 128 wijdde zelfs zijn tweede 64k-bank aan variabele opslag, waardoor waarden konden blijven bestaan ​​​​totdat een NEWof -opdracht werd gegeven RUN. Dit, samen met de geavanceerde schermeditor die bij Commodore BASIC wordt geleverd, gaf de programmeeromgeving een REPL -achtig gevoel ; programmeurs konden programmaregels op elke locatie op het scherm invoegen en bewerken, waardoor het programma interactief werd gemaakt. [ 12 ] Dit in tegenstelling tot bedrijfsgeoriënteerde besturingssystemen uit die tijd, zoals CP/M of MS-DOS , die doorgaans opstartten in een opdrachtregelinterface . Als op deze platforms een programmeertaal nodig was, moest deze apart worden geüpload.

Terwijl sommige versies van Commodore BASIC schijfspecifieke DLOADy -commando's bevatten DSAVE, ontbrak deze in de versie die in Commodore 64 was ingebouwd , waardoor de gebruiker het apparaatnummer van de diskdrive (meestal 8 of 9) in het standaardcommando moest specificeren LOAD, wat anders de cassette zou zijn. Een andere omissie van Commodore 64 BASIC 2.0 was een commando DIRECTORYom de inhoud van een schijf weer te geven zonder het hoofdgeheugen te wissen. In 64 werd het weergeven van bestanden op een schijf geïmplementeerd als het laden van een "programma", dat, indien vermeld, de map weergaf als een pseudo BASIC-programma, met de blokgrootte van het bestand als regelnummer. Dit had tot gevolg dat het geladen programma in het geheugen werd overschreven. Plug-ins zoals DOS Wedge hebben dit overwonnen door de directorylijst direct in het schermgeheugen weer te geven.

Versies en functies

Een lijst met versies van CBM BASIC in chronologische volgorde, met achtereenvolgens toegevoegde functies:

Gepubliceerde versies

  • V1.0: PET 2001 met chiclet-toetsenbord en Datasette (origineel PET)
    • arrays beperkt tot 256 elementen
    • De opdracht PEEK is expliciet uitgeschakeld in BASIC ROM-locaties boven $C000
  • V2.0 (eerste uitgave): PET 2001 met volledig reistoetsenbord en bijgewerkte ROM
    • voegt IEEE-488- ondersteuning toe
    • verbeterde afvalinzameling [ 13 ]
    • fix array-fout
    • Paasei: Als u WAIT6502,[nummer] invoert, wordt MICROSOFT!een willekeurig aantal keren weergegeven
  • V4.0: PET/CBM 4000/8000-serie (en nieuwste versie van PET 2001)
    • schijfbewerkingen : DLOAD,DSAVE,COPY,SCRATCH,etc (15 in totaal)
    • schijffout kanaalvariabelen:DS,DS$
    • Sterk verbeterde prestaties voor het verzamelen van afval [ 13 ]
  • V2.0 (tweede versie, na 4.0): VIC-20 ; C64
  • V4+: CBM-II- serie (ook bekend als B, P-reeks)
    • geheugen management:BANK
    • meer schijfbewerkingen :BLOAD, BSAVE, DCLEAR
    • geformatteerde weergave:PRINT USING, PUDEF
    • capture-fout:DISPOSE
    • alternatieve vork:ELSE
    • dynamische foutafhandeling:TRAP, RESUME, ERR$()
    • flexibele lezing van DATA: RESTORE [regelnummer]
    • string zoekfunctie:INSTR
  • V3.5: C16/116 , Plus/4
    • geluids- en grafische opdrachten
    • joystick invoer :JOY
    • decimalehexadecimale conversie :DEC(),HEX$()
    • gestructureerde lus:DO, LOOP, WHILE, UNTIL, EXIT
    • functietoetstoewijzing: KEY(ook directe modus)
    • programma's invoeren/bewerken:AUTO, DELETE, RENUMBER
    • debuggen (zn):TRON, TROFF
    • MLM- invoeropdracht :MONITOR
    • Easter Egg C(1)16, Plus/4: Voer <code>SYS 52650</code> in
  • V7.0: C128
    • meer geluids- en grafische opdrachten, inclusief sprite -afhandeling
    • geïntegreerde sprite-editor:SPRDEF
    • meerdere instructieblokken voor structuren IF THEN ELSE:BEGIN,BEND
    • peddel , stylus :JARRO,PEN
    • Functie of exclusief :XOR
    • haal het adres van de variabele op:POINTER
    • vensters in tekstmodus:WINDOW
    • gecontroleerde vertraging:SLEEP
    • geheugen management:SWAP, FETCH, STASH, FRE(1)
    • gebruik van 128- bankwisseling om programmacode apart van variabelen op te slaan. Variabele waarden zouden behouden blijven over programma-uitvoeringen als het programma werd gestart met de opdracht GOTO.
    • meer schijfbewerkingen :BOOT, DVERIFY
    • Aanpassing CPU-snelheid: FAST,SLOW(2 vs 1 MHz)
    • ga naar de C64-modus:GO64
    • ongedocumenteerd, werkend: RREG(leest CPU-registers na een SYS)
    • niet geïmplementeerde commando's:OFF,QUIT
    • Easter Egg C128 – Enter SYS 32800,123,45,6

Niet uitgebrachte versies

  • V3.6: Commodore LCD (niet-gepubliceerd prototype). Bijna identiek aan V7.0, met de volgende verschillen: [ 14 ]
    • VOLUMENin plaats vanVOL
    • EXITin plaats vanQUIT
    • commando's FAST, SLOWniet aanwezig
    • Extra commando:POPUPS
  • V10: Commodore 65 (niet uitgebracht prototype)
    • grafische/video-opdrachten:PALETTE, GENLOCK
    • muis invoer :MOUSE, RMOUSE
    • hulpprogramma voor tekstbestanden ( SEQ):TYPE
    • programma bewerking:FIND, CHANGE
    • geheugen management:DMA, FRE(2)
    • niet geïmplementeerde commando's:PAINT, LOCATE, SCALE, WIDTH, SET, VIEWPORT, PASTE, CUT

uitbreidingspakketten

  • Super Expander (VIC-20; geleverd op ROM-cartridge ) (Commodore)
  • Super Expander 64 (C64; patroon) (Commodore)
  • Simons' Basis (C64; patroon) (Commodore)
  • Grafisch BASIC (C64; diskette) ( Hesware )
  • BASIC 8 (C128; diskette en optionele interne ROM-chip) ( Walrusoft )

Zie ook

Referenties

  1. ^ Getuigd door Jack Tramiel op de Commodore 64 25th Anniversary Celebration in het Computer History Museum op 10 december 2007 [1] Gearchiveerd op 11 december 2008, bij de Wayback Machine [2] Gearchiveerd op 3 oktober 2017 bij de Wayback Machine . [3] .
  2. p=43 "Bill Gates' persoonlijke paaseieren in 8-bit BASIC - pagetable.com" . pagetable.com . Ontvangen op 8 augustus 2018 . 
  3. ^ "Toetsenbord en de Screen Editor" . juli 1985. 
  4. ^ "Byte juli 1983" . 
  5. ^ Leemon, Sheldon (1987). De Commodore 64 & 64C in kaart brengen . BEREKENEN! publicaties. p. 37. ISBN  9780874550825 . Ontvangen 25 maart 2018 . 
  6. ^ Cowper, Ottis R. (1986). De Commodore 128 in kaart brengen . BEREKENEN! publicaties. p. 66 . ISBN  9780874550603 . 
  7. ^ "De Commodore 64 in kaart brengen" . 
  8. ^ Leemon, Sheldon (1987). De Commodore 64 & 64C in kaart brengen . BEREKENEN! publicaties. p. 209. ISBN  9780874550825 . Ontvangen 25 maart 2018 . 
  9. ^ Leemon, Sheldon (1987). De Commodore 64 & 64C in kaart brengen . BEREKENEN! publicaties. p. 71. ISBN  9780874550825 . Ontvangen 25 maart 2018 . 
  10. ^ Leemon, Sheldon (1987). De Commodore 64 & 64C in kaart brengen . BEREKENEN! publicaties. p. 231. ISBN  9780874550825 . Ontvangen 25 maart 2018 . 
  11. ^ "Atari BASIC en PET Microsoft BASIC. EEN BASISVERGELIJKING.” . 
  12. ^ Scrimshaw, NB (11 november 2013). Een inleiding tot de Commodore 64: avonturen in programmeren . ISBN  9781489967879 . 
  13. a b http://www.zimmers.net/anonftp/pub/cbm/firmware/README.txt _
  14. ^ "Mike Naberezny - Commodore LCD-firmware" . mikenaberezny.com . Ontvangen op 8 augustus 2018 . 
BASIS 2.0
  • Angerhausen et al. (1983). De anatomie van de Commodore 64 (voor de volledige referentie, zie het C64 artikel).
BASIS 3.5
  • Gerard, Peter; Bergin, Kevin (1985). De complete COMMODORE 16 ROM demontage . Gerald Duckworth & Co. Ltd. ISBN  0-7156-2004-5 .
BASIS 7.0
  • Jarvis, Dennis; Springer, Jim D. (1987). BASIC 7.0 Binnenwerk . Grand Rapids, Michigan: Abacus Software, Inc. ISBN  0-916439-71-2 .
BASIS 10.0

Externe links