ICH AC'97 in DOS

Тема в разделе "WASM.ASSEMBLER", создана пользователем 10110111, 19 дек 2006.

  1. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    Люди, кто-нить программил AC'97 на ICH или ICHx?
    Вроде как всё делаю, как описано в доке, но частенько получаю или неправильное значение, или TimeOut при чтении регистров кодека.
    Помогите, кто может, plz!
    Прога в аттаче.(Должна воспроизводить WAV'ы через ICH AC'97)
     
  2. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Думаю на этом форуме тебе не помогут...
    Я сделал под свой проект оси, пока в виде хорошего драйверныго кода, внешне, как прожка под досом... Долго вылизывал, работает. Могу обменяться сорцами в обмен на работу по HDA или на совместную работу далее, т.к. нужен хорошее воплощение программного ресемплера (имеется проблема именно с ICH - это только 48кб/с!)
    Хош найти ассемблерные воплощения и реально-работающее + отечественное и свежей выпечки ;) - рекомендую проштудировать ЭТО:
    http://www.meos.sysbin.com/viewtopic.php?t=317&postdays=0&postorder=asc&start=0
     
  3. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    по HDA есть же даташит от интела
     
  4. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    2 VaStaNi
    Спасибо за ссылку.
    Когда отлажу свою прогу, займусь HDA
    Насчёт ресемплинга, IMHO, не так уж плоха линейная интерполяция - по крайней мере, высокая скорость и простая реализация.
    Кстати, вот хорошая ссылка:
    http://ccrma.stanford.edu/~jos/resample
     
  5. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    - печально.
    Мне более прельщает "тогда займусь поплотнее HDA, а потом давай реально обменяемся наработками с подробными комментариями и возможно, детализация вопрсов по мылу".
    Я твой код видел, пока еще много работы впереди и возможно ошибок. Долго рассказывать по твоему коду, что и как надо и лучше, потому, что...... Правда ты можешь воспользоваться хорошим куском от Serga, но адаптировать и разбираться в их оси придется, чтобы понять все до мелочей. Когда я стоял (год назад гдето) на этом уровне, как ты сейчас, мне еще несколько месяцев периодически правда, вылизывать пришлось, прежде чем все нормально с прерываниями пошло. Ладно, выбирать тебе свой путь. А освещать, публиковать, тестить где будешь и будешь ли вообще? (форум, сайт....?) Да, вот еще. Код тяжеловато читается, почемуто весь линеен, прерываний не заметил... ты дескрпторы буферные (номера) где приращаешь, перебираешь? Что то не нашел...
     
  6. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Дык и по ICHx AC'97 есть :)

    А насчёт интерполяции - меня линейная тоже устроила.
    Быстро, нет суперсложных вычислений, и плюс я реализацию замутил в целых числах - ИМХО быстрее флоатов должно быть.
    Если найду выложу.
    Качество плохое у ступенчатой интерполяции - скрипы всякие появляются...
    Ну хотя тут вопрос такой - слух у каждого свой.
    Я просто на VIA AC'97 тестировал.
    Там есть аппаратный ресэмплер.
    Ну и я 2 раза песню прогонял - с аппаратным и с программным ресэмплингом.
    При ступенчатой слышно что фигня на высоких частотах, а при линейной я разницы не заметил.
     
  7. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    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'ов?
     
  8. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    10110111, извини! Времени СОВСЕМ нет даже путяще, что то ответить, кажется все вокруг сошли с ума и пытаются сжать время или его остановить в умирающем 2006м... Даю реальный кусок работы имеющий прямое отношение к вопросу, это все, что могу бегом...
    Код (Text):
    1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    2. ;
    3. ; базовые данные из
    4. ; ALSA driver for Intel ICH (i8x0) chips.  Jaroslav Kysela <perex@suse.cz>
    5. ; исключительно для чипетов INTEL совместимых Device IDs
    6. I440MX_DID          =  0x7195
    7. ICH_DID             =  0x2415
    8. ICH0_DID            =  0x2425
    9. ICH2_DID            =  0x2445
    10. ICH3_DID            =  0x2485
    11. ICH4_DID            =  0x24C5
    12. ICH5_DID            =  0x24D5
    13. ICH6_DID            =  0x266E
    14. ICH7_DID            =  0x27DE
    15. ESB_DID             =  0x25A6
    16. ESB2_DID            =  0x2698
    17.  
    18. NFORCE_DID          =  0x01B1
    19. NFORCE2_DID         =  0x006A
    20. NFORCE3_DID         =  0x00DA
    21.  
    22. ; VaStaNi - добавлено, на основании реального чипсета nVidia
    23. NFORCEx_DID         =  0x026B     ; ASROCK K8NF4G
    24.  
    25. MCP04_DID           =  0x003A
    26. CK8_DID             =  0x008A
    27. CK804_DID           =  0x0059
    28. CK8S_DID            =  0x00EA
    29.  
    30. SIS7012_DID         =  0x7012
    31.  
    32. AMD768_DID          =  0x7445
    33. AMD8111_DID         =  0x764D
    34.  
    35.  
    36. PCI_DEVICE_ID_440MX     =  ( I440MX_DID SHL 16 ) + INTEL_VID
    37. PCI_DEVICE_ID_ICH       =  ( ICH_DID SHL 16 ) + INTEL_VID
    38. PCI_DEVICE_ID_ICH0      =  ( ICH0_DID SHL 16 ) + INTEL_VID
    39. PCI_DEVICE_ID_ICH2      =  ( ICH2_DID SHL 16 ) + INTEL_VID
    40. PCI_DEVICE_ID_ICH3      =  ( ICH3_DID SHL 16 ) + INTEL_VID
    41. PCI_DEVICE_ID_ICH4      =  ( ICH4_DID SHL 16 ) + INTEL_VID
    42. PCI_DEVICE_ID_ICH5      =  ( ICH5_DID SHL 16 ) + INTEL_VID
    43. PCI_DEVICE_ID_ICH6      =  ( ICH6_DID SHL 16 ) + INTEL_VID
    44. PCI_DEVICE_ID_ICH7      =  ( ICH7_DID SHL 16 ) + INTEL_VID
    45. PCI_DEVICE_ID_ESB       =  ( ESB_DID SHL 16 ) + INTEL_VID
    46. PCI_DEVICE_ID_ESB2      =  ( ESB2_DID SHL 16 ) + INTEL_VID
    47.  
    48. PCI_DEVICE_ID_NFORCE        =  ( NFORCE_DID SHL 16 ) + NVIDIA_VID
    49. PCI_DEVICE_ID_NFORCE2       =  ( NFORCE2_DID SHL 16 ) + NVIDIA_VID
    50. PCI_DEVICE_ID_NFORCE3       =  ( NFORCE3_DID SHL 16 ) + NVIDIA_VID
    51. PCI_DEVICE_ID_NFORCEx       =  ( NFORCEx_DID SHL 16 ) + NVIDIA_VID
    52.  
    53. PCI_DEVICE_ID_MCP04     =  ( MCP04_DID SHL 16 ) + NVIDIA_VID
    54. PCI_DEVICE_ID_CK8       =  ( CK8_DID SHL 16 ) + NVIDIA_VID
    55. PCI_DEVICE_ID_CK804     =  ( CK804_DID SHL 16 ) + NVIDIA_VID
    56. PCI_DEVICE_ID_CK8S      =  ( CK8S_DID SHL 16 ) + NVIDIA_VID
    57.  
    58. PCI_DEVICE_ID_SIS7012       =  ( SIS7012_DID SHL 16 ) + SIS_VID
    59.  
    60. PCI_DEVICE_ID_AMD768        =  ( AMD768_DID SHL 16 ) + AMD_VID
    61. PCI_DEVICE_ID_AMD8111       =  ( AMD8111_DID SHL 16 ) + AMD_VID
    62.  
    63.  
    64. ;=============================================
    65. ;  * capture block *
    66. ;=============================================
    67. ICH_REG_PI_BDBAR        =  0          ; dword - buffer descriptor list base address
    68.  
    69. ICH_REG_PI_CIV          =  4          ; byte - current index value
    70.  
    71. ICH_REG_PI_LVI          =  5          ; byte - last valid index
    72.   ICH_REG_LVI_MASK      =  0x1F
    73.  
    74. ICH_REG_PI_SR           =  6          ; byte - status register
    75.   ICH_FIFOE         =  0x10       ; FIFO error
    76.   ICH_BCIS          =  8          ; buffer completion interrupt status
    77.   ICH_LVBCI         =  4          ; last valid buffer completion interrupt
    78.   ICH_CELV          =  2          ; current equals last valid
    79.   ICH_DCH           =  1          ; DMA controller halted
    80.  
    81. ICH_REG_PI_PICB         =  8          ; word - position in current buffer
    82.  
    83. ICH_REG_PI_PIV          =  0x0A       ; byte - prefetched index value
    84.   ICH_REG_PIV_MASK      =  0x1F       ; mask
    85.  
    86. ICH_REG_PI_CR           =  0x0B       ; byte - control register
    87.   ICH_IOCE          =  0x10       ; interrupt on completion enable
    88.   ICH_FEIE          =  8          ; fifo error interrupt enable
    89.   ICH_LVBIE         =  4          ; last valid buffer interrupt enable
    90.   ICH_RESETREGS         =  2          ; reset busmaster registers
    91.   ICH_STARTBM           =  1          ; start busmaster operation
    92. ;=============================================
    93.  
    94. ;  * playback block *
    95. ICH_REG_PO_BDBAR        =  0x10       ; dword - buffer descriptor list base address
    96. ICH_REG_PO_CIV          =  0x14       ; byte - current index value
    97. ICH_REG_PO_LVI          =  0x15       ; byte - last valid command
    98. ICH_REG_PO_SR           =  0x16       ; byte - status register
    99. ICH_REG_PO_PICB         =  0x18       ; word - position in current buffer
    100. ICH_REG_PO_PIV          =  0x1A       ; byte - prefetched index value
    101. ICH_REG_PO_CR           =  0x1B       ; byte - control register
    102. ;=============================================
    103. ;  * mic capture block *
    104. ICH_REG_MC_BDBAR        =  0x20       ; dword - buffer descriptor list base address
    105. ICH_REG_MC_CIV          =  0x24       ; byte - current index value
    106. ICH_REG_MC_LVI          =  0x25       ; byte - last valid command
    107. ICH_REG_MC_SR           =  0x26       ; byte - status register
    108. ICH_REG_MC_PICB         =  0x28       ; word - position in current buffer
    109. ICH_REG_MC_PIV          =  0x2A       ; byte - prefetched index value
    110. ICH_REG_MC_CR           =  0x2B       ; byte - control register
    111. ;=============================================
    112. ;  * global block *
    113. ICH_REG_GLOB_CNT        =  0x2C       ; dword - global control
    114.   ICH_PCM_SPDIF_MASK        =  0xC0000000 ; s/pdif pcm slot mask (ICH4)
    115.   ICH_PCM_SPDIF_NONE        =  0x00000000 ; reserved - undefined
    116.   ICH_PCM_SPDIF_78      =  0x40000000 ; s/pdif pcm on slots 7&8
    117.   ICH_PCM_SPDIF_69      =  0x80000000 ; s/pdif pcm on slots 6&9
    118.   ICH_PCM_SPDIF_1011        =  0xC0000000 ; s/pdif pcm on slots 10&11
    119.   ICH_PCM_20BIT         =  0x00400000 ; 20-bit samples (ICH4)
    120.   ICH_PCM_246_MASK      =  0x00300000 ; 6 channels (not all chips)
    121.   ICH_PCM_6         =  0x00200000 ; 6 channels (not all chips)
    122.   ICH_PCM_4         =  0x00100000 ; 4 channels (not all chips)
    123.   ICH_PCM_2         =  0          ; 2 channels (stereo)
    124.   ICH_SIS_PCM_246_MASK      =  0x000000C0 ; 6 channels (SIS7012)
    125.   ICH_SIS_PCM_6         =  0x00000080 ; 6 channels (SIS7012)
    126.   ICH_SIS_PCM_4         =  0x00000040 ; 4 channels (SIS7012)
    127.   ICH_SIS_PCM_2         =  0x00000000 ; 2 channels (SIS7012)
    128.   ICH_TRIE          =  0x00000040 ; tertiary resume interrupt enable
    129.   ICH_SRIE          =  0x20       ; secondary resume interrupt enable
    130.   ICH_PRIE          =  0x10       ; primary resume interrupt enable
    131.   ICH_ACLINK            =  8          ; AClink shut off
    132.   ICH_AC97WARM          =  4          ; AC'97 warm reset
    133.   ICH_AC97COLD          =  2          ; AC'97 cold reset
    134.   ICH_GIE           =  1          ; GPI interrupt enable
    135. ;=============================================
    136. ICH_REG_GLOB_STA        =  0x30       ; dword - global status
    137.   ICH_TRI           =  0x20000000 ; ICH4: tertiary (AC_SDIN2) resume interrupt
    138.   ICH_TCR           =  0x10000000 ; ICH4: tertiary (AC_SDIN2) codec ready
    139.   ICH_BCS           =  0x08000000 ; ICH4: bit clock stopped
    140.   ICH_SPINT         =  0x04000000 ; ICH4: S/PDIF interrupt
    141.   ICH_P2INT         =  0x02000000 ; ICH4: PCM2-In interrupt
    142.   ICH_M2INT         =  0x01000000 ; ICH4: Mic2-In interrupt
    143.   ICH_SAMPLE_CAP        =  0x00C00000 ; ICH4: sample capability bits (RO)
    144.   ICH_SAMPLE_16_20      =  0x00400000 ; ICH4: 16- and 20-bit samples
    145.   ICH_MULTICHAN_CAP     =  0x00300000 ; ICH4: multi-channel capability bits (RO)
    146.   ICH_MD3           =  0x00020000 ; modem power down semaphore
    147.   ICH_AD3           =  0x00010000 ; audio power down semaphore
    148.   ICH_RCS           =  0x00008000 ; read completion status
    149.   ICH_BIT3          =  0x00004000 ; bit 3 slot 12
    150.   ICH_BIT2          =  0x00002000 ; bit 2 slot 12
    151.   ICH_BIT1          =  0x00001000 ; bit 1 slot 12
    152.   ICH_SRI           =  0x00000800 ; secondary resume interrupt
    153.   ICH_PRI           =  0x00000400 ; primary resume interrupt
    154.   ICH_SCR           =  0x00000200 ; secondary codec ready
    155.   ICH_PCR           =  0x00000100 ; primary codec ready
    156.   ICH_MCINT         =  0x00000080 ; MIC capture interrupt
    157.   ICH_POINT         =  0x00000040 ; playback interrupt
    158.   ICH_PIINT         =  0x00000020 ; capture interrupt
    159.   ICH_NVSPINT           =  0x00000010 ; nforce spdif interrupt
    160.   ICH_MOINT         =  0x00000004 ; modem playback interrupt
    161.   ICH_MIINT         =  0x00000002 ; modem capture interrupt
    162.   ICH_GSCI          =  0x00000001 ; GPI status change interrupt
    163. ;=============================================
    164. ICH_REG_ACC_SEMA        =  0x34       ; byte - codec write semaphore
    165.   ICH_CAS           =  1          ; codec access semaphore
    166. ;=============================================
    167. ICH_REG_SDM         =  0x80
    168.   ICH_DI2L_MASK         =  0x000000C0 ; PCM In 2, Mic In 2 data in line
    169.   ICH_DI2L_SHIFT        =  6
    170.   ICH_DI1L_MASK         =  0x00000030 ; PCM In 1, Mic In 1 data in line
    171.   ICH_DI1L_SHIFT        =  4
    172.   ICH_SE            =  0x00000008 ; steer enable
    173.   ICH_LDI_MASK          =  0x00000003 ; last codec read data input
    174. ;=============================================
    175. ;=============================================
    176. ;=============================================
    177.  
    178. ;->ВХОД:
    179. ;       EBP - определяет маску бит регистра GLOB_STA, которые определяют тип подключения
    180. ;             кодека (Primary, Secondary, Tertiary) от которого будет ожидаться готовность
    181. ;       BX  - содержит смещение требуемого регистра чтения/записи после "semaphore"
    182. ;<-ВЫХОД:
    183. ;       DX  - фактический адрес порта доступа для требуемого регистра по BX указателю
    184. ;       DX' - указывает на ICH_REG_GLOB_STA (bswap)
    185. ICH_AC97codec_semaphore:
    186.     mov ecx, 1000
    187.     mov dx, [iACARD.BusMastBA]
    188.     add dx, ICH_REG_GLOB_STA
    189. @ICHtstReady:               ; wait for semaphore ready (not busy) status
    190.     cli
    191.     in  eax, dx
    192.     and eax, [iACARD.MaskStat]
    193.      je @ICHnotReady
    194.     add dx, 4           ; DX = ICH_REG_ACC_SEMA
    195.     in  al, dx
    196.     sub dx, 4           ; DX = ICH_REG_GLOB_STA
    197.     and al, ICH_CAS     ; кодек занят ?
    198.      jne    @ICH_CodecAccess
    199. @ICHnotReady:
    200.     dec ecx
    201.     stc
    202.      je @ICHnotCodecAccess
    203.     call    @Delay10mcs
    204.     jmp    @ICHtstReady
    205.  
    206.  
    207. @ICH_CodecAccess:
    208.     bswap   edx         ; переведем DX = ICH_REG_GLOB_STA в "тень"
    209.     mov dx, [iACARD.MixBA]
    210.     in  ax, dx          ; clear semaphore flag
    211.     add dx, bx
    212. @ICHnotCodecAccess:
    213.        RET
    214. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    215.  
    216. ICH_AC97_WRITE:
    217.     push    ecx
    218.     push    eax
    219.     call    ICH_AC97codec_semaphore
    220.     pop eax
    221.      jc @notReadyWrite
    222.     out dx, ax
    223. @notReadyWrite:
    224.     sti
    225.     pop ecx
    226.        RET
    227. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    228.  
    229. ICH_AC97_READ:
    230.     push    ecx
    231.     call    ICH_AC97codec_semaphore
    232.      jc @ICHnotReadyRead
    233.     mov ecx, 1000
    234. @ICHchkGoodRead:
    235.     cli
    236.     in  ax, dx          ; чтение нужного регистра кодека
    237.     mov bx, ax          ; в BX сохраним прочитанное значение
    238.     bswap   edx         ; теперь будет DX = ICH_REG_GLOB_STA
    239.     in  eax, dx
    240.     test    eax, dword ICH_RCS
    241.      je @ICHgoodRead
    242. ; reset RCS and preserve other R/WC bits
    243. ;        bswap   edx
    244.     and eax, dword NOT (ICH_SRI OR ICH_PRI OR ICH_TRI OR ICH_GSCI)
    245. ;        out     dx, eax
    246.  
    247.     out dx, eax
    248.     bswap   edx
    249.     dec ecx
    250.     stc
    251.      je @ICHnotReadyRead
    252.     call    @Delay10mcs
    253.     jmp    @ICHchkGoodRead
    254.  
    255. @ICHgoodRead:
    256.     mov ax, bx          ; восстановим в AX прочитанное значение
    257. @ICHnotReadyRead:
    258.     sti
    259.     pop ecx
    260.        RET
    261. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    262.  
    263. ICH_AC97_INIT:
    264.     mov dx, [iACARD.BusMastBA]
    265.     add dx, ICH_REG_GLOB_STA
    266.     ; put logic to right state
    267.     ; first clear status bits
    268.     mov ebx, ICH_RCS OR ICH_MCINT OR ICH_POINT OR ICH_PIINT
    269.     in  eax, dx
    270.     cmp [iACARD.ClassDevType], CLASS_DEVICE_NFORCE
    271.      jne    @noNVIDIA
    272.     or  ebx, ICH_NVSPINT
    273. @noNVIDIA:
    274.     and eax, ebx
    275.     out dx, eax
    276.  
    277.     ; ACLink on, 2 channels
    278.     sub dx, (ICH_REG_GLOB_STA-ICH_REG_GLOB_CNT) ; DX = ICH_REG_GLOB_CNT
    279.     in  eax, dx         ; READ ICH_REG_GLOB_CNT
    280.     and eax, dword NOT (ICH_ACLINK  OR  ICH_PCM_246_MASK)
    281.     ; finish cold or do warm reset
    282.     mov ecx, ICH_AC97COLD
    283.     mov ebx, ICH_AC97WARM
    284.     test    eax, ecx
    285.     cmovne  ecx, ebx
    286.     or  eax, ecx
    287.     out dx, eax
    288.  
    289.     mov ecx, 1000
    290. @03:
    291.     call    @Delay10mcs
    292.     in  eax, dx         ; READ ICH_REG_GLOB_CNT
    293.     test    eax, ebx        ; AND ICH_AC97WARM
    294.      je @04
    295.     dec ecx
    296.      jne    @03
    297.     jmp    @errorAC97
    298.  
    299. @04:
    300.     cmp word [iACARD.DevID_VndID], SIS_VID
    301.      jne    @04nonSIS
    302.     and eax, dword NOT ICH_SIS_PCM_246_MASK
    303.     jmp @setNewVal_REG_GLOB_CNT
    304. @04nonSIS:
    305.     cmp word [iACARD.DevID_VndID], INTEL_VID
    306.      jne    @04nonICH
    307.     and eax, dword NOT ICH_PCM_20BIT
    308. @04nonICH:
    309.     and eax, dword NOT ICH_PCM_246_MASK
    310. @setNewVal_REG_GLOB_CNT:
    311.     out dx, eax         ; WRITE ICH_REG_GLOB_CNT
    312.  
    313. ; Теперь будем ожидать бита готовности от кодека любого типа подключения (Primary, Secondary, Tertiary)
    314.     add dx, (ICH_REG_GLOB_STA-ICH_REG_GLOB_CNT) ; = ICH_REG_GLOB_STA
    315.     mov ebx, ICH_PCR OR ICH_SCR
    316.     cmp [iACARD.ClassDevType], CLASS_DEVICE_INTEL_ICH4
    317.      jne    @nIch4
    318.     or  ebx, ICH_TCR
    319. @nIch4:
    320. ;        bswap   edx
    321. ;        mov     dx, [iACARD.MixBA]
    322. ;        bswap   edx
    323.     mov ecx, 1000
    324. @ICH_TstAnyCodecReady:
    325.     call    @Delay10mcs
    326. ;        bswap   edx
    327. ;        in      ax, dx                  ; clear semaphore flag
    328. ;        bswap   edx
    329.     in  eax, dx         ; READ ICH_REG_GLOB_STA
    330.     and eax, ebx
    331.      jne    @ICH_AnyCodecReady
    332.     dec ecx
    333.      jne    @ICH_TstAnyCodecReady
    334.     jmp    @errorAC97
    335.  
    336. @ICH_AnyCodecReady:
    337.     mov ebx, eax
    338.     and eax, ICH_PCR
    339.      jne    @ICH_fixMaskStat
    340.     mov eax, ebx
    341.     and eax, ICH_SCR
    342.      jne    @ICH_fixMaskStat
    343.     mov eax, ebx
    344.     and eax, ICH_TCR
    345. @ICH_fixMaskStat:
    346.     mov [iACARD.MaskStat], eax
    347.      je @errorAC97
    348.  
    349. ;---------------
    350. ; в версии 002 ЕЩЕ сделан обход
    351. ;        jmp     @nxtInitStep
    352.  
    353.     cmp [iACARD.ClassDevType], CLASS_DEVICE_SIS
    354.      jne    @nSis7012
    355. ; unmute the output on SIS7012
    356.     mov dx, [iACARD.BusMastBA]  ; DX = NABMBAR
    357.     add dx, 0x4C
    358.     in  ax, dx
    359.     or  al, 1
    360.     out dx, ax
    361.     jmp @nxtInitStep
    362.  
    363. @nSis7012:
    364.     cmp [iACARD.ClassDevType], CLASS_DEVICE_NFORCE
    365.      jne    @nxtInitStep
    366. ; enable SPDIF interrupt
    367.     mov esi, [iACARD.HeadMapPCI]
    368.     mov cx, [esi]
    369.     mov bx, word [esi+iPCImapL.DevNum]
    370.     mov cl, 0x4C
    371.     call    GetCfgSpaceDword
    372.     or  eax, 0x1000000
    373.     call    SetCfgSpaceDword
    374.  
    375. @nxtInitStep:
    376.  
    377. ; disable interrupts & reset channels выполнить для 3х каналов: ICH_REG_PI_CR, ICH_REG_PO_CR, ICH_REG_MC_CR
    378.     mov cx, 0x01FF      ; выполнить для 3х BYTE портов: ICH_REG_PI_CR, ICH_REG_PO_CR, ICH_REG_MC_CR
    379.     mov al, ICH_RESETREGS
    380.     call    ICH_SET_REG_CR
    381.     call    AС97_READ_SPECIFIC_DATA
    382.     test    ax, AC97_EA_VRA     ; поддержка VRA имеется? (изменение частоты семплирования)
    383.      je @ICHnotInitVRA
    384.     mov dx, AC97_EA_VRA
    385.     call    AC97_OR_EXTENDED_STATUS
    386. @ICHnotInitVRA:
    387.     clc
    388.        RET
    389. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    390.  
    391. ICH_AC97_PAUSE_ON:
    392.     mov ch, 1000001b        ; использовать BYTE и сбросить биты
    393.     mov al, ICH_STARTBM
    394.     jmp    ICH_SET_REG_CR
    395. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    396.  
    397. ICH_AC97_STOP:
    398.     xor ax, ax
    399.     jmp ICH_SET_REG_CR_byte
    400. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    401.  
    402. ICH_AC97_START:
    403.     mov al, (ICH_STARTBM OR ICH_IOCE OR ICH_LVBIE)
    404. ICH_SET_REG_CR_byte:
    405.     mov ch, 1
    406. ICH_SET_REG_CR:
    407.     mov dx, ICH_REG_PI_CR
    408. ICH_SET_REG_:
    409.     add dx, [iACARD.BusMastBA]  ; DX = NABMBAR + ...
    410.     jmp @indexOUTports
    411. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    412.  
    413. ICH_AC97_CONFIGURATE:
    414.     push    edi
    415.     mov al, ICH_RESETREGS   ; reset codec
    416.     call    ICH_SET_REG_CR_byte
    417.     pop eax
    418.     mov ch, 4           ; использовать DWORD порт для ICH_REG_PO_BDBAR
    419.     mov dx, [iACARD.BusMastBA]  ; DX = ICH_REG_PI_BDBAR как база в данном случае
    420.     call    @indexOUTports
    421.     mov ch, 1           ; использовать BYTE порт для PCM OUT
    422.     mov al, ( ICH_REG_LVI_MASK + 1 )
    423.     mov dx, ICH_REG_PI_LVI
    424.     call    ICH_SET_REG_
    425.     mov al, (ICH_FIFOE  OR  ICH_BCIS  OR  ICH_LVBCI) ;сбросить все биты всех прерываний
    426.     mov dx, ICH_REG_PI_SR
    427.     jmp ICH_SET_REG_
    428. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     
  9. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    VaStaNi
    Спасибо огромное, наконец-то я нашел то, что искал месяца два!
     
  10. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    Всё, разобрался с ICH5, естесно, оказалось - ошибка в коде. Теперь и он звучит.
     
  11. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    VaStaNi
    Поэкспериментировал я, и вот чё получилось: семафор правильно ожидать так, чтобы прочиталось 00h, это будет говорить о том, что кодек не занят никакими операциями. Тогда следущее чтение по-любому вернет 01h, так как, как написано в доке про бит 0,
    То есть, сначала мы получаем 0 как индикация готовности кодека, а потом 1 как результат предыдущего чтения этого регистра. Способ, который ты предложил, действует также, как и тот, который в самом начале использовал я - с переменным успехом. Способ ожидания нуля действует безотказно, но с одной оговоркой: после ресета семафор уже в состоянии 01h, и ожидание нуля ни к чему не приводит. А далее - как я описал.

    P.S. Странно, получается в доке интел ошибка? по умолчанию регистр CAS=1, а не 0.
    P.P.S. Так, все обнаруженные ошибки исправлены. Теперь изучаю HDA.
     
  12. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    10110111
    надеюсь, вот это имеешь http://download.intel.com/design/chipsets/manuals/30234903.pdf
    присел вот попытаться почитать еще раз... пока полная каша в голове получается. О какой такой совместимости с AC97 трезвонили ОНИ...?
    По-моему камня на камне не осталось, все иное и принципы и аббревиатура и команды и со стороны кодеков и южника... Ты че нить въехал с этими CORBами? Я понял так есть на запись, есть на чтение и типа стрим-данные третий...? Думаю исходники alsa придется параллельно смотреть придется, а то одни догадки.
     
  13. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    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. Давай теперь по мылу, или создадим новую тему, так как тут это всё уже не по теме.
     
  14. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    10110111, большое спасибо за High Definition Audio Specification - отсутствовал у меня.
    впервые слышу, что у Гука что то путное по звуку было... Правда книг у меня маловато, может и не видел, пропустил... Что есть что почитать у него? Неужели про HDA пишет? Обычно такое старье мусолят, что потом жалеешь, что купил... но позже ;)
    для подобной "возни" в ДОСяре оч-ч-ч-ч-ень удобным считаю и рекомендую всем NDN: http://ndn.muxe.com + FASM под ДОС + отладчик(и)...
    Основные плюсы и достоинства:
    - проц УЖЕ в нереальном режиме
    - удобный и гибкий редактор, расцветка и пр....
    - NDN проект развивается, открытый код...
    - имеет версию под винды
    - .... многое т.д. при ознакомлении и опробировании сам доходишь :)
    Можно и по мылу, но тогда, как правило никому не видны "набитые шишки", неправильные ходы, ошибки... да и вообщем результаты.
    Тему можно бы, я бы желал даже, но сомнение берет, что ЭТО кому то еще нужно, особенно реально творчески, а не простое созерцание потуг? Может народ ТУТ выскажется нужна ли УВАЖАЕМОЙ ПУБЛИКЕ тема типа: "Освоение HDA на FASMе"?
    Думаю тема будет "замирать" периодически на разные интервалы времени, вплоть до месяцев...
    Попробую послушать мнения ТУТ. Может командочка получится по работе над общим FASM исходником? :)
     
  15. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    VaStaNi
    Спасибо за NDN, интересная штука...

    Думаю, стоит создать тему в разделе WASM.PROJECTS - там и найдутся интересующиеся.
     
  16. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Мне интересно... :)
    Только VaStaNi прав - пока могу только созерцать, т.к. времени нет нифига и в ближайшие 2 месяца не будет :dntknw:
    Диплом блин...