24. Pamäť počítača: Peek, Poke a premenné na adrese

Na čo to je

Atari sa ovláda cez pamäť. Farba pozadia, poloha kurzora, posledný stlačený kláves, stav joysticku – to všetko sú bajty na známych adresách. Kto vie čítať a zapisovať pamäť, vie z počítača dostať všetko, čo knižnica neponúka.

Pamäť Atari v skratke

Pamäť je rad 65536 bajtov s adresami 0 až 65535 ($0000 až $FFFF). Nie je to jednoliaty priestor:

AdresyČo tam je
$0000–$00FFnultá stránka – pracovné bunky systému a jazyka
$0100–$01FFzásobník procesora
$0200–$05FFpremenné operačného systému (farby, klávesnica, časovače)
$0600–$06FFšiesta stránka – 256 bajtov, ktoré systém nepoužíva; voľné pre programy
$0700–…DOS, ak je nahraný
$2000–…tvoj program (action26 ho sem predvolene ukladá)
…–$BFFFvoľná pamäť a na jej konci pamäť obrazovky
$D000–$D7FFregistre čipov: grafika, zvuk, joysticky
$C000–$CFFF, $D800–$FFFFoperačný systém v ROM (pamäť len na čítanie)

Zoznam užitočných adries je v prílohe D.

Adresy premenných v RAM ($0000–$05FF) a registrov sú vo všetkých verziách operačného systému rovnaké. Vnútro ROM nie: Atari 800, Atari XL/XE aj voľná náhrada AltirraOS majú na tých istých adresách v ROM iný kód. Do ROM sa preto skáče len cez oficiálne vstupné body – tabuľku od $E450 (napríklad $E456 pre vstup a výstup). Program, ktorý volá rutinu z vnútra ROM na pevnej adrese, beží len s jednou verziou systému.

Ako sa to píše

Rutiny knižnice

RutinaČo robí
Peek(adresa)funkcia – vráti bajt z adresy
PeekC(adresa)funkcia – vráti CARD z adresy a adresy + 1
Poke(adresa, hodnota)zapíše bajt na adresu
PokeC(adresa, hodnota)zapíše CARD na adresu a adresu + 1

Peek je anglicky „nakuknúť“, poke „štuchnúť“. Mená pochádzajú z jazyka BASIC.

Premenná na adrese

Action!
BYTE background=710

To je deklarácia z kapitoly 6, pred ktorou si mal byť opatrný: číslo bez hranatých zátvoriek je adresa. Premenná background nedostane vlastné miesto – je bajtom na adrese 710. Zápis background=148 robí to isté ako Poke(710, 148), len sa lepšie číta a je rýchlejší.

Rovnako sa dá položiť na adresu pole:

Action!
BYTE ARRAY page6(256)=1536

Celý program

Súbor examples/memory.act:

Action!
; Memory: reading and writing bytes by their address

BYTE background=710          ; this variable IS the byte at address 710
BYTE ARRAY page6(256)=1536   ; an array placed at address 1536 ($600)

PROC Main()
  BYTE value
  CARD word

  Poke(1536, 65)             ; write 65 to address 1536
  value=Peek(1536)           ; read it back
  Print("Address 1536 holds ")
  PrintBE(value)

  PokeC(1538, 50000)         ; a CARD takes two bytes: 1538 and 1539
  word=PeekC(1538)
  Print("Addresses 1538-1539 hold ")
  PrintCE(word)
  Print("Low byte ")   PrintB(Peek(1538))
  Print(", high byte ") PrintBE(Peek(1539))

  page6(4)=7                 ; the same memory through the array
  Print("page6(4) is address 1540: ")
  PrintBE(Peek(1540))
  Print("page6(0) is address 1536: ")
  PrintBE(page6(0))

  background=148             ; the same as Poke(710, 148)
  Print("Address 710 holds ")
  PrintBE(Peek(710))
RETURN

Preklad a spustenie

action26 memory.act --sim

Čo uvidíš

Address 1536 holds 65
Addresses 1538-1539 hold 50000
Low byte 80, high byte 195
page6(4) is address 1540: 7
page6(0) is address 1536: 65
Address 710 holds 148

Ako to funguje

Skús to v emulátore – pridaj na koniec GetD(7), aby program počkal na kláves (kapitola 2):

action26 memory.act --run

Niekoľko adries na hranie

AdresaMeno v kniháchČo robí
710COLOR2farba pozadia textovej obrazovky
709COLOR1jas písma
712COLOR4farba okraja
752CRSINH1 = kurzor je skrytý
82LMARGNľavý okraj textu (predvolene 2)
764CHkód posledného stlačeného klávesu; 255 = žiadny
20RTCLOKpočítadlo, ktoré sa zväčší 50-krát (v USA 60-krát) za sekundu
53770RANDOMpri každom čítaní náhodné číslo

Farba je jedno číslo: 16 × odtieň + jas. 148 je odtieň 9 a jas 4.

Časté chyby

Čo sa staloČo sa stane
BYTE x=710, keď si chcel počiatočnú hodnotux je bajt na adrese 710; každý zápis mení farbu pozadia
Poke na adresu, ktorú nepoznášmôže sa stať čokoľvek – od ničoho po zamrznutie počítača
Poke do ROM ($C000 a vyššie okrem registrov)nič – do pamäte len na čítanie sa zapísať nedá
Peek z registra čipu vráti iné, ako si zapísalje to normálne: veľa registrov má iný význam pri čítaní a pri zápise

Zápis na zlú adresu počítač nepoškodí – stačí ho vypnúť a zapnúť. V emulátore a simulátore sa nemôže stať vôbec nič zlé, takže skúšaj smelo.

Vyskúšaj si

  1. V emulátore zmeň farbu okraja (adresa 712) a jas písma (709).
  2. Vypíš Peek(53770) desaťkrát v slučke – v emulátore dostaneš zakaždým iné číslo.
  3. Deklaruj BYTE left=82, nastav left=10 a vypíš niekoľko riadkov textu. Čo sa stane v emulátore?

Zhrnutie

Späť: 23. Program vo viacerých súboroch · Ďalej: 25. Strojový kód