Keil™, An ARM® Company

C166 User's Guide

COMPACT Model

LOC  OBJ       LINE     SOURCE
                  1     ; A166 must be CASE sensitive for interfacing with C166.
                  2     $CASE
                  3     ; COMPACT model works in SEGMENTED mode of the 80C166.
                  4     $SEGMENTED
                  5
                  6                     NAME    A166_modul
                  7     ;  /***********************************/
                  8     ;  /* Sample Assembler to C Interface */
                  9     ;  /***********************************/
                 10     ;
                 11     ;  extern int func1 (int a1, int a2, bit b);
                 12     ;
                 13     ;  extern bit flag;
                 14     ;  extern int near val;
                 15     ;
                 16     ;  int func2 (int *x1, int *x2)  {
                 17     ;    int y;
                 18     ;
                 19     ;    y = func1 (*x1, *x2, flag);
                 20     ;    val += y;
                 21     ;    return (y);
                 22     ;  }
                 23
                 24     EXTRN   func1 : NEAR
                 25     EXTRN   val   : WORD        ; near value based DPP2
                 26     EXTRN   flag  : BIT
                 27
                 28     ?PR?A166_modul  SECTION CODE 'NCODE'
                 29     NCODE           CGROUP  ?PR?A166_modul
                 30
                 31     PUBLIC          func2           ; entry point for func2
                 32
                 33     ASSUME  DPP3:SYSTEM             ; required for SFR accesses
                 34
                 35     func2           PROC    NEAR
                 36     ;---- Variable 'x2' is a far * and passed in Register 'R10, R11'.
                 37     ;---- Variable 'x1' is a far * and passed in Register 'R8, R9'.
0000 ECFF        38                     PUSH    R15     ; Save R15 because of Bit Parameter
0002 F6F900FE    39                     MOV     DPP0,R9
0006 CC00        40                     NOP
0008 A888        41                     MOV     R8,[R8]
000A F6FB00FE    42                     MOV     DPP0,R11
000E CC00        43                     NOP
0010 A89A        44                     MOV     R9,[R10]
0012 4A??FF?0 E  45                     BMOV    R15.0,flag
0016 CA00???? E  46                     CALLA   cc_UC,func1
                 47     ;---- The function value of 'func1' is returned in Register 'R4'
                 48     ;---- temporary Variable 'y' is saved in Register 'R5'.
001A 04F4???? E  49                     ADD     DPP2:val,R4   ; NEAR variable requires DPP2
                 50
001E FCFF        51                     POP     R15     ; restore R15
                 52     ;---- The function value 'y' is placed in 'R4'
0020 CB00        53                     RET
                 54     func2           ENDP
                 55
                 56     ?PR?A166_modul  ENDS
                 57
                 58                     END