Автор Тема: [ALL] Вопросы новичков  (Прочитано 22420 раз)

VatnoComputerFun и 1 Гость просматривают эту тему.

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 206
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #60 : 12 Август 2021, 05:04:33 »
[NES] Jackal 1988

RayofJay как раз занимается этой игрой, можешь с ним перетереть.
https://discord.gg/KTXkUzgMSs

Оффлайн p4oeNix

  • Пользователь
  • Сообщений: 4
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #61 : 12 Август 2021, 11:12:36 »
RayofJay как раз занимается этой игрой, можешь с ним перетереть.
https://discord.gg/KTXkUzgMSs

спасибо от души тебе человечище! я нереально счастлив, много лет думал об этом и тут момент пришел найти форум и написать на нем и тут как раз игра подоспела)
лучший подарок! еще раз спасибищеее!

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1297
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #62 : 12 Август 2021, 13:45:11 »
Rumata, вот что действительно не нужно было закреплять, так это темы, которые последний раз обновлялись в 2020-м году:
Atari ST игры на Atari Jaguar
Последний ответ 31 Декабрь 2020, 21:57:57
      
DOStoWIN Project - портирование DOS игр на Windows
Последний ответ 30 Декабрь 2020, 03:46:45

Оффлайн Еmsi-D

  • Пользователь
  • Сообщений: 552
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #63 : 13 Август 2021, 10:59:45 »
есть такая игра [NES] Jackal 1988
на нее нет никаких хаков
На заморском ромхацкинге есть какие-то

https://www.romhacking.net/games/2627/

Оффлайн p4oeNix

  • Пользователь
  • Сообщений: 4
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #64 : 13 Август 2021, 21:16:31 »
На заморском ромхацкинге есть какие-то

https://www.romhacking.net/games/2627/
спасибо добрый человек! теперь я научен и ищу сам все:)

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24729
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #65 : 19 Август 2021, 02:09:27 »
Rumata, вот что действительно не нужно было закреплять
DrMefistO, а зачем ты мне об этом говоришь? o_0 У вас тут модераторов раздела аж три человека. Правда, никто из них нихрена не делает. Но это не мои проблемы :rofl:
« Последнее редактирование: 19 Август 2021, 03:18:18 от Rumata »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1297
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #66 : 20 Август 2021, 16:27:00 »
DrMefistO, а зачем ты мне об этом говоришь? o_0 У вас тут модераторов раздела аж три человека. Правда, никто из них нихрена не делает. Но это не мои проблемы :rofl:
Думал, ты модер здесь:) Кто-то же закрепил местную тему.

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24729
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #67 : 22 Август 2021, 22:03:01 »
Думал, ты модер здесь:)
Думать вредно. Достаточно просто читать. Тут три модератора. На сколько они функциональны - не ко мне.

Кто-то же закрепил местную тему.
Я и закрепил. А что? Вроде я же об этом и сказал.

А сейчас я типа в отпуске. И в общем-то на все местечковые проблемы мне насрать. Может вернусь. Может нет. Жизнь покажет

Оффлайн Selykreg

  • Пользователь
  • Сообщений: 32
  • Пол: Мужской
  • 10кВ 50Hz 8bit
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #68 : 27 Ноябрь 2021, 12:55:11 »
Всем добра! В ромхакинге уже и не новичок и сделал довольно много хаков на тему 8 бит, но всё же есть вопрос по поводу команд 6502, а если быть точнее, то назначение действия при нажатии комбинаций  (да что там, хотя бы на одну кнопку для началаo_0) кнопок.Если с записью, загрузкой, сравнением и вычитанием  всё понятно,то как задать логическую команду "если - то"? С ромхакингом и структурой команд знакомился через учебник Кая по ромхакингу( автору огромное уважение за предоставление материала любителям) Часть материала доступна и понятна, но на тему кнопок сразу же предлагается "домашнее задание" без каких-либо примеров.
Буду очень благодарен за наставление и объяснение на тех же самых "Танчиках"(архитектура игры и структура переноса данных по стекам логична и не замысловата, но...) Команда. Нажата кнопка select, то добавляем некое число байт попыток, например. Так понимаю, здесь имеет место быть команда сравнения CMP 🤔

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 206
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #69 : 27 Ноябрь 2021, 16:18:35 »
как задать логическую команду "если - то"?

