Menu

#2637 wrong offset calculation for small array (if size<256)

closed-fixed
Z80 (9)
other
5
2017-11-07
2017-08-11
sverx
No

(note: this is happening with #9913, don't know if it's still so after that since I can't switch to #9984 atm for the others known problems)

offset calculation for an array smaller than 256 bytes is wrong - the problem disappear just making the array bigger:

unsigned char gameMap[208];

void someFunction (void) {
  int tx,ty;
  if (gameMap[ty*13+tx] & 0x01)
    doSomething()
}

generates:

    ld  de, #_gameMap+0
    ld  c, -6 (ix)
    ld  l, c
    add hl, hl
    add hl, bc
    add hl, hl
    add hl, hl
    add hl, bc
    ld  c, -8 (ix)
    ld  a, l
    add a, c
    ld  c, a
    ld  l, c
    ld  a, c
    rla
    sbc a, a
    ld  h, a
    add hl,de
    ld  -11 (ix), l
    ld  -10 (ix), h
    ld  l,-11 (ix)
    ld  h,-10 (ix)
    ld  a, (hl)
    ld  -12 (ix), a
    bit 0, -12 (ix)
    jp  NZ,00398$
    jp  00137$

IMHO it seems that the problem is that B and H aren't zeroed before the multiplication by 13.

If I just make the array bigger, the generated code becomes

;main.c:467: if (gameMap[ty*MAP_X+tx] & BLOCK) {
    ld  bc, #_gameMap+0
    ld  e,-6 (ix)
    ld  d,-5 (ix)
    ld  l, e
    ld  h, d
    add hl, hl
    add hl, de
    add hl, hl
    add hl, hl
    add hl, de
    ld  e,-8 (ix)
    ld  d,-7 (ix)
    add hl, de
    add hl,bc
    ld  -11 (ix), l
    ld  -10 (ix), h
    ld  l,-11 (ix)
    ld  h,-10 (ix)
    ld  a, (hl)
    ld  -12 (ix), a
    bit 0, -12 (ix)
    jp  NZ,00398$
    jp  00137$

and works as expected.

Let me know if you need any other detail.

Discussion

  • alvin

    alvin - 2017-08-11

    Also reported in [#2632]

     

    Related

    Bugs: #2632


    Last edit: Maarten Brock 2017-10-17
  • sverx

    sverx - 2017-08-11

    wow, didn't see that :| it's definately that very same problem.

     
  • Philipp Klaus Krause

    • status: open --> closed-fixed
    • assigned_to: Philipp Klaus Krause
     
  • Philipp Klaus Krause

    This bug has been fixed a while ago.

    Philipp

     

Log in to post a comment.