Menu

#119 -0x0100, perhaps preprocessor or compiler bug, HC08 core

None
closed
None
4
2019-11-02
2018-10-27
xiaolaba
No

simple test code for the purpose.
To form 32bit integer in RAM area, however ~() will renders result with -0x00000100.
why ? a bug ?

// sdcc 3.6.0
// build script,
// sdcc -mhc08 --data-loc 0x80 --code-loc 0xEE00 --stack-loc 0xFF sdcc360_bug.c -o sdcc360_bug.S19

// perhaps bug, why ~() and -0x0100
// 2018-OCT-28

#define MOD 0xBEBE0000

#include <mc68hc908qy.h>

volatile unsigned long int value;

void main() {

// supposedly same long value
  value = (0xBEBE7B84);
  value = (0xBEBE0000 + 0x7B84);
  value = (0xBEBE0000 + 0x7B00 + 0x84);
  value = (MOD        + 0x7B00 + 0x84);
  value = (0xBEBE7B00 +          ~0x7B);   // it is odd, -0x0100     
  value = (0xBEBE0000 + 0x7B00 + ~0x7B);   // it is odd, -0x0100
  value = (MOD        + 0x7B00 + ~0x7B);   // it is odd, -0x0100

// supposedly same long
  value = (0xBEBEFF01);
  value = (0xBEBE0000 + 0xFF01);
  value = (0xBEBE0000 + 0xFF00 + 0x01);
  value = (MOD        + 0xFF00 + 0x01);    
  value = (0xBEBE0000 + 0xFF00 + ~0xFE);   // it is odd, -0x0100
  value = (MOD        + 0xFF00 + ~0xFE);   // it is odd, -0x0100

}
```






asm show the same odd thing,
 i.e. #0x7b is expected,
 EE5E A6 7B         [ 2]  232   lda #0x7b

this one is about #0x7b-1 = 0x7a
final result is always -0x00000100,
 EE6E A6 7A         [ 2]  241   lda #0x7a
                        227 ;sdcc360_bug.c:17: value = (MOD        + 0x7B00 + 0x84);

EE56 45 00 80 [ 3] 228 ldhx #_value
EE59 A6 BE [ 2] 229 lda #0xbe
EE5B F7 [ 2] 230 sta ,x
EE5C E7 01 [ 3] 231 sta 1,x
EE5E A6 7B [ 2] 232 lda #0x7b
EE60 E7 02 [ 3] 233 sta 2,x
EE62 A6 84 [ 2] 234 lda #0x84
EE64 E7 03 [ 3] 235 sta 3,x
236 ;sdcc360_bug.c:18: value = (0xBEBE7B00 + ~0x7B); // it is odd, -0x0100
EE66 45 00 80 [ 3] 237 ldhx #_value
EE69 A6 BE [ 2] 238 lda #0xbe
EE6B F7 [ 2] 239 sta ,x
EE6C E7 01 [ 3] 240 sta 1,x
EE6E A6 7A [ 2] 241 lda #0x7a
EE70 E7 02 [ 3] 242 sta 2,x
EE72 A6 84 [ 2] 243 lda #0x84
EE74 E7 03 [ 3] 244 sta 3,x
~~~

2 Attachments

Discussion

  • xiaolaba

    xiaolaba - 2018-10-28

    latest release of sdcc 3.8.0 has gone through same compiling process, the problem persisted,

    ;--------------------------------------------------------
    ; File Created by SDCC : free open source ANSI-C Compiler
    ; Version 3.8.0 #10562 (MINGW64)
    ;--------------------------------------------------------
        .module sdcc360_bug
        .optsdcc -mhc08
    
        .area HOME    (CODE)
        .area GSINIT0 (CODE)
        .area GSINIT  (CODE)
        .area GSFINAL (CODE)
        .area CSEG    (CODE)
        .area XINIT   (CODE)
        .area CONST   (CODE)
        .area DSEG    (PAG)
        .area OSEG    (PAG, OVR)
        .area XSEG
        .area XISEG
        .area   CODEIVT (ABS)
        .org    0xfffe
        .dw __sdcc_gs_init_startup
    
        .area GSINIT0
    __sdcc_gs_init_startup:
        ldhx    #0x0100
        txs
        jsr __sdcc_external_startup
        beq __sdcc_init_data
        jmp __sdcc_program_startup
    __sdcc_init_data:
    ; _hc08_genXINIT() start
            ldhx #0
    00001$:
            cphx #l_XINIT
            beq  00002$
            lda  s_XINIT,x
            sta  s_XISEG,x
            aix  #1
            bra  00001$
    00002$:
    ; _hc08_genXINIT() end
        .area GSFINAL
        jmp __sdcc_program_startup
    
        .area CSEG
    __sdcc_program_startup:
        jsr _main
        bra .
    ;--------------------------------------------------------
    ; Public variables in this module
    ;--------------------------------------------------------
        .globl _main
        .globl _value
        .globl _COPCTL
        .globl _OSCTRIMVAL
        .globl _FLBPR
        .globl _LVISR
        .globl _BRKSCR
        .globl _BRK
        .globl _BRKL
        .globl _BRKH
        .globl _FLCR
        .globl _INT3
        .globl _INT2
        .globl _INT1
        .globl _BFCF
        .globl _BRKAR
        .globl _SRSR
        .globl _BSR
        .globl _ADICLK
        .globl _ADR
        .globl _ADSCR
        .globl _OSCTRIM
        .globl _OSCSTAT
        .globl _TCH1
        .globl _TCH1L
        .globl _TCH1H
        .globl _TSC1
        .globl _TCH0
        .globl _TCH0L
        .globl _TCH0H
        .globl _TSC0
        .globl _TMOD
        .globl _TMODL
        .globl _TMODH
        .globl _TCNT
        .globl _TCNTL
        .globl _TCNTH
        .globl _TSC
        .globl _CONFIG1
        .globl _CONFIG2
        .globl _INTSCR
        .globl _KBIER
        .globl _KBSCR
        .globl _PTBPUE
        .globl _PTAPUE
        .globl _DDRB
        .globl _DDRA
        .globl _PTB
        .globl _PTA
    ;--------------------------------------------------------
    ; ram data
    ;--------------------------------------------------------
        .area DSEG    (PAG)
    _PTA    =   0x0000
    _PTB    =   0x0001
    _DDRA   =   0x0004
    _DDRB   =   0x0005
    _PTAPUE =   0x000b
    _PTBPUE =   0x000c
    _KBSCR  =   0x001a
    _KBIER  =   0x001b
    _INTSCR =   0x001d
    _CONFIG2    =   0x001e
    _CONFIG1    =   0x001f
    _TSC    =   0x0020
    _TCNTH  =   0x0021
    _TCNTL  =   0x0022
    _TCNT   =   0x0021
    _TMODH  =   0x0023
    _TMODL  =   0x0024
    _TMOD   =   0x0023
    _TSC0   =   0x0025
    _TCH0H  =   0x0026
    _TCH0L  =   0x0027
    _TCH0   =   0x0026
    _TSC1   =   0x0028
    _TCH1H  =   0x0029
    _TCH1L  =   0x002a
    _TCH1   =   0x0029
    _OSCSTAT    =   0x0036
    _OSCTRIM    =   0x0038
    _ADSCR  =   0x003c
    _ADR    =   0x003e
    _ADICLK =   0x003f
    ;--------------------------------------------------------
    ; overlayable items in ram 
    ;--------------------------------------------------------
    ;--------------------------------------------------------
    ; absolute ram data
    ;--------------------------------------------------------
        .area IABS    (ABS)
        .area IABS    (ABS)
    ;--------------------------------------------------------
    ; absolute external ram data
    ;--------------------------------------------------------
        .area XABS    (ABS)
    ;--------------------------------------------------------
    ; external initialized ram data
    ;--------------------------------------------------------
        .area XISEG
    ;--------------------------------------------------------
    ; extended address mode data
    ;--------------------------------------------------------
        .area XSEG
    _BSR    =   0xfe00
    _SRSR   =   0xfe01
    _BRKAR  =   0xfe02
    _BFCF   =   0xfe03
    _INT1   =   0xfe04
    _INT2   =   0xfe05
    _INT3   =   0xfe06
    _FLCR   =   0xfe08
    _BRKH   =   0xfe09
    _BRKL   =   0xfe0a
    _BRK    =   0xfe09
    _BRKSCR =   0xfe0b
    _LVISR  =   0xfe0c
    _FLBPR  =   0xffbe
    _OSCTRIMVAL =   0xffc0
    _COPCTL =   0xffff
    _value::
        .ds 4
    ;--------------------------------------------------------
    ; global & static initialisations
    ;--------------------------------------------------------
        .area HOME    (CODE)
        .area GSINIT  (CODE)
        .area GSFINAL (CODE)
        .area GSINIT  (CODE)
    ;--------------------------------------------------------
    ; Home
    ;--------------------------------------------------------
        .area HOME    (CODE)
        .area HOME    (CODE)
    ;--------------------------------------------------------
    ; code
    ;--------------------------------------------------------
        .area CSEG    (CODE)
    ;------------------------------------------------------------
    ;Allocation info for local variables in function 'main'
    ;------------------------------------------------------------
    ;sdcc360_bug.c:14: void main() {
    ;   -----------------------------------------
    ;    function main
    ;   -----------------------------------------
    ;   Register assignment is optimal.
    ;   Stack space usage: 0 bytes.
    _main:
    ;sdcc360_bug.c:17: value = (0xBEBE7B84);
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0x7b
        sta 2,x
        lda #0x84
        sta 3,x
    ;sdcc360_bug.c:18: value = (0xBEBE0000 + 0x7B84);
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0x7b
        sta 2,x
        lda #0x84
        sta 3,x
    ;sdcc360_bug.c:19: value = (0xBEBE0000 + 0x7B00 + 0x84);
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0x7b
        sta 2,x
        lda #0x84
        sta 3,x
    ;sdcc360_bug.c:20: value = (MOD        + 0x7B00 + 0x84);
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0x7b
        sta 2,x
        lda #0x84
        sta 3,x
    ;sdcc360_bug.c:21: value = (0xBEBE7B00 +          ~0x7B);   // it is odd, -0x0100     
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0x7a
        sta 2,x
        lda #0x84
        sta 3,x
    ;sdcc360_bug.c:22: value = (0xBEBE0000 + 0x7B00 + ~0x7B);   // it is odd, -0x0100
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0x7a
        sta 2,x
        lda #0x84
        sta 3,x
    ;sdcc360_bug.c:23: value = (MOD        + 0x7B00 + ~0x7B);   // it is odd, -0x0100
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0x7a
        sta 2,x
        lda #0x84
        sta 3,x
    ;sdcc360_bug.c:26: value = (0xBEBEFF01);
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0xff
        sta 2,x
        lda #0x01
        sta 3,x
    ;sdcc360_bug.c:27: value = (0xBEBE0000 + 0xFF01);
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0xff
        sta 2,x
        lda #0x01
        sta 3,x
    ;sdcc360_bug.c:28: value = (0xBEBE0000 + 0xFF00 + 0x01);
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0xff
        sta 2,x
        lda #0x01
        sta 3,x
    ;sdcc360_bug.c:29: value = (MOD        + 0xFF00 + 0x01);    
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0xff
        sta 2,x
        lda #0x01
        sta 3,x
    ;sdcc360_bug.c:30: value = (0xBEBE0000 + 0xFF00 + ~0xFE);   // it is odd, -0x0100
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0xfe
        sta 2,x
        lda #0x01
        sta 3,x
    ;sdcc360_bug.c:31: value = (MOD        + 0xFF00 + ~0xFE);   // it is odd, -0x0100
        ldhx    #_value
        lda #0xbe
        sta ,x
        sta 1,x
        lda #0xfe
        sta 2,x
        lda #0x01
        sta 3,x
    ;sdcc360_bug.c:33: }
        rts
        .area CSEG    (CODE)
        .area CONST   (CODE)
        .area XINIT   (CODE)
        .area CABS    (ABS,CODE)
    
     
  • Philipp Klaus Krause

    ~0xfe is not 0x84.

    Philipp

    P.S.: (uint8_t)(~0xfe) is 0x84.

     

    Last edit: Philipp Klaus Krause 2018-10-28
    • xiaolaba

      xiaolaba - 2019-06-06

      sorry. could not follow, do you have complete example.
      there are perhaps 1's complement and the 2's complement, i.e.,

      0x7b,
      1's complement = 0x84 (NOT 0x7B)
      2's complement = 0x85 (-0x7B)

       
  • Maarten Brock

    Maarten Brock - 2019-11-02

    The constant is an integer, not an unsigned char.
    ~0x7B == ~0x007B == 0xFF84

     
  • Maarten Brock

    Maarten Brock - 2019-11-02
    • status: open --> closed
    • assigned_to: Maarten Brock
    • Group: -->
     

Log in to post a comment.

MongoDB Logo MongoDB