;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                       ;
;    DIALOGS1.INC                                       ;
;                                                       ;
;    COMPILE WITH FASM for MENUET                       ;
;                                                       ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


menus     dd   3        ; number of menus
m_x       dd   0x5      ; x start
m_y       dd   20       ; y start
m_xs      dd   290      ; x size
m_ys      dd   14       ; y size
g_stack   dd   0xf000   ; thread stack - required


menu:; AB C           D            E            F            G

  db  '*D FILE        +Save File   +Load File   +-           +Quit        '
  db  '*B EDIT        +Copy        +Paste       '
  db  '*B HELP        +Setup       +About..     '
  db    '@' ; end mark

;  A   : Data type '*' -> New menu , '+' -> menu selection
;  B   : Number of selections in menu (A+)
;  C   : Menu header text
;  D-G : Menu selection text

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  DATA BELOW IS FOR DIALOGS1.INC INTERNALS

menu_action dd '----'

window_on   db 0

g_n         dd -1
g_x         dd 0x0
g_t         dd 0x0
g_1         dd 0x0
g_l         dd 0x0
closet      db 0

table: times 1024 db 0

last_mouse  dd  0x0

mo_x       dd 0x0
mo_y       dd 0x0


check_mouse:

     pusha

     cmp  [window_on],1
     je   no_open

     mov  eax,37
     mov  ebx,2
     mcall

     cmp  [window_on],0
     jne  openw2

     cmp  eax,0
     je   no_open

  openw2:

   waitformouse:

     mov  eax,23
     mov  ebx,2
     mcall

     cmp  eax,0
     jne  no_open

     mov  eax,37
     mov  ebx,2
     mcall

     cmp  eax,0
     jne  waitformouse


     mov  eax,37
     mov  ebx,1
     mcall

     mov  esi,eax

     shr  eax,16
     xor  edx,edx
     mov  ebx,50
     div  ebx
     mov  edx,eax
     cmp  edx,[g_n]
     je   no_open
     cmp  edx,[menus]
     jge  no_open
     mov  eax,esi

     and  eax,0xffff

     mov  ebx,[m_y]
     cmp  eax,ebx
     jbe  no_open
     add  ebx,[m_ys]
     cmp  eax,ebx
     jge  no_open

     cmp  [window_on],0
     je   noww

     mov  [closet],1
     mov  ecx,100
   waitm:
     mov  eax,5
     mov  ebx,1
     mcall
     dec  ecx
     jz   no_open
     cmp  [window_on],0
     jne  waitm
   noww:

     mov  eax,edx
     jmp  cll

   no_open:

     mov  [last_mouse],esi

     popa

     ret

   cll:

     mov  [window_on],2

     mov  [g_n],eax
     mov  [g_x],96
     mov  [g_t],0
     mov  [g_1],1

     mov  eax,9
     mov  ebx,table
     mov  ecx,-1
     mcall

     mov  eax,[table+34]
     mov  [mo_x],eax
     mov  eax,[table+38]
     mov  [mo_y],eax

     mov  eax,51
     mov  ebx,1
     mov  ecx,alert_entry
     mov  edx,[g_stack]
     mcall

     mov  [esp+28],dword 0  ; clear button entry

     mov  [menu_action],'MD  '

   check_gr:

     popa

     ret


draw_menu:

     mov  eax,9
     mov  ebx,table
     mov  ecx,-1
     mcall

     cmp  [table+46],dword 30
     jb   drmr

     mov  eax,13     ; white background
     mov  ebx,[m_x]
     shl  ebx,16
     add  ebx,[m_xs]
     inc  ebx
     mov  ecx,[m_y]
     shl  ecx,16
     add  ecx,[m_ys]
     mov  edx,0xf0f8ff
     mcall

     mov  eax,38     ; egde lines
     mov  ebx,[m_x]
     shl  ebx,16
     add  ebx,[m_x]
     add  ebx,[m_xs]
     mov  ecx,[m_y]
     shl  ecx,16
     add  ecx,[m_y]
     mov  edx,0x000000
     mcall
     mov  eax,38
     mov  ecx,[m_y]
     add  ecx,[m_ys]
     shl  ecx,16
     add  ecx,[m_y]
     add  ecx,[m_ys]
     mcall

     mov  esi,menu-1
     mov  edi,[m_x]
     mov  ebp,1
    new_menu:
     inc  esi

     cmp  [esi],byte '*'
     jne  drmnl1
     push esi
     mov  eax,4
     mov  ebx,edi
     shl  ebx,16
     add  ebx,[m_y]
     add  ebx,0x00050004
     mov  ecx,0x000000
     mov  edx,esi
     add  edx,3
     mov  esi,12
     mcall    ; draw text
     pop  esi
     add  esi,2
     add  edi,50
     inc  ebp

    drmnl1:
     cmp  [esi],byte '@'
     jne  new_menu

    drmr:

     ret

alert_box:

   ; eax : x size - min 200
   ; ebx : pointer to ASCIIZ - max 128 character text
   ; ecx : button 1 id          ( OK or YES )
   ; edx : button 2 id or zero  ( NO )


   cmp  [window_on],0
   jne  alert_box_return

   mov  [window_on],1

   cmp  eax,100
   jg   size_ok
   mov  eax,100
 size_ok:

   mov  [g_x],eax
   mov  [g_t],ebx
   mov  [g_1],ecx

   mov  ecx,0
 new_search:
   cmp  [ebx],byte 0
   je   found_len
   inc  ebx
   inc  ecx
   cmp  ecx,128
   jbe  new_search
 found_len:
   mov  [g_l],ecx

   mov  eax,51
   mov  ebx,1
   mov  ecx,alert_entry
   mov  edx,[g_stack]
   mcall

   mov  [menu_action],'MA  '

 alert_box_return:

   ret

alert_entry:

     call alert_draw_window

alert_still:

    mov  eax,23                 ; wait here for event
    mov  ebx,1
    mcall

    cmp  eax,1                  ; redraw request ?
    je   alert_red
    cmp  eax,2                  ; key in buffer ?
    je   alert_key
    cmp  eax,3                  ; button in buffer ?
    je   alert_button

    cmp  [closet],0
    jne  ccc

    mov  eax,9
    mov  ebx,table
    mov  ecx,-1
    mcall

    cmp  ax,[table+4]
    je   no_close
  ccc:
    mov  [closet],0
    mov  [g_n],-1
    mov  [menu_action],'----'
    mov  [window_on],0
    mov  eax,-1
    mcall
  no_close:

    jmp  alert_still

  alert_red:                          ; redraw
    call alert_draw_window
    jmp  alert_still

  alert_key:                    ; key
    mov  eax,2                  ; just read it and ignore
    mcall
    jmp  alert_still

  alert_button:                 ; button
    mov  eax,17                 ; get id
    mcall

    shr  eax,8
    cmp  eax,3
    jg   no_action1
    dec  eax
    shl  eax,2
    mov  eax,dword [eax+rtext]
    mov  [menu_action],eax
    jmp  action_done
  no_action1:
    sub  eax,16
    add  eax,65
    shl  eax,8
    mov  ebx,[g_n]
    add  ebx,65
    add  eax,ebx
    mov  [menu_action],eax

  action_done:

    mov  [closet],0
    mov  [g_n],-1
    mov  [window_on],0
    mov  eax,-1                 ; close this program
    mcall

  rtext db 'NO  YES OK  '

    jmp  alert_still


;   *********************************************
;   *******  WINDOW DEFINITIONS AND DRAW ********
;   *********************************************


alert_draw_window:


    mov  eax,12                    ; function 12:tell os about windowdraw
    mov  ebx,1                     ; 1, start of draw
    mcall

    cmp  [window_on],2
    jne  no_win_type_2

    mov  edx,menu-1
    mov  ecx,[g_n]
    add  ecx,1
   find_menu:
    inc  edx
    cmp  [edx],byte '*'
    je   menu_loop
    jmp  find_menu
   menu_loop:
    loop find_menu
    movzx ebp,byte [edx+1]
    sub  ebp,64
    push edx
                                   ; DRAW WINDOW
    mov  eax,0                     ; function 0 : define and draw window
    mov  ebx,[g_n]
    imul ebx,50
    add  ebx,[mo_x]
    add  ebx,[m_x]
    shl  ebx,16
    add  ebx,[g_x]
    mov  ecx,[mo_y]
    add  ecx,[m_y]
    add  ecx,[m_ys]
    shl  ecx,16
    mov  edx,14
    imul edx,ebp
    add  edx,7
    add  ecx,edx
    mov  edx,0x00ffffff            ; color of work area RRGGBB,8->color gl
    mov  esi,0x00ffffff            ; color of grab bar  RRGGBB,8->color gl
    mov  edi,0x000000cc            ; color of frames    RRGGBB
    mcall

    pop  edx

    mov  ebx,5*65536+7            ; draw info text with function 4
    mov  ecx,0x10000000
    mov  esi,12
    mov  ebp,16
  no_d_found:
    inc  edx
    cmp  [edx],byte '*'
    je   d_drawed
    cmp  [edx],byte '@'
    je   d_drawed
    cmp  [edx],byte '+'
    jne  no_d_found
    inc  edx
    pusha          ; draw button
    mov  eax,8
    mov  ecx,ebx
    mov  ebx,[g_x]
    add  ebx,0x0000fffe
    shl  ecx,16
    add  ecx,0xfffc0000+14
    mov  edx,0x40000000
    add  edx,ebp
    mov  esi,0
    mcall
    popa
    mov  eax,4     ; draw text
    mcall
    inc  ebp
    add  ebx,14
    jmp  no_d_found
  d_drawed:

  no_win_type_2:


    cmp  [window_on],1
    jne  no_win_1

    mov  eax,14                    ; to middle of screen
    mcall
    mov  ecx,eax
    and  ecx,0xffff
    shr  ecx,1
    shr  eax,1
    mov  ebx,[g_x]
    shr  ebx,1
    shl  ebx,16
    sub  eax,ebx
    mov  ebx,eax

    mov  eax,0                     ; function 0 : define and draw window
    mov  bx,word [g_x]
    sub  ecx,80
    shl  ecx,16
    mov  cx,110                    ; [y start] *65536 + [y size]
    mov  edx,0x02ffffff            ; color of work area RRGGBB,8->color gl
    mov  esi,0x80d05050            ; color of grab bar  RRGGBB,8->color gl
    mov  edi,0x00d05050            ; color of frames    RRGGBB
    mcall


    mov  eax,4                       ; label
    mov  ebx,8*65536+8
    mov  ecx,0x10ddeeff
    mov  edx,alert_labelt1
    mov  esi,alert_label1len-alert_labelt1
    mcall

    mov  eax,4
    mov  ebx,10*65536+43
    mov  ecx,0x10000000
    mov  edx,[g_t]
    mov  esi,[g_l]
    mcall

    cmp  [g_1],1
    jne  gadgets_no_1

    mov  eax,8
    mov  ebx,[g_x]
    sub  ebx,100
    shr  ebx,1
    shl  ebx,16
    add  ebx,30*65536+40
    mov  ecx,75*65536+16
    mov  edx,3
    mov  esi,0x446688
    mcall

    mov  eax,4
    mov  ebx,[g_x]
    sub  ebx,100
    shr  ebx,1
    shl  ebx,16
    add  ebx,31*65536+80
    mov  ecx,0x10ffffff
    mov  edx,alert_t2
    mov  esi,alert_t2len-alert_t2
    mcall

  gadgets_no_1:

    cmp  [g_1],2
    jne  gadgets_no_2

    mov  eax,8
    mov  ebx,[g_x]
    sub  ebx,100
    shr  ebx,1
    shl  ebx,16
    add  ebx,0*65536+40
    mov  ecx,75*65536+16
    mov  edx,1
    mov  esi,0x446688
    mcall

    mov  eax,8
    mov  ebx,[g_x]
    sub  ebx,100
    shr  ebx,1
    shl  ebx,16
    add  ebx,57*65536+40
    mov  ecx,75*65536+16
    mov  edx,2
    mov  esi,0x446688
    mcall

    mov  eax,4
    mov  ebx,[g_x]
    sub  ebx,100
    shr  ebx,1
    shl  ebx,16
    add  ebx,1*65536+80
    mov  ecx,0x10ffffff
    mov  edx,alert_t1
    mov  esi,alert_t1len-alert_t1
    mcall

  gadgets_no_2:

  no_win_1:

    mov  eax,12                    ; function 12:tell os about windowdraw
    mov  ebx,2                     ; 2, end of draw
    mcall

    ret


; DATA AREA


alert_t1:
    db '  No      Yes'
alert_t1len:


alert_t2:
    db '  OK'
alert_t2len:


alert_labelt1:
     db   'ALERT'
alert_label1len:








