Így néz ki a kicsit javított bit bang, az isr routinba ágyazva - 1ms nyomja ki a 16 bitet a 2db 74HC164 shift regiszterbe.
volatile uint16_t tick_word;
volatile uint8_t shft_idx;
volatile uint8_t shft_dig;
volatile uint8_t shft_seg[8];
const uint8_t *ptr_seg = shft_seg;
//-----------------------------------------------------------------------------
inline void shift_16(void);
void hc164_setup(void);
//-----------------------------------------------------------------------------
inline void shift_16(void)
{
__asm
clrw x
ld a, _shft_idx
ld xl, a
ld a, ([_ptr_seg],x)
ld xh, a
ld a, _shft_dig
ld xl, a
;--- ldw x, (3,sp)
ld a, #16
00001$:
rlcw x
bccm _PD_ODR, #PIN_DIN
bset _PD_ODR, #PIN_CLK
bres _PD_ODR, #PIN_CLK
dec a
jrne 00001$
bres _PD_ODR, #PIN_DIN
sll _shft_dig
jrnc 00002$
bset _shft_dig, #0
00002$:
ld a, _shft_idx
inc a
and a, #0x07
ld _shft_idx, a
__endasm;
} //end shift_16(void)
//-----------------------------------------------------------------------------
void tim4_tick_isr(void) __interrupt(TIM4_ISR)
{
// sdcc generate "clr a, div x,a" as a workaround !?
tick_word++;
TIM4_SR &= 0b11111110; // UIF bit
shift_16();
// sdcc generate iret
}
A lista szerint működik az inline.
Viszont a segéd "ptr_seg" segéd pointeremet valami INITIALIZED területre teszi. Vajon ez a RAM vagy a ROM (program memória?