Разработка и ромхакинг > Ромхакинг
[NES] Castlequest / Castle Excellent
<< < (2/10) > >>
Миха42:
Мля, переводчик нужен на win10 не то написал в торопях
В моей винде вобще нет калькулятора, только в телефоне.
В инете перевести не могу числа в двоичную систему и обратно, и калькуляторы тупят тоже в инете в двоичной.
Sharpnull:

--- Цитата: Миха42 от 16 Апрель 2020, 22:10:17 ---В инете перевести не могу числа в двоичную систему и обратно, и калькуляторы тупят тоже в инете в двоичной.
--- Конец цитаты ---
Пример напишите, что вы задаёте, что получаете и что ожидали получить.

--- Цитата: Миха42 от 16 Апрель 2020, 22:10:17 ---В моей винде вобще нет калькулятора
--- Конец цитаты ---
Говносборка или удалили? Его можно восстановить: https://superuser.com/questions/978877/how-can-i-reinstall-windows-10s-calculator-app. Если не удалили Windows Store, то https://www.microsoft.com/ru-ru/p/windows-calculator/9wzdncrfhvn5.
Mr2:

--- Цитата: Миха42 от 16 Апрель 2020, 22:10:17 ---В моей винде вобще нет калькулятора, только в телефоне.

--- Конец цитаты ---
Попробуй запустить калькулятор через эту программу. Пункт меню Soft->Calculator.
Sharpnull:

--- Цитата: Mr2 от 17 Апрель 2020, 10:30:40 ---Попробуй запустить калькулятор через эту программу. Пункт меню Soft->Calculator.

--- Конец цитаты ---
Win+R, calc, Enter :)
Yoti:
Sharpnull,
тихо, не видишь человек свой бесполезный мусор проталкивает?
Mr2:
Не такой уж и бесполезный, раз смог тролю пердак подпалить. :rofl:
Yoti:
Mr2,
ты бы хоть этимологию термина "[сетевой] тролль" для начала узнал, прежде чем пытаться ввернуть слово по теме и без. Причём, с ошибкой.
Миха42:

--- Цитата: Sharpnull от 17 Апрель 2020, 09:06:09 ---Если не удалили Windows Store, то https://www.microsoft.com/ru-ru/p/windows-calculator/9wzdncrfhvn5.

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

Спасибо, как раз именно то что нужно.  :thumbup: , а главное всегда под рукой  :)
Миха42:
Со вчерашнего дня голову ломаю, переписал в prg банку весь код генерирования карты и забивания её в RAM вместе со всеми массивами, всё вроде норм работает банки переключаются код исправно работает всё 1в1 исправно как в оригинале, но в оригинале она правильно генерируется, а у меня нет. Два дня голову ломал пока ненароком не залез в ppu, так оказалось что он ещё и оттуда код подгружает для генерирования карты, не даром в процессе загрузки карты chr банки меняет, на что я не обратил внимания даже.
До чего же хитрые блин зараза эти разработчики были ппц просто.  :furious:
Миха42:
Извеняюсь за назойливость, но может мне ктонить разжевать подробно инструкцию ORA в асм 6502?
На сколько я помню в том же MySQL и пыхе которые я раньше юзал or выполнял роль условия (в моём понимании) при котором если не соотвествовало одно значение значит проверяли другое и после получали результат либо ничего. А как обстоят здесь дела относительно А or M и флагов хотелось бы узнать подробно.

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

--- Цитата: Миха42 от 22 Апрель 2020, 07:39:45 ---в том же MySQL и пыхе которые я раньше юзал or выполнял роль условия
--- Конец цитаты ---
Это логический оператор ИЛИ (PHP: ||, or), а здесь побитовый оператор (PHP: |). ORA в 6502 побитовое ИЛИ: A | M → A, если результат в пределах $#00-7F, флаг N снимается, если не равен нулю, то флаг Z снимается, а в обоих случаях иначе устанавливаются флаги. Иногда нужно просто установить какой-то бит, чтобы позже проверить. Очевидно, что можно использовать как логический оператор ИЛИ, чтобы сразу проверить, что A и M оба равны нулю или один (оба) из них нет. Не разбираюсь в ASM, наверно в каких-то трюках ещё можно использовать.
Миха42:
TXA
LSR
AND #$01
ORA $26
TAX
LDA $E913,X

Пример из кода, если исходить из твоих слов что просто смотрит как выставить флаги у процессора или 8ой бит относительно значений, я бы ещё понял в случае если потом шол бы перенос далее, но далее он грузит ячейку памяти, исходя из значения ячейки 26, а значит думается мне он не просто флаги выставляет у аккумулятора.

Ведь даже исходя из простой инструкции сравнения аккумулятора со значением CMP он вычетает из аккумулятора занчение М и относительно остатка в аккумуляторе выставляет флаги. да получился 0 ни чего не осталось, а значит значения равны ставим флаг соответствующе, или же значение М больше оказалось и остаток А ушол в отрицательное значение выставив опять же соответствующий флаг, или же попросту осталось ещё что-то в аккумуляторе, значит не равны.

То же самое думается мне должно быть что-то подобное и там с инструкциями ORA и EOR, ведь тут также используется сверка значений, но только в тех же пыхе SQL и басике на сколько мне помниться просто получим результаты true или false (сошлось или нет указанные значения с чем-то, и дальше выполним соответствующую инструкцию а про сами значения что отправили для сверки и забудем ведь они свою задачу выполнили (не забиваем голову что с ними сталось на машинном уровне)) ведь само по себе слово ИЛИ(OR) означает что, проверить одно, если не сошлось, то проверить другое значение, но вот что происходит на машинном уровне побитно и уж тем более что происходит в итоге с самим значением аккумулятора (учитывая что мы его используем дальше как значение, а не просто результат), это загадка которую хотелось бы постичь.  :?

Sharpnull:

--- Цитата: Миха42 от 22 Апрель 2020, 13:28:39 ---значит думается мне он не просто флаги выставляет у аккумулятора.
--- Конец цитаты ---
В примере не используются флаги процессора, а используют инструкцию по назначению - установка битов. По этому куску кода не скажешь, что именно делается, только ясно, что выбирается откуда загружать (как вы и сказали): адрес $E913 + значение $26 + Number, где Number равно 1, если число по адресу $26 имеет 0 в 0-м бите и A был 1, иначе равно 0 (потому что либо в A был 0 после AND #$01, либо значение $26 уже имеет установленную 1 в 0-м бите).
Ещё иногда побитовое ИЛИ аналогично +, если биты двух операндов не пересекаются и числа беззнаковые.
--------
У вас проблема не с ORA, с который всё просто, а с тем, зачем ORA используется, т. е. логика остального кода.
Миха42:
То есть значение М влияет лишь на биты в аккумуляторе без сложения изменяя относительно значения?

Предположим если в А будет
1111 0111
а М будет
0101 0101
То получим ?
10100010

Или я что-то не пойму.
Просто я хочу понять как ORA и EOR влияют на биты. Чтоб понять что происходит со значениями после этого ORA.
Sharpnull:

--- Цитата: Миха42 от 22 Апрель 2020, 15:22:37 ---Предположим если в А будет
1111 0111
а М будет
0101 0101
То получим ?
10100010
--- Конец цитаты ---
Будет 1111 0111. К каждому биту применяется дизъюнкция, поэтому эти операции и называются побитовые (bitwise). Только не нужно путать "логические операции" языков программирования и название дизъюнкция как "логи́ческое сложе́ние, логи́ческое ИЛИ", в языках программирования логическими называют те, которые используются в условиях if (A || B) - значения A и B приводятся к true, false и сравниваются.
--------
EOR - Исключающее «или». Тоже просто, но нужно знать о трюках, для которых используется XOR, есть всякие книги и статьи по трюкам с битам, будет полезно.
--------
Например, из свойств ясно, что EOR #$FF сделает инверсию всех битов, что в C/C++ и похожих записывается как ~A.
Миха42:

--- Цитата: Sharpnull от 22 Апрель 2020, 14:30:02 ---У вас проблема не с ORA, с который всё просто, а с тем, зачем ORA используется, т. е. логика остального кода.

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

Можно и так сказать, просто сложно пытаться что-то разбирать в коде не понимая что делает какая-то инструкция. А эти две я не могу понять до сих пор как они влияют на значения и на флаги, с остальными вроде со всеми разобрался какие встречал. И вполне нормально разбираю логику кода.
К тому же нужно переписать передалать код хранения открытых локаций в RAM для построения карты чтоб вместо FF открыта/ 00 нет было побитно 1/0 как это сделано с предметами использованными в игре и открытыми дверями.

А то RAM памяти катастрофически не хватает в игре.

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

--- Цитата: Sharpnull от 22 Апрель 2020, 15:36:59 ---Будет 1111 0111. К каждому биту применяется дизъюнкция, поэтому эти операции и называются побитовые (bitwise). Только не нужно путать "логические операции" языков программирования и название дизъюнкция как "логи́ческое сложе́ние, логи́ческое ИЛИ", в языках программирования логическими называют те, которые используются в условиях if (A || B) - значения A и B приводятся к true, false и сравниваются.
--------
EOR - Исключающее «или». Тоже просто, но нужно знать о трюках, для которых используется XOR, есть всякие книги и статьи по трюкам с битам, будет полезно.
--------
Например, из свойств ясно, что EOR #$FF сделает инверсию всех битов, что в C/C++ и похожих записывается как ~A.

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


Вот теперь доходчиво понял что происходит с битами, спасибо за информацию. ))))

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

