Hi Thomas,
> If you need to read less than 64K from the upper 96K Flash ROM then
> using a fixed absolute address with a 16bit index, e.g. "LDF
> A,(0x123456,X)", might be a solution.
>
> That's also a bit faster than indirect addressing.
Thank you for the advice. Yes, a 16-bit index would be no problem,
seeing as I'm only writing up to 128 bytes (max flash block size) at a time.
So, if I reformulate my code to additionally implement the loop in ASM,
such that I can specifically put the loop counter (aka the flash address
and source buffer offset) in the X register, I have this:
static uint32_t flash_write_block_addr_tmp;
static uint8_t *flash_write_block_buf_tmp;
void flash_write_block(const uint32_t addr, const void *buf) {
/* Unlock flash, etc... */
flash_write_block_addr_tmp = addr;
flash_write_block_buf_tmp = (uint8_t *)buf;
__asm
pushw x
push a
clrw x
0001$:
cpw x, #FLASH_BLOCK_SIZE
jrnc 0002$
ld a, ([_flash_write_block_buf_tmp], x)
ldf ([_flash_write_block_addr_tmp], x), a
incw x
jra 0001$
0002$:
pop a
popw x
__endasm;
/* Wait for write completion, etc... */
}
Is this correct? For the input buffer, I take the address of the buf_tmp
variable (as represented by the symbol), use that as an indirect address
to get the pointer address, which is then indexed by X (i.e. offset by
loop counter value), and finally used as the source when loading the A
register. Same for the flash address, but used as the destination for LDF.
And this should be faster than the previous way of using addr_tmp and
buf_tmp as absolute addresses and incrementing them separately? I think
I see why that may be: the STM8 programming manual says "ldf [addr], a"
takes the same number of cycles as "ldf ([addr], x), a", with the same
story for "ld". So if I save doing the separate address incrementations
(expensive for a 32-bit value), then I guess it's a win. :-)
Regards,
Basil
_______________________________________________
Sdcc-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user