Programować Każdy Może - wprowadzenie

Wraz z tym działem, otwieramy kolejny rozdział naszego kompendium o wszechstronnym i nie mniej wspaniałym komputerku, jakim był i przez następne lata pozostanie, nieśmiertelny Commodore 64. Maszyna o nieprzeciętnych możliwościach, po prostu odkrycie lat 80-tych. Zrewolucjonizował on podejście do programowania jako takiego - premiował bowiem ludzi o twórczych zapędach. Powstało na nim kilkadziesiąt tysięcy profesjonalnych programów (m.in. gry, w które gra się do dziś - choć już nikt nie pamięta, że ich pierwowzory powstały na naszym C64) oraz wiele produkcji stricte scenowych - kto by je tam zliczył! Nie mniej pozostaje faktem, że nasza "komódka" pod koniec lat 80-tych, była DRUGIM po PC, najlepiej oprogramowanym komputerem osobistym na świecie. Uważni maniacy TV, zapewne nie raz rozpoznali znajome kształty w programach stacji Discovery, dotyczących armii USA (niewiarygodne, acz prawdziwe!). Moim skromnym planem, na łamach tego działu, będzie więc przybliżenie Wam rozwiązań różnorakich problemów, na jakie się natykacie w trakcie własnoręcznego "klepania" programów. Tematatyka tu poruszana, obejmie szeroki zakres zagadnień, od prostych porad, aż do listingów gotowych programów.

BASIC

W tym dziale, dotyczącym jedynie Basic'a (oraz Simon's Basic) przebrniemy przez szeroki wachlarz tematów. Wszak w tym języku programuje nadal znaczna część początkujących użytkowników C64. A język choć już trochę przestarzały, jest jednak nadal najwygodniejszy do podręcznych programów. Ja sam wykorzystuje emulator Basic'a Commodore 64, jako inteligentny programowalny kalkulator. Nie oznacza to iż dyskryminuje go teraz, ale zawsze byłem zwolennikiem używania najlepszych narzędzi, a Basic do tego celu jest znakomity.

#001 Sortowanie bąbelkowe.

Pierwszym problemem, na jaki zapewne natrafiacie podczas pisania swoich programów, jest chęć posortowania np. otrzymanych wyników. Poniższy programik wykona to tzw. metodą "bąbelkową". Na jego podstawie pokażę iż nie taki diabeł straszny jak go malują. Wykorzystamy go do zobrazowania losowania liczb i poukładania ich we właściwym porządku. Wersja pod emulator: basic001.zip

1 rem program lotto
2 a=1
3 b=int(rnd(1)*49+1)
4 c(a)=b : a=a+1
5 if a=7 then a=1 : goto 7
6 goto 3
7 for x=1 to 6
8 if a=x then 10
9 if c(x)=c(a) then 2
10 next : a=a+1
11 if a=7 then 13
12 goto 7
13 x=1
14 if c(x) > c(x+1) then 17
15 s=c(x) : c(x)=c(x+1) : c(x+1)=s
16 goto 13
17 x=x+1 : if x<6 then 14
18 for x=1 to 6
19 print c(7-x);
20 next x

Sam algorytm przedstawiam poniżej:

FOR I=1 TO N-1
FOR J=1 TO N-1
IF D(J) > D(J+1) THEN T=D(J) : D(J)=D(J+1) : D(J+1)=T
NEXT J
NEXT I

#002 Czas systemowy.

Po włączeniu komputera, zegar systemowy (w CIA) zlicza czas jaki upłynął od tego momentu. Każdy impuls zegara, przechwytywany jest przez zmienną systemową TI. Zliczane są setne części sekundy, więc należy zinterpretować je we właściwy sposób, by jego wartości uzyskały dla nas konkretną przydatność. Wersja pod emulator: basic002.zip

10 rem zegar systemowy
15 c=ti
16 s=int(c/60)
17 m=int(s/60)
18 g=int(m/60)
19 s=int((s/60-int(s/60))*60)
20 print:print
21 print chr$(18)
22 print " czas systemowy "
23 print " godzin : ";g
24 print " minut : ";m
25 print " sekund : ";s

#003 Liczba pi.

Ciekawe zagadnienie, pozwala policzyć ową liczbę z zadanym przybliżeniem. Niestety im bardziej dokładny wynik potrzebujemy, tym więcej czasu musimy poczekać. Wersja pod emulator: basic003.zip

10 rem liczba pi
15 input "ile krokow";a
16 b=3:d=1/b:e=1
17 e=e-d
18 b=b+2:d=1/b
19 e=e+d
20 b=b+2:d=1/b
21 if b>a then 23
22 goto 17
23 print "dla"a" krokow, pi =" e*4

