wtorek , 3 grudzień 2024

Tajniki BASIC-a – część druga :)

Poprzednim razem męczyłem (?) Was o sposobikach na czekanie na wciśnięcie klawisza. Od razu mówię, że ten cykl artykułów kieruję nie tylko dla całkowicie „zielonych” bo i tych jest coraz mniej 🙁 ale i również do osób, które już coś tam umieją klepać na klawiacie, a chcą wiedzieć coś więcej, żeby potem nie było, że piszę niepotrzebne texty! 🙂
OK! Czas, aby pokazać, co jeszcze umie ten bufor klawiatury. Wydawałoby się, że już wszystko wiemy… Niestety nie! Uzyskane do tej pory wiadomości dotyczą ok. 30% informacji na temat tego bufora. Dlatego chciałbym teraz dojechać do tych 100%. Może mi się uda 😉

Na początek taki mały bajer. Powiedzmy, że chcemy wyświetlić na ekranie 10 razy napis „c64 rulez!”.
I co wtedy robimy???
Wyjść mamy kilka! Oto najprostsze:

10 FORX=1TO10:PRINT"C64 RULEZ!":NEXT

Taki programik można napisać na wiele sposobów, ale nie będę się rozpisywał, bo to dziecinada :). Napiszę za to, jak używając bufora klawiatury, wyświetlić to samo:

1) wstawiamy do bufora text (od #631 do #640)
2) ustalamy ilość znaków w texcie, max 10 (poke198,x)
3) wykonujemy instrukcję END

Proste, ale głupie, gdyż nie możemy kontynuować programu. W modusie bezpośrednim po wpisaniu POKE198,x otrzymamy od razu ten text. Więc proszę to potraktować jako małą ciekawostkę :). Inaczej jest w Assemblerze. Można zrobić to samo, ale nie wiem, kiedy to będzie chodziło. Ten temat zostawiam już wam 🙂 Myślcie!

No dobra. Przechodzimy do konkretów.
A więc dzięki temu buforowi klawiatury możemy w trakcie wykonywania programu w BASIC-u robić różne jaja (kukurykuu!:). Można symulować ręczne wprowadzanie linii w BASIC-u podczas wykonywania programu. Teraz pokażę, jak za pomocą tego bufora zrobić takie coś. Załóżmy, że chcemy dodać nową linię i skasować starą. Oczywiście wszystko to bez przerywania programu w Basicu. Ofkoz jest to proste. Trzeba tylko pamiętać, aby dane do wprowadzenia były od 4 linii ekranowej. Dlaczego? To pytanie pozostawiam czytelnikom. To będzie wyglądać tak:

9 bleble coś tam .... 
10 print"(shift+clr home)((3x crsr up/down)";
11 print"9":print"15 wow nowa linia :)
12 print"(clr home)
13 poke631,13:poke632,13:poke198,2:end

Wyświetlamy 2 texty:

9
15 wow nowa linia :)

Następnie do bufora klawiatury, a konkretnie do 2 pierwszych komórek, wstawiamy wartość 13, co oznacza w kodzie ASCII klawisz RETURN. Następnie zawiadamiamy procesor, że w buforze ma 2 znaki do wyprowadzenia przez poke198,2 a przez instrukcję END powodujemy wyświetlenie bufora, a że w buforze są 2x return, więc nowe linie zostaną wprowadzone, lub inne skasowane. I oto chodziło. Prawie… No ale gdybyśmy chcieli kontynuować program? Prościzna :). Nic innego, jak dopisanie:

print"goto xx" (xx - numer linii dla goto)

Później zmienić na poke198,3 i poke633,13 i komputer po wykonaniu END skasuje linię 9, doda linię 15 i skoczy do xx.

JAK TO COŚ WYKORZYSTAĆ W PRAKTYCE???

Posłużę się przykładem z własnych doświadczeń: Piszesz program (w BASIC-u ofkoz!) i chcesz, aby dogrywało się coś z dysku. Więc piszesz:

50 load a$,8,1:goto100

I co? Komputer nie skoczy pod 100 tylko rozpocznie od nowa. Dlatego można się przed tym zabezpieczyć:

1 goto 10
10 printchr$(147):print:print
11 print"1 goto 50":print"goto20":print"(clr/home)
12 poke631,13:poke632,13:poke198,2:end 20 load"rambo :)",8,1
50 reszta programu

Wytłumaczenie:
Program zmieni linię 1, aby skok po wgraniu pliku odbył się we właściwe miejsce. Potem skoczy pod 20 aby wgrać plik. Po wgraniu program startuje od nowa (nie kasując zmiennych :), a że linię 1 zmieniliśmy, więc skok odbędzie się pod 50, a nie 10. Należy pamiętać o tym, że wartość wpisywana do komórki #198 nie może przekroczyć 10, tak samo poke 631,13 można wpisywać do poke 640,13. Z tego prosty wniosek, że na raz można wprowadzić 10 linii lub 9+skok (goto xx).

Co w następnej części???
Na pewno opowiem o czymś ciekawym w BASIC-u oraz przedstawię sposobik na zabezpieczenie i odbezpieczenie programu. Ofkoz to zabezpieczenie dotyczy tylko listingu. Nieeee żadne poke! Chociaż i to mogę napisać. Ale to dopiero w następnym numerze 🙂

H.M.MURDOCK/TROPYX

Jest to kontynuacja cyklu artykułów o programowaniu w BASIC-u na C64.

Tekst napisałem w 1999 r. przy użyciu Commodore 64 i edytora tekstowego do magazynu dyskowego Inverse. Ukazał się on w marcu 2000 r. w magazynie Inverse #7/Oxygen64 w dziale Inne. Oryginalną treść poddałem obróbce technicznej z uwzględnieniem poprawek interpunkcyjnych.