Автор Тема: Adventure Island. NES. Что бы это могло значить?  (Прочитано 4858 раз)

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

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Ковыряю сабж. Натыкаюсь в распаковке тайловой карты на такой вот код и тупею:


$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 раз. Гуру, подскажите, зачем сие может быть нужно?

Оффлайн evgeny

  • Пользователь
  • Сообщений: 1390
  • Пол: Мужской
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #1 : 06 Август 2011, 11:58:58 »
А это сдвиг влево, а не вправо. И предположительно там могут быть другие значения, не только ноль.

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3589
    • Twitter
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #2 : 06 Август 2011, 12:19:10 »
подучи-ка сначала 6502 асм, дорогой лол с такими знаниями тебе в распаковку лезть нечего

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #3 : 06 Август 2011, 12:38:11 »
Дело в том, что после
$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.
« Последнее редактирование: 06 Август 2011, 12:45:04 от wizzard »

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #4 : 06 Август 2011, 12:49:43 »
На этот код может быть прыжок с другого места, где в $0003 будет другое значение.

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3589
    • Twitter
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #5 : 06 Август 2011, 17:14:50 »
я всем настоятельно рекомендую, прежде чем постить бредятину, изучить асм 6502
дело в том, что это поможет однозначно разбираться в том, что делает программа, а не строить глупые догадки лол

поднимите руки, кто в курсе, что такое битовые операции? ;))) а флаг carry? а то, как и что сдвигает циклически опкод ROL?
« Последнее редактирование: 06 Август 2011, 17:16:51 от CaH4e3 »

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #6 : 07 Август 2011, 12:15:28 »
> а то, как и что сдвигает циклически опкод 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 байта?
« Последнее редактирование: 07 Август 2011, 12:27:03 от wizzard »

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3589
    • Twitter
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #7 : 07 Август 2011, 12:48:04 »
ни капли просветления не вижу.. /me выпил с горя

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #8 : 07 Август 2011, 13:17:21 »
Я протроссировал, посмотрел на значение регистра А, получается, оно только 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. Строится столбиками.
Столбиками и хранится, но пока не пойму как они повторяются в уровне и где это записано.
« Последнее редактирование: 07 Август 2011, 13:24:08 от wizzard »

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #9 : 07 Август 2011, 14:53:54 »
Регистр A: 76543210
Ячейка $0003: xxxxxxxx
ASL
ROL
Регистр A: 6543210x
Ячейка $0003: xxxxxxx7
ASL
ROL
Регистр A: 543210xx
Ячейка $0003: xxxxxx76
ASL
ROL
Регистр A: 43210xxx
Ячейка $0003: xxxxx765
ASL
ROL
Регистр A: 3210xxxx
Ячейка $0003: xxxx7654

Всё предельно ясно.

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #10 : 07 Август 2011, 18:00:06 »
> Ячейка $0003: xxxx7654
Именно к этому выводу я и пришел.
Переносят в др. ячейку старшие разряды.

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #11 : 12 Август 2011, 10:25:48 »
Вот такой вопрос.
Спрайтовый буфер все время перемешивается.
Как посмотреть запись конкретных спрайтов в него?

Оффлайн Mefistotel

  • Emu-Land Team
  • Сообщений: 1510
  • Пол: Мужской
  • Генерал армии Хаоса
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #12 : 12 Август 2011, 13:39:54 »
При помощи бряка на запись.

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3589
    • Twitter
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #13 : 12 Август 2011, 19:45:33 »
captain to the rescue ;)

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #14 : 12 Август 2011, 20:33:13 »
> При помощи бряка на запись.
Я так код исследовал, который тайловые карты строит.
Кстати, там 6-ти битовый формат тайловых карт.
Поставить бряк на ячейку, например, $0700 можно,
но при каждом бряке там будет РАЗНЫЙ спрайт.
Может как-то можно условные бряки ставить?
Например, на значение?

Оффлайн mareg

  • Пользователь
  • Сообщений: 189
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #15 : 16 Август 2011, 14:29:18 »
полная бредятина нифига не понял :D :D :D

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #16 : 20 Август 2011, 16:06:39 »
Что может значить этот код:

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

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

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #17 : 20 Август 2011, 17:06:01 »
ADC прибавляет флаг C, на который LDA как раз не воздействует. Смотри, что за код идёт раньше.

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: Adventure Island. NES. Что бы это могло значить?
« Ответ #18 : 20 Август 2011, 17:25:36 »
В том то и прикол, что $E2 = 11100010, старший бит равен 1.
Я тоже так думал, но когда оттрасировал,
то получилось, что после ADC флаг переноса (C) не выставился!
Хотя по идее, должен был бы.

Вот оно что! Если флаг переноса выставлен, то ADC его снимает,
иначе не трогает!
« Последнее редактирование: 20 Август 2011, 17:37:54 от wizzard »