Автор Тема: Пишем ромхакерский/хоумбрюерский софт.  (Прочитано 1199 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Собираюсь я тута написать небольшую совсем-совсем простенькую утилитку для конвертации BMPшек глубиной цвета в 4 бита в набор 4-битных linear тайлов размером 16 на 16 - формат, использовавшийся в некоторых игровых автоматах (например, Strikes of 1945 и парочке корейских железячек с сильными подозрениями на его клонизм). Однако почему-то даже проверка по сигнатуре не работает как надо - вместо стоящих первыми 2-мя байтами букв B и M утилитка в любой скормленной BMPшечке видит нули. Как так получается?

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>


FILE         *fpin, *fpout;
long            len;
long            i,n;

int main(int argc, char *argv[])
{

if (argc != 2 ) {
printf("Bitmap converter to 4bpp 16x16 tile data.\n");
fprintf(stdout,"Usage: %s [srcfile].bmp\n",argv[0]);
exit(1);
}


if ( (fpin=fopen(argv[1],"rb") ) == NULL ) {

printf("Can't open input file\n");
exit(1);
}


/*
 * Now we try to determine the size of the file
 * to be converted
 */
if (fseek(fpin,0,SEEK_END)) {
printf("Couldn't determine size of file\n");
fclose(fpin);
exit(1);
}

len=ftell(fpin);

unsigned short   bytStr[len];

fread(bytStr, 1, len, fpin);
   
  printf("The first byte is %x.\n",bytStr[0]);
fclose(fpin);
exit(1);
}

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3248
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #1 : 23 Февраль 2025, 11:56:41 »
Не сильно в код углубился, но ты походу пытаешь читать конец файла, а там уже ничего нет.
Попроси ChatGPT помочь. Он быстрее вкурит, что у тебя тут не так.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #2 : 23 Февраль 2025, 12:16:39 »
Не сильно в код углубился, но ты походу пытаешь читать конец файла, а там уже ничего нет.

Спасибо! Именно так оно и оказалось.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #3 : 25 Февраль 2025, 17:43:16 »
Ну а вот и сам инструментик готов! У кого есть аккаунт на Romhacking.net, прошу заодно залить туда - а то меня, видимо, при попытке регистрации администрация так и не одобрила.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1326
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #4 : 25 Февраль 2025, 18:14:26 »
Нету больше romhacking.net, теперь он только ридонли.

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3248
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #5 : 26 Февраль 2025, 11:56:04 »
На ромхак плазу лей тогда уже.
Я лучше аналога ромхакинга.нет не нашел :neznayu:
https://romhackplaza.org/utilities/

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #6 : 02 Март 2025, 06:57:29 »
Аналогичная для конвертации на этот раз уже в 8-битные тайлы 4x4 (во веки веков не надивлюсь безумию древнекорейской инженерии!), использовавшиеся для формирования юзерского интерфейса и псевдоспрайтов в игре Double Point.

Добавлено позже:
Последний формат графики пойдёт на Sails of Charon - конретно на моменты тома 7 "Всё, что было после" уже во время миссий, действие которых происходит не раньше Второй Иракской, когда игроку даётся немного подрасслабиться через геймплейное чередование стратегии с эротической 1+2-подобной головоломкой, посвящённой уютной семейной жизни одного из "Хароновых парусов".
« Последнее редактирование: 08 Март 2025, 18:11:12 от ghostdog3 »

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3248
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #7 : 02 Март 2025, 17:07:38 »
Сделал бы всё в одном, просто аргументом чтоб переключать формат :)
Чо софтины то плодить одинаковые?

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #8 : 08 Март 2025, 17:57:58 »
Сделал бы всё в одном, просто аргументом чтоб переключать формат :)
Чо софтины то плодить одинаковые?

А как считывание аргументов правильно оформлять?

Например, вот эти строчки
if(argv[2]=="-v") orientation=1;
else orientation=0;

почему-то не работают вообще никак - значение orientation при любом раскладе остаётся нулём.

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1653
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #9 : 08 Март 2025, 18:25:28 »
А как считывание аргументов правильно оформлять?
Посмотри в чужих исходниках.

Например, вот эти строчки
if(argv[2]=="-v") orientation=1;
else orientation=0;

почему-то не работают вообще никак - значение orientation при любом раскладе остаётся нулём.
Ты сравниваешь адреса двух строк.  :)

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #10 : 08 Март 2025, 18:39:19 »
Ты сравниваешь адреса двух строк.  :)

