Is it me or stack problems, or me? :P
example code:
/* SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08
2.9.0 #5416 (Nov 19 2009) (UNIX) */
/* sdcc --code-loc 0x2000 pointer_dies.c ; cat pointer_dies.ihx > /dev/ttyS1 */
// the targets are a paulmon 8052 rev. 3 board
// and a 8052 wirewrapped prototype running with the exact same results (ram at
0x2000 - 0x7FFF)
// before i run code in the monitor, i fill all ram with a random value eg: 0x55
// after i compile and run this code in the paulmon monitor i hexdump from
0x2500 - 0x3FFF
/* in THIS cut down example file i get only 5 bytes, the last 2 bytes are mine:
...
2500: 00 00 00 00 00 02 00 55 55 55 55 55 55 55 55 55 UUUUUUUUU
2510: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 UUUUUUUUUUUUUUUU
2520: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 UUUUUUUUUUUUUUUU
2530: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 UUUUUUUUUUUUUUUU
2540: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 UUUUUUUUUUUUUUUU
...
when it should be 0x00 from 0x2500 - 0x3FFF
if i lose the "if( a = a + 1024 )" test, it runs like it should.
*/
#include <8051.h>
// in paulmon use 0x2500 to keep example code from being wiped.
#define RAM_START 0x2500
#define RAM_END 0x3FFF
// set to just "\r" if your terminal has cr-lf enabled.
#define _NR_ "\n\r"
void putchar(char c)
{
while(!TI);
TI=0;
SBUF = c;
}
void putstr(char *s)
{
char i=0;
char c;
while((c=*(s+(i++)))!= 0) putchar(c); // while byte is not terminator,
keep sending
}
void init_ram() // flood ram area with 0x00
{
unsigned int a=0,b=0,c=0;
xdata unsigned char *abs_ptr = (xdata unsigned char *) RAM_START; //
Initialize pointer to RAM_START
putstr("Filling ramspace with 0x00 (Each * represents 1 KiloByte of
NOP)");putstr(_NR_);
for(a = RAM_START; a < RAM_END; a++)
{
if( a = a + 1024 ) // strangely this makes the
pointer work for 21 bytes then quit at (0x2514)
//a=c;if(c=c+1024) // this one works for 32 bytes
then quits.
{
b++;
putstr("* ");
if(b==8) // just formats with \r\n every
8k
{
putstr(_NR_);
b=0;
}
}
*abs_ptr = 0x00 ; // Write 0x00 to RAM_LOCATION
*abs_ptr++ ; // Make pointer point at next location in RAM
}
*abs_ptr--;*abs_ptr--;*abs_ptr = 0x02; // backup 2 bytes and add "ljmp
0" to make it reset if downloaded code falls through.
}
void main(void)
{
// other non relevant functions and code snipped...
init_ram();
// other non relevant functions and code snipped...
while(1){
putstr(_NR_);putstr("Finished, Press return to reset
paulmon.");putstr(_NR_); // debugging only...
_asm ljmp 0 _endasm ;// debugging only, break out of while() and return
to paulmon.
}
}
_____________________________________________________________
Get your FREE, LinuxWaves.com Email Now! --> http://www.LinuxWaves.com
Join Linux Discussions! --> http://Community.LinuxWaves.com
------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev
_______________________________________________
Sdcc-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user