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