Sayman wrote:думаю лучше сохранять стилистику Orgasm`а и делать локальные метки через точку.
а какие-то другие ассемблеры это поддерживают?
P.S. сейчас локальные метки в OrgAsm используются так:
Code: Select all
Работа с локальными метками. Имена локальных меток
должны начинаться с точки ".". Область "видимости" локальных меток распрост-
раняется до следующей обычной (не локальной) метки.
Пример 1:
~~~~~~~~~
ld hl,Mess1.Text
ld c,5Ch
rst 10h
;
ld hl,Mess2.Text
ld c,5Ch
rst 10h
;
ld bc,0041h
rst 10h
ret
Mess1: db "Text 1 ..."
.Text: db "Hello world !",0Dh,0Ah,0
Mess2: db "Text 2 ..."
.Text: db "Hello world ! ;)",0Dh,0Ah,0
В данном примере показан доступ к локальным меткам по их полным именам.
Пример 2:
~~~~~~~~~
Test1: ld b,16
.loc1: ld a,(hl)
or a
ret z
inc hl
djnz .loc1
ret
Test2: ld b,32
.loc1: ld a,(hl)
or a
ret z
inc hl
djnz .loc1
ret
Локальные метки .loc1 подпрограмм Test1 и Test2 не будут конфликтовать
между собой, поскольку их разделяет обычная (не локальная) метка Test2.
видимо внутри к имени локальной метки добавляется имя предыдущей обычной метки - при подстановке макросов такой предыдущей метки может не оказаться - придётся генерировать фейковые метки для каждого инстанса макроса, но наверное таки да - ты прав, такая реализация была бы логичнее и проще
P.P.S. Выглядеть это будет примерно так:
Code: Select all
m macro a1, a2, a3
something a1
.l1:
something a2
.l2:
something a3
endm
m 1,2,3
m 4,5,6
m 7,8,9
превратится в:
Code: Select all
m001 ; generated label for 1st instance of macro m
something 1
.l1
something 2
.l2
something 3
m002 ; generated label for 2nd instance of macro m
something 4
.l1
something 5
.l2
something 6
m003 ; generated label for 3rd instance of macro m
something 7
.l1
something 8
.l2
something 9
P.P.P.S. В zmac локальные метки в макросах должны начинаться с ? и должны быть перечислены после аргументов в объявлении макроса - вот код, который только что попробовал:
Code: Select all
18: test macro a1, a2, ?l1
19: ld hl,a1
20: ?l1 ld c,a2
21: rst 10h
22: jr c,?l1
23: endm
24:
25: ;code of program
26:
27: 8100 START:
28:
29: 8100 test msg,5ch
29: 8100 211D81 ld hl,msg
29: 8103 0E5C ?c0000 ld c,5ch
29: 8105 D7 rst 10h
29: 8106 38FB jr c,?c0000
29: 8108 endm
29:
30: 8108 test msg+10,5ch
30: 8108 212781 ld hl,msg+10
30: 810B 0E5C ?c0001 ld c,5ch
30: 810D D7 rst 10h
30: 810E 38FB jr c,?c0001
30: 8110 endm
надо будет отменить обязательное указание локальных меток в строке с аргументами и поддержать локальные метки начинающиеся с точки (в данный момент zmac разрешает метки начинающиеся с точки, но они считаются обычными)