Кстати, еще один маленький пример, который показывает, что в некоторых случаях можно в программах обходится вообще без регистров. Только не говорите, что это нечестно потому что в AVR этого нет. Именно тем и хороши STM8, что в них есть то, чего нет в AVR. Иначе зачем их вообще использовать. Имена переменных в памяти были выбраны для сходства с AVR. В комментариях в скобках указаны циклы выполнения инструкций. Размер подпрограммы можно определить из листинга.
47 switch .bss
48
49 0000 00 R16: ds 1 ; Data register
50 0001 00 R17: ds 1 ; Counter
51
52 0000500b PINC: equ PC_IDR ; Input port
53 00028058 DAT: equ PINC:0 ; Data bit
54 00028059 _CLK: equ PINC:1 ; Clock bit
55
56 switch .text
57
58 0024 ReadPort:
59 0024 35080001 mov R17, #8 ; Set bit counter (1)
60 0028 7201500b00 1$: btjf DAT, 2$ ; Read bit into R16 (2/3)
61 002d 72590000 2$: rlc R16 ; (1)
62 0031 7212500b bset _CLK ; Clock pulse (1)
63 0035 7213500b bres _CLK ; (1)
64 0039 725a0001 dec R17 ; Bump counter (1)
65 003d 26e9 jrne 1$ ; Loop if not done yet (2)
66
67 003f 81 ret ; Total cycles (9/10)