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)