;
; Óïðàâëåíèå ëîòêàìè äèñêîâûõ ïðèâîäîâ 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 - íà÷èíàåì ðèñîâàòü
; ÑÎÇÄÀèÌ ÎÊÍÎ
mcall 0, <100,230>, <100,110>, 0x03AABBCC, 0x805080D0, 0x005080D0
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
mcall 4, <25,25>, 0x80ffffff,text1
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
add ebx,50 shl 16
inc edx
mcall
add ebx,50 shl 16
inc edx
mcall
add ebx,50 shl 16
inc edx
mcall
popa
ret
;---------------------------------------------------------------------
;--- ÄÀÍÍÛÅ ÏÐÎÃÐÀÌÌÛ ----------------------------------------------
;---------------------------------------------------------------------
header db ' ATAPI Device Tray Control',0
text3 db 'eject eject eject eject',0
text2 db 'load load load load',0
text1 db '/cd0/ /cd1/ /cd2/ /cd3/',0
;---------------------------------------------------------------------
I_END: ; ìåòêà êîíöà ïðîãðàììû