Commodore BASIC
Zaprojektowany przez | Microsoftu |
---|---|
Deweloper | Microsoftu |
Po raz pierwszy pojawiły się | 1977 |
Wersja stabilna | V7.0 / 1985
|
Wersja podglądu | V10.0 / 1991
|
Platforma | PET do C128 |
Commodore BASIC , znany również jako PET BASIC lub CBM-BASIC , jest dialektem języka programowania BASIC używanego w 8-bitowej linii komputerów domowych Commodore International , rozciągającej się od PET z 1977 do C128 z 1985.
Rdzeń jest oparty na 6502 Microsoft BASIC i jako taki ma wiele wspólnych cech z innymi 6502 BASIC tamtych czasów, takimi jak Applesoft BASIC . Commodore uzyskał licencję BASIC od Microsoft w 1977 roku na zasadzie „płać raz, bez tantiem” po tym, jak Jack Tramiel odrzucił ofertę Billa Gatesa w wysokości 3 USD za jednostkę opłaty, stwierdzając: „Jestem już żonaty” i zapłaci nie więcej niż 25 000 USD na wieczystą licencję.
Oryginalna wersja PET była bardzo podobna do oryginalnej implementacji firmy Microsoft z kilkoma modyfikacjami. BASIC 2.0 na C64 był również podobny i był również widoczny na C128 (w trybie C64) i innych modelach. Późniejsze PETy zawierały BASIC 4.0, podobny do oryginału, ale dodający szereg poleceń do pracy z dyskietkami .
BASIC 3.5 był pierwszym, który naprawdę odszedł, dodając szereg poleceń do obsługi grafiki i dźwięku na C16 i Plus / 4. BASIC 7.0 został dołączony do Commodore 128 i zawierał polecenia programowania strukturalnego z BASIC 3.5 Plus / 4, a także słowa kluczowe zaprojektowane specjalnie w celu wykorzystania nowych możliwości maszyny. Dodano edytor sprite'ów i monitor języka maszynowego. Ostatni, BASIC 10.0, był częścią niewydanego Commodore 65 .
Historia
Commodore wziął kod źródłowy płatnego BASIC-a i rozwinął go wewnętrznie dla wszystkich innych 8-bitowych komputerów domowych. Dopiero na Commodore 128 (z wersją 7.0) została wyświetlona informacja o prawach autorskich firmy Microsoft. Jednak Microsoft wbudował jajko wielkanocne w wersję 2 lub „uaktualnienie” Commodore Basic, które udowodniło jego pochodzenie: wpisanie (niejasnego) polecenia CZEKAJ 6502, 1
spowodowałoby Microsoft!
pojawiające się na ekranie. (Jajko wielkanocne było dobrze zaciemnione — wiadomość nie pojawiła się w żadnym demontażu tłumacza).
Popularny Commodore 64 był dostarczany z BASIC v2.0 w pamięci ROM, mimo że komputer został wydany po serii PET / CBM, która miała wersję 4.0, ponieważ 64 był przeznaczony jako komputer domowy, podczas gdy seria PET / CBM była skierowana do biznesu i edukacji używać tam, gdzie zakładano, że ich wbudowany język programowania jest częściej używany. Pozwoliło to zaoszczędzić koszty produkcji, ponieważ V2 pasuje do mniejszych pamięci ROM.
Szczegóły techniczne
Edycja programu
Wygodną funkcją rezydującego w pamięci ROM interpretera języka BASIC firmy Commodore i KERNAL był pełnoekranowy edytor . Chociaż klawiatury Commodore mają tylko dwa klawisze kursora , które zmieniały kierunek po przytrzymaniu klawisza Shift, edytor ekranu umożliwiał użytkownikom wprowadzanie bezpośrednich poleceń lub wprowadzanie i edytowanie wierszy programu z dowolnego miejsca na ekranie. Jeśli linia była poprzedzona numerem linii, była tokenizowana i przechowywana w pamięci programu. Wiersze nie rozpoczynające się od liczby były wykonywane przez naciśnięcie RETURN , gdy kursor znajdował się w wierszu. Oznaczało to znaczące ulepszenie interfejsów wprowadzania programów w porównaniu z innymi popularnymi komputerami domowymi BASIC w tamtym czasie, które zwykle korzystały z edytorów linii , wywoływanych przez oddzielne polecenie EDIT
lub „kursor kopiowania”, który obcinał linię w miejscu kursora.
Miał również możliwość zapisywania nazwanych plików na dowolnym urządzeniu, w tym na kasecie - popularnym urządzeniu pamięci masowej w czasach PET i takim, które pozostawało w użyciu przez cały okres życia 8-bitowych Commodores jako niedroga forma pamięci masowej . Większość systemów obsługiwała tylko nazwy plików na dyskietce , co utrudniało zapisywanie wielu plików na innych urządzeniach. Użytkownik jednego z tych innych systemów musiał zanotować licznik rejestratora w miejscu, w którym znajdował się plik, ale było to niedokładne i podatne na błędy. W PET (i BASIC 2.0) pliki z kaset można było żądać po imieniu. Urządzenie szukałoby nazwy pliku, odczytując dane sekwencyjnie, ignorując wszelkie niezgodne nazwy plików. System plików był również wspierany przez potężną strukturę rekordów , którą można było ładować lub zapisywać w plikach. Dane z kasety Commodore były rejestrowane cyfrowo, a nie tańszymi (i mniej niezawodnymi) analogowymi metodami stosowanymi przez innych producentów. Dlatego potrzebny był wyspecjalizowany zestaw danych , a nie standardowy magnetofon. Dostępne były adaptery, które wykorzystywały przetwornik analogowo-cyfrowy, aby umożliwić korzystanie ze standardowego rejestratora, ale kosztowały one tylko trochę mniej niż Datasette.
Polecenie LOAD może być użyte z opcjonalnym parametrem 1, który załaduje program do pamięci pod adresem zawartym w pierwszych dwóch bajtach pliku (te bajty są odrzucane i nie są zachowywane w pamięci). Jeśli ,1 nie jest używany, program zostanie załadowany na początek obszaru programu BASIC, który znacznie różni się w zależności od maszyny. Niektóre warianty Commodore BASIC dostarczały BLOAD
i BSAVE
, które działały jak ich odpowiedniki w Applesoft BASIC , ładując lub zapisując bitmapy z określonych lokalizacji pamięci.
PET nie obsługuje programów relokowalnych, a polecenie LOAD zawsze ładuje pierwsze dwa bajty zawarte w pliku programu. Stworzyło to problem podczas próby załadowania programów BASIC zapisanych na innych komputerach Commodore, ponieważ ładowałyby się pod wyższym adresem niż tam, gdzie BASIC oczekiwał programu PET. Istniały obejścia umożliwiające „przeniesienie” programów do właściwej lokalizacji. Jeśli program został zapisany na CBM-II , jedynym sposobem załadowania go na PET była modyfikacja pierwszych dwóch bajtów za pomocą edytora sektorów dysku, ponieważ seria CBM-II miała obszar programu BASIC na poziomie 0 USD, co spowodowałoby w pliku PET próbującym załadować stronę zerową i blokującym się.
Słowa kluczowe Commodore BASIC można było skracać, wprowadzając najpierw niezmienione naciśnięcie klawisza, a następnie naciśnięcie klawisza z przesunięciem następnej litery. To ustawia wysoki bit , powodując, że interpreter przestaje czytać i analizuje instrukcję zgodnie z tabelą przeglądową. Oznaczało to, że instrukcja do momentu ustawienia wysokiego bitu była akceptowana jako substytut wpisywania całego polecenia. Ponieważ jednak wszystkie słowa kluczowe języka BASIC były przechowywane w pamięci jako tokeny jednobajtowe, było to raczej ułatwienie przy wprowadzaniu instrukcji niż optymalizacja.
W domyślnym zestawie znaków składającym się tylko z wielkich liter przesunięte znaki pojawiają się jako symbol graficzny; np. polecenie GOTO
może być skrócone do G{Shift-O}
(co przypominało G Γ
na ekranie). Większość takich poleceń miała długość dwóch liter, ale w niektórych przypadkach były dłuższe. W takich przypadkach istniała niejednoznaczność, więc potrzebnych było więcej nieprzesuniętych liter polecenia, takich jak GO{Shift-S}
( GO♥
) wymagane dla GOSUB
. Niektóre polecenia nie miały skróconej formy, albo ze względu na zwięzłość, albo niejednoznaczność z innymi poleceniami. Na przykład polecenie INPUT
nie miało skrótu, ponieważ jego pisownia kolidowała z oddzielnym słowem kluczowym INPUT#
, które znajdowało się bliżej początku tabeli wyszukiwania słów kluczowych . Często używane PRINT
miało jeden znak ?
skrót, co było powszechne w większości dialektów Microsoft BASIC. Skracanie poleceń za pomocą przesuniętych liter jest unikalne dla Commodore BASIC.
Ta metoda tokenizacji miała taką usterkę, że jeśli jedna zawierała REM
(instrukcja BASIC, aby dodać komentarz do kodu), a następnie {Shift-L}
, podczas próby wyświetlenia listy programów interpreter BASIC natychmiast przerwałby wyświetlanie, wyświetlić ?BŁĄD SKŁADNI
i powrócić do GOTOWE.
podpowiedź. Ta usterka została w pewnym stopniu wykorzystana przez programistów, którzy chcieli spróbować chronić swoją pracę, chociaż dość łatwo było ją obejść.
Skracając słowa kluczowe, można było zmieścić więcej kodu w pojedynczej linii programu (która mogła zająć dwie linie ekranu na 40-kolumnowych wyświetlaczach - tj. C64 lub PET, lub cztery linie na 22-kolumnowym wyświetlaczu VIC-20). Pozwoliło to na niewielką oszczędność kosztów ogólnych związanych z przechowywaniem niezbędnych w innym przypadku dodatkowych linii programu, ale nic więcej. Wszystkie polecenia BASIC-a były tokenizowane i zajmowały 1 bajt (lub dwa, w przypadku kilku poleceń BASIC 7 lub BASIC 10) w pamięci, bez względu na to, w jaki sposób zostały wprowadzone. Tak długie linie były uciążliwe do edycji. Polecenie LIST
wyświetlało całe słowo kluczowe polecenia - rozszerzając linię programu poza 2 lub 4 linie ekranu, które można było wprowadzić do pamięci programu.
Wydajność
Podobnie jak oryginalny interpreter Microsoft BASIC , Commodore BASIC jest wolniejszy niż natywny kod maszynowy . Wyniki testów wykazały, że skopiowanie 16 kilobajtów z ROM do RAM zajmuje mniej niż sekundę w kodzie maszynowym, w porównaniu do ponad minuty w BASICu. [ potrzebne źródło ] Aby wykonywać szybciej niż tłumacz, programiści zaczęli stosować różne techniki przyspieszające wykonywanie. Jednym z nich było przechowywanie często używanych wartości zmiennoprzecinkowych w zmiennych zamiast używania wartości literalnych, ponieważ interpretacja nazwy zmiennej była szybsza niż interpretacja liczby literalnej. Ponieważ typ zmiennoprzecinkowy jest domyślnym typem dla wszystkich poleceń, szybsze jest użycie liczb zmiennoprzecinkowych jako argumentów niż liczb całkowitych. Gdy szybkość była ważna, niektórzy programiści konwertowali sekcje programów BASIC na 6502 lub 6510 , który był ładowany oddzielnie z pliku lub wprowadzany do pamięci z instrukcji DATA na końcu programu BASIC i wykonywany z BASIC przy użyciu polecenia SYS ,
albo z trybu bezpośredniego lub z samego programu . Gdy szybkość wykonywania języka maszynowego była zbyt duża, na przykład w grze lub podczas oczekiwania na dane wejściowe użytkownika, programiści mogli sondować , odczytując wybrane lokalizacje pamięci (takie jak $ C6
dla 64 lub $ D0
dla 128, oznaczające rozmiar kolejce klawiatury), aby opóźnić lub zatrzymać wykonanie.
Unikalną cechą Commodore BASIC jest użycie kodów kontrolnych do wykonywania zadań, takich jak czyszczenie ekranu lub pozycjonowanie kursora w programie; można je wywołać, wydając PRINT CHR$ ( X )
, gdzie X odpowiada kodowi sterującemu, który ma zostać wydany (na przykład PRINT CHR$ ( 147 )
jest kodem sterującym do wyczyszczenia ekranu) lub naciskając klawisz w pytanie między cudzysłowami, więc naciśnięcie ⇧ Shift + CLR HOME po cudzysłowie spowoduje, że BASIC wyświetli wizualną reprezentację kodu sterującego (w tym przypadku odwrócone serce), na którym następnie działają podczas wykonywania programu (bezpośrednie wydrukowanie kody kontrolne zużywają mniej pamięci i są wykonywane szybciej niż wywołanie funkcji CHR$ ). Jest to w porównaniu z innymi implementacjami języka BASIC, które zazwyczaj mają dedykowane polecenia do czyszczenia ekranu lub przesuwania kursora.
BASIC 3.5 i nowsze mają odpowiednie polecenia do czyszczenia ekranu i przesuwania kursora.
Linie programu w Commodore BASIC nie wymagają nigdzie spacji (ale polecenie LIST zawsze wyświetli jedną między numerem linii a instrukcją), np. 100 IF A = 5 THENPRINT "YES" : GOTO 160
, a pisanie programów było powszechne bez odstępu. Ta funkcja została dodana w celu oszczędzania pamięci, ponieważ tokenizator nigdy nie usuwa spacji wstawionych między słowami kluczowymi: obecność spacji powoduje dodatkowe 0x20
w tokenizowanym programie, które są jedynie pomijane podczas wykonywania. Spacje między numerem wiersza a instrukcją programu są usuwane przez tokenizer.
Linie programu mogą mieć łącznie 80 znaków na większości maszyn, ale maszyny z 40-kolumnowym tekstem powodowałyby zawijanie linii do następnej linii na ekranie, a na VIC-20, który miał 22-kolumnowy wyświetlacz, linie programu mogą zajmować aż cztery. BASIC 7.0 na Commodore 128 zwiększył limit linii programu do 160 znaków (cztery linie po 40 kolumn lub dwie linie po 80 kolumn). Używając skrótów, takich jak ?
zamiast PRINT
można zmieścić jeszcze więcej na linii. BASIC 7.0 wyświetla błąd ?ŁAŃCUCH ZBYT DŁUGI , jeśli użytkownik wprowadzi wiersz programu dłuższy niż 160 znaków. Wcześniejsze wersje nie powodowały błędu i po prostu wyświetlały komunikat READY dwa wiersze niżej, jeśli długość wiersza została przekroczona. Numer wiersza jest liczony w liczbie znaków w wierszu programu, więc pięciocyfrowy numer wiersza spowoduje, że dozwolonych będzie o cztery znaki mniej niż w przypadku numeru jednocyfrowego.
Kolejność wykonywania linii Commodore BASIC nie była określona przez numerację linii; zamiast tego podążał za kolejnością, w jakiej linie były łączone w pamięci. Linie programu były przechowywane w pamięci jako pojedynczo połączona lista ze wskaźnikiem (zawierającym adres początku następnej linii programu), numerem linii, a następnie tokenizowanym kodem dla linii. Podczas wprowadzania programu BASIC stale zmieniał kolejność wierszy programu w pamięci, tak aby numery wierszy i wskaźniki były w porządku rosnącym. Jednak po wprowadzeniu programu ręczna zmiana numerów linii i wskaźników za pomocą POKE może pozwolić na wykonanie poza kolejnością lub nawet nadać każdej linii ten sam numer linii. Na początku, kiedy BASIC był używany komercyjnie, była to ochrony oprogramowania , aby zniechęcić do przypadkowych modyfikacji programu.
Numery wierszy mogą mieścić się w zakresie od 0 do 65520 i przechowywać pięć bajtów niezależnie od liczby cyfr w numerze wiersza, chociaż wykonanie jest szybsze, im mniej cyfr. Umieszczenie wielu instrukcji w jednym wierszu spowoduje mniejsze zużycie pamięci i szybsze wykonanie.
GOTO i GOSUB przeszukają w dół od bieżącej linii, aby znaleźć numer linii, jeśli wykonywany jest skok do przodu, w przypadku skoku do tyłu, wrócą do początku programu, aby rozpocząć wyszukiwanie. Spowoduje to spowolnienie większych programów, dlatego lepiej jest umieścić często używane podprogramy blisko początku programu.
Nazwy zmiennych mają znaczenie tylko dla 2 znaków; stąd nazwy zmiennych VARIABLE1
, VARIABLE2
i VA
odnoszą się do tej samej zmiennej.
Commodore BASIC obsługuje również operatory bitowe — AND, OR i XOR , chociaż ta funkcja była częścią podstawowego kodu Microsoft 6502 BASIC, zwykle była pomijana w innych implementacjach, takich jak Applesoft BASIC .
Natywnym formatem liczbowym Commodore BASIC, podobnie jak jego macierzystego MS BASIC , był zmiennoprzecinkowy . Większość współczesnych implementacji języka BASIC wykorzystywała jeden bajt na charakterystykę ( wykładnik ) i trzy bajty na mantysę . Dokładność liczby zmiennoprzecinkowej przy użyciu trzybajtowej mantysy wynosi tylko około 6,5 cyfr dziesiętnych, a błąd zaokrąglenia jest powszechny. 6502 implementacji Microsoft BASIC wykorzystywało 40-bitową arytmetykę zmiennoprzecinkową, co oznacza, że przechowywanie zmiennych wymagało pięciu bajtów (czterobajtowa mantysa i jeden bajt dla wykładnika) w przeciwieństwie do 32-bitowej zmiennoprzecinkowej znalezionej w BASIC-80.
Podczas gdy implementacje Microsoft BASIC 8080/Z80 obsługiwały zmienne całkowite i podwójnej precyzji, implementacje 6502 były tylko zmiennoprzecinkowe.
Chociaż Commodore BASIC obsługuje zmienne całkowite ze znakiem (oznaczone znakiem procentu) w zakresie od -32768 do 32767, w praktyce są one używane tylko dla zmiennych tablicowych i pełnią funkcję oszczędzania pamięci poprzez ograniczenie elementów tablicy do dwóch bajtów każdy (tablica 2000 elementów zajmie 10 000 bajtów, jeśli zostanie zadeklarowane jako tablica zmiennoprzecinkowa, ale tylko 4000, jeśli zostanie zadeklarowane jako tablica liczb całkowitych). Oznaczanie dowolnej zmiennej jako liczby całkowitej po prostu powoduje, że BASIC konwertuje ją z powrotem na liczbę zmiennoprzecinkową, spowalniając wykonywanie programu i marnując pamięć, ponieważ każdy znak procentu zajmuje jeden dodatkowy bajt do zapisania (ponieważ dotyczy to również tablic całkowitych, programista powinien unikać ich używania, chyba że bardzo używane są duże tablice, które przekraczałyby dostępną pamięć, gdyby były przechowywane jako zmiennoprzecinkowe). Ponadto nie jest możliwe POKE lub PEEK lokalizacji pamięci powyżej 32767 z adresem zdefiniowanym jako liczba całkowita ze znakiem.
Zamiast liczby 0 można użyć kropki (.) (a więc 10 A = .
zamiast 10 A = 0
lub 10 FOR A = . TO 100
zamiast 0 10 FOR A = to 100
), będzie to działać nieco szybciej.
Instrukcja SYS , używana do uruchamiania programów w języku maszynowym, została dodana przez Commodore i nie znajdowała się w oryginalnym kodzie Microsoft BASIC, który zawierał tylko funkcję USR do wywoływania procedur języka maszynowego. Automatycznie ładuje rejestry CPU wartościami 30C-30F $
(C64, różni się na innych komputerach) - może to być użyte do przekazywania danych do procedur języka maszynowego lub jako sposób wywoływania funkcji jądra z BASIC-a (na przykład , POKE 780 , 147 : SYS 65490
czyści ekran).
Ponieważ 8-bitowe maszyny Commodore inne niż C128 nie mogą automatycznie uruchamiać oprogramowania dyskowego, zwykłą techniką jest dołączenie kodu pośredniczącego BASIC, takiego jak 10 SYS 2048
, aby rozpocząć wykonywanie programu. Możliwe jest automatyczne uruchamianie oprogramowania po załadowaniu i nie wymaganie od użytkownika wpisywania RUN , odbywa się to za pomocą fragmentu kodu, który przechwytuje „gotowy” wektor języka BASIC na $0302
.
Podobnie jak w przypadku większości innych wersji Microsoft BASIC , jeśli tablica nie jest zadeklarowana za pomocą instrukcji DIM , jest automatycznie ustawiana na dziesięć elementów (w praktyce 11, ponieważ elementy tablicy są liczone od 0). Większe tablice muszą być zadeklarowane, w przeciwnym razie BASIC wyświetli błąd podczas uruchamiania programu, a tablica nie może zostać ponownie zwymiarowana w programie, chyba że wszystkie zmienne zostaną wyczyszczone za pomocą instrukcji CLR. Tablice numeryczne są automatycznie wypełniane zerami podczas ich tworzenia, może wystąpić chwilowe opóźnienie w wykonaniu programu, jeśli wymiarowana jest duża tablica.
Zmienne łańcuchowe są reprezentowane przez oznaczenie nazwy zmiennej znakiem dolara. Zatem zmienne AA$
, AA
i AA%
byłyby rozumiane jako odrębne. Zmienne tablicowe są również uważane za różne od prostych zmiennych, dlatego A i A(1) nie odnoszą się do tej samej zmiennej. Rozmiar tablicy ciągów odnosi się jedynie do liczby ciągów przechowywanych w tablicy, a nie do rozmiaru każdego elementu, który jest przydzielany dynamicznie. W przeciwieństwie do niektórych innych implementacji Microsoft BASIC, Commodore BASIC nie wymaga rezerwowania miejsca na ciąg znaków na początku programu.
W przeciwieństwie do innych 8-bitowych maszyn, takich jak Apple II, wszystkie maszyny Commodore mają wbudowany zegar, który jest inicjowany na 0 po włączeniu zasilania i aktualizowany z każdym taktem timera PIA/VIA/TED/CIA, czyli 60 razy na sekundę . Przypisano mu dwie zmienne systemowe w BASIC-u, TI i TI$ , z których obie zawierają aktualny czas. TI jest tylko do odczytu i nie można go modyfikować; spowoduje to wyświetlenie komunikatu o błędzie składni. TI$ może służyć do ustawiania czasu za pomocą ciągu sześciu cyfr (błąd wynika z użycia ciągu innego niż sześć cyfr). Zegar nie jest bardzo niezawodną metodą pomiaru czasu, ponieważ zatrzymuje się, gdy przerwania są wyłączone (wykonane przez niektóre procedury jądra), a dostęp do portu IEC (lub portu IEEE w PET) spowolni aktualizację zegara o kilka taktów.
Funkcja RND w Commodore BASIC może wykorzystywać zegar do generowania liczb losowych; jest to realizowane przez RND(0)
, jednak ma stosunkowo ograniczone zastosowanie, ponieważ zwracane są tylko liczby z zakresu od 0 do 255. W przeciwnym razie RND działa tak samo, jak inne implementacje Microsoft BASIC, ponieważ sekwencja pseudolosowa jest używana za pośrednictwem stałej 5-bajtowej wartości początkowej przechowywanej po włączeniu zasilania w lokalizacjach pamięci od 8B do 8F
na C64 (lokalizacja różni się w innych maszyny). RND z dowolną liczbą większą niż 0 wygeneruje liczbę losową złożoną z wartości zawartej w funkcji RND i wartości początkowej, która jest aktualizowana o 1 za każdym razem, gdy funkcja RND jest wykonywana. RND z liczbą ujemną przechodzi do punktu w sekwencji bieżącej wartości początkowej określonej przez liczbę.
Ponieważ prawdziwe generowanie liczb losowych jest niemożliwe przy użyciu instrukcji RND , w C64 i C128 bardziej typowe jest wykorzystywanie kanału białego szumu układu SID do liczb losowych.
BASIC 2.0 notorycznie cierpiał z powodu bardzo powolnego usuwania ciągów znaków. Wyrzucanie elementów bezużytecznych jest wywoływane automatycznie za każdym razem, gdy FRE , a jeśli istnieje wiele zmiennych łańcuchowych i tablic, którymi manipulowano w trakcie programu, wyczyszczenie ich może zająć ponad godzinę w najgorszych warunkach. Nie jest również możliwe przerwanie wyrzucania elementów bezużytecznych, ponieważ BASIC nie skanuje klawisza RUN/STOP podczas wykonywania tej procedury. BASIC 4.0 wprowadził ulepszony system wyrzucania elementów bezużytecznych ze wskaźnikami wstecznymi i wszystkie późniejsze implementacje Commodore BASIC również to mają.
Funkcja FRE w BASIC 2.0 miała inną wadę techniczną polegającą na tym, że nie może obsługiwać liczb ze znakiem powyżej 32768, więc jeśli funkcja zostanie wywołana na C64 (38k pamięci BASIC), zostanie wyświetlona ujemna ilość wolnej pamięci BASIC (dodanie 65535 do zgłoszony numer uzyska odpowiednią ilość wolnej pamięci). PET i VIC-20 nigdy nie miały więcej niż 32 KB całkowitej pamięci dostępnej dla BASIC-a, więc to ograniczenie nie stało się oczywiste, dopóki nie opracowano C64. Funkcja FRE w BASIC 3.5 i 7.0 rozwiązała ten problem, a FRE w BASIC 7.0 również została „podzielona” na dwie funkcje, jedną do wyświetlania wolnej pamięci tekstowej programu BASIC, a drugą do wyświetlania wolnej pamięci zmiennych.
Alternatywy
Wiele rozszerzeń języka BASIC zostało wydanych dla Commodore 64 ze względu na stosunkowo ograniczone możliwości jego natywnego języka BASIC 2.0. Jednym z najpopularniejszych rozszerzeń był DOS Wedge , który znalazł się na dysku testowym/demonstracyjnym Commodore 1541. To rozszerzenie 1 KB do BASICa dodało szereg poleceń związanych z dyskiem, w tym możliwość odczytu katalogu dysku bez niszczenia programu w pamięci. Jego funkcje zostały następnie włączone do różnych rozszerzeń innych firm, takich jak popularna Epyx FastLoad . Inne rozszerzenia BASIC dodały dodatkowe słowa kluczowe, aby ułatwić kodowanie duszków, dźwięku i grafiki w wysokiej rozdzielczości, takie jak BASIC Simonsa (1983) i Vision BASIC (2022).
Chociaż brak funkcji dźwiękowych lub graficznych w BASIC 2.0 był frustrujący dla wielu użytkowników, niektórzy krytycy argumentowali, że był on ostatecznie korzystny, ponieważ zmuszał użytkownika do nauki języka maszynowego.
Ograniczenia BASIC 2.0 na C64 doprowadziły do użycia wbudowanego języka maszynowego ROM z BASIC. Aby załadować plik do wyznaczonego miejsca w pamięci, nazwa pliku, dysk i numer urządzenia byłyby odczytywane przez wywołanie: SYS 57812 "filename" , 8
; lokalizacja byłaby określona w rejestrach X i Y: 00 POKE 780 , : POKE 781 , : POKE 782 , 192
; a procedura ładowania nosiłaby nazwę: SYS 65493
.
Magazyn dyskowy dla C64, Loadstar , był miejscem dla programistów-hobbystów, którzy udostępniali kolekcje proto-poleceń dla BASIC-a, wywoływanych za pomocą adresu SYS +
polecenie przesunięcia. [ potrzebne źródło ]
Z punktu widzenia współczesnego programowania, wcześniejsze wersje Commodore BASIC przedstawiały programistom wiele złych pułapek programistycznych. Ponieważ większość tych problemów wywodzi się z Microsoft BASIC , praktycznie każdy domowy komputer BASIC tamtej epoki miał podobne wady. Każdej linii programu Microsoft BASIC programista przypisał numer linii . Powszechną praktyką było zwiększanie liczb o pewną wartość (5, 10 lub 100), aby ułatwić wstawianie wierszy podczas edycji programu lub debugowania, ale złe planowanie oznaczało, że wstawianie dużych sekcji do programu często wymagało przebudowy całego kodu. Powszechną techniką było uruchamianie programu od niskiego numeru wiersza z tabelą skoków ON... GOSUB , z treścią programu podzieloną na sekcje, zaczynając od wyznaczonego numeru wiersza, takiego jak 1000, 2000 i tak dalej. Jeśli trzeba było dodać dużą sekcję, można było po prostu przypisać jej następny dostępny numer głównej linii i wstawić do tabeli przeskoków.
Ponadto wszystkie zmienne są traktowane jako zmienne globalne. Jasno zdefiniowane pętle wykraczające poza konstrukcję FOR...NEXT są trudne do stworzenia, często powodując, że programista polega na poleceniu GOTO (zostało to później naprawione w BASIC 3.5 przez dodanie poleceń DO, LOOP, WHILE, UNTIL i EXIT ). Zmienne flag często wymagały utworzenia w celu wykonania określonych zadań.
Późniejsze wersje BASIC na Commodore i inne platformy zawierały polecenie DELETE i RENUMBER , a także polecenie AUTOMATYCZNEGO numerowania linii, które automatycznie wybierało i wstawiało numery linii zgodnie z wybranym przyrostem. Wcześniejsze BASIC-y z Commodore również nie mają poleceń debugowania, co oznacza, że błędy i nieużywane zmienne są trudne do wyłapania. JEŚLI… TO… JEŚLI , standardowa część Z80 Microsoft BASIC, zostały dodane do BASIC 3.5 po tym, jak były niedostępne we wcześniejszych wersjach Commodore BASIC.
Użyj jako interfejsu użytkownika
Podobnie jak w przypadku innych komputerów domowych , komputery Commodore uruchamiały się bezpośrednio w interpreterze języka BASIC. Polecenia dotyczące plików i programowania języka BASIC można było wprowadzać w trybie bezpośrednim w celu ładowania i uruchamiania oprogramowania. Jeśli wykonywanie programu zostało zatrzymane za pomocą klawisza RUN/STOP, wartości zmiennych zostałyby zachowane w pamięci RAM i można je było wydrukować w celu debugowania. Model 128 przeznaczył nawet swój drugi bank 64k na przechowywanie zmiennych, pozwalając na zachowanie wartości do czasu wydania polecenia NEW
lub RUN .
To, wraz z zaawansowanym edytorem ekranu dołączonym do Commodore BASIC, nadało środowisku programistycznemu styl podobny do REPL ; programiści mogli wstawiać i edytować wiersze programu w dowolnym miejscu ekranu, interaktywnie budując program. Kontrastuje to z ówczesnymi systemami operacyjnymi zorientowanymi biznesowo, takimi jak CP/M lub MS-DOS , które zazwyczaj uruchamiały się z poziomu interfejsu wiersza poleceń . Jeśli na tych platformach wymagany był język programowania, musiał być ładowany osobno.
Podczas gdy niektóre wersje Commodore BASIC zawierały polecenia DLOAD
i DSAVE specyficzne dla dysku
, wersja wbudowana w Commodore 64 ich nie miała, co wymagało od użytkownika podania numeru urządzenia dysku (zwykle 8 lub 9) w standardowym poleceniu LOAD
, które w przeciwnym razie domyślnie do taśmy. Innym pominięciem w Commodore 64s BASIC 2.0 było DIRECTORY
do wyświetlania zawartości dysku bez czyszczenia pamięci głównej. W wersji 64 przeglądanie plików na dysku było realizowane jako ładowanie „programu”, który po wyświetleniu pokazywał katalog jako program pseudo BASIC, z rozmiarem bloku pliku jako numerem linii. Spowodowało to nadpisanie aktualnie załadowanego programu. Dodatki takie jak DOS Wedge przezwyciężyły ten problem, renderując listę katalogów bezpośrednio do pamięci ekranu.
Wersje i funkcje
Lista wersji CBM BASIC w porządku chronologicznym, z sukcesywnie dodawanymi funkcjami:
Wydane wersje
- V1.0: PET 2001 z klawiaturą typu chiclet i wbudowaną kasetą z danymi (oryginalny PET)
- tablice ograniczone do 256 elementów
- PEEK jawnie wyłączona w lokalizacjach BASIC ROM powyżej $C000
- Wersja 2.0 (pierwsze wydanie): PET 2001 z pełnowymiarową klawiaturą i aktualizacją ROM
- dodaj obsługę IEEE-488
- usprawniono segregację śmieci
- napraw błąd tablicy
- Pisanka – wpisując
WAIT6502,
[liczba] wyświetlaMICROSOFT!
dowolną liczbę razy
- V4.0: seria PET/CBM 4000/8000 (i późna wersja PET 2001s)
-
operacje na dysku :
DLOAD,DSAVE,COPY,SCRATCH
itp. (w sumie 15) - zmienne kanału błędu dysku:
DS,DS$
- znacznie poprawiona wydajność zbierania elementów bezużytecznych
-
operacje na dysku :
- V2.0 (drugie wydanie, po 4.0): VIC-20 ; C64
- V2.2 C64GS (1990)
- V4+ : seria CBM-II (znana również jako seria B, P)
- zarządzanie pamięcią:
BANK
-
więcej operacji na dysku :
BLOAD , BSAVE , DCLEAR
- drukowanie sformatowane:
DRUKUJ PRZY UŻYCIU, PUDEF
- wychwytywanie błędów:
DISPOSE
- alternatywne rozgałęzienie:
ELSE
- dynamiczna obsługa błędów:
TRAP,RESUME,ERR$()
- elastyczny
DATA
odczyt:PRZYWRÓĆ
[numer linii] - funkcja wyszukiwania ciągów znaków:
INSTR
- zarządzanie pamięcią:
- V3.5: C16/116 , Plus/4
- polecenia dźwiękowe i graficzne
-
wejście joysticka :
RADOŚĆ
-
dziesiętna ↔ szesnastkowa :
DEC(),HEX$()
- pętle strukturalne:
DO, LOOP, WHILE, DO, WYJŚCIE
- przyporządkowanie klawiszy funkcyjnych:
KLUCZ
(również w trybie bezpośrednim) - wprowadzanie/edycja programu:
AUTO,DELETE,RENUMBER
-
debugowanie (śledzenie):
TRON , TROFF
-
Polecenie wejścia MLM :
MONITOR
- C(1)16, Plus/4 Pisanka – wpisz
SYS 52650
- Wersja 7.0: C128
- więcej poleceń dźwiękowych i graficznych, w tym obsługa duszków
- wbudowany edytor sprite'ów:
SPRDEF
- bloki wieloinstrukcyjne dla struktur
IF THEN ELSE
:BEGIN,BEND
-
wiosło , wkład lightpen :
POT,PEN
-
wyłączny lub funkcja:
XOR
- pobierz adres zmiennej:
WSKAŹNIK
- okienkowanie w trybie tekstowym:
WINDOW
- kontrolowane opóźnienie czasowe:
SLEEP
- zarządzanie pamięcią:
SWAP, FETCH, STASH, FRE(1)
- przełączania banków 128 do przechowywania kodu programu oddzielnie od zmiennych. Wartości zmiennych byłyby zachowane podczas wykonywania programu, gdyby program został uruchomiony poleceniem GOTO.
-
więcej operacji na dysku :
BOOT, DVERIFY
- Regulacja szybkości procesora:
SZYBKO, WOLNO
(2 vs 1 MHz) - wejdź w tryb C64:
GO64
- nieudokumentowane, działające:
RREG
(odczyt rejestrów procesora poSYS
) - niezaimplementowane komendy:
OFF,QUIT
- C128 Pisanka – wpisz
SYS 32800,123,45,6
Niepublikowane wersje
- V3.6: Commodore LCD (niewydany prototyp). Prawie identyczny z V7.0, z następującymi różnicami:
-
GŁOŚNOŚĆ
zamiastGŁOŚNOŚCI
-
WYJŚCIE
zamiastWYJŚĆ
-
Brak poleceń
FAST, SLOW
- Dodatkowa komenda:
POPUPS
-
- V10: Commodore 65 (niewydany prototyp)
- polecenia grafika/wideo:
PALETTE, GENLOCK
-
wejście myszy :
MYSZ,RMOUSE
- plik tekstowy (
SEQ
) narzędzie:TYP
- edycja programu:
ZNAJDŹ, ZMIEŃ
- zarządzanie pamięcią:
DMA, FRE(2)
- niezaimplementowane polecenia:
MALUJ,LOKALIZUJ,SKALA,SZEROKOŚĆ,USTAW,WIDOK,WKLEJ,CUT
- polecenia grafika/wideo:
Godne uwagi pakiety rozszerzeń
- Super Expander (VIC-20; dostarczany na kasecie ROM ) (Commodore)
- Super Expander 64 (C64; kaseta) (Commodore)
- BASIC Simonsa (C64; kaseta) (Commodore)
- Grafika BASIC (C64; dyskietka) ( Hesware )
- BASIC 8 (C128; dyskietka i opcjonalny wewnętrzny układ ROM) ( Walrusoft )
- Wizja BASIC (C64; dyskietka) (Dennis Osborn)
Źródła
- Oś czasu wersji Commodore/Microsoft Basic
- Osobiste pisanki Billa Gatesa w 8-bitowym języku BASIC , pagetable.com
- BASIC 2.0
- Angerhausen i in. (1983). The Anatomy of the Commodore 64 (pełna informacja znajduje się w artykule C64 ).
- PODSTAWOWY 3.5
- Gerrard, Piotr; Bergin, Kevin (1985). Kompletny demontaż ROM COMMODORE 16 . Gerald Duckworth & Co. Ltd. ISBN 0-7156-2004-5 .
- BASIC 7.0
- Jarvis, Dennis; Springer, Jim D. (1987). BASIC 7.0 Elementy wewnętrzne . Grand Rapids, Michigan: Abacus Software, Inc. ISBN 0-916439-71-2 .
- BASIC 10.0