--- Цитата: Sharpnull от 22 Апрель 2020, 15:36:59 ---Тоже просто, но нужно знать о трюках, для которых используется XOR, есть всякие книги и статьи по трюкам с битам, будет полезно.
--------
Например, из свойств ясно, что EOR #$FF сделает инверсию всех битов, что в C/C++ и похожих записывается как ~A.

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

Уж извеняйте что я многое возможно не понимаю, по скольку я никогда и ни где не учился программированию, являюсь самоучкой, а в терминологии вообще полный ноль.
Мною движет лишь желание воплощать в жизнь задумки, так я всегда и писал на пыхе зная что хочу получить в результате, а как и какими функциями реализовать задуманное это походу изучал  ну и wapadmin выручал порой.
А на visual basic к сожалению не далёко в познания ушол, дальше арканоида дела не продвинулись и то в виде блоков цветных блоков, по сколько с графикой я не в ладах и рисовать не умею. Потому и бросил данную затею.  :D
Миха42:
Ещё возник вопрос, по части прерываний.

В момент срабатываний NMI, IRQ прерываний как описано в инструкциях процессор приостанавливает исполнение программы, выполняет инструкцию для прерывания, а после возвращается обратно к исполнению программы.
Если во время прерывания были изменены данные некоторых ячеек памяти и изменены банки памяти, при возврате к программе он будет помнить только значения аккумулятора и регистров и продолжит исполнение программы с адреса где была приостановлена работа? Или забудет регистры с аккумулятором и начнёт выполнять программу с начала?
А то чуется мне придётся ещё и выделять ячейки в памяти для сохранения номеров prg банок используемых программой, чтоб по окончанию обрабатываемого прерывания возвращал все банки на свои места.  o_0
Cyneprepou4uk:
Миха42, прерывание помнит только адрес возврата, больше ничего. На выходе из прерывания регистры, флаги, банки и переменные в адресах останутся такими, какими ты их сделаешь внутри своего обработчика прерывания.

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

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

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

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

Ок спасибо за инфу, а то в игре в коде прерывания уже были прописаны сохранение регистров в память и возврат их в изначальное состояние по окончанию прерывания, а вот переписывая игру раскидывая код по банкам я не учёл этот момент (, прийдётся значит искать ещё 6 байт незадействованных в ram памяти для записи номеров банков которые возвращать на свои места по окончанию прерываний, а то в игре один только вывод картинки на экран занимает чуть больше одного банка памяти, потому и пришлось его вынести в отдельные банки, из-за этого значит и начал код что попало чудить, сменить сменил банки, а вернуть не вернул. :)
Миха42:
Вопрос на засыпку, в игре постоянно встречаю что-то вроде:
0х0: LDX #$77
0х1: DEX
0х2: BNE $1
А дальше вновь задаётся какое либо значение регистру и идёт прочий код.
И встречается это постоянно, то с регистром х, то с у, а то и оба сразу.
 Если тупо выставить флаги, то почему бы LDX #$01 не указать чтоб циклов поменьше было или сразу LDX #$00 если 0 нужен?!
Или тут какой-то скрытый смысл имеется в подобного рода манипуляциях аж по несколько сотен, а то и тысяч циклах порой?  :?

Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

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