Присоединяюсь. Браво! Даже не ожидал, что в наше время возможна разработка проекта такой сложности на чистом энтузиазме.
Сравнительно просто можно реализовать в Вашем компиляторе оптимизацию, которая встречается редко в каком компиляторе, сделанном не большой фирмой за финансирование. Способ основан на отслеживании кодогенератором состояния процессора: флагов, регистров и т.д. Имея и актуализируя после генерации каждой команды набор такой информации, легко встроить различные оптимизации: загрузки адресов, значений, опора на состояние флагов (ну раз значение точно известно) и т.д. Заведите “слово состояния процессора”, представляющее собой запись (структуру в Си-терминологии) состояния различных флагов, регистров и т.п., что будет выглядеть примерно так:
Теперь, допустим, нам по коду надо обнулить переменную var1. Делать мы это решили через засылку значения в неё из регистра A. Проверяем, а может в A уже ноль?Код: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;
Или надо загрузить в HL адрес переменной varB, а там загружен адрес varA, которые идут подряд (отличаются единичкой):Код: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");
Извиняюсь, если где перепутал мнемонику, давно для РК-86 не кодил.Код: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;
P.S. Игру в эмуле Башкирия-2М запустить удалось только в ч/б. Выбираю при старте цветной Апогей, но после открытия файла он упрямо переключается на ч/б (буковка Ц пропадает из заголовка). Что я делаю не так?





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