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

Перейти к полной версии