37. Miesto v pamäti a assembler: ORG, ENDORG, ALIGN, ASM … ENDASM
Rozšírenia action26 pre tých, ktorí chcú rozhodovať o tom, kde v pamäti veci ležia, a písať kúsky programu priamo v assembleri. Programy začínajú riadkom ;@modern (kapitola 35).
Kapitola nadväzuje na 24 (pamäť) a 25 (strojový kód).
ORG … ENDORG: premenné na zvolenom mieste
Na čo to je
Prekladač ukladá premenné tam, kde je program. Niekedy chceš inak:
- Nultá stránka (adresy 0 až 255) je najrýchlejšia pamäť procesora 6502. Premenná v nej robí slučky rýchlejšími a ukazovateľ v nej prekladač použije priamo.
- Hardvér Atari niektoré dáta chce na konkrétnych adresách.
Ako sa to píše
ORG adresa
deklarácie
ENDORGVšetko medzi ORG a ENDORG sa uloží od danej adresy. Za ENDORG prekladač pokračuje tam, kde bol predtým.
Pre programy sú v nultej stránke voľné adresy $C8 až $FF. Nižšie adresy patria operačnému systému a prekladaču.
ALIGN: zarovnanie na násobok
Na čo to je
Vlastná znaková sada musí začínať na adrese, ktorá je násobkom 1024. Pamäť pre pohyblivé objekty (hráčov a strely) na násobku 2048. ALIGN posunie nasledujúcu premennú na najbližšiu takú adresu.
Ako sa to píše
ALIGN nn je mocnina dvoch: 2, 4, 8 … 256, 1024, 2048 …
Celý program
Súbor examples/m-org.act:
;@modern
; ORG and ALIGN: choosing where variables live
ORG $CB ; the zero page: the fastest memory there is
BYTE fast
CARD address
ENDORG
BYTE normal ; back where the program is
ALIGN 256 ; the next variable starts at a multiple of 256
BYTE ARRAY table(16)
PROC Main()
PrintF("fast is at %H%E", @fast)
PrintF("address is at %H%E", @address)
PrintF("normal is at %H%E", @normal)
PrintF("table is at %H%E", table)
RETURNaction26 m-org.act --simfast is at $00CB
address is at $00CC
normal is at $2000
table is at $2100Ako to funguje
fastaaddressležia v nultej stránke, od$CB.normalje zaENDORG, takže je znova pri programe – na jeho začiatku,$2000.tableby inak nasledovala hneď zanormal($2001).ALIGN 256ju posunul na najbližší násobok 256,$2100. Preskočené bajty v súbore XEX nie sú.
ORG nie je to isté ako BYTE x=$CB z kapitoly 24. Tam si adresy každej premennej počítaš sám; v bloku ORG ich prekladač ukladá za sebou a stráži, aby sa neprekrývali.
ASM … ENDASM: assembler s menami
Na čo to je
Blok [ … ] z kapitoly 25 chce inštrukcie ako čísla. V bloku ASM sa píšu menami – tak, ako ich uvádzajú knihy o procesore 6502 – a dajú sa v ňom použiť mená premenných z programu.
Ako sa to píše
ASM
inštrukcie
ENDASMASMaENDASMstoja každé samo na riadku.- Na riadku je jedna inštrukcia. Komentár začína bodkočiarkou.
- Návestie (meno miesta, na ktoré sa skáče) začína v prvom stĺpci; inštrukcie sú odsadené.
- Mená premenných, polí a rutín programu znamenajú ich adresy.
- Prekladač k bloku nič nepridá. Ak blok tvorí celé telo rutiny, musí skončiť inštrukciou
rts.
Celý program
Súbor examples/m-asm.act:
;@modern
; ASM: assembler instructions by name inside an Action! program
BYTE counter
BYTE ARRAY page6(256)=$600
PROC Bump() ; add 1 to counter
ASM
inc counter
rts
ENDASM
PROC FillPage(BYTE value) ; fill the 256 bytes of page 6
ASM
lda value
ldx #0
loop sta $0600,x
inx
bne loop
rts
ENDASM
PROC Main()
counter=5
Bump()
Bump()
Print("counter: ")
PrintBE(counter)
FillPage(42)
Print("page6(0) and page6(255): ")
PrintB(page6(0))
Put(' )
PrintBE(page6(255))
RETURNaction26 m-asm.act --simcounter: 7
page6(0) and page6(255): 42 42Ako to funguje
Bumpje to isté ako v kapitole 25, ale namiesto[$EE $00 $06 $60]stojíinc counterarts. Adresu premennej dosadí prekladač.FillPagemá parameter. Ten je – ako každý parameter v Action! – obyčajná premenná na pevnom mieste, takže ho assembler prečíta menom:lda value.loopje návestie.bne loopskáče späť, kým register X po pripočítaní jednotky nie je nula – teda 256-krát.
Vyplnenie 256 bajtov takto trvá zlomok času oproti slučke FOR. Na takéto miesta assembler patrí: krátky kus, ktorý sa vykonáva veľmi často.
Časté chyby
| Čo sa stalo | Čo povie prekladač |
|---|---|
chýba ENDORG, alebo ORG v bloku ORG | error ACT233 |
ALIGN s číslom, ktoré nie je mocnina dvoch | error ACT233: ALIGN needs a power of two from 1 to $8000 |
blok ORG na adresách, ktoré používa prekladač ($80–$87, $A0–$AF, $C0–$C7) | warning ACT233 |
blok ORG prekrýva program alebo iný blok | error ACT225 |
neznáme meno v bloku ASM | error ACT008: undeclared name |
skok v ASM na miesto ďalej ako 127 bajtov | error ACT223 |
chýba rts na konci rutiny z assembleru | procesor pokračuje do ďalšej rutiny |
Vyskúšaj si
- Zmeň
ALIGN 256naALIGN 1024a pozri adresutable. - Napíš v assembleri
PROC ClearPage(), ktorá vynuluje šiestu stránku. - Prelož
m-asm.acts--listing m-asm.lsta nájdi v listingu svoj blok.
Zhrnutie
ORG adresa … ENDORGuloží deklarácie od danej adresy; voľná nultá stránka je$C8–$FF.ALIGN nposunie ďalšiu premennú na násobokn.ASM … ENDASMje assembler s menami inštrukcií a menami z programu.- Rutina, ktorej telo je blok
ASM, končí inštrukciourts. - Ktoré miesta v pamäti ešte ostali voľné, ukáže
--memory-map(kapitola 32); polia na adrese zORGsa v ňom počítajú ako obsadené.
Podrobnejšie: lekcie 2 až 5 a 13 v examples/modern/ (znaková sada, hráči a strely, vlastný zoznam displeja, dúha cez prerušenie).
Späť: 36. Rozšírenia pre dáta · Ďalej: 38. Skrytá pamäť