Автор Тема: [NES] Ассемблер перевести в понятный код  (Прочитано 17377 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн teremochek

  • Пользователь
  • Сообщений: 92
    • Просмотр профиля
Всем доброго времени суток. Поскольку узнал о существовании дизассемблированных игр, появился такой вопрос. Возможно ли Ассемблер перевести в высоко-уровневый, понятный код ? (Что-бы еще он работал) (хотя-бы частично)

Вот пример ассемблера ( 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
« Последнее редактирование: 04 Март 2013, 20:19:12 от teremochek »

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Ассемблер перевести в ООП
« Ответ #1 : 28 Февраль 2013, 20:34:59 »
Можно построчно переписать, или изучить че там происходит и написать более коротко.
ооп - это же 'объекты', они не нужны, чтобы переписывать.

Ну и ещё вариант есть переписать на асм_x86 и просто добавить в код. Так наверное легче будет, хотя может будет проблемы со связыванием.   
При желании можно даже конвертор кода написать. Например существует конвертер кода (текста) из nes в smd, но глючноват, вот :
« Последнее редактирование: 28 Февраль 2013, 20:43:28 от Ti_ »

Оффлайн teremochek

  • Пользователь
  • Сообщений: 92
    • Просмотр профиля
Re: [NES] Ассемблер перевести в ООП
« Ответ #2 : 01 Март 2013, 10:32:14 »
Вот на 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

  • Пользователь
  • Сообщений: 1592
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: [NES] Ассемблер перевести в ООП
« Ответ #3 : 01 Март 2013, 11:16:50 »
Поскольку узнал о существовании дизассемблированных игр, появился такой вопрос.
Похоже нужно ещё  узнать об ООП  и вопрос будет закрыт. ^_^




« Последнее редактирование: 01 Март 2013, 12:14:16 от Mr2 »

Оффлайн teremochek

  • Пользователь
  • Сообщений: 92
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #4 : 04 Март 2013, 20:30:28 »
Похоже нужно ещё  узнать об ООП  и вопрос будет закрыт. ^_^
Изменил название, что-бы не возникало лишних вопросов.

***

Посмотрел исходник. (Компилируется 3 минуты, на моем компе (x4 955) ).
В принципе многое понятно, но лучше знать, как все в NES устроено. А иначе компилируешь, ждешь и в конце ничего не получаешь.
Скорее всего если код перевести в любой удобный язык, то на много легче не станет, т.к. очень много функции. Все завязаны между собой. С таким кодом будет все-равно не удобно работать. Да-же не знаю, кто на это отважится...

Оффлайн Skay

  • Пользователь
  • Сообщений: 4115
  • Пол: Мужской
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #5 : 05 Март 2013, 20:45:06 »
никто, только если вы сами не сядете за книжки и не начнете разбираться что и как.

Онлайн Mr2

  • Пользователь
  • Сообщений: 1592
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #6 : 05 Март 2013, 21:24:30 »
Изменил название, что-бы не возникало лишних вопросов.
Очень смешно.  :cool:
Декомпилятор заколбасит хекс кашу в классы, приклеет функции члены, замутит полиморфизм, инкапсуляцию и наследование.
И бонусом откоментирует весь код....
В принципе многое понятно, но лучше знать, как все в NES устроено.

А есть способ хакать не зная ассемблер и железо консоли?
Скорее всего если код перевести в любой удобный язык, то на много легче не станет,
Как это ещё никто не додумался  перевести в любой удобный язык и писать продолжение своей любимой игры. :ohmy:
Бедолаги всё с асмом заморачиваются. ;)
т.к. очень много функции. Все завязаны между собой. С таким кодом будет все-равно не удобно работать.
Ищишь нужные переменные, определяишь функции использующии их, изучаешь работу функции, даёшь ей имя.
Повторяем процесс. А кто говорил что будет легко? :?
Да-же не знаю, кто на это отважится...
Отважится на что?

Оффлайн SPOT

  • Пользователь
  • Сообщений: 574
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #7 : 05 Март 2013, 21:44:43 »
При желании можно даже конвертор кода написать. Например существует конвертер кода (текста) из nes в smd, но глючноват

Но есть видимо и более рабочие NES to SMD

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #8 : 05 Март 2013, 21:57:37 »
Так а что хочет автор? Можно ли перевести код из асма на что-то выскоуровневое - можно, хоть и на с++; будет ли оно работать после этого на нес - нет. Так что же хотел автор-то ? :)

