Прокомментируйте участок кода.

Тема в разделе "WASM.BEGINNERS", создана пользователем Olia, 7 окт 2011.

  1. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Ну вообще, никаких Y-координат тут быть не может. И вообще по месту (а переменные обычно организуют неким образом) обращения, четко 2 разных по назначению: 233,234,235 - и из 0-й страницы 001E и 0029. Или даже 3 разных. Раз интересуют младшие биты (да на самом деле хоть бы и старшие!), это скорее набор битовых флагов, чем числовые значения. Или пара масок, накладывающаяся на что-то. Или R, G, B компоненты цвета, к которым применяют 2 фильтра. Точнее можно было бы узнать, если бы знать что такое (хотя бы) 1E и 29. Или прочитать значения из ячеек, причем при реальной трассировке (то есть от начала программы до нужного момента), а не установив сразу стартовым начало процедуры - значения переменных при этом очень далеки от действительности. Обычно, есть возможность задать точки останова - вот и задать. Перед данным блоком, брекпойнт. Потом с нормального старта запустить программу и посмотреть, когда вывалится, что же там за значения.

    А в итоге получаем ?????011. И вот это значение сохраняем. Что это такое? Это может быть опкод, для самомодифицирующейся проги :) или секретная маска, по которой будет расшифровано что-то, если в ячейки ранее ввели правильные значения. Или набор флагов для чего-то в дальнейшем. На самом деле, результатов очень ограниченное количество, либо мы начинаем с 1, либо с 2, либо с 3:

    01: 01000011
    10: 01101011
    11: 10010011
    (если я не обсчитался). Это на самом деле может быть даже смещение, по которому надо будет сделать переход где-то позднее, а набор XOR'ов - реализация "рандомайзера" с выбором одного из 3-х вариантов. Как уже сказано,
    Ну например: сложением с 1B вычисляется правильное смещение для перехода. В ячейках некие переменные игры, например хитпойнты, количество патронов, и направление движения. Для внесения "хаоса и непредсказуемости" используют еще 2 ячейки с масками, служебных, константы. Когда игрок прыгает в колодец, в зависимости от текущих значений, окажется в 3-х разных локациях. Либо там, либо там, либо тут. Внешне все случайно, на деле можно вычислить, зная алгоритм, и запрыгивая с левой стороны или с правой :))) наверно, можно придумать варианты электротехнические, из анализа спектров, криптографии и еще откуда-нибудь еще. Но это все догадки - ведь только вам известно что это за программа - вам и карты в руки )
     
  2. Olia

    Olia New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2011
    Сообщения:
    17
    Вы опять в точку попали!!! Похоже что это компонента цвета и случайности.!!!! Эта псевдослучайность берется в
    зависимости от состояния объектов!!!!!!!! ужОс!
     
  3. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    вы бы лучше приоткрыли завесу тайны, что за программа? Игра? начинка игрового автомата? Интерпретатор бейсика? ПЗУ коммодора? текстовый редактор? Тогда предположения можно будет делать точнее ;)
     
  4. Olia

    Olia New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2011
    Сообщения:
    17
    Так не интересно!! Гораздо приятнее читать советы , когда человек не в курсе тематики и дает точные ответы. Прямо в яблочко, так сказать!
     
  5. Olia

    Olia New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2011
    Сообщения:
    17
    По теме.
    IDA успешно построила граф в программе WinGraph32. Получается намного удобнее работать чем в блокноте.
    Далее какой план?? Распечатать граф и уже на листке рисовать доп. информацию? Я понимаю, что в гугле есть все, но может быть Вы посоветуете
    фишки от эксперта. И Вам приятно и мне вдвойне! -)
     
  6. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    во юзает...
     
  7. Olia

    Olia New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2011
    Сообщения:
    17
    сищито? :)
     
  8. Olia

    Olia New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2011
    Сообщения:
    17
    Вобщем, в IDA есть все что нужно для комфортной работы. Shift + 6 - самая полезная штука, ну помимо построения графа.
    Пробел меняет вид текста с графа на список. Хм.......
    А теперь вопрос. Есть вот такая процедурка:
    sub_C229:
    LDA byte_D
    BNE sub_C229 если байт D!=0 то вызываем саму себя. ВИСИМ ТУТ
    LDA #1
    STA byte_D байт D = 1;
    Получается что если D будет не нуль. То мы умерли. Чего не происходит!!
    А значит ячейку D может изменить внутренее Нечто. Прерывание процессора?

    Итак, ставим брекпоинт на ячейку и находим участок:
    ROM:C012 NMI:
    PHA
    TXA
    PHA
    TYA
    PHA
    LDX #0
    STX byte_D
    Получается что процессор получил какой-то важный сигнал, после чего зашел в процедуру обработку этого сигнала. А С012 и далее это так называемая таблица прерывании. В ней мы именили ячейку D. После чего наша ВИСЯЧАЯ ПРОЦЕДУРА оживает..... Как то так ? Теперь нужно узнать какие бывают немаскируемые прерывания. ЧтО именно вызвало этот сигнал?..
     
  9. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Зачем вы задаете вопросы, не изучив архитектуру железа? Знания ассемблера недостаточно для понимания работы этого кода. Ищите описание железа.
     
  10. Olia

    Olia New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2011
    Сообщения:
    17
    Другие участники гораздо более продуктивны в своих ответах)))) У Вас же 5 ТРОЛЕВских ответов "ниачом"(лишь 1 ответ по теме и тот - неудачная попытка помочь).
    Не с кем поговорить? Должен быть раздел ФЛЕЙМ, но не тут в помощи Новичкам.
    Поучились бы у FatMoon! Вот это действительно эксперт! А Вы лишь показываете своё дилетанство! Спасибо.
     
  11. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    http://www.c64-wiki.com/index.php/Raster_interrupt

    ЗЫ:
    А для ROM не надо корячиться, все сделано до нас:
    http://www.bombjack.org/commodore/books/pdf/The_Complete_Commodore_64_ROM_Disassembly.zip
     
  12. Olia

    Olia New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2011
    Сообщения:
    17
    TYA
    SEC
    SBC byte_53 ; А-M-(1-C)
    STA byte_76
    BCS loc_DD82

    Мы можем сказать, что условие BCS выполнится если A>=M ? Или как то иначе?
    Флаг С установили выше. Получается что так. Поправьте, если ошибаюсь. Спасибо.
     
  13. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    вот хз, меня вики смущает. Там написано прямо противоположное, тому, что я думаю. поясняю логику:

    А = 10
    М = 9
    А= А-М
    -------------
    А=1, переноса НЕТ. То есть если А >= M, cf=0

    А= 9
    М= 10
    А=А-М
    ------------
    А=-1, перенос ЕСТЬ. То есть если A < M, cf=1

    Или врет вики, или логика команд BCC/BCS отлична от интеловских jnc/jc
    Если бы у меня был реальный проц под рукой, и возможность трассировки, я бы знал наверняка. А так, если верить написанному, инструкция "Branch if Carry Set" делает переход, если , в самом деле, Carry Clear. Вот с этим разберитесь :) А так, да, ветвления по переносу обычно эквивалентны условию (А<B) или (A>=B)
     
  14. Olia

    Olia New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2011
    Сообщения:
    17
    SBC - Subtract with Carry
    A,Z,C,N = A-M-(1-C)
    This instruction subtracts the contents of a memory location to the accumulator together with the not of the carry bit. If overflow occurs the carry bit is clear, this enables multiple byte subtraction to be performed.
    Processor Status after use:
    C Carry Flag Clear if overflow in bit 7

    Я немогу понять, почему Carry Flag Clear if overflow in bit 7
    Т.е При переполнении флаг С = 0, а не наоборот С=1 ? Clear означает снят??
    ПРоизошло ведь переполнение в 7 бите и флаг СЛЕДУЕТ УСТАНОВИТЬ, а не снять? А тут в точности наоборот. Поправьте, если ошибаюсь. У меня мозг сейчас вскроется от Индуской логики. (((((((((((((((((
    LDA Байт номер 1
    SEC
    SBC Байт номер 2
    CMP #$10
    BCS куда то там прыгаем

    Вопрос. Что в аккумуляторе у нас ?? 0 - 1 = 255 ???????????? 20-3 = 17 ???????
    Прыгаем мы при каком человеческом условии?
    Может быть ПРЫЖОК если МОДУЛЬ(Байт номер 1 - Байт номер 2) < 16 ?? Если интуитивно так . Как же мне не нравится интуиция в точных науках!! ОООООООООО
     
  15. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Olia
    Зачем индусская логика. Вычитание эквивалентно сложению с инвертированным вторым операндом. Поэтому и С тоже инвертируется 1-С
    (Хотя подумав... странно. Но это я вычитал тоже из описания SBC для АРМ) Возможно что у вас неправильный(индусский перевод на инглиш...).
    Ищите ПРАВИЛЬНОЕ описание и сверяйте его с эмулятором.
    Про overflow смотрите сами. В АРМ эта же команда устанавливает 2 признака : C - заем или V - переполнение. Вот от этого и пляшите.
    Итуиция в точных науках очень нужна. Но вы путаете ее с фантазией и мифотворчеством, свойственных новичкам. Когда прийдет понимание, тогда и интуиция будет ПРАВИЛЬНО работать.
    ++++++++++++++
    Вдогонку. 7-й разряд =1 у отрицательных чисел - это если знаковая арифметика используется. Может поэтому в объяснении написано про 7-й разряд. Короче - почитайте азы про машинную арифметику, иначе никакой FatMoon вам не поможет и вы так и останетесь с "мифическими" знаниями предмета.
     
  16. Olia

    Olia New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2011
    Сообщения:
    17
    LDA Байт номер 1
    SEC
    SBC Байт номер 2
    CMP #$10
    BCS куда то там прыгаем
    а куда мы прыгаем? При каком условии? БЛОК СХЕУ 3-Б класса в студию !
    Предположу с потолка , что мы прыгаем если abs(b1-b2)< 0x10
    Но вы то без догадок можете сказать? Ну и без шпаргалок в виде отладке на процессоре ! Или это неразрешимый вопрос? АААпчхиииииииии. Извините.
     
  17. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    ну вот ради любопытства, нагуглил книгу "Commodore 64 assembly language programming".
    Написано странно - я бы не так организовал объяснения. Но так или иначе, вот фрагмент повсеместно приводимого кода:

    Код (Text):
    1. LDAim 152   ;загружаем в аккумулятор
    2. CMPim 200   ;сравниваем с 200 - т.е. устанавливаем флаги в соответствии с результатом (А-200)
    3. BCC addr1   ;если А < 200, переходим
    То есть на вики наплюем (хз, кто там писал, и описался в одном месте - книга, где подобные фрагменты попадаются неоднократно, вызывает больше доверия).

    1. CMP работает так же, как и на интелах - из аккумулятора вычитается число, не наоборот
    2. BCC (if Carry Clear) переходит, если С=0, и не иначе. BCS (if Carry Set) переходит если С=1.
    3. Однако, изменение флага происходит по (странным) правилам: если при сложении возникло ПЕРЕПОЛНЕНИЕ, то С=1, иначе 0. Если при вычитании возник ЗАЕМ, то С=0, иначе 1.
    Если хотим вычитать без заема, то сначала устанавливаем С=1 (SEC), потом операция SBC. Отсюда все непонятки с (A-M-(1-C)) - это как раз инверсия флага.
    Напротив, если хотим складывать без переноса, сначала сбрасываем С=0 (CLC), потом операция ADC.

    Так что ваш bcs прыгает куда-то там, если в предшествующей cmp A >= 10.