


// Original C code from scolsign.cpp/SCsign()
/*
    for(i=0;i<=16;i++) buf[i]=0;
    d=j=0;
    for(i=0;i<n;i++)
    {
	  	c=src[i];
      for(k=0;k<16;k++)
        {
          buf[(j+k)&15]+=d;
          d=d*c+1;
          d=(d+(d>>8))&255;
        }
      j=(j-1)&15;
    }
    for(i=0;i<16;i++)
    {
      c=(buf[i]>>2)&31;
      if (c<10) c+='0'; else c+='a'-10;  
      buf[i]=c;
    }
*/

int BLG_SCsignTYPESLOGIC(void *src, void *buf, int n, void *d, void *j, void *c)
{
	_asm
	{
		//Saving registries
		//push eax
		//push ebx
		//push ecx
		//push edx
		pushad
		//Init buf[]
		//Loop: for(i=0;i<=16;i++)
		mov eax, 0
		InitBuf:
			mov ebx, buf
			add ebx, eax
			xor cl, cl
			mov [ebx], cl
		inc eax
		cmp eax, 16
		jle InitBuf
		//Init vars: d,j set to 0
		mov [d], 0
		mov [j], 0
		//Loop: for(i=0;i<n;i++)
		mov ebx, 0
		LoopI:
			//Retrieving src: c=src[i]
			mov ecx, src
			add ecx, ebx
				xor eax, eax
			mov al, [ecx]
			mov [c], eax
			//Loop: for(k=0;k<16;k++)
			mov ecx, 0
			LoopK:
				//Updating buf: buf[(j+k)&15] += d
				mov eax, [j]
				add eax, ecx
				and eax, 15
				mov edx, buf
				add edx, eax
					xor eax, eax
				mov al, [edx]
				add eax, [d]
				mov [edx], al
				//Updating d: d=d*c+1
				//as d & c are "clipped" to 1 byte, mul result can not exceed eax capacity
				mov eax, [d]
				mul [c]				// mul eax, [c]
				inc eax
				//Updating d: d=(d+(d>>8))&255
				mov edx, eax
				shr edx, 8
				add eax, edx
				and eax, 255
				mov [d], eax
			inc ecx
			cmp ecx, 16
			jl	LoopK
			//Updating j: j=(j-1)&15
			mov eax, [j]
			dec eax
			and eax, 15
			mov [j], eax
		inc ebx
		cmp ebx, n
		jl	LoopI
		//Final buf update
		//Loop: for(i=0;i<16;i++)
		mov ebx, 0
		LoopI2:
			//Retrieving buf: c=(buf[i]>>2)&31
			mov ecx, buf
			add ecx, ebx
				xor eax, eax
			mov al, [ecx]
			shr al, 2
			and al, 31
			//Updating value: if (c<10) c+='0'; else c+='a'-10
			cmp al, 10
			jge Cmp10orMore
			add al, 48
			jmp CmpEnd
			Cmp10orMore:
			add al, 87
			CmpEnd:
			//Updating buf: buf[i]=c
			mov [ecx], al
		inc ebx
		cmp ebx, 16
		jl	LoopI2		
		//Restoring registries
		//pop edx
		//pop ecx
		//pop ebx
		//pop eax
		popad
	}
	return 0;
}


int BLG_SCincSign(void *dst, void *src, int len)
{
	_asm
	{
		//Saving registries
		push eax
		push ebx
		push ecx
		push edx
		
		
		//Restoring registries
		pop edx
		pop ecx
		pop ebx
		pop eax
	}
	return 0;
}