| 
 Using saddr area (__saddr) 
 | 
When declared with __saddr, external variables and static variables in a function are allocated to the saddr area.
[Function]
-  | Initialized variables are allocated to the .sdata section.  | 
 
-  | Uninitialized variables are allocated to the .sbss section.  | 
 
-  | Address reference always returns a near pointer.  | 
 
-  | External variables and static variables in a function are allocated to the saddr area when they are declared with __saddr.  | 
 
-  | These variables are handled in the same way as other variables in a C source file.  | 
 
[Effect]
-  | Instructions that access the saddr area are shorter than those accessing the normal memory area and their object code also becomes smaller, leading to improved execution speed.  | 
 
[Usage]
-  | Declare __saddr in the module or function that defines variables. 
In a function, only variables with the extern or static storage class specifier can be declared with __saddr.  | 
 
__saddr variable-declaration; 
extern __saddr  variable-declaration; 
static __saddr  variable-declaration; 
__saddr extern  variable-declaration; 
__saddr static  variable-declaration; 
 | 
 
[Restrictions]
-  | If __saddr is specified for a const type variable, a compilation error will occur.  | 
 
-  | If __saddr is specified for a function, a compilation error will occur.  | 
 
-  | If __saddr is used for a purpose other than variable with static storage duration, a compilation error will occur.  | 
 
-  | If __saddr and __near or __far are specified together, a compilation error will occur.  | 
 
__saddr __near int      ni;     //Error 
__saddr __far int       fi;     //Error 
 | 
 
-  | If __saddr is used in a typedef declaration, a compilation error will occur.  | 
 
typedef __saddr int     SI;     //Error 
 | 
 
[Example]
The following shows a sample C source code.
__saddr int     hsmm0;          //.sbss 
__saddr int     hsmm1=1;        //.sdata 
__saddr int     *hsptr;         //hsptr is allocated to. sbss 
                                //The pointed location is in a normal area. 
void main(){
        hsmm0 -= hsmm1; 
        hsptr = 0; 
} 
 | 
 
 
The following shows the declarations and section allocation in the assembly source code.
        .PUBLIC _hsmm0                  ;Declaration 
        .PUBLIC _hsmm1                  ;Declaration 
        .PUBLIC _hsptr                  ;Declaration 
  
        .SECTION        .sbss,SBSS      ;Allocated to the .sbss section 
        .ALIGN  2 
_hsmm0: 
        .DS     2 
        .ALIGN  2 
_hsptr: 
        .DS     2 
  
        .SECTION        .sdata,SDATA    ;Allocated to the .sdata section 
        .ALIGN  2 
_hsmm1: 
        .DB2    0x0001 
 | 
 
 
The following shows the code in the function.
        movw    ax, _hsmm0 
        subw    ax, _hsmm1 
        movw    _hsmm0, ax 
        movw    _hsptr, #0x0000 
 | 
 
[Remark]
-  | Difference between the __saddr keyword and #pragma saddr  | 
 
-  | The __saddr keyword cannot be used together with the __near or __far keyword, and a compilation error will occur if used so.  | 
 
-  | #pragma saddr handles even a variable to which the __near or __far keyword is added as if __saddr was specified without a warning being output.  |