| Разработка и ромхакинг > Ромхакинг и программирование |
| [NES] Ассемблер перевести в понятный код |
| (1/3) > >> |
| 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 |
| Навигация |
| Главная страница сообщений |
| Следующая страница |