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