Онлайн Mr2

  • Пользователь
  • Сообщений: 1592
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #9 : 05 Март 2013, 22:03:46 »
Можно ли перевести код из асма на что-то выскоуровневое - можно, хоть и на с++; будет ли оно работать после этого на нес - нет.
Поподробнее пожалуйсто о способе. 
Или ты имеешь в виду ручное переписывание с асма на C++?
Тогда ты неправильно понял тему.
Так что же хотел автор-то ? :)
Хотел и рыбку съесть и.... :blush:

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #10 : 05 Март 2013, 22:06:59 »
Цитата: Mr2
Поподробнее пожалуйсто о способе. 

Ну так бери и переписывай на более высокоуровневый язык, я о таком методе, лол. Бери и разбирайся потихоньку типа :) Вон код хорошо прокомментированный, если переписать то точно выглядеть логика попроще будет.
А откуда комментарии к асм коду кстати? При дизасме по идее не должно было их остаться ...

Онлайн Mr2

  • Пользователь
  • Сообщений: 1592
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #11 : 05 Март 2013, 22:12:09 »
Ну так бери и переписывай на более высокоуровневый язык, я о таком методе, лол.

Так автор темы хочет работать с высокоуровневым языком чтоб не заморачиваться с асмом, а в ручную переписывать это всёравно нужно асм знать.
А откуда комментарии к асм коду кстати? При дизасме по идее не должно было их остаться ...
Оттуда откуда и полиморфизм, инкапсуляцию и наследование. :lol:

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #12 : 05 Март 2013, 23:56:04 »
Но есть видимо и более рабочие NES to SMD
Эмуляция уже не то.  Такой код уже нельзя будет изменить.


Добавлено позже:
Так что же хотел автор-то ? :)
Он хотел чтобы перевели и из-за этого стало более понятно  :lol:

Оффлайн HayaoYokogawa

  • Пользователь
  • Сообщений: 2051
  • Пол: Мужской
  • большой и толстый розовый динозавр
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #13 : 06 Март 2013, 09:38:32 »
В общем, есть высокоуровневый ассемблер NESHLA, погугли.
Насчет перевода в понятный код - такого не было и вряд ли будет.

Онлайн Mr2

  • Пользователь
  • Сообщений: 1592
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #14 : 06 Март 2013, 12:36:33 »
Во чего CaH4e3 пишет:
Цитата
Ипочти все игры для денди писались одним-
двумя программистами, максимум тремя. Иесли покопаться в коде некоторых игр, то видно сразу, что некотоыре кунштюки
компилятору просто не под силу - использование одних и тех же кусков кода для разных частей программы - укороченные
прыжки на RET опкоды соседних функций. Нет, там все писалось исключительно на ассемблере, максимум с макро-функциями.
Опять же, тайминги и порой острая нехватка памяти заставляют извращаться с опкодами, выдавливать тайминги в критичных
местах и экономить байтики. Этого даже современные компиляторы полноценно не умеют.

Оффлайн teremochek

  • Пользователь
  • Сообщений: 92
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #15 : 06 Март 2013, 18:09:31 »
Так а что хочет автор? Можно ли перевести код из асма на что-то выскоуровневое - можно, хоть и на с++; будет ли оно работать после этого на нес - нет. Так что же хотел автор-то ? :)
Автор хотел бы иметь код на удобном ему языке.
А еще хорошо если кто-нибудь переведет пример. Хотя после того, как код обработал "Movax12", конкретно в этом примере почти все ясно. Хотелось бы понять, как избавится от Ассемблерных операторов и чем их заменить.

А откуда комментарии к асм коду кстати? При дизасме по идее не должно было их остаться ...

doppelganger'а - > Movax12

Насчет перевода в понятный код - такого не было и вряд ли будет.
Есть. Смотри третье сообщение.
« Последнее редактирование: 06 Март 2013, 18:19:17 от teremochek »

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #16 : 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




Оффлайн teremochek

  • Пользователь
  • Сообщений: 92
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #17 : 06 Март 2013, 19:49:16 »
Ну так сойдет? :
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

  • Пользователь
  • Сообщений: 1650
    • ВКонтакте
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #18 : 06 Март 2013, 23:59:39 »
Самое забавное что мне всегда казалось что именно ассемблер или даже сами машинные коды и есть самый понятный код, где сразу видно что процессор должен делать :-\

Оффлайн teremochek

  • Пользователь
  • Сообщений: 92
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #19 : 07 Март 2013, 09:40:25 »
как перевести
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

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #20 : 07 Март 2013, 10:30:30 »
как перевести

как перевести и понять
Подскажи как мне перевести испанского на немецкий и понять (знаю русский, английский)  ...  :ohmy:

Оффлайн KABAL

  • Пользователь
  • Сообщений: 1300
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #21 : 07 Март 2013, 11:29:56 »
sergi, полностью с тобой согласен... Машинный код - по мне так проще всего...

Оффлайн yur

  • Пользователь
  • Сообщений: 306
  • Пол: Мужской
  • следи за метлой
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #22 : 07 Март 2013, 21:52:57 »
Впринципе суть вопроса ясна, а по поводу икса в скобках это может быть и присваивание переменной  "х" функции,ну а что бы реализовать твою идею эт надо ассемблер 6502 знать и какую нибудь среду ооп 

Оффлайн teremochek

  • Пользователь
  • Сообщений: 92
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #23 : 08 Март 2013, 12:39:10 »
Подскажи как мне перевести испанского на немецкий и понять (знаю русский, английский)  ...  :ohmy:

Нужно было вначале сказать что это Assembler x816.
И на скорее всего что его никто не знает...

***

Все равно, спасибо за помощь. Кое что в ассемблере я теперь понимаю ^_^

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9376
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #24 : 08 Март 2013, 13:41:20 »
teremochek, вообще существуют более-менее нормальные "переводчики" машинного кода в C, но только для x86 (пк-шных) процов и ARM (и кстати стоят хрен знает сколько тысяч долларов)

вот пример работы:
процедурка на асме http://pastebin.com/ahNDrd65
результат на С http://pastebin.com/8ikUSL83
будет ли тебе понятнее такой код на С ? сомневаюсь ;)

но большое НО - это декомпил кода, который изначально был написан на С, если бы на входе был рукописный асм - белиберда бы получилась еще та

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #25 : 08 Март 2013, 20:59:16 »
Цитата: KABAL
ergi, полностью с тобой согласен... Машинный код - по мне так проще всего...

Он проще всего, всё просто и понятно, только надо прочитать 500 строчек предыдущего кода чтобы отследить что же там в том регистре лежит-то и откуда оно взялось, а так да, всё хорошо и просто. Ато видишь ли мода пошла со всеми этими классами и наследованием ...  :)
Цитата: teremochek
И на скорее всего что его никто не знает...

А как можно написать что-то на том, что никто не знает ?  :wacko:

Оффлайн teremochek

  • Пользователь
  • Сообщений: 92
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #26 : 20 Март 2013, 13:24:40 »
teremochek, вообще существуют более-менее нормальные "переводчики" машинного кода в C, но только для x86 (пк-шных) процов и ARM (и кстати стоят хрен знает сколько тысяч долларов)
Приходилось иметь дело с таким.
Первое что обломило, это куча переменных с неопознанным типом.
Ну а когда дошло до этих - "*(_DWORD *)(a1 + 20) = 7;", я понял что ничего не получится..

вот пример работы:
процедурка на асме http://pastebin.com/ahNDrd65
результат на С http://pastebin.com/8ikUSL83
будет ли тебе понятнее такой код на С ? сомневаюсь ;)
Такой код я хотя-бы могу разобрать. Если выяснить что делает данная функция и проименовать ее, то даже вероятно не будет нужды переименовывать весь код функции..
Другое дело - эти "(*DWORD)*(a1+21)",
с которыми неясно что делать.. Как я понял это ссылка на память стека, или что-то вроде того...
Но мне нужен Высокоуровневый код, который легко модифицировать и портировать..
 
