Can you do ‘sdcc -v’ and paste the output?
here it is:
this@this-laptop:~$ sdcc -v
SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.7.0 #4 818 (Jan 18 2008) (UNIX)
MIOS_BANKSTICK_WritePage((addr << 6), current_preset); // parentheses here
this one I already tried, makes no difference.
However… it behaving differently when called from the tick or notify functions, is really strange… And really, they all should work.
I’dont exactly know where notify is called, but I think it’s from a timer - callback, not from the main-loop? This could make the difference.
It kinda seems like an SDCC bug…
could be. I’ll study the sdcc-manual once more, there are specials about
passing parameters to functions etc. I could imagine that bit-shifts have special
things to take are about too.
I’d love to see the output asm if you still have it handy!
ok, i start with the current, woking version:
; ; Starting pCode block
S_main__preset_store code
_preset_store:
; .line 162; main.c void preset_store(unsigned char num) __wparam{
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
MOVFF r0x04, POSTDEC1
MOVWF r0x00
; .line 163; main.c unsigned int addr = num;
CLRF r0x01
; .line 164; main.c addr <<= 6;
RRCF r0x01, F
RRCF r0x00, F
RRCF r0x01, F
RRCF r0x00, F
RRCF r0x01, W
ANDLW 0xc0
XORWF r0x00, W
XORWF r0x00, F
XORWF r0x00, W
MOVWF r0x01
; .line 165; main.c MIOS_BANKSTICK_WritePage(addr, current_preset);
MOVLW HIGH(_current_preset)
MOVWF r0x03
MOVLW LOW(_current_preset)
MOVWF r0x02
MOVLW 0x80
MOVWF r0x04
MOVF r0x04, W
MOVWF POSTDEC1
MOVF r0x03, W
MOVWF POSTDEC1
MOVF r0x02, W
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
MOVF r0x00, W
CALL _MIOS_BANKSTICK_WritePage
MOVLW 0x04
ADDWF FSR1L, F
MOVFF PREINC1, r0x04
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
your first proposition (Debug - Output: num==6 -> addr==64): NOT working:
; ; Starting pCode block
S_main__preset_store code
_preset_store:
; .line 170; main.c void preset_store(unsigned char num) __wparam{
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
MOVFF r0x04, POSTDEC1
MOVWF r0x00
; .line 171; main.c unsigned int addr = (((unsigned int)num) << 6); // parentheses added here
CLRF r0x01
RRCF r0x01, W
MOVWF r0x03
RRCF r0x02, W
MOVWF r0x02
RRCF r0x03, F
RRCF r0x02, F
RRCF r0x03, W
ANDLW 0xc0
XORWF r0x02, W
XORWF r0x02, F
XORWF r0x02, W
MOVWF r0x03
; .line 177; main.c MIOS_BANKSTICK_WritePage(addr, current_preset);
MOVLW HIGH(_current_preset)
MOVWF r0x01
MOVLW LOW(_current_preset)
MOVWF r0x00
MOVLW 0x80
MOVWF r0x04
MOVF r0x04, W
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
MOVF r0x00, W
MOVWF POSTDEC1
MOVF r0x03, W
MOVWF POSTDEC1
MOVF r0x02, W
CALL _MIOS_BANKSTICK_WritePage
MOVLW 0x04
ADDWF FSR1L, F
MOVFF PREINC1, r0x04
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
your second proposition (Debug - Output: num==6 -> addr==348): this one works only if I have the debug code uncommented (!). the funny thing is, that the debug output is correct too. If the shift would appear after passing the value, this would not be the case. so this one WORKS:
; ; Starting pCode block
S_main__preset_store code
_preset_store:
; .line 170; main.c void preset_store(unsigned char num) __wparam{
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
MOVFF r0x04, POSTDEC1
MOVWF r0x00
; .line 171; main.c unsigned int addr = ((unsigned char)num);
MOVFF r0x00, r0x01
CLRF r0x02
; .line 172; main.c MIOS_LCD_Clear();
CALL _MIOS_LCD_Clear
; .line 173; main.c MIOS_LCD_CursorSet(0);
MOVLW 0x00
CALL _MIOS_LCD_CursorSet
; .line 174; main.c MIOS_LCD_PrintBCD2(num);
MOVF r0x00, W
CALL _MIOS_LCD_PrintBCD2
; .line 175; main.c MIOS_LCD_PrintCString(" - ");
MOVLW UPPER(__str_0)
MOVWF POSTDEC1
MOVLW HIGH(__str_0)
MOVWF POSTDEC1
MOVLW LOW(__str_0)
CALL _MIOS_LCD_PrintCString
MOVLW 0x02
ADDWF FSR1L, F
; .line 176; main.c MIOS_LCD_PrintBCD5((addr << 6));// parentheses here
RRCF r0x02, W
MOVWF r0x03
RRCF r0x00, W
MOVWF r0x00
RRCF r0x03, F
RRCF r0x00, F
RRCF r0x03, W
ANDLW 0xc0
XORWF r0x00, W
XORWF r0x00, F
XORWF r0x00, W
MOVWF r0x03
MOVF r0x03, W
MOVWF POSTDEC1
MOVF r0x00, W
CALL _MIOS_LCD_PrintBCD5
INCF FSR1L, F
; .line 177; main.c MIOS_BANKSTICK_WritePage((addr << 6), current_preset);// parentheses here
MOVLW HIGH(_current_preset)
MOVWF r0x02
MOVLW LOW(_current_preset)
MOVWF r0x01
MOVLW 0x80
MOVWF r0x04
MOVF r0x04, W
MOVWF POSTDEC1
MOVF r0x02, W
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
MOVF r0x03, W
MOVWF POSTDEC1
MOVF r0x00, W
CALL _MIOS_BANKSTICK_WritePage
MOVLW 0x04
ADDWF FSR1L, F
MOVFF PREINC1, r0x04
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
..while this one is NOT working!! :
; ; Starting pCode block
S_main__preset_store code
_preset_store:
; .line 170; main.c void preset_store(unsigned char num) __wparam{
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
MOVFF r0x04, POSTDEC1
MOVWF r0x00
; .line 171; main.c unsigned int addr = ((unsigned char)num);
CLRF r0x01
; .line 177; main.c MIOS_BANKSTICK_WritePage((addr << 6), current_preset);// parentheses here
RRCF r0x01, W
MOVWF r0x03
RRCF r0x02, W
MOVWF r0x02
RRCF r0x03, F
RRCF r0x02, F
RRCF r0x03, W
ANDLW 0xc0
XORWF r0x02, W
XORWF r0x02, F
XORWF r0x02, W
MOVWF r0x03
MOVLW HIGH(_current_preset)
MOVWF r0x01
MOVLW LOW(_current_preset)
MOVWF r0x00
MOVLW 0x80
MOVWF r0x04
MOVF r0x04, W
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
MOVF r0x00, W
MOVWF POSTDEC1
MOVF r0x03, W
MOVWF POSTDEC1
MOVF r0x02, W
CALL _MIOS_BANKSTICK_WritePage
MOVLW 0x04
ADDWF FSR1L, F
MOVFF PREINC1, r0x04
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
the typecast on assign nor the parentheses on passing make any difference. this one works again:
; ; Starting pCode block
S_main__preset_store code
_preset_store:
; .line 170; main.c void preset_store(unsigned char num) __wparam{
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
MOVFF r0x04, POSTDEC1
MOVWF r0x00
; .line 171; main.c unsigned int addr = num;
MOVFF r0x00, r0x01
CLRF r0x02
; .line 172; main.c MIOS_LCD_Clear();
CALL _MIOS_LCD_Clear
; .line 173; main.c MIOS_LCD_CursorSet(0);
MOVLW 0x00
CALL _MIOS_LCD_CursorSet
; .line 174; main.c MIOS_LCD_PrintBCD2(num);
MOVF r0x00, W
CALL _MIOS_LCD_PrintBCD2
; .line 175; main.c MIOS_LCD_PrintCString(" - ");
MOVLW UPPER(__str_0)
MOVWF POSTDEC1
MOVLW HIGH(__str_0)
MOVWF POSTDEC1
MOVLW LOW(__str_0)
CALL _MIOS_LCD_PrintCString
MOVLW 0x02
ADDWF FSR1L, F
; .line 176; main.c MIOS_LCD_PrintBCD5(addr << 6);// parentheses here
RRCF r0x02, W
MOVWF r0x03
RRCF r0x00, W
MOVWF r0x00
RRCF r0x03, F
RRCF r0x00, F
RRCF r0x03, W
ANDLW 0xc0
XORWF r0x00, W
XORWF r0x00, F
XORWF r0x00, W
MOVWF r0x03
MOVF r0x03, W
MOVWF POSTDEC1
MOVF r0x00, W
CALL _MIOS_LCD_PrintBCD5
INCF FSR1L, F
; .line 177; main.c MIOS_BANKSTICK_WritePage(addr << 6, current_preset);// parentheses here
MOVLW HIGH(_current_preset)
MOVWF r0x02
MOVLW LOW(_current_preset)
MOVWF r0x01
MOVLW 0x80
MOVWF r0x04
MOVF r0x04, W
MOVWF POSTDEC1
MOVF r0x02, W
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
MOVF r0x03, W
MOVWF POSTDEC1
MOVF r0x00, W
CALL _MIOS_BANKSTICK_WritePage
MOVLW 0x04
ADDWF FSR1L, F
MOVFF PREINC1, r0x04
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
…and this one is NOT working:
; ; Starting pCode block
S_main__preset_store code
_preset_store:
; .line 170; main.c void preset_store(unsigned char num) __wparam{
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
MOVFF r0x04, POSTDEC1
MOVWF r0x00
; .line 171; main.c unsigned int addr = num;
CLRF r0x01
; .line 177; main.c MIOS_BANKSTICK_WritePage(addr << 6, current_preset);// parentheses here
RRCF r0x01, W
MOVWF r0x03
RRCF r0x02, W
MOVWF r0x02
RRCF r0x03, F
RRCF r0x02, F
RRCF r0x03, W
ANDLW 0xc0
XORWF r0x02, W
XORWF r0x02, F
XORWF r0x02, W
MOVWF r0x03
MOVLW HIGH(_current_preset)
MOVWF r0x01
MOVLW LOW(_current_preset)
MOVWF r0x00
MOVLW 0x80
MOVWF r0x04
MOVF r0x04, W
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
MOVF r0x00, W
MOVWF POSTDEC1
MOVF r0x03, W
MOVWF POSTDEC1
MOVF r0x02, W
CALL _MIOS_BANKSTICK_WritePage
MOVLW 0x04
ADDWF FSR1L, F
MOVFF PREINC1, r0x04
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
one more.. this is not working :
; ; Starting pCode block
S_main__preset_store code
_preset_store:
; .line 163; main.c void preset_store(unsigned char num) __wparam{
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
MOVFF r0x04, POSTDEC1
MOVWF r0x00
; .line 164; main.c unsigned int addr = num;
CLRF r0x01
; .line 166; main.c MIOS_BANKSTICK_WritePage((addr <<= 6), current_preset);
RRCF r0x01, W
MOVWF r0x03
RRCF r0x02, W
MOVWF r0x02
RRCF r0x03, F
RRCF r0x02, F
RRCF r0x03, W
ANDLW 0xc0
XORWF r0x02, W
XORWF r0x02, F
XORWF r0x02, W
MOVWF r0x03
MOVLW HIGH(_current_preset)
MOVWF r0x01
MOVLW LOW(_current_preset)
MOVWF r0x00
MOVLW 0x80
MOVWF r0x04
MOVF r0x04, W
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
MOVF r0x00, W
MOVWF POSTDEC1
MOVF r0x03, W
MOVWF POSTDEC1
MOVF r0x02, W
CALL _MIOS_BANKSTICK_WritePage
MOVLW 0x04
ADDWF FSR1L, F
MOVFF PREINC1, r0x04
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
so It looks like the bitshift needs to be
on a separate line..
I let it be your job to interpret the asm..