Разработка и ромхакинг > Ромхакинг и программирование
Castlequest/Castle Excellent
<< < (3/10) > >>
Sharpnull:
Миха42, наверно для задержки. Как ещё на NES можно замедлиться?
Миха42:
Хмм...

Довольно странно, несмотря на то что все действия в игре привязаны к счётчикам кадров nmi

А обработку кода наоборот замедлять???  o_0

Есть момент когда на лифтах в одной из локаций маги могут насоздавать довольно много нпц если постоять подождать, и игра начинает очень сильно тормозить при этом обрабатывая их всех кому и что делать, так и хочется запустить на разогнанном эмуле при этом, чтоб не смотреть на слайд шоу, а тут ещё и намеренно тысячами циклов игру тормозить, где логика не пойму нифига.  :neznayu:

Кстати ни кто не в курсе как можно загрузить косвенный адрес вроде LDA ($ABCD),X ?
А то мутить что-то вроде:
0x8000: CLC
0x8001: CLV
0x8002: LDA $ABCE
0x8003: STA $0000
0x8004: TXA
0x8005: ADC $ABCD
0x8006: BVC $8008
0x8007: INC $0000
0x8008: TAY
0x8009: LDA ($00),Y
0x800A: STA $0100

это ппц.
Cyneprepou4uk:

--- Цитата: Миха42 от 02 Май 2020, 21:25:53 ---в игре постоянно встречаю что-то вроде:
0х0: LDX #$77
0х1: DEX
0х2: BNE $1
--- Конец цитаты ---

Эта задержка чаще всего делается в обработчике IRQ, чтобы корректно поместить статусбар на экран. В редких случаях для сложных графических эффектов. Попробуй удалить этот цикл, или изменить начальный счетчик, посмотри что будет.


--- Цитата: Миха42 от 02 Май 2020, 21:59:00 ---как можно загрузить косвенный адрес вроде LDA ($ABCD),X ?
--- Конец цитаты ---

Таких инструкций не существует. Косвенная адресация использует соседние адреса в нулевой странице. За исключением косвенного JMP с опкодом 6C, тут могут быть любые соседние абсолютные адреса, но без индексных регистров в самой инструкции.
Миха42:

--- Цитата: Cyneprepou4uk от 03 Май 2020, 10:04:48 ---Попробуй удалить этот цикл, или изменить начальный счетчик, посмотри что будет.

--- Конец цитаты ---
Попробую, погляжу )


--- Цитата: Cyneprepou4uk от 03 Май 2020, 10:04:48 ---Таких инструкций не существует. Косвенная адресация использует соседние адреса в нулевой странице. За исключением косвенного JMP с опкодом 6C, тут могут быть любые соседние абсолютные адреса, но без индексных регистров в самой инструкции.

--- Конец цитаты ---
Вот я и не нашол подобной инструкции к сожалению для своей задумки.
Про нулевую страницу я вкурсе уже изучил, там лишь младшим байтом можно косвенно управлять при старшем 00, наиболее подходящим и оказался лишь B1 LDA ($хх),Y, но с ним дополнительно лепить уйму кода нужно  :-\
и про косвенный  JMP вкурсе, но мне хотелось сделать что-то вроде указателей в таблице начиная с каких адресов читать массивы со смещением по Х или Y, но ни чего подобного в инструкциях процессора не нашол.
Надеялся может альтернативый вариант какой есть.
Ti_:

--- Цитата: Cyneprepou4uk от 30 Апрель 2020, 08:01:25 ---Миха42, прерывание помнит только адрес возврата, больше ничего. На выходе из прерывания регистры, флаги, банки и переменные в адресах останутся такими, какими ты их сделаешь внутри своего обработчика прерывания.

В принципе можешь рассматривать прерывание как внезапный JSR, только выход у него через RTI.

--- Конец цитаты ---
Нет.

Флаги процессора сохраняются в стек, поэтому и возврат через RTI, а не RTS. То есть не только адрес возврата, но и ещё 1 байт флагов.
Но некоторые особо упоротые разрабы добавляли PHP и PLP .

Ещё в прерывании выставляется I флаг. Поэтому если ты задаешь строку для  IRQ,  добавляй CLI сразу в двух местах в основном коде, и в nmi. (в том случае, если у тебя из кода nmi, не всегда будет успевать до нужной строки выйти).
Cyneprepou4uk:
Миха42, да, подготовка для косвенного LDA относительно большая, но оно того стоит если знать зачем оно.

Для твоего случая можно что-то типа такого

LDX array_id_addr
LDA array_lo_tbl,X
STA $00
LDA array_hi_tbl,X
STA $01
LDY #$00
LDA ($00),Y

Готовишь таблицу с поинтерами на массив и читаешь ее, остальную логику сам допишешь, или спрашивай.

Добавлено позже:
Ti_, точняк, я чета подзабыл уже, спасибо
Миха42:

--- Цитата: Cyneprepou4uk от 03 Май 2020, 11:20:55 ---Миха42, да, подготовка для косвенного LDA относительно большая, но оно того стоит если знать зачем оно.

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


P.S.
И так уже в четвёртый раз вчера начал всё с самого начала переписывать код по новой, а то пока переписал уже 75% всего кода допустил где-то ошибку, карта локации грузилась только при зажатом старте ), в результате лень опять пересматривать всю свою стрепню в поиске ошибки, решил начать вновь с нуля, да и изучив почти все функции в коде на 80% и разобрав почти все данные записей в память рам, оказалось не задействованно в игре 68байт ram, пришол к выводу что некоторые массивы и код не правильно распределил по банкам, что мешает удобно вынести всю информацию касательно карты замка в один банк для последующей лёгкой правки. Вот и решил переписать весь код ещё раз, заодно некоторые адреса в ram перенести  :)

Добавлено позже:

--- Цитата: Ti_ от 03 Май 2020, 11:13:48 ---То есть не только адрес возврата, но и ещё 1 байт флагов.

Ещё в прерывании выставляется I флаг. Поэтому если ты задаешь строку для  IRQ,  добавляй CLI сразу в двух местах в основном коде, и в nmi. (в том случае, если у тебя из кода nmi, не всегда будет успевать до нужной строки выйти).

--- Конец цитаты ---
На счёт флагов спасибо, полезная информация.
По части IRQ благо он не используется в игре и сразу кроется RTI, а на счёт NMI я уже всё скорректировал чтоб сохранял в память все номера банков используемые в процессе и по окончанию прерывания возвращал помимо регистров ещё и банки все по своим местам, вроде норм всё работает теперь.
Исходя из статьи на dendy.migera.ru, Приоритет прерываний следующий (от более приоритетного к менее): RESET, NMI, IRQ/BRK.
Я так понял при срабатывании NMI прерывания с более высшим приритетом IRQ будет будет ждать пока NMI не завершится, и лишь потом сработает, или я не правильно понял?
Cyneprepou4uk:

--- Цитата: Миха42 от 03 Май 2020, 11:51:20 ---IRQ будет будет ждать пока NMI не завершится?
--- Конец цитаты ---

Походу да
Liam Phoenix:
Привет Миха!
Отличная идея!!! Я сам люблю покопаться с ретроиграми (правда я не программист), но с детства любил строить свои уровни (Battle City, Lode Runner, Excitebike, Nuts & Milk). Сейчас переделываю Duna на SEGA и Wolfeinstein 3D на DOS.
Как кто-то выразил желание, по-поводу бессмертия. Лично мне кажется так неинтересно, менять механику игры, другое дело полностью переделать карту, усложнить игры. Но упрощать, чтобы потом поставить галочку "Я ЕЁ ПРОШЁЛ!!!" это признаться в неспособности найти сил и, извините, мозгов, чтобы её пройти.
Я сам в детстве её не проходил. Но буквально недавно узнал, что принцессу зовут Маргарита, именно так зовут мою невесту, что аж решил уже в почти 30 летнем возрасте переиграть заново и пройти наверняка, почувствовать себя рыцарем 8битной вселенной, который спасёт свою принцессу  :D
К слову, даже заказал из США оригинальный Castlequest на NES в полном комплектацией с мануалом и картой всего замка. Через месяц уже будет у меня.

Поэтому Миха, дерзай. Знай, есть ещё те, кому не безразлична эта игра  :blush:
Если сможешь понять, как менять карту, можем даже с тобой вместе засесть и придумать новый замок, пиши в ВК https://vk.com/antongagarin.official

Удачи тебе и терпения в нелёгком деле.
С уважением,
Антон.
Миха42:
Добрый день всем.
Долго конечно отсутствовал, но ведь лето оно и есть лето, отдыхал.  ^_^ К тому же дома ремонт, теперь когда с ремонтом затишье, а вернее попросту деньги закончились на это, решил вновь заняться игрой от безделия, ведь осталось вроде всего 2кб кода перелопатить из 32кб, а я насколько помню когда перестал ей заниматься так и не смог понять почему код перестал работать после того как переписал обработку действий персонажа в игре, перепроверял код неоднократно, всё без ошибок, но программа всё равно останавливается.
В результате сейчас вновь дважды перепроверил весь код подпрограммы, ошибок так и не нашол, но нашол предположительную причину краха всей работы, после разрисовывания на листке бумаге оказалось что обработка действий требует больше уровней стека вызовами подпрограмм, и jmp'ами с записью адреса возврата в стек. Видимо это и стало моей проблемой ведь особо не задумываясь над уровнями стека из-за неопытности пренебрегал вниманием к нему и лепил jsr везде где необходимо было дабы реже писать один и тот же код.

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

По части принципа работы стека можно уже не объяснять, больше интересует информация относительно его вместимости. На сколько я уже вкурсе:
JSR тратит 1 уровень стека записывает 2 байта адреса возврата.
JMP уровни стека не расходует, адрес возврата так же не пишет?
NMI тратит 1 уровень стека записывает 3 байта адрес возврата и состояние флагов
PHA и PLA использует 1 байт для записи аккумулятора в стек, уровни стека не расходует?

