PDA

Просмотр полной версии : Конвертор ZX-картинок для Специалиста



CityAceE
27.01.2019, 15:46
Начал экспериментировать с графикой на Специалисте и столкнулся с отсутствием качественных цветных картинок. Мне показалось, что Спектрум - это хороший источник картинок. Мне повезло, что загруженные "в лоб" картинки из Exolon'а выглядели хорошо, иначе бы я, наверное, не взялся что-то делать дальше. Однако другие картинки, загруженные по тому же алгоритму, или вообще не отображались, или там было ничего не понятно. Мои дальнейшие эксперименты со спектрумовскими картинками на Специалисте вылились вот в такую программу:

https://pic.maxiol.com/images/1548746819.3254906935.0.png https://pic.maxiol.com/images/1548746852.3254906935.1.png
https://pic.maxiol.com/images/1548746881.3254906935.2.png https://pic.maxiol.com/images/1548746901.3254906935.3.png

Результат мне нравится. Безусловно, не все картинки выглядят хорошо, но подавляющее их большинство всё-таки радует глаз.

Программа пока не доделана, так как я упёрся в две проблемы:

1. Эмулятор Emu80, на котором я всё отлаживаю, глючит с эмуляцией загрузки с магнитофона. Эмулятор почему-то позволяет загрузить картинку только один раз, после чего требуется сброс, чтобы снова заработал перехват #c3f9.
2. Так и нет понимания в каком формате хранить конвертированные картинки. Поэтому сохранение картинок я не сделал.

Во вложении вы найдете:

1. Сам просмотрщик-конвертор.
2. Набор спектрумовских картинок в формате rks. В том же архиве лежит простой конвертор *.scr -> *.rks. Для конвертирования просто перетяните любую стандартную спектрумовскую картинку длиной 6912 байт на conv.bat.

Программа не использует никаких процедур из ПЗУ, кроме подпрограммы загрузки с магнитофона.

fifan
27.01.2019, 16:48
Превосходно! Посмотрел все 18 картинок. Делал всё через эмулятор emu. Главный файл gfx.rks тоже не грузился - убрал первые четыре байта в файле и загрузил сразу в память по адресам 0100...24B5. Далее по <5> просмотрел все картинки. Проблемы с загрузкой файлов может быть в том, что в конце файла должна быть указана контрольная сумма блока данных, по крайней мере в файле gfx.rks её не было.

ivagor
27.01.2019, 17:24
Делал для себя утилитку obj2rks, которая добавляет заголовок и контрольную сумму к бинарникам.
Вызов
obj2rks file.obj [необязательный шестнадцатеричный начальный адрес, по умолчанию 0]
на выходе file.rks
Недостаток - расширение исходного файла д.б. obj, мне она только для tasma нужна. Можно изменить расширение исходного файла на obj и потом использовать с obj2rks.
Наверняка подобные (или более удобные) утилиты есть и у других людей, занимающихся разработкой для специалиста.

CityAceE
28.01.2019, 00:18
Делал всё через эмулятор emu.
Странно, у меня там тоже больше одной картинки не грузилось.


Главный файл gfx.rks тоже не грузился
А у меня грузился без проблем при старте эмулятора. Но я особо не разбирался, может там оно и не туда вовсе грузилось и не так. Я все эксперименты проводил с Emu80.


Проблемы с загрузкой файлов может быть в том, что в конце файла должна быть указана контрольная сумма блока данных, по крайней мере в файле gfx.rks её не было.
Вполне может быть. Во всех моих файлах, включая картинки, контрольная сумма пустая, вернее левая. Во-первых, Emu80 игнорирует факт несовпадения КС, а, во-вторых, я попросту не знаю как на лету эту сумму генерировать в SjASMPlus, из которого я получаю скомпилированный файл. Подозреваю, что этого нельзя будет сделать. И придётся полученный rks прогонять через какую-то внешнюю утилиту, которая будет пересчитывать и добавлять контрольную сумму. Есть ли где-то готовое описание алгоритма, по которому вычисляется контрольная сумма Специалиста, чтобы самому не копаться в ПЗУ?

Pyk
28.01.2019, 00:25
Эмулятор Emu80, на котором я всё отлаживаю, глючит с эмуляцией загрузки с магнитофона. Эмулятор почему-то позволяет загрузить картинку только один раз, после чего требуется сброс, чтобы снова заработал перехват #c3f9.
Был такой баг. Судя по скриншотам, у тебя старая версия 4.0.307, обновись до последней - 4.0.316:
http://emu80.org/v4beta/Emu80qt_40316.zip

- - - Добавлено - - -

gfx.rks действительно не грузится по директиве R (видимо из-за отсутствия контрольной суммы), но его можно загрузить через меню либо Alt-F3.

CityAceE
28.01.2019, 00:30
обновись до последней - 4.0.316
И действительно! В обновлённой версии всё работает, как задумано :)


есть и у других людей, занимающихся разработкой для специалиста.
Что-то я таких людей здесь не вижу, либо они тщательно маскируются :) К сожалению, под Специалист уже давно ничего не выходило нового :(


его можно загрузить через меню либо Alt-F3.
Я именно так и загружаю всегда. Наверное поэтому и не придал большого значения отсутствию КС.

Pyk
28.01.2019, 00:36
Есть ли где-то готовое описание алгоритма, по которому вычисляется контрольная сумма Специалиста, чтобы самому не копаться в ПЗУ?
Алгоритм такой же, как в РК-86, вот фрагмент из Emu80:

uint16_t cs = 0;
for (uint16_t i = 0; i < fileSize - 1; i++) {
cs += buf[i];
cs += (buf[i] << 8);
}
cs = (cs & 0xff00) | ((cs + buf[fileSize - 1]) & 0xff);

CityAceE
28.01.2019, 07:46
Подкорректировал данные в gfx.rks (см. вложение в первом сообщении) и теперь файл без ошибок грузится в эмуляторы по директиве R.

Заодно придумал, как мне получить правильный rks после компиляции - с помощью внешнего скрипта на Python.

Вот текст скрипта на Python, который пересчитает и впишет правильную контрольную сумму в файл:



import sys

if len(sys.argv) > 1:
filename = sys.argv[1]
with open(filename, 'rb') as f_obj:
rks = f_obj.read()
finish = len(rks) - 3
cs = 0
for i in range(4, finish):
cs += rks[i]
cs += (rks[i] << 8)
cs = (cs & 0xff00) | ((cs + rks[finish]) & 0xff)
rks = bytearray(rks)
print("Old check sum:", hex(rks[-1] * 256 + rks[-2]))
rks[-1] = cs // 256
rks[-2] = cs % 256
print("New check sum:", hex(cs))
with open(filename, 'wb') as f_obj:
f_obj.write(rks)
else:
print("Usage: python rkscs.py filename.rks")

CityAceE
29.01.2019, 10:22
Оптимизировал код, сделал отключение информационной панели и внёс другие доработки. Обновил программу в первом сообщении.

Pyk
30.01.2019, 00:05
CityAceE, а байты 31 32 в конце каждого файла картинки - это замена контрольной суммы?
Их gfx даже не пытается читать, из-за чего файл rks в Emu80 не читается до конца и на какое-то время остается открытым после загрузки картинки.

CityAceE
30.01.2019, 00:33
а байты 31 32 в конце каждого файла картинки - это замена контрольной суммы?
Да, именно так. А то, что файл остаётся открытым я тоже заметил, но думал, что так и должно быть - вдруг пользователь захочет что-то сохранить "на магнитофон". Картинка с правильной контрольной суммой (sample_picture.rks) лежит в архиве с самой программой.

fifan
30.01.2019, 08:41
Теперь картинки по 5 загружаются в эмулятор не все, не контрольной суммы в файлах?

CityAceE
30.01.2019, 08:57
Теперь картинки по 5 загружаются в эмулятор не все, не контрольной суммы в файлах?
Я пересчитал контрольную сумму только в smaipe_picture.rks, которая лежит в архиве с самой программой. Остальные картинки я не трогал и там осталась пустая КС. Но Emu80 без проблем их загружает.

Пересчитал суммы для всех картинок. Перевыложил архив в первом сообщении.

fifan
30.01.2019, 10:11
Превосходная программа! Вот ещё бы она конвертировала картинки с графических файлов, например с bmp (я видел похожую правда для Специалиста МХ).

CityAceE
30.01.2019, 10:24
fifan, спасибо из такую оценку моей программы :) Что касается конвертирования bmp, то как раз сейчас обсуждаем методы перевода картинок в цветное изображение в соответствующей теме. Как только появится понимание, конвертор не заставит себя долго ждать.

Pyk
31.01.2019, 09:03
Пересчитал суммы для всех картинок.
Неплохо бы (по крайней мере для эмуляторов) еще и при чтении в gfx если не анализировать, то хотя бы просто считывать записанную КС.
Используемая процедура загрузчика C3F9 для чтения блока не читает и не анализирует КС.
Если не ошибаюсь, адрес процедуры подсчета КС на Специалисте - C82A.

derfliegenddehollander
02.05.2023, 10:21
Делал для себя утилитку obj2rks, которая добавляет заголовок и контрольную сумму к бинарникам.
Вызов
obj2rks file.obj [необязательный шестнадцатеричный начальный адрес, по умолчанию 0]
на выходе file.rks
Недостаток - расширение исходного файла д.б. obj, мне она только для tasma нужна. Можно изменить расширение исходного файла на obj и потом использовать с obj2rks.
Наверняка подобные (или более удобные) утилиты есть и у других людей, занимающихся разработкой для специалиста.

Здравствуйте, а Вам можно отправить личное сообщение?

ivagor
02.05.2023, 12:04
Здравствуйте, личные сообщения у меня отключены и включать не планирую.

derfliegenddehollander
02.05.2023, 12:17
Здравствуйте, личные сообщения у меня отключены и включать не планирую.

Ясно. В целом понимаю. Хорошо, тогда что бы не оффтопить. Я создал тему (https://zx-pk.ru/threads/35061-konvertirovanie-rks-fajla-v-rkx-fajl.html?p=1177837&viewfull=1#post1177837) если не трудно, можете помочь разобраться с RKS и RKX. Я так понимаю Вы в этих вопросах разбираетесь. Я думаю всем будет интересно. Заранее спасибо.

CityAceE
08.05.2025, 18:04
Сделал небольшой видеообзор программы:


https://rutube.ru/video/1b065fc9080c334513beefaad9b791ca/