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

Incorrect stack calculation (using R0)

Hello,
I have a project (C166 V5.05/XHUGE memory model), where a local variables is incorrect (Verified with a hardware debugger).
The problem seems to be related to the use of the user stack when using multiple local variables and using a function that receives 3 longs and returns a long.
One of the parameters passed is read from the stack with the wrong stack pointer (see generated code).
Rewriting the code (don't pass function results directly) where xtestdiv is used, solves the problem but still this should not happen.

Switching to a newer version of C166 (e.g. V7) is not an option because of the size of the project. Don't even know if it would fix this issue (found nothing in changelist).

Any help/advise would be appreciated.

long xtestdiv(long lX,long lY, long lZ )
{
 return lX;
}

void StuurPomp(byte bProcesIndex, int VentielNummer, byte bHoogToeren, byte bCircuitNummer)
{
    word  wWeger1Index   = bDD_RdDDXaB(bPRSOURCEWEGER, bProcesIndex)-1;
    word  wPomp1Nummer   = bDD_RdDDX2B(sWE.bPompGroep, wWeger1Index);
    word  wPomp1Index    = wPomp1Nummer-1;
    byte  bMengselNummer = bDD_RdDDX2B(sCI.bTeDoserenMengsel, bCircuitNummer-1);
    word  wMengPerc1     = 0;
    long  lEerderUit     = 0L ;
    word  wMagHoogToeren = FALSE;

    lEerderUit = ((lDD_RdDDXaL(lSETPOINTWEGER, bProcesIndex) - (long)wDD_RdDDXaW(sPO.wPompHoogNaarLaag, 0, (wPomp1Index)))
                     + (xtestdiv( (long)wDD_RdDDXaW(sPO.wPompHoogNaarLaag,0, (wPomp1Index)), (long)wMengPerc1, 100L)));

    wMagHoogToeren = ((bMagPompHoogToeren((byte)wWeger1Index, lEerderUit)||bHoogToeren) && bDD_RdDDXaB(sME.bUitdoseerToeren, 0, (bMengselNummer-1)));
}

Assembly-code:
             ; FUNCTION StuurPomp (BEGIN  RMASK = @0x7FFF)
                                           ; SOURCE LINE # 1431
2276 ECFD          PUSH      R13
2278 ECFE          PUSH      R14
227A ECFF          PUSH      R15
227C F0EB          MOV       R14,R11
;---- Variable 'bCircuitNummer' assigned to Register 'R14' ----
227E 88A0          MOV       [-R0],R10
;---- Variable 'VentielNummer' assigned to Register 'R9' ----
2280 F0D8          MOV       R13,R8
;---- Variable 'bProcesIndex' assigned to Register 'R13' ----
2282 2806          SUB       R0,#06H
                                           ; SOURCE LINE # 1432
                                           ; SOURCE LINE # 1433
2284 F048          MOV       R4,R8
2286 C08A          MOVBZ     R10,RL4
2288 E059          MOV       R9,#05H
228A D7000000 E    EXTS      #SEG (sPA+028H),#01H
228E F2F82800 E    MOV       R8,SOF (sPA+028H)
2292 DA000000 E    CALLS     SEG (bDD_RdDDXaB),bDD_RdDDXaB
2296 C084          MOVBZ     R4,RL4
2298 F0A4          MOV       R10,R4
229A 28A1          SUB       R10,#01H
229C B8A0          MOV       [R0],R10      ; wWeger1Index
                                           ; SOURCE LINE # 1434
229E E009          MOV       R9,#00H
22A0 D7000000 E    EXTS      #SEG (sWE+0CH),#01H
22A4 F2F80C00 E    MOV       R8,SOF (sWE+0CH)
22A8 DA000000 E    CALLS     SEG (bDD_RdDDXaB),bDD_RdDDXaB
22AC C085          MOVBZ     R5,RL4
;---- Variable 'wPomp1Nummer' assigned to Register 'R5' ----
                                           ; SOURCE LINE # 1435
22AE F045          MOV       R4,R5
22B0 2841          SUB       R4,#01H
22B2 C4400200      MOV       [R0+#02H],R4  ; wPomp1Index     ==>OFFSET = 2
                                           ; SOURCE LINE # 1436
22B6 F04E          MOV       R4,R14
22B8 C08A          MOVBZ     R10,RL4
22BA 28A1          SUB       R10,#01H
22BC E009          MOV       R9,#00H
22BE D7000000 E    EXTS      #SEG (sCI+0EH),#01H
22C2 F2F80E00 E    MOV       R8,SOF (sCI+0EH)
22C6 DA000000 E    CALLS     SEG (bDD_RdDDXaB),bDD_RdDDXaB
22CA E4800400      MOVB      [R0+#04H],RL4 ; bMengselNummer
22CE E6F46400      MOV       R4,#064H
22D2 E005          MOV       R5,#00H
22D4 8850          MOV       [-R0],R5        ==>R0-2
22D6 F0C4          MOV       R12,R4
22D8 ECFC          PUSH      R12
22DA D4A00400      MOV       R10,[R0+#04H] ; wPomp1Index
22DE E009          MOV       R9,#00H
22E0 D7000000 E    EXTS      #SEG (sPO+014H),#01H
22E4 F2F81400 E    MOV       R8,SOF (sPO+014H)
22E8 DA000000 E    CALLS     SEG (wDD_RdDDXaW),wDD_RdDDXaW
22EC F084          MOV       R8,R4
22EE E009          MOV       R9,#00H
22F0 E00A          MOV       R10,#00H
22F2 E00B          MOV       R11,#00H
22F4 FCFC          POP       R12
22F6 DA000000 R    CALLS     SEG (xtestdiv),xtestdiv
22FA 0802          ADD       R0,#02H           ==>R0+2
22FC ECF5          PUSH      R5
22FE ECF4          PUSH      R4
2300 F04D          MOV       R4,R13
2302 C08A          MOVBZ     R10,RL4
2304 E049          MOV       R9,#04H
2306 D7000000 E    EXTS      #SEG (sPA+02AH),#01H
230A F2F82A00 E    MOV       R8,SOF (sPA+02AH)
230E DA000000 E    CALLS     SEG (lDD_RdDDXaL),lDD_RdDDXaL
2312 F0E4          MOV       R14,R4
2314 F0F5          MOV       R15,R5
2316 D4A00400      MOV       R10,[R0+#04H] ; wPomp1Index    ==>WRONG OFFSET,#04 should be #02H
231A E009          MOV       R9,#00H
231C D7000000 E    EXTS      #SEG (sPO+014H),#01H
2320 F2F81400 E    MOV       R8,SOF (sPO+014H)
2324 DA000000 E    CALLS     SEG (wDD_RdDDXaW),wDD_RdDDXaW
2328 F064          MOV       R6,R4
232A E007          MOV       R7,#00H
232C F04E          MOV       R4,R14
232E 2046          SUB       R4,R6
2330 F05F          MOV       R5,R15
2332 3057          SUBC      R5,R7
2334 FCF6          POP       R6
2336 FCF7          POP       R7
2338 0046          ADD       R4,R6
233A 1057          ADDC      R5,R7
;---- Variable 'lEerderUit' assigned to Register 'R4/R5' ----
                                           ; SOURCE LINE # 1448
233C F094          MOV       R9,R4
233E F0A5          MOV       R10,R5
2340 D4400200      MOV       R4,[R0+#02H]  ; wWeger1Index
2344 C088          MOVBZ     R8,RL4
2346 DA000000 R    CALLS     SEG (bMagPompHoogToeren),bMagPompHoogToeren
234A 4980          CMPB      RL4,#00H
234C 3D03          JMPR      cc_NZ,?C0149
234E F4800800      MOVB      RL4,[R0+#08H] ; bHoogToeren
2352 2D0B          JMPR      cc_Z,?C0148
2354         ?C0149:
2354 F4800600      MOVB      RL4,[R0+#06H] ; bMengselNummer
2358 C08A          MOVBZ     R10,RL4
235A 28A1          SUB       R10,#01H
235C E009          MOV       R9,#00H
235E D7000000 E    EXTS      #SEG (sME+03EH),#01H
2362 F2F83E00 E    MOV       R8,SOF (sME+03EH)
2366 DA000000 E    CALLS     SEG (bDD_RdDDXaB),bDD_RdDDXaB
236A         ?C0148:
                                           ; SOURCE LINE # 1453
                                           ; SOURCE LINE # 1454

236A 06F00800      ADD       R0,#08H
236E FCFF          POP       R15
2370 FCFE          POP       R14
2372 FCFD          POP       R13
2374 DB00          RETS
             ; FUNCTION StuurPomp (END    RMASK = @0x7FFF)

0