At 03:59 PM 03/11/1997 -0800, you wrote: >Now I'm really puzzled; you say that you want the registers to be >completely local to the macro, yet you want a new pair of registers >reserved on every invocation. It doesn't sound as though you're >using these macros recursively, so why is this necessary? What you propose will generally work, but it creates global names, which I don't like: it makes code fragments which should be independent depend on each other (or it forces me to use akwardly long names). The only mechanism in MPASM to control scoping (and unfortunately only within macro's) is LOCAL, so I'd like to use what little is provided. As for a macro which is not recursive yet might not always be able to share it's locals with itself consider this 'inline' macro which, when entered once with a value in w, is left twice with in w the two nibbles which were originally in w. ; convert w to two hex values in w, high nibble first convert_w_to_hl_hex macro cblock _file_1#v($) endc local temp = _file_1#v($) local do_it movwf temp call do_it swapf temp, f do_it swapf temp, w andlw H'0F' endm This macro can be used like send_ab movlw H'AB' convert_w_to_hl_hex call send return But there is no technical objection to send_0b0b movlw H'BB' convert_w_to_hl_hex convert_w_to_hl_hex call send return NB Of course "call send; return" can be optimised to "goto send".