forked from KolibriOS/kolibrios
164 lines
4.5 KiB
NASM
164 lines
4.5 KiB
NASM
;
|
||
; Управление лотками дисковых приводов 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' ; макросы облегчают жизнь ассемблерщиков!
|
||
|
||
;---------------------------------------------------------------------
|
||
;--- НАЧАЛО ПРОГРАММЫ ----------------------------------------------
|
||
;---------------------------------------------------------------------
|
||
|
||
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_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_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_IT
|
||
add ebx,60 shl 16
|
||
else
|
||
add ebx,50 shl 16
|
||
end if
|
||
inc edx
|
||
mcall
|
||
if lang eq it_IT
|
||
add ebx,60 shl 16
|
||
else
|
||
add ebx,50 shl 16
|
||
end if
|
||
inc edx
|
||
mcall
|
||
if lang eq it_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_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: ; метка конца программы
|