Внимание! Это временный неофициальный архив старой версии форума Полигон Призраков, созданный сочувствующим форуму участником. Этот сайт просуществует лишь до тех пор, пока администрация Полигона не сдержит своё обещание и не откроет официальный архив по адресу old.sannata.org.

Полигон-2

Форум о старых компьютерах

Объявление форума

Если пользуетесь личными сообщениями и получили по электронной почте оповещение о новом письме, не отвечайте, пожалуйста, почтой. Зайдите на форум и ответьте отправителю через ЛС.

Полигон-2 »   IBM PC-совместимое. До 2000 года включительно »   Это не "дура", это FMonster
RSS

Это не "дура", это FMonster

Попытка создать ISA 8-bit плату со всеми синтезаторами

<<Назад  Вперед>> Страницы: 1 2 3 4 5 6 7 8 9
Печать
 
Fagear
Advanced Member


Откуда: Москва, САО
Всего сообщений: 1228
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
22 янв. 2010
pahan, justontime спасибо большое за ликбез! :thumbup:
Значит, в случае CSM всё примерно так:
1) ПО выделяет в ОЗУ кусок под данные для PCM DAC (не более 64 КБ) и пихает туда сэмплы.
2) ПО маскирует нужный DRQ (1 или 3).
3) ПО настраивает DMA контроллер (указание канала, адреса на буфер, размера и прочее).
4) ПО демаскирует DRQ.
5) ПО пишет в AY чип по адресу BASE+0x00 номер регистра "0xFF" (управление портом I/O B).
6) ПО пишет в AY чип по адресу BASE+0x01 данные для регистра 0xFF, чтобы дёрнуть пин 7, отключив аналоговый выход C от микшера и разрешив выдачу DRQ.
7) ПО пишет ряд байт в AY чип по адресу BASE+0x00 и BASE+0x01, чтобы заставить канал C чипа AY генерировать запрос DMA.
8) AY по таймеру выходом C дёргает DRQ.
9) DMA контроллер выдаёт DACK и начинает передачу данных для CSM.

На последнем пункте вопрос - DMA контроллер выставляет какой-то адрес для CSM или в этом нет необходимости? Ведь канал DMA жёстко указывает на эту плату.


rus написал:
[q]
Насколько я понимаю, все источники будут отдавать сигнал в формате I2S, так?
[/q]
Вообще нет, даже не близко.
Ни один из чипов не отдаёт I2S. В цифре вообще отдают только два - OPL2 и OPL3, и у тех свой проприетарный Ямаховский интерфейс к своим же ЦАПам. Остальные чипы отдают сразу аналог.
rus
Advanced Member


Всего сообщений: 298
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
24 нояб. 2014
Нда, жаль. Тогда остаётся только защищать линии насколько это возможно. Любая ошибка, и вся работа с чистотой звучания насмарку будет.
Fagear
Advanced Member


Откуда: Москва, САО
Всего сообщений: 1228
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
22 янв. 2010
rus написал:
[q]
Тогда остаётся только защищать линии насколько это возможно. Любая ошибка, и вся работа с чистотой звучания насмарку будет.
[/q]
Для этого и идёт многостадийная отладка. Сначала несколько вариантов отдельных мини-плат, затем будет полноразмерный образец.
Кай
Гость
Divine Assassin

Откуда: извне (from beyond)
Всего сообщений: 13709
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
8 авг. 2010
Fagear, а поставить вертикальные заземлённые шины через все слои на все зоны? Высотой 6,3?
Fagear
Advanced Member


Откуда: Москва, САО
Всего сообщений: 1228
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
22 янв. 2010
Кай написал:
[q]
а поставить вертикальные заземлённые шины через все слои
[/q]
Да там слоёв то будет 2... Во всяком случае я буду избегать 4-х до последнего.
А так - для начала нужно уместить всё. А там видно будет.
pahan
Advanced Member


Откуда: Химки, М.О.
Всего сообщений: 1070
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
13 мар. 2015
[q]
1) ПО выделяет в ОЗУ кусок под данные для PCM DAC (не более 64 КБ) и пихает туда сэмплы.
[/q]
Тут можно дополнить только, что буфер этот должен быть в пределах первого мегабайта, но при программировании под DOS это соблюдается почти автоматически :)
[q]
3) ПО настраивает DMA контроллер (указание канала
[/q]
Указывать канал на контроллере не нужно - просто у каждого из 4х каналов свои регистры адреса, размера, режима работы. Кроме этого, если выставить режим autoinitialize, по завершении передачи адрес и размер автоматически сбросятся на ранее заданные значения. Более того, если НЕ использовать autoinitialize, канал по завершении передачи автоматически будет замаскирован.
[q]
8) AY по таймеру выходом C дёргает DRQ.
[/q]
Не знаю подробностей работы с AY, но в принципе возможен и другой режим - записью в request register DMA контроллера вы можете начать передачу по нужному каналу в любой момент, не дожидаясь, пока устройство физически дёрнет DRQ.
[q]
На последнем пункте вопрос - DMA контроллер выставляет какой-то адрес для CSM или в этом нет необходимости? Ведь канал DMA жёстко указывает на эту плату.
[/q]
DMA контроллер выставляет адрес в памяти, с которого надо забрать данные и выставляет MEMR и IOW. DACK однозначно определяет какое устройство эти данные должно забрать с указанного адреса, отдельно выставлять адрес устройства (и вообще знать его) контроллеру не нужно. Собственно, возможная неправильная реакция какого-либо устройства в этот момент явно запрещена неактивным сигналом AEN.
Fagear
Advanced Member


