; ; Управление лотками дисковых приводов ATAPI ; 22.07.2007 Mario79 исходный вариант ;--------------------------------------------------------------------- use32 ; включить 32-битный режим ассемблера org 0x0 ; адресация с нуля db 'MENUET01' ; 8-байтный идентификатор MenuetOS dd 0x01 ; версия заголовка (всегда 1) dd START ; адрес первой команды dd I_END ; размер программы dd 0x11000 ; количество памяти dd 0x11000 ; адрес вершины стэка dd 0x0 ; адрес буфера для параметров (не используется) dd 0x0 ; зарезервировано include 'MACROS.INC' ; макросы облегчают жизнь ассемблерщиков! include 'lang.inc' ;--------------------------------------------------------------------- ;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- ;--------------------------------------------------------------------- START: red: ; перерисовать окно call draw_window ; вызываем процедуру отрисовки окна ;--------------------------------------------------------------------- ;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ---------------------------------------- ;--------------------------------------------------------------------- still: mcall 10 ; функция 10 - ждать события cmp eax,1 ; перерисовать окно ? je red ; если да - на метку red cmp eax,2 ; нажата клавиша ? je key ; если да - на key cmp eax,3 ; нажата кнопка ? je button ; если да - на button jmp still ; если другое событие - в начало цикла ;--------------------------------------------------------------------- key: ; нажата клавиша на клавиатуре mcall 2 ; функция 2 - считать код символа (в ah) jmp still ; вернуться к началу цикла ;--------------------------------------------------------------------- button: mcall 17 ; 17 - получить идентификатор нажатой кнопки ; кнопки 2,3,4,5 - load tray CD0/CD1/CD2/CD3 movzx ecx, ah sub ecx, 2 cmp ecx, 3 ja b6 mcall 24,5 jmp red b6: ; кнопки 6,7,8,9 - eject tray CD0/CD1/CD2/CD3 sub ecx, 4 cmp ecx, 3 ja b1 mcall 24,4 jmp red b1: cmp ah, 1 ; если НЕ нажата кнопка с номером 1, jne still ; вернуться .exit: mcall -1 ; иначе конец программы ;--------------------------------------------------------------------- ;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ---------------------------------- ;--------------------------------------------------------------------- draw_window: mcall 12, 1 ; функция 12: сообщить ОС об отрисовке окна ; 1 - начинаем рисовать ; СОЗДАиМ ОКНО if lang eq it mcall 0, <100,250>, <100,110>, 0x03AABBCC, 0x805080D0, 0x005080D0 else mcall 0, <100,230>, <100,110>, 0x03AABBCC, 0x805080D0, 0x005080D0 end if mcall 71, 1 ,header mcall 8,<15,42>,<40,20>,2,0xaaaaaa call draw_buttons mov edx,6 add ecx,30 shl 16 mcall call draw_buttons if lang eq it mcall 4, <16,25>, 0x80ffffff,text1 else mcall 4, <25,25>, 0x80ffffff,text1 end if mov edx,text2 add ebx,3 shl 16+20 mcall mov edx,text3 add ebx,30 sub ebx,3 shl 16 mcall mcall 12, 2 ; функция 12: сообщить ОС об отрисовке окна ; 2, закончили рисовать ret ; выходим из процедуры draw_buttons: pusha if lang eq it add ebx,60 shl 16 else add ebx,50 shl 16 end if inc edx mcall if lang eq it add ebx,60 shl 16 else add ebx,50 shl 16 end if inc edx mcall if lang eq it add ebx,60 shl 16 else add ebx,50 shl 16 end if inc edx mcall popa ret ;--------------------------------------------------------------------- ;--- ДАННЫЕ ПРОГРАММЫ ---------------------------------------------- ;--------------------------------------------------------------------- header db ' ATAPI Device Tray Control',0 if lang eq it text3 db 'espelli espelli espelli espelli',0 text2 db 'carica carica carica carica',0 text1 db '/cd0/ /cd1/ /cd2/ /cd3/',0 else text3 db 'eject eject eject eject',0 text2 db 'load load load load',0 text1 db '/cd0/ /cd1/ /cd2/ /cd3/',0 end if ;--------------------------------------------------------------------- I_END: ; метка конца программы