> -----Oorspronkelijk bericht-----
> Van: Philipp Klaus Krause [mailto:[email protected]]
> Verzonden: zondag 25 maart 2018 20:06
> Aan: [email protected]
> Onderwerp: Re: [Sdcc-user] STM8 >32kB code fails...?
>
> Work on the feature request
> (https://sourceforge.net/p/sdcc/feature-requests/556/) has been
> progressing well.
>
> You can try it using current source (revision 10340 or
> newer). To enable
> support for the 24-bit space, use --model-large. Since you
> have previous
> experience with modifying SDCC for this, your comments (and possibly
> patches) would certainly be helpful.
>
> Philipp
Dear Philipp,
I made a small test program and investigated the generated result file and
sstm8 behaviour. Below is the source with comments on points where I see
some issues.
====================
/*
Compiled with r10342 snapshot:
sdcc -mstm8 --model-large
Startup code uses jp instructions. Suggest using jpf instructions for the
large memory model, for maximum flexibility.
008021 CC 80 04 [ 2] 67 jp __sdcc_program_startup
008004 73 __sdcc_program_startup:
008004 CC 80 24 [ 2] 74 jp _main
*/
#include <stdint.h>
uint32_t test1(uint32_t x);
uint32_t test2(uint32_t x);
int main(void)
{
uint32_t (*test)(uint32_t x) = test1;
while (1)
{
/*
Jumps to address 0x688068 (0x008068 expected) in sstm8. Issue with >>
operator?
00802B A6 68 [ 1] 89 ld a, #(_test1 >> 16)
008068 132 _test1:
Returns to address 0x458045 (0x008045 expected) in sstm8. Issue with >>
operator?
008039 4B 45 [ 1] 100 push #(00111$ >> 16)
008045 108 00111$:
*/
test(100);
/* Call, return and stack frame look ok for below two functions. */
test1(0xDEADBEEF);
test2(0xBEEFDEAD);
}
}
uint32_t test1(uint32_t x)
{
__asm
; Seems sstm8 has an issue with decoding 'jpf' (opcode 0xAC). Executing
instruction looks ok.
jpf $1
; Burn some flash.
.ds 32 * 1024
$1:
__endasm;
return x + 1;
}
const uint8_t
flashfill[1024] = { 0, 1, 2, 3, 4, 5, 6, 7 };
uint32_t test2(uint32_t x)
{
uint32_t
temp1 = x * 2,
temp2 = x * 4;
/*
Causes sdcc to enter 'infinite' loop. Ok when placed outside function
scope (as above):
const uint8_t
flashfill[1024] = { 0, 1, 2, 3, 4, 5, 6, 7 };
*/
/*
Since 'flashfill' is placed after code and ldw uses 16 bit addressing,
incorrect results are obtained here.
Expected as constseg placement is not yet adjusted.
*/
return temp1 + temp2 + flashfill[7];
}
====================
It looks like the basiscs are almost working (but as they say: the devil is
in the details). I would like to work on a few patches, but currently time
is limited. I would be able to have some experiments done on a larger
project once the above issues are taken care of.
Eric
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Sdcc-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user