Subversion Repositories Kolibri OS

Rev

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:				   ; метка конца программы