PDA

Просмотр полной версии : хочется сделать на PC вьювер .scr файлов



Виктор
15.08.2008, 14:37
уважаемые спекрумисты! хочется сделать мне свой собственный вьювер .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, то яркий (просто красный).

А вообще наверное стоит начать без аттрибутов и сформировать правильную картинку, а потом уже доделать до полноценной с аттрибутами.

Vitamin
15.08.2008, 15:05
.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. Он много чего смотреть умеет.

newart
15.08.2008, 15:56
Плагин для 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

Виктор
15.08.2008, 17:56
Если интересует, могу подкинуть сорцы своего вьювера для TotalCommander. Он много чего смотреть умеет.

а то как же, будет на что ровняться!

pROF^4D
15.08.2008, 19:11
Рабочий плагин к тотал командеру 2005 года, коим и пользуюсь до сих пор.

SAM style
15.08.2008, 19:17
Самописная мутота под qt4. смотрит только *.scr с атрибутми. есть другой вариант, с opengl.
С цветами, правда, лажа... я их специально не подбирал

Виктор
15.08.2008, 19:56
урра!!!!! я получил ч/б изображение!!!!
а как прикрепить файл - чет не понял???

Добавлено через 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....

Vitamin
16.08.2008, 00:15
а то как же, будет на что ровняться!
В аттаче, но ровняться не стоит :) Код ужасный. Писано 4 года назад, почти все на ассемблере (казалось что быстрее будет). Жуть, короче...

Виктор
16.08.2008, 13:37
Да, 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;
}
}
}
Правда это из эмуля, писал давно и вкурить что тут понаписал уже не могу.

Виктор
16.08.2008, 14:50
вот, выкладываю. Написано на Visual Basic 6.0, ибо в другом - дуб. Но работает.:v2_yahoo:
А посему еще хотел, бы с вашего позволения, задать пару вопросов.
Как "озвучить" загрузку, тоесть чтобы появление картинки сопровождалось звуками загрузки? то-есть как "проиграть" байт? 1- это один звук, а 0-другой, но откуда тогда такое разнообразие скрипов? Или это просто так воспринимает ухо?
Есть еще вопрос, но пока не буду спрашивать, чтоб кучу вопросов сразу не задавать.

boo_boo
16.08.2008, 16:23
1- это один звук, а 0-другой, но откуда тогда такое разнообразие скрипов? ну, 1 это одно положение мембраны динамика, 0 - другое. если с какой-то частотой давать 1-0-1-0..., получим колебания мембраны и соответствующую высоту звука. если с той же частотой давать, скажем, 1-1-0-0-1-1-0-0.. мембрана будет колебаться с вдвое меньшей частотой, и звук получится ниже. и тд для любых битовых данных картинки

Виктор
16.08.2008, 16:54
спасибо, вот уж незнал, действительно.
а сколько длиться одно положение мембраны? вернее сколько оно длилось на касетах?
что бы реалистично выходило

boo_boo
16.08.2008, 17:19
на самом деле в случае с лентой не совсем так -- там нули и единицы кодируются прямоугольными колебаниями (сигнал-нуль) разной длительности (частотная модуляция)... иначе понадобилась бы идеальная синхронизация между магнитофоном и спеком при идеальном состоянии ленты.
глянь тут параграф "How does the Spectrum store data to a tape?": http://fly.cc.fer.hr/~arsen/tapefix/tapefix.html

Виктор
16.08.2008, 17:28
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 секунды мы как раз и увидим разноцветные полосы. смещение полос напрямую связано с моментом изменения цвета по отношению к моменту начала прорисовки экрана

boo_boo
17.08.2008, 14:46
Почему при загрузке появляются полосы, почему именно такого цвета, и вообще что они означают и для чего? Ведь в видеопамяти нет никакого бордюра? данные, считанные с ленты, гонятся на бордюр -- это не обязательно, так делает процедура загрузки из ПЗУ (шоб юзер перед монитором не скучал и знал, что процесс идет :)), многие самописные процедуры вместо этого счетчик рисуют и тп. насчет цвета можно предположить, что один цвет соответствует сигналу на магнитофонном входе, второй нулю (до демодуляции), хотя не знаю, что конкретно чудит ПЗУ-шная процедура.
насчет полос все как сказал mishutka, положение зависит от того, при каком положении CRT-луча было изменение цвета.
подробная инфа обо всем этом есть в виде статей в нете/журналах, можно поискать

Виктор
17.08.2008, 14:50
спасибо. И еще хотел узнать - почему при нажатии на кнопку резет по экрану бегут полосы? что в этот момент происходит в видеопамятью?

molodcov_alex
17.08.2008, 15:08
Проверка памяти. (это только в 48-м)

Виктор
17.08.2008, 20:47
а полоски?

molodcov_alex
17.08.2008, 20:50
Проверка и есть. Память-то общая. Память забивается чем-то вроде 02h, отсюда _темнокрасные_ вертикальные полосы каждые 8 точек.

Виктор
18.08.2008, 19:31
ну что ж, с этим разобрался. Теперь буду эмулить AY-проц, не подскажете, где почитать?
(вопрос не в тему, конечно, сорри, но как-то для одного вопроса тему не охота создавать)

Eltaron
19.08.2008, 14:56
ну что ж, с этим разобрался. Теперь буду эмулить AY-проц, не подскажете, где почитать?
лучше для начала заэмулить аналог команды BEEP хотя бы :)

Wlodek
23.08.2008, 03:09
Собственно, ничего хитрого. Из сброшенного в эмуляторе Шалаева образа 48К - первого дампа памяти, включающего 6912 или 6929 байт (вроде бы, не помню уже) - выдирает первые 6912 байт и записывает с указанным именем. ПисАлось "за пять минут" для собственных нужд и каким-то чудом (которое потом распухло и мешало ходить) сохранилось.

boo_boo
23.08.2008, 12:32
Теперь буду эмулить AY-проц, не подскажете, где почитать?
http://bulba.at.kz/main.htm