org 100h
struc WINDOW x1, y1, x2, y2, color, title
{
        .x1 db x1
        .y1 db y1
        .x2 db x2
        .y2 db y2
        .attrb db color
        .title db title
        db 0
}
struc BUTTON x1, y1, x2, y2, color, title
{
        .x1 db x1
        .y1 db y1
        .x2 db x2
        .y2 db y2
        .attrb db color
        .title db title
        db 0
}
struc INPUTBOX x1, y1, x2, y2, color, title
{
        .x1 db x1
        .y1 db y1
        .x2 db x2
        .y2 db y2
        .attrb db color
        .title db title
        db 0
}
virtual at 0
        WINDOW WINDOW ?, ?, ?, ?, ?, ?
end virtual
virtual at 0
        BUTTON BUTTON ?, ?, ?, ?, ?, ?
end virtual
virtual at 0
        INPUTBOX INPUTBOX ?, ?, ?, ?, ?, ?
end virtual
start:
        mov     ax, 0008h
        int     10h
        mov     ah, 80h
        call    bg
        mov     si, main
        call    draw_window
        mov     si, second
        call    draw_window
        mov     si, b1
        call    draw_button
        mov     si, b2
        call    draw_button
        mov     si, b3
        call    draw_button
        mov     si, inp1
        call    draw_inpbox
@@:
        xor     ax, ax
        int     16h
        cmp     al, 0dh
        jnz     @b
        mov     si, b1
        call    draw_button_press
        int     20h
second  WINDOW 40, 5, 70, 15, 4fh, "I'm a Window"
main    WINDOW 10, 10, 34, 20, 0fh, "Hey!"
b1      BUTTON 12, 12, 20, 16, 70h, "Click here!"
b2      BUTTON 22, 15, 31, 19, 70h, "Wassup?"
b3      BUTTON 42, 7, 59, 11, 74h, "Click here!"
inp1    INPUTBOX 42, 10, 66, 14, 70h, "Your name?"
bg:
        push    es
        push    0b800h
        pop     es
        mov     al, 0b1h
        mov     cx, 0fa00h
        rep     stosw
        pop     es
        ret
draw_window:
        push    es
        push    0b800h
        pop     es
        mov     ax, word[si+WINDOW.x1]
        call    mv_curs
        mov     bx, [width]
        shl     bx, 1
        mov     dl, [si+WINDOW.x2]
        sub     dl, [si+WINDOW.x1]
        sub     dl, 2
        mov     dh, [si+WINDOW.y2]
        sub     dh, [si+WINDOW.y1]
        sub     dh, 2
        movzx   cx, dl
        push    di
        mov     ax, 70dah
        stosw
        mov     al, 0b4h
        stosw
        mov     al, 0feh
        stosw
        mov     al, 0b3h
        stosw
        mov     ah, [si+WINDOW.attrb]
        sub     cx, 8
        mov     al, 20h
        rep     stosw
        mov     ax, 70b3h
        stosw
        mov     al, 1fh
        stosw
        mov     al, 0c3h
        stosw
        mov     al, 0bfh
        stosw
        pop     di
        add     di, 2
        add     di, bx
        push    di dx
        add     dl, 2
        add     dh, 1
        mov     ax, 80b2h
        mov     cx, dx
        dec     cx
        call    step2
        pop     dx di
        sub     di, 2
        mov     cx, dx
        mov     ax, 7020h
        dec     ch
        call    step3
        pop     es
        mov     dl, [si+WINDOW.x2]
        sub     dl, [si+WINDOW.x1]
        add     dl, 4
        mov     ax, word[si+WINDOW.x1]
        call    mv_curs
        movzx   cx, dl
        shr     cx, 1
        add     di, cx
        test    di, 1
        jnz     odd
        jmp     pcont
odd:
        inc     di
pcont:
        mov     ah, [si+WINDOW.attrb]
        lea     bx, [si+WINDOW.title]
@@:
        mov     al, byte[bx]
        cmp     al, 0
        jz      @f     
        stosw
        inc     bx
        jmp     @b
@@:
        ret
step2:
        push    cx di
        mov     ch, 0
        ;mov     ax, 7020h
        rep     stosw
        pop     di cx
        add     di, bx
        dec     ch
        jnz     step2
        ret   
step3:
        push    cx di
        mov     ch, 0
        mov     ax, 70b3h
        stosw
        sub     cl, 2
        mov     al, 20h
        rep     stosw
        mov     al, 0b3h
        stosw
        pop     di cx
        add     di, bx
        dec     ch
        jnz     step3
        mov     al, 0c0h
        stosw
        mov     dl, [si+WINDOW.x2]
        sub     dl, [si+WINDOW.x1]
        sub     dl, 4
        movzx   cx, dl
        mov     al, 0c4h
        rep     stosw
        mov     al, 0d9h
        stosw 
        ret    
mv_curs:
        push    cx dx ax
        movzx   cx, al
        movzx   ax, ah
        mul     [width]
        add     ax, cx       
        shl     ax, 1
        push    0b800h
        pop     es
        mov     di, ax
        pop     ax dx cx
        ret 
draw_button:
        push    es
        push    0b800h
        pop     es
        mov     bx, [width]
        shl     bx, 1
        mov     ax, word[si+BUTTON.x1]
        call    mv_curs
        mov     dl, [si+BUTTON.x2]
        sub     dl, [si+BUTTON.x1]
        sub     dl, 2
        mov     dh, [si+BUTTON.y2]
        sub     dh, [si+BUTTON.y1]
        sub     dh, 2
        movzx   cx, dl
        push    di
        mov     ax, 7fdah
        stosw
        mov     ax, 7fc4h
        rep     stosw
        mov     ax, 70bfh
        stosw
        pop     di
        add     di, bx
        mov     cx, dx
        dec     ch