С помощью команд условного перехода: BEQ/BNE, BMI/BPL и другие.

Простой пример:
LDA адрес с кнопками
CMP кнопка select
BEQ переход при равенстве (то есть если нажата select)

Если неравенство (если select не нажата), то перехода не будет, и код продолжит выполнять следующую команду по списку.

Но отдельные кнопки лучше фильтровать через команду AND, так надежнее на случай если несколько кнопок нажаты одновременно. Логика немного другая:
LDA адрес с кнопками
AND кнопка select
BEQ если кнопка НЕ нажата (если проверяемый бит = 0)
далее идет какой-то код если кнопка нажата

Оффлайн Selykreg

  • Пользователь
  • Сообщений: 32
  • Пол: Мужской
  • 10кВ 50Hz 8bit
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #70 : 29 Ноябрь 2021, 16:54:15 »
Cyneprepou4uk, спасибо за развёрнутый ответ, сейчас буду внедряться всем умственным потенциалом :wow: Если что, можно будет в будущем задать ещё парочку ( в энной степени :) ) вопросов по этому поводу❓ :blush:


Добавлено позже:
Простой пример:
LDA адрес с кнопками
CMP кнопка select
BEQ переход при равенстве (то есть если нажата select)
При старте игры в танчиках грузится и записывается 3 байт жизней

Джойстик отображает нажатие по адресу 0006 4 байт.
LDA A5 06
CMP C9 04
Что делать далее, куда нужно переходить флагом, на адрес C2CD? Хотя, нет, нужно переходить к адресу выполнения инструкции, так? Но где тогда находится условие, при котором игра выполняет загрузку и запись?  Команда "то" известна, это загрузка и запись, а где условие "если", где оно прописывается при старте? :neznayu: Ничего не понятно.
« Последнее редактирование: 29 Ноябрь 2021, 20:09:38 от Selykreg »

Оффлайн Миха42

  • Пользователь
  • Сообщений: 286
  • Пол: Мужской
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #71 : 30 Ноябрь 2021, 20:14:04 »
LDA A5 06
CMP C9 04
Если я правильно понял, то в ячейку 0006 пишется нажатие кнопок джойстика.
После команды CMP процессор установит флаги регистра, далее следующая команда тебе и скажет куда двигаться далее в зависимости от значения регистра.
Как правило дальше скорее всего будет стоять BEQ (F0) или BNE (D0) которое тебе укажет по какому адресу выполнять дальнейшую инструкцию в случае совпадения условия. Если же условие не совпадает, то процессор продолжит исполнять инструкции идущие дальше после условия.

Предположим у тебя в $0006 хранится значение 04
Далее ты выполняешь команду СМР сравнивая со значением 04, команда СМР выставит флаг регистра Z=1 по скольку значения равны.
Потом выполняем команду BEQ (Если флаг регистра Z=1, то) в данном случае Z у нас имеет значение 1, то процессор выполнит инструкцию прыжка на адрес указанный в команде BEQ. BEQ же у нас указывает на сколько адресов нужно сместиться вперёд (F0 00-7F) либо назад (F0 80-FF), собственно куда указал BEQ на том адресе процессор и продолжит выполнять инструкции.

В случае же если бы у нас в ячейке $0006 было любое другое значение, то после команды СМР сравнения с значением 04, CMP выставил бы флаг Z = 0 по скольку значения были бы не равны. И процессор читая команду BEQ не стал бы выполнять прыжок на указанный адрес в команде, по скольку флаг Z не равен 1, значит данное условие не выполнено, процессор продолжит выполнять инструкции идущие после команды BEQ.

Добавлено позже:
Условие 'если' это и есть команды: BCC, BCS, BEQ, BMI, BNE, BPL, BVC, BVS.

А вот какие инструкции выполнять дальше по какому адресу они и укажут в случае если это 'если' совпало. В противном случае продалжаем читать дальше следующие команды.

