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

//		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,1122334455667788 // address pixel memory xy rsi = default or address
mov r11,25 // loop2 for = 1 to $25 > xr*yr
mov [rdi+20],0 // reset 0 count pixel x + 1

loop2:
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 0 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
    mov [rdi+r13+8],rax // save address pixex xy > multi check pixel CASE01
    mov r11,1 // exit loop2
ifx0y0:

add rax,4*1 // +4*1 =  pixel $x + 1
add [rdi+20],1 // 0 count pixel x + 1
sub r11,1 // loop2 next = 1 to $25
JA loop2

//--------------------------------------------------------------

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:

