Subversion Repositories Kolibri OS

Rev

Rev 317 | Rev 551 | 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
485 heavyiron 150
    mcall 0, 200*65536+300, 200*65536+175, 0x13AABBCC,,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:				   ; метка конца программы