Obszar lokalny

Głównym zadaniem obszaru lokalnego w MADS jest stworzenie nowej przestrzeni nazw dla etykiet.

Wszelkie etykiety zdefiniowane w obszarze lokalnym .LOCAL są zasięgu lokalnego, można je też określić jako etykiety globalne zdefiniowane lokalnie o dostępie swobodnym, ponieważ można się do nich odwoływać co nie jest normalne w innych językach programowania.

Obszary lokalne są addytywne tzn. że może być wiele bloków .LOCAL o tej samej nazwie, nie zostanie wygenerowany komunikat błędu Label ... declared twice.

Addytywność obszarów lokalnych odbywa się na aktualnym poziomie przestrzeni nazw, jeśli chcemy połączyć się z wybranym obszarem lokalnym w innej przestrzeni nazw, poprzedzamy pełną nazwę prowadzącą do takiego obszaru znakiem +, np.:

  .local lvl

tmp = 3

  .endl



  .local temp

tmp = 7


    .local +lvl

      .print tmp

    .endl


  .endl

Dla w/w przykładu zostanie wyświetlona wartość etykiety TMP z obszaru lokalnego LVL o wartości 3. Gdyby zabrakło znaku + w .LOCAL +LVL wówczas wartość TMP jaka zostanie wyświetlona to 7.

W obszarze lokalnym .LOCAL istnieje możliwość zdefiniowania etykiet o zasięgu globalnym (patrz rozdział Etykiety globalne).

Jeśli poszukiwana przez assembler etykieta nie wystąpiła w obszarze lokalnym .LOCAL, wówczas MADS będzie poszukiwał ją w obszarze niższym aż dojdzie do obszaru globalnego. Aby odczytać natychmiastowo wartość etykiety globalnej z poziomu obszaru lokalnego .LOCAL (czy też innego obszaru lokalnego) poprzedzamy nazwę etykiety znakiem dwukropka :.

Obszarów lokalnych dotyczą n/w dyrektywy:

 [name] .LOCAL [,address]
 .LOCAL [name] [,address]
 .ENDL [.LEND] [.END]

[name] .LOCAL [,address]

Deklaracja obszaru lokalnego o nazwie name za pomocą dyrektywy .LOCAL. Nazwa obszaru nie jest wymagana i nie jest konieczna. Do nazw obszarów lokalnych nie można używać nazw mnemoników i pseudo rozkazów. Jeśli nazwa jest zarezerwowana wystąpi błąd z komunikatem Reserved word.

Po nazwie obszaru lokalnego (lub po dyrektywie .LOCAL) możemy podać nowy adres asemblacji bloku lokalnego. Po zakończeniu takiego bloku (.ENDL) przywracany jest poprzedni adres asemblacji zwiększony o długość bloku lokalnego.

label .local,$4000
.endl

.local label2,$8000
.endl

.local
.endl

.local label3
.endl

Wszelkie definicje etykiet w obszarze .LOCAL są typu lokalnego. Aby odwołać się do etykiety globalnej o tej samej nazwie co etykieta lokalna należy poprzedzić ją znakiem dwukropka :, np.:

lab equ 1

.local

lab equ 2

 lda #lab
 ldx #:lab

.endl

W w/w przykładzie do rejestru A zostanie załadowana wartość 2, natomiast do rejestru X wartość 1.

Jeśli poszukiwana przez assembler etykieta nie wystąpiła w obszarze .LOCAL, wówczas nastąpi jej szukanie w obszarze makra (jeśli jest aktualnie przetwarzane), potem w procedurze (jeśli procedura jest aktualnie przetwarzana), na końcu w głównym programie.

W zadeklarowanym obszarze lokalnym wszystkie definicje etykiet rozróżniane są na podstawie nazwy obszaru lokalnego. Aby dotrzeć do zdefiniowanej etykiety w obszarze lokalnym spoza obszaru lokalnego musimy znać nazwę obszaru i etykiety w nim występującej, np.:

 lda #name.lab1
 ldx #name.lab2

.local name

lab1 = 1
lab2 = 2

.endl

W adresowaniu takiej struktury .LOCAL używamy znaku kropki ..

Obszary lokalne możemy zagnieżdżać, możemy je umieszczać w ciele procedur zadeklarowanych przez dyrektywę .PROC. Obszary lokalne są addytywne, tzn. może istnieć wiele obszarów lokalnych o tej samej nazwie, wszystkie symbole występujące w tych obszarach należeć będą do wspólnej przestrzeni nazw.

Długość wygenerowanego kodu w bloku .LOCAL można sprawdzić przy pomocy dyrektywy .LEN (.SIZEOF).

.ENDL

Dyrektywa .ENDL kończy deklarację obszaru lokalnego.

Przykład deklaracji obszaru lokalnego:

 org $2000

tmp ldx #0   <-------------   etykieta w obszarze globalnym
                          |
 lda obszar.pole  <---    |   odwolanie do obszaru lokalnego
                     |    |
.local obszar        |    |   deklaracja obszaru lokalnego
                     |    |
 lda tmp   <---      |    |
              |      |    |
 lda :tmp     |      | <---   odwolanie do obszaru globalnego
              |      |
tmp nop    <---      |        definicja w obszarze lokalnym
                     |
pole lda #0       <---   <--- definicja w obszarze lokalnym
                            |
 lda pole  <----------------- odwolanie w obszarze lokalnym

.endl                        koniec deklaracji obszaru lokalnego