Войти
ФлеймФорумПрограммирование

Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++) (11 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 110 11 12 13 14 Следующая »
#150
15:41, 18 авг. 2021

Перенёс код игры со всеми исправлениями на C6745.  Уже пошёл титульник игры,  но до самой игры, увы, пока далеко:  отсутствуют враги, туннель,  корабль игрока отрисовывается в виде точек и не текстурируется.

Корифеи C/C++ говорили нам о переносимости C-кода.  На практике вижу, что нужно допиливать - на каждой платформе вылазит какая-нибудь жопа...

1 | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++)

#151
17:11, 18 авг. 2021

Gradius
> 2) следить за библиотечными функциями и не допускать в них нарушение выравнивания - заменять на свои
Это плохой совет. Проблемы со штатным memcpy говорят о том, что у тебя осталось UB. Лучше исправить ошибку, чем пытаться заменить язык на нестандартный диалект.

#152
(Правка: 17:22) 17:22, 18 авг. 2021

}:+()___ [Smile]
> Это плохой совет. Проблемы со штатным memcpy

Это не штатный memcpy. Это memcpy, не следующий стандарту на эту функцию - копировать побайтно, если адрес не выровнен.

}:+()___ [Smile]
> говорят о том, что у тебя осталось UB.
> Лучше исправить ошибку, чем пытаться заменить язык на нестандартный диалект.

Уже давно всё сделано и работает: https://gamedev.ru/flame/forum/?id=262348&page=10&m=5434017#m149

Доступы к невыровненным данным фиксятся через перегрузку операторов и заменяются на побайтное копирование. Нет тут никакого UB уже.

#153
18:10, 18 авг. 2021

Gradius

А MMU у тебя настраивается как-нибудь?

#154
(Правка: 4:54) 4:44, 26 авг. 2021

Ghost2
> А MMU у тебя настраивается как-нибудь?

На ARM без MMU кеш данных не работает.
У меня включен MMU и PA = VA

На DSP участки памяти тоже прокешированы MAR-регистрами.
ЕМНИП, трансляции адресов там нет.  Поэтому используются только PA.

Gradius
> Уже пошёл титульник игры, но до самой игры, увы, пока далеко: отсутствуют
> враги, туннель, корабль игрока отрисовывается в виде точек и не
> текстурируется.

Проблема была в падении программы из-за неправильного вызова функций sprintf по вине декомпилятора Hex-rays.
Обычные вызовы sprintf, он зачем-то превратил в наркоманский типкаст:

((void (*)(char *, char *))sprintf)(v3, aCongratulation_1);

Из-за этого имена файлов формировались неверно. Переправил:

sprintf(v3, aCongratulation_1);

Сразу всё заработало.

Работы по портированию игры Tube на DSP C6745 успешно завершены:

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

Хочется поблагодарить всех, кто был неравнодушен к данной теме и особенно тех, кто помог и оказал влияние на развитие проекта в целом!

Напоследок, вынесу пару перлов, которые подняли мне настроение и мотивировали довести начатое до конца:

2 | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++)
3 | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++)
lol | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++) Жду Нобелевской премии и сертификата, подтверждающего наличие титановой задницы lol | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++)


В настоящее время, ведутся попытки адаптации кода игры на 64-битную архитектуру.
Но ничего не обещаю!

Проблемы с которыми я столкнулся и их решение подробно расписал здесь:
https://gamedev.ru/code/forum/?id=263319&m=5437710#m0

P.S.
Обновил исходный код игры (фикс алиасинга указателей и обращения к невыровненным данным):

https://github.com/rep-stosw/tube-game-dos

#155
(Правка: 13:10) 12:59, 26 авг. 2021

Gradius
> Жду Нобелевской премии и сертификата, подтверждающего наличие титановой задницы
А, может это "всё" из-за титановых/золотых/платиновых яиц? :)

@ "Снесла Курочка-ряба яйцо деду - начисто"

P.S. Может, с такими успехами, "восстановить" IDA pro? :)

#156
(Правка: 14:03) 13:21, 26 авг. 2021

Я бы не связывал выхлоп компилятора бородатого года под DOS и фразу "после тяжело оптимизирующего компилятора", так что сертификат выдаём, а Нобелевку пока откладываем.

#157
16:51, 26 авг. 2021
haha | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++)
#158
16:58, 26 авг. 2021

правда то что получилось как по мне ближе к ретрансляции чем к декомпиляции, я надеялся увидеть нечто такое

#159
6:36, 27 авг. 2021

KPG
> А, может это "всё" из-за титановых/золотых/платиновых яиц? :)

Обычно про яйца  вспоминают, когда хотят подчеркнуть, что у их обладателя крепкие нервы. :)

entryway
> Я бы не связывал выхлоп компилятора бородатого года под DOS и фразу "после
> тяжело оптимизирующего компилятора", так что сертификат выдаём, а Нобелевку
> пока откладываем.

Это в Паскале нет и не было оптимизации.  В ватком С она сделана очень хорошо.  Так что вопрос получения нобелевки оставляю открытым! :)