Добавлено позже:
Процессор не может выполнить прямую команду при условии 'если' на примере сравнения значений или же проверки больше или меньше, всё что он может сделать командой 'если' это проверить значения флагов регистра P процессора и не более того.
А вот команды которые управляют этими самыми флагами и их возможности это уже совсем другая история.
« Последнее редактирование: 30 Ноябрь 2021, 20:38:56 от Миха42 »

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 206
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #72 : 01 Декабрь 2021, 01:32:22 »
Selykreg, не совсем понятно что ты хочешь сделать, сформулируй вопрос нормально.

Код, который у тебя на скрине, выполняется лишь 1 раз перед началом игры. Если ты хочешь туда присунуть условие на кнопку, то в лучшем случае у тебя получится что-то типа "если я удерживаю кнопку select перед началом игры, мне дается ?? жизней вместо 3х".

Если в коде нет никаких условий, он выполняет команды сверху вниз. В твоей подпрограмме C2B3-C2E5 на скрине есть лишь одно условие в C2D7 - обнулить адрес с жизнями 2го игрока, если выбран режим "1 player", так как по умолчанию игра записывает жизни обоим игрокам сразу.

Оффлайн Selykreg

  • Пользователь
  • Сообщений: 32
  • Пол: Мужской
  • 10кВ 50Hz 8bit
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #73 : 01 Декабрь 2021, 14:10:35 »
Selykreg, не совсем понятно что ты хочешь сделать, сформулируй вопрос нормально.
Да, прошу прощения, ввёл в заблуждение...
Selykreg,Код, который у тебя на скрине, выполняется лишь 1 раз перед началом игры. Если ты хочешь туда присунуть условие на кнопку, то в лучшем случае у тебя получится что-то типа "если я удерживаю кнопку select перед началом игры, мне дается ?? жизней вместо 3х".
...вы поняли всё правильно, это я не разобрался сам в своей ситуации. Хотел использовать данный участок кода, чтобы добавлять жизнь во время игры, конечно. Не знал, что данная инструкция грузит/пишет жизни только при загрузке ( уже прояснили мне ситуацию, амбициозному и нетерпеливому :wow: :blush:)
Selykreg,Если в коде нет никаких условий, он выполняет команды сверху вниз
Ах, вот оно что! Вот оно и условие, косвенное - запустился ром, инструкция автоматически сработала, жизни загрузились, верно?
Кстати, вчера посмотрел внимательнее - в учебнике Кая есть пояснение команд сравнения, это я не понял, что для чего, вот и не внял данного урока. Вот только жаль, что в учебнике нет примера с кнопкой :blush:
Cyneprepou4uk, что-то мне подсказывает, что Вы автор учебника - в VK в группе ромхакинга такая  же аватара у пользователя Кай :)

Если я правильно понял, то в ячейку 0006 пишется нажатие кнопок джойстика.
После команды CMP процессор установит флаги регистра, далее следующая команда тебе и скажет куда двигаться далее в зависимости от значения регистра.
Как правило дальше скорее всего будет стоять BEQ (F0) или BNE (D0) которое тебе укажет по какому адресу выполнять дальнейшую инструкцию в случае совпадения условия. Если же условие не совпадает, то процессор продолжит исполнять инструкции идущие дальше после условия.
Да, именно так. Вчера битый час экспериментировал и пытался осуществить задуманное с select, опять же в Танчиках, а также Ninja gaiden III. Сейчас составлю инструкцию заново, так как после очередной неудачи ничего не сохранил и не отскринил🙊
PS Ребята, спасибо вам огромное, что помогаете разобраться🖖

Добавлено позже:
Простой пример:
LDA адрес с кнопками
CMP кнопка select
BEQ переход при равенстве (то есть если нажата select)
Если неравенство (если select не нажата), то перехода не будет, и код продолжит выполнять следующую команду по списку.
LDA адрес с кнопками
AND кнопка select
BEQ если кнопка НЕ нажата (если проверяемый бит = 0)
далее идет какой-то код если кнопка нажата
Прописал инструкцию, но в игре при нажатии ничего не происходит, бряк активен, но ничего :neznayu: Пробовал комбинации с командами CPX, AND, флагами BNE и BEQ.

