Разработка и ромхакинг > Программирование
Пишем ромхакерский/хоумбрюерский софт
(1/1)
Томахомэ:
Собираюсь я тута написать небольшую совсем-совсем простенькую утилитку для конвертации 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:
Не сильно в код углубился, но ты походу пытаешь читать конец файла, а там уже ничего нет.
Попроси ChatGPT помочь. Он быстрее вкурит, что у тебя тут не так.
Томахомэ:

--- Цитата: Segaman от 23 Февраль 2025, 11:56:41 ---Не сильно в код углубился, но ты походу пытаешь читать конец файла, а там уже ничего нет.

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

Спасибо! Именно так оно и оказалось.
Томахомэ:
Ну а вот и сам инструментик готов! У кого есть аккаунт на Romhacking.net, прошу заодно залить туда - а то меня, видимо, при попытке регистрации администрация так и не одобрила.
DrMefistO:
Нету больше romhacking.net, теперь он только ридонли.
Segaman:
На ромхак плазу лей тогда уже.
Я лучше аналога ромхакинга.нет не нашел :neznayu:
https://romhackplaza.org/utilities/
Томахомэ:
Аналогичная для конвертации на этот раз уже в 8-битные тайлы 4x4 (во веки веков не надивлюсь безумию древнекорейской инженерии!), использовавшиеся для формирования юзерского интерфейса и псевдоспрайтов в игре Double Point.

Добавлено позже:
Последний формат графики пойдёт на Sails of Charon - конретно на моменты тома 7 "Всё, что было после" уже во время миссий, действие которых происходит не раньше Второй Иракской, когда игроку даётся немного подрасслабиться через геймплейное чередование стратегии с эротической 1+2-подобной головоломкой, посвящённой уютной семейной жизни одного из "Хароновых парусов".
Segaman:
Сделал бы всё в одном, просто аргументом чтоб переключать формат :)
Чо софтины то плодить одинаковые?
Томахомэ:

--- Цитата: Segaman от 02 Март 2025, 17:07:38 ---Сделал бы всё в одном, просто аргументом чтоб переключать формат :)
Чо софтины то плодить одинаковые?

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

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

Например, вот эти строчки

--- Код: ---if(argv[2]=="-v") orientation=1;
else orientation=0;
--- Конец кода ---

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

--- Цитата: Томахомэ от 08 Март 2025, 17:57:58 ---А как считывание аргументов правильно оформлять?
--- Конец цитаты ---
Посмотри в чужих исходниках.


--- Цитата: Томахомэ от 08 Март 2025, 17:57:58 ---Например, вот эти строчки

--- Код: ---if(argv[2]=="-v") orientation=1;
else orientation=0;
--- Конец кода ---

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

--- Конец цитаты ---
Ты сравниваешь адреса двух строк.  :)
Томахомэ:

--- Цитата: Mr2 от 08 Март 2025, 18:25:28 ---Ты сравниваешь адреса двух строк.  :)

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

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

--- Цитата: Томахомэ от 08 Март 2025, 18:39:19 ---А сами строки - как?

--- Конец цитаты ---
На C https://en.cppreference.com/w/cpp/string/byte/strcmp, if (strcmp(argv[2], "-v") == 0). На C++ можно использовать std::string, тогда просто ==.
Томахомэ:
Возникла проблема со строчкой
--- Код: ---if((strcmp(argv[2],"-edi")==0)||argc<3) format=0;
--- Конец кода ---
Если аргумент -edi будущее обновление NeoPlan понимает ещё правильно, то отсутствие аргументов (при котором в качестве дефолтного формата графического рома на конвертацию должен выбираться формат бэк- и мидграундов для железа Steel Force) - уже чё-то нет.
Sharpnull:

--- Цитата: Томахомэ от 09 Март 2025, 09:09:14 ---Возникла проблема со строчкой
--- Конец цитаты ---
Так не пишут. Обычно используют готовые библиотеки, где нужно только описать параметры/аргументы. Вот мой шаблон простого парсинга аргументов командой строки. 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
--- Конец кода ---
Томахомэ:

--- Цитата: Segaman от 02 Март 2025, 17:07:38 ---Сделал бы всё в одном, просто аргументом чтоб переключать формат :)

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

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

Добавлено позже:
Как бы так правильно оформить базу аргументов примерно такого вида?

--- Код: ---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"};
--- Конец кода ---
Томахомэ:
Как бы так получше отконвертировать стандартный 8-битный PCM со знаком в 12-битный для Namco C140 (т. е. формата $xxx0), чтобы результат не засорялся шумами квантования?
Segaman:

--- Цитата: Томахомэ от 12 Май 2025, 06:23:39 ---Как бы так получше отконвертировать стандартный 8-битный PCM со знаком в 12-битный для Namco C140 (т. е. формата $xxx0), чтобы результат не засорялся шумами квантования?

--- Конец цитаты ---
Апскейлить качество такое себе. А вот если бы брал за исходник 16-битный и даунскейлил до 12-бит, вот тогда точно проблем бы не было.
Хотя я не звукарь, мне в детстве медведь на ухо наступил.  :)
Томахомэ:

--- Цитата: Segaman от 12 Май 2025, 09:50:56 ---Апскейлить качество такое себе. А вот если бы брал за исходник 16-битный и даунскейлил до 12-бит, вот тогда точно проблем бы не было.
Хотя я не звукарь, мне в детстве медведь на ухо наступил.  :)

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

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

--- Цитата: Segaman от 12 Май 2025, 09:50:56 ---Апскейлить качество такое себе. А вот если бы брал за исходник 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-битном виде, начала идти звуковая чересполосица - "слово со звуковыми данными-слово пустое", которая и порождала этот странный уродливый шум.

Вот по итогу обновлённый ромсет на заценку.
Томахомэ:
Следом проверку успешно прошли форматы для Konami K007232 и Irem GA-20. Следующим будет тестанут формат для Gaelco GAE1, с которым сложность в том, что звуковые данные там читаются задом наперёд.
Навигация
Главная страница сообщений

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