Так вот оно что, я только количество 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;
что тоже неправильно, потому что надо сравнивать сразу с 24, а 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
Ещё раз переделал на
Теперь, вроде, правильно сгенерировал код. Единственное, осталось непонятно, зачем загружать не в нужные регистры и затем обменивать их содержимое для сравнения.Код:if ggx>24 then ggx:=24;
- - - Добавлено - - -
Ещё есть пожелание программу завершать не "jp $", а просто "ret".
- - - Добавлено - - -
Нарушен порядок вычисления выражений. Написал if (ggx+5)>29 then ggx:=29-5; и тоже правильно сгенерировал код, загрузил переменную, добавил к ней 5 и сравнил с 29. Надо чтобы сначала вычислялись выражения, затем проводилось сравнение.




Ответить с цитированием