; ======================================================================================
; = AxMan v3.01 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
; -------- Initialised Data ------------------------------------------------------------
.data
szSerial	db '000-000-000',0
StringFmat	db '%s%sMy Love',0
Fmat		db '%lu',0
; -------- UnInitialised Data ----------------------------------------------------------
.data?
szName		db 32 dup (?)
szCompany	db 32 dup (?)
szBuffer	db 99 dup (?)
; -------- Program Code ----------------------------------------------------------------
.code
Start:

	; Print Message
        PrintM  "AxMan v3.01 *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

        ; Read Company
	PrintM	"Company: "
        invoke  Input, addr szCompany, 30

        ; Calculate Serial#
	mov	esi, offset szName
	mov	edi, offset szName
@@:
	lodsb
	.IF al >= 'A' && al <= 'Z'
		add	al,20h
		stosb
	.ELSEIF al != 20h
		stosb
	.ENDIF
	or	al,al
	jnz	@B

	mov	esi, offset szCompany
	mov	edi, offset szCompany
@@:
	lodsb
	.IF al >= 'A' && al <= 'Z'
		add	al,20h
		stosb
	.ELSEIF al != 20h
		stosb
	.ENDIF
	or	al,al
	jnz	@B


	invoke	wsprintf, addr szBuffer, addr StringFmat, addr szName, addr szCompany

	xor	ecx,ecx
	mov	ebx, offset szBuffer
@LabelA:
	movzx	eax, byte ptr [ebx]
	or	al,al
	jz	@LabelB
	shl	ecx,4
	add	ecx,eax
	inc	bx
	mov	eax,ecx
	and	eax,0F0000000h
	jz	@LabelC
	mov	esi,eax
	shr	esi,18h
	xor	ecx,esi
@LabelC:
	not	eax
	and	ecx,eax
	jmp	@LabelA
@LabelB:
	invoke	wsprintf, addr szBuffer, addr Fmat, ecx

	xor	bx,bx
	mov	esi, offset szBuffer
	mov	edi, offset szSerial
@LabelE:
	lodsb
	or	al,al
	jz	@LabelD
	.IF bx == 3
		mov	bx, 1
		inc	di
	.ELSE
		inc	bx
	.ENDIF
	stosb
	jmp	@LabelE
@LabelD:

	; Print Serial
	PrintFM	<"Serial : %s">, addr szSerial

	; Exit
	Exit	0

end Start