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.