diff options
| author | Keith Packard <keithp@keithp.com> | 2008-12-28 00:09:30 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2008-12-28 00:09:30 -0800 | 
| commit | 23aca1fcbc169184e32d4ec19f28dd4fd4cfda36 (patch) | |
| tree | 57a61e4a0170837f43315294326d14bc410eb2ae /lib/ccdbg-memory.c | |
| parent | 1405838160b69e2cda456e21502a1d03b3aa7548 (diff) | |
Save/restore regs when reading/writing memory. Add SFR access.
The DPL and ACC registers are used by the memory access code,
so they need to be saved and restored. Stuff them up high in ram for now;
this should probably be fixed to pull them back to the host instead.
Special SFR access is required as not all SFRs are visible in the unified
address space.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'lib/ccdbg-memory.c')
| -rw-r--r-- | lib/ccdbg-memory.c | 69 | 
1 files changed, 67 insertions, 2 deletions
| diff --git a/lib/ccdbg-memory.c b/lib/ccdbg-memory.c index 3406a1b1..d74726fb 100644 --- a/lib/ccdbg-memory.c +++ b/lib/ccdbg-memory.c @@ -23,9 +23,14 @@   */  static uint8_t	memory_init[] = { +	2,	MOV_direct_A,		0x7f, +	3,	MOV_direct1_direct2,	0x7e, SFR_DPL0, +	3,	MOV_direct1_direct2,	0x7d, SFR_DPH0, +	3,	MOV_direct1_direct2,	0x7c, SFR_DPL1, +	3,	MOV_direct1_direct2,	0x7b, SFR_DPH1,  	3,	MOV_DPTR_data16,	0,	0, -#define HIGH_START	2 -#define LOW_START	3 +#define HIGH_START	21 +#define LOW_START	22  	0,  }; @@ -44,6 +49,15 @@ static uint8_t read8[] = {  	0,  }; +static uint8_t	memory_fini[] = { +	2,	MOV_A_direct,		0x7f, +	3,	MOV_direct1_direct2,	SFR_DPL0, 0x7e, +	3,	MOV_direct1_direct2,	SFR_DPH0, 0x7d, +	3,	MOV_direct1_direct2,	SFR_DPL1, 0x7c, +	3,	MOV_direct1_direct2,	SFR_DPH1, 0x7b, +	0, +}; +  uint8_t  ccdbg_write_memory(struct ccdbg *dbg, uint16_t addr, uint8_t *bytes, int nbytes)  { @@ -64,6 +78,7 @@ ccdbg_write_memory(struct ccdbg *dbg, uint16_t addr, uint8_t *bytes, int nbytes)  			nl = 0;  		}  	} +	(void) ccdbg_execute(dbg, memory_fini);  	if (nl)  		ccdbg_debug(CC_DEBUG_MEMORY, "\n");  	return 0; @@ -88,6 +103,7 @@ ccdbg_read_memory(struct ccdbg *dbg, uint16_t addr, uint8_t *bytes, int nbytes)  			nl = 0;  		}  	} +	(void) ccdbg_execute(dbg, memory_fini);  	if (nl)  		ccdbg_debug(CC_DEBUG_MEMORY, "\n");  	return 0; @@ -118,3 +134,52 @@ ccdbg_read_hex_image(struct ccdbg *dbg, uint16_t address, uint16_t length)  	ccdbg_read_memory(dbg, address, image->data, length);  	return image;  } + +static uint8_t sfr_init[] = { +	2,	MOV_direct_A,		0x7f, +	0, +}; + +static uint8_t sfr_fini[] = { +	2,	MOV_A_direct,		0x7f, +	0, +}; + +static uint8_t sfr_read[] = { +	2,	MOV_A_direct,		0, +#define SFR_READ_ADDR	2 +	0, +}; + +static uint8_t sfr_write[] = { +	3,	MOV_direct_data,	0,	0, +#define SFR_WRITE_ADDR	2 +#define SFR_WRITE_DATA	3 +	0, +}; + +uint8_t +ccdbg_read_sfr(struct ccdbg *dbg, uint8_t addr, uint8_t *bytes, int nbytes) +{ +	int	i; +	(void) ccdbg_execute(dbg, sfr_init); +	for (i = 0; i < nbytes; i++) { +		sfr_read[SFR_READ_ADDR] = addr + i; +		*bytes++ = ccdbg_execute(dbg, sfr_read); +	} +	(void) ccdbg_execute(dbg, sfr_fini); +	return 0; +} + +uint8_t +ccdbg_write_sfr(struct ccdbg *dbg, uint8_t addr, uint8_t *bytes, int nbytes) +{ +	int	i; +	 +	for (i = 0; i < nbytes; i++) { +		sfr_write[SFR_WRITE_ADDR] = addr + i; +		sfr_write[SFR_WRITE_DATA] = *bytes++; +		ccdbg_execute(dbg, sfr_write); +	} +	return 0; +} | 
