Цифровой плейер под 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.: Всем специалистам по этому вопросу - обращайтесь! В данной статье пока есть бе- лые пятна, а сам плейер ещё не написан!