Разработка и ромхакинг > Ромхакинг и программирование
Castlequest/Castle Excellent
<< < (8/10) > >>
Миха42:
Что-то ни фига не въеду, имеется код

--- Код: ---B6DD: A0 00       LDY #$00
B6DF: C8            INY
B6E0: B9 02 A0  LDA $A002,Y
B6E3: CD F7 07  CMP $07F7
B6E6: D0 F7       BNE $B6DF
B6E8: 88            DEY
B6E9: 98            TYA
B6EA: 0A            ASL
B6EB: 0A            ASL
B6EC: 0A            ASL
B6ED: 0A            ASL
B6EE: 0A            ASL
B6EF: 8D F5 07   STA $07F5
B6F2: A9 E0        LDA #$E0
B6F4: 18            CLC
B6F5: ED F5 07   SBC $07F5
B6F8: 8D F5 07   STA $07F5

--- Конец кода ---
По логике при каждом увеличении Y на 1 значение #Е0 должно уменьшаться на 20, по сути так и происходит, но вместо 20 отнимается 21, откуда взялся ещё 1, нифига понять не могу ведь перед вычитанием знак переноса очищается, а значит С должен быть равен 0 и по итогу должно выйти Е0-20-0=С0 но на выходе имеется ВF, в чём причина хз  :neznayu:

Добавлено позже:
Особенности модификации v1.5.0:
Теперь для каждой игры и разной сложности рекорд набранных очков сохраняется отдельно в RAM картриджа
Изменения в коде игры

Архив выложен в первом сообщении темы.
Так же выложил архив со всеми прежними версиями что выкладывал ранее.
Sharpnull:

--- Цитата: Миха42 от 25 Декабрь 2021, 09:07:21 ---Что-то ни фига не въеду
--- Конец цитаты ---
Перед вычитанием используют SEC, а не CLC как для ADC.

--- Код: ---LDA #$E0
SEC
SBC #$20
--- Конец кода ---
Регистр A будет равен #$C0.
Миха42:
Так SEC же наоборот устанавливает знак переноса, а в инструкции SBC А-М-С => А, С
В итоге Е0-20-1=С0
В чём прикол заключается?
Sharpnull:

--- Цитата: Миха42 от 25 Декабрь 2021, 11:56:14 ---В чём прикол заключается?
--- Конец цитаты ---
Это к создателям 6502, зачем-то нужно, может чтобы различать переполнение ADC и SBC. Вообще, Carry нужен для сложения или вычитания из 2+ байтных чисел, например 0x0201 - 0x0102 (первое лежит в RAM, второе - константа):

--- Код: ---LDA #$01
STA $00
LDA #$02
STA $01

LDA $00
SEC
SBC #$02
STA $00
LDA $01
SBC #$01
STA $01
--- Конец кода ---
Миха42:

--- Цитата: Sharpnull от 25 Декабрь 2021, 12:49:51 ---Это к создателям 6502, зачем-то нужно, может чтобы различать переполнение ADC и SBC. Вообще, Carry нужен для сложения или вычитания из 2+ байтных чисел, например 0x0201 - 0x0102 (первое лежит в RAM, второе - константа):

--- Код: ---LDA #$01
STA $00
LDA #$02
STA $01

LDA $00
SEC
SBC #$02
STA $00
LDA $01
SBC #$01
STA $01
--- Конец кода ---

--- Конец цитаты ---
Не спорю что это вопрос уже к разработчикам.
Наврятли они уже будут что переделывать.

Что с ADC в 2байтах и больше при переполнении ставится С=1, соответственно при сложении второго этот 1 добавится. Или же если второго байта нету, то после сложения проверяем флаг С чтоб знать переполнили значение или нет.
Так же и с SBC вычли из первого, получили С=1 в случае если не хватило, при вычитании второго или более байта соответственно этот 1 тоже вычтется, в случае если нет второго и более байта то проверяем С чтоб узнать, в плюсе число осталось или же ушло в минус отняв больше чем можно было.

