diff options
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; +} | 