Предположим у тебя в $0006 хранится значение 04
Далее ты выполняешь команду СМР сравнивая со значением 04, команда СМР выставит флаг регистра Z=1 по скольку значения равны.
Потом выполняем команду BEQ (Если флаг регистра Z=1, то) в данном случае Z у нас имеет значение 1, то процессор выполнит инструкцию прыжка на адрес указанный в команде BEQ. BEQ же у нас указывает на сколько адресов нужно сместиться вперёд (F0 00-7F) либо назад (F0 80-FF), собственно куда указал BEQ на том адресе процессор и продолжит выполнять инструкции.
По логике всё должно работать, но код мёртвый❌ :?
A5 06 загрузка из адреса, в котором при нажатии select байт=4
C9 04 сравниваем с байт=4
D0 00 Z не равно 0, выполняем инструкцию ниже
A9 0A грузим 10 жизней в стек
85 51 записываем эти жизни в адрес 0051
Почему условие не выполняется, что же  я делаю не так⁉️ 😰😩
« Последнее редактирование: 01 Декабрь 2021, 15:21:12 от Selykreg »

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 206
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #74 : 02 Декабрь 2021, 04:44:25 »
Selykreg, да, я и есть автор  :)
Советую перечитать https://vk.com/page-143731650_52348151
И пересмотреть домашнее задание 7 https://youtu.be/-qXYnXdOclU

Код на скрине частично правильный. Однако поставив после D0 (команда BNE) байт 00, это равноценно отсутствию условия, так как в обоих случаях код будет выполнять нижестоящую команду. С помощью этого байта ты указываешь смещение. Например если тебе надо перескочить твои LDA + STA, которые в сумме занимают 5 байт, после D0 тебе надо записать 05.

Во-вторых, просто вставив свой код где попало, еще не значит что он будет работать. Надо чтобы на него была какая-то ссылка, обычно это JSR или JMP.

Оффлайн Миха42

  • Пользователь
  • Сообщений: 286
  • Пол: Мужской
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #75 : 02 Декабрь 2021, 08:48:01 »
Selykreg, мало того что как тебе уже написали выше про неправильное использование условия и то, что на данный код должен быть либо JMP либо вызов подпрограммы (JSR). Так по окончанию чтения процессором кода, он должен продолжить читать что-то далее, иначе будет остановлена его работа (зависание).
В случае если ты использовал JMP на данный код, то в конце кода нужно так же вернуться к коду который будет исполняться после твоего вставленного. Если же ты использовал вызов подпрограммы (JSR) для вставки кода, то подпрограмму нужно обязательно закрыть по окончанию кода прописав в конце 60, тогда процессор достанет из стека прежний адрес где была вызвана подпрограмма и вернётся обратно исполнять код дальше.

Добавлено позже:
Selykreg,
Цитата
A9 0A грузим 10 жизней в стек
Правильно называть не в стек, а в аккумулятор.
Стек это совершенно другое.
« Последнее редактирование: 02 Декабрь 2021, 08:56:08 от Миха42 »

Оффлайн Aleksey19

  • Пользователь
  • Сообщений: 27
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #76 : 05 Декабрь 2021, 11:39:19 »
Всем привет) народ подскажите как пользоваться отладчиком pSX emu, нужна полная информация, у кого может есть или ссылки, или сам может рассказать

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1184
    • ВКонтакте
    • Steam
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #77 : 06 Декабрь 2021, 01:17:29 »
Почему именно pSX? PsxIda уже заценил?

Оффлайн Aleksey19

  • Пользователь
  • Сообщений: 27
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #78 : 06 Декабрь 2021, 03:32:56 »
Почему именно pSX? PsxIda уже заценил?
Я новичок в этом деле, не понимаю пока, хочу здесь разобраться

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1184
    • ВКонтакте
    • Steam
    • Просмотр профиля
Re: [ALL] Вопросы новичков
« Ответ #79 : 06 Декабрь 2021, 13:47:14 »
До PSX ещё не дошёл, но искал бы темы по ней тут. Даже Гугл направил на ЭмуЛенд: pSX 1.13 debugger.
Учитывая опыт пользования GensIDA, порекомендую начать с PsxIda. Он должен оказаться лучше всех, но придётся привыкать к интерфейсу Иды. Благо что можно всё настроить.