А сами строки - как?

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5306
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #11 : 08 Март 2025, 20:40:54 »
А сами строки - как?
На C https://en.cppreference.com/w/cpp/string/byte/strcmp, if (strcmp(argv[2], "-v") == 0). На C++ можно использовать std::string, тогда просто ==.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #12 : 09 Март 2025, 09:09:14 »
Возникла проблема со строчкой if((strcmp(argv[2],"-edi")==0)||argc<3) format=0;Если аргумент -edi будущее обновление NeoPlan понимает ещё правильно, то отсутствие аргументов (при котором в качестве дефолтного формата графического рома на конвертацию должен выбираться формат бэк- и мидграундов для железа Steel Force) - уже чё-то нет.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5306
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #13 : 09 Март 2025, 11:38:56 »
Возникла проблема со строчкой
Так не пишут. Обычно используют готовые библиотеки, где нужно только описать параметры/аргументы. Вот мой шаблон простого парсинга аргументов командой строки. 2 позиционных параметра (обязательны, INPUT и OUTPUT), также необязательные параметры (опции) со значением по умолчанию: выбор из двух опций (-c или -d) и параметр со значением (-p число). Примеры команд:
arg_example.exe in.bin out.bin
arg_example.exe -d in.bin out.bin -p 128
arg_example.exe in.bin out.bin -d -c // Будет -с, т. к. последним указан
arg_example.exe in.bin -p 0xFF out.bin

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #14 : 13 Март 2025, 08:20:33 »
Сделал бы всё в одном, просто аргументом чтоб переключать формат :)

По итогу именно так и сделал.

Добавлено позже:
Как бы так правильно оформить базу аргументов примерно такого вида?
const ...    argsBase[] = {NULL, "-psikyo_g1_h", "-mincorp", "-tc0180vcu_8x8_12b_pal", "-tc0180vcu_16x16_12b_pal", "-tc0180vcu_8x8_flip_12b_pal", "-tc0180vcu_16x16_flip_12b_pal"};
« Последнее редактирование: 21 Май 2025, 17:01:30 от ghostdog3 »

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #15 : 12 Май 2025, 06:23:39 »
Как бы так получше отконвертировать стандартный 8-битный PCM со знаком в 12-битный для Namco C140 (т. е. формата $xxx0), чтобы результат не засорялся шумами квантования?

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3248
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #16 : 12 Май 2025, 09:50:56 »
Как бы так получше отконвертировать стандартный 8-битный PCM со знаком в 12-битный для Namco C140 (т. е. формата $xxx0), чтобы результат не засорялся шумами квантования?
Апскейлить качество такое себе. А вот если бы брал за исходник 16-битный и даунскейлил до 12-бит, вот тогда точно проблем бы не было.
Хотя я не звукарь, мне в детстве медведь на ухо наступил.  :)

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #17 : 12 Май 2025, 10:40:30 »
Апскейлить качество такое себе. А вот если бы брал за исходник 16-битный и даунскейлил до 12-бит, вот тогда точно проблем бы не было.
Хотя я не звукарь, мне в детстве медведь на ухо наступил.  :)

Из "исконно" 16-битных форматов PCM у меня на примете пока только BSMT2000, но до него очередь ещё дойдёт. А щас в фокусе Seta X1-010, Irem/Nanao GA-20 и Gaelco GAE1 - чтобы для Operation Fireweb взять музыкальные сэмплы, соответственно, из Battletoads Arcade, Arbalester, Gunforce II и Alligator Hunt.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #18 : 19 Май 2025, 08:03:34 »
Апскейлить качество такое себе. А вот если бы брал за исходник 16-битный и даунскейлил до 12-бит, вот тогда точно проблем бы не было.
Хотя я не звукарь, мне в детстве медведь на ухо наступил.  :)

А причина оказалась внезапно вот в чём: задумался я в какой-то момент - может, с endianity что-нибудь напортачил? Полез в раздел дебаггера "Namco C140 ':c140' rom space memory" и параллельно открыл в HEX-редакторе сам файл рома, чтобы сравнить значения. И знаете, что оказалось? Что не знаю, во всех-не во всех, но в большинстве игр для Namco System 2 структура PCM-рома, по сути, 8-битная, только каждый байт загружается как старший в соответствующем слове для C140 (Использующийся у этих игр метод загрузки ROM_LOAD16_BYTE, который я нашёл в драйвере namcos2.cpp, только внёс окончательную ясность. Впрочем, ничто не мешает для дебага и тестировки Operation Fireweb узким закрытым кругом разработчиков использовать конкретно для конкретно её рома, занесённого в специальную приватную сборку MAME, альтернативный загрузчик, а когда придёт пора выпускать игру на непосредственно автоматах, реализовать этот загрузчик железно, чтобы не давать младшим ниблам PCM-сэмплов простаивать.). Поэтому-то, когда я давал MAME PCM-ром в отконвертнутом 16-битном виде, начала идти звуковая чересполосица - "слово со звуковыми данными-слово пустое", которая и порождала этот странный уродливый шум.

Вот по итогу обновлённый ромсет на заценку.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 875
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #19 : 21 Май 2025, 18:11:35 »
Следом проверку успешно прошли форматы для Konami K007232 и Irem GA-20. Следующим будет тестанут формат для Gaelco GAE1, с которым сложность в том, что звуковые данные там читаются задом наперёд.