by Grey » 24 Sep 2018, 02:49
Да. просто что бы буфер аппаратно читался. Ну и прерывание по середине и по концу приходило.
НО если ДМА это гемор , и если это будет новый режим и все равно под него что то писать то можно и даже лучше и проще без ДМА, по принципу, как в Спринтере было сделано.
Например. В альтере так же 8 (а лучше 16) буферов по 256 (а лучше по 512) байт. но заполняются они записью в 8 или 16 (или 16 или 32) отдельных портов , асинхронно, как угодно проигрывателю.
Т.е. проигрыватель посчитал байт сэмпла и тут же без всякой памяти в порт канала его отправил, посчитал следующий байт, его отправил, половину буфера заполнил, перешел на обсчет следующего канала.
все каналы через порт в буфер загнал и ждет , опрашивая в цикле статус буфера, когда половина буфера проиграет, что бы другую половину можно было заполнять. Прерывания вообще не нужны при таком алгоритме.
если буфер будет в 512 байт, то для одного канала будет 2 порта , в старшем байте адреса порта номер ячейки буфера
например так, условно если буфер 512 байт то
порты с 00А0 по FFA0 - первый буфер первого канала
порты с 00B0 по FFB0 - второй буфер первого канала
порты с 00А1 по FFA1 - первый буфер второго канала
порты с 00B1 по FFB1 - второй буфер второго канала
порты с 00AF по FFAF - первый буфер 16-го канала
порты с 00BF по FFBF - второй буфер 16-го канала
запись сэмла в буфер будет выглядеть так
в HL - адрес семпла, в `HL - дробная часть адреса для масштабирования
в DE целая часть, в `DE дробная часть коэффициента
в BC - 00A0
_loop
DUP 128 (или 256 - размер одного буфера)
EXX
ADD HL,DE
EXX
ADC HL,DE
LD A,(HL) - прочитали байт сэмпла
OUT (С),A - и сразу его в буфер альтеры
INC B
ENDDUP
загрузка в hl,de,`hl.`de данных другого канала
переключение страницы, и цикл на начало заполнения буфера
в BC - 00A1
и цикл на _loop
После этого в цикле ждем, читаем статус, какой буфер из 2-х проигрывается, начинает второй - заполняем первый и наоборот.
прерывания вообще будут не нужны, кроме может при записи в порт со стороны спектрума. Их то надо тоже ещё обрабатывать. Но необязательно можно и в цикле ожидания - подождет, если надо
Если проигрывание буфера сделать с конца от 255 до 0 тогда можно кусок кода
LD A,(HL) - прочитали байт сэмпла
OUT (С),A - и сразу его в буфер альтеры
INC B
заменить на
OUTI
INC HL
и ещё сэкономить несколько (вроде 4) тактов z80
а на буфер в 256 байт - это тысяча тактов на канал, 8000 тактов на цикл проигрывателя что не мало.