Bizunow
> Кстати! Есть идея для тех, кто хочет потренироваться именно в рекомпиляции
> исполняемых файлов! Короче, вспомним про чип-8. Там всего то 35 команд, кто
> хорошо знает ассемблер тому не составит труда транслировать эти команды в х86
> ассемблер )
тут основная проблема не в рекомпиляции команд CPU, а внаверно, невозможности рекомпиляции игры "Х" без знания её архитектуры на целевое железо, так вот например NES игры зачастую жёстко завязаны на тайминги прерываний, V-Blank, H-Blank и много много чего. Каким образом это можно рекомпилировать?? Придётся _всёравно_ повторять работу системы - получаем эмулятор ). рекомпилировать можно частично - отдельно работу каждой из частей железа. А синхронизировать уже как в обычном эмуляторе. Если бы всё было так просто - давно были бы статические рекомпиляторы NES игр : ) Но где они? Нет _ни одного_
.L
>я какбэ в курсе что такое JIT )))
А х**е уже вторую страницу мне мозг выносиш?
>там динамическая рекомпилляция кода, НЕ интерпретация,практически тоже самое.
Ты хоть исходники смотрел?
// Rt = Rs + Im signed [exception on overflow] void ADDI() { s64 result = _add32_Overflow( cpuRegs.GPR.r[_Rs_].SD[0], _Imm_ ); if ( !_Rt_) return; cpuRegs.GPR.r[_Rt_].SD[0] = result; } // Rt = Rs + Im signed !!! [overflow ignored] // This instruction is effectively identical to ADDI. It is not a true unsigned operation, // but rather it is a signed operation that ignores overflows. void ADDIU( ) { if ( !_Rt_) return; cpuRegs.GPR.r[_Rt_].SD[0] = cpuRegs.GPR.r[_Rs_].SL[0] + _Imm_; } // Rt = Rs + Im [exception on overflow] // This is the full 64 bit version of ADDI. Overflow occurs at 64 bits instead // of at 32 bits. void DADDI( ) { s64 result = _add64_Overflow( cpuRegs.GPR.r[_Rs_].SD[0], _Imm_ ); if ( !_Rt_) return; cpuRegs.GPR.r[_Rt_].SD[0] = result; } // Rt = Rs + Im [overflow ignored] // This instruction is effectively identical to DADDI. It is not a true unsigned operation, // but rather it is a signed operation that ignores overflows. void DADDIU( ) { if ( !_Rt_) return; cpuRegs.GPR.r[_Rt_].UD[0] = cpuRegs.GPR.r[_Rs_].SD[0] + _Imm_; } void ANDI( ) { if ( !_Rt_) return; cpuRegs.GPR.r[_Rt_].UD[0] = cpuRegs.GPR.r[_Rs_].UD[0] & ( u64)_ImmU_; } // Rt = Rs And Im (zero-extended) void ORI( ) { if ( !_Rt_) return; cpuRegs.GPR.r[_Rt_].UD[0] = cpuRegs.GPR.r[_Rs_].UD[0] | ( u64)_ImmU_; } // Rt = Rs Or Im (zero-extended) void XORI( ) { if ( !_Rt_) return; cpuRegs.GPR.r[_Rt_].UD[0] = cpuRegs.GPR.r[_Rs_].UD[0] ^ ( u64)_ImmU_; } // Rt = Rs Xor Im (zero-extended) void SLTI( ) { if ( !_Rt_) return; cpuRegs.GPR.r[_Rt_].UD[0] = ( cpuRegs.GPR.r[_Rs_].SD[0] < ( s64)( _Imm_)) ? 1 : 0; } // Rt = Rs < Im (signed) void SLTIU( ) { if ( !_Rt_) return; cpuRegs.GPR.r[_Rt_].UD[0] = ( cpuRegs.GPR.r[_Rs_].UD[0] < ( u64)( _Imm_)) ? 1 : 0; } // Rt = Rs < Im (unsigned)
Если это не интерпритация, то я бэтмен, полюбому!
>так покажи класс ) Эмулируй же!!
А причём здесь я? Я не говориш что я могу написать лучше, я лиш сказал что PCSX2 далеко не ириска...
.L, насколько я знаю, в чип-8 нет такой жесткой привязки к железу к в денди. Глянь на англоязычной вики статью про чип-8, мож что еще интересного скажешь?
.L
Кстати время быстро тикает в Супер Марио, в остальных не смотрел.
Усе, работает ^_^
Wine 1.2.3. Полёт нормальный. Как заметил Nergal, всё немного быстро, но птеродактиля за яйца я всё-таки ухватил :)
Без OpenAL ругнулось, но запустилось.
В процессе игры вылетело пару сообщений
READ MEMORY 8 FOR IO IS NOT IMPLEMENTED!!!!
Жаль мой любимый Tom & Jerry не поддерживается.
Nergal
> Кстати время быстро тикает в Супер Марио, в остальных не смотрел.
есть несколько видов марио - с быстрой музыкой и с медленной 9если ты по ней судишь) А вообще может быстро тикает, потомучто я захардкодил всё на NTSC )
Igor'
> Ты хоть исходники смотрел?
да, КЭП
Igor'
> А х**е уже вторую страницу мне мозг выносиш?
Я тебе? Может наоборот всё? : )
Запускаю эмулятор:
хмм, что же это в логе??
Reserving memory for recompilers... SuperVU0 Recompiler Cache @ 0x0E800000 -> 0x0F000000 [8mb] SuperVU1 Recompiler Cache @ 0x0F000000 -> 0x0F800000 [8mb] Micro VU0 Recompiler Cache @ 0x3C000000 -> 0x40000000 [64mb] Micro VU1 Recompiler Cache @ 0x40000000 -> 0x44000000 [64mb] R5900-32 Recompiler Cache @ 0x30000000 -> 0x34000000 [64mb] R3000A Recompiler Cache @ 0x34000000 -> 0x36000000 [32mb] VIF0 Unpack Recompiler Cache @ 0x36000000 -> 0x36800000 [8mb] VIF1 Unpack Recompiler Cache @ 0x38000000 -> 0x38800000 [8mb]
Recompiler Cache O___O Прикинь, да! Вот дуракии, написали интерпретатор а память под кеш рекомпилятора выделили!
Открываем проектег ^__^ Идём по "папкам": pcsx2->System->Ps2->EmotionEngine->EE->Dynarec Что это за файлики такие? с префиксом i : ) А ты посмотри, посмотри...
>Если это не интерпритация, то я бэтмен, полюбому!
Кэп не намекает а уже дико кричит, что в эмуляторе есть как интерпретация так и рекомпиляция давным давно и можно юзать любое из них, но с интерпретацией игры вообще не играбельные, и что копирование тобой кода интерпретатора не отменяет наличие рекомпилятора : )
Dimich
> Без OpenAL ругнулось, но запустилось.
надо же о_О
Dimich
> Жаль мой любимый Tom & Jerry не поддерживается.
скоро будет : )
хе-хе... что-то последнее время мода на эмуляторы денди. Вот и x0000 занялся этим делом.
MarkoPolo
И ты начинай : )
Это не мое. (= Эмулировать что-то старое не хочется, а для чего-то нового ни навыка, ни мозгов не хватит.
А мне вот всегда что-то старенькое нравилось, хоть и не олд-фаг. С удовольствием сейчас бы в тетрис поиграл, жаль только нет под рукой...
.L
>Recompiler Cache O___O Прикинь, да!
Ещё бы он работал без кеша, ещё бы он занимался сразу рекомпиляцией и интерпритацией, это был бы всё, финиш...
Не ты всётаки посмотри исходники...
лучше ты посмотри ) а потом подумай - возможно ли с учетом адской архитектуры PS2 сделать лучше ;) И если ответишь "да" - какие будут предложения? :)) конкретные.
.L
>лучше ты посмотри ) а потом подумай - возможно ли с учетом адской архитектуры PS2 сделать лучше ;) И если ответишь "да" - какие будут предложения? :)) конкретные.
ок, слив засчитан.
Тема в архиве.