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ápisVýznam
PEEK(adresa)funkcia: bajt, ktorý je na adrese
POKE adresa,hodnotaprí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:

Atari BASIC
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 back

Ako to funguje

Užitočné adresy

AdresaČo tam jePríklad
18, 19, 20hodiny: bajt 20 sa zväčší 50-krát za sekundu, 19 raz za 5 sekúndPOKE 20,0
82, 83ľavý a pravý okraj textuPOKE 82,0
84, 85riadok a stĺpec kurzoraPEEK(84)
88, 89adresa pamäte obrazovky
106koniec pamäte v stránkach po 256 bajtochPEEK(106)
186, 187riadok, na ktorom nastala chybakapitola 17
195číslo poslednej chyby
708–712farby (to isté, čo nastavuje SETCOLOR 0–4)POKE 710,0
7521 skryje kurzor, 0 ho ukážePOKE 752,1
764kód naposledy stlačeného klávesu, 255 = žiadnykapitola 22
53279klávesy START, SELECT, OPTIONkapitola 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:

Atari BASIC
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 --run

Program 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ápornejERROR- 3 AT LINE 80
adresa nad 65535ERROR- 3
POKE na náhodnú adresučokoľvek: nič, rozsypaná obrazovka, zamrznutý program. Pamäť nie je chránená
čakanie na hodiny v simulátoreprogram 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

  1. Vypíš, na ktorom riadku a stĺpci je kurzor (PEEK(84), PEEK(85)).
  2. Zmeň wait.abas, aby medzi číslami čakal pol sekundy.
  3. Zisti kód posledného znaku reťazca: je na adrese ADR(A$)+LEN(A$)-1.

Zhrnutie

Späť: 17. Chyby za behu · Ďalej: 19. Textová obrazovka