Откуда: Москва, САО
Всего сообщений: 1228
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
22 янв. 2010
pahan написал:
[q]
Не знаю подробностей работы с AY
[/q]
Там очень замудрённый механизм запроса DRQ.


pahan написал:
[q]
DACK однозначно определяет какое устройство эти данные должно забрать с указанного адреса, отдельно выставлять адрес устройства (и вообще знать его) контроллеру не нужно.
[/q]
Тогда, получается, CSM должен уметь работать двумя способами.
1) Через DMA.
2) Прямой записью в порт.

Потому что при работе через DMA от софта обращений по адресам CSM не будет (судя по кривому GAL - оно сработает просто при наличии DACK, IOW и разрешении, исходящего от AY).
Однако некоторые игрушки явно пишут PCM данные просто в порт BASE+0x02:
[q]
[CSM] Write on port 222h, len 1, val 88h
[CSM] Write on port 222h, len 1, val 88h
[CSM] Write on port 222h, len 1, val 8ah
[CSM] Write on port 222h, len 1, val 86h
[CSM] Write on port 222h, len 1, val 8ch
[CSM] Write on port 222h, len 1, val 90h
[CSM] Write on port 222h, len 1, val 84h
[CSM] Write on port 222h, len 1, val 7eh
[CSM] Write on port 222h, len 1, val 80h
[CSM] Write on port 222h, len 1, val 82h
[CSM] Write on port 222h, len 1, val 82h
[CSM] Write on port 222h, len 1, val 7ah
[CSM] Write on port 222h, len 1, val 7eh
[CSM] Write on port 222h, len 1, val 78h
[CSM] Write on port 222h, len 1, val 76h
[CSM] Write on port 222h, len 1, val 70h
[CSM] Write on port 222h, len 1, val 86h
[CSM] Write on port 222h, len 1, val 74h
[CSM] Write on port 222h, len 1, val 80h
[CSM] Write on port 222h, len 1, val 78h
[CSM] Write on port 222h, len 1, val 74h
[CSM] Write on port 222h, len 1, val 90h
[CSM] Write on port 222h, len 1, val 8eh
[CSM] Write on port 222h, len 1, val 7ah
[CSM] Write on port 222h, len 1, val 8ah
[CSM] Write on port 222h, len 1, val 6eh
[CSM] Write on port 222h, len 1, val 88h
[CSM] Write on port 222h, len 1, val 94h
[CSM] Write on port 222h, len 1, val 80h
[CSM] Write on port 222h, len 1, val 7eh
[CSM] Write on port 222h, len 1, val 7ch
[CSM] Write on port 222h, len 1, val 7ch
[CSM] Write on port 222h, len 1, val 70h
[CSM] Write on port 222h, len 1, val 70h
[CSM] Write on port 222h, len 1, val 8ah
[CSM] Write on port 222h, len 1, val 8ah
[CSM] Write on port 222h, len 1, val 6eh
[CSM] Write on port 222h, len 1, val 84h
[CSM] Write on port 222h, len 1, val 8ch
[CSM] Write on port 222h, len 1, val 90h
[CSM] Write on port 222h, len 1, val 9ah
[CSM] Write on port 222h, len 1, val 74h
[CSM] Write on port 222h, len 1, val 6ah
[CSM] Write on port 222h, len 1, val 7ch
[CSM] Write on port 222h, len 1, val 88h
[CSM] Write on port 222h, len 1, val 92h
[CSM] Write on port 222h, len 1, val 92h
[CSM] Write on port 222h, len 1, val 82h
[CSM] Write on port 222h, len 1, val 70h
[CSM] Write on port 222h, len 1, val 66h
[CSM] Write on port 222h, len 1, val 7ah
[CSM] Write on port 222h, len 1, val 8ch
[CSM] Write on port 222h, len 1, val 94h
[CSM] Write on port 222h, len 1, val 82h
[CSM] Write on port 222h, len 1, val 7eh
[CSM] Write on port 222h, len 1, val 7ah
[CSM] Write on port 222h, len 1, val 7ah
[CSM] Write on port 222h, len 1, val 7ah
[CSM] Write on port 222h, len 1, val 7ch
[CSM] Write on port 222h, len 1, val 76h
[CSM] Write on port 222h, len 1, val 74h
[CSM] Write on port 222h, len 1, val 7ch
[CSM] Write on port 222h, len 1, val 88h
[CSM] Write on port 222h, len 1, val 8eh
[CSM] Write on port 222h, len 1, val 86h
[CSM] Write on port 222h, len 1, val 80h
[CSM] Write on port 222h, len 1, val 80h
[CSM] Write on port 222h, len 1, val 80h
[CSM] Write on port 222h, len 1, val 7ah
[CSM] Write on port 222h, len 1, val 70h
[CSM] Write on port 222h, len 1, val 72h
[CSM] Write on port 222h, len 1, val 7eh
[/q]
Что явно идёт в разрез с работой по DMA.

