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)