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: ; метка конца программы25,25>40,20>15,42>100,110>100,230> |