18. Pamäť počítača: PEEK, POKE, FRE, ADR
Na čo to je
Pamäť Atari je rad 65 536 očíslovaných priehradok. Číslo priehradky je adresa (0 až 65535) a v každej je jeden bajt – číslo od 0 do 255. V pamäti je tvoj program, jeho premenné, obrazovka aj nastavenia počítača: farby, okraje, hodiny, posledný stlačený kláves.
PEEK sa do priehradky pozrie a POKE do nej zapíše. Tak sa z BASICu dostaneš k veciam, na ktoré nemá príkaz.
Ako sa to píše
| Zápis | Význam |
|---|---|
PEEK(adresa) | funkcia: bajt, ktorý je na adrese |
POKE adresa,hodnota | príkaz: zapíš bajt (0–255) na adresu |
PEEK(a)+256*PEEK(a+1) | číslo väčšie než 255 uložené v dvoch susedných bajtoch |
FRE(0) | funkcia: koľko bajtov pamäte je ešte voľných |
ADR(A$) | funkcia: adresa, na ktorej leží text reťazca |
Celý program
Súbor examples/memory.abas:
10 REM PEEK and POKE: the memory of the computer
20 PRINT "Left margin: ";PEEK(82)
30 PRINT "Right margin: ";PEEK(83)
40 SCR=PEEK(88)+256*PEEK(89)
50 PRINT "The screen starts at ";SCR
60 DIM A$(5):A$="HELLO"
70 PRINT "The first byte of A$ is ";PEEK(ADR(A$))
80 POKE ADR(A$),74
90 PRINT A$
100 POKE 82,10
110 PRINT "Margin 10 from the next line on"
120 PRINT "Here it is"
130 POKE 82,2
140 PRINT "And back"Preklad a spustenie
Tentoraz s voľbou --sim-screen: simulátor na konci neukáže, čo program postupne vypísal, ale ako vyzerá obrazovka – aj s medzerami na začiatku riadkov.
Basic26 memory.abas --sim --sim-screenČo uvidíš
Left margin: 2
Right margin: 39
The screen starts at 48192
The first byte of A$ is 72
JELLO
Margin 10 from the next line on
Here it is
And backAko to funguje
- Riadky 20 a 30: na adresách 82 a 83 si Atari drží ľavý a pravý okraj textu. Ľavý okraj je 2 – preto každý riadok na obrazovke začína dvoma medzerami. (Staré televízory okraj obrazu orezávali.)
- Riadok 40: adresa pamäte obrazovky je väčšia než 255, takže zaberá dva bajty, 88 a 89. Druhý bajt má váhu 256. Tento vzorec stretneš v dobových programoch stále.
- Riadok 70:
ADR(A$)je adresa prvého znaku reťazca. Je na nej 72 – kód písmenaH. - Riadok 80:
POKEtam zapíše 74, kód písmenaJ, a zHELLOjeJELLO. Reťazec sa zmenil bez toho, aby sa ho dotkol príkaz priradenia. - Riadok 100:
POKE 82,10posunie ľavý okraj. Platí od najbližšieho nového riadka – preto je riadok 110 ešte na starom mieste a až riadok 120 odsadený. - Riadok 130: okraj späť. Aj tu zmena platí až od ďalšieho riadka, takže
And backje ešte odsadený.
Užitočné adresy
| Adresa | Čo tam je | Príklad |
|---|---|---|
| 18, 19, 20 | hodiny: bajt 20 sa zväčší 50-krát za sekundu, 19 raz za 5 sekúnd | POKE 20,0 |
| 82, 83 | ľavý a pravý okraj textu | POKE 82,0 |
| 84, 85 | riadok a stĺpec kurzora | PEEK(84) |
| 88, 89 | adresa pamäte obrazovky | |
| 106 | koniec pamäte v stránkach po 256 bajtoch | PEEK(106) |
| 186, 187 | riadok, na ktorom nastala chyba | kapitola 17 |
| 195 | číslo poslednej chyby | |
| 708–712 | farby (to isté, čo nastavuje SETCOLOR 0–4) | POKE 710,0 |
| 752 | 1 skryje kurzor, 0 ho ukáže | POKE 752,1 |
| 764 | kód naposledy stlačeného klávesu, 255 = žiadny | kapitola 22 |
| 53279 | klávesy START, SELECT, OPTION | kapitola 22 |
Viac je v prílohe D. Najlepšia kniha o adresách Atari sa volá Mapping the Atari.
Hodiny a presné čakanie
Bajt na adrese 20 sa sám od seba zväčší o jedna päťdesiatkrát za sekundu (na amerických strojoch šesťdesiatkrát). Keď doň zapíšeš nulu a počkáš, kým v ňom bude 50, prešla sekunda – nech je program akokoľvek rýchly. Súbor examples/wait.abas:
10 REM Waiting by the clock of the computer
20 FOR N=5 TO 1 STEP -1
30 PRINT N
40 S=50:GOSUB 1000
50 NEXT N
60 PRINT "Go!"
70 END
1000 REM Wait S fiftieths of a second (S up to 255)
1010 POKE 20,0
1020 IF PEEK(20)<S THEN 1020
1030 RETURN
Basic26 wait.abas --runProgram odpočíta od päť do jedna, s presne sekundovou prestávkou medzi číslami. Podprogram na riadku 1000 budú používať aj ďalšie kapitoly.
Tento program spúšťaj v emulátore. Hodiny poháňa obrazovka Atari a simulátor obrazovku nemá – bajt 20 v ňom stojí a riadok 1020 by sa točil donekonečna.
FRE(0)
PRINT FRE(0) vypíše, koľko bajtov ostáva pre reťazce a polia, teda koľko ešte zoberie DIM. Preložený program dá iné číslo než ten istý program v interpreteri, lebo v pamäti leží inak. Na čísle v zátvorke nezáleží.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
POKE hodnoty nad 255 alebo zápornej | ERROR- 3 AT LINE 80 |
| adresa nad 65535 | ERROR- 3 |
POKE na náhodnú adresu | čokoľvek: nič, rozsypaná obrazovka, zamrznutý program. Pamäť nie je chránená |
| čakanie na hodiny v simulátore | program neskončí (instruction limit reached) |
dobový program robí POKE 106,… | posúva koniec pamäte, aby si za ním schoval znakovú sadu; prekladač na to upozorní (kapitola 42) |
Vyskúšaj si
- Vypíš, na ktorom riadku a stĺpci je kurzor (
PEEK(84),PEEK(85)). - Zmeň
wait.abas, aby medzi číslami čakal pol sekundy. - Zisti kód posledného znaku reťazca: je na adrese
ADR(A$)+LEN(A$)-1.
Zhrnutie
- Pamäť sú bajty (0–255) na adresách 0–65535.
PEEK(a)číta,POKE a,vzapisuje.- Dvojbajtové číslo:
PEEK(a)+256*PEEK(a+1). - Na adrese 20 tikajú hodiny, 50 za sekundu – čakanie podľa nich nezávisí od rýchlosti programu.
ADR(A$)je adresa textu reťazca,FRE(0)voľná pamäť.
Späť: 17. Chyby za behu · Ďalej: 19. Textová obrazovka