;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                       ;
;    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
     int  0x40

     cmp  [window_on],0
     jne  openw2

     cmp  eax,0
     je   no_open

  openw2:

   waitformouse:

     mov  eax,23
     mov  ebx,2
     int  0x40

     cmp  eax,0
     jne  no_open

     mov  eax,37
     mov  ebx,2
     int  0x40

     cmp  eax,0
     jne  waitformouse


     mov  eax,37
     mov  ebx,1
     int  0x40

     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
     int  0x40
     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
     int  0x40

     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]
     int  0x40

     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
     int  0x40

     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
     int  0x40

     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
     int  0x40
     mov  eax,38
     mov  ecx,[m_y]
     add  ecx,[m_ys]
     shl  ecx,16
     add  ecx,[m_y]
     add  ecx,[m_ys]
     int  0x40

     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
     int  0x40    ; 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]
   int  0x40

   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
    int  0x40

    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
    int  0x40

    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
    int  0x40
  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
    int  0x40
    jmp  alert_still

  alert_button:                 ; button
    mov  eax,17                 ; get id
    int  0x40

    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
    int  0x40

  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
    int  0x40

    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
    int  0x40

    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
    int  0x40
    popa
    mov  eax,4     ; draw text
    int  0x40
    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
    int  0x40
    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
    int  0x40


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

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

    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
    int  0x40

    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
    int  0x40

  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
    int  0x40

    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
    int  0x40

    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
    int  0x40

  gadgets_no_2:

  no_win_1:

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

    ret


; DATA AREA


alert_t1:
    db '  No      Yes'
alert_t1len:


alert_t2:
    db '  OK'
alert_t2len:


alert_labelt1:
     db   'ALERT'
alert_label1len: