Wake of Gods Forum | Форум Во Имя Богов

Full Version: ERA II
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
etoprostoya, поясни пожалуйста фразу "Сопроцессор меняет float и double". Пользовательский код указывает размерность того, что кладём в регистры. В сопроцессоре можно точность установить насильно, но ведь плагинам и некоторым функциям это может сильно не понравится. Главное, что геройский код использует single-ы.
Сопроцессор обрабатывает 80-битные числа с плавающей запятой. Не важно, вводишь ты 32-битный float или 64-битный double - это только на входе и выходе.
Если плагин будет использовать 64-битные double (хотя не вижу в этом смысла), то перед их использованием необходимо будет вызывать _control87(_PC_53, _MCW_PC), а после испоьзования _control87(_PC_24, _MCW_PC). Чтобы геройский код работал по-прежнему. Не при инициализации и деинициализации (attach, detach), а в той же функции, где идёт обработка чисел с плавающей запятой.
Я, конечно, это не проверял, но так, по-моему, должно быть.

Вообще, рекомендую в плагинах использовать SSE и SSE2, которые поддерживаются с 2000 года всеми процессорами и Виндами не младше 2000 (насчёт Линукса не знаю - их много). Это поможет избежать путаницы, да и в разы проще.
Да ну! ПустьTWord-ы и обрабатывает, как по умолчанию. Никаких драконовских установок в контрольное слово не нужно. Его вообще менять не нужно. Куча библиотек на это не расчитана. Герои сами выбирают, в каком формате данные класти и грузить (fld, fst). Поэтому в Эру нужно просто добавить обработку e-переменных и 4 новых соглашения о вызове с типом возврата: single.
Ну, это понятно, просто вопрос был об использовании double. Вот я и описал, как его использовать ВНУТРИ плагина. Кто его знает, может кто захочет заняться высокоточными астрологическими расчётами =) вместо банальных недель монстров.
Без проблем прикручу астрокалендарь. Но ведь это не Земля... Там и планеты другие.
Что сделал. Доработал SDK для Паскаля и СИ++. Добавил обработку e-переменных Эрой. Добавил ещё 4 соглашения, когда результат с плавающей запятой помещается в e1. Добавил функцию GetGameState, чтобы знать, в каком мы меню (важно для событий клавиатуры). Собираюсь ещё разрешить клавишные события для плагинов везде, что позволит вызывать диалоги и вообще полноценно работать ещё без загрузки карты. Ну и для ЕРМ модуль ля работы с памятью.
Думаю над форматом руководства. Буду искать добровольца для перевода на английский. Обычно Драколич спасает + помощь Valery/Jim.
Quote: Вот я и описал, как его использовать ВНУТРИ плагина.
Внутри плагина обычный сишный/паскалевский код. О том, что там у FPU - пусть у компилятора ядро болит.
Паскалевский код, наверняка, будет такой, что будет только инициализация FPU для работы с double, а деинициализации не будет и весь код Героев не будет работать либо с момента подключения плагина (attach) либо с момента первого вызова функций плагина. Но это надо проверять.
дык если даже и так, асм вставкой деинициализации в плагине решится проблема.
Ну, феанор, например, не собирается делать никаких ассемблерных вставок.

Я, по-прежнему не думаю, что кому-то понадобится использовать double в своих плагинах. Нужно просто предупредить, что двойную точность использовать не рекомендуется - этого хватит.

Точнее, двойную точность в FPU. SSE2 и более поздние использовать-то можно. Правда, упоминание об этом может только запутать Sm
Единственное, где я использовал плавающие числа в ERM - это было определение клеток, попадающих и не попадающих в круг определённого радиуса.
Другое применение даже придумать трудНО, чтоб это было не за уши притянуто...
etoprostoya, по-моему ты что-то абсолютно не то говоришь. Герои не меняют точность вычислений (контрольное слово сопроцессора). Никак. И поэтому плагин может использовать 10-байтовые extended-ы или 8-байтовые double-ы смело.
Возвратил real, возвратил double из плагина, ничего страшного.
Вот первый попавшийся пример:
Code:
0061FA1E:   fnstcw   word ptr [esp+34h]; сохраняет предыдущее состояние
  0061FA22:   mov       eax,dword ptr [esp+34h];
  0061FA26:   or          eax,300h; ставит точность 80-бит
  0061FA2B:   mov       dword ptr [esp+38h],eax;
  0061FA2F:   fldcw     word ptr [esp+38h]; загружает контрольное слово с новой точностью
  0061FA33:   fmul       qword ptr ds:[006901ACh]; умножение с высокой точностью
  0061FA39:   fldcw      word ptr [esp+34h]; загружает предыдущее состояние.
А ты говоришь, не меняет контрольное слово) Да там несколько десятков мест, где оно изменяется - но в основном это, похоже, контроль ошибок и округления.

P.S. Кстати, портировал плагин Семёна в MSVC 2008. Но пока ещё практически не тестил.
Подожди-ка. В приведённом коде всё по правилам - если хочешь менять контрольное слово, то сохрани и восстанови. Для всего внешнего мира слово не меняется! Поэтому никак на точность это не влияет.

Добавил поддержку длинных команд: !!SN:Av2/z2/?v3 Ev3/4;
Reference URL's