Tablice
Deklaracja tablicy
Tablic dotyczą n/w dyrektywy:
label .ARRAY [elements0][elements1][...] [.type] [= init_value]
.ARRAY label [elements0][elements1][...] [.type] [= init_value]
.ENDA [.AEND] [.END]
Dostępne typy danych to .BYTE
, .WORD
, .LONG
, .DWORD
. W przypadku braku podania typu domyślnie przyjmowany jest typ .BYTE
. Definicja tablicy lokalizuje ją in-place (w miejscu definicji).
ELEMENTS
określa liczbę elementów tablicy, które będą indeksowane od <0..ELEMENTS-1>
. Wartość ELEMENTS
może być stałą lub wyrażeniem, powinna być z przedziału <0..65535>
. W przypadku braku podania liczby elementów zostanie ona ustalona na podstawie liczby wprowadzonych danych.
W obszarze ograniczonym dyrektywami .ARRAY
i .ENDA
nie ma możliwości używania mnemoników CPU, jeśli je użyjemy lub użyjemy innych niedozwolonych znaków wówczas wystąpi błąd z komunikatem Improper syntax.
Dopuszczalne jest określenie indeksu od jakiego będziemy wpisywali wartości dla kolejnych pól tablicy. Nową wartość takiego indeksu określamy umieszczając na początku nowego wiersza w nawiasach kwadratowych wyrażenie [expression]
. Możliwe jest określenie większej ilości indeksów, w tym celu rozdzielamy kolejne indeksy znakiem dwukropka :
. Następnie wprowadzamy wartości dla pól tablicy po znaku równości =
, np.:
.array tab .word ; tablica TAB o nieokreślonej z góry liczbie pól typu .WORD
1,3 ; [0]=1, [1]=3
5 ; [2]=5
[12] = 1 ; [12]=1
[3]:[7]:[11] = 9,11 ; [3]=9, [4]=11, [7]=9, [8]=11, [11]=9, [12]=11
.enda
.array scr [24][40] ; tablica dwuwymiarowa SCR typu .BYTE
[11][15] = "ATARI"
.enda
Przykład tablicy tłumaczącej kod naciśniętego klawisza na kod INTERNAL.
.array TAB [255] .byte = $ff ; alokowanie 256 bajtów [0..255] o wartości początkowej $FF
[63]:[127] = "A" ; przypisanie nowej wartości TAB[63]="A", TAB[127]="A"
[21]:[85] = "B"
[18]:[82] = "C"
[58]:[122] = "D"
[42]:[106] = "E"
[56]:[120] = "F"
[61]:[125] = "G"
[57]:[121] = "H"
[13]:[77] = "I"
[1] :[65] = "J"
[5] :[69] = "K"
[0] :[64] = "L"
[37]:[101] = "M"
[35]:[99] = "N"
[8] :[72] = "O"
[10]:[74] = "P"
[47]:[111] = "Q"
[40]:[104] = "R"
[62]:[126] = "S"
[45]:[109] = "T"
[11]:[75] = "U"
[16]:[80] = "V"
[46]:[110] = "W"
[22]:[86] = "X"
[43]:[107] = "Y"
[23]:[87] = "Z"
[33]:[97] = " "
[52]:[180] = $7e
[12]:[76] = $9b
.enda
W w/w przykładzie stworzyliśmy tablicę TAB
o rozmiarze 256 bajtów [0..255]
, typie danych .BYTE
i wypełniliśmy pola wartością = $FF
, dodatkowo zapisaliśmy wartości kodów literowych INTERNAL
na pozycjach (indeksach tablicy) równych kodowi naciśnięcia klawisza (bez SHIFT-a i z SHIFT-em, czyli duże i małe litery).
Znak dwukropka :
rozdziela poszczególne indeksy tablicy.
Przykład procedury detekcji ruchu joysticka, np.:
.local HERO
.pages
lda $d300
and #$0f
tay
lda joy,y
sta _jmp
jmp null
_jmp equ *-2
left
right
up
down
null
rts
.endpg
_none = 15
_up = 14
_down = 13
_left = 11
_left_up = 10
_left_dw = 9
_right = 7
_right_up = 6
_right_dw = 5
.array joy [16] .byte = .lo(null)
[_left] = .lo(left)
[_left_up] = .lo(left)
[_left_dw] = .lo(left)
[_right = .lo(right)
[_right_up] = .lo(right)
[_right_dw] = .lo(right)
[_up] = .lo(up)
[_dw] = .lo(down)
.enda
.endl
Innym przykładem może być umieszczenie wycentrowanego napisu, np.:
org $bc40
.array txt 39 .byte
[17] = "ATARI"
.enda
Do tak stworzonej tablicy odwołujemy się następująco:
lda tab,y
lda tab[23],x
ldx tab[200]
Jeśli w nawiasie kwadratowym podamy wartość indeksu przekraczającą zadeklarowaną dla danej tablicy, zostanie wygenerowany komunikat błędu _Constant expression violates subrange bounds+.