А так приходиться сперва дать этот 1 для С, а потом уже после вычитания проверять понадобился он или нет. Лишний код только писать заставляет. Бред какой-то.  :-\
Единственное применение это чтоб быстро выполнить E5+25-1F тогда да используя всего 1байтовые значения сложили и следом вычли воспользовавшись дополнительным 1битом после записав в соответствующий байт памяти, но в случае же если скажем E5+25-03 то тут уже этот 1 бит сверх 8бит так и останется в флаге и будет потерян при записи в 1байт памяти что тоже безсмыленно.
Sharpnull:
Миха42, похоже эта логика (для SBC флаг Carry работает как Borrow) сделана просто ради оптимизации: вычитание в 6502 работает как сложение, нужно только инвертировать все биты вычитаемого. Здесь об этом написано:

--- Цитата: https://www.righto.com/2012/12/the-6502-overflow-flag-explained.html ---Defining the borrow bit in this way makes the hardware implementation simple. SBC simply takes the ones complement of the second value and then performs an ADC.
--- Конец цитаты ---
"ones complement" (обратный код) и есть инверсия всех битов.
Здесь тоже про оптимизацию вместо удобства программиста:

--- Цитата: https://www.reddit.com/r/EmuDev/comments/k5hzuo/6502_sbc/ ---This is a common trick, but most CPU designs would add explicit logic to invert the carry bit so the carry flag acts as expected. But the nmos 6502 is hyper-optimised to minimise transistor count so it skips that logic and pushes the burden onto the programmer.
--- Конец цитаты ---
Миха42:

--- Цитата: Sharpnull от 26 Декабрь 2021, 10:22:40 ---Миха42, похоже эта логика (для SBC флаг Carry работает как Borrow) сделана просто ради оптимизации: вычитание в 6502 работает как сложение, нужно только инвертировать все биты вычитаемого. Здесь об этом написано:"ones complement" (обратный код) и есть инверсия всех битов.
Здесь тоже про оптимизацию вместо удобства программиста:

--- Конец цитаты ---
Теперь ясно. Оптимизация процессора с целью уменьшения количества транзисторов и сокращения затрат на производство, в ущерб удобству программиста.
Миха42:
v1.6.0:
Добавил возможность изменять язык/стиль текста в игре (в игре пока только Русский перевод игры)
Настройки игры теперь тоже сохраняются в RAM памяти картриджа.

Пришлось перелопатить довольно много кода в игре чтоб сделать возможность смены языка/стиля текста в игре, возможно мог наделать багов в игре по неосторожности, требуется тестирование игры, пока что мог проверил, вроде бы всё работает. На всякий случай удалять 1.5.0 версию пока не стал в первом посту.
Почти весь текст из игры теперь находится в одном банке, в одном месте, что очень сильно облегчает добавление переводов на другие языки в игре, достаточно лишь добавить новый текст перевода в банк с текстом и тайлы алфавита языка на который сделан перевод, и он будет доступен для выбора на главном экране игры.

Если есть желание у кого перевести игру на другой язык и добавить в игру, буду рад помочь с организацией перевода.

Добавлено позже:
Накосячил малость со звуком, исправил, обновил ))

Добавлено позже:
Добавил заодно значок щита, появляется на время действия бессмертия, полезен при игре без музыки
Миха42:
Решил сделать анимацию при проигрыше. Но при попытке отрисовки спрайтов 8х16 он начинает брать спрайты с $1000 вместо $0000. При спрайтах 8х8 всё нормально берёт с $0000
Биты загнал:
00011010 в $2001
00110000 в $2000
Спрайты вывожу при помощи $4014

В самой игре всё работает норм при этом, разве что в $2000 задаётся ещё бит генерации NMI.
Что делаю не так?
Sharpnull:

