Ну вообще, никаких 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-х разных локациях. Либо там, либо там, либо тут. Внешне все случайно, на деле можно вычислить, зная алгоритм, и запрыгивая с левой стороны или с правой )) наверно, можно придумать варианты электротехнические, из анализа спектров, криптографии и еще откуда-нибудь еще. Но это все догадки - ведь только вам известно что это за программа - вам и карты в руки )
Вы опять в точку попали!!! Похоже что это компонента цвета и случайности.!!!! Эта псевдослучайность берется в зависимости от состояния объектов!!!!!!!! ужОс!
вы бы лучше приоткрыли завесу тайны, что за программа? Игра? начинка игрового автомата? Интерпретатор бейсика? ПЗУ коммодора? текстовый редактор? Тогда предположения можно будет делать точнее
Так не интересно!! Гораздо приятнее читать советы , когда человек не в курсе тематики и дает точные ответы. Прямо в яблочко, так сказать!
По теме. IDA успешно построила граф в программе WinGraph32. Получается намного удобнее работать чем в блокноте. Далее какой план?? Распечатать граф и уже на листке рисовать доп. информацию? Я понимаю, что в гугле есть все, но может быть Вы посоветуете фишки от эксперта. И Вам приятно и мне вдвойне! -)
Вобщем, в 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. После чего наша ВИСЯЧАЯ ПРОЦЕДУРА оживает..... Как то так ? Теперь нужно узнать какие бывают немаскируемые прерывания. ЧтО именно вызвало этот сигнал?..
Зачем вы задаете вопросы, не изучив архитектуру железа? Знания ассемблера недостаточно для понимания работы этого кода. Ищите описание железа.
Другие участники гораздо более продуктивны в своих ответах)))) У Вас же 5 ТРОЛЕВских ответов "ниачом"(лишь 1 ответ по теме и тот - неудачная попытка помочь). Не с кем поговорить? Должен быть раздел ФЛЕЙМ, но не тут в помощи Новичкам. Поучились бы у FatMoon! Вот это действительно эксперт! А Вы лишь показываете своё дилетанство! Спасибо.
http://www.c64-wiki.com/index.php/Raster_interrupt ЗЫ: А для ROM не надо корячиться, все сделано до нас: http://www.bombjack.org/commodore/books/pdf/The_Complete_Commodore_64_ROM_Disassembly.zip
TYA SEC SBC byte_53 ; А-M-(1-C) STA byte_76 BCS loc_DD82 Мы можем сказать, что условие BCS выполнится если A>=M ? Или как то иначе? Флаг С установили выше. Получается что так. Поправьте, если ошибаюсь. Спасибо.
вот хз, меня вики смущает. Там написано прямо противоположное, тому, что я думаю. поясняю логику: А = 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)
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 ?? Если интуитивно так . Как же мне не нравится интуиция в точных науках!! ОООООООООО
Olia Зачем индусская логика. Вычитание эквивалентно сложению с инвертированным вторым операндом. Поэтому и С тоже инвертируется 1-С (Хотя подумав... странно. Но это я вычитал тоже из описания SBC для АРМ) Возможно что у вас неправильный(индусский перевод на инглиш...). Ищите ПРАВИЛЬНОЕ описание и сверяйте его с эмулятором. Про overflow смотрите сами. В АРМ эта же команда устанавливает 2 признака : C - заем или V - переполнение. Вот от этого и пляшите. Итуиция в точных науках очень нужна. Но вы путаете ее с фантазией и мифотворчеством, свойственных новичкам. Когда прийдет понимание, тогда и интуиция будет ПРАВИЛЬНО работать. ++++++++++++++ Вдогонку. 7-й разряд =1 у отрицательных чисел - это если знаковая арифметика используется. Может поэтому в объяснении написано про 7-й разряд. Короче - почитайте азы про машинную арифметику, иначе никакой FatMoon вам не поможет и вы так и останетесь с "мифическими" знаниями предмета.
LDA Байт номер 1 SEC SBC Байт номер 2 CMP #$10 BCS куда то там прыгаем а куда мы прыгаем? При каком условии? БЛОК СХЕУ 3-Б класса в студию ! Предположу с потолка , что мы прыгаем если abs(b1-b2)< 0x10 Но вы то без догадок можете сказать? Ну и без шпаргалок в виде отладке на процессоре ! Или это неразрешимый вопрос? АААпчхиииииииии. Извините.
ну вот ради любопытства, нагуглил книгу "Commodore 64 assembly language programming". Написано странно - я бы не так организовал объяснения. Но так или иначе, вот фрагмент повсеместно приводимого кода: Код (Text): LDAim 152 ;загружаем в аккумулятор CMPim 200 ;сравниваем с 200 - т.е. устанавливаем флаги в соответствии с результатом (А-200) 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.