Subversion Repositories Kolibri OS

Rev

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

  1. include '../proc32.inc'
  2.  
  3. format MS COFF
  4.  
  5. public _load_libconsole
  6.  
  7. public _con_init@20
  8. public _con_exit@4
  9. public _con_get_flags
  10. public _con_set_flags@4
  11. public _con_cls
  12. public _con_write_string@8
  13. public _con_getch2@0
  14. public _con_gets
  15. public con_set_title as '_con_set_title_ptr'
  16.  
  17. section '.text' align 16
  18.  
  19.  
  20. ;void* __fastcall getprocaddr(export, name)
  21. align 4
  22. getprocaddress:
  23.         push    esi
  24.         push    edi
  25.  
  26.         xor     eax, eax
  27.         test    ecx, ecx        ; If hlib = 0 then goto .end
  28.         jz      .end
  29. .next:
  30.         cmp     [ecx], dword 0  ; If end of export table then goto .end
  31.         jz      .end
  32.  
  33.         xor     eax, eax
  34.         mov     esi, [ecx]
  35.         mov     edi, edx        ; name
  36. .next_:
  37.         lodsb
  38.         scasb
  39.         jne     .fail
  40.         or      al, al
  41.         jnz     .next_
  42.         jmp     .ok
  43. .fail:
  44.         add     ecx, 8
  45.         jmp     .next
  46. .ok:
  47.         mov eax, [ecx + 4]      ; return address
  48. .end:
  49.         pop     edi
  50.         pop     esi
  51.         ret
  52.  
  53.  
  54. ;void fastcall dll_link(export, import)
  55.  
  56. align 4
  57. dll_link:
  58.         push    esi
  59.         push    ecx
  60.         mov     esi, edx
  61.         test    esi, esi
  62.         jz      .done
  63. .next:
  64.         mov     edx, [esi]
  65.         test    edx, edx
  66.         jz      .done
  67.         mov     ecx, [esp]
  68.         call    getprocaddress
  69.         test    eax, eax
  70.         jz      .done
  71.         mov     [esi], eax
  72.         add     esi, 4
  73.         jmp     .next
  74. .done:
  75.         pop     ecx
  76.         pop     esi
  77.         ret
  78.  
  79. align 4
  80. dll_load:
  81.         push    ebp
  82.         push    ebx
  83.         push    esi
  84.         push    edi
  85.  
  86.         mov     ebp, [esp+20]
  87. .next_lib:
  88.         mov     edx, [ebp]
  89.         test    edx, edx
  90.         jz      .exit
  91.  
  92.         mov     esi, [ebp+4]
  93.         mov     edi, s_libdir.fname
  94. @@:
  95.         lodsb
  96.         stosb
  97.         test  al, al
  98.         jnz @b
  99.  
  100.         mov     eax, 68
  101.         mov     ebx, 19
  102.         mov     ecx, s_libdir
  103.         int     0x40
  104.         test    eax, eax
  105.         jz      .fail
  106.  
  107.         mov     ecx, eax
  108.         call    dll_link
  109.         mov     eax, [ecx]
  110.         cmp     dword[eax], 'lib_'
  111.         jnz     @f
  112.  
  113.         mov     esi, [ecx+4]
  114.  
  115.         pushad
  116.         mov     eax, mem.Alloc
  117.         mov     ebx, mem.Free
  118.         mov     ecx, mem.ReAlloc
  119.         mov     edx, dll_load
  120.         call    esi
  121.         popad
  122. @@:
  123.         add     ebp, 8
  124.         jmp     .next_lib
  125. .exit:
  126.         pop     edi
  127.         pop     esi
  128.         pop     ebx
  129.         pop     ebp
  130.         xor     eax, eax
  131.         ret 4
  132. .fail:
  133.         pop     edi
  134.         pop     esi
  135.         pop     ebx
  136.         pop     ebp
  137.         inc     eax
  138.         ret 4
  139.  
  140. align 4
  141. _load_libconsole:
  142.         push    ebx
  143.         mov     eax, 40
  144.         mov     ebx, 1 shl 8
  145.         int     0x40
  146.         pop     ebx
  147.  
  148.         push    @IMPORT
  149.         call    dll_load
  150.         test    eax, eax
  151.         jnz     .fail
  152.         push    1
  153.         call    [con_start]
  154.         xor     eax, eax
  155. .fail:
  156.         ret
  157.  
  158. align 4
  159. _con_init@20:
  160.         jmp     [con_init]
  161.  
  162. align 4
  163. _con_exit@4:
  164.         jmp     [con_exit]
  165.  
  166. align 4
  167. _con_write_string@8:
  168.         jmp     [con_write_string]
  169.  
  170. _con_getch2@0:
  171.         jmp     [con_getch2]
  172.  
  173. _con_gets:
  174.         jmp     [con_gets]
  175.  
  176. _con_get_flags:
  177. _con_set_flags@4:
  178. _con_cls:
  179.         ret
  180.  
  181.  
  182. proc mem.Alloc, size
  183.         push    ebx ecx
  184.         mov     ecx, [size]
  185.         mov     eax, 68
  186.         mov     ebx, 12
  187.         int     0x40
  188.         pop     ecx ebx
  189.         ret
  190. endp
  191. ;-----------------------------------------------------------------------------
  192. proc mem.ReAlloc, mptr, size
  193.         push    ebx ecx edx
  194.         mov     ecx, [size]
  195.         test    ecx, ecx
  196.         jz      @f
  197. @@:
  198.         mov     edx, [mptr]
  199.         test    edx, edx
  200.         jz      @f
  201. @@:
  202.         mov     eax, 68
  203.         mov     ebx, 20
  204.         int     0x40
  205.         test    eax, eax
  206.         jz  @f
  207. @@:
  208.         pop edx ecx ebx
  209.         ret
  210. endp
  211. ;-----------------------------------------------------------------------------
  212. proc mem.Free, mptr
  213.         push    ebx ecx
  214.         mov     ecx,[mptr]
  215.         test    ecx,ecx
  216.         jz  @f
  217. @@:
  218.         mov     eax, 68
  219.         mov     ebx, 13
  220.         int     0x40
  221.         pop ecx ebx
  222.         ret
  223. endp
  224.  
  225. ;section '.ctors' align 4
  226. ;align 4
  227. ;dd _load_libconsole
  228.  
  229. section '.data' align 16
  230.  
  231. ; -------------------------
  232. macro library [lname,fname]
  233. {
  234.   forward
  235.     dd __#lname#_library_table__,__#lname#_library_name__
  236.   common
  237.     dd 0
  238.   forward
  239.     align 4
  240.     __#lname#_library_name__ db fname,0
  241. }
  242.  
  243. macro import lname,[name,sname]
  244. {
  245.   common
  246.     align 4
  247.     __#lname#_library_table__:
  248.   forward
  249.     if used name
  250.       name dd __#name#_import_name__
  251.     end if
  252.   common
  253.     dd 0
  254.   forward
  255.     if used name
  256.       align 4
  257.       __#name#_import_name__ db sname,0
  258.     end if
  259. }
  260.  
  261. align   4
  262. @IMPORT:
  263.  
  264. library console,        'console.obj'
  265.  
  266. import  console,                            \
  267.         con_start,      'START',            \
  268.         con_init,       'con_init',         \
  269.         con_exit,       'con_exit',         \
  270.         con_gets,       'con_gets',         \
  271.         con_cls,        'con_cls',          \
  272.         con_getch2,     'con_getch2',       \
  273.         con_set_cursor_pos, 'con_set_cursor_pos',\
  274.         con_write_string, 'con_write_string',\
  275.         con_get_flags,  'con_get_flags',    \
  276.         con_set_flags,  'con_set_flags',    \
  277.         con_set_title,  'con_set_title'
  278.  
  279. s_libdir:
  280.   db '/sys/lib/'
  281.   .fname rb 32
  282.