--- Цитата: Миха42 от 18 Январь 2022, 17:20:26 ---при попытке отрисовки спрайтов 8х16 он начинает брать спрайты с $1000 вместо $0000
--- Конец цитаты ---
В режиме 8x16 тайлы берутся из обоих Pattern Table, если индекс тайла чётный - $0000, нечётный - $1000, а остальные биты указывают индекс 1-го тайла, а 2-й идёт следом, поэтому они выровнены по 2.
Миха42:

--- Цитата: Sharpnull от 18 Январь 2022, 17:35:24 ---В режиме 8x16 тайлы берутся из обоих Pattern Table, если индекс тайла чётный - $0000, нечётный - $1000, а остальные биты указывают индекс 1-го тайла, а 2-й идёт следом, поэтому они выровнены по 2.

--- Конец цитаты ---
Спасибо огромнейшее, ты гений.  :wow:  :hi: как всегда выручаешь советом.  ^_^
Полтора часа голову ломал, не мог всё понять почему так происходит, и как назло всю инфу что читал везде ни где ни разу об этом ньюансе не упоминалось. И угораздило же десятки раз пробуя раз за разом выводить спрайты всячески мучая настройки PPU ни разу при этом не ткнув случайно чётное значение спрайта.  :lol:
Миха42:
Дошли таки руки доделать концовку  :D
Миха42:
Обновил 1.6.2
Изменил картинку конец игры при проигрыше на анимированную
В моде unlimited fly & key добавил уровень сложности Очень легко

P.S.
Как и обещал сделал сложность в моде unlimited fly & key с бесконечными аквалангами.
ПАУК:

--- Цитата: Миха42 от 11 Февраль 2022, 20:45:25 ---Обновил 1.6.2
Изменил картинку конец игры при проигрыше на анимированную
--- Конец цитаты ---
Только после гамовера игру сбрасывать приходится. Нельзя его как-нибудь кнопкой "Start"?
Конец игры, возможно, лучше будет переименовать в "игра окончена".

Шрифты у Rus 2 так себе смотрятся. Может, вместо них оставить английский?

Я тут две ошибки нашёл.


ПС. Зачем такой сверхлёгкий режим с пачкой жизней, если дальше одного экрана не пройти? А если бочку уронить, то и его не пройдёшь :neznayu:
Миха42:

--- Цитата: ПАУК от 12 Февраль 2022, 15:35:20 ---Только после гамовера игру сбрасывать приходится. Нельзя его как-нибудь кнопкой "Start"?

--- Конец цитаты ---
Хотел по таймауту сделать автопереход на титульник, но в итоге только подумал сделать, пока сегодня на работе был, вспомнил про этот момент, как освобожусь, обязательно исправлю как к компу попаду.

--- Цитата: ПАУК от 12 Февраль 2022, 15:35:20 ---Конец игры, возможно, лучше будет переименовать в "игра окончена".
--- Конец цитаты ---
Да без проблем, тем более что теперь почти весь текст игры в одном месте.

--- Цитата: ПАУК от 12 Февраль 2022, 15:35:20 ---Шрифты у Rus 2 так себе смотрятся. Может, вместо них оставить английский?
--- Конец цитаты ---
Второй шрифт оставил как вариант для выбора.
Игра была дополнена менюшкой на титульнике и второй концовкой с текстом, вернуть английский без перевода на него остального текста теперь не разумно, хоть и сделать вполне легко теперь.
В дальнейших планах прикрутить ещё одну менюшку во время игры, а значит буду ещё добавлять текст, и его тоже нужно будет переводить.
Если согласитесь сделать перевод на английский, то буду рад его добавить в игру, все рамки ограничений в количестве символов для слов/фраз предоставлю.
А то с инглишом я не в ладах, могу лишь н#х послать на нём.  :D Юзаю переводчик обычно.
Могу любой перевод добавить в игру, с любыми тайлами букв, лишь было бы кому их делать. На данный момент до 8ми переводов можно добавить в игру, при желании могу расширить ограничения.

