Rev 551 | Rev 2139 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2091 | leency | 1 | ;; h2d2b v0.3 system colors by Leency ;; |
2 | ;; 21.08.2011 ;; |
||
3 | |||
317 | heavyiron | 4 | ;; hex2dec2bin 0.2 by Alexei Ershov ;; |
5 | ;; 16.11.2006 ;; |
||
6 | |||
2091 | leency | 7 | use32 |
8 | org 0x0 |
||
9 | db 'MENUET01' |
||
10 | dd 0x01,start,i_end,e_end,e_end,0,0 |
||
31 | halyavin | 11 | |
2091 | leency | 12 | include '../../../proc32.inc' |
13 | include '../../../macros.inc' ; макросы облегчают жизнь ассемблерщиков! |
||
31 | halyavin | 14 | |
15 | |||
2091 | leency | 16 | start: |
31 | halyavin | 17 | red: |
18 | |||
19 | call draw_window |
||
20 | |||
21 | still: |
||
22 | mcall 10 ; функция 10 - ждать события |
||
23 | |||
24 | cmp eax,1 ; перерисовать окно ? |
||
25 | je red ; если да - на метку red |
||
26 | cmp eax,2 ; нажата клавиша ? |
||
27 | je key ; если да - на key |
||
28 | cmp eax,3 ; нажата кнопка ? |
||
29 | je button ; если да - на button |
||
30 | |||
31 | jmp still ; если другое событие - в начало цикла |
||
32 | |||
33 | ;--------------------------------------------------------------------- |
||
34 | |||
2091 | leency | 35 | key: ; нажата клавиша на клавиатуре |
31 | halyavin | 36 | mov eax, 2 |
485 | heavyiron | 37 | mcall |
31 | halyavin | 38 | mov edi, [index] |
39 | cmp edi, string1 |
||
40 | jz no_back |
||
41 | |||
42 | cmp ah, 8 |
||
43 | jnz no_back |
||
44 | |||
45 | dec edi |
||
46 | mov byte [edi], ' ' |
||
47 | mov [index], edi |
||
48 | call Draw_String |
||
49 | jmp still |
||
50 | no_back: |
||
51 | cmp ah, 13 |
||
52 | jz read_str |
||
53 | |||
54 | cmp edi, string1_end |
||
55 | jae still |
||
56 | mov al, ah |
||
57 | stosb |
||
58 | mov [index], edi |
||
59 | call Draw_String |
||
60 | jmp still ; вернуться к началу цикла |
||
61 | |||
62 | read_str: |
||
63 | dec edi |
||
64 | mov esi, string1 |
||
65 | |||
66 | call GetBase |
||
67 | |||
68 | xor ecx, ecx |
||
69 | inc ecx ; ecx = 1 |
||
70 | |||
71 | make_bin: |
||
72 | xor eax, eax |
||
73 | |||
74 | next_digit: |
||
75 | xor edx, edx |
||
76 | cmp edi, esi |
||
77 | jb .done |
||
78 | |||
79 | mov dl, [edi] |
||
80 | cmp dl, '-' |
||
81 | jne @f |
||
82 | neg eax |
||
83 | jmp .done |
||
84 | @@: |
||
85 | cmp dl, 'F' |
||
86 | jbe @f |
||
87 | and dl, 11011111b |
||
88 | @@: |
||
89 | sub dl, '0' |
||
90 | cmp dl, 9 |
||
91 | jbe @f |
||
92 | sub dl, 'A'-'9'-1 |
||
93 | @@: |
||
94 | cmp dl, bl |
||
95 | jb @f |
||
96 | ; Здесь обработать ошибку |
||
97 | |||
98 | jmp .done |
||
99 | @@: |
||
100 | push ecx |
||
101 | xchg eax, ecx |
||
102 | mul edx ; edx:eax = eax * edx |
||
103 | add ecx, eax |
||
104 | pop eax |
||
105 | mul ebx |
||
106 | xchg eax, ecx |
||
107 | dec edi |
||
108 | jmp next_digit |
||
109 | |||
110 | .done: |
||
317 | heavyiron | 111 | mov [num], eax ; сохраняем введенное число |
112 | xor eax, eax |
||
113 | mov al, ' ' |
||
114 | mov edi, string1 |
||
115 | mov [index], edi |
||
116 | mov ecx, string1_end-string1 |
||
117 | rep stosb ; стираем введенную строку |
||
31 | halyavin | 118 | jmp red |
119 | |||
120 | ;--------------------------------------------------------------------- |
||
121 | |||
122 | button: |
||
123 | mcall 17 ; 17 - получить идентификатор нажатой кнопки |
||
124 | cmp ah, 1 ; если НЕ нажата кнопка с номером 1, |
||
317 | heavyiron | 125 | jne @f |
126 | mcall -1 |
||
127 | @@: |
||
128 | cmp ah, 2 |
||
129 | jne @f |
||
130 | shl [num], 1 |
||
131 | jmp red |
||
132 | @@: |
||
133 | cmp ah, 3 |
||
134 | jne @f |
||
135 | shr [num], 1 |
||
136 | jmp red |
||
137 | @@: |
||
138 | cmp ah, 4 |
||
139 | jne still |
||
140 | sar [num], 1 |
||
141 | jmp red |
||
31 | halyavin | 142 | |
317 | heavyiron | 143 | ;------------------------------------------------ |
144 | draw_window: |
||
145 | ;------------------------------------------------ |
||
2091 | leency | 146 | mcall 48, 3, sys_colors, 40 |
147 | |||
31 | halyavin | 148 | mcall 12, 1 |
2091 | leency | 149 | mov edx, 0x14000000 |
150 | or edx, [sys_colors.work] |
||
151 | ;mov esi, 0x80000000 |
||
152 | ;or esi, [sys_colors.grab_text] |
||
153 | mcall 0, 200*65536+300, 200*65536+175, ,,title |
||
31 | halyavin | 154 | |
2091 | leency | 155 | |
156 | mcall 8, 15 *65536+ 38, 90*65536+ 15, 2, [sys_colors.work_button] ; кнопка shl |
||
317 | heavyiron | 157 | mcall , ,110*65536+ 15, , ; кнопка sal |
158 | mcall , (300-53)*65536+ 38, 90*65536+ 15, 3, ; кнопка shr |
||
159 | mcall , ,110*65536+ 15, 4, ; кнопка sar |
||
31 | halyavin | 160 | |
2091 | leency | 161 | mov ecx, 0x80000000 |
162 | or ecx, [sys_colors.work_text] |
||
163 | mcall 4, 15*65536+30, , binstr, |
||
317 | heavyiron | 164 | mcall , 15*65536+44, , decstr, |
165 | mcall , 15*65536+58, ,sdecstr, |
||
166 | mcall , 15*65536+72, , hexstr, |
||
167 | mcall , 15*65536+150, , numstr, |
||
31 | halyavin | 168 | |
2091 | leency | 169 | mov ecx, 0x80000000 |
170 | or ecx, [sys_colors.work_button_text] |
||
171 | mcall , 26*65536+94, , shlstr,3 |
||
172 | mcall , (300-42)*65536+94, , shrstr, |
||
173 | mcall , 26*65536+114, , salstr, |
||
174 | mcall , (300-42)*65536+114, , sarstr, |
||
31 | halyavin | 175 | mov ecx, [num] |
176 | |||
2091 | leency | 177 | |
178 | mcall 47, 8*65536+256,,240*65536+72,[sys_colors.work_text] ; 16-ная |
||
31 | halyavin | 179 | mcall , 10*65536, ,228*65536+44, ; 10-ная |
180 | mcall , 8*65536+512,,240*65536+30, ; 2-ная |
||
181 | ror ecx, 8 |
||
317 | heavyiron | 182 | mcall , ,,(240-56)*65536+30, |
31 | halyavin | 183 | ror ecx, 8 |
317 | heavyiron | 184 | mcall , ,,(240-56*2)*65536+30, |
31 | halyavin | 185 | ror ecx, 8 |
317 | heavyiron | 186 | mcall , ,,(240-56*3)*65536+30, |
31 | halyavin | 187 | ror ecx, 8 |
317 | heavyiron | 188 | mov [minus], '+' |
31 | halyavin | 189 | jnc @f |
317 | heavyiron | 190 | mov [minus], '-' |
31 | halyavin | 191 | neg ecx |
192 | @@: |
||
193 | mcall , 10*65536,,228*65536+58, ; 10-ная со знаком |
||
194 | mcall 4, 222*65536+58, 0, minus, 1 |
||
2091 | leency | 195 | mcall 38, 15*65536+300-15, 137*65536+137, [sys_colors.work_graph] |
317 | heavyiron | 196 | call Draw_String |
31 | halyavin | 197 | mcall 12, 2 ; функция 12: сообщить ОС об отрисовке окна |
198 | |||
199 | ret |
||
200 | |||
201 | ;------------------------------------------------- |
||
202 | Draw_String: |
||
203 | ;------------------------------------------------- |
||
204 | |||
317 | heavyiron | 205 | mcall 4, 60*65536+150, 0x40A40473, \ |
206 | string1,string1_end-string1,0x00AABBCC |
||
207 | ret |
||
31 | halyavin | 208 | |
209 | ;------------------------------------------------- |
||
210 | GetBase: |
||
211 | ;------------------------------------------------- |
||
212 | mov ebx, 10 |
||
213 | cmp edi, esi |
||
214 | jb .done |
||
215 | |||
216 | mov al, [edi] |
||
217 | cmp al, 'H' |
||
218 | jbe @f |
||
219 | and al, 11011111b |
||
220 | @@: |
||
221 | cmp al, 'H' |
||
222 | jne @f |
||
223 | mov ebx, 16 |
||
224 | dec edi |
||
225 | jmp .done |
||
226 | |||
227 | @@: |
||
228 | cmp al, 'D' |
||
229 | jne @f |
||
230 | mov ebx, 10 |
||
231 | dec edi |
||
232 | jmp .done |
||
233 | |||
234 | @@: |
||
235 | cmp al, 'B' |
||
236 | jne .done |
||
237 | mov ebx, 2 |
||
238 | dec edi |
||
239 | |||
240 | .done: |
||
241 | ret |
||
242 | |||
243 | ;------------------------------------------------- |
||
244 | string1: |
||
245 | db 34 dup(' ') |
||
246 | string1_end: |
||
247 | index dd string1 |
||
317 | heavyiron | 248 | num dd 0 |
31 | halyavin | 249 | |
250 | |||
2091 | leency | 251 | title db 'hex2dec2bin 0.3',0 |
252 | minus db '-',0 |
||
317 | heavyiron | 253 | numstr db 'Number:',0 |
254 | hexstr db 'hex:',0 |
||
255 | binstr db 'bin:',0 |
||
256 | decstr db 'dec:',0 |
||
257 | sdecstr db 'signed dec:',0 |
||
2091 | leency | 258 | shlstr db 'shl',0 |
259 | salstr db 'sal',0 |
||
260 | shrstr db 'shr',0 |
||
261 | sarstr db 'sar',0 |
||
31 | halyavin | 262 | |
2091 | leency | 263 | i_end: |
264 | sys_colors system_colors |
||
265 | rb 0x400 ;stack |
||
266 | |||
267 | e_end: ; метка конца программы |