;
; Óïðàâëåíèå ëîòêàìè äèñêîâûõ ïðèâîäîâ 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: ; ìåòêà êîíöà ïðîãðàììû