Az igazán durva az7 volt, mikor C -ből raktam össze mit is kell ki shiftelni
uint16_t w;
w = shft_dig;
w |= (shft_seg[shft_idx] << 8);
Ebből lett
ld a, _shft_dig+0
ldw x, #_shft_seg+0
ld a, xl
add a, _shft_idx+0
rlwa x
adc a, #0x00
ld xh, a
ld a, (x)
call
Ezt mind öszesen 1 utasítással tudtam lejjebb tenni (lásd feljebb) amihez kellet egy két bájt hely a CODE területen.
Nem biztos hogy megérte.
Az általad javasolt makrókhoz hasonlókat is használok (másutt)
#define BCPL_PA_ODR_BIT1() __asm__("BCPL 0x5000,#1")
#define BRES_PA_ODR_BIT1() __asm__("BRES 0x5000,#1")
#define BSET_PA_ODR_BIT1() __asm__("BSET 0x5000,#1")
#define BCPL_PA_ODR_BIT2() __asm__("BCPL 0x5000,#2")
#define BSET_PA_ODR_BIT2() __asm__("BSET 0x5000,#2")
#define BRES_PA_ODR_BIT2() __asm__("BRES 0x5000,#2")
Abban biztos vagyok, hogy ennél gyorsabbat nehéz lenne írni. Viszont nem hordozható, szerintem még a családon belül sem feltétlenül.