Pelo que entendi, olhando rapidamente o manual da Zilog, a instrução SWAP usa o endereçamento de 4 bits. Então, o caso do teu código, a variável static não é especificada como near, ou seja, está fora do alcance de endereçamento da instrução SWAP. Então, é usado o "asm("ldx R0,_0temp_value")" para "trazer" a variável para um endereço ao alcance da instrução SWAP (no caso o registrador R0) e por fim, após a execução do SWAP, o valor é "devolvido" com "asm("ldx _0temp_value, R0");".
Ainda, mexendo no "RP[7:4]" ou usando o endereçamento indireto (swap @Rx) pode-se acessar até 255 endereços.
Falando sério, asm pra Z8Encore é coisa pra doido. Mas é bom pegar umas mãnhas do dito cujo pra fazer aquilo que os compiladores não sabem fazer direito
