Efficient Bit Manipulation¶
Idea and Implementation: Enoch
Some Atmegas have a number of General Purpose IO Registers. They are not connected to any hardware but can be used with special instructions. They are executed in one CPU cycle and have the additional advantage to be interrupt safe.
This solution differs from the bitnames approach in that it does not operate on addresses but creates new commands that do so.
PORTA 0 port:hi! relay_on PORTA 0 port:lo! relay_off
A bitname solution would look like
PORTA 0 portpin: relay : relay_on relay high ; : relay_off relay low ;
The implementation of the first solution generates highly optimized machine code. The bitname solution is more generic but significantly slower and is not interrupt safe.
: port:hi ( portadr bitno -- ) \ SBI swap $20 - 3 lshift or $9A00 or code , end-code ; : port:lo ( portadr bitno -- ) \ CBI swap $20 - 3 lshift or $9800 or code , end-code ;
Additionally some range checks should be applied to make sure that the instruction does actually work as it should be
: _bitio dup $1F U> if &-9 throw then over $7 U> if &-9 throw then ; : port:hi ( portadr bitno -- ) \ SBI swap $20 - _bitio 3 lshift or $9A00 or code , end-code ; : port:lo ( portadr bitno -- ) \ CBI swap $20 - _bitio 3 lshift or $9800 or code , end-code ;