Any assembly label is considered a name of a function. If an assembly function is not prototyped, it is assumed to follow the prototype void func(void). If the assembly function requires parameters or returns a value, then it must be prototyped.
Figure 6-3. An assembly function asm2.c
#asm clear_bank2_ram LD S,#2 ;select RAM bank 2 LD B,#RAM_BANK2_SIZE-1 ;set B to RAM bank size clear_next LD A,B IFEQ A,#0 ;test B for zero RET CLR A X A,[B-] ;clear [B] JP clear_next #endasm void main(void) { long l; clear_bank2_ram(); init_long_global(0x1234); l=read_long_global(); while(1); }
If you pass one byte to a function, it is placed in A register before the CALL. If you pass two 8-bit values to a function, the first byte is placed in A and the second is placed in X. If you pass one 16-bit value to a function, the least significant byte is places in A and the most significant byte is placed in X.
Figure 6-4. An assembly function that requires a parameter asm2.c
void init_long_global(long); #asm init_long_global LD S,#long_global>>8 ;select long_global RAM bank LD B,#long_global ;load B with long_global address X A,[B+] ;store A to long_global low X A,X ;load X into A X A,[B] ;store X to long_global high RET ;return #endasm
If your assembly language function needs to return an 8-bit value, the compiler expects it in the A register. If you need to return two bytes, they are expected in A:X. The most significant byte must be placed in X and the least significant byte must be placed in A.
Figure 6-5. An assembly function that returns a value asm2.c
long read_long_global(void); #asm read_long_global LD S,#long_global>>8 ;select long_global RAM bank LD B,#long_global+1 ;load B with long_global address LD A,[B-] ;load long_global high X A,X ;store long_global high into X LD A,[B] ;load long_global low to A RET #endasm