Интересует сколько байт можно записать в 1 уровень стека, и влияние PHA на уровни стека?
Cyneprepou4uk:
Что еще за "уровень стека"? Стек сам по себе не хранит инфу о том, откуда и как именно в него были помещены байты.

Размер стека $0100-$01FF. Адреса стека могут быть использованы игрой как обычные адреса оперативки.

Имеется 8-битный регистр указателя стека, который уменьшается или увеличивается в зависимости от выполненной инструкции или прерывания. Игры обычно ставят указатель на FF при запуске. Указатель отображается в дебаггере.
Миха42:

--- Цитата: Cyneprepou4uk от 29 Ноябрь 2020, 22:31:42 ---Что еще за "уровень стека"? Стек сам по себе не хранит инфу о том, откуда и как именно в него были помещены байты.

--- Конец цитаты ---
Возможно не правильно выразился где-то, уровни возврата из подпрограмм ограничиваются объёмом памяти выделенной под стек, 256 байт стека допускают не более 128 уровней возврата из подпрограмм при условии что память стека больше ни чем не задействована, а PHA так же задействует байты стека уменьшая количество уровней возврата из подпрограмм. Спасибо статье пару минут назад нашол http://pscd.ru/info/2183-programmirovanie-processora-6502-programming-the-6502.html наконец то разобрался в вопросе что хотел постичь.
Игрой память задействуется по полной(сложно найти свободные байты ram памяти которые ни чем не задействованны чтоб занять их своей инфой), в том числе и память стека задействуется в качестве обычной памяти для игры для хранения информации, тем самым сильно ограничивая количество памяти под стек, тут то возможно и вышли у меня накладки с нехваткой памяти и наложение данных друг на друга, вообщем нужно внимательно перепроверять теперь и этот момент. Есть теперь над чем вновь покумекать.
Спасибо за отклик, хоть и не помог.  ;)
Миха42:
Подобный шрифт возможно где найти?

Вроде чуть-чуть похоже получилось самому сделать.  :D
Sharpnull:

--- Цитата: Миха42 от 09 Декабрь 2020, 19:38:53 ---Вроде чуть-чуть похоже получилось самому сделать.
--- Конец цитаты ---
Уже есть похожая H (англ) из HI-SCORE, у вас Н (рус) получилась с толстой горизонтальной чертой и засечки не так. Также плохо с Й, К, И.
Миха42:

--- Цитата: Sharpnull от 09 Декабрь 2020, 22:56:40 ---Уже есть похожая H (англ) из HI-SCORE, у вас Н (рус) получилась с толстой горизонтальной чертой и засечки не так. Также плохо с Й, К, И.

--- Конец цитаты ---
Про HI- SCORE забыл совсем, спасибо что напомнил.
Ну с остальными буквами буду что-нить дальше мудрить авось какие и сгодятся потом, не умещаются зараза русские буквы в рамки тайла 7х8 а по 2 тайла тратить на букву как-то не хочется, но видимо прийдётся.  <_<

На счёт Н пожалуй прав там лучше смотрится, и даже букву К и Е из KEY можно тоже взять, не смотря на то что Key и Hi-score уже другой стилистики, но буквы С и О уж совсем убого там смотрятся в игре  :-\ С я точно свою оставлю, а вот над О можно ещё попробовать помудрить, авось получше получится.
Миха42:
Переделал вновь но К всё равно как-то не очень на мой взгляд

Прежний вариант пожалуй был лучше верну его. 
MaxWooD:

--- Цитата: Миха42 от 10 Декабрь 2020, 15:38:14 ---но К всё равно как-то не очень на мой взгляд
--- Конец цитаты ---
Латинской К разве нет в шрифте?
Миха42:

--- Цитата: MaxWooD от 10 Декабрь 2020, 15:41:09 ---Латинской К разве нет в шрифте?

--- Конец цитаты ---
Вот и зделал как в латинице сейчас на последней фотке, но поскольку в самой игре стилистика букв немного другая нежели на титульнике, в результате она так не смотрится нифига, верну в итоге пожалуй как в первый раз зделал
Миха42:
Каких только тайлов тут нет в игре. Остаётся лишь гадать откуда они их понабрали и для чего они были нужны разработчикам. Особенно пингвин с непонятно что за зверем  :)
Sharpnull:

--- Цитата: Миха42 от 10 Декабрь 2020, 15:38:14 ---Прежний вариант пожалуй был лучше верну его.
--- Конец цитаты ---
Про "О" и "C" я не говорил, потому что они нормальные и похожи на цифры. На уровне шрифт другой, так что копировать не стоило. У "К" мне не нравилась засечка внутрь, лучше у "А" и "R" внутрь слева. У "Н" толстая горизонтальная черта, как уже говорил. С "Й" и "И" проблема, можно убрать засечки совсем или сделать шире, если есть свободные тайлы, но тогда и "Н" лучше сделать шире с засечками с обоих сторон. Про толщину у диагонали "ИЙ" не знаю как лучше.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

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