1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Патч игры «Аладдин» для Windows 95

Тема в разделе "Мастерская", создана пользователем Val07og, 19 апр 2014.

  1. Val07og

    Val07og

    Регистрация:
    1 апр 2008
    Сообщения:
    897
    Offtop
    AxXxB, я про вызов "004056FA call cs:GetTickCount => call sub_41CE40" - там же адрес заменяется из таблицы релокаций, и он приходится на 2-й байт адреса нового call.

    Разве что ОС вообще замену не делает, если базовый адрес совпадает, но везде ли это будет работать?

    У iunnamed заменённый вызов был относительный.
     
    Последнее редактирование: 21 апр 2014
    iunnamed и AxXxB нравится это.
  2. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Val07og, спасибо! Удалил из таблицы запись об этом адресе.
     

    Вложения:

    • ALADDINW.zip
      Размер файла:
      114,3 КБ
      Просмотров:
      71
    iunnamed и Val07og нравится это.
  3. Val07og

    Val07og

    Регистрация:
    1 апр 2008
    Сообщения:
    897
    Уважаемые товарищи модераторы, может, всё, начиная с моего первого сообщения, куда-нибудь в отдельную тему вынести, чтобы людей не смущать?
    А то к запуску игры программные вопросы имеют уже слабое отношение - надо было мне сразу отдельную тему создать где-нибудь в "Мастерской".

    ---------- Сообщение добавлено в 02:49 ---------- Предыдущее сообщение размещено в 02:44 ----------

    Пока не починим окончательно.
     
    iunnamed и AxXxB нравится это.
  4. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Offtop
    Хм, а ведь вызовы GetTickCount в новой функции абсолютные. Надо бы относительными сделать.
     
    iunnamed и Val07og нравится это.
  5. Val07og

    Val07og

    Регистрация:
    1 апр 2008
    Сообщения:
    897
    А если один из двух GetTickCount (там вроде можно одним обойтись) заменить на Sleep(14)?
    upd. Понял, тогда импорт новый придётся добавлять (способ, предложенный iunnamed, мне не очень нравится тем, что 60 раз в секунду будет загружаться/освобождаться библиотека).

    AxXxB, а относительные - это примерно так?
    Код:
    ...
      call _newProc ; заменяющий вызов
    _addr1:
    ...
    ; где-то по коду
    _addr2:
      call cs:GetTickCount ; абсолютный
    ...
    
    _newProc:
    pop eax
    mov eax,[eax+_addr2-_addr1+3]
    call eax
    ...
    jmp _addr1
    Торможу, там же jmp ds:GetTickCount есть в 41CC4E. :)

    upd2. AxXxB, и всё-таки без Sleep, наверное, не обойтись. Представляешь, с какой частотой будет вызываться GetTickCount в этом цикле ожидания? Получится совершенно ненужная загрузка ядра.
     
    Последнее редактирование: 21 апр 2014
    iunnamed и AxXxB нравится это.
  6. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Во, сделал со Sleep. LoadLibrary и GetProcAddress вызываются только раз. Вся работа с памятью относительная) Плюс убрана 100%-ая загрузка процессора при убирании фокуса с окна. Код
     

    Вложения:

    • ALADDINW.zip
      Размер файла:
      114,2 КБ
      Просмотров:
      44
    iunnamed и Val07og нравится это.
  7. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Offtop
    Ну это не так уж страшно. Практически все старые игры грузят процессор под 100%)
     
    iunnamed и Val07og нравится это.
  8. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Немного исправил свой быдлокод, ибо оказалось, что иногда вылетает, поскольку в функции Sleep1 (sub_41CFB1) не рассчитывался базовый адрес. Также пытаюсь исправить фуллскрин по Alt+Enter (изображение превращается в кашу) - пока нормально выглядит только при разрешениях, высота у которых меньше или равна 5/8 ширины :). С релоками разберусь попозже, когда сделаю более-менее нормально, отредактирую таблицу.
     

    Вложения:

    • ALADDINW.zip
      Размер файла:
      114,3 КБ
      Просмотров:
      57
    SAS, Val07og и iunnamed нравится это.
  9. iunnamed

    iunnamed

    Хелпер

    Регистрация:
    15 янв 2007
    Сообщения:
    1.235
    По идее, релоки только для dll-файлов нужны, а для приложений их можно вполне себе убрать:
    StripReloc.exe ALADDINW.EXE
    Т.к. они нужны в очень редких случаях, когда программа специально задумывалась для работы в двух режимах: и как приложение и как dll-библиотека одновременно.
     
    Val07og и AxXxB нравится это.
  10. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    iunnamed, я все-таки хочу оставить, вдруг через 20 лет кто-то будет делать что-то вроде KeeperFX :)
     
    iunnamed и Val07og нравится это.
  11. Val07og

    Val07og

    Регистрация:
    1 апр 2008
    Сообщения:
    897
    У меня вот что пока получилось: Посмотреть вложение AL95_fix.7z .
    • Вставил в таблицу импорта Sleep из kernel32.dll.
    • Переделал процедуру таймера 4056F2, чтобы GetTickCount вызывалась только один раз, а вместо второго вставил Sleep(16), таблицу релокаций соответственно поправил. Время задержки можно менять байтом dword'ом 4B23 - т. е. сейчас ~60 к/с. У меня с такой частотой кадров работает вроде бы хорошо.
    • Разобрался, почему не создавалось окно - использовался старый класс common controls "msctls_statusbar" (библиотека commctrl.dll), хотя сама игрушка подгружает библиотеку comctl32.dll, а в ней класс называется "msctls_statusbar32".
      В 95-м этот фокус прокатывал, возможно, потому, что старую библиотеку использовала сама система, и она в любом случае была загружена в память, а в XP - уже нет. Поменял название класса и вернул назад всё, связанное со строкой состояния - теперь она нормально создаётся:

      db86d789620ef2665169bbfce21f29b0.png
     
    Последнее редактирование: 23 апр 2014
    iunnamed и AxXxB нравится это.
  12. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    У меня медленнее. Особенно заметно, когда прыгаешь с веревки в сторону - гораздо дальше получается :)
    Круто! :)
     
    iunnamed и Val07og нравится это.
  13. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Вот переписал в твоем файлике sub_4056F2, воткнув туда свой цикл со Sleep. Релоки поправил.
     

    Вложения:

    • ALADDINW.zip
      Размер файла:
      114,1 КБ
      Просмотров:
      37
    iunnamed и Val07og нравится это.
  14. iunnamed

    iunnamed

    Хелпер

    Регистрация:
    15 янв 2007
    Сообщения:
    1.235
    Прикольно, теперь с нормальной скоростью даже в развёрнутом режиме работает - добежал до уровня "THE ESCAPE", где успешно просадил все жизни.
    Кое-что поправил:
    - вернул исправление "ALADDIN.INI" -> ".\SETUP.INI"
    - изменил проверку на 256 цветов - игра и так нормально работает (проверено в том числе и в Windows 7 x64) - теперь не будет запускаться только если меньше 256 цветов
     

    Вложения:

    • ALADDINW.zip
      Размер файла:
      107,1 КБ
      Просмотров:
      48
    Val07og и AxXxB нравится это.
  15. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    О, что 256 цветов больше не просит - круто)
    Добавил (в твой файл) в процедуру обработки сообщений код, который вызывает Sleep, если окно не в фокусе, чтобы ядро не грузилось на 100%, когда окно неактивно. Пытался сделать так раньше, но в результате Sleep вызывался только при потере фокуса один раз. Теперь нормально.
     

    Вложения:

    • ALADDINW.zip
      Размер файла:
      114,2 КБ
      Просмотров:
      44
    Val07og и iunnamed нравится это.
  16. Val07og

    Val07og

    Регистрация:
    1 апр 2008
    Сообщения:
    897
    iunnamed, а если игра будет запускаться из Program Files не от имени администратора, Виста/7/8+ даст сохранить настройки прямо в папку программы?

    Встроил предложенные исправления: Посмотреть вложение AL95_fix.7z .

    - По совету iunnamed включил полноцветные режимы, "ALADDIN.INI" пока оставил как есть.
    - По совету AxXxB поменял способ ожидания в таймере и вставил Sleep в цикл простоя (убрал лишний cmp, поэтому хватило места прямо там :)).
    - Немного упростил таймер, "msctls_statusbar32" перенёс в освободившееся место.

    Вроде разобрался, почему портится картинка в режиме "256 цветов" на вкладке "совместимость".
    При запуске игры в режиме совместимости сначала устанавливается 8-битный режим экрана и игра настраивает себя на 8 бит в окне, но после включения полного экрана (SetDisplayMode, 404F95, номера методов IDirectDraw есть тут), а потом возврата в окно RestoreDisplayMode (4050B6) восстанавливает не 8-битный режим, а обычный 16/24/32-битный. Но игра не знает, что режим восстановился неправильно, и копирует палитровую картинку на полноцветный экран.
    Если экран изначально был 8-битный (не из-за совместимости), он восстанавливается верно, и окно отображается без ошибки.
    Поэтому совместимость лучше не включать (она уже не требуется).
     
    iunnamed и AxXxB нравится это.
  17. Val07og

    Val07og

    Регистрация:
    1 апр 2008
    Сообщения:
    897
    У кого-нибудь ещё такой глюк наблюдается?
     
  18. Val07og

    Val07og

    Регистрация:
    1 апр 2008
    Сообщения:
    897
    Хм, погонял немного - всё-таки ощутимая разница есть (сверху - непатченная версия в Windows 95 на VirtualBox).
    Может кто-нибудь проверить на настоящем компе с Windows 95/98/ME, насколько близка скорость без патчей к верхней картинке? :)
    Чтобы было на что ориентироваться.

    a0c3139f2296435a81b7bd9466f7735d.gif

    Копия на postimg.org.
     
    Последнее редактирование: 28 апр 2014
  19. daemolisher

    daemolisher

    Регистрация:
    2 дек 2009
    Сообщения:
    1.704
    а может лучше вообще выкинуть любое упоминание функции Sleep (1) ?

    то есть вообще не использовать Sleep,

    а что бы задать паузу - использовать busy waiting

    - это по сути простейший цикл считающий, например, синусы до тех пор пока пройдёт достаточное время.


    вместо GetTickCount есть QPC, но имхо большая точность не нужна и сойдёт GetTickCount.
     
    Val07og нравится это.
  20. iunnamed

    iunnamed

    Хелпер

    Регистрация:
    15 янв 2007
    Сообщения:
    1.235
    Думаю, это нужно внести в памятку, если ещё нету, что старые игры на новых системах категорически запрещено ставить в "Program Files" / "Program Files (x86)" - там свои ограничения прав действуют, так что ничем хорошим это, как правило, не кончается.
    В %SystemRoot% (C:\Windows) тоже права ограничены, но даже если человек запустил игру из-под администратора, то искать, выковыривать и удалять оттуда при удалении игры файл настроек - удовольствие ниже среднего. С учётом того, что достаточно много игр пытаются сохранить туда настройки - свалка там будет ещё та.
    А так всё просто: поиграл, удалил, оставил только архив с игрой где-нибудь в игровых дистрибутивах, и ковыряться в системе, удаляя из неё мусор, не нужно.
     
    AxXxB и Val07og нравится это.
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление