Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - wizzard

Страницы: [1]
1
В том то и прикол, что $E2 = 11100010, старший бит равен 1.
Я тоже так думал, но когда оттрасировал,
то получилось, что после ADC флаг переноса (C) не выставился!
Хотя по идее, должен был бы.

Вот оно что! Если флаг переноса выставлен, то ADC его снимает,
иначе не трогает!

2
Что может значить этот код:

$B559:A5 23     LDA $0023 = #$E2
$B55B:69 00     ADC #$00

Зачем прибавлять 0 к значению A?
LDA воздействует на флаги Z и N.
Но зачем здесь добавление 0?

3
> При помощи бряка на запись.
Я так код исследовал, который тайловые карты строит.
Кстати, там 6-ти битовый формат тайловых карт.
Поставить бряк на ячейку, например, $0700 можно,
но при каждом бряке там будет РАЗНЫЙ спрайт.
Может как-то можно условные бряки ставить?
Например, на значение?

4
Вот такой вопрос.
Спрайтовый буфер все время перемешивается.
Как посмотреть запись конкретных спрайтов в него?

5
> Ячейка $0003: xxxx7654
Именно к этому выводу я и пришел.
Переносят в др. ячейку старшие разряды.

6
Я протроссировал, посмотрел на значение регистра А, получается, оно только 1 раз может выдвинуть бит переноса,
из всех возможных значений. Сдвиги с ротациями как раз для того и сделаны, чтобы СОХРАНЯТЬ бит из регистра А.
А потом

$B4B8:65 24     ADC $0024 = #$0B
$B4BA:85 02     STA $0002 = #$C0
$B4BC:A5 03     LDA $0003 = #$03
$B4BE:65 25     ADC $0025 = #$E3
$B4C0:85 03     STA $0003 = #$03
$B4C2:A5 53     LDA $0053 = #$00

к получившемуся значению добавляется значение из ячейки $0025,
и ниже идет копирование индексов тайловой карты во временный буфер,
расположенный по адресу $0460

$B4C5:B1 02     LDA ($02),Y @ $03D1 = #$15
$B4C7:9D 60 04  STA $0460,X @ $055E = #$00
$B4CA:E8        INX
$B4CB:98        TYA
$B4CC:18        CLC
$B4CD:69 04     ADC #$04
$B4CF:C9 10     CMP #$10
$B4D1:90 F1     BCC $B4C4
$B4D3:60        RTS

Адрес $03D1 - откуда, $055E - куда.
LDA ($02),Y - как раз наш указатель (02,03),
с которыми ранее осуществлялась ротация.
Поскольку столбиками строится, а уровень хранится
блоками 4х4 (строка-столбец), то к Y добавляется 4.
Потом сравнивается с 16-ю и происходит выход и подпрограммы,
либо переход на новый виток цикла.

То есть получается:
1.Уровень состоит из квадратов 4х4.
2. Строится столбиками.
Столбиками и хранится, но пока не пойму как они повторяются в уровне и где это записано.

7
> а то, как и что сдвигает циклически опкод ROL
Я думаю, что для подобных вещей такие форумы и существуют.
Если в регистре 0, значит
флаг переноса никогда не выставится,
потому что все биты нули.
Если не взаимосвязаны 2 команды - ASL и ROL.
Вот отсюда
http://www.romhacking.net/docs/%5B110%5D6502asm.htm
описание:

       +-+-+-+-+-+-+-+-+
C <- |7|6|5|4|3|2|1|0| <- C    ROL
       +-+-+-+-+-+-+-+-+
7 бит сдвигается во флаг переноса, а флаг переноса переходит в нулевой бит.
Получается, если до операции флаг переноса был выставлен в 1,
то он перейдет в младший разряд, ВНЕ зависимости от того, что было в старшем?
А раньше там стоит команда сдвига влево на 2. Из мануала, команда ASL:

       +-+-+-+-+-+-+-+-+
C <- |7|6|5|4|3|2|1|0| <- 0    ASL
       +-+-+-+-+-+-+-+-+

также может воздействовать на флаг переноса.
Я извиняюсь за дотошность, но очень хочется понять, что же там происходит,
если в $0003 ВСЕГДА стоит 0 и меняется только содержимое регистра А.

Проверил. Если старший бит равен 1, то
после выполнения ASL - ROL он перейдет в ячейку памяти $0003.
Значит догадка подтвердилась. Зачем такое может потребоваться 4 раза?
Может для того, чтобы УМНОЖАТЬ числа, занимающие БОЛЬШЕ 1 байта?

8
Дело в том, что после
$B4A4:A9 00     LDA #$00
$B4A6:85 03     STA $0003 = #$00
никаких манипуляций с ячейкой $0003 не делается!

Вот полный код:

$B4A4:A9 00     LDA #$00
$B4A6:85 03     STA $0003 = #$E3
$B4A8:A4 54     LDY $0054 = #$00
$B4AA:B1 28     LDA ($28),Y @ $E299 = #$00
$B4AC:0A        ASL
$B4AD:26 03     ROL $0003 = #$E3
$B4AF:0A        ASL
$B4B0:26 03     ROL $0003 = #$E3
$B4B2:0A        ASL
$B4B3:26 03     ROL $0003 = #$E3
$B4B5:0A        ASL
$B4B6:26 03     ROL $0003 = #$E3

А рисуется уровень столбиками.
Сначала в буфер заносится, а потом в память PPU.

9
Ковыряю сабж. Натыкаюсь в распаковке тайловой карты на такой вот код и тупею:


$B4A4:A9 00     LDA #$00
$B4A6:85 03     STA $0003 = #$00
....

$B4AD:26 03     ROL $0003 = #$00
$B4AF:0A        ASL
$B4B0:26 03     ROL $0003 = #$00
$B4B2:0A        ASL
$B4B3:26 03     ROL $0003 = #$00
$B4B5:0A        ASL
$B4B6:26 03     ROL $0003 = #$00

(оставил ASL для полноты картины).
Зачем сдвигать влево - понятно, умножение на 2.
Но зачем делать циклический сдвиг НУЛЯ вправо - мне не понятно.
При том 5 раз. Гуру, подскажите, зачем сие может быть нужно?

10
Читал я мигеру. Он пишет, что мэппер один из простейших и обращение к памяти выше 0x8000 есть его рук дело.
И что с того?

11
Она на прямую в память не отображается. К ней доступ только через регистры PPU или через DMA.
Это память внутри PPU.
> RAM $200-$300?
Не уверен. Но думаю, что логика работы такая. Сначала формируется буфер в обычной памяти,
затем он целиком перекидывается в SPR_RAM через DMA. Может адрес буфера и такой, но в общем случае
может отличаться.

12
В SPR-RAM (она 256 байт) хранятся атрибуты спрайтов. 64 записи по 4 байта каждая. Именно этим объясняется лимит спрайтов на 1 строку развертки.
За совет спасибо. Я думал там смещения в РОМе, (гыыыыы). А ROM же в памяти! И грузится с адреса 0x8000.
А я уж хотел было байты портить.

13
Как я понял, Сега не "сегментирует" память. Там есть 4 мегабайта - и все это в 1 сегменте. Оно и понятно - процессор 16 бит, может адресовать все сразу.
А на NES максимум 1 сегмент - 0хFFFF, или 64К. Вот по этому мэпперы и придумали. Он как бы "подсовывает" процессору нужный кусок кода.
В ROMе они идут 1 за другим, а вот в память загружаются....причем за 1 кадр может быть и 100 переключений между разными кусками (банками) кода.
И как определить откуда он читает?....
Я знаю, что есть исходники того же GENS, и можно дописать что нужно. Или сдампить нужные куски.
Но я не особо вникал, как устроена Сега. Мне кажется очень похоже на NES.

14
Поковырявшись обнаружил такую интересную закономерность. Не вся графика ей подчиняется, но кое-что подчиняется.
Идет сжатый кусок. Он заканчивается байтом FF. Потом идут 2 байта (зачем?), потом опять сжатый кусок до байта FF.
IDA дизасмит на Win x32 нормально. Можно и разобраться.
У меня вот какой вопрос. По рому я полазил. Нашел таблицу имен (name table, тайловую карту) в пожатом виде
для начальной заставки. Её начало и конец. Разжалась правильно. А можно ли как-то в отладчике узнать, что
происходит чтение именно с этого смещения в РОМЕ? То есть задача: есть смещение в роме, нужно найти смещение
в памяти. Может есть какие-нибудь алгоритмы?

> а ты посмотрел что в папке IDA/loaders  по 2штуки их?  *.ldw и *.l64.   По-крайней мере те лоадеры, что уменя 32 битные.  (хотя может ты из сорса компилил?)
Я не компилил, скачал с какого-то сайта, засунул и забыл. Потом просто через виртуалку разжал, сохранил и все.

Вот видео прохождения демо уровня, только парень создал
Red Falcon под MAC.
http://www.youtube.com/watch?v=_42lhQTY-no

Мне интересно самому покопать - поковырять. Потому что много интересного узнаешь о создателях-программистах.

> Я про НЕС мало знаю,
Если есть мэппер, как правило 1 банк остается в памяти всегда. Остальные переключаются по ходу.
У меня их всего 6. И все программные (есть еще CHR-ROM, но в случае моего рома, этого нет.

> Насчет FCEUD
Их так много версий, что я путаюсь, где какая. Вот эту я собрал прям из сырцов - fceux214.
Там под все студии есть проекты, под мак и unix.
И все равно нужного функционала не достает! Например, везде в манах пишут - щелкните
правой кнопкой на hex редакторе и выберите Go To Rom Ofsset (или как-то так), но такого
пункта вообще нет, а чем он заменен непонятно.
Почему я не могу посмотреть в том же hex редакторе SPR-RAM?
CPU могу, PPU могу, а SPR-RAM - нет?
Очень много игр в NES пожато именно RLE. Пришлось написать свой просмотрщик - распаковщик.
Могли бы за 10 лет эмуляции такую тулзу внедрить. И много чего не достает в отладочных целях.

15
Взял принципиально пожатый ром. Хочется потренироваться.
Процедуру декомпрессии нашел. Ей пожато все - и графика, и тайловые карты.
Написал программку для распаковки. Удалось вытащить непосредственно из рома
%40 графики. Остальное - не пойми как. Вообще складывается впечатление, что
загрузка графики работает так. Есть базовый набор спрайтов для уровня и есть
кусочки, что раскиданы по рому и не обязательно хранятся вместе с основным базовым
набором спрайтов. Значит, где-то в роме, должна быть таблица (массив указателей)
на смещения для НАЧАЛА распаковки этих самых порознь лежащих кусочков.
Не очень понятно, как осуществляется загрузка самого РОМА?
(ясно, что он грузится с адреса 0x8000, но что происходит потом,
и почему IDA не может дизасмить там байты)
Как можно найти адрес первой выполняемой инструкции?
Загрузил ром в ida, через загрузчик CaH4e3'а. Он показал голые данные.
Как я понял, IDA не может дизасмить ром непосредсвенно.
Но коли так, то как используя отладчик FCEUD (или его модификации)
можно ей подсказать?
Что смущает - не понятно, как и когда мэппер осуществляет переключение данных в картридже?
Хорошо бы (я искал) найти какой-нибдудь мануал по работе в NES и IDA.
Тот что описан здесь http://griever.magicteam.net/doc/?doc=NES_IDA
не очень понятен. Более того, у меня не получилось сделать дизассемблирование
указанными там методами. Может руки кривые, может я не догоняю?
Наверно, это особенность IDA на x64 системах. В x32 все
продизасемблировалось, плагин отработал нормально.
По крайней мере все можно прочесть или проанализировать.

Страницы: [1]