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