Надо пытаться запустить CSM на железе и смотреть на реальных железяках чего там куда обращается.
pahan
Advanced Member


Откуда: Химки, М.О.
Всего сообщений: 1070
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
13 мар. 2015
[q]
Тогда, получается, CSM должен уметь работать двумя способами.
1) Через DMA.
2) Прямой записью в порт.
[/q]
Конечно. И ещё в идеале выдавать прерывание. Повторюсь - для ПО (CPU) способа узнать, что передача по DMA данных конкретному устройству закончена, нет. Обычно делают так - устройство,увидев импульс TC, генерит IRQ.
[q]
Потому что при работе через DMA от софта обращений по адресам CSM не будет (судя по кривому GAL - оно сработает просто при наличии DACK, IOW и разрешении, исходящего от AY).
[/q]
Да, этого абсолютно достаточно, чтобы принять данные.
[q]
Однако некоторые игрушки явно пишут PCM данные просто в порт BASE+0x02:
[q]
[CSM] Write on port 222h, len 1, val 7eh
[/q]
Что явно идёт в разрез с работой по DMA.
[/q]
Думаю принципиальна здесь пересылка по одному байту за раз. Да, это можно реализовать через DMA, есть даже специальный режим у DMA-контроллера - single transfer, когда из всего буфера будет пересылаться 1 байт за раз, а в промежутках CPU будет позволено тоже что-то полезное сделать. Но всё это из серии - "но зачем???". DMA имеет смысл именно для довольно больших блоков (те самые килобайты).
Вообще утверждение, что DMA - самый быстрый режим передачи, заслуживает серьёзного расследования и разрушения мифа. Во времена всяких XT это действительно было так - частоты проца и DMA-контроллера (а у него не больше 4,77 МГц) близки, процы даже на элементарные команды тратили кучу тактов. Думаю, с 486х (а может даже 386х, считать надо) любая возня с DMA будет реально неоправдана - на простейшие команды не больше нескольких тактов, да ещё на в разы более высокой частоте...
scg
Newbie


Всего сообщений: 108
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
28 фев. 2017
[q]
Думаю, с 486х (а может даже 386х, считать надо) любая возня с DMA будет реально неоправдана - на простейшие команды не больше нескольких тактов, да ещё на в разы более высокой частоте...
[/q]
Для процессоров, которые работают на частотах выше частоты шины, обращение напрямую к шине (опереции ввода-вывода не кешируются) будет его сильно тормозить. С появление PCI DMA вообще стало основным способом общения перефирии с остальной системой.
pahan
Advanced Member


Откуда: Химки, М.О.
Всего сообщений: 1070
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
13 мар. 2015
[q]
С появление PCI DMA вообще стало основным способом общения перефирии с остальной системой.
[/q]
Именно так. Только к классическому ISA DMA, который мы в данном случае обсуждаем, всё это не имеет никакого отношения. В PCI и более поздних фактически этот режим называется bus mastering и позволяет любому устройству без всяких посредников (а именно DMA-контроллера) обращаться напрямую к любому другому устройству, в том числе памяти.
[q]
Для процессоров, которые работают на частотах выше частоты шины, обращение напрямую к шине (опереции ввода-вывода не кешируются) будет его сильно тормозить.
[/q]
Однако частота шины в данным случае всё равно остаётся в разы выше частоты ISA DMA-контроллера.
<<Назад  Вперед>> Страницы: 1 2 3 4 5 6 7 8 9
Печать
Полигон-2 »   IBM PC-совместимое. До 2000 года включительно »   Это не "дура", это FMonster
RSS

1 посетитель просмотрел эту тему за последние 15 минут
В том числе: 1 гость, 0 скрытых пользователей

Последние RSS
[Москва] LIQUID-Акция. Сливаются разъемы CF
МС7004 и 7004А на AT и XT
Пайка термотрубок
Проммать s478 PEAK 715VL2-HT ( Full-Size SBC)
Подскажите по 386 материке по джамперам.

Самые активные 5 тем RSS