Subversion Repositories Kolibri OS

Rev

Rev 588 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
585 mario79 1
;
2
; Управление лотками дисковых приводов ATAPI
3
; 22.07.2007 Mario79 исходный вариант
4
;---------------------------------------------------------------------
5
 
6
  use32 	 ; включить 32-битный режим ассемблера
7
  org	  0x0	      ; адресация с нуля
8
 
9
  db	 'MENUET01'  ; 8-байтный идентификатор MenuetOS
10
  dd	 0x01	      ; версия заголовка (всегда 1)
11
  dd	 START	       ; адрес первой команды
12
  dd	 I_END	       ; размер программы
13
  dd	 0x11000      ; количество памяти
14
  dd	 0x11000      ; адрес вершины стэка
15
  dd	 0x0	     ; адрес буфера для параметров (не используется)
16
  dd	 0x0	     ; зарезервировано
17
 
18
include 'MACROS.INC' ; макросы облегчают жизнь ассемблерщиков!
19
 
20
;---------------------------------------------------------------------
21
;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
22
;---------------------------------------------------------------------
23
 
24
START:
25
 
26
red:		; перерисовать окно
27
    call draw_window	; вызываем процедуру отрисовки окна
28
 
29
;---------------------------------------------------------------------
30
;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
31
;---------------------------------------------------------------------
32
 
33
still:
34
    mcall 10	    ; функция 10 - ждать события
35
 
36
    cmp  eax,1	      ; перерисовать окно ?
37
    je	   red	      ; если да - на метку red
38
    cmp  eax,2	      ; нажата клавиша ?
39
    je	   key	      ; если да - на key
40
    cmp  eax,3	      ; нажата кнопка ?
41
    je	   button     ; если да - на button
42
 
43
    jmp  still	      ; если другое событие - в начало цикла
44
 
45
 
46
;---------------------------------------------------------------------
47
 
48
 
49
  key:		  ; нажата клавиша на клавиатуре
50
    mcall 2	   ; функция 2 - считать код символа (в ah)
51
 
52
    jmp  still	      ; вернуться к началу цикла
53
 
54
;---------------------------------------------------------------------
55
 
56
  button:
57
    mcall 17	    ; 17 - получить идентификатор нажатой кнопки
58
    cmp   ah,2
59
    jne   b3
60
    mov   dword [load_tray.name],cd0
61
    jmp   b5.1
62
  b3:
63
    cmp   ah,3
64
    jne   b4
65
    mov   dword [load_tray.name],cd1
66
    jmp   b5.1
67
  b4:
68
    cmp   ah,4
69
    jne   b5
70
    mov   dword [load_tray.name],cd2
71
    jmp   b5.1
72
  b5:
73
    cmp   ah,5
74
    jne   b6
75
    mov   dword [load_tray.name],cd3
76
  .1:
77
     mcall 70, load_tray
78
    jmp   red
79
  b6:
80
    cmp   ah,6
81
    jne   b7
82
    mov   dword [eject_tray.name],cd0
83
    jmp   b9.1
84
  b7:
85
    cmp   ah,7
86
    jne   b8
87
    mov   dword [eject_tray.name],cd1
88
    jmp   b9.1
89
  b8:
90
    cmp   ah,8
91
    jne   b9
92
    mov   dword [eject_tray.name],cd2
93
    jmp   b9.1
94
  b9:
95
    cmp   ah,9
96
    jne   b1
97
    mov   dword [eject_tray.name],cd3
98
  .1:
99
     mcall 70, eject_tray
100
    jmp   red
101
  b1:
102
    cmp   ah, 1     ; если НЕ нажата кнопка с номером 1,
103
    jne   still     ;  вернуться
104
 
105
  .exit:
106
    mcall -1	    ; иначе конец программы
107
 
108
 
109
 
110
;---------------------------------------------------------------------
111
;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
112
;---------------------------------------------------------------------
113
 
114
draw_window:
115
    mcall 12, 1 	   ; функция 12: сообщить ОС об отрисовке окна
116
		   ; 1 - начинаем рисовать
117
		   ; СОЗДАиМ ОКНО
118
 
119
    mcall 0, <100,230>, <100,110>, 0x03AABBCC, 0x805080D0, 0x005080D0
120
    mcall 71, 1 ,header
121
    mcall 8,<15,42>,<40,20>,2,0xaaaaaa
122
    call  draw_buttons
123
    mov   edx,6
124
    add   ecx,30 shl 16
125
    mcall
126
    call  draw_buttons
127
 
128
    mcall 4, <25,25>, 0x80ffffff,text1
129
    mov   edx,text2
130
 
131
    add   ebx,3 shl 16+20
132
    mcall
133
    mov   edx,text3
134
    add   ebx,30
135
    sub   ebx,3 shl 16
136
    mcall
137
 
138
    mcall 12, 2 	   ; функция 12: сообщить ОС об отрисовке окна
139
		   ; 2, закончили рисовать
140
 
141
    ret 	       ; выходим из процедуры
142
 
143
draw_buttons:
144
    pusha
145
    add   ebx,50 shl 16
146
    inc   edx
147
    mcall
148
    add   ebx,50 shl 16
149
    inc   edx
150
    mcall
151
    add   ebx,50 shl 16
152
    inc   edx
153
    mcall
154
    popa
155
    ret
156
;---------------------------------------------------------------------
157
;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
158
;---------------------------------------------------------------------
159
header db ' ATAPI Device Tray Control',0
160
text3 db 'eject   eject   eject   eject',0
161
text2 db 'load    load    load    load',0
162
text1 db '/cd0/   /cd1/   /cd2/   /cd3/',0
163
cd0:  db '/cd0/1/',0
164
cd1:  db '/cd1/1/',0
165
cd2:  db '/cd2/1/',0
166
cd3:  db '/cd3/1/',0
167
;---------------------------------------------------------------------
168
load_tray:
169
    .subfunction dd   11
170
    .rezerv   dd   0
171
    .rezerv1  dd   0
172
    .rezerv2  dd   0
173
    .rezerv3  dd   0
174
    db 0
175
    .name: dd cd0
176
 
177
eject_tray:
178
    .subfunction dd   10
179
    .rezerv   dd   0
180
    .rezerv1  dd   0
181
    .rezerv2  dd   0
182
    .rezerv3  dd   0
183
    db 0
184
    .name: dd cd0
185
 
186
I_END:			 ; метка конца программы