;-----------------------------------------------------------------------------
proc dll.Load, import_table:dword
	mov		esi,[import_table]
.next_lib:
	mov		edx,[esi]
	or		edx,edx
	jz		.exit
	push	esi
	mov		esi,[esi+4]
	mov		edi,s_libdir.fname
@@:
	lodsb
	stosb
	or		al,al
	jnz		@b
	mcall	68,19,s_libdir
	or		eax,eax
	jz		.fail
	stdcall dll.Link,eax,edx
	stdcall dll.Init,[eax+4]
	pop		esi
	add		esi,8
	jmp		.next_lib
.exit:
	xor		eax,eax
	ret
.fail:
	add		esp,4
	xor		eax,eax
	inc		eax
	ret
endp
;-----------------------------------------------------------------------------
proc dll.Link, exp:dword,imp:dword
	push	eax
	mov		esi,[imp]
	test	esi,esi
	jz		.done
.next:
	lodsd
	test	eax,eax
	jz		.done
	stdcall dll.GetProcAddress,[exp],eax
	or		eax,eax
	jz		@f
	mov		[esi-4],eax
	jmp		.next
@@:
	mov		dword[esp],0
.done:
	pop		eax
	ret
endp
;-----------------------------------------------------------------------------
proc dll.Init, dllentry:dword
	pushad
	mov		eax,mem.Alloc ;libini_alloc 
	mov		ebx,mem.Free ;libini_free
	mov		ecx,mem.ReAlloc ;libini_realloc
	mov		edx,dll.Load
	stdcall [dllentry]
	popad
	ret
endp
;-----------------------------------------------------------------------------
proc dll.GetProcAddress, exp:dword,sz_name:dword
	mov		edx,[exp]
	xor		eax,eax
.next:
	or		edx,edx
	jz		.end
	cmp		dword[edx],0
	jz		.end
	stdcall strcmp,[edx],[sz_name]
	test	eax,eax
	jz		.ok
	add		edx,8
	jmp		.next
.ok:
	mov	eax,[edx+4]
  .end:
	ret
endp
;-----------------------------------------------------------------------------
proc strcmp, str1:dword,str2:dword
	push	esi edi
	mov		esi,[str1]
	mov		edi,[str2]
	xor		eax,eax
@@:
	lodsb
	scasb
	jne		.fail
	or		al,al
	jnz		@b
	jmp		.ok
.fail:
	or	eax,-1
.ok:
	pop	edi esi
	ret
endp
;-----------------------------------------------------------------------------
s_libdir:
  db '/sys/lib/'
  .fname rb 32
;-----------------------------------------------------------------------------
proc mem.Alloc,size
	push	ebx ecx
	mov		ecx,[size]
	mcall	68,12
	pop		ecx ebx
	ret
endp
;-----------------------------------------------------------------------------
proc mem.ReAlloc,mptr,size
	push	ebx ecx edx
	mov		ecx,[size]
	or		ecx,ecx
	jz		@f
@@:
	mov		edx,[mptr]
	or		edx,edx
	jz		@f
@@:
	mcall	68,20
	or		eax,eax
	jz		@f
@@:
	pop		edx ecx ebx
	ret
endp
;-----------------------------------------------------------------------------
proc mem.Free,mptr
	push	ebx ecx
	mov		ecx,[mptr]
	or		ecx,ecx
	jz		@f
@@:
	mcall	68,13
	pop		ecx ebx
	ret
endp
;-----------------------------------------------------------------------------