34. Bloky pamäte: DPEEK, DPOKE, MOVE, -MOVE, BPUT, BGET, %PUT, %GET
Na čo to je
PEEK a POKE pracujú s jedným bajtom. Turbo-BASIC XL pridáva príkazy pre dva bajty naraz a pre celé kusy pamäte: skopírovať ich inam, zapísať do súboru, prečítať zo súboru. Čo v Atari BASICu trvalo slučkou sekundy, je tu jeden príkaz.
Ako sa to píše
| Zápis | Čo robí |
|---|---|
DPEEK(a) | funkcia: dvojbajtové číslo z adries a a a+1 – to isté ako PEEK(a)+256*PEEK(a+1) |
DPOKE a,v | zapíše číslo 0–65535 do dvoch bajtov |
MOVE odkiaľ,kam,koľko | skopíruje koľko bajtov; postupuje od začiatku |
-MOVE odkiaľ,kam,koľko | to isté, ale postupuje od konca |
BPUT #k,adresa,koľko | zapíše kus pamäte do súboru |
BGET #k,adresa,koľko | prečíta kus súboru do pamäte |
%PUT #k,číslo | zapíše číslo do súboru v šiestich bajtoch, tak ako ho drží pamäť |
%GET #k,premenná | prečíta ho späť |
Celý program
Súbor examples/blocks.tbas:
10 REM DPEEK, DPOKE, MOVE, BPUT, BGET, %PUT, %GET
20 PRINT "The screen is at ";DPEEK(88)
30 DPOKE 1536,12345
40 PRINT DPEEK(1536);" = ";PEEK(1536);" + 256*";PEEK(1537)
50 DIM A$(12),B$(12)
60 A$="HELLO, WORLD":B$="............"
70 MOVE ADR(A$),ADR(B$),5
80 PRINT B$
90 -MOVE ADR(A$),ADR(A$)+2,10
100 PRINT A$
110 REM A block of memory and a number into a file and back
120 OPEN #1,8,0,"D:BLOCK.DAT"
130 BPUT #1,ADR(B$),12
140 %PUT #1,3.14159
150 CLOSE #1
160 B$="????????????":X=0
170 OPEN #1,4,0,"D:BLOCK.DAT"
180 BGET #1,ADR(B$),12
190 %GET #1,X
200 CLOSE #1
210 PRINT B$;" ";XPreklad a spustenie
Basic26 blocks.tbas --simČo uvidíš
The screen is at 48192
12345 = 57 + 256*48
HELLO.......
HEHELLO, WOR
HELLO....... 3.14159Ako to funguje
- Riadok 20: adresa obrazovky jedným slovom namiesto
PEEK(88)+256*PEEK(89). - Riadky 30 a 40:
DPOKErozdelí číslo na dva bajty: 12345 je 57 + 256 × 48. Menší bajt je na nižšej adrese. - Riadok 70:
MOVEskopíruje päť bajtov zo začiatkuA$na začiatokB$. Pracuje s pamäťou, nie s reťazcami – o dĺžkach ani oDIMnevie nič, takže nepíš viac bajtov, než má cieľ miesta. - Riadok 90: zdroj a cieľ sa prekrývajú: desať bajtov sa posúva o dve miesta doprava v tom istom reťazci. Obyčajný
MOVEby si pri kopírovaní od začiatku prepísal to, čo ešte len má skopírovať.-MOVEide od konca a prekrytie mu nevadí. Pravidlo: pri posune k vyšším adresám-MOVE, k nižšímMOVE. - Riadok 130:
BPUTzapíše 12 bajtov pamäte do súboru jedným príkazom. Tak sa ukladá obrázok, znaková sada alebo pole. - Riadok 140:
%PUTzapíše číslo presne tak, ako je v pamäti – šesť bajtov. OprotiPRINT #1;Xsa nič nestratí zaokrúhlením a číta sa rýchlejšie. - Riadky 180 a 190: to isté naspäť, v tom istom poradí.
Na čo sa MOVE používa
- Obrazovka:
MOVE zdroj,DPEEK(88),960prekreslí celú textovú obrazovku naraz z pripravenej predlohy. - Znaková sada:
MOVE 57344,nová,1024skopíruje písmo Atari do pamäte, kde ho môžeš zmeniť. - Polia a reťazce: vynulovanie alebo kópia bez slučky.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
MOVE pri prekrývaní smerom nahor | začiatok bloku sa rozkopíruje cez celý zvyšok |
| viac bajtov, než má cieľ miesta | prepíše sa, čo leží za ním – iné premenné, program |
BGET za koncom súboru | ERROR- 136 |
%GET číta niečo, čo nezapísal %PUT | nezmyselné číslo |
poradie MOVE kam,odkiaľ | kopíruje sa opačne; prvý je zdroj |
DPOKE hodnoty nad 65535 | ERROR- 3 |
Vyskúšaj si
- Ulož pole desiatich čísel do súboru cez
%PUTv slučke a prečítaj ho späť. - Vyplň reťazec hviezdičkami: zapíš jednu na začiatok a zvyšok sprav cez
MOVEs prekrytím o jeden bajt. (Tu sa „chyba“ z prvého riadka tabuľky hodí.) - V emulátore: zaplň obrazovku textom a cez
MOVEskopíruj jej hornú polovicu do dolnej.
Zhrnutie
DPEEKaDPOKEčítajú a píšu dva bajty naraz.MOVE odkiaľ,kam,koľkokopíruje pamäť; pri prekrytí smerom nahor-MOVE.BPUTaBGETpresúvajú kus pamäte do súboru a späť.%PUTa%GETukladajú číslo presne, v šiestich bajtoch.
Späť: 33. Čas · Ďalej: 35. Kruhy a výplne