--- Цитата: ПАУК от 12 Февраль 2022, 15:35:20 ---Я тут две ошибки нашёл.
(Ссылка на вложение)
--- Конец цитаты ---
?

--- Цитата: ПАУК от 12 Февраль 2022, 15:35:20 ---ПС. Зачем такой сверхлёгкий режим с пачкой жизней, если дальше одного экрана не пройти? А если бочку уронить, то и его не пройдёшь :neznayu:

--- Конец цитаты ---
Данный уровень делался, ещё когда только начинал разбирать игру, для пробы возможностей, так же хорошо используется для тестирования на случай если что испорчу по части звука пока ковыряю код игры. На то и назвал Проще некуда.  :) По части бочки, ну должно же быть хоть что-то, что может навредить прохождению игры.  :D Но с другой стороны ведь в этом и есть вся фича игры, что если сделал что-то не так, то игру уже не пройти.  :cool:
Миха42:
Обновил 1.6.3
Добавил таймаут при проигрыше для перехода на титульник.
Изменил надпись при проигрыше на 'Игра окончена'

Касательно переводов если кого заинтересует:
ПАУК:
Появляющиеся надписи пропали на титульном экране под названием. Так задумано?
Миха42:

--- Цитата: ПАУК от 12 Февраль 2022, 21:04:15 ---Появляющиеся надписи пропали на титульном экране под названием. Так задумано?

--- Конец цитаты ---
Почему пропали?
Всё работает, и в FCEUX и в Mesen. Может вы не ту игру выбрали?
Надписи Unlimited Fly & Key появляются на титульнике только при выборе хака в настройках игры, в оригинальной версии данных надписей нету.

Добавлено позже:
Пока занимался оптимизацией кода в уже сделанных менюшках в игре, столкнулся с медленностью процессора, уж слишком мало кода перелопатить он успевает в интервалах между отрисовкой кадров, и если хоть чуть-чуть не успел изменить нужные тайлы на экране до отрисовки то получается полный ппц на экране.

И снова возник вопрос о птичках, о наших единичках!?

Как уже известно из приоритетов, при срабатывании прерывания NMI, IRQ/BRK процессор начнёт сперва выполнять их, и лишь после вернётся к основному коду, при том что NMI имеет наивысший приоритет и способен прервать даже IRQ прерывание.
Но возникает вопрос, что если во время исполнения кода NMI прерывания, программно вызвать IRQ прерывание, согласно приоритета исполнит до конца код NMI прерывания и лишь потом начнёт сполнять код IRQ прерывания, или сразу переключиться на IRQ код?
Миха42:
Обновил:
1.6.4
Вновь перелопатил код уже имеющегося меню настроек и титульного экрана.
Убрал Sub-Command меню которое вызывалось с J2 кнопками A или B
Добавил новое меню внутри игры, вызывается кнопкой SELECT вместо карты.
Карту теперь можно открыть внутри игрового меню.
Комманды сохранения, загрузки и прочие комманды из Sub Command меню теперь доступны в игровом меню.
Музыку в игре теперь в любой момент можно включить или выключить в процессе игры.
В случае если есть желание сменить игру или сложность игры, можно в любой момент покинуть игру и вернуться на титульный экран.
Теперь рядом с надписью загрузка будет появляться значёк загрузки при имеющемся сохранении для выбранной игры и соответствующей сложности.
Изменил сложность Проще некуда для версии игры Unlimited Fly & Key (Прежде чем открывать двери, стоит сперва поискать где же спрятаны ключи соответствующего цвета)

Приятной игры  ;)

В случае если где что не досмотрел или накосячил, сообщайте, буду пытаться исправлять.  :)
ПАУК:
Что-то с сохранениями не то. Стал сохраняться в самом начале, ещё перед первой дверью, и все жизни пропали.
Один раз пропала одна жизнь, после того, как одну нарочно запорол об шипы.

Добавлено позже:
А вообще, задумка хорошая :)
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии