-
Notifications
You must be signed in to change notification settings - Fork 0
/
gui.inc
124 lines (103 loc) · 3.4 KB
/
gui.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
; draw main window
align 4
proc draw_main_window stdcall
DEBUGF DBG_INFO, "draw_main_window() start\n"
mcall 12, 1 ; notify about draw beginning
mcall 48, 3, sys_colors, sizeof.system_colors
mov edx, [sys_colors.work] ; background color
or edx, 0x74000000 ; window type
; DEBUGF DBG_INFO, "mainwindow w, h = %u, %u", GFX_COLS*GFX_PIX_SIZE + 8, GFX_ROWS*GFX_PIX_SIZE + 28
mcall 0, <50, GFX_COLS*GFX_PIX_SIZE + 9>, <50, GFX_ROWS*GFX_PIX_SIZE + 28>, , , main_window_title ;
stdcall draw_screen
mcall 12, 2 ; notify about draw ending
DEBUGF DBG_INFO, "draw_main_window() end\n"
ret
endp
; draw screen
align 4
proc draw_screen stdcall
pushad
locals
row_ind dd ?
col_ind dd ?
color dd ?
endl
xor esi, esi
.loop1:
cmp esi, GFX_SIZE
jae .loop1_end
xor edx, edx
mov eax, esi
mov ecx, GFX_COLS
div ecx ; eax = row index, edx = col index
mov dword [row_ind], eax
mov dword [col_ind], edx
mov dword [color], COLOR_CELL ; white
cmp byte [esi + gfx], 0 ; check if cell is 0 or not 0
jne @f
mov dword [color], COLOR_BACK ; black
@@:
mov ebx, dword [col_ind]
imul ebx, GFX_PIX_SIZE ; now ebx - x coord of rect
mov ecx, dword [row_ind]
imul ecx, GFX_PIX_SIZE ; now ecx - y coord of rect
mov edx, dword [color]
stdcall imgbuf_draw_rect, ebx, ecx, edx
inc esi
jmp .loop1
.loop1_end:
stdcall imgbuf_send_to_window
popad
ret
endp
; copy imgbuf contents to the emulator window
align 4
proc imgbuf_send_to_window stdcall
DEBUGF DBG_INFO, "sending to window...\n"
push eax ebx ecx edx
mov eax, 7
mov ebx, dword [imgbuf_ptr]
mov ecx, IMGBUF_WIDTH
shl ecx, 16
add ecx, IMGBUF_HEIGHT
xor edx, edx
int 0x40
pop edx ecx ebx eax
ret
endp
; in internal buffer draw rect filled with given color at position (rect_x, rect_y) within window
align 4
proc imgbuf_draw_rect stdcall, rect_x: dword, rect_y: dword, rect_color: dword
DEBUGF DBG_INFO, "imgbuf_draw_rect(%u, %u, %x)\n", [rect_x], [rect_y], [rect_color]
push eax ebx ecx edx esi edi ebp
mov ebx, dword [rect_y]
imul ebx, IMGBUF_WIDTH
add ebx, dword [rect_x] ; now ebx - index of first pixel of rect
mov edi, dword [imgbuf_ptr]
mov ebp, dword [rect_color]
xor ecx, ecx
.for_i:
cmp ecx, GFX_PIX_SIZE
jae .ret
xor edx, edx
.for_j:
cmp edx, GFX_PIX_SIZE
jae .for_j_end
mov esi, edx
add edx, ebx
mov eax, ecx
imul eax, IMGBUF_WIDTH
add edx, eax ; now edx is index of edx'th pixel of ecx'th row of rect
lea edx, [edx*3]
add edx, edi
mov dword [edx], ebp ; put color to pixel
mov edx, esi
inc edx
jmp .for_j
.for_j_end:
inc ecx
jmp .for_i
.ret:
pop ebp edi esi edx ecx ebx eax
ret
endp