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