|
Born Dead
#0G
31 марта 2000 |
|
Coding своими руками - Супер-быстрый MCC player.

════════════════════════════════════════════════════════════════
ЇЄ╒▐╟░░╟▐╒ЄєЇCODING СВОИМИ РУКАМИ-II ЇєЄ╒▐╟░░╟▐╒ЄєЇ
════════════════════════════════════════════════════════════════
(c) MOn5+Er^Sa9e
Супер-быстрый player with MCC
Без вступлений и окончаний приведу самый распоследний вариант
плейера для MCC метода! Теперь им можно воспроизводить ВСЕ -
теорема Котельникова играет на нас!
EI ;до запуска в порт AY n7 записать #FF!
HALT
LD SP,START-SAMPLE-ADRESS
LD IX,LOOP
LD DE,#08+256*('MCC_TBL+1)
LD BC,#FFFD
OUT (C),E ;вкл. 8 AY_порт (крайний канал)
LOOP: POP HL
LD E,L
LD A,(DE)
DEC D
EX AF,AF'
LD A,(DE)
LD E,9
OUT (253),A
EX AF,AF'
OUT (C),E
OUT (253),A
LD E,H
LD A,(DE)
INC D
EX AF,AF'
LD A,(DE)
LD E,8
OUT (253),A
EX AF,AF'
OUT (C),E
OUT (253),A
JP (IX)
Обработчик INT'а:
INT: POP IY ;взяли адр. возврата
PUSH HL ;восстановили испорченный SAMPL
LD HL,0
ADD HL,SP
LD BC,END_SAMPLE_ADDRESS
OR A
SBC HL,BC
JR NC,END_INT
LD BC,#FFFD
POP HL
JP (IY)
END_INT: выход из player'а
160 тактов на две выборки сэмпла.
80 тактов на выборку.
Fдискрет.=3,5 МГц/80=43,75 кГц.
Плеер использует только один крайний канал AY, можно и два для
двойной громкости (на качество в принципе почти не влияет кол-во
крайних каналов...)
Единственный недостаток, можно слегка проскочить конец сэмпла,
т.к. проверка раз в INT, но недостаток легко исправляется: в
конце сэмпла (а он обязательно беззнаковый 0..#FF, а не -128 до
+127) заполнен 896 байт "тишиной" - байтом #80 и всё. Почему 896
- т.к. в INT'е 71680 тактов (maximum на нетурбированной машине),
а 71680/80=896!
Другие статьи номера:
Похожие статьи:
В этот день... 25 ноября