From: frief Date: Thu, 13 Nov 2003 21:15:36 +0000 (+0000) Subject: started fixing bug #737001 (SDCC not clearing uninitialized variables) for the mcs51... X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=c4ae6ea8335edf2b69b6f91d15ba225089fe0d7d;p=fw%2Fsdcc started fixing bug #737001 (SDCC not clearing uninitialized variables) for the mcs51. Set environment variable SDCC_GENRAMCLEAR to test. xdata initialization slightly shorter git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3013 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/src/mcs51/main.c b/src/mcs51/main.c index 6d88a68d..8a8dc53b 100644 --- a/src/mcs51/main.c +++ b/src/mcs51/main.c @@ -153,13 +153,33 @@ _mcs51_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts) return FALSE; } +/* Generate code to clear XSEG and idata memory. + This clears XSEG, DSEG, BSEG, OSEG, SSEG */ +static void _mcs51_genRAMCLEAR (FILE * of) { + fprintf (of, "; _mcs51_genRAMCLEAR() start\n"); + fprintf (of, " mov r1,#l_XSEG\n"); + fprintf (of, " mov a,r1\n"); + fprintf (of, " orl a,#(l_XSEG >> 8)\n"); + fprintf (of, " jz 00005$\n"); + fprintf (of, " mov r2,#((l_XSEG + 255) >> 8)\n"); + fprintf (of, " mov dptr,#s_XSEG\n"); + fprintf (of, " clr a\n"); + fprintf (of, "00004$: movx @dptr,a\n"); + fprintf (of, " inc dptr\n"); + fprintf (of, " djnz r1,00004$\n"); + fprintf (of, " djnz r2,00004$\n"); + /* r1 is zero now. Clearing 256 byte assuming 128 byte devices don't mind */ + fprintf (of, "00005$: mov @r1,a\n"); + fprintf (of, " djnz r1,00005$\n"); + fprintf (of, "; _mcs51_genRAMCLEAR() end\n"); +} + /* Generate code to copy XINIT to XISEG */ static void _mcs51_genXINIT (FILE * of) { fprintf (of, "; _mcs51_genXINIT() start\n"); fprintf (of, " mov r1,#l_XINIT\n"); - fprintf (of, " mov r2,#(l_XINIT >> 8)\n"); fprintf (of, " mov a,r1\n"); - fprintf (of, " orl a,r2\n"); + fprintf (of, " orl a,#(l_XINIT >> 8)\n"); fprintf (of, " jz 00003$\n"); fprintf (of, " mov r2,#((l_XINIT+255) >> 8)\n"); fprintf (of, " mov dptr,#s_XINIT\n"); @@ -177,6 +197,8 @@ static void _mcs51_genXINIT (FILE * of) { fprintf (of, " mov p2,#0xFF\n"); fprintf (of, "00003$:\n"); fprintf (of, "; _mcs51_genXINIT() end\n"); + + if (getenv("SDCC_GENRAMCLEAR")) _mcs51_genRAMCLEAR (of); }