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