; ======================================================================================
; = WinAmp v2.x Keygenerator - (C) 1999 Teraphy / Phrozen Crew - http://teraphy.cjb.net
; ======================================================================================

.486
.model		flat, stdcall

; -------- Include Files and Libraries -------------------------------------------------
include		windows.inc
include		elib32.inc
includelib	elib32.lib
include		kernel32.inc
includelib	kernel32.lib
include		user32.inc
includelib	user32.lib
; -------- UnInitialised Data ----------------------------------------------------------
.data?
szName		db 32 dup (?)
; -------- Program Code ----------------------------------------------------------------
.code
Start:

	; Print Message
        PrintM  "WinAmp v2.x *Keygen*",CrLf, \
                "(C) 1999 Teraphy",CrLf, \
                "Name  : "

        ; Read Name
        invoke  Input, addr szName, 30

        ; Check user input
        .IF eax == 0
                PrintM  "Error : Name too short"
		Exit	-1
        .ENDIF

        ; Calculate Serial#
        mov     esi,offset szName
	add	eax,esi
	mov	byte ptr [eax+1],0
	mov	byte ptr [eax+2],0
	xor	edi,edi
	xor	ebx,ebx
@@:
	movsx	eax,byte ptr [esi+2]
	movsx	ecx,byte ptr [esi]
	xor	eax,ecx
	movsx	ecx,byte ptr [esi+3]
	not	ecx
	not	eax
	movsx	edx,byte ptr [esi+1]
	xor	ecx,edx
	add	eax,ecx
        mov     ecx,edi
	and	ecx,0Fh
	shl	eax,cl
	test	eax,eax
	jl	LabelA
	add	ebx,eax
	jmp	LabelB
LabelA:
	sub	ebx,eax
LabelB:
	inc	edi
	inc	edi
	inc	esi
	cmp	byte ptr [esi],0
	jnz	@B
        mov     eax,ebx
        mov     ecx,0F4240h
        imul    eax,25h
        cdq
        idiv    ecx
        mov     ecx,edx
        mov     esi,edx
        imul    ecx,64h
        xor     edi,edi
LabelD:
        test    esi,esi
        je      LabelC
        mov     eax,esi
        cdq
        mov     ebx,64h
        idiv    ebx
        mov     eax,esi
        push    ebx
        pop     esi
        add     edi,edx
        cdq
        idiv    esi
        mov     esi,eax
        jmp     LabelD
LabelC:
        lea     eax, [edi+2*edi]
        cdq
        mov     esi,4
        idiv    esi
        mov     esi,64h
        cdq
        idiv    esi
        add     edx,ecx

	; Print Serial
	PrintFM	<"Serial: %lu">, edx

	; Exit
	Exit	0

end Start