| Разработка и ромхакинг > Ромхакинг и программирование |
| Adventure Island. NES. Что бы это могло значить? |
| (1/1) |
| wizzard:
Ковыряю сабж. Натыкаюсь в распаковке тайловой карты на такой вот код и тупею: $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:
А это сдвиг влево, а не вправо. И предположительно там могут быть другие значения, не только ноль. |
| CaH4e3:
подучи-ка сначала 6502 асм, дорогой лол с такими знаниями тебе в распаковку лезть нечего |
| wizzard:
Дело в том, что после $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. |
| GManiac:
На этот код может быть прыжок с другого места, где в $0003 будет другое значение. |
| CaH4e3:
я всем настоятельно рекомендую, прежде чем постить бредятину, изучить асм 6502 дело в том, что это поможет однозначно разбираться в том, что делает программа, а не строить глупые догадки лол поднимите руки, кто в курсе, что такое битовые операции? ;))) а флаг carry? а то, как и что сдвигает циклически опкод ROL? |
| wizzard:
> а то, как и что сдвигает циклически опкод 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 байта? |
| CaH4e3:
ни капли просветления не вижу.. /me выпил с горя |
| wizzard:
Я протроссировал, посмотрел на значение регистра А, получается, оно только 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. Строится столбиками. Столбиками и хранится, но пока не пойму как они повторяются в уровне и где это записано. |
| HoRRoR:
Регистр 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:
> Ячейка $0003: xxxx7654 Именно к этому выводу я и пришел. Переносят в др. ячейку старшие разряды. |
| wizzard:
Вот такой вопрос. Спрайтовый буфер все время перемешивается. Как посмотреть запись конкретных спрайтов в него? |
| Mefistotel:
При помощи бряка на запись. |
| CaH4e3:
captain to the rescue ;) |
| wizzard:
> При помощи бряка на запись. Я так код исследовал, который тайловые карты строит. Кстати, там 6-ти битовый формат тайловых карт. Поставить бряк на ячейку, например, $0700 можно, но при каждом бряке там будет РАЗНЫЙ спрайт. Может как-то можно условные бряки ставить? Например, на значение? |
| mareg:
полная бредятина нифига не понял :D :D :D |
| wizzard:
Что может значить этот код: $B559:A5 23 LDA $0023 = #$E2 $B55B:69 00 ADC #$00 Зачем прибавлять 0 к значению A? LDA воздействует на флаги Z и N. Но зачем здесь добавление 0? |
| GManiac:
ADC прибавляет флаг C, на который LDA как раз не воздействует. Смотри, что за код идёт раньше. |
| wizzard:
В том то и прикол, что $E2 = 11100010, старший бит равен 1. Я тоже так думал, но когда оттрасировал, то получилось, что после ADC флаг переноса (C) не выставился! Хотя по идее, должен был бы. Вот оно что! Если флаг переноса выставлен, то ADC его снимает, иначе не трогает! |
| Навигация |
| Главная страница сообщений |