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:

Ako sa to píše

Action!
ORG adresa
  deklarácie
ENDORG

Vš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

Action!
ALIGN n

n je mocnina dvoch: 2, 4, 8 … 256, 1024, 2048 …

Celý program

Súbor examples/m-org.act:

Action!
;@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)
RETURN
action26 m-org.act --sim
fast is at $00CB
address is at $00CC
normal is at $2000
table is at $2100

Ako to funguje

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

Action!
ASM
        inštrukcie
ENDASM

Celý program

Súbor examples/m-asm.act:

Action!
;@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))
RETURN
action26 m-asm.act --sim
counter: 7
page6(0) and page6(255): 42 42

Ako to funguje

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 ORGerror ACT233
ALIGN s číslom, ktoré nie je mocnina dvocherror 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ý blokerror ACT225
neznáme meno v bloku ASMerror ACT008: undeclared name
skok v ASM na miesto ďalej ako 127 bajtoverror ACT223
chýba rts na konci rutiny z assembleruprocesor pokračuje do ďalšej rutiny

Vyskúšaj si

  1. Zmeň ALIGN 256 na ALIGN 1024 a pozri adresu table.
  2. Napíš v assembleri PROC ClearPage(), ktorá vynuluje šiestu stránku.
  3. Prelož m-asm.act s --listing m-asm.lst a nájdi v listingu svoj blok.

Zhrnutie

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äť