Так вот оно что, я только количество PUSH и POP проверил, совпадало. Т.е., получается команды
JP NC,626DH ;6262 D26D62
POP DE ;6265 D1
нужно поменять местами?

- - - Добавлено - - -

Чуть позже попробую.

- - - Добавлено - - -

Andrew771, нашли ошибку.
Код, который нашёл Reobne соответствует участку в сгенерированном asm:
Код:
L16
L17
      ld    hl,(_GGX)
      push  hl
      ld    hl,5
      ld    de,29
      ex    de,hl
      and   a
      sbc   hl,de
      jp    nc,L18
      pop   de
      add   hl,de
L19
      ld    hl,24
      ld    (_GGX),hl
и его исходный код на паскале:
Код:
    if ggx+5>29 then
      ggx:=29-5;
Я-то попробую попроще написать, но ошибка налицо.

- - - Добавлено - - -

Переделал на
Код:
    if ggx>29-5 then
      ggx:=29-5;
теперь генерирует
Код:
L16
L17
      ld    hl,(_GGX)
      ld    de,29
      ex    de,hl
      and   a
      sbc   hl,de
      jp    nc,L18
      ld    de,5
      and   a
      sbc   hl,de
L19
      ld    hl,24
      ld    (_GGX),hl
что тоже неправильно, потому что надо сравнивать сразу с 24, а 5 вообще не к месту. В общем, ошибка при вычислении выражений в условии.

Ещё раз переделал на
Код:
    if ggx>24 then
      ggx:=24;
Теперь, вроде, правильно сгенерировал код. Единственное, осталось непонятно, зачем загружать не в нужные регистры и затем обменивать их содержимое для сравнения.

- - - Добавлено - - -

Ещё есть пожелание программу завершать не "jp $", а просто "ret".

- - - Добавлено - - -

Нарушен порядок вычисления выражений. Написал if (ggx+5)>29 then ggx:=29-5; и тоже правильно сгенерировал код, загрузил переменную, добавил к ней 5 и сравнил с 29. Надо чтобы сначала вычислялись выражения, затем проводилось сравнение.