Люди, кто-нить программил AC'97 на ICH или ICHx? Вроде как всё делаю, как описано в доке, но частенько получаю или неправильное значение, или TimeOut при чтении регистров кодека. Помогите, кто может, plz! Прога в аттаче.(Должна воспроизводить WAV'ы через ICH AC'97)
Думаю на этом форуме тебе не помогут... Я сделал под свой проект оси, пока в виде хорошего драйверныго кода, внешне, как прожка под досом... Долго вылизывал, работает. Могу обменяться сорцами в обмен на работу по HDA или на совместную работу далее, т.к. нужен хорошее воплощение программного ресемплера (имеется проблема именно с ICH - это только 48кб/с!) Хош найти ассемблерные воплощения и реально-работающее + отечественное и свежей выпечки - рекомендую проштудировать ЭТО: http://www.meos.sysbin.com/viewtopic.php?t=317&postdays=0&postorder=asc&start=0
2 VaStaNi Спасибо за ссылку. Когда отлажу свою прогу, займусь HDA Насчёт ресемплинга, IMHO, не так уж плоха линейная интерполяция - по крайней мере, высокая скорость и простая реализация. Кстати, вот хорошая ссылка: http://ccrma.stanford.edu/~jos/resample
- печально. Мне более прельщает "тогда займусь поплотнее HDA, а потом давай реально обменяемся наработками с подробными комментариями и возможно, детализация вопрсов по мылу". Я твой код видел, пока еще много работы впереди и возможно ошибок. Долго рассказывать по твоему коду, что и как надо и лучше, потому, что...... Правда ты можешь воспользоваться хорошим куском от Serga, но адаптировать и разбираться в их оси придется, чтобы понять все до мелочей. Когда я стоял (год назад гдето) на этом уровне, как ты сейчас, мне еще несколько месяцев периодически правда, вылизывать пришлось, прежде чем все нормально с прерываниями пошло. Ладно, выбирать тебе свой путь. А освещать, публиковать, тестить где будешь и будешь ли вообще? (форум, сайт....?) Да, вот еще. Код тяжеловато читается, почемуто весь линеен, прерываний не заметил... ты дескрпторы буферные (номера) где приращаешь, перебираешь? Что то не нашел...
Дык и по ICHx AC'97 есть А насчёт интерполяции - меня линейная тоже устроила. Быстро, нет суперсложных вычислений, и плюс я реализацию замутил в целых числах - ИМХО быстрее флоатов должно быть. Если найду выложу. Качество плохое у ступенчатой интерполяции - скрипы всякие появляются... Ну хотя тут вопрос такой - слух у каждого свой. Я просто на VIA AC'97 тестировал. Там есть аппаратный ресэмплер. Ну и я 2 раза песню прогонял - с аппаратным и с программным ресэмплингом. При ступенчатой слышно что фигня на высоких частотах, а при линейной я разницы не заметил.
2VaStaNi Я прерываниями не пользуюсь: в ДОС всё равно исполняется только эта прога - для определения завершённости обработки буфера читаю CIV и сравниваю его с LVI: если равны, то использую завершённый буфер и обновляю LVI, так что весь BDL выглядит как-то вроде: Buffer0Descriptor Buffer1Descriptor Buffer0Descriptor Buffer1Descriptor (etc.) Тем более, что придётся как-то разбираться с повторной входимостью обработчиков DOS и BIOS, ведь чтение файла бы происходило именно в ISR. В цикле FillBDLLp пишутся по очереди адреса двух буферов, переменная Counter используется для определения четности номера буфера и размера для чтения с диска. Ещё несколько вопросов: на ICH5 у меня после выхода из ресета устанавливается бит 28, но доступ к кодеку почему-то ведется по смещению MMBAR+0, а не MMBAR+100h - почему? Может я не так понял интеловскую доку? А при использовании смещения MMBAR+0 хоть звук и включается, воспроизведения не происходит. Может, как-то надо сообщать Bus Master'у, какой какой кодек использовать? Если да, то как? И ещё: как правильно получать доступ к семафору и самому кодеку, чтобы не было TimeOut'ов?
10110111, извини! Времени СОВСЕМ нет даже путяще, что то ответить, кажется все вокруг сошли с ума и пытаются сжать время или его остановить в умирающем 2006м... Даю реальный кусок работы имеющий прямое отношение к вопросу, это все, что могу бегом... Код (Text): ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; базовые данные из ; ALSA driver for Intel ICH (i8x0) chips. Jaroslav Kysela <perex@suse.cz> ; исключительно для чипетов INTEL совместимых Device IDs I440MX_DID = 0x7195 ICH_DID = 0x2415 ICH0_DID = 0x2425 ICH2_DID = 0x2445 ICH3_DID = 0x2485 ICH4_DID = 0x24C5 ICH5_DID = 0x24D5 ICH6_DID = 0x266E ICH7_DID = 0x27DE ESB_DID = 0x25A6 ESB2_DID = 0x2698 NFORCE_DID = 0x01B1 NFORCE2_DID = 0x006A NFORCE3_DID = 0x00DA ; VaStaNi - добавлено, на основании реального чипсета nVidia NFORCEx_DID = 0x026B ; ASROCK K8NF4G MCP04_DID = 0x003A CK8_DID = 0x008A CK804_DID = 0x0059 CK8S_DID = 0x00EA SIS7012_DID = 0x7012 AMD768_DID = 0x7445 AMD8111_DID = 0x764D PCI_DEVICE_ID_440MX = ( I440MX_DID SHL 16 ) + INTEL_VID PCI_DEVICE_ID_ICH = ( ICH_DID SHL 16 ) + INTEL_VID PCI_DEVICE_ID_ICH0 = ( ICH0_DID SHL 16 ) + INTEL_VID PCI_DEVICE_ID_ICH2 = ( ICH2_DID SHL 16 ) + INTEL_VID PCI_DEVICE_ID_ICH3 = ( ICH3_DID SHL 16 ) + INTEL_VID PCI_DEVICE_ID_ICH4 = ( ICH4_DID SHL 16 ) + INTEL_VID PCI_DEVICE_ID_ICH5 = ( ICH5_DID SHL 16 ) + INTEL_VID PCI_DEVICE_ID_ICH6 = ( ICH6_DID SHL 16 ) + INTEL_VID PCI_DEVICE_ID_ICH7 = ( ICH7_DID SHL 16 ) + INTEL_VID PCI_DEVICE_ID_ESB = ( ESB_DID SHL 16 ) + INTEL_VID PCI_DEVICE_ID_ESB2 = ( ESB2_DID SHL 16 ) + INTEL_VID PCI_DEVICE_ID_NFORCE = ( NFORCE_DID SHL 16 ) + NVIDIA_VID PCI_DEVICE_ID_NFORCE2 = ( NFORCE2_DID SHL 16 ) + NVIDIA_VID PCI_DEVICE_ID_NFORCE3 = ( NFORCE3_DID SHL 16 ) + NVIDIA_VID PCI_DEVICE_ID_NFORCEx = ( NFORCEx_DID SHL 16 ) + NVIDIA_VID PCI_DEVICE_ID_MCP04 = ( MCP04_DID SHL 16 ) + NVIDIA_VID PCI_DEVICE_ID_CK8 = ( CK8_DID SHL 16 ) + NVIDIA_VID PCI_DEVICE_ID_CK804 = ( CK804_DID SHL 16 ) + NVIDIA_VID PCI_DEVICE_ID_CK8S = ( CK8S_DID SHL 16 ) + NVIDIA_VID PCI_DEVICE_ID_SIS7012 = ( SIS7012_DID SHL 16 ) + SIS_VID PCI_DEVICE_ID_AMD768 = ( AMD768_DID SHL 16 ) + AMD_VID PCI_DEVICE_ID_AMD8111 = ( AMD8111_DID SHL 16 ) + AMD_VID ;============================================= ; * capture block * ;============================================= ICH_REG_PI_BDBAR = 0 ; dword - buffer descriptor list base address ICH_REG_PI_CIV = 4 ; byte - current index value ICH_REG_PI_LVI = 5 ; byte - last valid index ICH_REG_LVI_MASK = 0x1F ICH_REG_PI_SR = 6 ; byte - status register ICH_FIFOE = 0x10 ; FIFO error ICH_BCIS = 8 ; buffer completion interrupt status ICH_LVBCI = 4 ; last valid buffer completion interrupt ICH_CELV = 2 ; current equals last valid ICH_DCH = 1 ; DMA controller halted ICH_REG_PI_PICB = 8 ; word - position in current buffer ICH_REG_PI_PIV = 0x0A ; byte - prefetched index value ICH_REG_PIV_MASK = 0x1F ; mask ICH_REG_PI_CR = 0x0B ; byte - control register ICH_IOCE = 0x10 ; interrupt on completion enable ICH_FEIE = 8 ; fifo error interrupt enable ICH_LVBIE = 4 ; last valid buffer interrupt enable ICH_RESETREGS = 2 ; reset busmaster registers ICH_STARTBM = 1 ; start busmaster operation ;============================================= ; * playback block * ICH_REG_PO_BDBAR = 0x10 ; dword - buffer descriptor list base address ICH_REG_PO_CIV = 0x14 ; byte - current index value ICH_REG_PO_LVI = 0x15 ; byte - last valid command ICH_REG_PO_SR = 0x16 ; byte - status register ICH_REG_PO_PICB = 0x18 ; word - position in current buffer ICH_REG_PO_PIV = 0x1A ; byte - prefetched index value ICH_REG_PO_CR = 0x1B ; byte - control register ;============================================= ; * mic capture block * ICH_REG_MC_BDBAR = 0x20 ; dword - buffer descriptor list base address ICH_REG_MC_CIV = 0x24 ; byte - current index value ICH_REG_MC_LVI = 0x25 ; byte - last valid command ICH_REG_MC_SR = 0x26 ; byte - status register ICH_REG_MC_PICB = 0x28 ; word - position in current buffer ICH_REG_MC_PIV = 0x2A ; byte - prefetched index value ICH_REG_MC_CR = 0x2B ; byte - control register ;============================================= ; * global block * ICH_REG_GLOB_CNT = 0x2C ; dword - global control ICH_PCM_SPDIF_MASK = 0xC0000000 ; s/pdif pcm slot mask (ICH4) ICH_PCM_SPDIF_NONE = 0x00000000 ; reserved - undefined ICH_PCM_SPDIF_78 = 0x40000000 ; s/pdif pcm on slots 7&8 ICH_PCM_SPDIF_69 = 0x80000000 ; s/pdif pcm on slots 6&9 ICH_PCM_SPDIF_1011 = 0xC0000000 ; s/pdif pcm on slots 10&11 ICH_PCM_20BIT = 0x00400000 ; 20-bit samples (ICH4) ICH_PCM_246_MASK = 0x00300000 ; 6 channels (not all chips) ICH_PCM_6 = 0x00200000 ; 6 channels (not all chips) ICH_PCM_4 = 0x00100000 ; 4 channels (not all chips) ICH_PCM_2 = 0 ; 2 channels (stereo) ICH_SIS_PCM_246_MASK = 0x000000C0 ; 6 channels (SIS7012) ICH_SIS_PCM_6 = 0x00000080 ; 6 channels (SIS7012) ICH_SIS_PCM_4 = 0x00000040 ; 4 channels (SIS7012) ICH_SIS_PCM_2 = 0x00000000 ; 2 channels (SIS7012) ICH_TRIE = 0x00000040 ; tertiary resume interrupt enable ICH_SRIE = 0x20 ; secondary resume interrupt enable ICH_PRIE = 0x10 ; primary resume interrupt enable ICH_ACLINK = 8 ; AClink shut off ICH_AC97WARM = 4 ; AC'97 warm reset ICH_AC97COLD = 2 ; AC'97 cold reset ICH_GIE = 1 ; GPI interrupt enable ;============================================= ICH_REG_GLOB_STA = 0x30 ; dword - global status ICH_TRI = 0x20000000 ; ICH4: tertiary (AC_SDIN2) resume interrupt ICH_TCR = 0x10000000 ; ICH4: tertiary (AC_SDIN2) codec ready ICH_BCS = 0x08000000 ; ICH4: bit clock stopped ICH_SPINT = 0x04000000 ; ICH4: S/PDIF interrupt ICH_P2INT = 0x02000000 ; ICH4: PCM2-In interrupt ICH_M2INT = 0x01000000 ; ICH4: Mic2-In interrupt ICH_SAMPLE_CAP = 0x00C00000 ; ICH4: sample capability bits (RO) ICH_SAMPLE_16_20 = 0x00400000 ; ICH4: 16- and 20-bit samples ICH_MULTICHAN_CAP = 0x00300000 ; ICH4: multi-channel capability bits (RO) ICH_MD3 = 0x00020000 ; modem power down semaphore ICH_AD3 = 0x00010000 ; audio power down semaphore ICH_RCS = 0x00008000 ; read completion status ICH_BIT3 = 0x00004000 ; bit 3 slot 12 ICH_BIT2 = 0x00002000 ; bit 2 slot 12 ICH_BIT1 = 0x00001000 ; bit 1 slot 12 ICH_SRI = 0x00000800 ; secondary resume interrupt ICH_PRI = 0x00000400 ; primary resume interrupt ICH_SCR = 0x00000200 ; secondary codec ready ICH_PCR = 0x00000100 ; primary codec ready ICH_MCINT = 0x00000080 ; MIC capture interrupt ICH_POINT = 0x00000040 ; playback interrupt ICH_PIINT = 0x00000020 ; capture interrupt ICH_NVSPINT = 0x00000010 ; nforce spdif interrupt ICH_MOINT = 0x00000004 ; modem playback interrupt ICH_MIINT = 0x00000002 ; modem capture interrupt ICH_GSCI = 0x00000001 ; GPI status change interrupt ;============================================= ICH_REG_ACC_SEMA = 0x34 ; byte - codec write semaphore ICH_CAS = 1 ; codec access semaphore ;============================================= ICH_REG_SDM = 0x80 ICH_DI2L_MASK = 0x000000C0 ; PCM In 2, Mic In 2 data in line ICH_DI2L_SHIFT = 6 ICH_DI1L_MASK = 0x00000030 ; PCM In 1, Mic In 1 data in line ICH_DI1L_SHIFT = 4 ICH_SE = 0x00000008 ; steer enable ICH_LDI_MASK = 0x00000003 ; last codec read data input ;============================================= ;============================================= ;============================================= ;->ВХОД: ; EBP - определяет маску бит регистра GLOB_STA, которые определяют тип подключения ; кодека (Primary, Secondary, Tertiary) от которого будет ожидаться готовность ; BX - содержит смещение требуемого регистра чтения/записи после "semaphore" ;<-ВЫХОД: ; DX - фактический адрес порта доступа для требуемого регистра по BX указателю ; DX' - указывает на ICH_REG_GLOB_STA (bswap) ICH_AC97codec_semaphore: mov ecx, 1000 mov dx, [iACARD.BusMastBA] add dx, ICH_REG_GLOB_STA @ICHtstReady: ; wait for semaphore ready (not busy) status cli in eax, dx and eax, [iACARD.MaskStat] je @ICHnotReady add dx, 4 ; DX = ICH_REG_ACC_SEMA in al, dx sub dx, 4 ; DX = ICH_REG_GLOB_STA and al, ICH_CAS ; кодек занят ? jne @ICH_CodecAccess @ICHnotReady: dec ecx stc je @ICHnotCodecAccess call @Delay10mcs jmp @ICHtstReady @ICH_CodecAccess: bswap edx ; переведем DX = ICH_REG_GLOB_STA в "тень" mov dx, [iACARD.MixBA] in ax, dx ; clear semaphore flag add dx, bx @ICHnotCodecAccess: RET ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICH_AC97_WRITE: push ecx push eax call ICH_AC97codec_semaphore pop eax jc @notReadyWrite out dx, ax @notReadyWrite: sti pop ecx RET ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICH_AC97_READ: push ecx call ICH_AC97codec_semaphore jc @ICHnotReadyRead mov ecx, 1000 @ICHchkGoodRead: cli in ax, dx ; чтение нужного регистра кодека mov bx, ax ; в BX сохраним прочитанное значение bswap edx ; теперь будет DX = ICH_REG_GLOB_STA in eax, dx test eax, dword ICH_RCS je @ICHgoodRead ; reset RCS and preserve other R/WC bits ; bswap edx and eax, dword NOT (ICH_SRI OR ICH_PRI OR ICH_TRI OR ICH_GSCI) ; out dx, eax out dx, eax bswap edx dec ecx stc je @ICHnotReadyRead call @Delay10mcs jmp @ICHchkGoodRead @ICHgoodRead: mov ax, bx ; восстановим в AX прочитанное значение @ICHnotReadyRead: sti pop ecx RET ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICH_AC97_INIT: mov dx, [iACARD.BusMastBA] add dx, ICH_REG_GLOB_STA ; put logic to right state ; first clear status bits mov ebx, ICH_RCS OR ICH_MCINT OR ICH_POINT OR ICH_PIINT in eax, dx cmp [iACARD.ClassDevType], CLASS_DEVICE_NFORCE jne @noNVIDIA or ebx, ICH_NVSPINT @noNVIDIA: and eax, ebx out dx, eax ; ACLink on, 2 channels sub dx, (ICH_REG_GLOB_STA-ICH_REG_GLOB_CNT) ; DX = ICH_REG_GLOB_CNT in eax, dx ; READ ICH_REG_GLOB_CNT and eax, dword NOT (ICH_ACLINK OR ICH_PCM_246_MASK) ; finish cold or do warm reset mov ecx, ICH_AC97COLD mov ebx, ICH_AC97WARM test eax, ecx cmovne ecx, ebx or eax, ecx out dx, eax mov ecx, 1000 @03: call @Delay10mcs in eax, dx ; READ ICH_REG_GLOB_CNT test eax, ebx ; AND ICH_AC97WARM je @04 dec ecx jne @03 jmp @errorAC97 @04: cmp word [iACARD.DevID_VndID], SIS_VID jne @04nonSIS and eax, dword NOT ICH_SIS_PCM_246_MASK jmp @setNewVal_REG_GLOB_CNT @04nonSIS: cmp word [iACARD.DevID_VndID], INTEL_VID jne @04nonICH and eax, dword NOT ICH_PCM_20BIT @04nonICH: and eax, dword NOT ICH_PCM_246_MASK @setNewVal_REG_GLOB_CNT: out dx, eax ; WRITE ICH_REG_GLOB_CNT ; Теперь будем ожидать бита готовности от кодека любого типа подключения (Primary, Secondary, Tertiary) add dx, (ICH_REG_GLOB_STA-ICH_REG_GLOB_CNT) ; = ICH_REG_GLOB_STA mov ebx, ICH_PCR OR ICH_SCR cmp [iACARD.ClassDevType], CLASS_DEVICE_INTEL_ICH4 jne @nIch4 or ebx, ICH_TCR @nIch4: ; bswap edx ; mov dx, [iACARD.MixBA] ; bswap edx mov ecx, 1000 @ICH_TstAnyCodecReady: call @Delay10mcs ; bswap edx ; in ax, dx ; clear semaphore flag ; bswap edx in eax, dx ; READ ICH_REG_GLOB_STA and eax, ebx jne @ICH_AnyCodecReady dec ecx jne @ICH_TstAnyCodecReady jmp @errorAC97 @ICH_AnyCodecReady: mov ebx, eax and eax, ICH_PCR jne @ICH_fixMaskStat mov eax, ebx and eax, ICH_SCR jne @ICH_fixMaskStat mov eax, ebx and eax, ICH_TCR @ICH_fixMaskStat: mov [iACARD.MaskStat], eax je @errorAC97 ;--------------- ; в версии 002 ЕЩЕ сделан обход ; jmp @nxtInitStep cmp [iACARD.ClassDevType], CLASS_DEVICE_SIS jne @nSis7012 ; unmute the output on SIS7012 mov dx, [iACARD.BusMastBA] ; DX = NABMBAR add dx, 0x4C in ax, dx or al, 1 out dx, ax jmp @nxtInitStep @nSis7012: cmp [iACARD.ClassDevType], CLASS_DEVICE_NFORCE jne @nxtInitStep ; enable SPDIF interrupt mov esi, [iACARD.HeadMapPCI] mov cx, [esi] mov bx, word [esi+iPCImapL.DevNum] mov cl, 0x4C call GetCfgSpaceDword or eax, 0x1000000 call SetCfgSpaceDword @nxtInitStep: ; disable interrupts & reset channels выполнить для 3х каналов: ICH_REG_PI_CR, ICH_REG_PO_CR, ICH_REG_MC_CR mov cx, 0x01FF ; выполнить для 3х BYTE портов: ICH_REG_PI_CR, ICH_REG_PO_CR, ICH_REG_MC_CR mov al, ICH_RESETREGS call ICH_SET_REG_CR call AС97_READ_SPECIFIC_DATA test ax, AC97_EA_VRA ; поддержка VRA имеется? (изменение частоты семплирования) je @ICHnotInitVRA mov dx, AC97_EA_VRA call AC97_OR_EXTENDED_STATUS @ICHnotInitVRA: clc RET ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICH_AC97_PAUSE_ON: mov ch, 1000001b ; использовать BYTE и сбросить биты mov al, ICH_STARTBM jmp ICH_SET_REG_CR ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICH_AC97_STOP: xor ax, ax jmp ICH_SET_REG_CR_byte ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICH_AC97_START: mov al, (ICH_STARTBM OR ICH_IOCE OR ICH_LVBIE) ICH_SET_REG_CR_byte: mov ch, 1 ICH_SET_REG_CR: mov dx, ICH_REG_PI_CR ICH_SET_REG_: add dx, [iACARD.BusMastBA] ; DX = NABMBAR + ... jmp @indexOUTports ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICH_AC97_CONFIGURATE: push edi mov al, ICH_RESETREGS ; reset codec call ICH_SET_REG_CR_byte pop eax mov ch, 4 ; использовать DWORD порт для ICH_REG_PO_BDBAR mov dx, [iACARD.BusMastBA] ; DX = ICH_REG_PI_BDBAR как база в данном случае call @indexOUTports mov ch, 1 ; использовать BYTE порт для PCM OUT mov al, ( ICH_REG_LVI_MASK + 1 ) mov dx, ICH_REG_PI_LVI call ICH_SET_REG_ mov al, (ICH_FIFOE OR ICH_BCIS OR ICH_LVBCI) ;сбросить все биты всех прерываний mov dx, ICH_REG_PI_SR jmp ICH_SET_REG_ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VaStaNi Поэкспериментировал я, и вот чё получилось: семафор правильно ожидать так, чтобы прочиталось 00h, это будет говорить о том, что кодек не занят никакими операциями. Тогда следущее чтение по-любому вернет 01h, так как, как написано в доке про бит 0, То есть, сначала мы получаем 0 как индикация готовности кодека, а потом 1 как результат предыдущего чтения этого регистра. Способ, который ты предложил, действует также, как и тот, который в самом начале использовал я - с переменным успехом. Способ ожидания нуля действует безотказно, но с одной оговоркой: после ресета семафор уже в состоянии 01h, и ожидание нуля ни к чему не приводит. А далее - как я описал. P.S. Странно, получается в доке интел ошибка? по умолчанию регистр CAS=1, а не 0. P.P.S. Так, все обнаруженные ошибки исправлены. Теперь изучаю HDA.
10110111 надеюсь, вот это имеешь http://download.intel.com/design/chipsets/manuals/30234903.pdf присел вот попытаться почитать еще раз... пока полная каша в голове получается. О какой такой совместимости с AC97 трезвонили ОНИ...? По-моему камня на камне не осталось, все иное и принципы и аббревиатура и команды и со стороны кодеков и южника... Ты че нить въехал с этими CORBами? Я понял так есть на запись, есть на чтение и типа стрим-данные третий...? Думаю исходники alsa придется параллельно смотреть придется, а то одни догадки.
VaStaNi Да, кроме того ещё оч полезна High Definition Audio Specification: ftp://download.intel.com/standards/hdaudio/pdf/HDAudio_03.pdf Если программить только ICH6||ICH7, то можно не использовать CORB/RIRB, а пользоваться регистрами IC, IR, IRS; хотя вообще-то механизм CORB+RIRB очень прост, но для его программирования надо много думать=) Тем более, если используешь не только ICHx: размеры CORB и RIRB, и т.д. . Совместимость, насколько я понял из ИХ доков и книги Гука - частичная, программного интерфейса она почти не касается(разве что формат BDL). у меня щас проблема немного другая: как точно определить, какой из Output Converter'ов является выходом на Front Speaker? Кодек у меня Realtek ALC880 "7.1 Channel High Definition Audio Codec", с ним все понятно по даташиту, а как быть с произвольным кодеком?! Вот и пытаюсь изучить все эти Connection Lists да Pin Complexes. Выкладываю экспериментальный исходник - ищет Output Converter (в случае успеха ничего на экран не выводит, в случае неудачи - сообщение об ошибке) P.S. Эта прога не переводит проц в нереальный режим, для этого использую давно сделанный мной резидент flatreal. (Позволяет даже в Turbo Debugger'е обращаться к любому адресу) P.P.S. Давай теперь по мылу, или создадим новую тему, так как тут это всё уже не по теме.
10110111, большое спасибо за High Definition Audio Specification - отсутствовал у меня. впервые слышу, что у Гука что то путное по звуку было... Правда книг у меня маловато, может и не видел, пропустил... Что есть что почитать у него? Неужели про HDA пишет? Обычно такое старье мусолят, что потом жалеешь, что купил... но позже для подобной "возни" в ДОСяре оч-ч-ч-ч-ень удобным считаю и рекомендую всем NDN: http://ndn.muxe.com + FASM под ДОС + отладчик(и)... Основные плюсы и достоинства: - проц УЖЕ в нереальном режиме - удобный и гибкий редактор, расцветка и пр.... - NDN проект развивается, открытый код... - имеет версию под винды - .... многое т.д. при ознакомлении и опробировании сам доходишь Можно и по мылу, но тогда, как правило никому не видны "набитые шишки", неправильные ходы, ошибки... да и вообщем результаты. Тему можно бы, я бы желал даже, но сомнение берет, что ЭТО кому то еще нужно, особенно реально творчески, а не простое созерцание потуг? Может народ ТУТ выскажется нужна ли УВАЖАЕМОЙ ПУБЛИКЕ тема типа: "Освоение HDA на FASMе"? Думаю тема будет "замирать" периодически на разные интервалы времени, вплоть до месяцев... Попробую послушать мнения ТУТ. Может командочка получится по работе над общим FASM исходником?
VaStaNi Спасибо за NDN, интересная штука... Думаю, стоит создать тему в разделе WASM.PROJECTS - там и найдутся интересующиеся.
Мне интересно... Только VaStaNi прав - пока могу только созерцать, т.к. времени нет нифига и в ближайшие 2 месяца не будет Диплом блин...