Sam algorytm (rozwinięcie wzoru Leibinza):

Pi/4 = 1-1/3+1/5-1/7+1/9...

ASSEMBLER

Mówiąc szczerze, programowanie w języku niskiego poziomu - jakim jest język maszynowy, zawsze było okryte mgiełką mistycyzmu. Wyzwania, jakie stawia przed nami asembler, szybko zweryfikują naszą logiczność myślenia, brutalnie wykażą, iż maszyna zrobi wszystko, co jej tylko każemy - nie sprawdzając nawet czy mamy rację. Dlatego większość naszych programów będzie się "wieszać"... Ja jednak odkryje przed Wami, choć część rozwiązań palących problemów, przed jakimi możecie stanąć.

#001 unSecure dla Simon's Basic.

Nie tak dawno, na naszych łamach mogliście przeczytać opis interpretera SB. Wspomniałem wówczas o możliwości zabezpieczania swoich listingów. Teraz zaś pokażę Wam, jak skutecznie można je odbezpieczać. Wersja pod emulator: ass001.zip

Obok widzicie dwie wersje dwulinijkowego programu w Simon'się, przed i po zastosowaniu SECURE 0. Jak już wcześniej nadmieniłem, nie można z poziomu Basic'a odczytać zabezpieczonych linii. Aby tego dokonać uciekniemy się do krótkiego programu w asemblerze. Nasz "odbezpieczacz" jest skuteczny w 100%, więc używajcie Secure do woli - niech początkujący nie wykradają Wam pomysłów...

Sam sposób zabezpieczania jest prosty jak budowa cepa, wykorzystuje po prostu właściwości samego interpretera. Przyjrzyjcie się screen'om poniżej:

Powiększ do rozmiarów oryginalnychPowiększ do rozmiarów oryginalnych

program niezabezpieczony

program zabezpieczony

Zmieniła się tylko jedna wartość w .$081B. z $64 na $00. To i cała tajemnica... Dla interpretera wartość $00 po adresie (linku) jest równoznaczna z końcem linii. Wystarczy teraz tylko wyszukać, skacząc po linkach programu w Basic'u, gdzie po adresie jest te $00 i podmienić je ponownie na $64. Celowo nie wnikam tu w zawiłości interpretera i w sposób kodowania programu w pamięci, gdyż wykracza to dalece poza ramy tego artykułu.

#002 Wyświetlanie obrazków.

Czasami stajemy przed problemem wyświetlenia, czy przekonwerterowania obrazka. Problem jest niebagatelny, gdyż praktycznie każdy program zapisuje go sobie na swój sposób. Więc taka krótka ściąga, nieco ułatwi Wam zadanie.

Adv. Art. Studio:

mapa bitowa (matryca)

$2000

32 bloki

 

kolor par bitów 00 i 01

$3F40

4 bloki

 

kolor pary bitów 11

$4338

4 bloki

Koala Painter:

mapa bitowa (matryca)

$6000

32 bloki

 

kolor par bitów 00 i 01

$7F40

4 bloki

 

kolor pary bitów 11

$8328

4 bloki

Saracen Paint:

mapa bitowa (matryca)

$7C00

32 bloki

 

kolor par bitów 00 i 01

$7800

4 bloki

 

kolor pary bitów 11

$9C00

4 bloki

Vidcom:

mapa bitowa (matryca)

$6000

32 bloki

 

kolor par bitów 00 i 01

$5C00

4 bloki

 

kolor pary bitów 11

$5800

4 bloki

1 blok to 256 bajtów ($ff). Wyświetlimy to przy pomocy np. takiego programu:

*=$c000

lda $d018 ;inicjacja grafiki w trybie wielokolorowym
ora #$08 ;oraz przydział pamięci dla VIC
sta $d018
lda $d011
ora #$20
sta $d011
lda $d016
ora #$10
sta $d016

ldy #$00

hop

lda kolor0001+$0000,y ;kopiowanie tablic kolorów
sta $0400,y
lda kolor0001+$0100,y
sta $0500,y
lda kolor0001+$0200,y
sta $0600,y
lda kolor0001+$0300,y
sta $0700,y

lda kolor11+$0000,y
sta $d800,y
lda kolor11+$0100,y
sta $d900,y
lda kolor11+$0200,y
sta $da00,y
lda kolor11+$0300,y
sta $db00,y

iny
bne hop
jmp * ;zapętlenie

W miejsce "kolor" wstawiamy właściwy adres (tablic par bitów) dla naszego obrazka.

Tomasz 'TSD' Dzierkowski

 © 1999-2019 Wszystkie prawa zastrzeżone
 Webmaster: Mariusz "Flooder" Młynek