From: SourceForge.net <no...@so...> - 2006-11-15 12:35:07
|
Bugs item #1596282, was opened at 2006-11-14 12:45 Message generated for change (Comment added) made by tecodev You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1596282&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: z80 port Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: Cannot init variables in declaration Initial Comment: SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.6.0 #4309 (Jul 28 2006) (MINGW32) Target: Z80 There is great bug in declaration (Z80 port): char VARIABLE = 10; // or any other value or void Function(void) { static char LOC_VARIABLE = 20; Both variables (VARIABLE, LOC_VARIABLE) contain undefined values, which in my sources usually means crash of compiled code. This is great bug, because initialisation during declaration is very often used :-( ---------------------------------------------------------------------- >Comment By: Raphael Neider (tecodev) Date: 2006-11-15 12:35 Message: Logged In: YES user_id=1115835 Originator: NO You need some piece of code that either (a) copies initialized variables from ROM to RAM or (b) sets their values on start up. This is different from the way a PC works, as there is no "loader" copying your .hex to RAM; you just program your ROM/Flash and assume the RAM to be undefined. The compiler (SDCC) does generate the required code, still you need to call it (usually done as part of RESET handling routines, in crt0). ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2006-11-15 11:12 Message: Logged In: NO spth: I use no crt0 or any other library (I do all IO using "sfr" and "at" arrays). But initialisation of variables should be done by compiler in my modules, not by included libraries. ---------------------------------------------------------------------- Comment By: Philipp Krause (spth) Date: 2006-11-14 22:08 Message: Logged In: YES user_id=564030 Originator: NO Works for me in sdcc #4399 using my custom crt0.o. Do you use a custom crt0.o? If yes please check that you call gsinit, and gsinit is implemented correctly. Example: First call in my crt0.s (directly after setting the stack pointer): call gsinit At the end of my crt0.s: .area _GSINIT gsinit:: .area _GSFINAL ret ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2006-11-14 15:09 Message: Logged In: NO I am sorry, I forgot add concrete source code: static void game_NP1_DebugPoint1(void) { static UINT8 index = 0; ZX_Pix[index] = 0x11; ZX_Col[index] = 0x22; Values should be written to arrays at index[0], but they are written to index[0xff]. The same wrong result is when local variable is moved to global section: UINT8 index = 0; static void game_NP1_DebugPoint1(void) { ZX_Pix[index] = 0x11; ZX_Col[index] = 0x22; Temporary bugfix for SDCC is: static void game_NP1_DebugPoint1(void) { static UINT8 index; if (firstcall_flag) index = 0; ZX_Pix[index] = 0x11; ZX_Col[index] = 0x22; ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1596282&group_id=599 |