;
;   RDsave для Kolibri (0.6.5.0 и старше)
;   
;   Mario79 2005
;   Heavyiron 12.02.2007
;
;   Компилировать FASM'ом
;
;---------------------------------------------------------------------
include 'lang.inc'
include '..\..\..\macros.inc'

appname equ 'RDsave '
version equ '1.2'
  
  use32              ; включить 32-битный режим ассемблера
  org    0x0         ; адресация с нуля

  db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
  dd     0x01        ; версия заголовка (всегда 1)
  dd     START       ; адрес первой команды
  dd     I_END       ; размер программы
  dd     0x2000      ; количество памяти
  dd     0x2000      ; адрес вершины стэка
  dd     0x0         ; адрес буфера для параметров (не используется)
  dd     0x0         ; зарезервировано

include '..\..\develop\editbox\editbox.inc'
use_edit_box procinfo,22,5
al equ eax      ; \ decrease kpack'ed size
purge mov       ; /

;---------------------------------------------------------------------
;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
;---------------------------------------------------------------------

START:
   mov eax, 40
   mov ebx, 100111b
   mcall
red:                    ; перерисовать окно
    call draw_window    ; вызываем процедуру отрисовки окна

;---------------------------------------------------------------------
;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
;---------------------------------------------------------------------

still:
    mcall 10

    dec  eax             ; перерисовать окно?
    jz   red             ; если да - на метку red
    dec  eax 
    jz   key
    dec  eax
    jz   button

mouse:
        mouse_edit_box editbox
        jmp     still
    
button:
    mov  al,17           ; получить идентификатор нажатой кнопки
    mcall

    cmp  ah,1            ; кнопка с id=1("закрыть")?
    jne  noclose
    or   eax,-1          ; функция -1: завершить программу
    mcall

noclose:
        push    eax
        call    clear_err
        pop     eax
        push    16
        xor     ebx, ebx
        inc     ebx     ; 16.1 = save to /FD/1
        cmp     ah, 2
        je      doit
        inc     ebx     ; 16.2 = save to /FD/2
        cmp     ah, 3
        je      doit
        pop     ebx
        push    18
        mov     bl, 6   ; 18.6 = save to specified folder
        mov     ecx, path3
        cmp     ah, 4
        je      doit
        mov     ecx, path4
doit:
        pop     eax
        mcall
        call    check_for_error
        jmp     still

key:         
    mov  al,2
    mcall
    key_edit_box editbox
    jmp  still


check_for_error:                      ;Обработчик ошибок
        mov     ecx, [sc.work_text]
        mov     edx, ok
        test    eax, eax
        jz      print
        mov     ecx, 0xdd2222
        add     edx, error3 - ok
        dec     eax
        dec     eax
        jz      print
        add     edx, error5 - error3
        dec     eax
        dec     eax
        jz      print
        add     edx, error8 - error5
        dec     eax
        dec     eax
        dec     eax
        jz      print
        add     edx, error9 - error8
        dec     eax
        jz      print
        add     edx, error10 - error9
        dec     eax
        jz      print
        add     edx, error11 - error10
        dec     eax
        jz      print
        add     edx, aUnknownError - error11

 print:
    mov eax,4                              ;надписи
    mov ebx,20 shl 16 + 148
    or  ecx,0x80000000
    mcall
    ret

clear_err:
    mov eax,13
    mov ebx,15 shl 16 + 240
    mov ecx,145 shl 16 +15
    mov edx,[sc.work]
    mcall
    ret

;---------------------------------------------------------------------
;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
;---------------------------------------------------------------------

