alloc(newmem,2048,21AF2BB0000) 
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here

originalcode:
// DllCallAddress("uint:cdecl", DllStructGetPtr($tCodeBuffer), "ptr", DllStructGetPtr($tPixelData), "ptr", DllStructGetPtr($tStruct_ARGB), "int", $iPixels)
// ;64Bit! -> ;first 4 parameters will be saved in rcx,rdx,r8,r9
push rdi
push rsi
push rbx
push rbp

mov rsi,rcx // ;pointer to first pixel in memory from the bmp > address check $tPixelData
mov rdi,rdx // ;pointer to memory from struct                 > address save $tStruct_ARGB
mov rbx,r8 // ;amount of pixels                               > max pixel $iPixels

mov r13,100 // address get data check pixel r13

// mov rax,[rsi] // address pixel memory xy
// R11 R13 gia tri 0x0 co the dung


loop1:

add [rdi+0],1 // 0 count pixel x + 1
add [rdi+8],1 // count pixex xy
cmp byte ptr [rdi+0],5 // count pixel max $x > 5-1
JB if_pixel01xy
    add rsi,999*5 // +999*1 = pixel $y + 5
    sub rsi,888*5 // -4*5 = pixel x - 5 >  default x > 888*5 de lay 8 bytes
mov [rdi+0],0 // reset count pixel x y
add [rdi+C],1 // count pixex y + 1
if_pixel01xy:


//		An 5x5 dimension bmp: = -2 -1 0 +1 +2
//			X0	X1	X2	X3	X4
//		Y0 	1   2	3	4	5
//		Y1	6	7	8	9	10
//		Y2	11	12	13	14	15
//		Y3	16	17	18	19	20
//		Y4	21	22	23	24	25
//---------------------------------------------------------------
mov r11,25 // loop2 for = 1 to $25
mov rax,rsi // address pixel memory xy rsi = default
loop2:

add [rdi+20],1 // 0 count pixel x + 1
add [rdi+28],1 // count pixex xy
cmp byte ptr [rdi+20],5 // count pixel max $x > 5-1
JB if_pixel01xy
    add rax,999*1 // +999*1 = pixel $y + 1
    sub rax,888*1 // -4*5 = pixel x - 5 >  default x > 888*5 de lay 8 bytes
mov [rdi+20],0 // reset count pixel xy
add [rdi+2C],1 // count pixex y + 1
if_pixel01xy:


cmp byte ptr [rax+0],77 // pixel xy Opt1 > Opt2 0xFF0000 0x70
JNAE ifx0y0
cmp byte ptr [rax+0],99 // pixel xy Opt1 < Opt2 0xFF0000 0xFF
JNBE ifx0y0
cmp byte ptr [rax+1],77 // pixel xy Opt1 > Opt2 0x00FF00 0x70
JNAE ifx0y0
cmp byte ptr [rax+1],99 // pixel xy Opt1 < Opt2 0x00FF00 0xFF
JNBE ifx0y0
cmp byte ptr [rax+2],77 // pixel xy Opt1 > Opt2 0x0000FF 0x70
JNAE ifx0y0
cmp byte ptr [rax+2],99 // pixel xy Opt1 < Opt2 0x0000FF 0xFF
JNBE ifx0y0
add byte ptr [rdi+10],1 // 0 count pixel find

cmp byte ptr [rdi+10],3 // count pixel > 3 = 1 exit loop2
JB ifx0y0
//mov rax,[rdi+8] // del address pixel memory xy > count pixex xy > multi check pixel
//mov [rdi+r13],rax // save count pixex xy > multi check pixel
//add r13,8 // address get data check pixel r13+8 > multi check pixel
mov [rdi+r13],1 // save count pixex xy >  path find

mov [rdi+10],0 // reset count pixel
mov r11,1 // exit loop2
ifx0y0:





add r13,1 // address get data check pixel r13+8 > path find
add rax,4*1 // +4*1 =  pixel $x + 1
sub r11,1 // loop2 next = 1 to $25
JB loop2
//--------------------------------------------------------------


add rsi,4*1 // +4*1 =  pixel $x + 1
sub rbx,1 // for loop1 -1 = 0 exit loop
JA loop1


// loop1
// [rdi+0] = count x y pixel
// [rdi+8] = count pixex x + 1
// [rdi+C] = count pixex y + 1
// [rdi+10] = count pixel color

// loop2
// [rdi+20] = count x y pixel
// [rdi+28] = count pixex x + 1
// [rdi+2C] = count pixex y + 1
// [rdi+10] = count pixel color

// [rdi+30] = address get data


pop rbp
pop rbx
pop rsi
pop rdi
ret

exit:
jmp returnhere

21AF2BB0000:
jmp newmem
nop
returnhere:

