Rev 3587 | Go to most recent revision | Details | Compare with Previous | 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 | |||
7134 | dunkaist | 18 | include 'macros.inc' ; макросы облегчают жизнь ассемблерщиков! |
585 | mario79 | 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 - получить идентификатор нажатой кнопки |
||
588 | diamond | 58 | ; кнопки 2,3,4,5 - load tray CD0/CD1/CD2/CD3 |
59 | movzx ecx, ah |
||
60 | sub ecx, 2 |
||
61 | cmp ecx, 3 |
||
62 | ja b6 |
||
63 | mcall 24,5 |
||
64 | jmp red |
||
585 | mario79 | 65 | b6: |
588 | diamond | 66 | ; кнопки 6,7,8,9 - eject tray CD0/CD1/CD2/CD3 |
67 | sub ecx, 4 |
||
68 | cmp ecx, 3 |
||
69 | ja b1 |
||
70 | mcall 24,4 |
||
71 | jmp red |
||
585 | mario79 | 72 | b1: |
73 | cmp ah, 1 ; если НЕ нажата кнопка с номером 1, |
||
74 | jne still ; вернуться |
||
75 | |||
76 | .exit: |
||
77 | mcall -1 ; иначе конец программы |
||
78 | |||
79 | |||
80 | |||
81 | ;--------------------------------------------------------------------- |
||
82 | ;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ---------------------------------- |
||
83 | ;--------------------------------------------------------------------- |
||
84 | |||
85 | draw_window: |
||
86 | mcall 12, 1 ; функция 12: сообщить ОС об отрисовке окна |
||
87 | ; 1 - начинаем рисовать |
||
88 | ; СОЗДАиМ ОКНО |
||
89 | |||
3587 | fedesco | 90 | if lang eq it |
91 | mcall 0, <100,250>, <100,110>, 0x03AABBCC, 0x805080D0, 0x005080D0 |
||
92 | else |
||
93 | mcall 0, <100,230>, <100,110>, 0x03AABBCC, 0x805080D0, 0x005080D0 |
||
94 | end if |
||
585 | mario79 | 95 | mcall 71, 1 ,header |
96 | mcall 8,<15,42>,<40,20>,2,0xaaaaaa |
||
97 | call draw_buttons |
||
98 | mov edx,6 |
||
99 | add ecx,30 shl 16 |
||
100 | mcall |
||
101 | call draw_buttons |
||
3587 | fedesco | 102 | |
103 | if lang eq it |
||
104 | mcall 4, <16,25>, 0x80ffffff,text1 |
||
105 | else |
||
106 | mcall 4, <25,25>, 0x80ffffff,text1 |
||
107 | end if |
||
585 | mario79 | 108 | mov edx,text2 |
3587 | fedesco | 109 | |
585 | mario79 | 110 | add ebx,3 shl 16+20 |
111 | mcall |
||
112 | mov edx,text3 |
||
113 | add ebx,30 |
||
114 | sub ebx,3 shl 16 |
||
115 | mcall |
||
3587 | fedesco | 116 | |
585 | mario79 | 117 | mcall 12, 2 ; функция 12: сообщить ОС об отрисовке окна |
118 | ; 2, закончили рисовать |
||
119 | |||
120 | ret ; выходим из процедуры |
||
121 | |||
122 | draw_buttons: |
||
123 | pusha |
||
3587 | fedesco | 124 | if lang eq it |
125 | add ebx,60 shl 16 |
||
126 | else |
||
127 | add ebx,50 shl 16 |
||
128 | end if |
||
585 | mario79 | 129 | inc edx |
3587 | fedesco | 130 | mcall |
131 | if lang eq it |
||
132 | add ebx,60 shl 16 |
||
133 | else |
||
134 | add ebx,50 shl 16 |
||
135 | end if |
||
585 | mario79 | 136 | inc edx |
3587 | fedesco | 137 | mcall |
138 | if lang eq it |
||
139 | add ebx,60 shl 16 |
||
140 | else |
||
141 | add ebx,50 shl 16 |
||
142 | end if |
||
585 | mario79 | 143 | inc edx |
3587 | fedesco | 144 | mcall |
585 | mario79 | 145 | popa |
146 | ret |
||
147 | ;--------------------------------------------------------------------- |
||
148 | ;--- ДАННЫЕ ПРОГРАММЫ ---------------------------------------------- |
||
149 | ;--------------------------------------------------------------------- |
||
150 | header db ' ATAPI Device Tray Control',0 |
||
3587 | fedesco | 151 | if lang eq it |
152 | text3 db 'espelli espelli espelli espelli',0 |
||
153 | text2 db 'carica carica carica carica',0 |
||
154 | text1 db '/cd0/ /cd1/ /cd2/ /cd3/',0 |
||
155 | else |
||
156 | text3 db 'eject eject eject eject',0 |
||
157 | text2 db 'load load load load',0 |
||
158 | text1 db '/cd0/ /cd1/ /cd2/ /cd3/',0 |
||
159 | end if |
||
160 | |||
585 | mario79 | 161 | ;--------------------------------------------------------------------- |
3587 | fedesco | 162 | |
585 | mario79 | 163 | I_END: ; метка конца программы25,25>16,25>40,20>15,42>100,110>100,230>100,110>100,250> |