но большое НО - это декомпил кода, который изначально был написан на С, если бы на входе был рукописный асм - белиберда бы получилась еще та
На сколько мне известно, еще необходимо что-бы версии Языка, на которым изначально был написан код, совпадала с той, в которой будешь работать. По моему не так просто узнать, на  какой конкретно  версии  писалась та - или иная игра..

Вообще, как я понимаю, толковых декомпиляторов ассемблера в высокоуровневый код - не существует.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9376
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #27 : 20 Март 2013, 15:03:11 »
Цитата: teremochek
Ну а когда дошло до этих - "*(_DWORD *)(a1 + 20) = 7;", я понял что ничего не получится..

я понял, C ты нифига не знаешь, иначе сразу было бы понятно что это

Цитата: teremochek
Вообще, как я понимаю, толковых декомпиляторов ассемблера в высокоуровневый код - не существует.

это и есть толковый декомпилятор, в нем все реверсеры в мире и работают, т.е. антивирусные компании, хакеры/крякеры, спецы по поиску уязвимостей в ПО, и просто желающие скоммуниздить чужой код.

другой вопрос что ты ни ассемблеров не знаешь, ни высокоуровневых языков, и для тебя надо переводить в почти человеческий язык, типа "языка Ершова" (если .... то... тогда; повторить), при этом с вычисенными переменными (что и зачем), и соответственно названными, а такого не будет, по крайней мере пока не появятся вычислительные машины с искуственным интелектом (без шуток)

ну а специалисты при помощи IDA и HexRays за денек-другой вполне реверсят программки небольшого-среднего объема

Оффлайн teremochek

  • Пользователь
  • Сообщений: 92
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #28 : 20 Март 2013, 15:31:43 »
как перевести
x = FireballCounter & #%00000001
Здесь нечего переводить.Число справа в бинарном формате.
Можно записать так:
x = FireballCounter AND %00000001

Не совсем понимаю как это работает. Может оператор AND заменить плюсом "+" ?

как перевести и понять
y = Player_Y_HighPos - 1 == zero
Здесь тоже нечего переводить. В принципе понять можно так.
 IF  y = (Player_Y_HighPos - 1)  AND (Player_Y_HighPos - 1) = zero

как перевести
y, FireballThrowingTimer = PlayerAnimTimerSet
Предположу, что так.

y = PlayerAnimTimerSet         
FireballThrowingTimer = y


как перевести
if lda AreaType == zero
Здесь возможно так:

a = AreaType
if a == zero


Добавлено позже:
я понял, C ты нифига не знаешь, иначе сразу было бы понятно что это
Может объяснишь вкратце, если знаешь..  o_0

это и есть толковый декомпилятор, в нем все реверсеры в мире и работают, т.е. антивирусные компании, хакеры/крякеры, спецы по поиску уязвимостей в ПО, и просто желающие скоммуниздить чужой код.

другой вопрос что ты ни ассемблеров не знаешь, ни высокоуровневых языков, и для тебя надо переводить в почти человеческий язык, типа "языка Ершова" (если .... то... тогда; повторить), при этом с вычисенными переменными (что и зачем), и соответственно названными, а такого не будет, по крайней мере пока не появятся вычислительные машины с искуственным интелектом (без шуток)

ну а специалисты при помощи IDA и HexRays за денек-другой вполне реверсят программки небольшого-среднего объема
Я нечего против "IDA и HexRays" не имею. И кстати я его не называл, ты сам сказал  ^_^
Тот-же дизассемблер NES, SEGA в нем делается. Знаю там даже специальные плагины для этого есть.
Другое дело что это больше Анализатор кода чем декомпилятор.
« Последнее редактирование: 20 Март 2013, 15:54:19 от teremochek »

Онлайн Mr2

  • Пользователь
  • Сообщений: 1592
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: [NES] Ассемблер перевести в понятный код
« Ответ #29 : 20 Март 2013, 16:34:50 »
Но мне нужен Высокоуровневый код, который легко модифицировать и портировать..
Хватит смешить народ. <_<
Вообще, как я понимаю, толковых декомпиляторов ассемблера в высокоуровневый код - не существует.
Для кого-то и высокоуровневый язык не толковый... :cool: