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

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

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

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.133
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Сама функция tolower:
    Код:
    tolower_        proc near   
    cseg01:0008853F   cmp     eax, 41h // 'A', менял на 192 ('А') не сработало
    cseg01:00088542   jl      short locret_8854C
    cseg01:00088544   cmp     eax, 5Ah // 'Z', менял на 223 ('Я') не сработало
    cseg01:00088547   jg      short locret_8854C
    cseg01:00088549   add     eax, 20h 
    cseg01:0008854C locret_8854C:   
    cseg01:0008854C   retn
    cseg01:0008854C tolower_        endp
    
     
    Последнее редактирование: 19 май 2014
  4. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    jack7277, тебе нужна вот эта часть:
    это как раз и есть приведение к маленьким буквам.
     
  5. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Bato-San, это я понимаю. Я же говорю, пропатчил, чтобы не A-Z (65 - 90), а А-Я (192-223), и чето не сработало. Коды берутся от cp1251, непонятно.
     
  6. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    jack7277, блин. положи игру в отладчик. поставь бряк на этот кусок и посмотри, что прилетает в функцию. А то так можно гадать до бесконечности. Вот почему руссификация при помощи кейрусов не является наилучшим решением.
     
  7. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Замени на jl wc4_tolower().
    Не надо менять - пусть остаётся как есть, т.к. латиницу обрабатывать тоже надо (имена файлов, таблицы всякие и т.д.).
    Add:
    Кстати, не сработать могло ещё и если русские буквы выражены отрицательными числами ('A' - не 000000C0h, а FFFFFFC0h) - например, в результате расширения от al до eax movsx'ом.
     
    Последнее редактирование: 20 май 2014
    Val07og нравится это.
  8. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Может кто сталкивался, что за мусор у меня вылез слева-вверху?
    Он заполняет потихоньку все регистры.
    EAX и EBX не видно, туда какое-то говмусор постоянно пишется.

    [​IMG]

    Нашел обработчик, отладчиком гляну его позже, как с мусором разберусь. Спасибо A.P.$lasH и Рыжий Тигра
    Только не понял я, причем тут код 95, Z - это 90.
    Код:
    cseg01:00058900 sub_58900       proc near               ; CODE XREF: sub_59FE0+323p
    cseg01:00058900  cmp     eax, 32
    cseg01:00058903  jnz     short loc_5890D
    cseg01:00058905  movsx   eax, word ptr [edx+1090]
    cseg01:0005890C  retn
    cseg01:0005890D ; ---------------------------------------------------------------------------
    cseg01:0005890D
    cseg01:0005890D loc_5890D:                              ; CODE XREF: sub_58900+3j
    cseg01:0005890D  cmp     eax, 95
    cseg01:00058910  jnz     short loc_5891A
    cseg01:00058912  movsx   eax, word ptr [edx+1090]
    cseg01:00058919  retn
    cseg01:0005891A ; ---------------------------------------------------------------------------
    cseg01:0005891A
    cseg01:0005891A loc_5891A:                              ; CODE XREF: sub_58900+10j
    cseg01:0005891A  movsx   eax, word ptr [edx+eax*2+578]
    cseg01:00058922  retn
    cseg01:00058922 sub_58900       endp
    
     
    Последнее редактирование модератором: 19 июл 2015
  9. AxXxB неадекват

    AxXxB

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

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    По адресу [edx+578] лежит какой-то массив word'ов. Если в eax лежит код пробела (32) или подчеркивания (95), то берется последний word из массива, знаково расширяется до dword'a и кладется в eax. Если нет, то из массива берется word по индексу, лежащему в eax, так же знаково расширяется до dword'a и кладется в eax.

    Интересно, что же это за массив)
     
  10. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    AxXxB, подчерк, поленился посмотрел только в игровых шрифтах, увидел там пустоту, зачесал голову причем тут этот код. В скриптах он пробел заменяет.

    Народ, есть какой-нибудь простой способ состыковывать адреса в досбокс дебагере и ИДА ? Поиском байт, нахождение постоянного смещения, типа 1F000h и туда-сюда калькулятором вычитаешь-складываешь адреса.
    Медленно, дико раздражает.
     
  11. AxXxB неадекват

    AxXxB

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

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    jack7277, в IDA есть Edit > Segments > Rebase Program. Только если в образе нет таблицы релоков, все абсолютные адреса, применяющиеся в коде, IDA будет показывать старыми.
     
  12. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Вроде бы нашел. Игра использует старую версию stricmp, которая сравнивает введенную строку и содержимое файла скрипта, функция регистронезависимая для A-Za-z, поэтому одинаково срабатывает: MOM, Mom, mom, MoM и тд.
    Мысли такие, надо call сделать куда-нибудь в пустое место (или jmp far), дописать проверку кодов 192-224 (А-Я). и возврат назад.
    Забыл уже всё, надо найти код длинного jmp far, посчитать смещение, а код скопировать, расширить функционал.
    С keyrus ремап кодов с 866 на 1251 просто отлично вышло, иначе пришлось бы 6 шрифтов переделывать на 866, получилось бы долго. Галочку на будущее себе поставлю, если в дос игре есть ввод букв, то делать сразу 866 ))

    Чтобы выгадать место, я пожалуй код за работу с джойстиком сотру, всё равно не нужен он, мышка же.
    Функцию калибровки сотру int joystick::calibrate2(void).

    Как такое возможно? Забиваю в winhex всё NOP'ами (90h), сохраняю, гружу в IDA, вижу эти NOP'ы и вижу то, чего быть не должно, какие-то левые 4 байта, откуда они берутся?
    Код:
    cseg01:00014880  nop
    cseg01:00014881  nop
    cseg01:00014882  nop
    cseg01:00014883  js      short loc_148B0 <- откуда это?
    cseg01:00014885  or      al, 0           <- откуда это?
    cseg01:00014887  nop
    cseg01:00014888  nop
    cseg01:00014889  nop
    
     
    Последнее редактирование: 21 май 2014
  13. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Перемещаемая ссылка, по-аглицки relocate. В заголовке программы записано, что именно по этому адресу лежит какой-то адрес внутри программы (например, операндом команды) и надо бы в процессе загрузки его увеличить на адрес загрузки программы. Подробнее описано в, кажется, втором томе Касаткина.
     
    Val07og нравится это.
  14. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Рыжий Тигра, у меня 32х битный DOS LE файл. Куда копать?
     
  15. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    ХЗ. :-( Кинь архивом во вложение, я гляну.
     
  16. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Рыжий Тигра,
    В hex-редакторе по смещению 33C7Ah в .ехе файле я забил кучу NOP для теста.
    В IDA это cseg01:0001487B
    В dosbox debuger 1A0:25B45F там jmp far на NOP'ы.

    Не, я конечно могу ниже байт на 10 начать писать, но я такое первый раз вижу, прям не знал, что так может быть.
     

    Вложения:

    • Htest1.zip
      Размер файла:
      367,8 КБ
      Просмотров:
      22
    Последнее редактирование: 21 май 2014
  17. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    jack7277, для начала загляни в документацию по DOS-'экстендеру пришитому к файлу. Думаю что это окажется DOS4GW. Суть сводится к тому, что такие файлы состоят из двух частей:
    1. Экстендер
    2. Пришитый к нему файл программы в неком экзотическом формате (может быть не только LE, а вообще любой самопал).

    Призапуске такого файла стартует именно экстендер, а вот он уже распределяет память системы выше 1 мегабайта, формирует своп, если умеет и - грузит файл программы туда, по своим собственным правилам загрузки.

    Что из этого следует ? Из этого следует, что файл программы на диске в общем и целом имеет полное право не быть тем же самым, что файл загруженный в память. Почему ? Причин очень много. Это и выравнивание и загрузка в определённые адреса и перемещение секций файла и расширение секций в памяти до их реального размера и собственные варианты пакеров включенные в состав экстендеров и особенности самой программы, которая после запуска тоже может себя модифицировать.

    Поэтому и следует сперва читать документацию.
     
  18. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    (скептически) Открыыыл Америку. Последним форматом файла, который такого права не имел, был .com. :-(

    ---------- Сообщение добавлено в 01:27 ---------- Предыдущее сообщение размещено в 01:21 ----------

    jack7277, смотрю. Начало "старого стиля" - вполне себе 16-битный пускач для dos4gw, LE-часть - 32-битная, hiew умеет такие заголовки колоть, им копаю...

    ---------- Сообщение добавлено в 01:35 ---------- Предыдущее сообщение размещено в 01:27 ----------

    Глянь http://dos32a.narechk.net/manual/html/tech/3.htm от слов "When all the Objects are loaded into memory, they will be relocated" до примерно "32-bit Self-Relative Offset fixups".
     
  19. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Рыжий Тигра, (наставительно) Человек этого не знает, а любые объяснения следует начинать с начала. Ты, между прочим, полностью повторил мой пост в конце своего, только вот дико невразумительно. Эхехехе... не учатся ничему некоторые и учиться не хотят... (с) Сталкер

    Хорошо, хоть совету последовал, правда следует учитывать, что DOS32 тоже имел свои нюансы.
     
  20. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    "Чукча, ты не умничай, ты пальцем покажи" (L) :-)
     
  21. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    jack7277, вот эта запись:

    39A2: 07 10 83 08 03 78 2B 01 00

    Просто повтори одну из предыдущих и можно даже не удалять.

    Прикрепил исправленный файл.
     

    Вложения:

    • Htest2.zip
      Размер файла:
      374,6 КБ
      Просмотров:
      22
    Val07og, Butz, Рыжий Тигра и 2 другим нравится это.
  22. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Рыжий Тигра, ну, если бы я пальцем на документацию не показал - ты бы туда и не полез. :) А вообще, не вижу смысла тыкать пальцем в готовое решение, благо оно не всегда единственное (а когда единственное в него и тыкать нет смысла), что подразумевает что и лучшим может оказаться любое, в зависимости от конкретной ситуации. Проще подсказать "где копать". А уж что каждый сам себе выроет - могилку или котлован под фундамент, личное дело студента. :)
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление