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 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+10],1 // 0 count pixel xy + 1
cmp byte ptr [rdi+0],5-1 // count pixel max $x > 5-1 $iWidth+1 ( fix $xr + $yr - 1 )
JB if_pixel01xy
    add rsi,999*5 // +999*1 = pixel $y + 5
    sub rsi,888*5-1 // -4*5-1 = pixel $x - 5-1 >  default x > 888*5 delay 8 bytes
mov [rdi+0],0 // reset count pixel x + 1 > chuyen xuong end loop1
add [rdi+8],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 rax,rsi // address pixel memory xy rsi = default
mov r11,25 // loop2 for = 1 to $25 > xr*yr
mov [rdi+18],0 // reset count pixel hex

loop2:
add [rdi+20],1 // 0 count pixel x + 1
cmp byte ptr [rdi+20],5-1 // count pixel max $x > 5-1 $iWidth+1
JB if_pixel02xy
    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 x + 1
if_pixel02xy:

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+18],1 // 0 count pixel hex find

cmp byte ptr [rdi+18],3 // count pixel hex > 3 = 1 exit loop2
JB ifx0y0
   mov [rdi+r13+0],rax // save address pixex xy > multi check pixel CASE01
   mov byte ptr [rdi+r13],1 // save count pixex xy >  path find CASE02
   add r13,8 // address get data check pixel r13+10(16) > multi check pixel CASE01

mov r11,1 // exit loop2
   mov rbx,1 // exit loop1 > find boss + enemy do xanh CASE03
ifx0y0:

add rax,4*1 // +4*1 =  pixel $x + 1
sub r11,1 // loop2 next = 1 to $25
JA loop2

//--------------------------------------------------------------

cmp byte ptr [rdi+0],5-1 // count pixel max $x > 5-1 $iWidth+1 ( fix $xr + $yr - 1 )
JB if_pixel01xy_fix
mov [rdi+0],0 // reset count pixel x + 1
if_pixel01xy_fix:

   add r13,1 // address get data check pixel > path find CASE02
add rsi,4*5 // +4*1 =  pixel $x + 5
sub rbx,1 // for loop1 -1 = 0 exit loop
JA loop1
pop rbp
pop rbx
pop rsi
pop rdi
ret

// loop1
// [rdi+0] = count pixel x + 1
// [rdi+8] = count pixex y + 1
// [rdi+10] = count pixex xy + 1

// loop2
// [rdi+18] = count pixel color
// [rdi+20] = count pixel x + 1
// [rdi+r13] = address get data

exit:
jmp returnhere

21AF2BB0000:
jmp newmem
nop
returnhere:

