Просмотр полной версии : хочется сделать на PC вьювер .scr файлов
уважаемые спекрумисты! хочется сделать мне свой собственный вьювер .scr файлов на PC. Хотелось бы почитать про структуру этого файла, как читать заголовки и расшифровывать данные.
Я так монимаю, что scr - просто снимок видеопамяти?
и еще по ходу один вопрос.
структура экранной области памяти мне понятна - Первые 32 байта экранной области задают слева направо верхнюю строку, следующие 32 байта — 9-ю сверху, ну и тд.
А вот область атрибутов - здесь непонятка. Цвет тона и цвет фона - 3-битные величины, как мне узнать, какой цвет каким битам соответствует,
и второе - что такое режим повышенной яркости?
Эти вопросы вам могут показаться наивными, но когда у моего друга (не у меня!!!) был спек - я был в 3-ем классе. А сейчас вот хочется что-то своими руками :v2_conf3:
molodcov_alex
15.08.2008, 14:57
Я так монимаю, что scr - просто снимок видеопамяти?
Думаешь правильно, никаких заголовков и т.п. там нет.
А вот область атрибутов - здесь непонятка. Цвет тона и цвет фона - 3-битные величины, как мне узнать, какой цвет каким битам соответствует,
и второе - что такое режим повышенной яркости?
Биты расположены так: МЯGRBGRB
B - синий
R - красный
G - зеленый
Я - яркость
М - мерцание
Первые три - тон, следующие три - фон.
Повышенная яркость: если этот бит в 0, то получается темный цвет (темно-красный, темно-синий и т.д.), а если 1, то яркий (просто красный).
А вообще наверное стоит начать без аттрибутов и сформировать правильную картинку, а потом уже доделать до полноценной с аттрибутами.
.SCR-файлы
-----------
.SCR-файлы - это дампы видеопамяти.
Существут несколько форматов SCR.
6144 - чёрно белое изображение
6912 - стандартное цветное изображение (1 байт цвета на 8x8 точек)
12288 - изображение с multicolor эффектом (1 байт цвета на 8 точек)
В любом из этих форматов первые 6144 байт это признак цвета точки.
Связь между координатами x и y и адресами в .SCR файле следующая:
INT (x/8)+1792*INT (y/64)-2016*INT (y/8)+256*y
Младшие три бита координаты x определяют какой бит в адресе соответствует
данному пикселу.
Для файлов длиной 6144 байт, если бит установлет то цвет точти белый,
иначе чётрный.
Для файлов длиной 6912 байт, следующие 768 байт отвечают за каждые 8x8
точек:
Адрес в блоке атрибутов, соответствующий точке x,y вычисляется по формуле:
22528+INT (x/8)+32*INT (y/8)
Младшие три бита в байте атрибутов определяют цвет "включенных" точек
Биты 3-5 соответствуют цвету фона ("выключенных" точек).
Бит 6 - бит яркости.
Бит 7 - признак мигания.
Если он включен, то через каждые 16/50 долей секунды переключаются цвета
цвета "включенных" и "выключенных" точек, для данного знакоместа.
Для файлов длиной 1288 байт, блок атрибутов состоит из 6144 байт отвечающх
за каждые 8 точек.
Порядок заполнения блока атрибутов аналогичен порядку заполенения первых
6144 байт.
Структура каждого байта аналогична структуре стандартных .SCR файлов.
Если интересует, могу подкинуть сорцы своего вьювера для TotalCommander. Он много чего смотреть умеет.
Плагин для Irfanview.
Формально просто конвертит scr в bmp, Flash не учитывыется. (код для PureBasic)
; scr to bmp plugin 4 irfanview
Global Dim color.l(15)
Global Dim cl.l(1)
Global hDIB.l
Global hl.l
Global Header.l = 54
Global *buf_from
ProcedureDLL.l scr2dib(file_name$)
color(0) = 4 | 2 << 8 | 4 << 16 | 255 << 24
color(1) = 180 | 2 << 8 | 4 << 16 | 255 << 24
color(2) = 4 | 2 << 8 | 180 << 16 | 255 << 24
color(3) = 180 | 2 << 8 | 180 << 16 | 255 << 24
color(4) = 4 | 178 << 8 | 4 << 16 | 255 << 24
color(5) = 180 | 178 << 8 | 4 << 16 | 255 << 24
color(6) = 4 | 178 << 8 | 180 << 16 | 255 << 24
color(7) = 180 | 178 << 8 | 180 << 16 | 255 << 24
color(8) = 4 | 2 << 8 | 4 << 16 | 255 << 24
color(9) = 252 | 2 << 8 | 4 << 16 | 255 << 24
color(10) = 4 | 2 << 8 | 252 << 16 | 255 << 24
color(11) = 252 | 2 << 8 | 252 << 16 | 255 << 24
color(12) = 4 | 254 << 8 | 4 << 16 | 255 << 24
color(13) = 252 | 254 << 8 | 4 << 16 | 255 << 24
color(14) = 4 | 254 << 8 | 252 << 16 | 255 << 24
color(15) = 252 | 254 << 8 | 252 << 16 | 255 << 24
*buf_from = AllocateMemory(6912)
ReadFile(0, file_name$)
ReadData(0, *buf_from, 6912)
CloseFile(0)
hDIB=GlobalAlloc_(#GHND,256*192*4+ Header)
If hDIB=0: ProcedureReturn #False: EndIf
*buf_to_1 = GlobalLock_(hDIB)
PokeS(*buf_to_1 + 0, "BM")
PokeL(*buf_to_1 + 2, 256*192*4+54)
PokeW(*buf_to_1 + 6, 0)
PokeW(*buf_to_1 + 8, 0)
PokeL(*buf_to_1 + 10, 54)
PokeL(*buf_to_1 + 14, 40)
PokeL(*buf_to_1 + 18, 256)
PokeL(*buf_to_1 + 22, -192)
PokeW(*buf_to_1 + 26, 1)
PokeW(*buf_to_1 + 28, 32)
For line.l = 0 To 191
For byte.l = 0 To 31
c.l = PeekB(*buf_from + 6144 + ((line >> 3) << 5) + byte)
cl(0) = color((c & %111) | ((c & %01000000) >> 3))
cl(1) = color(((c & %111000) >> 3) | ((c & %01000000) >> 3))
flash.l = (c & %10000000) >> 7
b.l = 1
For bit.l = 7 To 0 Step -1
If PeekB(*buf_from + hl + byte) & b = b: n=0: Else: n=1: EndIf
PokeL(*buf_to_1 + Header + (line * 1024) + (byte*8 + bit)*4, cl(n))
b << 1
Next bit
Next byte
l.l = hl & %11111111
h.l = hl >> 8
h + 1
If h & %111 <> 0: Goto end_hl: EndIf
l + 32
If l > 255: l & %11111111: Goto end_hl: EndIf
l & %11111111
h - 8
end_hl:
hl = l | (h << 8)
Next line
FreeMemory(*buf_from)
GlobalUnlock_(hDIB)
ProcedureReturn hDIB
EndProcedure
Если интересует, могу подкинуть сорцы своего вьювера для TotalCommander. Он много чего смотреть умеет.
а то как же, будет на что ровняться!
Рабочий плагин к тотал командеру 2005 года, коим и пользуюсь до сих пор.
SAM style
15.08.2008, 19:17
Самописная мутота под qt4. смотрит только *.scr с атрибутми. есть другой вариант, с opengl.
С цветами, правда, лажа... я их специально не подбирал
урра!!!!! я получил ч/б изображение!!!!
а как прикрепить файл - чет не понял???
Добавлено через 36 минут
Адрес в блоке атрибутов, соответствующий точке x,y вычисляется по формуле:
22528+INT (x/8)+32*INT (y/8)
как-то я эти формулы и не понимаю, вы мне проще скажите, данные записываются в той же последовательности, всмысле сначала для 1 строки, потом для 9, итд
или так 1-2-3...
Спасибо, кстати вам всем
molodcov_alex
15.08.2008, 21:00
урра!!!!! я получил ч/б изображение!!!!
а как прикрепить файл - чет не понял???
Переходишь в расширенный режим, там кнопка управление вложениями...
как-то я эти формулы и не понимаю, вы мне проще скажите, данные записываются в той же последовательности, всмысле сначала для 1 строки, потом для 9, итд
или так 1-2-3...
Да, 1,9,17,25,33,41,49,57,2,10,18....
а то как же, будет на что ровняться!
В аттаче, но ровняться не стоит :) Код ужасный. Писано 4 года назад, почти все на ассемблере (казалось что быстрее будет). Жуть, короче...
Да, 1,9,17,25,33,41,49,57,2,10,18....
разве так может быть, ведь строк (8*8 пикселей) всего 24
molodcov_alex
16.08.2008, 13:48
А.... Че-то я попутал (не заметил что речь об аттрибутах) Для аттрибутов все линейно.
А формула в данном случае будет: 6144+INT (x/8)+32*INT (y/8)
Тоесть сначала идут аттрибуты для 1,2,3,4,5,6,7,8 строк (фактических, 192 которых). Дальше для 9,10,11,12,13,14,15,16 и т.д..
То есть байт аттрибутов задает цвет знакоместа (кватратика 8x8 пикселей)
Могу тоже кинуться исходником ;)
void DrawScreen(){
for(unsigned y=0;y<192;y++){
unsigned addrp=((y&0xC0)<<(0+5))|((y&0x7)<<(3+5))|((y&0x38)<<(-3+5));
unsigned addra=((y&0xF8)<<2)|0x1800;
for(unsigned x=0;x<32;x++){
BYTE pattern=*(RAM(ScreenBank?7:5)+(addrp|x));
BYTE attribute=*(RAM(ScreenBank?7:5)+(addra|x));
BYTE ink=(attribute&0x7)|((attribute&0x40)>>3);
BYTE paper=(attribute&0x78)>>3;
for(unsigned bit=0;bit<8;bit++)
GDIBuf[bit+(x<<3)+(y<<8)]=pattern&(1<<(7-bit))?ink:paper;
}
}
}
Правда это из эмуля, писал давно и вкурить что тут понаписал уже не могу.
вот, выкладываю. Написано на Visual Basic 6.0, ибо в другом - дуб. Но работает.:v2_yahoo:
А посему еще хотел, бы с вашего позволения, задать пару вопросов.
Как "озвучить" загрузку, тоесть чтобы появление картинки сопровождалось звуками загрузки? то-есть как "проиграть" байт? 1- это один звук, а 0-другой, но откуда тогда такое разнообразие скрипов? Или это просто так воспринимает ухо?
Есть еще вопрос, но пока не буду спрашивать, чтоб кучу вопросов сразу не задавать.
1- это один звук, а 0-другой, но откуда тогда такое разнообразие скрипов? ну, 1 это одно положение мембраны динамика, 0 - другое. если с какой-то частотой давать 1-0-1-0..., получим колебания мембраны и соответствующую высоту звука. если с той же частотой давать, скажем, 1-1-0-0-1-1-0-0.. мембрана будет колебаться с вдвое меньшей частотой, и звук получится ниже. и тд для любых битовых данных картинки
спасибо, вот уж незнал, действительно.
а сколько длиться одно положение мембраны? вернее сколько оно длилось на касетах?
что бы реалистично выходило
на самом деле в случае с лентой не совсем так -- там нули и единицы кодируются прямоугольными колебаниями (сигнал-нуль) разной длительности (частотная модуляция)... иначе понадобилась бы идеальная синхронизация между магнитофоном и спеком при идеальном состоянии ленты.
глянь тут параграф "How does the Spectrum store data to a tape?": http://fly.cc.fer.hr/~arsen/tapefix/tapefix.html
http://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%BE%D1%82%D0%BD%D0%B0%D 1%8F_%D0%BC%D0%B0%D0%BD%D0%B8%D0%BF%D1%83%D0%BB%D1 %8F%D1%86%D0%B8%D1%8F
так что-ли?
Добавлено через 3 минуты
а сколько тогда бит/сек считывалось с кассеты?
Добавлено через 15 минут
а, щас посмотрю, а то ссылка сначала не отобразилась
Добавлено через 6 часов 2 минуты
boo_boo, спасибо за очень класную ссылку. Я та понял, та все просто - 0-1022 Hz, а 1 это 2044 Hz. Зная скорость передачи бит/сек легко вычислить длительность каждого звука. Плюс есть еще синхоимпульс и ведущий тон (leader ton)
С эти вопросом все ясно, позвольте задать следующий. Про бордюр. Почему при загрузке появляются полосы, почему именно такого цвета, и вообще что они означают и для чего? Ведь в видеопамяти нет никакого бордюра?
ЗЫ прошу прощения за наивный вопрос
Добавлено через 6 часов 4 минуты
ЗЗЫ и почему полосы "скачут", а не просто "уезжают" вверх экрана?
mishutka
17.08.2008, 12:53
все верно - у бордюра нет видеопамяти - за цвет бордюра отвечают три младшие бита порта FE. при изменении цвета бордюра гораздо чаще чем один раз в 1/50 секунды мы как раз и увидим разноцветные полосы. смещение полос напрямую связано с моментом изменения цвета по отношению к моменту начала прорисовки экрана
Почему при загрузке появляются полосы, почему именно такого цвета, и вообще что они означают и для чего? Ведь в видеопамяти нет никакого бордюра? данные, считанные с ленты, гонятся на бордюр -- это не обязательно, так делает процедура загрузки из ПЗУ (шоб юзер перед монитором не скучал и знал, что процесс идет :)), многие самописные процедуры вместо этого счетчик рисуют и тп. насчет цвета можно предположить, что один цвет соответствует сигналу на магнитофонном входе, второй нулю (до демодуляции), хотя не знаю, что конкретно чудит ПЗУ-шная процедура.
насчет полос все как сказал mishutka, положение зависит от того, при каком положении CRT-луча было изменение цвета.
подробная инфа обо всем этом есть в виде статей в нете/журналах, можно поискать
спасибо. И еще хотел узнать - почему при нажатии на кнопку резет по экрану бегут полосы? что в этот момент происходит в видеопамятью?
molodcov_alex
17.08.2008, 15:08
Проверка памяти. (это только в 48-м)
molodcov_alex
17.08.2008, 20:50
Проверка и есть. Память-то общая. Память забивается чем-то вроде 02h, отсюда _темнокрасные_ вертикальные полосы каждые 8 точек.
ну что ж, с этим разобрался. Теперь буду эмулить AY-проц, не подскажете, где почитать?
(вопрос не в тему, конечно, сорри, но как-то для одного вопроса тему не охота создавать)
ну что ж, с этим разобрался. Теперь буду эмулить AY-проц, не подскажете, где почитать?
лучше для начала заэмулить аналог команды BEEP хотя бы :)
Собственно, ничего хитрого. Из сброшенного в эмуляторе Шалаева образа 48К - первого дампа памяти, включающего 6912 или 6929 байт (вроде бы, не помню уже) - выдирает первые 6912 байт и записывает с указанным именем. ПисАлось "за пять минут" для собственных нужд и каким-то чудом (которое потом распухло и мешало ходить) сохранилось.
Теперь буду эмулить AY-проц, не подскажете, где почитать?
http://bulba.at.kz/main.htm
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot