macro use_check_box { ch_text_margin=3 ch_size=10 ch_left equ [edi] ch_top equ [edi+2] ch_color equ [edi+4] ch_border_color equ [edi+8] ch_text_color equ [edi+12] ch_text_ptr equ [edi+16] ch_flags equ [edi+20] check_box: .draw: pusha mov eax,38 mov bx,ch_left push bx shl ebx,16 pop bx mov cx,ch_top push cx shl ecx,16 pop cx push cx add cx,ch_size mov edx,ch_border_color int 0x40 push bx add bx,ch_size ror ebx,16 add bx,ch_size int 0x40 pop bx pop cx int 0x40 add cx,ch_size push cx shl ecx,16 pop cx int 0x40 mov eax,13 mov bx,ch_left inc bx shl ebx,16 mov bx,ch_size dec bx push bx mov cx,ch_top inc cx shl ecx,16 pop cx mov edx,ch_color int 0x40 bt dword ch_flags,1 jnc @f call .draw_ch @@: call .get_text_n mov bx,ch_left add bx,(ch_size+ch_text_margin) shl ebx,16 mov bx,ch_top add bx,(ch_size-9+2) mov ecx,ch_text_color mov eax,4 int 0x40 popa ret .get_text_n: push eax xor esi,esi mov edx,ch_text_ptr @@: mov ah,[edx+esi] inc esi test ah,ah jnz @b dec esi pop eax ret .clear_ch: mov edx,ch_color jmp @f .draw_ch: mov edx,ch_border_color @@: mov bx,ch_left add bx,(ch_size/3) shl ebx,16 mov bx,(ch_size/2) push bx mov cx,ch_top add cx,(ch_size/3) shl ecx,16 pop cx mov eax,13 int 0x40 ret .mouse: pusha mov eax,37 mov ebx,2 int 0x40 bt eax,0 jc @f btr dword ch_flags,2 popa ret @@: bts dword ch_flags,2 jc .mouse_end call .get_text_n imul esi,6 add si,ch_text_margin mov eax,37 xor ebx,ebx inc ebx int 0x40 mov bx,ch_top cmp ax,bx jl .mouse_end add bx,ch_size cmp ax,bx jg .mouse_end shr eax,16 mov bx,ch_left cmp ax,bx jl .mouse_end add bx,ch_size add bx,si cmp ax,bx jg .mouse_end bts dword ch_flags,1 jc @f call .draw_ch jmp .mouse_end @@: btr dword ch_flags,1 call .clear_ch .mouse_end: popa ret } struc check_box left,top,color,border_color,text_color,text,flags { .left: dw left ;+0 .top: dw top ;+2 .color: dd color ;+4 .border_color: dd border_color ;+8 .text_color: dd text_color ;+12 .text: dd text ;+16 .flags: dd flags+0 ;+20 } ch_struc_size=24 macro draw_check_boxes start,end { mov edi,start mov ecx,((end-start)/ch_struc_size) @@: call check_box.draw add edi,ch_struc_size loop @b } macro mouse_check_boxes start,end { mov edi,start mov ecx,((end-start)/ch_struc_size) @@: call check_box.mouse add edi,ch_struc_size loop @b } macro check_boxes_set_sys_color start,end,color_table { mov edi,start mov ecx,((end-start)/ch_struc_size) mov esi,color_table @@: push dword [esi+32] pop dword ch_text_color push dword [esi+36] pop dword ch_border_color add edi,ch_struc_size loop @b }