draw_window:

   mov  eax,48
   mov  ebx,3
   mov  ecx,sc
   mov  edx,sizeof.system_colors
   mcall

   mov eax,12                            ; функция 12: сообщить ОС об отрисовке окна
   mov bl,1                              ; 1 - начинаем рисовать
   mcall

                                         ; СОЗДАЁМ ОКНО
   xor eax,eax                           ; функция 0 : определить и отрисовать окно
   mov ebx,200 shl 16 + 270              ; [x старт] *65536 + [x размер]
   mov ecx,200 shl 16 + 190              ; [y старт] *65536 + [y размер]
   mov edx,[sc.work]                     ; цвет рабочей области  RRGGBB,8->color gl
   or  edx,0x33000000
   mov edi,title                        ; ЗАГОЛОВОК ОКНА
   mcall

draw_edit_box editbox,use_f9,procinfo   ;рисование edit box'ов

   mov al,13                            ;отрисовка теней кнопок
   mov ebx,194 shl 16 + 60
   mov ecx,34 shl 16 +15
   mov edx,0x444444
   mcall

   add ecx,20 shl 16
   mcall

   add ecx,20 shl 16
   mcall

   add ecx,40 shl 16
   mcall

   mov eax,8                             ;отрисовка кнопок
   sub ebx,4 shl 16
   sub ecx,4 shl 16
   mov edx,5
   mov esi,[sc.work_button]
   mcall

   sub ecx,40 shl 16
   dec edx
   mcall

   sub ecx,20 shl 16
   dec edx
   mcall

   sub ecx,20 shl 16
   dec edx
   mcall

   mov al,4                              ;надписи
   mov ebx,45 shl 16 + 12
   mov ecx,[sc.work_text]
   or  ecx,0x80000000
   mov edx,label1
   mcall

   mov ebx,150 shl 16 + 35
   mov edx,path1
   mcall

   add ebx,20
   mov edx,path2
   mcall

   mov ebx,75 shl 16 + 75
   mov edx,path3
   mcall

   mov ebx,30 shl 16 + 97
   mov edx,label2
   mcall

   mov ebx,40 shl 16 + 135
   mov edx,label3
   mcall

   mov ecx,[sc.work_button_text]
   or  ecx,0x80000000
   mov ebx,195 shl 16 + 35
   mov edx,save
   mcall

   add ebx,20
   mcall

   add ebx,20
   mcall

   add ebx,40
   mcall

   mov al,12                            ; функция 12: сообщить ОС об отрисовке окна
   mov ebx,2                            ; 2, закончили рисовать
   mcall

   ret                                  ; выходим из процедуры


;---------------------------------------------------------------------
;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
;---------------------------------------------------------------------

title db appname,version,0

editbox:
edit1 edit_box 170,10,113,0xffffff,0xaabbcc,0,0,0,512,path4,ed_focus,26,26
editbox_end:

if lang eq ru
save    db 'Сохранить',0
label1  db 'Выберите один из вариантов:',0
label2  db 'Или введите полный путь к файлу:',0
label3  db 'Все папки должны существовать',0
ok      db 'RAM-диск сохранен успешно',0
error3  db 'Неизвестная файловая система',0
error5  db 'Несуществующий путь',0
error8  db 'Нет места на диске',0
error9  db 'Таблица FAT разрушена',0
error10 db 'Доступ запрещен',0
error11 db 'Ошибка устройства',0
aUnknownError db 'Неизвестная ошибка',0

else
save    db '  Save',0
label1  db 'Select one of the variants:',0
label2  db '   Or enter full path to file:',0
label3  db '    All folders must exist',0
ok      db 'RAM-drive was saved successfully',0
error3  db 'Unknown file system',0
error5  db 'Incorrect path',0
error8  db 'Disk is full',0
error9  db 'FAT table corrupted',0
error10 db 'Access denied',0
error11 db 'Device error',0
aUnknownError db 'Unknown error',0

end if

mouse_flag: dd 0x0

path1   db '/fd/1/',0
path2   db '/fd/2/',0
path3   db '/hd0/1/kolibri.img',0
path4   db '/hd0/1/kolibri/kolibri.img',0  ;для резервного сохранения

;---------------------------------------------------------------------
I_END:                             ; метка конца программы

rb 514

sc     system_colors

procinfo process_information


