Info Guide #08
30 ноября 2005

For Coderz - CD video на ZX. Как написать плеер видео с компакт-диска.

<b>For Coderz</b> - CD video на ZX. Как написать плеер видео с компакт-диска.
        CD video на ZX
   О том, как написать плейер видео с ком─
пакт-диска, рассказывает автор того самого 
плейера, который был показан на CAFe'2003. 
К сожалению,сам плейер не сохранился. Дан─ 
ным вопросом также занимались PSB и немно─ 
жко я (Alone Coder). Лично я эксперименти─ 
ровал  только с 16(15)-цветным видео - там 
появляются довольно интересные задачи упа─ 
ковки и т.п. 

              CD video на ZX

   Для звука, естественно, нужно 2 буфера.
Естественно, данные хранятся как
[изображение][звук][изображение][звук] ... 
   Так  как  сидюки  данные одного сектора
передают  очень  быстро, то можно не ждать
готовности данных внутри сектора, а только
перед чтением.
   У меня сделано так:декрюнчится процеду─
ра  чтения одного сектора (2k), в которой,
где надо, расставлен  вывод звука (для ка─
чественного  звука  можно  ещё повставлять
NOP'ов или INC HX. У меня ещё само количе─ 
ство  тактов между выводами звука задаётся
как fixed point):
 

         LD C,E : INI
         LD C,D : INI
         LD C,E : INI
         LD C,D : INI
         ...
         [NOP/INC HX]
         EXX
         OUTI
        EXX
         
         LD C,E : INI
         LD C,D : INI
         LD C,E : INI
         LD C,D : INI
         ...
         [NOP/INC HX]
         EXX
         OUTI
        EXX
        и.т.д.

   Так как надо читать куски не кратные 2k
и не совпадающие с началом сектора (6144 -
экран и 2048 - звук не очень катит:тормоз─
но и весит много), в конце стоит JP на на─
чало, и используется часть и/или процедура
полностью (плавающий RET ).Я это оформил в
виде  процедуры, которая читает с текущего
положения в секторе нужное количество байт
и/или секторов. Её можно использовать так:
 

         LD BC,size
         LD HL,buff
        CALL read
        
   А конкретнее:
 

         LD BC,6912
         LD HL,#4000
        CALL read
         
         LD BC,1280
         LD HL,sndbuf0
        CALL read

   Ещё, так  как  надо  ожидать готовности
привода  и при  этом  выводить звук, нужна
процедура типа:

 w_snd 
         CALL w_cd
         RET Z
         NOP     ;до фига NOP'ов
         EXX
         OUTI
         EXX
         ...
        JP w_snd

   Желательно  поставить проверку на окон─
чание  буфера  (и/или  добавить нули после
буфера). Для качества звука желательно эту
процедуру сделать побольше (если количест─
во тактов между выводами звука не целое).
   Еще, если будете использовать часть эк─
рана  (спрайт) - n  знакомест в ширину (на
этом очень  много  можно сэкономить), надо
сделать  таблицу адресов для экранов и для
буферов со звуком и поменять код:
 

        POP HL  ;здесь через каждые n байт
                 ;читается новый адрес
         LD C,E : INI
         LD C,D : INI
         ...
        POP HL  ;здесь через каждые n байт
                 ;читается новый адрес
         LD C,E : INI
         LD C,D : INI
         ...
         [NOP/INC HX]
         EXX
         OUTI
        EXX

   Естественно, при таком подходе количес─
тво  байт звука на кадр должно быть кратно
n. И ещё, 2048  должно  делиться  на n без 
остатка (хотя если чуть-чуть гемора,то мо─
 жно и без этого).
   Ред.: Звука должно быть много - с запа─
сом! Дело в том,что где-то раз в 10 секто─ 
ров  ожидание  нового сектора затягивается 
на жуткий срок - более 20000 тактов.Причём 
вне  зависимости  от скорости (1x/8x/...)! 
Причины непонятны. 
   Общая структура процедуры read такая:
 

       [определяем,сколько и откуда читать]
      [вставляем 'RET']
┌─────[JP куда надо] 
│         ┌──────────────────────────┐ 
│        │/                         │ 
├────>[посылаем команду CD-ROM'у]    │ 
├────>[ожидаем готовности]           │ 
 └────>[читаем]                       │ 
           │                          │
          └──────────────────────────┘

   Можно   пользоваться   командой  чтения
группы секторов (в смысле, кол-во секторов
задавать >1 ), чтобы  не посылать  команду
каждый сектор - но далеко не всем приводам
это  нравится  (мой  DVD на это жалуется и
читать  отказывается). А с отменой текущей
команды  всё  вообще  очень  сложно - если
прервать чтение (RESET,к примеру),то потом
сложно  'достучаться'  до привода - сложно
понять, сколько нулевых команд ему надо.

Hedgehog (Александр Неганов) 



Другие статьи номера:

Inferno - Авторы журнала.

Inferno - Вступление от редактора.

Inferno - Ошибки в предыдущих номерах.

Inferno - Об оболочке.

Железо - CD-ROM - устройство и хитрости подключения.

For Coderz - CD video на ZX. Как написать плеер видео с компакт-диска.

Sofтинка - Техническое руководство по дисковой системе DISCiPLE/+D.

For Coderz - Маленькие программерские хитрости.

Математика - История решения теоремы Ферма.

Gameland - Игра Шестнашки.

Sofтинка - Описания и история изменений программы для работы с жестким диском HDDoctor v0.9.

Секреты - Секретные кнопки в разных приложениях: Wolfenstein'2004, IG#5, ACEdit, DNA OS, Wild Disk Copier.

Sofтинка - Улучшения конвертора графики в Gigascreen.

Звук - Ламповые усилители. Стерео лампочник 2х5 Вт из старых телевизоров.

Железо - Обзор кассетных проигрывателей.

Inferno - Письма в редакцию.

Gamedev - История создания игры Pang.

Gamedev - Советы при написании аркадной игры.

Реклама - Реклама от Романа Чунина.

Реклама - Реклама от Алексея Жабина.

Реклама - Реклама от В. Богдановича.

Интервью - Интервью с Николаем Родионовым, автором известных книг для ZX Spectrum

For Coderz - Вычисление тригонометрических и алгебраических функций в языках высокого уровня.

DIY - схема 16-цветного видео-режим v1.1 для пентагона.

Железо - Описание микросхемы К555ТЛ2.

For Coderz - Программирование устройства генерации звука Turbo Sound.

Sofтинка - 384x304 viewer. программа позволяющая просматривать цветные картинки, по размерам превышающие экран.

Sofтинка - Эмулятор ZX Spectrum на ZX Spectrum.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Warez Pack - новинки: Napalm, Mechwarrior, Modern Word 2.1, Insanity #02, 7 UP, Miracle#03.
Список BBS - Список работающий BBS.
Обратная связь - контакты редакции.
BBS-NEWS - новости московского ZXNet.
Проект года - потрясающая новелла к игре "Навигатор".

В этот день...   4 мая