Current time: 24.03.2024, 09:00 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
ERA II
» WoG Era 2: Русская и Английская версии
Author Message
Berserker Offline
Administrators

Posts: 16449
Post: #121

etoprostoya, поясни пожалуйста фразу "Сопроцессор меняет float и double". Пользовательский код указывает размерность того, что кладём в регистры. В сопроцессоре можно точность установить насильно, но ведь плагинам и некоторым функциям это может сильно не понравится. Главное, что геройский код использует single-ы.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
16.07.2011 19:08
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #122

Сопроцессор обрабатывает 80-битные числа с плавающей запятой. Не важно, вводишь ты 32-битный float или 64-битный double - это только на входе и выходе.
Если плагин будет использовать 64-битные double (хотя не вижу в этом смысла), то перед их использованием необходимо будет вызывать _control87(_PC_53, _MCW_PC), а после испоьзования _control87(_PC_24, _MCW_PC). Чтобы геройский код работал по-прежнему. Не при инициализации и деинициализации (attach, detach), а в той же функции, где идёт обработка чисел с плавающей запятой.
Я, конечно, это не проверял, но так, по-моему, должно быть.

Вообще, рекомендую в плагинах использовать SSE и SSE2, которые поддерживаются с 2000 года всеми процессорами и Виндами не младше 2000 (насчёт Линукса не знаю - их много). Это поможет избежать путаницы, да и в разы проще.
16.07.2011 20:13
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #123

Да ну! ПустьTWord-ы и обрабатывает, как по умолчанию. Никаких драконовских установок в контрольное слово не нужно. Его вообще менять не нужно. Куча библиотек на это не расчитана. Герои сами выбирают, в каком формате данные класти и грузить (fld, fst). Поэтому в Эру нужно просто добавить обработку e-переменных и 4 новых соглашения о вызове с типом возврата: single.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
16.07.2011 20:35
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #124

Ну, это понятно, просто вопрос был об использовании double. Вот я и описал, как его использовать ВНУТРИ плагина. Кто его знает, может кто захочет заняться высокоточными астрологическими расчётами =) вместо банальных недель монстров.
16.07.2011 21:18
Find all posts by this user Quote this message in a reply
hippocamus Offline

Posts: 517
Post: #125

Без проблем прикручу астрокалендарь. Но ведь это не Земля... Там и планеты другие.


-= подпись Гиппокамуса =-
16.07.2011 23:07
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #126

Что сделал. Доработал SDK для Паскаля и СИ++. Добавил обработку e-переменных Эрой. Добавил ещё 4 соглашения, когда результат с плавающей запятой помещается в e1. Добавил функцию GetGameState, чтобы знать, в каком мы меню (важно для событий клавиатуры). Собираюсь ещё разрешить клавишные события для плагинов везде, что позволит вызывать диалоги и вообще полноценно работать ещё без загрузки карты. Ну и для ЕРМ модуль ля работы с памятью.
Думаю над форматом руководства. Буду искать добровольца для перевода на английский. Обычно Драколич спасает + помощь Valery/Jim.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
17.07.2011 04:16
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 622
Post: #127

Quote: Вот я и описал, как его использовать ВНУТРИ плагина.
Внутри плагина обычный сишный/паскалевский код. О том, что там у FPU - пусть у компилятора ядро болит.
17.07.2011 10:17
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #128

Паскалевский код, наверняка, будет такой, что будет только инициализация FPU для работы с double, а деинициализации не будет и весь код Героев не будет работать либо с момента подключения плагина (attach) либо с момента первого вызова функций плагина. Но это надо проверять.
17.07.2011 10:44
Find all posts by this user Quote this message in a reply
baratorch Offline

Posts: 197
Post: #129

дык если даже и так, асм вставкой деинициализации в плагине решится проблема.
(This post was last modified: 17.07.2011 12:11 by baratorch.)
17.07.2011 12:11
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #130

Ну, феанор, например, не собирается делать никаких ассемблерных вставок.

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

Точнее, двойную точность в FPU. SSE2 и более поздние использовать-то можно. Правда, упоминание об этом может только запутать Sm
(This post was last modified: 17.07.2011 12:18 by etoprostoya.)
17.07.2011 12:17
Find all posts by this user Quote this message in a reply
hippocamus Offline

Posts: 517
Post: #131

Единственное, где я использовал плавающие числа в ERM - это было определение клеток, попадающих и не попадающих в круг определённого радиуса.
Другое применение даже придумать трудНО, чтоб это было не за уши притянуто...


-= подпись Гиппокамуса =-
17.07.2011 12:36
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #132

etoprostoya, по-моему ты что-то абсолютно не то говоришь. Герои не меняют точность вычислений (контрольное слово сопроцессора). Никак. И поэтому плагин может использовать 10-байтовые extended-ы или 8-байтовые double-ы смело.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
17.07.2011 17:17
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #133

Возвратил real, возвратил double из плагина, ничего страшного.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
17.07.2011 17:49
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #134

Вот первый попавшийся пример:
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. Но пока ещё практически не тестил.
(This post was last modified: 17.07.2011 18:14 by etoprostoya.)
17.07.2011 18:10
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #135

Подожди-ка. В приведённом коде всё по правилам - если хочешь менять контрольное слово, то сохрани и восстанови. Для всего внешнего мира слово не меняется! Поэтому никак на точность это не влияет.

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


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
17.07.2011 18:15
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group