wtorek , 3 grudzień 2024

Tajniki BASIC-a część pierwsza (i nie ostatnia :)

Tym oto tajemniczym tytułem chciałbym rozpocząć cykl artykułów o różnorodnych tajnikach BASIC-a. Ponieważ jest to mój pierwszy artykuł do tak poważnego magazynu, więc z góry przepraszam wszystkich za ewentualne niedopatrzenia w texcie… No to lecimy z tym koxem 😉

Na pierwszy ogień idą sposobiki na czekanie na wciśnięcie klawisza. Zaznajomieni z BASIC-iem na pewno już teraz mówią, po co ja to piszę? HA! Wydawałoby się, że wszyscy znają dobry sposób na ten problem, ale jednak to nie jest prawdą. Programiście chodzi przede wszystkim o to, aby jego wytwór wyobraźni zajmował jak najmniej miejsca w pamięci. I do tego właśnie będę dążył w tym arcie. Wpierw zacznę od najprostszych sposobów na wciśnięcie by(d)le jakiego klawisza. Na pewno każdy z nas zna takie coś z BASIC-a:

10 GET A$:IF A$="" THEN 10

Logiczne nieprawdaż??? No, ale gdy chcemy, aby program czekał na wciśnięcie wybranego klawisza, to już trzeba zmienić program:

10 GET A$:IF A$="" THEN 10  11 IF A$="T" THEN 20  12 GOTO 10  20 reszta programu :)

No ale to zajmuje kupę (nie gówna:) pamięci (bez przesady:)! Dlatego zmodyfikujmy to cacko:

10 GET A$:IF A$<>"T" THEN 10

I o to chodziło… CZYŻBY ??? Oszczędzamy pamięć o te kilka bajtów, ale jest sposób, aby to coś nie zżerało nam pamięci. Jest takie cacko, które się nazywa BUFOR KLAWIATURY. Służy on do tego, aby przechowywać dane, kiedy nie mogą one być wyprowadzone na zewnątrz. Np. kiedy wykonujemy nasz 1 programik, to po naciśnięciu by(d)le jakiego klawisza, zostanie on wyświetlony na ekranie. To może psuć miły efekt, gdy np. program wykonuje wiele takich operacji, jak program nr 1. Dlatego można czyścić ten bufor przez POKE 198,0. Komórka 198 zawiera liczbę znaków do wyprowadzenia. Spróbujmy wpisać takie coś:

10 POKE 198,0:WAIT 198,1

Nielubiana przez programistów instrukcja WAIT może okazać się bardzo przydatna. Ten programik chroni nas przed wcześniejszym wciśnięciem spacji, gdyż zeruje znacznik bufora klawiatury. Proste ale nie skuteczne w 100%, gdyż po tym należy znowu wpisać POKE198,0, aby uniknąć wyświetlenia spacji np. przy wykonywaniu instrukcji INPUT.

10 POKE198,0:WAIT 198,1:POKE 198,0 11 INPUT A$ 12 BLEBLE...:)

Tylko nie wpisywać mi tych BLEBLE ! 🙂

Ale znowu marnujemy pamięć! Jest na to rada. Można posłużyć się samym buforem klawiatury, który jest od 631 do 640. Kiedy wykonamy programik nr 1, to do komórki 631 zostanie wpisana wartość 32 ($20) oznaczająca kod spacji. Można wymusić, aby program czekał, aż bufor wypełni się żądaną wartością:

10 POKE 198,0:IF PEEK(631)<>32THEN10

Niestety zawsze znajdzie się osoba, która wszystko popsuje. Zamiast spacji wciśnie tak dla jaj np. „a”. I co? Komórka 631 zapisze się odpowiednikiem w ASCII kodu litery „a” i program będzie wykonywany w nieskończoność, gdyż bufor klawiatury pobiera 10 kolejnych znaków i umieszcza je po kolei od 631 do 640, a następne znaki są ignorowane i wyświetlenie bufora zostanie wykonane dopóki przerwiemy wprowadzanie nowych znaków. A że komórka 631 została już zapełniona wartością inną, więc program będzie niemożliwy do kontynuacji… Tą metodę można skrócić przez:

10 POKE 198,0:WAIT 631,32

Jednak nie oto nam chodzi, tylko o to, aby wcisnąć wybrany klawisz i nie zawiesić programu. Czas zdradzić sekret, czyli wyjawić moją metodę na ten uporczywy ból (???). Do tego celu potrzebne są (do kupienia w każdym sklepie):
– instrukcja WAIT
– zerowanie znacznika bufora klawiatury: POKE198,0
– komórka 203 ($cb)
A więc ostateczna wersja naszego programiku będzie wyglądać tak:

10 POKE 198,0:WAIT 203,32:POKE 198,0

W miejsce „32” wstawiamy kod ASCII żądanego klawisza. Czyż to nie było proste??? Po co rozwlekłem ten problem??? Aby pokazać, jak ja do tego dochodziłem oraz przedstawić troszkę teorii na ten temat. Ten sposób jest niezawodny w 100%. W Assemblerze ta sprawa wygląda inaczej. Można to zrobić na kilka sposobów, m.in. skorzystać z Kernal’a. Ale również można nasz programik użyć w Assemblerze! I co, już napisałeś? Ech! Muszę wszystko robić za Was! A oto i on:

    *=1000
   lda #$00     
   sta $c6  
SP ldx $cb    
   cpx #$20     
   bne SP ;skok do SP, gdy w komórce $cb nie ma $20     
   sta $c6    
   rts     lub dalsza część programu...

No ale odbiegłem od tematu, gdyż ten artykuł dedykuję ludziom, którzy chcą pisać programy w BASIC-u, ale ten assemblerowski wybryk proszę potraktować jako ciekawostkę! Oczywiście za wartość $20 można wstawić inną!
W następnym odcinku pokażę, co jeszcze może ten bufor klawiatury wyczyniać… I może jeszcze coś???

H.M.MURDOCK/TROPYX

Ps. Jeżeli ktoś będzie miał jednak problemy z moim sposobikiem, to albo jest bardziej ciemny ode mnie albo coś źle wpisał. Ten programik w Assemblerze będzie działał zawsze, jeżeli nie zmienimy wskaźnika w $01.

H.M.MURDOCK is out…

Jest to mój pierwszy artykuł, jaki napisałem z przeznaczeniem do publikacji w magazynie dyskowym na scenie Commodore 64. Był to okres, w którym posiadałem wiele chęci i motywacji do pisania, co było spowodowane entuzjazmem związanym ze stawianiem pierwszych poważnych kroków na scenie komputerowej. Stworzenie kilkunastu artykułów o różnorodnej tematyce stało się później moim biletem wstępu do słynnej grupy Oxygen64, co przyjąłem z wielką radością. Moim zamiarem było także utrzymanie przy życiu magazynu Inverse, którego egzystencja na polskiej scenie C64 była poważnie zagrożona.

Artykuł napisałem w 1999 r. przy użyciu Commodore 64 oraz edytora tekstowego do magazynu dyskowego Inverse. Jak na pierwszą tego typu publikację, wyszła ona mi całkiem porządnie. Artykuł także wskazuje na moje pierwsze doświadczenia z programowaniem w Turbo Assemblerze.

Tekst ukazał się w marcu 2000 r. w magazynie Inverse #7/Oxygen64 w dziale Inne. Oryginalną treść poddałem obróbce technicznej z uwzględnieniem poprawek interpunkcyjnych.