baga
> правда то что получилось как по мне ближе к ретрансляции чем к декомпиляции, я
> надеялся увидеть нечто такое

Есть и такое - звуковая система - писал самостоятельно + подрубил плеер HMP:

https://github.com/rep-stosw/tube-game-dos/tree/main/TubePCWEB/Sound

https://github.com/rep-stosw/tube-game-dos/tree/main/TubePCWEB/Music

P.S.
За сертификат - спасибо! :)

#160
(Правка: 10:05) 10:05, 27 авг. 2021

Очередной "бред наркомана" от Hex-rays.
Выловлено с помощью MinGW64.

unsigned short v77;  //16 bit

if ( v77 - 0x8000 > v77 ) 
{
 //...
}

if ( v77 + 0x8000 < v77 )
{
 //...
}

Основная мысль:  иногда разность может быть больше уменьшаемого.  А сумма меньше слагаемого.  Из-за переполнения беззнакового типа, которое тут используется. 

Я зову это - "кольцевой арифметикой".  Которая основана на переполнениях.

Переписал условия в более человечном виде:

if ( v77 < 0x8000 ){}

if ( v77 >= 0x8000 ){}
#161
(Правка: 14:14) 14:04, 27 авг. 2021

Gradius
> Это в Паскале нет и не было оптимизации. В ватком С она сделана очень хорошо.
Позднее может и стало хорошо, а в бородатые времена на уровне ранних делфи как раз и было, если не хуже. Я это помню по дизасму doom, он простой как три копейки, больше на трансляцию построчную похоже, а не на то что сейчас компиляторы вытворяют.

Если что, я в watcom не спец, но вот только что не поленился, скачал и установил watcom 8.5. Смотрю справку:
WCL386.EXE
/ox maximum optimization (/oil /s)

Окей, пишу код.

#include <stdio.h>
int main(int argc, char *argv[]) {
  int x = 0;
  x = !x;
  if(x) {
    printf("asd\n");
  }else{
    printf("qwe\n");
  }
  return 0;
}

Компилирую: wcl386 /ox a.cpp. Правильно всё делаю? Выхлоп:

+ Показать

На всякий случай попробовал "/os optimize for space" и "/ot optimize for time" - тоже самое.

#162
14:27, 27 авг. 2021

entryway
> Если что, я в watcom не спец, но вот только что не поленился, скачал и
> установил watcom 8.5. Смотрю справку:
> WCL386.EXE
> /ox maximum optimization (/oil /s)

Я тоже не поленился и скомпилировал вашу программу на двух опциях.

1) без оптимизации:

+ Показать

2. С оптимизацией:

.387
.386p
.model flat
    PUBLIC  main_
    EXTRN  printf_:BYTE
    EXTRN  __argc:BYTE
    EXTRN  _cstart_:BYTE
DGROUP    GROUP  CONST,CONST2,_DATA
_TEXT    SEGMENT  PARA PUBLIC USE32 'CODE'
_TEXT    ENDS
CONST    SEGMENT  DWORD PUBLIC USE32 'DATA'
L$1:
    DB  61H, 73H, 64H, 0aH, 0, 71H, 77H, 65H
    DB  0aH, 0

CONST    ENDS
CONST2    SEGMENT  DWORD PUBLIC USE32 'DATA'
CONST2    ENDS
_DATA    SEGMENT  DWORD PUBLIC USE32 'DATA'
_DATA    ENDS
_TEXT    SEGMENT  PARA PUBLIC USE32 'CODE'
    ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP
main_:
    push        offset FLAT:L$1 
    call        near ptr FLAT:printf_ 
    add         esp,4 
    xor         eax,eax 
    ret         
_TEXT    ENDS
    END

Список команд с ключами:

cd C:\WATCOM\test
wmake -f C:\WATCOM\test\test.mk -h -e -a C:\WATCOM\test\*.obj
wcc386 test.c -i="C:\WATCOM/h" -w4 -e25 -zq -otexan -s -ob -oc -oi -zm -6r -bt=dos -fo=.obj -mf
Execution complete
#163
(Правка: 15:26) 14:30, 27 авг. 2021

Gradius
Это у тебя какой ватком? Мой такие ключи не умеет. Ну да и без разницы. Версия 8.5 как бы, не 1.0, а просто элементарнейшая оптимизация не работает, ну или я что-то не так сделал, покажи как надо.

Наверное надо было 9 ставить, им же компилили в то время как раз. Но не нашел удобной инсталяхи.

--
Проверил на 9.5. У него, в отличии от 8.5, всё ок конкретно с этим примером.

#164
15:49, 27 авг. 2021

entryway
> Проверил на 9.5. У него, в отличии от 8.5, всё ок конкретно с этим примером.

В отладочной инфе игры (оригинал) есть упоминание, что использовался 10-й ватком.

Ну и к тому же, я не думаю, что программисты из Bullfrog писали игры на плохих компиляторах.

1 | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++)

Страницы: 110 11 12 13 14 Следующая »
ФлеймФорумПрограммирование