Subversion Repositories Kolibri OS

Rev

Rev 1623 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. format MS COFF
  9.  
  10. DEBUG           equ 1
  11.  
  12. include 'proc32.inc'
  13. include 'imports.inc'
  14.  
  15. API_VERSION     equ 0x01000100
  16.  
  17. USE_COM_IRQ     equ 0    ;make irq 3 and irq 4 available for PCI devices
  18. IRQ_REMAP       equ 0
  19. IRQ_LINE        equ 0
  20.  
  21.  
  22. ;irq 0,1,2,8,12,13 недоступны
  23. ;                   FEDCBA9876543210
  24. VALID_IRQ       equ 1100111011111000b
  25. ATTCH_IRQ       equ 0000111010100000b
  26.  
  27. if USE_COM_IRQ
  28. ATTCH_IRQ       equ 0000111010111000b
  29. end if
  30.  
  31. CPU_FREQ        equ  2600d
  32.  
  33. BIT0 EQU 0x00000001
  34. BIT1 EQU 0x00000002
  35. BIT5 EQU 0x00000020
  36. BIT10 EQU 0x00000400
  37.  
  38. VID_VIA           equ 0x1106
  39.  
  40. CTRL_VT82C686     equ 0x3058
  41. CTRL_VT8233_5     equ 0x3059
  42.  
  43.  
  44. CODEC_MASTER_VOL_REG        equ 0x02
  45. CODEC_AUX_VOL               equ 0x04 ;
  46. CODEC_PCM_OUT_REG           equ 0x18 ; PCM output volume
  47. CODEC_EXT_AUDIO_REG         equ 0x28 ; extended audio
  48. CODEC_EXT_AUDIO_CTRL_REG     equ 0x2a ; extended audio control
  49. CODEC_PCM_FRONT_DACRATE_REG equ 0x2c ; PCM out sample rate
  50. CODEC_PCM_SURND_DACRATE_REG equ 0x2e ; surround sound sample rate
  51. CODEC_PCM_LFE_DACRATE_REG   equ 0x30 ; LFE sample rate
  52.  
  53.  
  54. ;VIA host controller registers set
  55. ;; common offsets
  56. VIA_REG_OFFSET_STATUS       equ   0x00    ;; byte - channel status
  57.   VIA_REG_STAT_ACTIVE             equ   0x80    ;; RO
  58.   VIA_REG_STAT_PAUSED             equ   0x40    ;; RO
  59.   VIA_REG_STAT_TRIGGER_QUEUED     equ   0x08    ;; RO
  60.   VIA_REG_STAT_STOPPED            equ   0x04    ;; RWC
  61.   VIA_REG_STAT_EOL                equ   0x02    ;; RWC
  62.   VIA_REG_STAT_FLAG               equ   0x01    ;; RWC
  63. VIA_REG_OFFSET_CONTROL      equ   0x01    ;; byte - channel control
  64.   VIA_REG_CTRL_START              equ   0x80    ;; WO
  65.   VIA_REG_CTRL_TERMINATE          equ   0x40    ;; WO
  66.   VIA_REG_CTRL_AUTOSTART          equ   0x20
  67.   VIA_REG_CTRL_PAUSE              equ   0x08    ;; RW
  68.   VIA_REG_CTRL_INT_STOP           equ   0x04
  69.   VIA_REG_CTRL_INT_EOL            equ   0x02
  70.   VIA_REG_CTRL_INT_FLAG           equ   0x01
  71.   VIA_REG_CTRL_RESET              equ   0x01    ;; RW - probably reset? undocumented
  72.   VIA_REG_CTRL_INT                equ  (VIA_REG_CTRL_INT_FLAG or \
  73.                                          VIA_REG_CTRL_INT_EOL or \
  74.                                          VIA_REG_CTRL_AUTOSTART)
  75. VIA_REG_OFFSET_TYPE         equ   0x02    ;; byte - channel type (686 only)
  76.   VIA_REG_TYPE_AUTOSTART          equ   0x80    ;; RW - autostart at EOL
  77.   VIA_REG_TYPE_16BIT              equ   0x20    ;; RW
  78.   VIA_REG_TYPE_STEREO             equ   0x10    ;; RW
  79.   VIA_REG_TYPE_INT_LLINE          equ   0x00
  80.   VIA_REG_TYPE_INT_LSAMPLE        equ   0x04
  81.   VIA_REG_TYPE_INT_LESSONE        equ   0x08
  82.   VIA_REG_TYPE_INT_MASK           equ   0x0c
  83.   VIA_REG_TYPE_INT_EOL            equ   0x02
  84.   VIA_REG_TYPE_INT_FLAG           equ   0x01
  85. VIA_REG_OFFSET_TABLE_PTR     equ   0x04    ;; dword - channel table pointer
  86. VIA_REG_OFFSET_CURR_PTR     equ   0x04    ;; dword - channel current pointer
  87. VIA_REG_OFFSET_STOP_IDX     equ   0x08    ;; dword - stop index, channel type, sample rate
  88.   VIA8233_REG_TYPE_16BIT          equ   0x00200000      ;; RW
  89.   VIA8233_REG_TYPE_STEREO         equ   0x00100000      ;; RW
  90. VIA_REG_OFFSET_CURR_COUNT   equ   0x0c    ;; dword - channel current count (24 bit)
  91. VIA_REG_OFFSET_CURR_INDEX   equ   0x0f    ;; byte - channel current index (for via8233 only)
  92.  
  93.  
  94. VIADEV_PLAYBACK         equ   0x00
  95. VIADEV_CAPTURE          equ   0x10
  96. VIADEV_FM               equ   0x20
  97.  
  98. ;; AC'97 ;;
  99. VIA_REG_AC97            equ   0x80    ; dword
  100.   VIA_REG_AC97_CODEC_ID_MASK      equ  0xC0000000 ;(3<<30)
  101.   VIA_REG_AC97_CODEC_ID_SHIFT     equ  30
  102.   VIA_REG_AC97_CODEC_ID_PRIMARY   equ  0x00
  103.   VIA_REG_AC97_CODEC_ID_SECONDARY equ  0x01
  104.   VIA_REG_AC97_SECONDARY_VALID    equ  0x08000000 ;(1<<27)
  105.   VIA_REG_AC97_PRIMARY_VALID      equ  0x02000000 ;(1<<25)
  106.   VIA_REG_AC97_BUSY               equ  0x01000000 ;(1<<24)
  107.   VIA_REG_AC97_READ               equ  0x00800000 ;(1<<23)
  108.   VIA_REG_AC97_CMD_SHIFT          equ  16
  109.   VIA_REG_AC97_CMD_MASK           equ  0x7E
  110.   VIA_REG_AC97_DATA_SHIFT         equ  0
  111.   VIA_REG_AC97_DATA_MASK          equ  0xFFFF
  112.  
  113. VIA_REG_SGD_SHADOW      equ   0x84    ; dword
  114.  
  115. ;; via8233-specific registers ;;
  116. VIA_REG_OFS_PLAYBACK_VOLUME_L   equ  0x02    ;; byte
  117. VIA_REG_OFS_PLAYBACK_VOLUME_R   equ  0x03    ;; byte
  118. VIA_REG_OFS_MULTPLAY_FORMAT     equ  0x02    ;; byte - format and channels
  119.   VIA_REG_MULTPLAY_FMT_8BIT         equ  0x00
  120.   VIA_REG_MULTPLAY_FMT_16BIT        equ  0x80
  121.   VIA_REG_MULTPLAY_FMT_CH_MASK      equ  0x70    ;; # channels << 4 (valid = 1,2,4,6)
  122. VIA_REG_OFS_CAPTURE_FIFO        equ  0x02    ;; byte - bit 6 = fifo  enable
  123.   VIA_REG_CAPTURE_FIFO_ENABLE       equ  0x40
  124.  
  125. VIA_DXS_MAX_VOLUME              equ  31      ;; max. volume (attenuation) of reg 0x32/33
  126.  
  127. VIA_TBL_BIT_FLAG          equ   0x40000000
  128. VIA_TBL_BIT_EOL           equ   0x80000000
  129.  
  130. ;; pci space ;;
  131. VIA_ACLINK_STAT           equ   0x40
  132.   ;...
  133.   VIA_ACLINK_C00_READY            equ   0x01 ; primary codec ready
  134. VIA_ACLINK_CTRL           equ   0x41
  135.   VIA_ACLINK_CTRL_ENABLE          equ   0x80 ; 0: disable, 1: enable
  136.   VIA_ACLINK_CTRL_RESET           equ   0x40 ; 0: assert, 1: de-assert
  137.   VIA_ACLINK_CTRL_SYNC            equ   0x20 ; 0: release SYNC, 1: force SYNC hi
  138.   VIA_ACLINK_CTRL_SDO             equ   0x10 ; 0: release SDO, 1: force SDO hi
  139.   VIA_ACLINK_CTRL_VRA             equ   0x08 ; 0: disable VRA, 1: enable VRA
  140.   VIA_ACLINK_CTRL_PCM             equ   0x04 ; 0: disable PCM, 1: enable PCM
  141.   VIA_ACLINK_CTRL_FM              equ   0x02 ; via686 only
  142.   VIA_ACLINK_CTRL_SB              equ   0x01 ; via686 only
  143.   VIA_ACLINK_CTRL_INIT            equ  (VIA_ACLINK_CTRL_ENABLE or \
  144.                                          VIA_ACLINK_CTRL_RESET or \
  145.                                          VIA_ACLINK_CTRL_PCM or \
  146.                                          VIA_ACLINK_CTRL_VRA)
  147. VIA_FUNC_ENABLE           equ   0x42
  148.   VIA_FUNC_MIDI_PNP               equ   0x80 ; FIXME: it's 0x40 in the datasheet!
  149.   VIA_FUNC_MIDI_IRQMASK           equ   0x40 ; FIXME: not documented!
  150.   VIA_FUNC_RX2C_WRITE             equ   0x20
  151.   VIA_FUNC_SB_FIFO_EMPTY          equ   0x10
  152.   VIA_FUNC_ENABLE_GAME            equ   0x08
  153.   VIA_FUNC_ENABLE_FM              equ   0x04
  154.   VIA_FUNC_ENABLE_MIDI            equ   0x02
  155.   VIA_FUNC_ENABLE_SB              equ   0x01
  156. VIA_PNP_CONTROL           equ   0x43
  157. VIA_FM_NMI_CTRL           equ   0x48
  158. VIA8233_VOLCHG_CTRL       equ   0x48
  159. VIA8233_SPDIF_CTRL        equ   0x49
  160.   VIA8233_SPDIF_DX3               equ   0x08
  161.   VIA8233_SPDIF_SLOT_MASK         equ   0x03
  162.   VIA8233_SPDIF_SLOT_1011         equ   0x00
  163.   VIA8233_SPDIF_SLOT_34           equ   0x01
  164.   VIA8233_SPDIF_SLOT_78           equ   0x02
  165.   VIA8233_SPDIF_SLOT_69           equ   0x03
  166. ;] Asper
  167.  
  168.  
  169. SRV_GETVERSION        equ  0
  170. DEV_PLAY              equ  1
  171. DEV_STOP              equ  2
  172. DEV_CALLBACK          equ  3
  173. DEV_SET_BUFF          equ  4
  174. DEV_NOTIFY            equ  5
  175. DEV_SET_MASTERVOL     equ  6
  176. DEV_GET_MASTERVOL     equ  7
  177. DEV_GET_INFO          equ  8
  178.  
  179. struc AC_CNTRL              ;AC controller base class
  180. { .bus                dd ?
  181.   .devfn              dd ?
  182.  
  183.   .vendor             dd ?
  184.   .dev_id             dd ?
  185.   .pci_cmd            dd ?
  186.   .pci_stat           dd ?
  187.  
  188.   .codec_io_base      dd ?
  189.   .codec_mem_base     dd ?
  190.  
  191.   .ctrl_io_base       dd ?
  192.   .ctrl_mem_base      dd ?
  193.   .cfg_reg            dd ?
  194.   .int_line           dd ?
  195.  
  196.   .vendor_ids         dd ?    ;vendor id string
  197.   .ctrl_ids           dd ?    ;hub id string
  198.  
  199.   .buffer             dd ?
  200.  
  201.   .notify_pos         dd ?
  202.   .notify_task        dd ?
  203.  
  204.   .lvi_reg            dd ?
  205.   .ctrl_setup         dd ?
  206.   .user_callback      dd ?
  207.   .codec_read16       dd ?
  208.   .codec_write16      dd ?
  209.  
  210.   .ctrl_read8         dd ?
  211.   .ctrl_read16        dd ?
  212.   .ctrl_read32        dd ?
  213.  
  214.   .ctrl_write8        dd ?
  215.   .ctrl_write16       dd ?
  216.   .ctrl_write32       dd ?
  217. }
  218.  
  219. struc CODEC                ;Audio Chip base class
  220. {
  221.   .chip_id            dd ?
  222.   .flags              dd ?
  223.   .status             dd ?
  224.  
  225.   .ac_vendor_ids      dd ?    ;ac vendor id string
  226.   .chip_ids           dd ?    ;chip model string
  227.  
  228.   .shadow_flag        dd ?
  229.                       dd ?
  230.  
  231.   .regs               dw ?     ; codec registers
  232.   .reg_master_vol     dw ?     ;0x02
  233.   .reg_aux_out_vol    dw ?     ;0x04
  234.   .reg_mone_vol       dw ?     ;0x06
  235.   .reg_master_tone    dw ?     ;0x08
  236.   .reg_beep_vol       dw ?     ;0x0A
  237.   .reg_phone_vol      dw ?     ;0x0C
  238.   .reg_mic_vol        dw ?     ;0x0E
  239.   .reg_line_in_vol    dw ?     ;0x10
  240.   .reg_cd_vol         dw ?     ;0x12
  241.   .reg_video_vol      dw ?     ;0x14
  242.   .reg_aux_in_vol     dw ?     ;0x16
  243.   .reg_pcm_out_vol    dw ?     ;0x18
  244.   .reg_rec_select     dw ?     ;0x1A
  245.   .reg_rec_gain       dw ?     ;0x1C
  246.   .reg_rec_gain_mic   dw ?     ;0x1E
  247.   .reg_gen            dw ?     ;0x20
  248.   .reg_3d_ctrl        dw ?     ;0X22
  249.   .reg_page           dw ?     ;0X24
  250.   .reg_powerdown      dw ?     ;0x26
  251.   .reg_ext_audio      dw ?     ;0x28
  252.   .reg_ext_st         dw ?     ;0x2a
  253.   .reg_pcm_front_rate dw ?     ;0x2c
  254.   .reg_pcm_surr_rate  dw ?     ;0x2e
  255.   .reg_lfe_rate       dw ?     ;0x30
  256.   .reg_pcm_in_rate    dw ?     ;0x32
  257.                       dw ?     ;0x34
  258.   .reg_cent_lfe_vol   dw ?     ;0x36
  259.   .reg_surr_vol       dw ?     ;0x38
  260.   .reg_spdif_ctrl     dw ?     ;0x3A
  261.                       dw ?     ;0x3C
  262.                       dw ?     ;0x3E
  263.                       dw ?     ;0x40
  264.                       dw ?     ;0x42
  265.                       dw ?     ;0x44
  266.                       dw ?     ;0x46
  267.                       dw ?     ;0x48
  268.                       dw ?     ;0x4A
  269.                       dw ?     ;0x4C
  270.                       dw ?     ;0x4E
  271.                       dw ?     ;0x50
  272.                       dw ?     ;0x52
  273.                       dw ?     ;0x54
  274.                       dw ?     ;0x56
  275.                       dw ?     ;0x58
  276.                       dw ?     ;0x5A
  277.                       dw ?     ;0x5C
  278.                       dw ?     ;0x5E
  279.   .reg_page_0         dw ?     ;0x60
  280.   .reg_page_1         dw ?     ;0x62
  281.   .reg_page_2         dw ?     ;0x64
  282.   .reg_page_3         dw ?     ;0x66
  283.   .reg_page_4         dw ?     ;0x68
  284.   .reg_page_5         dw ?     ;0x6A
  285.   .reg_page_6         dw ?     ;0x6C
  286.   .reg_page_7         dw ?     ;0x6E
  287.                       dw ?     ;0x70
  288.                       dw ?     ;0x72
  289.                       dw ?     ;0x74
  290.                       dw ?     ;0x76
  291.                       dw ?     ;0x78
  292.                       dw ?     ;0x7A
  293.   .reg_vendor_id_1    dw ?     ;0x7C
  294.   .reg_vendor_id_2    dw ?     ;0x7E
  295.  
  296.  
  297.   .reset              dd ?    ;virual
  298.   .set_master_vol     dd ?
  299. }
  300.  
  301. struc CTRL_INFO
  302. {   .pci_cmd          dd ?
  303.     .irq              dd ?
  304.     .glob_cntrl       dd ?
  305.     .glob_sta         dd ?
  306.     .codec_io_base    dd ?
  307.     .ctrl_io_base     dd ?
  308.     .codec_mem_base   dd ?
  309.     .ctrl_mem_base    dd ?
  310.     .codec_id         dd ?
  311. }
  312.  
  313. struc IOCTL
  314. {  .handle            dd ?
  315.    .io_code           dd ?
  316.    .input             dd ?
  317.    .inp_size          dd ?
  318.    .output            dd ?
  319.    .out_size          dd ?
  320. }
  321.  
  322. virtual at 0
  323.   IOCTL IOCTL
  324. end virtual
  325.  
  326. EVENT_NOTIFY    equ 0x00000200
  327.  
  328. public START
  329. public service_proc
  330. public version
  331.  
  332. section '.flat' code readable align 16
  333.  
  334. proc START stdcall, state:dword
  335.  
  336.            cmp   [state], 1
  337.            jne   .stop
  338.  
  339.      if DEBUG
  340.            mov   esi, msgInit
  341.            call  SysMsgBoardStr
  342.      end if
  343.  
  344.            call     detect_controller
  345.            test     eax, eax
  346.            jz       .fail
  347.  
  348.      if DEBUG
  349.            mov   esi,[ctrl.vendor_ids]
  350.            call  SysMsgBoardStr
  351.            mov   esi, [ctrl.ctrl_ids]
  352.            call  SysMsgBoardStr
  353.      end if
  354.  
  355.            call     init_controller
  356.            test     eax, eax
  357.            jz       .fail
  358.  
  359.            call     init_codec
  360.            test     eax, eax
  361.            jz       .fail
  362.  
  363.            call     setup_codec
  364.  
  365.            mov      esi, msgPrimBuff
  366.            call     SysMsgBoardStr
  367.            call     create_primary_buff
  368.            mov      esi, msgDone
  369.            call     SysMsgBoardStr
  370.  
  371.   if IRQ_REMAP
  372.            pushf
  373.            cli
  374.  
  375.            mov      ebx, [ctrl.int_line]
  376.            in       al, 0xA1
  377.            mov      ah, al
  378.            in       al, 0x21
  379.            test     ebx, ebx
  380.            jz       .skip
  381.            bts      ax, bx                      ;mask old line
  382. .skip:
  383.            bts      ax, IRQ_LINE                ;mask new ine
  384.            out      0x21, al
  385.            mov      al, ah
  386.            out      0xA1, al
  387.  
  388.            stdcall  PciWrite8, 0, 0xF8, 0x61, IRQ_LINE  ;remap IRQ
  389.  
  390.            mov      dx, 0x4d0                   ;8259 ELCR1
  391.            in       al, dx
  392.            bts      ax, IRQ_LINE
  393.            out      dx, al                      ;set level-triggered mode
  394.            mov      [ctrl.int_line], IRQ_LINE
  395.            popf
  396.            mov      esi, msgRemap
  397.            call     SysMsgBoardStr
  398.   end if
  399.  
  400.            mov      eax, VALID_IRQ
  401.            mov      ebx, [ctrl.int_line]
  402.            mov      esi, msgInvIRQ
  403.            bt       eax, ebx
  404.            jnc      .fail_msg
  405.            mov      eax, ATTCH_IRQ
  406.            mov      esi, msgAttchIRQ
  407.            bt       eax, ebx
  408.            jnc      .fail_msg
  409.  
  410.            stdcall  AttachIntHandler, ebx, ac97_irq_VIA, dword 0
  411. .reg:
  412.            stdcall  RegService, sz_sound_srv, service_proc
  413.            ret
  414. .fail:
  415.      if DEBUG
  416.            mov   esi, msgFail
  417.            call  SysMsgBoardStr
  418.      end if
  419.            xor      eax, eax
  420.            ret
  421. .fail_msg:
  422.            call     SysMsgBoardStr
  423.            xor      eax, eax
  424.            ret
  425. .stop:
  426.            call     stop
  427.            xor      eax, eax
  428.            ret
  429. endp
  430.  
  431. handle    equ  IOCTL.handle
  432. io_code   equ  IOCTL.io_code
  433. input     equ  IOCTL.input
  434. inp_size   equ  IOCTL.inp_size
  435. output    equ  IOCTL.output
  436. out_size   equ  IOCTL.out_size
  437.  
  438. align 4
  439. proc service_proc stdcall, ioctl:dword
  440.  
  441.            mov      edi, [ioctl]
  442.            mov      eax, [edi+io_code]
  443.  
  444.            cmp      eax, SRV_GETVERSION
  445.            jne      @F
  446.            mov      eax, [edi+output]
  447.            cmp      [edi+out_size], 4
  448.            jne      .fail
  449.  
  450.            mov      [eax], dword API_VERSION
  451.            xor      eax, eax
  452.            ret
  453. @@:
  454.            cmp      eax, DEV_PLAY
  455.            jne      @F
  456.      if DEBUG
  457.            mov  esi, msgPlay
  458.            call SysMsgBoardStr
  459.      end if
  460.            call     play
  461.            ret
  462. @@:
  463.            cmp      eax, DEV_STOP
  464.            jne      @F
  465.      if DEBUG
  466.            mov  esi, msgStop
  467.            call SysMsgBoardStr
  468.      end if
  469.            call     stop
  470.            ret
  471. @@:
  472.            cmp      eax, DEV_CALLBACK
  473.            jne      @F
  474.            mov      ebx, [edi+input]
  475.            stdcall  set_callback, [ebx]
  476.            ret
  477. @@:
  478.            cmp      eax, DEV_SET_MASTERVOL
  479.            jne      @F
  480.            mov      eax, [edi+input]
  481.            mov      eax, [eax]
  482.            call     set_master_vol      ;eax= vol
  483.            ret
  484. @@:
  485.            cmp      eax, DEV_GET_MASTERVOL
  486.            jne      @F
  487.            mov      ebx, [edi+output]
  488.            stdcall  get_master_vol, ebx
  489.            ret
  490. @@:
  491.            cmp      eax, DEV_GET_INFO
  492.            jne      @F
  493.            mov      ebx, [edi+output]
  494.            stdcall  get_dev_info, ebx
  495.            ret
  496. @@:
  497. .fail:
  498.            or       eax, -1
  499.            ret
  500. endp
  501.  
  502. restore   handle
  503. restore   io_code
  504. restore   input
  505. restore   inp_size
  506. restore   output
  507. restore   out_size
  508.  
  509.  
  510. align 4
  511. proc ac97_irq_VIA
  512.            locals
  513.              status db 0
  514.            endl
  515.  
  516.            mov      edx, VIADEV_PLAYBACK   +VIA_REG_OFFSET_STATUS
  517.            call     [ctrl.ctrl_read8]
  518.            test     al, VIA_REG_STAT_ACTIVE
  519.            jz       @f
  520.  
  521.            and      al, VIA_REG_STAT_EOL or VIA_REG_STAT_FLAG or VIA_REG_STAT_STOPPED
  522.            mov      byte [status], al
  523.  
  524.            mov      ebx, dword [buff_list]
  525.            cmp      [ctrl.user_callback], 0
  526.            je       @f
  527.            stdcall  [ctrl.user_callback], ebx
  528.        @@:
  529.            mov      al, byte [status]           ;; ack ;;
  530.            mov      edx, VIADEV_PLAYBACK   +VIA_REG_OFFSET_STATUS
  531.            call     [ctrl.ctrl_write8]
  532.  
  533.            ret
  534. endp
  535.  
  536.  
  537. align 4
  538. proc create_primary_buff
  539.  
  540.            stdcall  KernelAlloc, 0x10000
  541.            mov      [ctrl.buffer], eax
  542.  
  543.            mov      edi, eax
  544.            mov      ecx, 0x10000/4
  545.            xor      eax, eax
  546.            cld
  547.            rep      stosd
  548.  
  549.            mov      eax, [ctrl.buffer]
  550.            call     GetPgAddr
  551.            mov      edi, pcmout_bdl
  552.            stosd
  553.            mov      eax, 0x80004000
  554.            stosd
  555.  
  556.            mov      edi, buff_list
  557.            mov      eax, [ctrl.buffer]
  558.            mov      ecx, 4
  559. @@:
  560.            mov      [edi], eax
  561.            mov      [edi+16], eax
  562.            mov      [edi+32], eax
  563.            mov      [edi+48], eax
  564.            mov      [edi+64], eax
  565.            mov      [edi+80], eax
  566.            mov      [edi+96], eax
  567.            mov      [edi+112], eax
  568.  
  569.            ;add      eax, 0x4000
  570.            add      edi, 4
  571.            loop     @B
  572.  
  573.            stdcall  channel_reset, VIADEV_PLAYBACK
  574.            stdcall  codec_check_ready
  575.  
  576.            mov      eax, pcmout_bdl
  577.            mov      ebx, eax
  578.            call     GetPgAddr
  579.            and      ebx, 0xFFF
  580.            add      eax, ebx
  581.  
  582.            mov      edx, VIADEV_PLAYBACK  +VIA_REG_OFFSET_TABLE_PTR
  583.            call     [ctrl.ctrl_write32]
  584.  
  585.            stdcall  codec_check_ready
  586.  
  587.            mov      edx, VIADEV_PLAYBACK  +VIA_REG_OFS_PLAYBACK_VOLUME_L
  588.            mov      eax, 7;31
  589.            call     [ctrl.ctrl_write8]
  590.  
  591.            mov      edx, VIADEV_PLAYBACK  +VIA_REG_OFS_PLAYBACK_VOLUME_R
  592.            mov      eax, 7;31
  593.            call     [ctrl.ctrl_write8]
  594.  
  595.            mov      edx, VIADEV_PLAYBACK  +VIA_REG_OFFSET_STOP_IDX
  596.            mov      eax, VIA8233_REG_TYPE_16BIT or VIA8233_REG_TYPE_STEREO or 0xfffff or 0xff000000
  597.            mov    [ctrl.lvi_reg], 16;0xF;eax
  598.            call     [ctrl.ctrl_write32]
  599.  
  600.            stdcall  codec_check_ready
  601.            ret
  602. endp
  603.  
  604.  
  605. proc channel_reset channel:dword
  606.            mov      esi, dword [channel]
  607.            mov      edx, esi
  608.            add      edx, VIA_REG_OFFSET_CONTROL
  609.            mov      eax, VIA_REG_CTRL_PAUSE or VIA_REG_CTRL_TERMINATE or VIA_REG_CTRL_RESET
  610.            call     [ctrl.ctrl_write8]
  611.  
  612.            mov      edx, esi
  613.            add      edx, VIA_REG_OFFSET_CONTROL
  614.            call     [ctrl.ctrl_read8]
  615.  
  616.            mov      eax, 50000   ; wait 50 ms
  617.            call     StallExec
  618.            ; disable interrupts
  619.            mov      edx, esi
  620.            add      edx, VIA_REG_OFFSET_CONTROL
  621.            xor      eax, eax
  622.            call     [ctrl.ctrl_write8]
  623.  
  624.            ; clear interrupts
  625.            mov      edx, esi
  626.            add      edx, VIA_REG_OFFSET_STATUS
  627.            mov      eax, 0x03
  628.            call     [ctrl.ctrl_write8]
  629.  
  630.         ;outb(0x00, VIADEV_REG(viadev, OFFSET_TYPE)); /* for via686 */
  631.           ; mov      edx, esi                  ;; for via686
  632.           ; add      edx, VIA_REG_OFFSET_TYPE
  633.           ; mov      eax, 0x03
  634.           ; call     [ctrl.ctrl_write8]
  635.  
  636.         ;; outl(0, VIADEV_REG(viadev, OFFSET_CURR_PTR));
  637.            ;mov      edx, esi
  638.            ;add      edx, VIA_REG_OFFSET_CURR_PTR
  639.            ;xor      eax, eax
  640.            ;call     [ctrl.ctrl_write8]
  641.  
  642.            ret
  643. endp
  644.  
  645.  
  646. align 4
  647. proc detect_controller
  648.            locals
  649.              last_bus dd ?
  650.              bus      dd ?
  651.              devfn    dd ?
  652.            endl
  653.  
  654.            xor eax, eax
  655.            mov [bus], eax
  656.            inc eax
  657.            call PciApi
  658.            cmp eax, -1
  659.            je .err
  660.  
  661.            mov [last_bus], eax
  662.  
  663. .next_bus:
  664.            and [devfn], 0
  665. .next_dev:
  666.            stdcall PciRead32, [bus], [devfn], dword 0
  667.            test eax, eax
  668.            jz .next
  669.            cmp eax, -1
  670.            je .next
  671.  
  672.            mov edi, devices
  673. @@:
  674.            mov ebx, [edi]
  675.            test ebx, ebx
  676.            jz .next
  677.  
  678.            cmp eax, ebx
  679.            je .found
  680.            add edi, 12
  681.            jmp @B
  682. .next:
  683.            inc [devfn]
  684.            cmp [devfn], 256
  685.            jb .next_dev
  686.            mov eax, [bus]
  687.            inc eax
  688.            mov [bus], eax
  689.            cmp eax, [last_bus]
  690.            jna .next_bus
  691.            xor eax, eax
  692.            ret
  693. .found:
  694.            mov ebx, [bus]
  695.            mov [ctrl.bus], ebx
  696.  
  697.            mov ecx, [devfn]
  698.            mov [ctrl.devfn], ecx
  699.  
  700.            mov edx, eax
  701.            and edx, 0xFFFF
  702.            mov [ctrl.vendor], edx
  703.            shr eax, 16
  704.            mov [ctrl.dev_id], eax
  705.  
  706.            mov ebx, [edi+4]
  707.            mov [ctrl.ctrl_ids], ebx
  708.            mov esi, [edi+8]
  709.            mov [ctrl.ctrl_setup], esi
  710.  
  711.            cmp edx, VID_VIA
  712.            jne @F
  713.            mov [ctrl.vendor_ids], msg_VIA
  714.            ret
  715. @@:
  716.  
  717. .err:
  718.            xor eax, eax
  719.            mov [ctrl.vendor_ids], eax     ;something  wrong ?
  720.            ret
  721. endp
  722.  
  723. align 4
  724. proc init_controller
  725.  
  726.            stdcall  PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
  727.            mov      ebx, eax
  728.            and      eax, 0xFFFF
  729.            mov      [ctrl.pci_cmd], eax
  730.            shr      ebx, 16
  731.            mov      [ctrl.pci_stat], ebx
  732.  
  733.            mov      esi, msgPciCmd
  734.            call     SysMsgBoardStr
  735.            call     dword2str
  736.            call     SysMsgBoardStr
  737.  
  738.            mov      esi, msgPciStat
  739.            call     SysMsgBoardStr
  740.            mov      eax, [ctrl.pci_stat]
  741.            call     dword2str
  742.            call     SysMsgBoardStr
  743.  
  744.            mov      esi, msgCtrlIsaIo
  745.            call     SysMsgBoardStr
  746.            stdcall  PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
  747.            call     dword2str
  748.            call     SysMsgBoardStr
  749.  
  750.            and      eax, 0xFFC0
  751.            mov      [ctrl.ctrl_io_base], eax
  752.  
  753. .default:
  754.            stdcall  PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
  755.            and      eax, 0xFF
  756. @@:
  757.            mov      [ctrl.int_line], eax
  758.  
  759.            ;stdcall  PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_FUNC_ENABLE ;0x42
  760.            ;mov      byte [old_legacy], al
  761.  
  762.            ;stdcall  PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_PNP_CONTROL ;0x43
  763.            ;mov      byte [old_legacy_cfg], al
  764.  
  765.            ;mov      al, VIA_FUNC_ENABLE_SB or VIA_FUNC_ENABLE_FM
  766.            ;xor      al, 0xFF
  767.            ;and      al, byte [old_legacy]
  768.            ;and      eax, 0xFF
  769.            ;stdcall  PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_FUNC_ENABLE, eax ;0x42
  770.            ;mov      byte [old_legacy], al
  771.  
  772.            call     [ctrl.ctrl_setup]
  773.            xor      eax, eax
  774.            inc      eax
  775.            ret
  776. endp
  777.  
  778. align 4
  779. proc set_VIA
  780.            mov      [ctrl.codec_read16],  codec_io_r16    ;virtual
  781.            mov      [ctrl.codec_write16], codec_io_w16    ;virtual
  782.  
  783.            mov      [ctrl.ctrl_read8 ],  ctrl_io_r8       ;virtual
  784.            mov      [ctrl.ctrl_read16],  ctrl_io_r16      ;virtual
  785.            mov      [ctrl.ctrl_read32],  ctrl_io_r32      ;virtual
  786.  
  787.            mov      [ctrl.ctrl_write8 ], ctrl_io_w8       ;virtual
  788.            mov      [ctrl.ctrl_write16], ctrl_io_w16      ;virtual
  789.            mov      [ctrl.ctrl_write32], ctrl_io_w32      ;virtual
  790.            ret
  791. endp
  792.  
  793.  
  794. align 4
  795. proc init_codec
  796.            locals
  797.              counter dd ?
  798.            endl
  799.  
  800.            mov      esi, msgControl
  801.            call     SysMsgBoardStr
  802.            stdcall  PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL
  803.            and      eax, 0xFF
  804.            call     dword2str
  805.            call     SysMsgBoardStr
  806.  
  807.            mov      esi, msgStatus
  808.            call     SysMsgBoardStr
  809.            stdcall  PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
  810.            and      eax, 0xFF
  811.            push     eax
  812.            call     dword2str
  813.            call     SysMsgBoardStr
  814.            pop      eax
  815.  
  816.            test     eax, VIA_ACLINK_C00_READY
  817.            jz       .ready
  818.  
  819.            call     reset_codec
  820.            test     eax, eax
  821.            jz       .err
  822.  
  823. .ready:
  824.            xor      edx, edx     ; ac_reg_0
  825.            call     [ctrl.codec_write16]
  826.            jmp      .done
  827.  
  828. .err:
  829.            xor      eax, eax          ; timeout error
  830.            ret
  831.  
  832. .done:
  833.            call     detect_codec
  834.  
  835.            xor      eax, eax
  836.            inc      eax
  837.            ret
  838. endp
  839.  
  840. align 4
  841. proc reset_codec
  842.            stdcall  PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, \
  843.                                VIA_ACLINK_CTRL_ENABLE or VIA_ACLINK_CTRL_RESET or VIA_ACLINK_CTRL_SYNC
  844.            mov      eax, 100000    ; wait 100 ms
  845.            call     StallExec
  846. .cold:
  847.            call     cold_reset
  848.            jnc      .ok
  849.  
  850.      if DEBUG
  851.            mov   esi, msgCFail
  852.            call  SysMsgBoardStr
  853.      end if
  854.            xor      eax, eax     ; timeout error
  855.            ret
  856. .ok:
  857.      if DEBUG
  858.            mov   esi, msgResetOk
  859.            call  SysMsgBoardStr
  860.      end if
  861.            xor      eax, eax
  862.            inc      eax
  863.            ret
  864. endp
  865.  
  866.  
  867. align 4
  868. proc cold_reset
  869.            locals
  870.              counter dd ?
  871.            endl
  872.  
  873.            stdcall  PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, dword 0
  874.  
  875.      if DEBUG
  876.            mov   esi, msgCold
  877.            call  SysMsgBoardStr
  878.      end if
  879.  
  880.            mov      eax, 100000     ; wait 100 ms ;400000     ; wait 400 ms
  881.            call     StallExec
  882.  
  883.            ;; ACLink on, deassert ACLink reset, VSR, SGD data out
  884.            ;; note - FM data out has trouble with non VRA codecs !!
  885.            stdcall  PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, dword VIA_ACLINK_CTRL_INIT
  886.  
  887.            mov      [counter], 16    ; total 20*100 ms = 2s
  888. .wait:
  889.            stdcall  PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
  890.            test     eax, VIA_ACLINK_C00_READY
  891.            jnz      .ok
  892.  
  893.            mov      eax, 100000    ; wait 100 ms
  894.            call     StallExec
  895.  
  896.            dec      [counter]
  897.            jnz      .wait
  898.  
  899.      if DEBUG
  900.            mov   esi, msgCRFail
  901.            call  SysMsgBoardStr
  902.      end if
  903.  
  904. .fail:
  905.            stc
  906.            ret
  907. .ok:
  908.            mov      esi, msgControl
  909.            call     SysMsgBoardStr
  910.            stdcall  PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL
  911.            call     dword2str
  912.            call     SysMsgBoardStr
  913.  
  914.            mov      esi, msgStatus
  915.            call     SysMsgBoardStr
  916.            stdcall  PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
  917.            and      eax, 0xFF
  918.            push     eax
  919.            call     dword2str
  920.            call     SysMsgBoardStr
  921.            pop      eax
  922.  
  923.            test     eax, VIA_ACLINK_C00_READY ;CTRL_ST_CREADY
  924.            jz       .fail
  925.            clc
  926.            ret
  927. endp
  928.  
  929. align 4
  930. play:
  931.            mov      edx, VIADEV_PLAYBACK   +VIA_REG_OFFSET_STOP_IDX
  932.            mov      eax, VIA8233_REG_TYPE_16BIT or VIA8233_REG_TYPE_STEREO or 0xfffff or 0xff000000
  933.            mov   [ctrl.lvi_reg], 16
  934.            call     [ctrl.ctrl_write32]
  935.  
  936.            mov      eax, VIA_REG_CTRL_INT
  937.            or       eax, VIA_REG_CTRL_START
  938.            mov      edx, VIADEV_PLAYBACK   +VIA_REG_OFFSET_CONTROL
  939.            call     [ctrl.ctrl_write8]
  940.  
  941.            xor      eax, eax
  942.            ret
  943.  
  944. align 4
  945. stop:
  946.            mov      eax, VIA_REG_CTRL_INT
  947.            or       eax, VIA_REG_CTRL_TERMINATE
  948.            mov      edx, VIADEV_PLAYBACK   +VIA_REG_OFFSET_CONTROL
  949.            call     [ctrl.ctrl_write8]
  950.  
  951.            stdcall  channel_reset, VIADEV_PLAYBACK
  952.            xor      eax, eax
  953.            ret
  954.  
  955. align 4
  956. proc get_dev_info stdcall, p_info:dword
  957.            virtual at esi
  958.              CTRL_INFO CTRL_INFO
  959.            end virtual
  960.  
  961.            mov      esi, [p_info]
  962.            mov      eax, [ctrl.int_line]
  963.            mov      ecx, [ctrl.ctrl_io_base]
  964.            mov      [CTRL_INFO.irq], eax
  965.            mov      [CTRL_INFO.ctrl_io_base], ecx
  966.  
  967.            xor      eax, eax
  968.            ;mov      edx, VIADEV_PLAYBACK   +VIA_REG_OFFSET_TABLE_PTR
  969.            ;call     [ctrl.ctrl_read32]
  970.            mov      [CTRL_INFO.codec_io_base], eax
  971.            ;mov      edx, VIADEV_PLAYBACK   +VIA_REG_OFFSET_STOP_IDX
  972.            ;call     [ctrl.ctrl_read32]
  973.            mov      [CTRL_INFO.codec_mem_base], eax
  974.            ;mov      edx, VIADEV_PLAYBACK   +VIA_REG_OFFSET_CURR_COUNT
  975.            ;call     [ctrl.ctrl_read32]
  976.            mov      [CTRL_INFO.ctrl_mem_base], eax
  977.  
  978.            mov      eax, [codec.chip_id]
  979.            mov      [CTRL_INFO.codec_id], eax
  980.  
  981.            mov      edx, VIADEV_PLAYBACK   +VIA_REG_OFFSET_CONTROL
  982.            call     [ctrl.ctrl_read8]
  983.            and      eax, 0xFF
  984.            mov      [CTRL_INFO.glob_cntrl], eax
  985.  
  986.            mov      edx, VIADEV_PLAYBACK   +VIA_REG_OFFSET_STATUS
  987.            call     [ctrl.ctrl_read8]
  988.            and      eax, 0xFF
  989.            mov      [CTRL_INFO.glob_sta], eax
  990.  
  991.            mov      ebx, [ctrl.pci_cmd]
  992.            mov      [CTRL_INFO.pci_cmd], ebx
  993.            ret
  994. endp
  995.  
  996. align 4
  997. proc set_callback stdcall, handler:dword
  998.            mov      eax, [handler]
  999.            mov      [ctrl.user_callback], eax
  1000.            ret
  1001. endp
  1002.  
  1003.  
  1004. align 4
  1005. proc codec_check_ready stdcall
  1006.            locals
  1007.              counter dd ?
  1008.            endl
  1009.  
  1010.            mov      [counter], 1000     ; total 1000*1 ms = 1s
  1011. .wait:
  1012.            call     [ctrl.codec_read16]
  1013.            test     eax, VIA_REG_AC97_BUSY
  1014.            jz       .ok
  1015.  
  1016.            mov      eax, 1000   ; wait 1 ms
  1017.            call     StallExec
  1018.  
  1019.            sub      [counter] , 1
  1020.            jnz      .wait
  1021. .err:
  1022.            mov      eax, -1
  1023.            ret
  1024. .ok:
  1025.            and      eax, 0xFFFF
  1026.            ret
  1027. endp
  1028.  
  1029.  
  1030. align 4
  1031. proc codec_valid stdcall
  1032.            stdcall  codec_check_ready
  1033.            ret
  1034. endp
  1035.  
  1036. align 4
  1037. proc codec_read stdcall, ac_reg:dword      ; reg = edx, reval = eax
  1038.            locals
  1039.              counter dd ?
  1040.            endl
  1041.  
  1042.            ;Use only primary codec.
  1043.            mov      eax, [ac_reg]
  1044.            and      eax, 0x7F
  1045.            shl      eax, VIA_REG_AC97_CMD_SHIFT
  1046.            or       eax, VIA_REG_AC97_PRIMARY_VALID or VIA_REG_AC97_READ
  1047.  
  1048.            mov      [counter], 3     ; total 3*20 ms = 60ms
  1049. .wait:
  1050.            push     eax
  1051.            call     [ctrl.codec_write16]
  1052.  
  1053.            mov      eax, 20000   ; wait 20 ms
  1054.            call     StallExec
  1055.  
  1056.            stdcall  codec_valid,
  1057.            cmp      eax, 0
  1058.            pop      eax
  1059.            jge      .ok
  1060.  
  1061.            sub      [counter] , 1
  1062.            jnz      .wait
  1063.            jmp      .err
  1064.  
  1065. .ok:
  1066.            mov      eax, 25000   ; wait 25 ms
  1067.            call     StallExec
  1068.  
  1069.            call     [ctrl.codec_read16]  ;change edx !!!
  1070.            and      eax, 0xFFFF
  1071.            ret
  1072. .err:
  1073.      if DEBUG
  1074.            mov   esi, msgCInvalid
  1075.            call  SysMsgBoardStr
  1076.      end if
  1077.            mov      eax, -1        ; invalid codec error
  1078.            ret
  1079. endp
  1080.  
  1081. align 4
  1082. proc codec_write stdcall, ac_reg:dword
  1083.            ;Use only primary codec.
  1084.            mov      esi, [ac_reg]
  1085.            mov      edx, esi
  1086.            shl      edx, VIA_REG_AC97_CMD_SHIFT
  1087.  
  1088.            shl      eax, VIA_REG_AC97_DATA_SHIFT
  1089.            or       edx, eax
  1090.  
  1091.            mov      eax, VIA_REG_AC97_CODEC_ID_PRIMARY ;not VIA_REG_AC97_CODEC_ID_PRIMARY
  1092.            shl      eax, VIA_REG_AC97_CODEC_ID_SHIFT
  1093.            or       edx, eax
  1094.  
  1095.            mov      eax, edx
  1096.            mov      edx, esi
  1097.            call     [ctrl.codec_write16]
  1098.            mov      [codec.regs+esi], ax
  1099.  
  1100.            stdcall  codec_check_ready
  1101.            cmp      eax, 0
  1102.            jl       .err
  1103. .ok:
  1104.            ret
  1105. .err:
  1106.      if DEBUG
  1107.            mov    esi, msgCFail
  1108.            call   SysMsgBoardStr
  1109.      end if
  1110.            ;mov      eax, -1        ; codec not ready error
  1111.            ret
  1112. endp
  1113.  
  1114. align 4
  1115. proc StallExec
  1116.            push     ecx
  1117.            push     edx
  1118.            push     ebx
  1119.            push     eax
  1120.  
  1121.            mov      ecx, CPU_FREQ
  1122.            mul      ecx
  1123.            mov      ebx, eax       ;low
  1124.            mov      ecx, edx       ;high
  1125.            rdtsc
  1126.            add      ebx, eax
  1127.            adc      ecx, edx
  1128. @@:
  1129.            rdtsc
  1130.            sub      eax, ebx
  1131.            sbb      edx, ecx
  1132.            js       @B
  1133.  
  1134.            pop      eax
  1135.            pop      ebx
  1136.            pop      edx
  1137.            pop      ecx
  1138.            ret
  1139. endp
  1140.  
  1141. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1142. ;          CONTROLLER IO functions
  1143. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1144.  
  1145. align 4
  1146. proc codec_io_r16 ;r32
  1147.            mov      edx, [ctrl.ctrl_io_base]
  1148.            add      edx, VIA_REG_AC97
  1149.            in       eax, dx
  1150.            ret
  1151. endp
  1152.  
  1153. align 4
  1154. proc codec_io_w16 ;w32
  1155.            mov      edx, [ctrl.ctrl_io_base]
  1156.            add      edx, VIA_REG_AC97
  1157.            out      dx,  eax
  1158.            ret
  1159. endp
  1160.  
  1161. align 4
  1162. proc ctrl_io_r8
  1163.            add      edx, [ctrl.ctrl_io_base]
  1164.            in       al, dx
  1165.            ret
  1166. endp
  1167.  
  1168. align 4
  1169. proc ctrl_io_r16
  1170.            add      edx, [ctrl.ctrl_io_base]
  1171.            in       ax, dx
  1172.            ret
  1173. endp
  1174.  
  1175. align 4
  1176. proc ctrl_io_r32
  1177.            add      edx, [ctrl.ctrl_io_base]
  1178.            in       eax, dx
  1179.            ret
  1180. endp
  1181.  
  1182. align 4
  1183. proc ctrl_io_w8
  1184.            add      edx, [ctrl.ctrl_io_base]
  1185.            out      dx, al
  1186.            ret
  1187. endp
  1188.  
  1189. align 4
  1190. proc ctrl_io_w16
  1191.            add      edx, [ctrl.ctrl_io_base]
  1192.            out      dx, ax
  1193.            ret
  1194. endp
  1195.  
  1196. align 4
  1197. proc ctrl_io_w32
  1198.            add      edx, [ctrl.ctrl_io_base]
  1199.            out      dx, eax
  1200.            ret
  1201. endp
  1202.  
  1203.  
  1204. align 4
  1205. dword2str:
  1206.            push     eax ebx ecx
  1207.            mov      esi, hex_buff
  1208.            mov      ecx, -8
  1209.    @@:
  1210.            rol      eax, 4
  1211.            mov      ebx, eax
  1212.            and      ebx, 0x0F
  1213.            mov      bl, [ebx+hexletters]
  1214.            mov      [8+esi+ecx], bl
  1215.            inc      ecx
  1216.            jnz      @B
  1217.            pop      ecx ebx eax
  1218.            ret
  1219.  
  1220. hexletters   db '0123456789ABCDEF'
  1221. hex_buff     db 8 dup(0),13,10,0
  1222.  
  1223.  
  1224. include "codec.inc"
  1225.  
  1226. align 4
  1227. devices dd (CTRL_VT82C686  shl 16)+VID_VIA,msg_VT82C686,set_VIA
  1228.         dd (CTRL_VT8233_5  shl 16)+VID_VIA,msg_VT8233,set_VIA
  1229.         dd 0    ;terminator
  1230.  
  1231.  
  1232. version      dd (5 shl 16) or (API_VERSION and 0xFFFF)
  1233.  
  1234. msg_VT82C686 db 'VT82C686', 13,10, 0
  1235. msg_VT8233   db 'VT8233',   13,10, 0
  1236. msg_VIA      db 'VIA'   ,   13,10, 0
  1237.  
  1238. szKernel            db 'KERNEL', 0
  1239. sz_sound_srv        db 'SOUND',0
  1240.  
  1241. msgInit      db 'detect hardware...',13,10,0
  1242. msgFail      db 'device not found',13,10,0
  1243. msgAttchIRQ  db 'IRQ line not supported', 13,10, 0
  1244. msgInvIRQ    db 'IRQ line not assigned or invalid', 13,10, 0
  1245. msgPlay      db 'start play', 13,10,0
  1246. msgStop      db 'stop play',  13,10,0
  1247. ;msgIRQ       db 'AC97 IRQ', 13,10,0
  1248. ;msgInitCtrl  db 'init controller',13,10,0
  1249. ;msgInitCodec db 'init codec',13,10,0
  1250. msgPrimBuff  db 'create primary buffer ...',0
  1251. msgDone      db 'done',13,10,0
  1252. msgRemap     db 'Remap IRQ',13,10,0
  1253. ;msgReg       db 'set service handler',13,10,0
  1254. ;msgOk        db 'service installed',13,10,0
  1255. msgCold      db 'cold reset',13,10,0
  1256. ;msgWarm      db 'warm reset',13,10,0
  1257. ;msgWRFail    db 'warm reset failed',13,10,0
  1258. msgCRFail    db 'cold reset failed',13,10,0
  1259. msgCFail     db 'codec not ready',13,10,0
  1260. msgCInvalid  db 'codec is not valid',13,10,0 ;Asper
  1261. msgResetOk   db 'reset complete',13,10,0
  1262. msgStatus    db 'global status   ',0
  1263. msgControl   db 'global control  ',0
  1264. msgPciCmd    db 'PCI command     ',0
  1265. msgPciStat   db 'PCI status      ',0
  1266. msgCtrlIsaIo db 'controller io base   ',0
  1267. ;msgMixIsaIo  db 'codec io base        ',0
  1268. ;msgCtrlMMIo  db 'controller mmio base ',0
  1269. ;msgMixMMIo   db 'codec mmio base      ',0
  1270. ;msgIrqMap    db 'AC97 irq map as      ',0
  1271.  
  1272.  
  1273. section '.data' data readable writable align 16
  1274.  
  1275. pcmout_bdl       rq 32
  1276. buff_list        rd 32
  1277.  
  1278. codec CODEC
  1279. ctrl AC_CNTRL
  1280.  
  1281. chip_type        rb 1