This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

bits location and order, how?

hi,

in "standard" way it is possible to locate a variable next way:

; motors control register
MOTORS_CONTROL	DATA	0x20
; motor 1
CTRL1_UP	BIT	CONTROL_BITS.0
CTRL1_DOWN	BIT	CONTROL_BITS.1
CTRL1_LEFT	BIT	CONTROL_BITS.2
CTRL1_RIGHT	BIT	CONTROL_BITS.3
; motor 2
CTRL2_UP	BIT	CONTROL_BITS.4
CTRL2_DOWN	BIT	CONTROL_BITS.5
CTRL2_LEFT	BIT	CONTROL_BITS.6
CTRL2_RIGHT	BIT	CONTROL_BITS.7
Then it is possible to access such variable both:
- by bit-access, for example:
	SETB	CTRL1_UP	; motor 1 goes up
	SETB	CTRL2_LEFT	; motor 2 goes left
- by byte-access:
	ORL	MOTORS_CONTROL,#00010001b ; both motors go up
It works good but requires absolute locations defined.

What is the way to have the same possibilities but with relative segments?
If we do:
?BI?MOTORS_CTRL	SEGMENT	BIT
		RSEG	?BI?MOTORS_CTRL
CTRL1_UP:	DBIT	1
CTRL1_DOWN:	DBIT	1
; etc
...then it does not guaranty that the bits will be located inside the one and same byte and it does not define their order as well.

For C it is possible to play with BDATA type. In assembler, BDATA segment type is not used. Indeed, "standard" way works good but absolute locations there and there look ugly.
Any idea?

Thanks,
Oleg

Parents Reply Children
  • "Indeed I know how it may be done with C51, the question was about the same task be done in assembler."

    Get C51 to show you - use the SRC Directive!


    C51:

    bdata unsigned char fred;
    sbit                fred0 = fred^0;
    sbit                fred1 = fred^1;
    sbit                fred2 = fred^2;
    sbit                fred3 = fred^3;
    sbit                fred4 = fred^4;
    sbit                fred5 = fred^5;
    sbit                fred6 = fred^6;
    sbit                fred7 = fred^7;
    Resulting Assembler:
    ?BA?MAIN             SEGMENT DATA BITADDRESSABLE
    	RSEG  ?BA?MAIN
               fred:   DS   1
    fred0	EQU	(fred+0).0
    fred1	EQU	(fred+0).1
    fred2	EQU	(fred+0).2
    fred3	EQU	(fred+0).3
    fred4	EQU	(fred+0).4
    fred5	EQU	(fred+0).5
    fred6	EQU	(fred+0).6
    fred7	EQU	(fred+0).7
    Maybe you could do:
    ?BA?MAIN             SEGMENT DATA BITADDRESSABLE
    	RSEG  ?BA?MAIN
               fred:   DS   1
    fred0	BIT	fred.0
    etc

  • A.W. Neil,

    Yes, I have found this way some time ago myself, thanks!

    Regards,
    Oleg