Оффлайн Aleksey19

  • Пользователь
  • Сообщений: 27
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #80 : 06 Декабрь 2021, 14:00:24 »
perfect_genius, я посмотрел эту тему и там путного нет, на pcsx перекидывают, ладно спасибо будем пробовать psxida)

Оффлайн Selykreg

  • Пользователь
  • Сообщений: 32
  • Пол: Мужской
  • 10кВ 50Hz 8bit
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #81 : 07 Декабрь 2021, 10:46:38 »
Selykreg, да, я и есть автор  :)
Хоть где-то моё зрение и логика не подвели ^_^
Selykreg,
Советую перечитать https://vk.com/page-143731650_52348151
И пересмотреть домашнее задание 7 https://youtu.be/-qXYnXdOclU
Кай, спасибо, буду изучать дальше. Надеюсь, с "домашкой" справлюсь сам.
Selykreg,
Во-вторых, просто вставив свой код где попало, еще не значит что он будет работать. Надо чтобы на него была какая-то ссылка, обычно это JSR или JMP.
Уже понял, что упустил это немаловажное условие :blush:

Selykreg, мало того что как тебе уже написали выше про неправильное использование условия и то, что на данный код должен быть либо JMP либо вызов подпрограммы (JSR). Так по окончанию чтения процессором кода, он должен продолжить читать что-то далее, иначе будет остановлена его работа (зависание).
В случае если ты использовал JMP на данный код, то в конце кода нужно так же вернуться к коду который будет исполняться после твоего вставленного. Если же ты использовал вызов подпрограммы (JSR) для вставки кода, то подпрограмму нужно обязательно закрыть по окончанию кода прописав в конце 60, тогда процессор достанет из стека прежний адрес где была вызвана подпрограмма и вернётся обратно исполнять код дальше.
Спасибо. Мне, двоечнику, ещё во многом предстоит разобраться ;) Блин, ну кто ж придумал общаться с 6502-м на таком языке o_0 Ладно, учу дальше.


Selykreg,Правильно называть не в стек, а в аккумулятор.
Стек это совершенно другое.
Да, спасибо за поправку. А то уже этот момент стал закрепляться в моём понимании.

Оффлайн Миха42

  • Пользователь
  • Сообщений: 286
  • Пол: Мужской
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #82 : 07 Декабрь 2021, 12:59:11 »
Блин, ну кто ж придумал общаться с 6502-м на таком языке o_0
Это не язык, а машинный код процессора.
Писать можно и на любом языке, главное чтоб имелся ассемблер что преобразует код языка в машинный код данного процессора. Где-то уже попадался мне ассемблер с какого-то языка на nes.

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

Оффлайн Selykreg

  • Пользователь
  • Сообщений: 32
  • Пол: Мужской
  • 10кВ 50Hz 8bit
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #83 : 14 Декабрь 2021, 11:18:48 »
Это не язык, а машинный код процессора.
Писать можно и на любом языке, главное чтоб имелся ассемблер что преобразует код языка в машинный код данного процессора. Где-то уже попадался мне ассемблер с какого-то языка на nes.
Но данный вариант подходит только если пишешь игру с нуля, или если у тебя есть исходники игры. В случае же чтоб изменить игру не имея ни чего кроме готового рома ни чего не остаётся кроме как ковырять машинный код в дизассемблере.  ;)
Спасибо, всегда путал ассемблер с...одним из вариантов языка программирования <_< Я в основном делал игры и программы в GM, там язык более-менее логичен. Порой смотришь в диз и понимаешь, что программисты- обособленная каста со своим мышлением, чуть-ли не алхимики 😨 :cool: Легче уж точно написать программу для игры с нуля.
По делу. С кнопками ситуация прояснилась, уже сделал несколько хаков ромов с кнопками, причём в одном роме сделал по несколько комбинаций кнопок :wow:Разобрался более-менее с флагами и с тем, куда лучше скормить игре свою подпрограмму🍴 - вот эта ситуация чуть было не отбила моё желание обучаться. Минус - у меня сбился режим дня😴 💤 6502 - это ещё та сарделька в арбузном корпусе, и большой поклон тем, кто его освоил. Всем огромное спасибо, кто меня наставлял👋 Думаю, некоторые хаки стОит выложить на сайт.

