Присоединяюсь. Браво! Даже не ожидал, что в наше время возможна разработка проекта такой сложности на чистом энтузиазме.

Сравнительно просто можно реализовать в Вашем компиляторе оптимизацию, которая встречается редко в каком компиляторе, сделанном не большой фирмой за финансирование. Способ основан на отслеживании кодогенератором состояния процессора: флагов, регистров и т.д. Имея и актуализируя после генерации каждой команды набор такой информации, легко встроить различные оптимизации: загрузки адресов, значений, опора на состояние флагов (ну раз значение точно известно) и т.д. Заведите “слово состояния процессора”, представляющее собой запись (структуру в Си-терминологии) состояния различных флагов, регистров и т.п., что будет выглядеть примерно так:
Код:
TYPE
  FlagStatus = SET; (* Off, On, Unknown *)

VAR
  cpuStat = RECORD
    flagZ, flagC, flagM ... : FlagStatus; (* Статус флагов *)
    regA, regB, regC ... : BOOLEAN; (* Есть ли в регистре точно известное значение? *)
    regA_val, regB_val, regC_val ... : INTEGER; (* Если оно есть, то значение RegX_val имеет смысл *)
  END;
Теперь, допустим, нам по коду надо обнулить переменную var1. Делать мы это решили через засылку значения в неё из регистра A. Проверяем, а может в A уже ноль?
Код:
IF regA & (regA_val = 0) THEN
  (* Можно не генерировать обнуление, т.к. в A остался ноль, сформированный предыдущим кодом... *)
ELSE
  Gen("XRA A");
  (* Теперь скорректируем состояние процессора, вызванное командой XRA A *)
  cpuStat.flagZ := On; cpuStat.regA := TRUE; cpuStat.regA_val := 0; ...
END;
Gen("STA var1");
Или надо загрузить в HL адрес переменной varB, а там загружен адрес varA, которые идут подряд (отличаются единичкой):
Код:
IF regHL & (regHL_val = varA_addr) THEN
  (* Можно не генерировать установку адреса, он уже там... *)
ELSIF regHL & (regHL_val = varA_addr + 1) THEN (* Адрес в HL, но он на единицу меньше, чем надо *)
  Gen("INX H");
ELSIF regHL & (regHL_val = varA_addr - 1) THEN (* Адрес в HL, но он на единицу больше, чем надо *)
  Gen("DCX H");
ELSE (* Что ни пробовали, но таки надо грузить адрес в HL... *)
  Gen("LXI H, varA");
END;
Извиняюсь, если где перепутал мнемонику, давно для РК-86 не кодил.

P.S. Игру в эмуле Башкирия-2М запустить удалось только в ч/б. Выбираю при старте цветной Апогей, но после открытия файла он упрямо переключается на ч/б (буковка Ц пропадает из заголовка). Что я делаю не так?