Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ;   This file is part of the Infinity sound AC97 driver.
  3. ;   (C) copyright Serge 2006
  4. ;   email: infinity_sound@mail.ru
  5. ;
  6. ;   This program is free software; you can redistribute it and/or modify
  7. ;   it under the terms of the GNU General Public License as published by
  8. ;   the Free Software Foundation; either version 2 of the License, or
  9. ;   (at your option) any later version.
  10. ;
  11. ;   This program is distributed in the hope that it will be useful,
  12. ;   but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ;   GNU General Public License for more details.
  15.  
  16. align 4
  17. proc attach_int_handler stdcall, irq:dword, handler:dword
  18.  
  19.          mov ebx, [irq]        ;irq num
  20.          test ebx, ebx
  21.          jz .err
  22.          mov eax, [handler]
  23.          test eax, eax
  24.          jz .err
  25.          mov [irq_tab+ebx*4], eax
  26.          stdcall enable_irq, [irq]
  27.          ret
  28. .err:
  29.          xor eax, eax
  30.          ret
  31. endp
  32.  
  33. align 4
  34. proc  detach_int_handler
  35.  
  36.            ret
  37. endp
  38.  
  39. align 4
  40. proc enable_irq stdcall, irq_line:dword
  41.            mov ebx, [irq_line]
  42.            mov edx, 0x21
  43.            cmp ebx, 8
  44.            jb @F
  45.            mov edx, 0xA1
  46.            sub ebx,8
  47. @@:
  48.            in al,dx
  49.            btr eax, ebx
  50.            out dx, al
  51.            ret
  52. endp
  53.  
  54. align 16
  55. ;; proc irq_serv
  56.  
  57. irq_serv:
  58.  
  59. .irq_1:
  60.            push eax
  61.            mov eax, 1
  62.            jmp .main
  63. align 4
  64. .irq_2:
  65.            push eax
  66.            mov eax, 2
  67.            jmp .main
  68. align 4
  69. .irq_3:
  70.            push eax
  71.            mov eax, 3
  72.            jmp .main
  73. align 4
  74. .irq_4:
  75.            push eax
  76.            mov eax, 4
  77.            jmp .main
  78. align 4
  79. .irq_5:
  80.            push eax
  81.            mov eax, 5
  82.            jmp .main
  83. align 4
  84. .irq_6:
  85.            push eax
  86.            mov eax, 6
  87.            jmp .main
  88. align 4
  89. .irq_7:
  90.            push eax
  91.            mov eax, 7
  92.            jmp .main
  93. align 4
  94. .irq_8:
  95.            push eax
  96.            mov eax, 8
  97.            jmp .main
  98. align 4
  99. .irq_9:
  100.            push eax
  101.            mov eax, 9
  102.            jmp .main
  103. align 4
  104. .irq_10:
  105.            push eax
  106.            mov eax, 10
  107.            jmp .main
  108. align 4
  109. .irq_11:
  110.            push eax
  111.            mov eax, 11
  112.            jmp .main
  113. align 4
  114. .irq_12:
  115.            push eax
  116.            mov eax, 12
  117.            jmp .main
  118. align 4
  119. .irq_13:
  120.            push eax
  121.            mov eax, 13
  122.            jmp .main
  123. align 4
  124. .irq_14:
  125.            push eax
  126.            mov eax, 14
  127.            jmp .main
  128. align 4
  129. .irq_15:
  130.            push eax
  131.            mov eax, 15
  132.            jmp .main
  133.  
  134. align 16
  135. .main:
  136.            save_ring3_context
  137.            mov   bx, os_data
  138.            mov   ds, bx
  139.            mov   es, bx
  140.  
  141.            mov ebx, [irq_tab+eax*4]
  142.            test ebx, ebx
  143.            jz .exit
  144.  
  145.            call ebx
  146.  
  147. .exit:
  148.            restore_ring3_context
  149.  
  150.            cmp eax, 8
  151.            mov al, 0x20
  152.            jb @f
  153.            out 0xa0, al
  154. @@:
  155.            out 0x20, al
  156.  
  157.            pop eax
  158.            iret
  159.  
  160. align 4
  161. proc get_notify stdcall, p_ev:dword
  162.  
  163. .wait:
  164.            mov ebx,[CURRENT_TASK]
  165.            shl ebx,8
  166.            test dword [ebx+PROC_BASE+0xA8],EVENT_NOTIFY
  167.            jz @f
  168.            and dword [ebx+PROC_BASE+0xA8], not EVENT_NOTIFY
  169.            mov edi, [p_ev]
  170.            mov dword [edi], EV_INTR
  171.            mov eax, [ebx+PROC_BASE+APPDATA.event]
  172.            mov dword [edi+4], eax
  173.            ret
  174. @@:
  175.            call change_task
  176.            jmp .wait
  177. endp
  178.  
  179. align 4
  180. proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
  181.            xor eax, eax
  182.            xor ebx, ebx
  183.            mov ah, byte [bus]
  184.            mov al, 6
  185.            mov bh, byte [devfn]
  186.            mov bl, byte [reg]
  187.            call pci_read_reg
  188.            ret
  189. endp
  190.  
  191. align 4
  192. proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
  193.            xor eax, eax
  194.            xor ebx, ebx
  195.            mov ah, byte [bus]
  196.            mov al, 4
  197.            mov bh, byte [devfn]
  198.            mov bl, byte [reg]
  199.            call pci_read_reg
  200.            ret
  201. endp
  202.  
  203. align 4
  204. proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
  205.            xor eax, eax
  206.            xor ebx, ebx
  207.            mov ah, byte [bus]
  208.            mov al, 8
  209.            mov bh, byte [devfn]
  210.            mov bl, byte [reg]
  211.            mov ecx, [val]
  212.            call pci_write_reg
  213.            ret
  214. endp
  215.  
  216. handle     equ  IOCTL.handle
  217. io_code    equ  IOCTL.io_code
  218. input      equ  IOCTL.input
  219. inp_size   equ  IOCTL.inp_size
  220. output     equ  IOCTL.output
  221. out_size   equ  IOCTL.out_size
  222.  
  223.  
  224. align 4
  225. proc srv_handler stdcall, ioctl:dword
  226.            mov esi, [ioctl]
  227.            test esi, esi
  228.            jz .err
  229.  
  230.            mov edi, [esi+handle]
  231.            cmp [edi+SRV.magic], ' SRV'
  232.            jne .fail
  233.  
  234.            cmp [edi+SRV.size], SRV_SIZE
  235.            jne .fail
  236.  
  237.            stdcall [edi+SRV.srv_proc], esi
  238.            ret
  239. .fail:
  240.            xor eax, eax
  241.            not eax
  242.            mov [esi+output], eax
  243.            mov [esi+out_size], 4
  244.            ret
  245. .err:
  246.            xor eax, eax
  247.            not eax
  248.            ret
  249. endp
  250.  
  251. align 4
  252. proc srv_handlerEx stdcall, ioctl:dword
  253.            mov esi, [ioctl]
  254.            test esi, esi
  255.            jz .err
  256.            add esi, new_app_base
  257.  
  258.            mov edi, [esi+handle]
  259.            cmp [edi+SRV.magic], ' SRV'
  260.            jne .fail
  261.  
  262.            cmp [edi+SRV.size], SRV_SIZE
  263.            jne .fail
  264.  
  265.            add [esi+input], new_app_base
  266.            add [esi+output], new_app_base
  267.  
  268.            stdcall [edi+SRV.srv_proc], esi
  269.            ret
  270. .fail:
  271.            xor eax, eax
  272.            not eax
  273.            mov [esi+output], eax
  274.            mov [esi+out_size], 4
  275.            ret
  276. .err:
  277.            xor eax, eax
  278.            not eax
  279.            ret
  280. endp
  281.  
  282. restore  handle
  283. restore  io_code
  284. restore  input
  285. restore  inp_size
  286. restore  output
  287. restore  out_size
  288.  
  289. align 4
  290. proc get_service stdcall, sz_name:dword
  291.            locals
  292.              srv_ptr  dd ?
  293.              counter  dd ?
  294.             endl
  295.  
  296.             mov eax, [sz_name]
  297.             test eax, eax
  298.             jz .fail
  299.  
  300.             mov [srv_ptr], srv_tab
  301.             mov [counter], 16
  302. @@:
  303.             stdcall strncmp, [srv_ptr], [sz_name], 16
  304.             test eax, eax
  305.             je .ok
  306.  
  307.             add [srv_ptr], SRV_SIZE
  308.             dec [counter]
  309.             jnz @B
  310. .not_load:
  311.  
  312.            stdcall find_service, [sz_name]
  313.            test eax, eax
  314.            jz .fail
  315.  
  316.            stdcall load_lib, eax
  317.            test eax, eax
  318.            jz .fail
  319.  
  320.             mov [srv_ptr], srv_tab
  321.             mov [counter], 16
  322. @@:
  323.             stdcall strncmp, [srv_ptr], [sz_name], 16
  324.             test eax, eax
  325.             je .ok
  326.  
  327.             add [srv_ptr], SRV_SIZE
  328.             dec [counter]
  329.             jnz @B
  330. .fail:
  331.             xor eax, eax
  332.             ret
  333. .ok:
  334.             mov eax, [srv_ptr]
  335.             ret
  336. endp
  337.  
  338. align 4
  339. proc find_service stdcall ,sz_name:dword
  340.  
  341.            mov eax, [sz_name]
  342.            test eax, eax
  343.            jz .fail
  344.  
  345.            mov esi, services
  346. @@:
  347.            mov eax, [esi]
  348.            test eax, eax
  349.            jz .fail
  350.            push esi
  351.            stdcall strncmp, eax, [sz_name], 16
  352.            pop esi
  353.            test eax, eax
  354.            je .ok
  355.  
  356.            add esi, 8
  357.            jmp @B
  358. .ok:
  359.            mov eax, [esi+4]
  360.            ret
  361. .fail:
  362.            xor eax, eax
  363.            ret
  364. endp
  365.  
  366. align 4
  367. proc reg_service stdcall, sz_name:dword, handler:dword
  368.            locals
  369.              srv dd ?
  370.            endl
  371.  
  372.            mov eax, [sz_name]
  373.            test eax, eax
  374.            jz .fail
  375.  
  376.            mov ebx, [handler]
  377.            test ebx, ebx
  378.            jz .fail
  379.  
  380.            call alloc_service
  381.            test eax, eax
  382.            jz .fail
  383.  
  384.            mov [srv], eax
  385.            mov edi, eax
  386.            mov esi, [sz_name]
  387.            mov ecx, 16
  388.            rep movsb
  389.  
  390.            mov edi, eax
  391.            mov [edi+SRV.magic], ' SRV'
  392.            mov [edi+SRV.size], SRV_SIZE
  393.            mov ebx, [handler]
  394.            mov [edi+SRV.srv_proc], ebx
  395.            mov eax, [srv]
  396.            ret
  397. .fail:
  398.            xor eax, eax
  399.            ret
  400. endp
  401.  
  402. align 4
  403. proc get_proc stdcall, exp:dword, sz_name:dword
  404.  
  405.            mov edx, [exp]
  406. .next:
  407.            mov eax, [edx]
  408.            test eax, eax
  409.            jz .end
  410.  
  411.            push edx
  412.            stdcall strncmp, eax, [sz_name], 16
  413.            pop edx
  414.            test eax, eax
  415.            jz .ok
  416.  
  417.            add edx,8
  418.            jmp .next
  419. .ok:
  420.            mov eax, [edx+4]
  421. .end:
  422.            ret
  423. endp
  424.  
  425. align 4
  426. proc link_dll stdcall, exp:dword, imp:dword
  427.            mov esi, [imp]
  428. .next:
  429.            mov eax, [esi]
  430.            test eax, eax
  431.            jz .end
  432.  
  433.            push esi
  434.            stdcall get_proc, [exp], eax
  435.            pop esi
  436.  
  437.            test eax, eax
  438.            jz @F
  439.  
  440.            mov [esi], eax
  441. @@:
  442.            add esi, 4
  443.            jmp .next
  444. .end:
  445.            ret
  446. endp
  447.  
  448. align 4
  449. proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
  450.  
  451. @@:
  452.            stdcall strncmp, [pSym], [sz_sym], 8
  453.            test eax,eax
  454.            jz .ok
  455.            add [pSym], 18
  456.            dec [count]
  457.            jnz @b
  458.            xor eax, eax
  459.            ret
  460. .ok:
  461.            mov ebx, [pSym]
  462.            mov eax, [ebx+8]
  463.            ret
  464. endp
  465.  
  466. align 4
  467. proc load_lib stdcall, name:dword
  468.            locals
  469.              lib   dd ?
  470.              base  dd ?
  471.              pSym  dd ?
  472.            endl
  473.  
  474.            mov eax, [name]
  475.            mov    ebx, 1                 ;index of first block
  476.            mov    ecx, 32                ;number of blocks
  477.            mov    edx, TMP_BUFF          ;temp area
  478.            mov    esi, 12                ;file name length
  479.  
  480.            call   fileread              ;read file from RD
  481.  
  482.            cmp    eax,0
  483.            jne    .err
  484.  
  485. ;           mov eax, [TMP_BUFF+CFH.pSymTable]
  486. ;           add eax, TMP_BUFF
  487. ;           mov [pSym], eax
  488.  
  489. ;           mov [TMP_BUFF+20+CFS.VirtualAddress], eax
  490.  
  491.            stdcall kernel_alloc, [TMP_BUFF+20+CFS.SizeOfRawData]
  492.            mov [base], eax
  493.  
  494.            test eax, eax
  495.            jnz @f
  496. @@:
  497.            mov [TMP_BUFF+20+CFS.VirtualAddress], eax
  498.            mov ebx, [TMP_BUFF+CFH.pSymTable]
  499.            add ebx, TMP_BUFF
  500.            mov [pSym], ebx
  501.  
  502.            stdcall LinkSection, TMP_BUFF, TMP_BUFF+20, ebx
  503.  
  504.            mov edi, [base]
  505.            test edi, edi
  506.            jnz @f
  507. @@:
  508.            mov esi, [TMP_BUFF+20+CFS.PtrRawData]
  509.            add esi, TMP_BUFF
  510.            mov ecx, [TMP_BUFF+20+CFS.SizeOfRawData]
  511.            rep movsb
  512.  
  513.            call alloc_dll
  514.            test eax, eax
  515.            jnz @f
  516. @@:
  517.            mov [lib], eax
  518.  
  519.            mov edi, eax
  520.            mov esi, [name]
  521.            mov ecx, 16
  522.            rep movsb
  523.  
  524.            stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols],szSTART
  525.            mov edi, [lib]
  526.            add eax, [base]
  527.            mov [edi+LIB.lib_start], eax
  528.            mov ebx, [base]
  529.            mov [edi+LIB.lib_base], ebx
  530.  
  531.            stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szEXPORTS
  532.            mov edi, [lib]
  533.            add eax, [base]
  534.            mov [edi+LIB.export], eax
  535.  
  536.            stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szIMPORTS
  537.            mov edi, [lib]
  538.            add eax, [base]
  539.            mov [edi+LIB.import], eax
  540.  
  541.            stdcall link_dll, kernel_export, eax
  542.  
  543.            mov edi, [lib]
  544.            call [edi+LIB.lib_start]
  545.  
  546.            mov eax, [lib]
  547.            ret
  548. .err:
  549.            xor eax, eax
  550.            ret
  551.  
  552. endp
  553.  
  554. align 4
  555. proc LinkSection stdcall, pCoff:dword, pSec:dword, pSym:dword
  556.            locals
  557.              pCode     dd ?
  558.            endl
  559.  
  560.            mov esi, [pSec]
  561.            mov eax, [esi+CFS.PtrRawData]
  562.            add eax, [pCoff]
  563.            mov [pCode], eax
  564.  
  565.            mov edi, [esi+CFS.PtrReloc]
  566.            add edi, [pCoff]
  567.  
  568.            movzx edx, [esi+CFS.NumReloc]
  569.            mov eax, edx
  570.            lea edx, [edx+edx*8]
  571.            add edx, eax
  572.            add edx, edi
  573. .l_0:
  574.            cmp edi, edx
  575.            jae .exit
  576.  
  577.            mov ebx, [edi+CRELOC.SymIndex]
  578.            add ebx,ebx
  579.            lea ebx,[ebx+ebx*8]
  580.  
  581.            add ebx, [pSym]
  582.  
  583.            mov ecx, [ebx+CSYM.Value]
  584.            add ecx, [esi+CFS.VirtualAddress]
  585.  
  586.            mov eax, [edi+CRELOC.VirtualAddress]
  587.            add eax, [pCode]
  588.            add [eax], ecx
  589.            add edi, 10
  590.            jmp .l_0
  591.  
  592. .exit:
  593.            ret
  594. endp
  595.  
  596. proc get_curr_task
  597.            mov eax,[CURRENT_TASK]
  598.            shl eax, 8
  599.            ret
  600. endp
  601.  
  602. drv_sound      db 'UNISOUNDOBJ', 0
  603. drv_infinity   db 'INFINITYOBJ', 0
  604.  
  605. szSound        db 'SOUND',0
  606. szInfinity     db 'INFINITY',0
  607.  
  608. szSTART        db 'START',0
  609. szEXPORTS      db 'EXPORTS',0
  610. szIMPORTS      db 'IMPORTS',0
  611.  
  612. align 16
  613. services:
  614.            dd szSound,    drv_sound
  615.            dd szInfinity, drv_infinity
  616.            dd 0
  617.