by VBI » Mon, 18.01.2016 22:11:32
AndyD, давай с самого начала
дма у нас представляет такой лдир, который выполняется железом
для того что бы запустить любую передачу, нам нужно указать - откуда мы будем слать, страница
куда мы будем слать, страница
сколько байт за одну пересылку, и тут учтём что сразу передаётся по 2 байта, поэтому даже значение 0 будет передавать 2 байта.
соответственно - значение 255 - передаст за раз 512 байт
кроме того, этих пересылок у нас есть пачка. конкретно их число мы задаём в порте - сколько раз пересылок сделать.
и есть порт управления. который говорит о том, КАК слать.
т.е. - стоит ли после каждой пересылки переходить на начальный адрес, увеличивая старший байт? это D_ALGN или S_ALGN.
тут мы получаем возможность пересылать данные формируя из проследовательного набора данных, например, изображение на экране
как это происходит?
мы указываем длинну одной пересылки равной ширине экрана, устанавливаем бит D_ALGN - который говорит о том, что нужно увеличить старший байт приёмника после каждой пересылки на 1.
а если юзается бит A_SZ, который управляет собсно этим ххх_ALGN - то мы указываем КАК именно увеличивать - на 1 или на 2, в зависимости от того что хотим получить
дело в том, что это создано для пересылки не только данных, но и графики. для режима 16ц нам нужно увеличивать следующий адрес получателя на 1, а для 256 - на 2.
т.е. таким макаром мы сразу отлично отображаем в память правильно созданную картину из последовательных бинарных данных
это нужно: для тайлов/спрайтов/граф.изображений
как только мы отправили этот набор битов A_SZ,ххх_ALGN и прочие режимы типа DMA_RAM - в порт, железо уже отправляет первые 2 байта. и проц свободен
ЗЫ: если установлен этот бит D_ALGN,то в DMALen будет длинна строки(например320). И заливаться будет 320+ пропуск до новой строки и так весь блок 512,если в DMANum=0
D_ALGN нужен для обновления старшего байта адреса ПРИЁМНИКА на 1/2 в зависимости от состояния A_SZ. и как только пройдёт очередная отсылка, старший адрес будет увеличен.
например: #C000 > #C100 >#C200 ... #fe00 > #ff00> #c000 >#c100 и дальше, уже в новой странице, по количеству в порте DMANUM
а длинна передачи задаём в порте DMALEN, и не забываем что за раз передаётся 2 байта. т.ё. 320 точек - это DMALEN = 320/2 в режиме 256ц, и DMALEN= 320/4 в режиме 16ц , так как один байт в этом режиме - 2 точки сразу
спрашивай, буду рад таки пояснить