Разработка и ромхакинг > Ромхакинг
[NES] Ассемблер перевести в понятный код
teremochek:
Всем доброго времени суток. Поскольку узнал о существовании дизассемблированных игр, появился такой вопрос. Возможно ли Ассемблер перевести в высоко-уровневый, понятный код ? (Что-бы еще он работал) (хотя-бы частично)
Вот пример ассемблера ( Mario ):
--- Код: ---ProcFireball_Bubble:
lda PlayerStatus ;check player's status
cmp #$02
bcc ProcAirBubbles ;if not fiery, branch
lda A_B_Buttons
and #B_Button ;check for b button pressed
beq ProcFireballs ;branch if not pressed
and PreviousA_B_Buttons
bne ProcFireballs ;if button pressed in previous frame, branch
lda FireballCounter ;load fireball counter
and #%00000001 ;get LSB and use as offset for buffer
tax
lda Fireball_State,x ;load fireball state
bne ProcFireballs ;if not inactive, branch
ldy Player_Y_HighPos ;if player too high or too low, branch
dey
bne ProcFireballs
lda CrouchingFlag ;if player crouching, branch
bne ProcFireballs
lda Player_State ;if player's state = climbing, branch
cmp #$03
beq ProcFireballs
lda #Sfx_Fireball ;play fireball sound effect
sta Square1SoundQueue
lda #$02 ;load state
sta Fireball_State,x
ldy PlayerAnimTimerSet ;copy animation frame timer setting
sty FireballThrowingTimer ;into fireball throwing timer
dey
sty PlayerAnimTimer ;decrement and store in player's animation timer
inc FireballCounter ;increment fireball counter
--- Конец кода ---
Ti_:
Можно построчно переписать, или изучить че там происходит и написать более коротко.
ооп - это же 'объекты', они не нужны, чтобы переписывать.
Ну и ещё вариант есть переписать на асм_x86 и просто добавить в код. Так наверное легче будет, хотя может будет проблемы со связыванием.
При желании можно даже конвертор кода написать. Например существует конвертер кода (текста) из nes в smd, но глючноват, вот :
teremochek:
Вот на romhaking'e случайно нашел.
(by Movax12)
--- Код: ---.proc ProcFireball_Bubble
if PlayerStatus >= #2 ; check player's status; if fiery:
; if B button pressed AND not pressed last frame
if A_B_Buttons & #BUTTON_B && not a & PreviousA_B_Buttons
; if here then button pressed for fireball, check if it is okay to fire a new fireball:
mb x := FireballCounter & #%00000001 ; get LSB and use as offset for buffer
; if room for a new fireball (max two) AND Player not too high/ too low AND not crouching AND Not climbing vine
if !Fireball_State[ x ] && y := Player_Y_HighPos - 1 == zero && !CrouchingFlag && Player_State <> #3
mb Square1SoundQueue := #SFX_Fireball ; play fireball sound effect
mb Fireball_State[ x ] := #2 ; load state, $02 = new fireball
mb y, FireballThrowingTimer := PlayerAnimTimerSet ; copy animation frame timer setting into fireball throwing timer
mb PlayerAnimTimer := y - 1 ; decrement and store in player's animation timer
inc FireballCounter ; increment fireball counter
endif
endif
ldx #0
jsr FireballObjCore ; process first fireball object
ldx #1
jsr FireballObjCore ; process second fireball object, then do air bubbles
endif
; bubbles!
if lda AreaType == zero ; if not water type level, skip the rest of this
ldx #2 ; otherwise load counter and use as offset
repeat ; 2 to 0
stx ObjectOffset ; store offset
jsr BubbleCheck ; check timers and coordinates, create air bubble
jsr RelativeBubblePosition ; get relative coordinates
jsr GetBubbleOffscreenBits ; get offscreen information
jsr DrawBubble ; draw the air bubble
until dex == negative
endif
rts ; then leave
.endproc
--- Конец кода ---
Mr2:
--- Цитата: teremochek от 28 Февраля 2013, 19:59:46 ---Поскольку узнал о существовании дизассемблированных игр, появился такой вопрос.
--- Конец цитаты ---
Похоже нужно ещё узнать об ООП и вопрос будет закрыт. ^_^
teremochek:
--- Цитата: Mr2 от 01 Марта 2013, 11:16:50 ---Похоже нужно ещё узнать об ООП и вопрос будет закрыт. ^_^
--- Конец цитаты ---
Изменил название, что-бы не возникало лишних вопросов.
***
Посмотрел исходник. (Компилируется 3 минуты, на моем компе (x4 955) ).
В принципе многое понятно, но лучше знать, как все в NES устроено. А иначе компилируешь, ждешь и в конце ничего не получаешь.
Скорее всего если код перевести в любой удобный язык, то на много легче не станет, т.к. очень много функции. Все завязаны между собой. С таким кодом будет все-равно не удобно работать. Да-же не знаю, кто на это отважится...
Skay:
никто, только если вы сами не сядете за книжки и не начнете разбираться что и как.
Mr2:
--- Цитата: teremochek от 04 Марта 2013, 20:30:28 ---Изменил название, что-бы не возникало лишних вопросов.
--- Конец цитаты ---
Очень смешно. :cool:
Декомпилятор заколбасит хекс кашу в классы, приклеет функции члены, замутит полиморфизм, инкапсуляцию и наследование.
И бонусом откоментирует весь код....
--- Цитата: teremochek от 04 Марта 2013, 20:30:28 ---В принципе многое понятно, но лучше знать, как все в NES устроено.
--- Конец цитаты ---
А есть способ хакать не зная ассемблер и железо консоли?
--- Цитата: teremochek от 04 Марта 2013, 20:30:28 ---Скорее всего если код перевести в любой удобный язык, то на много легче не станет,
--- Конец цитаты ---
Как это ещё никто не додумался перевести в любой удобный язык и писать продолжение своей любимой игры. :ohmy:
Бедолаги всё с асмом заморачиваются. ;)
--- Цитата: teremochek от 04 Марта 2013, 20:30:28 ---т.к. очень много функции. Все завязаны между собой. С таким кодом будет все-равно не удобно работать.
--- Конец цитаты ---
Ищишь нужные переменные, определяишь функции использующии их, изучаешь работу функции, даёшь ей имя.
Повторяем процесс. А кто говорил что будет легко? :?
--- Цитата: teremochek от 04 Марта 2013, 20:30:28 ---Да-же не знаю, кто на это отважится...
--- Конец цитаты ---
Отважится на что?
SPOT:
--- Цитата: Ti_ от 28 Февраля 2013, 20:34:59 ---При желании можно даже конвертор кода написать. Например существует конвертер кода (текста) из nes в smd, но глючноват
--- Конец цитаты ---
Но есть видимо и более рабочие NES to SMD
gepar:
Так а что хочет автор? Можно ли перевести код из асма на что-то выскоуровневое - можно, хоть и на с++; будет ли оно работать после этого на нес - нет. Так что же хотел автор-то ? :)
Mr2:
--- Цитата: gepar от 05 Марта 2013, 21:57:37 ---Можно ли перевести код из асма на что-то выскоуровневое - можно, хоть и на с++; будет ли оно работать после этого на нес - нет.
--- Конец цитаты ---
Поподробнее пожалуйсто о способе.
Или ты имеешь в виду ручное переписывание с асма на C++?
Тогда ты неправильно понял тему.
--- Цитата: gepar от 05 Марта 2013, 21:57:37 ---Так что же хотел автор-то ? :)
--- Конец цитаты ---
Хотел и рыбку съесть и.... :blush:
gepar:
--- Цитата: Mr2 ---Поподробнее пожалуйсто о способе.
--- Конец цитаты ---
Ну так бери и переписывай на более высокоуровневый язык, я о таком методе, лол. Бери и разбирайся потихоньку типа :) Вон код хорошо прокомментированный, если переписать то точно выглядеть логика попроще будет.
А откуда комментарии к асм коду кстати? При дизасме по идее не должно было их остаться ...
Mr2:
--- Цитата: gepar от 05 Марта 2013, 22:06:59 ---Ну так бери и переписывай на более высокоуровневый язык, я о таком методе, лол.
--- Конец цитаты ---
Так автор темы хочет работать с высокоуровневым языком чтоб не заморачиваться с асмом, а в ручную переписывать это всёравно нужно асм знать.
--- Цитата: gepar от 05 Марта 2013, 22:06:59 ---А откуда комментарии к асм коду кстати? При дизасме по идее не должно было их остаться ...
--- Конец цитаты ---
Оттуда откуда и полиморфизм, инкапсуляцию и наследование. :lol:
Ti_:
--- Цитата: SPOT от 05 Марта 2013, 21:44:43 ---Но есть видимо и более рабочие NES to SMD
--- Конец цитаты ---
Эмуляция уже не то. Такой код уже нельзя будет изменить.
Добавлено позже:
--- Цитата: gepar от 05 Марта 2013, 21:57:37 ---Так что же хотел автор-то ? :)
--- Конец цитаты ---
Он хотел чтобы перевели и из-за этого стало более понятно :lol:
HayaoYokogawa:
В общем, есть высокоуровневый ассемблер NESHLA, погугли.
Насчет перевода в понятный код - такого не было и вряд ли будет.
Mr2:
Во чего CaH4e3 пишет:
--- Цитата ---Ипочти все игры для денди писались одним-
двумя программистами, максимум тремя. Иесли покопаться в коде некоторых игр, то видно сразу, что некотоыре кунштюки
компилятору просто не под силу - использование одних и тех же кусков кода для разных частей программы - укороченные
прыжки на RET опкоды соседних функций. Нет, там все писалось исключительно на ассемблере, максимум с макро-функциями.
Опять же, тайминги и порой острая нехватка памяти заставляют извращаться с опкодами, выдавливать тайминги в критичных
местах и экономить байтики. Этого даже современные компиляторы полноценно не умеют.
--- Конец цитаты ---
teremochek:
--- Цитата: gepar от 05 Марта 2013, 21:57:37 ---Так а что хочет автор? Можно ли перевести код из асма на что-то выскоуровневое - можно, хоть и на с++; будет ли оно работать после этого на нес - нет. Так что же хотел автор-то ? :)
--- Конец цитаты ---
Автор хотел бы иметь код на удобном ему языке.
А еще хорошо если кто-нибудь переведет пример. Хотя после того, как код обработал "Movax12", конкретно в этом примере почти все ясно. Хотелось бы понять, как избавится от Ассемблерных операторов и чем их заменить.
--- Цитата: gepar от 05 Марта 2013, 22:06:59 ---А откуда комментарии к асм коду кстати? При дизасме по идее не должно было их остаться ...
--- Конец цитаты ---
doppelganger'а - > Movax12
--- Цитата: HayaoYokogawa от 06 Марта 2013, 09:38:32 ---Насчет перевода в понятный код - такого не было и вряд ли будет.
--- Конец цитаты ---
Есть. Смотри третье сообщение.
Ti_:
--- Цитата: teremochek от 06 Марта 2013, 18:09:31 ---А еще хорошо если кто-нибудь переведет пример.
Хотелось бы понять, как избавится от Ассемблерных операторов и чем их заменить.
--- Конец цитаты ---
Ну так сойдет? :
--- Код: ---x=0x14; // ldx #$14
a=[mem+0x10] ; // lda $10
function_324(); // jsr function_324
a=x; // txa
[mem+0x20]=a; // sta $20
a=a&0xF; // and #$F
if (a==0x18) // cmp #$18
goto label_4444; // beq label_4444
x=x-1; // dex
--- Конец кода ---
teremochek:
--- Цитата: Ti_ от 06 Марта 2013, 18:44:57 ---Ну так сойдет? :
--- Код: ---x=0x14; // ldx #$14
a=[mem+0x10] ; // lda $10
function_324(); // jsr function_324
a=x; // txa
[mem+0x20]=a; // sta $20
a=a&0xF; // and #$F
if (a==0x18) // cmp #$18
goto label_4444; // beq label_4444
x=x-1; // dex
--- Конец кода ---
--- Конец цитаты ---
Спасибо.
Такое предложение. Давайте таким образом разберем целиком Proc ProcFireball_Bubble.
Будет полезно и познавательно для многих.
sergi:
Самое забавное что мне всегда казалось что именно ассемблер или даже сами машинные коды и есть самый понятный код, где сразу видно что процессор должен делать :-\
teremochek:
как перевести
x = FireballCounter & #%00000001
что за "x" в скобках, это массив ?
Fireball_State[ x ]
как перевести и понять
y = Player_Y_HighPos - 1 == zero
как перевести
y, FireballThrowingTimer = PlayerAnimTimerSet
как перевести
if lda AreaType == zero
предположу как перевести это
until dex == negative
x = x - 1
until x == negative
Навигация
Перейти к полной версии