Zagonetke Sharpa PC 1500

Ima računara kod kojih je mašinsko programiranje moguće ali nedovoljno dokumentovano. Dobar primer takvog računara je PC1500: njegovi proizvođači nisu objavili nikakvu literaturu o mašinskom programiranju, pa čak nisu spomenuli ni postojeće naredbe PEEK, POKE, CALL u okviru uputstva za upotrebu! Pisma proizvođača su nas uverila da "Sharp" nema nameru da otkriva tajne mašinskog programiranja i da je na korisnicima da u tome uspeju. Ponovo NOMAS!

Ne bi bilo problema kada bi Sharp PC1500 koristio procesor čiji je sat instrukcija poznat. PC1500, međutim, koristi specijalizovani procesor kod koga se kodiranje isntrukcija razlikuje od većine poznatih. Računar, pored toga, ima prilično čudan sistem adresiranja koji je omogućio memoriju od 128 kilobajta. Ipak, vredni francuski i američki korisnici PC1500 uspeli su da uđu u njegove tajne i objave set instrukcija (iako nekompletan) kao i mapu bejzika koji se koristi. Na taj način je mašinsko programiranje postalo relativno dostupno širem krugu korisnika.

Pre nego što navedemo spisak mašinskih naredbi za PC1500, moramo da izložimo bejzik naredbe za rad sa programima na mašinskom jeziku. Da bismo uopšte mogli da unosimo mašinski program, moramo za nejga da rezervišemo odgovarajući prostor. To postižemo pomoću naredbe NEW. U uputstvu za korišćenje je spomenut samo njen oblik NEW O kojim se briše čitava programska memorija računara. Mi ćemo, na primer, da koristimo NEW 14000 što znači da samo 14000 bajtova memorije rezervisali za BASIC program, a preostalih 14533 - 14000 = 533 bajta za mašinske programe. Ovakva raspodela važi sve dok je ne opozovemo sa NEW 15433 (svi ovi podaci se odnose na PC1500 koji je proširen maksimalnim memorijskim modulom od 8 kilobajta; ukoliko njega nema, sve brojeve treba srazmerno umanjiti).

Za unošenje mašinskih programa, kao i uvek, koristimo naredbu POKE. Ukoliko, na primer, želimo da u memorijske ćelije čije su adrese 14500 i 14501 postavimo mašinski program kodiran kao OA 9A, koristimo POKE 14500,&OA,&9A. Za proveravanje upisanog programa možemo da koristimo PEEK (PEEK 14500 treba na ekranu da da 10, što je prevod broja OA u dekadni sistem).

Mašinski programi se snimaju na kasetu naredbom SCAVE M, a čitaju naredbom CLOAD M. Opšti format naredbe SCAVE je, koristeći uobičajenu Bekusovu notaciju, SCAVE M "ime"; početna adresa [;krajnja adresa] a naredbe CLOAD M: CLOAD M "ime" [; početna adresa].

Do sada tajanstvene naredbe operativnog sistema POKE # I PEEK # koriste se za smeštanje sadržaja u "gornjih" 64 kilobajta memorije i deluju na isti način kao POKE i PEEK koje smeštaju podatke u "donjih" 64 K. Jasno je da računar, u sadašnjim opremama, ima daleko ispod 64 K memorije, pa naredbe PEEK # i POKE # izgledaju nepotrebno. Ipak, može da se desi da Sharp pusti u prodaju aplikacione ili čak memorijske module koji bi bitno proširili memoriju PC1500!

Za one koji ne žele da pišu mašinske programe ali nameravaju da upotrebe naredbe PEEK i POKE, vredi reći da je kodiranje bejzik programa sada razjašnjeno. Svaka linija bejzika sadrži najpre linijski broj, zatim adresu početka sledeće linije i, na kraju, sadržaj kodiran tako da svaka bejzik naredba zauzima dva bajta (F1 A8 je, na primer, naredba RANDOM). Na kraju linije uvek se nalazi kod OD koji je odvaja od sledeće. Znajući ovo, moguće je sastaviti bejzik program koji vrši prenumeraciju drugih bejzik programa tako da se linijski brojevi razlikuju za po 10, pa čak i program koji bi pisao druge programe (na primer, komponovao muziku).

Mnogo je interesantnije pisanje programa na pravom mašinskom jeziku. Njih unosimo pomoću POKE, a startujemo novom naredbom CALL. Ovu naredbu prati adresni deo koji predstavlja adresu prve mašinske instrukcije koju treba izvršiti. CALL se, jasno, može naći i u samom bejzik programu.

Set instrukcija procesora LH5801 dat je u sledeće dve tabele. Prva predstavlja funkcije standardnih naredbi, dok druga daje instrukcije koje se izvršavaju kada se ispred nekog koda nađe FD. Ovaj kod je neka vrsta prefiksa koji je stvorio mogućnost proširenja seta instrukcija sa 256 novih, čime je broj naredbi povećan na 511 bez ikakvog utroška memorije. U tabelama (posebno u drugoj) ima dosta praznih mesta - to su instrukcije čije značenje još nije poznato. Otkrivene instrukcije daju mogućnost pisanja veoma složenih programa, ali nedostatak poznavanja svih instrukcija onemogućava disasembliranje ROM-a u kome ih ima dosta (nova formulacija Marfijevog zakona: ako ne poznajete značenje jedne naredbe, onda se ona najčešće javlja u ROM-u).

U tabelama su instrukcije objašnjene korišćenjem standardne nomenklature procesora Z80. Ipak, Z80 ima mnogo manje naredbi od LH5801, pa može da se desi da manje iskusan korisnik ne može da shvati funkciju neke naredbe poznajući samo njenu skraćenicu... Prostor u ovom izdanju nam, na žalost, ne omogućava da objasnimo sve naredbe, pa nam samo ostaje da obećamo da će se u Katalogu našeg Kluba pojaviti program-uputstvo broj PC1500901300 koje će biti mnogo opširnije. U međuvremenu, navodimo primer programa koji demonstrira brojanje od 0 256x256=65536 i, uzgred, prednost mašinskog jezika na BASIC-om:

4100 4A 00      LD R1,0
4102 B5 00      LD A, O
4104 DD         INC A
4105 99 03      JR NZ - 3
4107 40         INC R1
4108 99 08      JR NZ - 8
410A 9A         RET

Za unošenje ovog programa najpre rezervišite potreban prostor sa NEW &4200, a onda ga unesite pomoću POKE &4100,&4A, 0,&B5, 0,&DD, &99,3 &40,&99,9,&9A, Izvršavanje programa se postiže sa CALL &4100. Ne vredi da uključujete štopericu - nećete stići ni da primetite kada je program završio sa radom. S obzirom na to da "brojanje" traje manje od jedne sekunde, mnogi vlasnici PC1500 ne veruju da je program dobro napisan! Bejzik program bi isti problem rešio za petnaestak minuta. 

Govorite li bejzik Moja home strana