Цифровой плейер под 16кГц.

  (Original was sent to Disabler/DPL &
Vitamin/CAIG. Disabler уже поддержал идею)

   У меня  возникла дикая идея плейера под
SD или  ковокс-4 канала+громкость с часто-
той около 16кгц (для SD около 15). Главная
мысль: использование  стека  как источника
адресов подпрограмм.

   В ET использовалось масштабирование ка-
налов отдельно от вывода в порты.Это хоро-
шая идея, т.к. за счет более редкого обра-
щения к #7ffd и более редкого переприсваи-
вания  регистров  получается более высокая
скорость. Воспользуемся этой идеей.

   Пусть прога, занимающаяся масштабирова-
нием канала (скалер) берёт 4 отсчёта кана-
ла и пихает их по неким адресам... А прога
кидания в порты берет отсчёты в другом по-
рядке из этих адресов, пересчитывает гром-
кость по табличке и швыряет в порт...Пусть
в главном  цикле  у  нас будет кидаться 64
отсчёта (почему, см.ниже)

   То есть:

переключаем странички,переприсваиваем счё-
тчики,SP=табличка...
scaler (отсчёты 0-3 канала A)
outer (отсчёт 0)
scaler (4-7 A)
outer (1)
 ...
scaler (60-63 A)
outer (15)
переключаем странички,переприсваиваем счё-
тчики,SP=табличка...
потом:
scaler (16-19 B)
outer (16)
scaler (20-23 B)
outer (17)
 ...
scaler (12-15 B)
outer (31)
переключаем странички,переприсваиваем счё-
тчики,SP=табличка...
потом:
scaler (32-19 C)
outer (32)
scaler (20-23 C)
outer (33)
 ...
scaler (12-15 B)
outer (47)
переключаем странички,переприсваиваем счё-
тчики,SP=табличка...
потом:
scaler (16-19 B)
outer (48)
scaler (20-23 B)
outer (49)
 ...
scaler (12-15 B)
outer (63)

   Под фразой "переключаем странички,пере-
присваиваем счетчики, SP=табличка..." под-
разумевается следующее:
 LD A,H
 CP 'endSampleA
 JR NZ,NOEND_A
 LD HL,startSampleA
 [LD A,pageStartSampleA]
 [LD (...),A]   ;это если плейер позволяет
             ;сэмплам пересекать странички
        ;тогда программа и в других местах
        ;усложняется,подробнее - спрашивай
NOEND_A
 LD (CHAN_A+1),HL
CHAN_B
 LD HL,...
 LD SP,... ;это меняет процедура обработки
        ;условного прерывания (так как DI)

   Простейшие  варианты scaler'a и outer'a
такие (мне кажется)

   scaler:

LDI
INC D
[INC HL]
[DEC HL]
LDI
INC D
[INC HL]
[DEC HL]
LDI
INC D
[INC HL]
[DEC HL]
LDI
INC D
[INC HL]
[DEC HL]
RET

инкременты в квадратных скобках необязате-
льны.Поскольку у нас 4 таких "необязатель-
ных" инкремента, то  в разных  комбинациях
(кроме запрещенных) они дадут 26 scaler'ов
(если с запрещенными, то все 32). Весь на-
бор таких scaler'ов займет 1к.

   outer (COVOX):

EXX
LD E,... ;CHANNEL A
LD A,(DE)
LD L,... ;CHANNEL B
ADD A,(HL)
ADD A,(IX+...) ;CHANNEL C
ADD A,(IY+...) ;CHANNEL D
EXX
OUT (COVOX),A
[LD A,PAGE]
[LD BC,32765]
[OUT (C),A]
[...]
RET

фрагмент  в квадратных  скобках опять-таки
необязательный - он  есть  только в каждом
16-м outer'e.

outer'ы располагаются в памяти так:

|-----> L
|
v
 H

outer0            outer8            ...
 outer1            outer9            ...
  outer2            outer10           ...
   ...                ...
       outer7            outer15

Это займет 2к.

Сам понимаешь,LDI:INC D требует жертв :)))
В каждом 2-м outer'e есть коррекция DE:
LD DE,...

   Теперь о таблицах:
Если нот у нас 48(4 octaves), то
48*64 (в каждой табличке 32 адреса)*4 (для
каждого канала своя табличка)=12к
Если громкостей у нас 16:
16*256=4k

итого: 1+2+12+4=19k
(warning! это должно быть в нижней памяти!
32k-19k=13k free)

   Теперь к вопросу о том,почему 64 отсчё-
та.При периодичности инкрементов в 64 шту-
ки (при использовании таблиц неизбежна пе-
риодичность) 4 октавы  мало фальшивят. Это
определяется опытным путем (я когда-то оп-
ределил). Чем  меньше  период, тем  больше
фальшь и меньше скорость!!!

   Глисс использовать нельзя :(
Точнее можно,но грубо:как коррекцию адреса
после каждых 64 отсчётов.

   Зато быстро :)

   Примечание:для ковокса можно сэкономить
3k и добавить скорости,если брать сразу по
8 отсчётов.В середине каждого scaler'a си-
дит OUT (COVOX),A.
   Тогда scaler'ы займут (125 штук)=4к.
   Зато таблица вызовов займет 48*32(в ка-
ждой табличке 16 адресов)*4=6k
   Итого: 4+2+6+4=16k

   Жду встречных идей и предложений!
Вопросы тоже принимаются ;)

P.S.: Всем специалистам по этому вопросу -
обращайтесь! В данной статье пока есть бе-
лые пятна, а сам плейер ещё не написан!