( tovis | 2020. 11. 08., v – 15:52 )

Í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?