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