( tovis | 2020. 11. 08., v – 12:59 )

16 bit ki shiftelésére ezt a kódot írtam:

volatile uint8_t    shft_idx;
volatile uint8_t    shft_dig;
volatile uint8_t    shft_seg[8];


void            shift_16(uint16_t w)
{
  w;
__asm
  ldw     x, (3,sp)
  push    #16
00001$:
  rlcw    x
  bccm    _PD_ODR, #PIN_DIN
  bset    _PD_ODR, #PIN_CLK
  bres    _PD_ODR, #PIN_CLK
  dec     (1, sp)
  jrne    00001$
  pop     a
  bres    _PD_ODR, #PIN_DIN
  ld      a, _shft_dig
  sll     a
  jrnc    00002$
  ld      a, 1
00002$:
  ld      _shft_dig, a

__endasm;
} //end shift_16(uint16_t w)

Még küzdök vele, de tulajdonképp működik. Nem vagyok vele elégedett. A fő probléma (nevetséges módon) a 16 bit shiftelendő összerakása, azt c -ben írtam és szörnyű. Anno mikor az UART kezeléshez írtam routinokat (cirkuláris buffer) a buffer pointereket egy a program memória szegmensben elhelyezett pointerekkel oldottam meg úgy, hogy kitudtam használni az stm8 elvetemült címzési módját - amolyan indirect indexelt címzés ld ([rx_ptr],X),A ahol az rx_ptr mutat a rx buffer elejére és az X tartalmazza az aktuálisan üres helyet. Viszont ez külön assembly fájlban volt, saját equate -kel. (Azért előnye is van, pl. nem nyomja bele a zavarba ejtő clr a, div x,a utasításokat)