Оффлайн GodKiller_222

  • Пользователь
  • Сообщений: 13
  • Пол: Мужской
  • I'm out there
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #84 : 19 Декабрь 2021, 08:40:11 »
Цитата
Думаю, некоторые хаки стОит выложить на сайт.
Думаю, не стоит маятся дурью, на сайте уже две раздутые темы из маминых хакеров, которые поменяли два байта в ром-е и исполнились величием. Перетерпите эту стадию и в будущем, возможно, вы действительно удивите всех))

Оффлайн Nik Pi

  • Пользователь
  • Сообщений: 149
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #85 : 18 Март 2022, 18:49:15 »
Доброго времени суток!
У меня тут ещё один вопрос: Я решил покопаться в графике аркадных игр, но не понял, как именно просматривать тайлы :-\ Я открыл в Tile Molester Черепашек ниндзя, и.....
Там какаой-то ужас  0_0
Я что только не пробовал, чтобы нормально просмотреть спрайты, какие только параметры не ставил, и всё равно не смог нормально настроить. Самые подходящие значения- 3 и 4bpp linear. Кто знает, как всё правильно сделать, и просмотреть, и отредактировать :neznayu: ? Буду очень признателен. Результаты моих поисков- внизу:

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8119
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #86 : 19 Март 2022, 00:29:52 »
Похоже, что нужно изменить порядок байт (reverse-order). Первый и третий скрины, скорее всего - это 8bpp с меньшей в 2 раза шириной.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5127
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #87 : 19 Март 2022, 00:42:35 »
это 8bpp с меньшей в 2 раза шириной
Судя по MAME там 4bpp. Я пытался переставить по описанию и не получилось, не разбирался какой у MAME порядок битов. Для 963a28.h27 это "k052109" (https://github.com/mamedev/mame/blob/master/src/mame/drivers/tmnt.cpp), порядок такой:
const gfx_layout k052109_device::charlayout =
{
8,8,
RGN_FRAC(1,1),
4,
{ 24, 16, 8, 0 },
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8
};
Структура:
struct gfx_layout
{
u32 xoffs(int x) const { return (extxoffs != nullptr) ? extxoffs[x] : xoffset[x]; }
u32 yoffs(int y) const { return (extyoffs != nullptr) ? extyoffs[y] : yoffset[y]; }

u16             width;              // pixel width of each element
u16             height;             // pixel height of each element
u32             total;              // total number of elements, or RGN_FRAC()
u16             planes;             // number of bitplanes
u32             planeoffset[MAX_GFX_PLANES]; // bit offset of each bitplane
u32             xoffset[MAX_GFX_SIZE]; // bit offset of each horizontal pixel
u32             yoffset[MAX_GFX_SIZE]; // bit offset of each vertical pixel
u32             charincrement;      // distance between two consecutive elements (in bits)
const u32 *     extxoffs;           // extended X offset array for really big layouts
const u32 *     extyoffs;           // extended Y offset array for really big layouts
};
Т. е., как я понял, для каждого тайла 8x8 пикселей строки идут по 32 бита подряд, но внутри строки каждые 8 бит подряд это по 1 биту для каждого пикселя. Но видимо я что-то не понял, потому что не получилось переставить для редактора тайлов.

Оффлайн Nik Pi

  • Пользователь
  • Сообщений: 149
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #88 : 19 Март 2022, 01:38:15 »
Понятно...
...Что ничего не понятно  :lol:
Ладно, пойду дальше пробовать. А вообще, я где-то читал, что есть специальные график эдиторы, для аркадных игр, или мне кажется  o_0
Ну, всё равно спасибо

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8119
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #89 : 19 Март 2022, 11:24:10 »
Понятно...
...Что ничего не понятно  :lol:
Ладно, пойду дальше пробовать. А вообще, я где-то читал, что есть специальные график эдиторы, для аркадных игр, или мне кажется  o_0
Ну, всё равно спасибо
Прикрепил бы этот файл (ы) для начала. Интересующиеся люди поковырялись бы.