cancel
Showing results for 
Search instead for 
Did you mean: 

BSET BRES with dynamic position

whitehorsesoft
Associate II

Hello, I'm successfully using BSET and BRES assembler instructions where the position is constant. However, I'm having trouble getting it to work where the position is determined at runtime.

For example:

 

bset 0x500f, 2 ; works
ldw x, (0x03, sp)
bset 0x500f, x ; doesn't work

 

I've looked at several sites, but all seem to have constant positions.

One workaround would be to have a full list of BSET instructions, one for each position, and jump to the appropriate instruction based on a decision. This wouldn't be bad necessarily, but hoping for a better way.

 

References:

assembler instructions datasheet in PM0044, section 7 (specifically 7.4): https://www.st.com/content/ccc/resource/technical/document/programming_manual/43/24/13/9a/89/df/45/ed/CD00161709.pdf/files/CD00161709.pdf/jcr:content/translations/en.CD00161709.pdf

lujji's very helpful blog post: https://lujji.github.io/blog/mixing-c-and-assembly-on-stm8/

eforth: https://github.com/TG9541/stm8ef/wiki/STM8-eForth-Compiler-and-Assembly

a nice GitHub repo: https://github.com/search?q=repo%3Aaaw20904%2FSTM8_library%20bset&type=code

1 ACCEPTED SOLUTION

Accepted Solutions
Peter BENSCH
ST Employee

In fact, BSET, like all other bit operation instructions, can only be called with constants. There are two reasons for this: firstly, the instruction is executed in one cycle, which does not allow a variable to be fetched, and secondly, it only consists of 4 bytes, so there is no room for pointers.

Alternatively, you can also set bits in variables via the OR statement, but this increases the effort considerably because the variable must first be buffered in the accumulator and then moved back.

Regards
/Peter

In order to give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.

View solution in original post

2 REPLIES 2
Peter BENSCH
ST Employee

In fact, BSET, like all other bit operation instructions, can only be called with constants. There are two reasons for this: firstly, the instruction is executed in one cycle, which does not allow a variable to be fetched, and secondly, it only consists of 4 bytes, so there is no room for pointers.

Alternatively, you can also set bits in variables via the OR statement, but this increases the effort considerably because the variable must first be buffered in the accumulator and then moved back.

Regards
/Peter

In order to give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
whitehorsesoft
Associate II

Thank you for the clarification. As a side note, since writing the question I've become more familiar with the PM0044 doc, where the details make it more clear that only constants are available.