Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. NAMBAR_read_byte:
  3.         add     dx, [NAMBAR]
  4.         in      al, dx
  5. ret
  6.  
  7.  
  8. NAMBAR_read_word:
  9.         add     dx, [NAMBAR]
  10.         in      ax, dx
  11. ret
  12.  
  13.  
  14. NAMBAR_read_dword:
  15.         add     dx, [NAMBAR]
  16.         in      eax, dx
  17. ret
  18.  
  19. NAMBAR_write_byte:
  20.         add     dx, [NAMBAR]
  21.         out     dx, al
  22. ret
  23.  
  24. NAMBAR_write_word:
  25.         add     dx, [NAMBAR]
  26.         out     dx, ax
  27. ret
  28.  
  29. NAMBAR_write_dword:
  30.         add     dx, [NAMBAR]
  31.         out     dx, eax
  32. ret
  33.  
  34.  
  35.  
  36. NABMBAR_read_byte:
  37.         add     dx, [NABMBAR]
  38.         in      al, dx
  39. ret
  40.  
  41. NABMBAR_read_word:
  42.         add     dx, [NABMBAR]
  43.         in      ax, dx
  44. ret
  45.  
  46. NABMBAR_read_dword:
  47.         add     dx, [NABMBAR]
  48.         in      eax, dx
  49. ret
  50.  
  51. NABMBAR_write_byte:
  52.         add     dx, [NABMBAR]
  53.         out     dx, al
  54. ret
  55.  
  56. NABMBAR_write_word:
  57.         add     dx, [NABMBAR]
  58.         out     dx, ax
  59. ret
  60.  
  61. NABMBAR_write_dword:
  62.         add     dx, [NABMBAR]
  63.         out     dx, eax
  64. ret
  65.  
  66.  
  67.  
  68. semaphore:
  69.         push    ecx edx
  70.  
  71.         mov     edx, GLOB_STS_REG               ; 0x30 global status register
  72.         call    NABMBAR_read_dword
  73.         and     eax, PRI_CODEC_RDY              ; 100h primary codec ready
  74.         jz      .success                        ; exit if codec not ready !!!
  75.  
  76. ;       mov     ecx, 1024                       ; try 1024 times
  77.         mov     ecx, 0ffffh                     ; try 65535 times
  78.   .wait:
  79.         mov     edx, ACC_SEMA_REG               ; 0x34 codec write semaphore
  80.         call    NABMBAR_read_byte
  81.         and     al, CODEC_BUSY                  ; 01h codec access semaphore
  82.         jz      .success                        ; exit if codec not busy !!!
  83.  
  84.         dec     ecx
  85.         jnz     .wait
  86.  
  87.         pop     edx ecx
  88.         mov     eax, 0
  89.         jmp     .exit
  90.  
  91.   .success:
  92.         pop     edx ecx
  93.         mov     eax, 1
  94.   .exit:
  95. ret
  96.  
  97.  
  98.  
  99.  
  100.  
  101. codecStop:
  102.         push    eax ebx edx
  103.  
  104.         mov     edx, PO_CR_REG          ; 0x1B control register
  105.         mov     al, 0                   ; stop all PCM out data
  106.         call    NABMBAR_write_byte
  107.  
  108.         mcall   MF_DELAY, eax           ; ebx = (eax = MF_DELAY = 5); wait 50 ms
  109.  
  110.         mov     edx, PO_CR_REG          ; 0x1B control register
  111.         mov     al, RR                  ; reset PCM out regs
  112.         call    NABMBAR_write_byte
  113.  
  114.         mcall   MF_DELAY, eax
  115.  
  116.         pop     edx ebx eax
  117. ret
  118.  
  119.  
  120.  
  121.  
  122. ; set voulme
  123. ; in ax = volume level
  124. setVolume:
  125.         push     eax edx
  126.  
  127.         push     eax
  128.         call     semaphore
  129.         mov      edx, CODEC_RESET_REG           ; 0
  130.         xor      eax, eax                       ; register reset the codec
  131.         call     NAMBAR_write_word
  132.  
  133.         call     semaphore
  134.         pop      eax
  135.         imul     ax, 0101h                      ; set volume for both chn
  136.         mov      edx, CODEC_MASTER_VOL_REG      ; 2
  137.         call     NAMBAR_write_word
  138.         push     eax
  139.  
  140.         call     semaphore
  141.         pop      eax                            ; set volume for both chn
  142.         mov      edx, CODEC_HP_VOL_REG          ; 4
  143.         call     NAMBAR_write_word
  144.         push     eax
  145.  
  146.         call     semaphore
  147.         mov      edx, CODEC_CD_VOL_REG          ; 12h
  148.         pop      eax                            ; set volume for both chn
  149.         shr      eax, 2                         ; adjust CD VOL
  150.         call     NAMBAR_write_word
  151.  
  152.         call     semaphore
  153.         mov      edx, CODEC_PCM_OUT_REG         ; 18h
  154.         mov      ax, 0808h                      ; standard PCM out volume
  155.         call     NAMBAR_write_word
  156.  
  157.         pop      edx eax
  158. ret
  159.  
  160.  
  161.  
  162.  
  163. samplerate dw 0
  164.  
  165.  
  166.  
  167. ; enable codec, unmute stuff, set output to desired rate
  168. ; in : ax = desired sample rate
  169. ; out: ax = true or false
  170. ;
  171. codecConfig:
  172.         pushad
  173.         mov [samplerate], ax                    ; save sample rate
  174.  
  175.  
  176. ;        mov     edx, GLOB_STS_REG               ; 30h global status register
  177. ;        call    NABMBAR_read_dword
  178. ;        and     eax, PRI_CODEC_RDY              ; 0100h primary codec ready
  179. ;        jnz     skip_init                       ; skip init if codec ready !!!
  180.  
  181.         ; stop the codec if currently playing
  182. ;;;        call    codecStop
  183.  
  184. ;        mov     edx, GLOB_STS_REG
  185. ;        call    NABMBAR_read_dword
  186. ;        dps     "GLOB_STA = "
  187. ;        dph     eax
  188. ;        newline
  189.  
  190. ;        mov     edx, GLOB_CNT_REG
  191. ;        call    NABMBAR_read_dword
  192. ;        dps     "GLOB_CNT = "
  193. ;        dph     eax
  194. ;        newline
  195.  
  196. ;        mcall 5, 10
  197.  
  198. ;;        test    eax, ACCOLD_RESET
  199. ;;        jnz     .skip_cold_reset
  200.  
  201. ;        print   "cold reset"
  202.         ; do a cold reset
  203.         mov     edx, GLOB_CNT_REG               ; 2ch global control register
  204.         xor     eax, eax
  205.         call    NABMBAR_write_dword             ; enable (AC Link off clear)
  206.  
  207. ;        print   "wait"
  208.         mcall   5, 5
  209. ;        print   "alive!"
  210.  
  211. ;;    .skip_cold_reset:
  212.  
  213.         mov     edx, GLOB_CNT_REG               ; 2ch global control register
  214.         mov     eax, ACCOLD_RESET + PRI_RES_EN  ; cold reset + primary resume
  215.         call    NABMBAR_write_dword             ; 2 channels & 16 bit samples
  216.  
  217.         mov     edx, GLOB_CNT_REG               ; 2ch global control register
  218.         call    NABMBAR_read_dword
  219.         and     eax, ACCOLD_RESET               ; cold reset
  220.         jz      init_error                      ; INIT FAILED !!!
  221.  
  222. ;        print   "cold reset finished"
  223.  
  224.         ; wait for primary codec ready status
  225.         mov     ecx, 128
  226. codec_ready_loop:
  227.         mov     edx, GLOB_STS_REG               ; 30h global status register
  228.         call    NABMBAR_read_dword
  229.         and     eax, PRI_CODEC_RDY              ; 0100h primary codec ready
  230.         jnz     codec_ready_exit                ; move on if codec ready !!!
  231.         mcall   5, 1
  232.         dec     ecx
  233.         jnz     codec_ready_loop
  234.         ;dps "~"
  235. codec_ready_exit:
  236.  
  237.         ; wait until codec init ready (*** replaces warm reset wait ***)
  238.         mcall  5, 60
  239.  
  240.         ; test if codec ready bit is finally set
  241.         mov     edx, GLOB_STS_REG               ; 30h global status register
  242.         call    NABMBAR_read_dword
  243.         and     eax, PRI_CODEC_RDY              ; 0100h primary codec ready
  244.         jnz     codec_ready_bit_set             ; move on if codec ready !!!
  245.         cmp     [AC97ICH4], 1
  246.         jne     init_error
  247. ;       je      codec_ready_bit_set             ; ignore codec ready for ICH4
  248. ;       jmp     init_error                      ; codec ready bit not set !!!
  249. codec_ready_bit_set:
  250.  
  251.         ; clear semaphore flag
  252.         mov     edx, CODEC_RESET_REG            ; 0h codec reset register
  253.         call    NAMBAR_read_word
  254.  
  255.  
  256.         ; check if codec sections ready
  257.         call    semaphore
  258.         test    eax, eax
  259.         jz      init_error
  260.         mov     edx, CODEC_POWER_CTRL_REG       ; 26h codec powerdown ctrl
  261.         call    NAMBAR_read_word
  262.         and     eax, 01111b
  263.         cmp     eax, 01111b
  264.         jne     init_error                      ; codec sections not ready
  265.  
  266.  
  267.  
  268.         ; disable interrupts
  269.         mov     al, 0
  270.  
  271.         mov     edx, PI_CR_REG                  ; 0Bh PCM in control register
  272.         call    NABMBAR_write_byte
  273.  
  274.         mov     edx, PO_CR_REG                  ; 1Bh PCM out control register
  275.         call    NABMBAR_write_byte
  276.  
  277.         mov     edx, MC_CR_REG                  ; 2Bh MIC in control register
  278.         call    NABMBAR_write_byte
  279.  
  280.         ; reset channels
  281.         mov     al, RR                          ; 02h reset Bus master regs
  282.  
  283.         mov     edx, PI_CR_REG                  ; 0Bh PCM in control register
  284.         call    NABMBAR_write_byte
  285.  
  286.         mov     edx, PO_CR_REG                  ; 1Bh PCM out control register
  287.         call    NABMBAR_write_byte
  288.  
  289.         mov     edx, MC_CR_REG                  ; 2Bh MIC in control register
  290.         call    NABMBAR_write_byte
  291.  
  292.         ; set default volume
  293.         mov     eax, 15                         ; set average volume level
  294.         call    setVolume
  295.  
  296.         ; set VRA and clear DRA (if not supported will be skipped)
  297.         call    semaphore
  298.         test    eax, eax
  299.         jz      init_error
  300.         mov     edx, CODEC_EXT_AUDIO_CTRL_REG   ; register 2ah
  301.         call    NAMBAR_read_word                ; get ext audio ctl
  302.  
  303.         mov     ebx, eax
  304.         call    semaphore
  305.         test    eax, eax
  306.         jz      init_error
  307.         mov     eax, ebx
  308.         and     eax, 0FFFFh - BIT1              ; clear DRA (BIT1)
  309.         or      eax, BIT0                       ; set VRA (BIT0)
  310.         mov     edx, CODEC_EXT_AUDIO_CTRL_REG   ; register 2ah
  311.         call    NAMBAR_write_word               ; write ext audio ctl
  312.  
  313.         ; set desired sample rate
  314. skip_init:
  315.         call    semaphore
  316.         test    eax, eax
  317.         jz      init_error
  318.  
  319.        ; mov     edx, CODEC_PCM_FRONT_DACRATE_REG
  320.        ; call    NAMBAR_read_word
  321.        ; and     eax, 0xFFFF
  322.        ; newline
  323.        ; dps     "old PCM OUT RATE: "
  324.        ; dpd     eax
  325.        ; newline
  326.  
  327.         mov     ax, [samplerate]                 ; restore sample rate
  328. ;        mov     edx, CODEC_PCM_FRONT_DACRATE_REG ; register 2ch
  329. ;        call    NAMBAR_write_word
  330.         call    set_sample_rate
  331.  
  332.         popad
  333.         mov    eax, 1                           ; exit with success
  334.         jmp    exit_config
  335. init_error:
  336.         popad
  337.         xor    eax, eax                           ; exit with error
  338. exit_config:
  339.         ret
  340.  
  341. set_sample_rate: ; rate in ax
  342.         mov    edx, CODEC_PCM_FRONT_DACRATE_REG ; 0x2C reg
  343.         call   NAMBAR_write_word
  344. ret
  345.