Subversion Repositories Kolibri OS

Rev

Rev 206 | Rev 214 | 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.            jnz @F
  299.            ret
  300. @@:
  301.            mov [srv_ptr], srv_tab
  302.            mov [counter], 16
  303. @@:
  304.            stdcall strncmp, [srv_ptr], [sz_name], 16
  305.            test eax, eax
  306.            je .ok
  307.  
  308.            add [srv_ptr], SRV_SIZE
  309.            dec [counter]
  310.            jnz @B
  311. .not_load:
  312.            stdcall find_service, [sz_name]
  313.            test eax, eax
  314.            jnz @F
  315.            ret
  316. @@:
  317.            stdcall load_driver, eax
  318.            ret
  319. .ok:
  320.            mov eax, [srv_ptr]
  321.            ret
  322. endp
  323.  
  324. align 4
  325. proc find_service stdcall ,sz_name:dword
  326.  
  327.            mov eax, [sz_name]
  328.            test eax, eax
  329.            jz .fail
  330.  
  331.            mov esi, services
  332. @@:
  333.            mov eax, [esi]
  334.            test eax, eax
  335.            jz .fail
  336.            push esi
  337.            stdcall strncmp, eax, [sz_name], 16
  338.            pop esi
  339.            test eax, eax
  340.            je .ok
  341.  
  342.            add esi, 8
  343.            jmp @B
  344. .ok:
  345.            mov eax, [esi+4]
  346.            ret
  347. .fail:
  348.            xor eax, eax
  349.            ret
  350. endp
  351.  
  352. align 4
  353. proc reg_service stdcall, sz_name:dword, handler:dword
  354.            locals
  355.              srv dd ?
  356.            endl
  357.  
  358.            mov eax, [sz_name]
  359.            test eax, eax
  360.            jz .fail
  361.  
  362.            mov ebx, [handler]
  363.            test ebx, ebx
  364.            jz .fail
  365.  
  366.            call alloc_service
  367.            test eax, eax
  368.            jz .fail
  369.  
  370.            mov [srv], eax
  371.            mov edi, eax
  372.            mov esi, [sz_name]
  373.            mov ecx, 16
  374.            rep movsb
  375.  
  376.            mov edi, eax
  377.            mov [edi+SRV.magic], ' SRV'
  378.            mov [edi+SRV.size], SRV_SIZE
  379.            mov ebx, [handler]
  380.            mov [edi+SRV.srv_proc], ebx
  381.            mov eax, [srv]
  382.            ret
  383. .fail:
  384.            xor eax, eax
  385.            ret
  386. endp
  387.  
  388. align 4
  389. proc get_proc stdcall, exp:dword, sz_name:dword
  390.  
  391.            mov edx, [exp]
  392. .next:
  393.            mov eax, [edx]
  394.            test eax, eax
  395.            jz .end
  396.  
  397.            push edx
  398.            stdcall strncmp, eax, [sz_name], 16
  399.            pop edx
  400.            test eax, eax
  401.            jz .ok
  402.  
  403.            add edx,8
  404.            jmp .next
  405. .ok:
  406.            mov eax, [edx+4]
  407. .end:
  408.            ret
  409. endp
  410.  
  411. align 4
  412. proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
  413.  
  414. @@:
  415.            stdcall strncmp, [pSym], [sz_sym], 8
  416.            test eax,eax
  417.            jz .ok
  418.            add [pSym], 18
  419.            dec [count]
  420.            jnz @b
  421.            xor eax, eax
  422.            ret
  423. .ok:
  424.            mov ebx, [pSym]
  425.            mov eax, [ebx+8]
  426.            ret
  427. endp
  428.  
  429. align 4
  430. proc get_curr_task
  431.            mov eax,[CURRENT_TASK]
  432.            shl eax, 8
  433.            ret
  434. endp
  435.  
  436. align 4
  437. proc get_fileinfo stdcall, file_name:dword, info:dword
  438.            locals
  439.              cmd     dd ?
  440.              offset  dd ?
  441.                      dd ?
  442.              count   dd ?
  443.              buff    dd ?
  444.                      db ?
  445.              name    dd ?
  446.            endl
  447.  
  448.            xor eax, eax
  449.            mov ebx, [file_name]
  450.            sub ebx, new_app_base
  451.            mov ecx, [info]
  452.            sub ecx, new_app_base
  453.  
  454.            mov [cmd], 5
  455.            mov [offset], eax
  456.            mov [offset+4], eax
  457.            mov [count], eax
  458.            mov [buff], ecx
  459.            mov byte [buff+4], al
  460.            mov [name], ebx
  461.  
  462.            mov eax, 70
  463.            lea ebx, [cmd]
  464.            sub ebx, new_app_base
  465.            int 0x40
  466.            ret
  467. endp
  468.  
  469. align 4
  470. proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
  471.                                      bytes:dword
  472.            locals
  473.              cmd     dd ?
  474.              offset  dd ?
  475.                      dd ?
  476.              count   dd ?
  477.              buff    dd ?
  478.                      db ?
  479.              name    dd ?
  480.            endl
  481.  
  482.            xor eax, eax
  483.            mov ebx, [file_name]
  484.            mov ecx, [off]
  485.            mov edx, [bytes]
  486.            mov esi, [buffer]
  487.            sub ebx, new_app_base
  488.            sub esi, new_app_base
  489.  
  490.            mov [cmd], eax
  491.            mov [offset], ecx
  492.            mov [offset+4], eax
  493.            mov [count], edx
  494.            mov [buff], esi
  495.            mov byte [buff+4], al
  496.            mov [name], ebx
  497.  
  498.            mov eax, 70
  499.            lea ebx, [cmd]
  500.            sub ebx, new_app_base
  501.            int 0x40
  502.            ret
  503. endp
  504.  
  505. align 4
  506. proc load_file stdcall, file_name:dword
  507.            locals
  508.              attr       dd ?
  509.              flags      dd ?
  510.              cr_time    dd ?
  511.              cr_date    dd ?
  512.              acc_time   dd ?
  513.              acc_date   dd ?
  514.              mod_time   dd ?
  515.              mod_date   dd ?
  516.              file_size  dd ?
  517.  
  518.              file       dd ?
  519.              file2      dd ?
  520.            endl
  521.  
  522.            lea eax, [attr]
  523.            stdcall get_fileinfo, [file_name], eax
  524.            test eax, eax
  525.            jnz .fail
  526.  
  527.            mov eax, [file_size]
  528.  
  529.            stdcall kernel_alloc, [file_size]
  530.            mov [file], eax
  531.  
  532.            stdcall read_file, [file_name], eax, dword 0, [file_size]
  533.            cmp ebx, [file_size]
  534.            jne .cleanup
  535.  
  536.            mov eax, [file]
  537.            cmp dword [eax], 0x4B43504B
  538.            jne .exit
  539.  
  540.            stdcall kernel_alloc, [eax+4]
  541.  
  542.            test eax, eax
  543.            jz .cleanup
  544.  
  545.            mov [file2], eax
  546.            stdcall unpack, [file], eax
  547.            stdcall kernel_free, [file]
  548.            mov eax, [file2]
  549. .exit:
  550.            ret
  551. .cleanup:
  552.            stdcall kernel_free, [file]
  553. .fail:
  554.            xor eax, eax
  555.            ret
  556. endp
  557.  
  558. align 4
  559. proc get_proc_ex stdcall, proc_name:dword, imports:dword
  560.  
  561. .look_up:
  562.            mov edx, [imports]
  563.            test edx, edx
  564.            jz .end
  565.            mov edx, [edx]
  566.            test edx, edx
  567.            jz .end
  568. .next:
  569.            mov eax, [edx]
  570.            test eax, eax
  571.            jz .next_table
  572.  
  573.            push edx
  574.            stdcall strncmp, eax, [proc_name], 16
  575.            pop edx
  576.            test eax, eax
  577.            jz .ok
  578.  
  579.            add edx,8
  580.            jmp .next
  581. .next_table:
  582.            add [imports], 4
  583.            jmp .look_up
  584. .ok:
  585.            mov eax, [edx+4]
  586.            ret
  587. .end:
  588.            xor eax, eax
  589.            ret
  590. endp
  591.  
  592. align 4
  593. proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
  594.                       sym_count:dword, strings:dword, imports:dword
  595.            locals
  596.              retval dd ?
  597.            endl
  598.  
  599.            mov edi, [symbols]
  600.            mov [retval], 1
  601. .fix:
  602.            movzx ebx, [edi+CSYM.SectionNumber]
  603.            test ebx, ebx
  604.            jnz .internal
  605.            mov eax, dword [edi+CSYM.Name]
  606.            test eax, eax
  607.            jnz @F
  608.  
  609.            mov edi, [edi+4]
  610.            add edi, [strings]
  611. @@:
  612.            push edi
  613.            stdcall get_proc_ex, edi,[imports]
  614.            pop edi
  615.  
  616.            xor ebx, ebx
  617.            test eax, eax
  618.            jnz @F
  619.  
  620.            mov esi, msg_unresolved
  621.            call sys_msg_board_str
  622.            mov esi, edi
  623.            call sys_msg_board_str
  624.            mov esi, msg_CR
  625.            call sys_msg_board_str
  626.  
  627.            mov [retval],0
  628. @@:
  629.            mov edi, [symbols]
  630.            mov [edi+CSYM.Value], eax
  631.            jmp .next
  632. .internal:
  633.            dec ebx
  634.            shl ebx, 3
  635.            lea ebx, [ebx+ebx*4]
  636.            add ebx, [sec]
  637.  
  638.            mov eax, [ebx+CFS.VirtualAddress]
  639.            add [edi+CSYM.Value], eax
  640. .next:
  641.            add edi, CSYM_SIZE
  642.            mov [symbols], edi
  643.            dec [sym_count]
  644.            jnz .fix
  645.            mov eax, [retval]
  646.            ret
  647. endp
  648.  
  649. align 4
  650. proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
  651.            locals
  652.              n_sec     dd ?
  653.            endl
  654.  
  655.            mov eax, [coff]
  656.            movzx ebx, [eax+CFH.nSections]
  657.            mov [n_sec], ebx
  658. .fix_sec:
  659.            mov esi, [sec]
  660.            mov edi, [esi+CFS.PtrReloc]
  661.            add edi, [coff]
  662.  
  663.            movzx ecx, [esi+CFS.NumReloc]
  664.            test ecx, ecx
  665.            jz .next
  666. .next_reloc:
  667.            mov ebx, [edi+CRELOC.SymIndex]
  668.            add ebx,ebx
  669.            lea ebx,[ebx+ebx*8]
  670.            add ebx, [sym]
  671.  
  672.            mov edx, [ebx+CSYM.Value]
  673.  
  674.            cmp [edi+CRELOC.Type], 6
  675.            je .dir_32
  676.  
  677.            cmp [edi+CRELOC.Type], 20
  678.            jne .next_reloc
  679. .rel_32:
  680.            mov eax, [edi+CRELOC.VirtualAddress]
  681.            add eax, [esi+CFS.VirtualAddress]
  682.            sub edx, eax
  683.            sub edx, 4
  684.            jmp .fix
  685. .dir_32:
  686.            mov eax, [edi+CRELOC.VirtualAddress]
  687.            add eax, [esi+CFS.VirtualAddress]
  688. .fix:
  689.            add [eax], edx
  690.            add edi, 10
  691.            dec ecx
  692.            jnz .next_reloc
  693. .next:
  694.            add [sec], COFF_SECTION_SIZE
  695.            dec [n_sec]
  696.            jnz .fix_sec
  697. .exit:
  698.            ret
  699. endp
  700.  
  701. align 4
  702. proc load_driver stdcall, file_name:dword
  703.            locals
  704.              coff      dd ?
  705.              sym       dd ?
  706.              strings   dd ?
  707.              img_size  dd ?
  708.              img_base  dd ?
  709.              start     dd ?
  710.  
  711.              exports   dd ?   ;fake exports table
  712.                        dd ?
  713.            endl
  714.  
  715.            stdcall load_file, [file_name]
  716.            test eax, eax
  717.            jz .fail
  718.  
  719.            mov [coff], eax
  720.  
  721.            movzx ecx, [eax+CFH.nSections]
  722.            xor ebx, ebx
  723.  
  724.            lea edx, [eax+20]
  725. @@:
  726.            add ebx, [edx+CFS.SizeOfRawData]
  727.            add ebx, 15
  728.            and ebx, not 15
  729.            add edx, COFF_SECTION_SIZE
  730.            dec ecx
  731.            jnz @B
  732.            mov [img_size], ebx
  733.  
  734.            stdcall kernel_alloc, ebx
  735.            test eax, eax
  736.            jz .fail
  737.            mov [img_base], eax
  738.  
  739.            mov edi, eax
  740.            xor eax, eax
  741.            mov ecx, [img_size]
  742.            add ecx, 4095
  743.            and ecx, not 4095
  744.            shr ecx, 2
  745.            cld
  746.            rep stosd
  747.  
  748.            mov edx, [coff]
  749.            movzx ebx, [edx+CFH.nSections]
  750.            mov edi, [img_base]
  751.            lea eax, [edx+20]
  752. @@:
  753.            mov [eax+CFS.VirtualAddress], edi
  754.            mov esi, [eax+CFS.PtrRawData]
  755.            test esi, esi
  756.            jnz .copy
  757.            add edi, [eax+CFS.SizeOfRawData]
  758.            jmp .next
  759. .copy:
  760.            add esi, edx
  761.            mov ecx, [eax+CFS.SizeOfRawData]
  762.            cld
  763.            rep movsb
  764. .next:
  765.            add edi, 15
  766.            and edi, not 15
  767.            add eax, COFF_SECTION_SIZE
  768.            dec ebx
  769.            jnz @B
  770.  
  771.            mov ebx, [edx+CFH.pSymTable]
  772.            add ebx, edx
  773.            mov [sym], ebx
  774.            mov ecx, [edx+CFH.nSymbols]
  775.            add ecx,ecx
  776.            lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
  777.            add ecx, [sym]
  778.            mov [strings], ecx
  779.  
  780.            lea ebx, [exports]
  781.            mov dword [ebx], kernel_export
  782.            mov dword [ebx+4], 0
  783.            lea eax, [edx+20]
  784.  
  785.            stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
  786.                                      [strings], ebx
  787.            test eax, eax
  788.            jnz @F
  789.  
  790.            mov esi, msg_module
  791.            call sys_msg_board_str
  792.            mov esi, [file_name]
  793.            call sys_msg_board_str
  794.            mov esi, msg_CR
  795.            call sys_msg_board_str
  796.  
  797.            stdcall kernel_free,[coff]
  798.            xor eax, eax
  799.            ret
  800. @@:
  801.            mov ebx, [coff]
  802.            add ebx, 20
  803.            stdcall fix_coff_relocs, [coff], ebx, [sym]
  804.  
  805.            mov ebx, [coff]
  806.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
  807.            mov [start], eax
  808.  
  809.            stdcall kernel_free, [coff]
  810.  
  811.            mov ebx, [start]
  812.            call ebx
  813.            test eax, eax
  814.            jnz .ok
  815.  
  816.            stdcall kernel_free, [img_base]
  817.            xor eax, eax
  818.            ret
  819. .ok:
  820.            mov ebx, [img_base]
  821.            mov [eax+SRV.base], ebx
  822.            ret
  823. .fail:
  824.            xor eax, eax
  825.            ret
  826. endp
  827.  
  828. align 4
  829. proc load_library stdcall, file_name:dword
  830.            locals
  831.              coff      dd ?
  832.              sym       dd ?
  833.              strings   dd ?
  834.              img_size  dd ?
  835.              img_base  dd ?
  836.              exports   dd ?
  837.            endl
  838.  
  839.            cli
  840.  
  841.            stdcall load_file, [file_name]
  842.  
  843.            test eax, eax
  844.            jz .fail
  845.  
  846.            mov [coff], eax
  847.            movzx ecx, [eax+CFH.nSections]
  848.            xor ebx, ebx
  849.  
  850.            lea edx, [eax+20]
  851. @@:
  852.            add ebx, [edx+CFS.SizeOfRawData]
  853.            add ebx, 15
  854.            and ebx, not 15
  855.            add edx, COFF_SECTION_SIZE
  856.            dec ecx
  857.            jnz @B
  858.            mov [img_size], ebx
  859.  
  860.            call init_heap
  861.            stdcall user_alloc, [img_size]
  862.  
  863.            test eax, eax
  864.            jz .fail
  865.            mov [img_base], eax
  866.  
  867.            mov edx, [coff]
  868.            movzx ebx, [edx+CFH.nSections]
  869.            mov edi, [img_base]
  870.            lea eax, [edx+20]
  871. @@:
  872.            mov [eax+CFS.VirtualAddress], edi
  873.            mov esi, [eax+CFS.PtrRawData]
  874.            test esi, esi
  875.            jnz .copy
  876.            add edi, [eax+CFS.SizeOfRawData]
  877.            jmp .next
  878. .copy:
  879.            add esi, edx
  880.            add edi, new_app_base
  881.            mov ecx, [eax+CFS.SizeOfRawData]
  882.            cld
  883.            rep movsb
  884. .next:
  885.            add edi, 15-new_app_base
  886.            and edi, not 15
  887.            add eax, COFF_SECTION_SIZE
  888.            dec ebx
  889.            jnz @B
  890.  
  891.            mov ebx, [edx+CFH.pSymTable]
  892.            add ebx, edx
  893.            mov [sym], ebx
  894.            mov ecx, [edx+CFH.nSymbols]
  895.            add ecx,ecx
  896.            lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
  897.            add ecx, [sym]
  898.            mov [strings], ecx
  899.  
  900.            lea eax, [edx+20]
  901.  
  902.            stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
  903.                                      [strings], dword 0
  904.            test eax, eax
  905.            jnz @F
  906.  
  907. @@:
  908.            mov edx, [coff]
  909.            movzx ebx, [edx+CFH.nSections]
  910.            mov edi, new_app_base
  911.            lea eax, [edx+20]
  912. @@:
  913.            add [eax+CFS.VirtualAddress], edi  ;patch user space offset
  914.            add eax, COFF_SECTION_SIZE
  915.            dec ebx
  916.            jnz @B
  917.  
  918.            add edx, 20
  919.            stdcall fix_coff_relocs, [coff], edx, [sym]
  920.  
  921.            mov ebx, [coff]
  922.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
  923.            mov [exports], eax
  924.  
  925.            stdcall kernel_free, [coff]
  926.            mov eax, [exports]
  927.            ret
  928. .fail:
  929.            xor eax, eax
  930.            ret
  931. endp
  932.  
  933.  
  934. drv_sound      db '/rd/1/drivers/unisound.obj', 0
  935. drv_infinity   db '/rd/1/drivers/infinity.obj', 0
  936.  
  937. szSound        db 'SOUND',0
  938. szInfinity     db 'INFINITY',0
  939.  
  940. szSTART        db 'START',0
  941. szEXPORTS      db 'EXPORTS',0
  942. szIMPORTS      db 'IMPORTS',0
  943.  
  944. msg_unresolved db 'unresolved ',0
  945. msg_module     db 'in module ',0
  946. msg_CR         db  13,10,0
  947.  
  948. align 16
  949. services:
  950.            dd szSound,    drv_sound
  951.            dd szInfinity, drv_infinity
  952.            dd 0
  953.