; LuhnA - Luhn algorithm
; by Albom

use32
 org 0
 db 'MENUET01'
 dd 1
 dd _start
 dd _end
 dd _memory
 dd _stack
 dd _param
 dd 0

include '../../macros.inc'


align 4
_start:

 mov al, [_param]
 test al, al
 jz exit

 call luhna
 xor edx, edx
 mov ecx, 10
 div ecx

 test edx, edx
 jz valid
 mov ebx, msg_not
 jmp print
valid:
 mov ebx, msg_valid

print:
 mov [notifyapp+2*4], ebx
 mcall 70, notifyapp


exit:
 mcall -1




align 4
luhna:
 xor edx, edx
 xor ecx, ecx
 xor eax, eax
 mov esi, _param
@@:
 lodsb
 test al, al
 jz .exit
 sub al, '0'
 mov dl, [odd+eax]
 add ecx, edx
 lodsb
 test al, al
 jz .exit
 sub al, '0'
 add ecx, eax
 jmp @b
.exit:
 mov eax, ecx
 ret

align 4
msg_not   db 'NOT '
msg_valid db 'VALID', 0

align 4
odd: db  0, 2, 4, 6, 8, 1, 3, 5, 7, 9

align 4
notifyapp:
	dd 7
	dd 0
	dd 0 ;  ¤à¥á á®®¡é¥­¨ï
	dd 0
	dd 0
	db '@notify', 0


_end:
align 4
 rb 256
_stack:
align 4
_param rb 256
_memory: