Nie wiem jak jest w PASMO, ale w innych assemblerach wstawianie etykiet dla skoków do makra jest niemożliwe albo bardzo trudne.
W ASM51 jest możliwość wywołania makra z parametrem.
Wtedy robi się sztuczkę, gdzie jako jeden z parametrów wstawia się bieżący adres wywołania makra, a etykiety mają generowane nazwy na podstawie tego adresu.
Wtedy linker każdą etykietę widzi jako unikalną i nie ma problemów.
Wygląda to mniej więcej tak:
L_PS2_WAIT_FOR MACRO cIn,aErr,SFX ; helper for PS2_WAIT_FOR
ps2_wait_for_loop_&SFX:
acall ps2in ; call routine {ps2svc.sub}
jc ps2_wait_for_test_&SFX ; if data then check
jnb PS2Error,ps2_wait_for_loop_&SFX ; wait if not timeout
ps2_wait_for_err_&SFX:
ajmp aErr ; jump if fail
ps2_wait_for_test_&SFX:
cjne a,#cIn,ps2_wait_for_err_&SFX ; test received data
ENDM
;-------------------------------------------------------------------------------
PS2_WAIT_FOR MACRO cIn,aErr ; wait for specified PS/2 data
L_PS2_WAIT_FOR cIn,aErr,%$ ; auxiliary submacro
ENDM
a po zlinkowaniu:
=1 723 +1 PS2_WAIT_FOR 0FAh,mi_err ; in FA - mouse aknowledge
=1 724 +2 L_PS2_WAIT_FOR 0FAh,mi_err,%$ ; auxiliary submacro
0196 =1 725 +2 ps2_wait_for_loop_406:
0196 118F =1 726 +2 acall ps2in ; call routine {ps2svc.sub}
0198 4005 =1 727 +2 jc ps2_wait_for_test_406 ; if data then check
019A 3072F9 =1 728 +2 jnb PS2Error,ps2_wait_for_loop_406 ; wait if not timeout
019D =1 729 +2 ps2_wait_for_err_406:
019D 8182 =1 730 +2 ajmp mi_err ; jump if fail
019F =1 731 +2 ps2_wait_for_test_406:
019F B4FAFB =1 732 +2 cjne a,#0FAh,ps2_wait_for_err_406 ; test received data