@@:
        push    cx di
        mov     ch, 0
        mov     ax, 7fb3h
        stosw
        mov     al, 20h
        rep     stosw
        mov     ax, 70b3h
        stosw
        pop     di cx
        add     di, bx
        dec     ch
        jnz     @b   
        mov     ch, 0
        dec     cl
        mov     ax, 7fc0h
        stosw
        mov     ax, 70c4h
        rep     stosw
        mov     ax, 70c4h
        stosw
        mov     ax, 70d9h
        stosw
        mov     dl, [si+BUTTON.x2]
        sub     dl, [si+BUTTON.x1]
        sub     dl, 2
        mov     dh, [si+BUTTON.y2]
        sub     dh, [si+BUTTON.y1]
        sub     dh, 2
        shr     dh, 1
        mov     ax, word[si+BUTTON.x1]
        inc     al
        add     ah, dh
        call    mv_curs
        movzx   cx, dl
        mov     ah, [si+BUTTON.attrb]
        lea     si, [si+BUTTON.title]
@@:
        lodsb
        cmp     al, 0
        jz      @f
        cmp     cx, 0
        jz      @f
        stosw
        dec     cx
        jmp     @b
@@:
        pop     es
        ret
draw_button_press:
        push    es
        push    0b800h
        pop     es
        mov     bx, [width]
        shl     bx, 1
        mov     ax, word[si+BUTTON.x1]
        call    mv_curs
        mov     dl, [si+BUTTON.x2]
        sub     dl, [si+BUTTON.x1]
        sub     dl, 2
        mov     dh, [si+BUTTON.y2]
        sub     dh, [si+BUTTON.y1]
        sub     dh, 2
        movzx   cx, dl
        push    di
        mov     ax, 70c9h
        stosw
        mov     ax, 70cdh
        rep     stosw
        mov     ax, 7fbbh
        stosw
        pop     di
        add     di, bx
        mov     cx, dx
        dec     ch
@@:
        push    cx di
        mov     ch, 0
        mov     ax, 70bah
        stosw
        mov     al, 20h
        rep     stosw
        mov     ax, 7fbah
        stosw
        pop     di cx
        add     di, bx
        dec     ch
        jnz     @b   
        mov     ch, 0
        mov     ax, 70c8h
        stosw
        mov     ax, 7fcdh
        rep     stosw
        mov     ax, 7fbch
        stosw
        mov     dl, [si+BUTTON.x2]
        sub     dl, [si+BUTTON.x1]
        sub     dl, 2
        mov     dh, [si+BUTTON.y2]
        sub     dh, [si+BUTTON.y1]
        sub     dh, 2
        shr     dh, 1
        mov     ax, word[si+BUTTON.x1]
        inc     al
        add     ah, dh
        call    mv_curs
        movzx   cx, dl
        mov     ah, [si+BUTTON.attrb]
        ror     ah, 4
        lea     si, [si+BUTTON.title]
@@:
        lodsb
        cmp     al, 0
        jz      @f
        cmp     cx, 0
        jz      @f
        stosw
        dec     cx
        jmp     @b
@@:
        pop     es
        ret          
draw_inpbox:
        push    es
        push    0b800h
        pop     es
        mov     bx, [width]
        shl     bx, 1
        mov     ax, word[si+INPUTBOX.x1]
        call    mv_curs
        mov     dl, [si+INPUTBOX.x2]
        sub     dl, [si+INPUTBOX.x1]
        sub     dl, 2
        mov     dh, [si+INPUTBOX.y2]
        sub     dh, [si+INPUTBOX.y1]
        sub     dh, 2
        movzx   cx, dl
        push    di
        mov     ax, 70dah
        stosw
        mov     ax, 70c4h
        rep     stosw
        mov     ax, 7fbfh
        stosw
        pop     di
        add     di, bx
        mov     cx, dx
        dec     ch
@@:
        push    cx di
        mov     ch, 0
        mov     ax, 70b3h
        stosw
        mov     al, 20h
        rep     stosw
        mov     ax, 7fb3h
        stosw
        pop     di cx
        add     di, bx
        dec     ch
        jnz     @b   
        mov     ch, 0
        dec     cl
        mov     ax, 70c0h
        stosw
        mov     ax, 7fc4h
        rep     stosw
        mov     ax, 7fc4h
        stosw
        mov     ax, 7fd9h
        stosw
        mov     dl, [si+INPUTBOX.x2]
        sub     dl, [si+INPUTBOX.x1]
        sub     dl, 2
        mov     dh, [si+INPUTBOX.y2]
        sub     dh, [si+INPUTBOX.y1]
        sub     dh, 2
        shr     dh, 1
        mov     ax, word[si+INPUTBOX.x1]
        inc     al
        add     ah, dh
        call    mv_curs
        movzx   cx, dl
        mov     ah, [si+INPUTBOX.attrb]
        lea     si, [si+INPUTBOX.title]
@@:
        lodsb
        cmp     al, 0
        jz      @f
        cmp     cx, 0
        jz      @f
        stosw
        dec     cx
        jmp     @b
@@:
        pop     es
        ret
width   dw      80d 
