kolibrios-fun/programs/system/cd_tray/CD_tray.ASM
Ivan Baravy 2c778124e3 Remove some duplicates: proc32.inc, macros.inc, struct.inc, etc.
git-svn-id: svn://kolibrios.org@7134 a494cfbc-eb01-0410-851d-a64ba20cac60
2017-12-20 00:51:00 +00:00

164 lines
4.5 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; Управление лотками дисковых приводов 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
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: ; метка конца программы