org 100h
struc BUTTON X, Y, X2, Y2, color
{
        .x1 db X
        .y1 db Y
        .x2 db X2
        .y2 db Y2
	.attr db color
}
virtual at 0
    BUTTON BUTTON ?,?,?,?,?
end virtual
struc WINDOW X, Y, X2, Y2, color, color2
{
        .x1 db X
        .y1 db Y
        .x2 db X2
        .y2 db Y2 
	.attr db color
	.at2 db color2
}
virtual at 0
    WINDOW WINDOW ?,?,?,?,?,?
end virtual
start:
        mov     ax, $13
        int     10h
	mov	al, 09h
        call    fill_bg
        mov     si, main
        call    draw_window
	mov	si, win2
	call	draw_window
	mov	si, two
	call	draw_button
	mov	si, b2
	call	draw_button
	xor	ax, ax
	int	16h
	mov	si, two
	call	draw_button_pressed
	xor	ax, ax
	int	16h
	mov	si, b2
	call	draw_button_pressed  
	mov	si, two
	call	draw_button      
	int     20h
main    WINDOW 20, 10, 130, 120, 07h, 01h
win2	WINDOW 132, 10, 190, 120, 04h, 02h
b2	BUTTON 70, 40, 100, 50, 07h
two	BUTTON 40, 30, 70, 40, 07h
draw_button:
	push	0a000h
	pop	es
	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	al, 0fh
	stosb
	mov	al, 0fh
	rep	stosb
	mov	al, 0h
	stosb
	pop	di
	add	di, 320
	mov	cx, dx
@@:
	push	cx di
	mov	ch, 0
	mov	al, 0fh
	stosb
	mov	al, [si+BUTTON.attr]
	rep	stosb
	mov	al, 0h
	stosb
	pop	di cx
	add	di, 320
	dec	ch
	jnz	@B
	mov	al, 0fh
	stosb
	mov	al, 0h
	inc	cx
	rep	stosb
	ret
draw_button_pressed:
	push	0a000h
	pop	es
	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	al, 0h
	stosb
	mov	al, 0h
	rep	stosb
	mov	al, 0h
	stosb
	pop	di
	add	di, 320
	mov	cx, dx
@@:
	push	cx di
	mov	ch, 0
	mov	al, 0h
	stosb
	mov	al, [si+BUTTON.attr]
	rep	stosb
	mov	al, 0fh
	stosb
	pop	di cx
	add	di, 320
	dec	ch
	jnz	@B
	mov	al, 0h
	stosb
	mov	al, 0fh
	inc	cx
	rep	stosb
	ret
draw_window:
	push	0a000h
	pop	es
	pusha	
	call	title_bar
	popa
	mov	ax, word[si+BUTTON.x1]
	add	ah, 9	
	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	al, 0fh
	stosb
	mov	al, 0fh
	rep	stosb
	pop	di
	add	di, 320	
	mov	cx, dx
@@:
	push	cx di
	mov	ch, 0
	mov	al, 0fh
	stosb
	mov	al, [si+BUTTON.attr]
	rep	stosb
	mov	al, 0h
	stosb
	pop	di cx
	add	di, 320
	dec	ch
	jnz	@B
	mov	al, 0fh
	stosb
	mov	al, 0h
	inc	cx
	rep	stosb
	ret
title_bar:
	push	0a000h
	pop	es
	mov	ax, word[si+WINDOW.x1]
	call	mv_curs
	mov	dl, [si+WINDOW.x2]
	sub	dl, [si+WINDOW.x1]
	sub	dl, 2
	mov	dh, 8	
	movzx	cx, dl
	push	di
	mov	al, 0fh
	stosb
	mov	al, 0fh
	rep	stosb
	mov	al, 0fh
	stosb
	pop	di
	add	di, 320
	mov	cx, dx
@@:
	push	cx di
	mov	ch, 0
	mov	al, 0fh
	stosb
	mov	al, [si+WINDOW.at2]
	rep	stosb
	mov	al, 0fh
	stosb
	pop	di cx
	add	di, 320
	dec	ch
	jnz	@B
	mov	al, 0fh
	stosb
	mov	al, 0h
	inc	cx
	rep	stosb
	ret
mv_curs:
	push ax cx dx
	xor cx, cx
	movzx cx, al
	movzx ax, ah
	mul [width]
	add ax, cx
	mov di, ax
	pop dx cx ax
	ret
fill_bg:
	push	0a000h
	pop	es
	xor	di, di
	mov	cx, 0fa00h
	rep	stosb
	ret
width dw 320
