Subversion Repositories Kolibri OS

Rev

Rev 1635 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ; Copyright (c) 2009, <Lrz>
  2. ; All rights reserved.
  3. ;
  4. ; Redistribution and use in source and binary forms, with or without
  5. ; modification, are permitted provided that the following conditions are met:
  6. ;       * Redistributions of source code must retain the above copyright
  7. ;       notice, this list of conditions and the following disclaimer.
  8. ;       * Redistributions in binary form must reproduce the above copyright
  9. ;       notice, this list of conditions and the following disclaimer in the
  10. ;       documentation and/or other materials provided with the distribution.
  11. ;       * Neither the name of the <organization> nor the
  12. ;       names of its contributors may be used to endorse or promote products
  13. ;       derived from this software without specific prior written permission.
  14. ;
  15. ; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname <Lrz> ''AS IS'' AND ANY
  16. ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  17. ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  18. ; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
  19. ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  20. ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  21. ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  22. ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  23. ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  24. ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. ;*****************************************************************************
  26.  
  27. ; â ýòîé ñåêöèè èäåò ðàçáîð ïàðàìåòðîâ óêàçàòåëü íà ñåêöèþ õðàíèòüñÿ â point_default
  28. ;òèïû îøèáîê ïðè îáðàáîòêå ìàêðîñà
  29. ;Ìàêðîñ RamdiskFS
  30. ;/îïðåäåëåíèå ôëàãîâ â çàïèñè êîðíåâîé äèðåêòîðèè
  31. ATTR_READ_ONLY  equ     0x01
  32. ATTR_HIDDEN     equ     0x02
  33. ATTR_SYSTEM     equ     0x04
  34. ATTR_VOLUME_ID  equ     0x08
  35. ATTR_DIRECTORY  equ     0x10
  36. ATTR_ARCHIVE    equ     0x20
  37.  
  38.  
  39.  
  40. show_error_1    equ     0x1     ;êîí÷èëèñü äàííûå - íå çàïëàíèðîâàííûé êîíåö ñåêöèè
  41. show_error_2    equ     0x2     ;íåò çàâåðøàþùåãî ñèìâîëà â ðàçìåðå ðàì äèñêà.
  42. show_error_3    equ     0x4     ; ðàì äèñê áóäåò èìåòü ðàçìåð =64 êá.
  43. show_error_4    equ     0x8     ;
  44.  
  45. macro use_parse_def_sect
  46. {
  47.         mov     di, point_default
  48.         push    ini_data_
  49.         pop     es
  50.         mov     si, point_to_point_def
  51.         sub     si, 2
  52.         mov     cx, [si]        ;çàãðóçèì óêàçàòåëü íàñëåäóþùèþ ñåêöèþ
  53.  
  54.         xor     ax, ax  ;îáíóëèì àx äëÿ î÷èñòêè ôëàãîâ  
  55.  
  56.         sub     cx, di          ;âîò òåïåðü èìååì èñòèíûé ðàçìåð
  57.         mov     save_cx_d, cx   ;ñîõðàíèì çíà÷åíèå cx ñâîåé ïåðåìåííîé
  58. ;îáíóëèì ïåðåìåííóþ ôëàãîâ, ýòî íåîáõîäèìî, äëÿ òîãî, ÷òî áû èçáåæàòü îáðàáîòêó ïîâòîðÿþùèõñÿ çíà÷åíèé
  59.  
  60.         mov     status_flag, ax
  61. ;;;;
  62. ;ÂÕîä â îáðàáîòêó ïàðñèíãà çíà÷åíèé ñåêöèé. es:di - óêàçàòåëü íà íà÷àëî ñåêöèè cx ðàçìåð ñåêöèè äîñòóïíîé äëÿ ïàðñèíãà
  63. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  64. ;ñîãëàøåíèå íå ðàçðóøàåì bp, es, cs, sp        
  65. ;use_Loader_Image       ;çàãðóçèòü îáðàç âûøå 1 ìá
  66. use_RamdiskFS
  67. ;ïðîâåðÿåòñÿ ñàìûé ïîñëåäíèé.
  68. use_LoaderModule    ;îñîáåííîñòü - ïåðåäàåò óïðàâëåíèå íà çàãðóæåííûé ìîäóëü.
  69. }
  70.  
  71. macro use_LoaderModule
  72. ;êàê âàðèàíò ñåé÷àñ èñïîëüçóåòñÿ ìîäåëü, ïðè çàãðóçêå ìîäóëÿ íà íåãî ïåðåäàåòñÿ óïðàâëåíèå, ðåøåíèå âðåìåíîå
  73. ;óïðàâëåíèå áóäåò ïåðåäàâàòüñÿ òîëüêî ïîñëå îáðàáîòêè âñåé ñåêöèè
  74. {
  75. local .found_end_str
  76.  
  77.         mov     di, point_default  ;restore value
  78.         mov     cx, save_cx_d
  79. ;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
  80. .start_p_LM:
  81.         call    get_firs_sym    ;get first symbol on new line
  82.         test    cx, cx
  83.         jz      ._afterLoaderModule     ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
  84.         cmp     al, 'L'
  85.         jnz     .start_p_LM
  86. ;ïðîâåðêà íà çíà÷åíèå LoaderModule
  87. ;        parse_LoaderModule
  88.         mov     bx, cx
  89.         mov     ax, di
  90.  
  91.         mov     si, parse_LoaderModule
  92.         mov     cx, parse_LoaderModule_e - parse_LoaderModule
  93.         repe cmpsb
  94.         jnz     .rest_value_loop_LM        ;is not compare
  95.  
  96.         sub     bx, parse_LoaderModule_e - parse_LoaderModule;correct cx
  97.         add     bx, cx
  98.         mov     cx, bx
  99.  
  100.         test    status_flag, flag_found_LM              ;îöåíêà ôëàãîâ
  101.         jz      .correct_is_not_set_LM
  102.  
  103. ;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
  104. ;       call    printplain
  105. ;       jmp     .get_next_str
  106.  
  107. .correct_is_not_set_LM:
  108.         mov     ax, 0x3d20         ;cut al=' ' ah='='
  109.         repe scasb
  110.         jcxz    .rest_value_loop_LM          ;not found param timeout
  111.        
  112.         cmp     ah, byte [es:di-1]   ;find '='
  113.         jnz     .rest_value_loop_LM
  114.        
  115.         repe scasb                 ;cut ' '
  116.         inc     cx
  117.         dec     di
  118. ;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
  119. ;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
  120. ;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
  121. ;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
  122. ;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader
  123. ;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
  124. ;ñîõðàíèëè ïåâûå 2 word
  125.         push    dword [es:di-6]
  126.         lea     si, [di-6]
  127.  
  128.         push    word [es:di-2]
  129.         xor     ax, ax
  130.         mov     word [es:di-6], ax      ;âíîñèì íóæíûå çíà÷åíèÿ
  131. ;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
  132.         mov     ax, info_real_mode_size ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
  133.  
  134.  
  135.         mov     word [es:di-4], ax
  136.         mov     word [es:di-2], 16      ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì
  137. ;;;;;; ïîèñê êîíöà ñòðî÷êè
  138. @@:
  139.         mov     al, byte [es:di]
  140.         cmp     al, ' '
  141.         jz      .found_end_str
  142.         cmp     al, 0xa
  143.         jz      .found_end_str
  144.         cmp     al, 0xd
  145.         jz      .found_end_str
  146.         inc     di
  147.         dec     cx
  148.         jnz     @b
  149. ;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè
  150. .found_end_str:
  151.  
  152.         push    word [es:di]
  153.         xor     ax, ax
  154.         mov     word [es:di], ax
  155. ;        xor     ax,ax   ; function 1 - read file
  156.         mov     di, si  ;file_data
  157.         inc     ax
  158.         push    si
  159.         push    es
  160.  
  161.         push    es
  162.         pop     ds
  163.         push    cs
  164.         pop     es
  165.  
  166.         call    far dword [es:loader_callback]
  167.  
  168.         push    cs
  169.         pop     ds
  170.  
  171.         pop     es
  172.         pop     si
  173.  
  174.         test    bx, bx
  175.         jnz     .error_LM
  176.  
  177.  
  178.         jmp     far dword [es:si]
  179.  
  180.  
  181. .error_LM:
  182.         call    error.LoaderModule
  183. .rest_value_loop_LM:
  184.         mov     di, ax
  185.         mov     cx, bx
  186.         jmp     .start_p_LM
  187.  
  188. ._afterLoaderModule:
  189. }
  190.  
  191. macro use_RamdiskFS
  192. ; ôîðìèðîâàíèå ðàì äèñêà, + îáðàáîòêà âñåãî ñâÿçàííîãî.
  193. {
  194. if DEBUG
  195. local ._not_memory_in_sys
  196. ;//////// clear window
  197.         mov     ax, 3
  198.         int     0x10
  199. ;\\\\\\\\\ clear window is end
  200.         mov     si, ramdiskFS_st
  201.         call    printplain
  202. end if
  203. ; îáíóëèì ðåãèñòð ñîñòîÿíèÿ îøèáîê
  204.         xor     ax, ax
  205.         mov     show_errors_sect, ax
  206. use_free_memory ; óçíàåì êàêîãî îáúåìà ó íàñ äîñòóïíà ïàìÿòü. çíà÷åíèå âîçàðàùàåòñÿ â ax
  207. ;óçíàåì ñêîëüêî ó íàñ åñòü ïàìÿòè è ñìîæåì ëè ìû ñôîðìèðîâàòü íóæíîãî ðàçìåðà ðàì äèñê.
  208. use_RamdiskSize ;çíà÷åíèå âîçâðàùàåòñÿ â bx
  209.         cmp     free_ad_memory, bx      ; ðàçìåðíîñòü â êá.
  210.         jbe     ._not_memory_in_sys
  211.         movzx   eax, bx
  212.         shl     eax, 10 ;*1024 = get size in byte
  213.         mov     save_ramdisksize, eax   ; ñîðõàíèì ðàçìåð â byte
  214.  
  215. get_type_FS     ;ïîëó÷èì òèï ôàéëîâîé ñèñòåìû + ñîçäàäèì åå
  216.  
  217.        
  218. ._not_memory_in_sys:
  219.        
  220. if DEBUG
  221. ;pause
  222.         xor     ax, ax
  223.         int     0x16
  224. end if
  225. }
  226. macro use_RamdiskSize
  227. {
  228. local .start_p_RS
  229. local .correct_is_not_set_RS
  230. local .CS
  231. local .correct_val_RS
  232. local .correct_size_RS
  233. local .rest_value_loop_RS
  234. local .end_get_RS_ERROR_1
  235. local .end_get_RS_ERROR_2
  236. local ._end_parse_RS
  237. ;îáðàáàòûâàåòñÿ ðàçìåð ôîðìèðóåìîãî ðàì äèñêà
  238. ;çàãðóçèì íà÷àëî ñåêöèè, ò.ê. áóäåì ïðîñìàòðèâàòü ñ íà÷àëà è âñþ ñåêöèþ
  239.         mov     di, point_default  ;restore value
  240.         mov     cx, save_cx_d
  241. .start_p_RS:
  242.         call    get_firs_sym    ;get first symbol on new line
  243.         test    cx, cx
  244.         jz      ._end_parse_RS  ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
  245.         cmp     al, 'R'
  246.         jnz     .start_p_RS
  247. ;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
  248. ;        parse_RamdiskSize
  249.         mov     bx, cx
  250.         mov     ax, di
  251.  
  252.         mov     si, parse_RamdiskSize
  253.         mov     cx, parse_RamdiskSize_e - parse_RamdiskSize
  254.         repe cmpsb
  255.         jnz     .rest_value_loop_RS    ;is not compare
  256.  
  257.         sub     bx, parse_RamdiskSize_e - parse_RamdiskSize;correct cx
  258.         add     bx, cx
  259.         mov     cx, bx
  260.  
  261.         test    status_flag, flag_found_RS              ;îöåíêà ôëàãîâ
  262.         jz      .correct_is_not_set_RS
  263.  
  264. ;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
  265. ;       call    printplain
  266. ;       jmp     .get_next_str
  267.  
  268. .correct_is_not_set_RS:
  269.         mov     ax, 0x3d20         ;cut al=' ' ah='='
  270.         repe scasb
  271.         jcxz    .end_get_RS_ERROR_1          ;not found param
  272.        
  273.         cmp     ah, byte [es:di-1]   ;find '='
  274.         jnz     .start_p_RS                     ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
  275.        
  276.         repe scasb                 ;cut ' '
  277.         inc     cx
  278.         dec     di
  279. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  280. ;Òóò íóæíî ïðåîáðàçîâûâàòü ñòðî÷êó â öèôðîâîå çíà÷åíèå.
  281. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  282.         xor     bx, bx
  283.         mov     cx, 5
  284. @@:
  285.         mov     al, byte [es:di]
  286.         cmp     al, '0'
  287.         jb      .CS
  288.         cmp     al, '9'
  289.         jbe     .correct_val_RS
  290. .CS:
  291.         cmp     al, 'K'
  292.         jz      .correct_size_RS
  293.         jmp     .end_get_RS_ERROR_2
  294. .correct_val_RS:        
  295.         imul    bx, 10
  296.         xor     al, 0x30
  297.         add     bl, al
  298.         inc     di
  299.         loop    @b
  300.  
  301. .correct_size_RS:
  302. ;âîçìîæåí 1 âàðèàíò, êîãäà ðàçìåð çàäàí â K êèëëîáàéòàõ
  303. ;âíóòðåííûé ôîðìàò äàííûõ ýòî êîë-âî çàïðîùåíîé ïàìÿòè â êá.
  304.         test    bx, bx
  305.         jnz     @f      ;åñëè çíà÷åíèå îòëè÷íî îò 0
  306. ;;;;;ñîîáùåíèå îá îøèáêå, ðàçìåð "íàéäåíîãî" áëîêà =0 ìèíèìàëüíî ìû äîëæíû
  307. ;óñòàíîâèòü 64 êá ðàçìåð ðàì äèñêà.
  308.         or      show_errors_sect, show_error_3
  309.         mov     bx, 64
  310. @@:
  311.         jmp     ._end_parse_RS
  312.  
  313.  
  314. .rest_value_loop_RS:
  315.         mov     di, ax
  316.         mov     cx, bx
  317.         jmp     .start_p_RS
  318.        
  319.        
  320.        
  321. .end_get_RS_ERROR_1:
  322. ;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :(
  323.         or      show_errors_sect, show_error_1
  324.         jmp     ._end_parse_RS
  325. .end_get_RS_ERROR_2:    
  326.         or      show_errors_sect, show_error_2
  327.  
  328. ._end_parse_RS:
  329. if DEBUG
  330.         pusha
  331.         movzx   eax, bx
  332.         mov     cx, 0x0a
  333.         mov     di, RamdiskSize_msg
  334.         mov     dword[ds:di], '    '
  335.         mov     word [ds:di+4], '  '
  336.         call    decode
  337. ;Show size
  338.         mov     si, RamdiskSize_msg
  339.         call    printplain
  340.  
  341.         popa
  342. end if  
  343.  
  344. }
  345.  
  346. macro use_free_memory
  347. {      
  348. local _support_function_use_free_memory
  349. ;ìàêðîñ äëÿ ïîëó÷åíèÿ îáùåãî ÷èñëà äîñòóïíîé ïàìÿòè â êá, äëÿ ôîðìèðîâàíèÿ ðàì äèñêà çà ïðåäåëàìè 1 ìá.
  350. ;èñïîëüçóåòñÿ 0õ88 ôóíêöèÿ 0õ15 ïðåðûâàíèÿ
  351. ; åñëè ïîääåðæèâàåòñÿ ôóíêöèÿ, òî â ax çíà÷åíèå â êá, åñëè íåò, òî â ax=0
  352.         mov     ah, 0x88 ;ah,0x88
  353.         int     0x15
  354.         jnc     ._support_function_use_free_memory
  355.         xor     ax, ax
  356. ;âîçâðàùàåò â ax ÷èñëî â êá
  357. ._support_function_use_free_memory:
  358.         mov     free_ad_memory, ax ; åñëè íå ïîääåðæèâàåòñÿ áèîñîì, òî â ax=0
  359. if DEBUG
  360.         pushad
  361.         movzx   eax, ax
  362.         mov     cx, 0x0a
  363.         mov     di, free_memory_msg
  364.         mov     dword[ds:di], '    '
  365.         mov     word [ds:di+4], '  '
  366.         call    decode
  367. ;Show size
  368.         mov     si, free_memory_msg
  369.         call    printplain
  370.  
  371.         popad
  372. end if  
  373.  
  374.  
  375.  
  376.  
  377. }
  378. macro show_ERRORS
  379. {
  380.  
  381. }
  382.  
  383. macro get_type_FS ;ïîëó÷èòü è ñîçäàòü îáðàç äëÿ çàäàííîé RFS.
  384. {
  385.         mov     di, point_default  ;restore value
  386.         mov     cx, save_cx_d
  387. .start_g_tpe_RFS:
  388.         call    get_firs_sym    ;get first symbol on new line
  389.         test    cx, cx
  390.         jz      ._end_parse_FRS ;._end_get_type_RFS     ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
  391.         cmp     al, 'R'
  392.         jnz     .start_g_tpe_RFS
  393. ;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
  394. ;        parse_RamdiskSize
  395.         mov     bx, cx
  396.         mov     ax, di
  397.  
  398.         mov     si, parse_RamdiskFS
  399.         mov     cx, parse_RamdiskFS_e - parse_RamdiskFS
  400.         repe cmpsb
  401.         jnz     .start_g_tpe_RFS_rest_v    ;is not compare
  402.  
  403.         sub     bx, parse_RamdiskFS_e - parse_RamdiskFS;correct cx
  404.         add     bx, cx
  405.         mov     cx, bx
  406.  
  407.         test    status_flag, flag_found_GTRFMS          ;îöåíêà ôëàãîâ
  408.         jz      .correct_is_not_set_FRS
  409.  
  410. ;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
  411. ;       call    printplain
  412. ;       jmp     .get_next_str
  413.  
  414. .correct_is_not_set_FRS:
  415.         mov     ax, 0x3d20         ;cut al=' ' ah='='
  416.         repe scasb
  417.         test    cx, cx
  418.         jz      .end_get_FRS_ERROR_1          ;not found param
  419.        
  420.         cmp     ah, byte [es:di-1]   ;find '='
  421.         jnz     .start_g_tpe_RFS                        ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
  422.        
  423.         repe scasb                 ;cut ' '
  424.         inc     cx
  425.         dec     di
  426. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  427. ;Òóò íóæíî ïðåîáðàçîâûâàòü ñòðî÷êó â öèôðîâîå çíà÷åíèå.
  428. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  429.         mov     bx, cx
  430.         mov     ax, di
  431.  
  432.         mov     si, parse_RFS_FAT
  433.         mov     cx, parse_RFS_FAT_e - parse_RFS_FAT
  434.         repe cmpsb
  435.         jnz     .krfs_cmp          ;is not compare
  436.  
  437. make_FAT_RamFS  ;ñäåëàòü
  438.  
  439. if DEBUG
  440.         pusha
  441.         mov     si, make_fat12_RFS_msg
  442.         call    printplain
  443.         popa
  444. end if  
  445.         jmp     ._end_parse_FRS
  446.  
  447. .krfs_cmp:              
  448.         mov     cx, bx
  449.         mov     di, ax
  450.  
  451.         mov     si, parse_RFS_KRFS
  452.         mov     cx, parse_RFS_KRFS_e - parse_RFS_KRFS
  453.         repe cmpsb
  454. ;       jnz     @f         ;is not compare
  455.  
  456.         jmp     ._end_parse_FRS
  457.  
  458.  
  459. .start_g_tpe_RFS_rest_v:
  460.         mov     cx, bx
  461.         mov     di, ax
  462.         jmp     .start_g_tpe_RFS
  463.        
  464.        
  465.        
  466. .end_get_FRS_ERROR_1:
  467. ;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :(
  468.         or      show_errors_sect, show_error_1
  469.         jmp     ._end_parse_FRS
  470. .end_get_FRS_ERROR_2:  
  471.         or      show_errors_sect, show_error_2
  472.  
  473. ._end_parse_FRS:
  474. if DEBUG
  475.         pusha
  476.         mov     si, get_type_FS_msg
  477.         call    printplain
  478.         popa
  479. end if  
  480.  
  481.  
  482.  
  483. }
  484. macro make_FAT_RamFS
  485. {
  486. local .RS1
  487. local .fat12
  488. local .fat16
  489. ; ìû äîëæíû ñôîðìèðîâàòü â íà÷àëüíûé îáðàç Ram FS, à ïîòîì çàïèñàòü åãî çà îáëàñòü âûøå 1 ìá..
  490. ;äëÿ ñëó÷àÿ ñ FAT12
  491. ;       mov     di,fat12_buffer ;ds äîëæåí áûòü = cs
  492. ;es:di - óêàçûâàþò íà íà÷àëî áëîêà äëÿ ôîðìèðîâàíèÿ ðàì ôñ.
  493. use_RamdiskSector       ;âîçðàùàåìîå çíà÷åíèå â ax ðàçìåð ñåêòîðà â áàéòàõ
  494.         cmp     ax, 4096;ïî ñïåöèôèêàöèè çíà÷åíèå äîëæíî áûòü â ïðåäåëàõ îò 1 äî 4096
  495.         ja      .RS1
  496.         test    ax, ax
  497.         jnz     @f      ;îøèáêà åñëè ñþäà ïðûãíóëè âñå òàêè ...
  498.  
  499. .RS1:
  500.         mov     word [fat12_buffer.BPB_BytsPerSec], 512
  501. ;;;;;;;;;;ñêàæåì ÷òî ïî äåôîëòó áóäåì þçàòü çíà÷åíèå...
  502. @@:
  503.         mov     word [fat12_buffer.BPB_BytsPerSec], ax;òóò âñå îê
  504.  
  505. ;BPB_SecPerClus êîë-âî ñåêòîðîâ â êëàñòåðå
  506. use_RamdiskCluster      ;âîçðàùàåìîå çíà÷åíèå â al
  507.         cmp     al, 128
  508.         ja      @f
  509. ;       test    al,0x1  ;ïðîâåðêà íà êðàòíîñòü )
  510. ;       jnz     @f
  511.  
  512.         mov     byte [fat12_buffer.BPB_SecPerClus], al
  513.  
  514.         ;incorrect value will be set dafault
  515.  
  516. ;íèæå íåêîððåêòíîå çíà÷åíèå â ò.ê. ðàçìåð êðàòåí 2 è â äèàïàçîíå îò 1 äî 128 âêëþ÷èòåëüíî
  517. ; ìû äîëæíû ðóãíóòüñÿ íà ýòî
  518. ;@@:    ;mov    byte [fat12_buffer.BPB_SecPerClus],1    
  519.  
  520. ;;;;; îïðåäåëåèì êàêàÿ ó íàñ áóäåò èñïîëüçîâàòüñÿ FAT
  521. ;ïî óñëîâèþ, fat12<4085<=fat16<65525<=fat32
  522. ; fat12_buffer.BPB_BytsPerSec*fat12_buffer.BPB_SecPerClus = êîë-âî ñåêòîðîâ
  523.         movzx   eax, word [fat12_buffer.BPB_BytsPerSec]
  524.         movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
  525.  
  526.         imul    ebx, eax;òóò ðàçìåðíîñòü ñåêòîðà
  527.         mov     eax, save_ramdisksize ;ðàçìåð çàïðîøåííîãî ðàì äèñêà â áàéòàõ
  528.         cdq
  529.         idiv    ebx
  530. ;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx
  531. ;ïîëó÷èì êîë-âî ñåêòîðîâ, è ìîæåì óæå îïðåäåëèòü òèï FAT êîòîðóþ íóæíî äåëàòü.
  532.         cmp     eax, 4085
  533.         jb      .fat12
  534.         cmp     eax, 65525
  535.         jb      .fat16
  536. ;;;;;;;;;;;;;;;;;;;;;;;; òóò fat32
  537.         mov     set_ramfs, 32   ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
  538.         mov     word [fat12_buffer.BPB_RsvdSecCnt], 32
  539.         xor     eax, eax
  540.         mov     word [fat12_buffer.BPB_RootEntCnt], ax
  541.         mov     word [fat12_buffer.BPB_TotSec16], ax
  542.         mov     dword [fat12_buffer.BPB_TotSec32], eax
  543.  
  544.  
  545. .fat16: ;fat16
  546. ;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000).
  547.         jmp     $
  548.         mov     set_ramfs, 16   ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
  549.         movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
  550.         imul    eax, ebx
  551.  
  552.         cmp     eax, 0x10000
  553.         jae     @f
  554.         mov     word [fat12_buffer.BPB_TotSec16], ax
  555.         mov     dword [fat12_buffer.BPB_TotSec32], 0
  556. @@:
  557. ;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò
  558. ;       mov     word [fat12_buffer.BPB_FATSz16],0x9     ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
  559. ;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî
  560. ;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî
  561. ;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü.
  562.         mov     eax, root_dir_entry_count
  563.         mov     word [fat12_buffer.BPB_RootEntCnt], ax  ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
  564. ;ïî äîêóìåíòàöèè ðåêîìåíäóþò îòðåçàòü 16 êá äëÿ ðóò äèð íî ýòî î÷ ìíîãî, äàæå äëÿ êîîñ. èìõî äëÿ íà÷àëà õâàòèò è 7 êá
  565. ;;;;;;;
  566. ;Äëÿ FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. Äëÿ FAT32 ýòî çíà÷åíèå
  567. ;ðàâíî 0, à êîëè÷åñòâî ñåêòîðîâ îäíîé FAT ñîäåðæèòñÿ â BPB_FATSz32.
  568. ;RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec - 1)) / BPB_BytsPerSec;
  569.  
  570. ;TmpVal1 = DskSize - (BPB_ResvdSecCnt + RootDirSectors);
  571. ;TmpVal2 = (256 * BPB_SecPerClus) + BPB_NumFATs;
  572. ;If(FATType == FAT32)
  573. ;    TmpVal2 = TmpVal2 / 2;
  574. ;FATSz = (TMPVal1 + (TmpVal2 - 1)) / TmpVal2;
  575. ;If(FATType == FAT32) {
  576. ;    BPB_FATSz16 = 0;
  577. ;    BPB_FATSz32 = FATSz;
  578. ;} else {
  579. ;    BPB_FATSz16 = LOWORD(FATSz);
  580. ;    /* there is no BPB_FATSz32 in a FAT16 BPB */
  581. ;}
  582. ;=====================================
  583. ;RootDirSectors
  584.         movzx   ebx, word [fat12_buffer.BPB_BytsPerSec]
  585.         imul    eax, 32
  586.         add     eax, ebx
  587.         dec     eax
  588.  
  589.         cdq
  590.         idiv    ebx
  591. ;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx äëÿ äèñêåòû 1.44 ó íàñ äîëæíî áûòü çíà÷åíèå =14
  592. ;BPB_ResvdSecCnt + RootDirSectors
  593.         movzx   ebx, word [fat12_buffer.BPB_RsvdSecCnt]
  594.         add     ebx, eax
  595.          
  596. ;DskSize ó íàñ ýòî çíà÷åíèå óæå ïîëó÷åíî è äîñòóïíî
  597.         movzx   eax, word [fat12_buffer.BPB_TotSec16]   ;äîëæåí áûòü â ñåêòîðàõ
  598.         sub     eax, ebx
  599.  
  600.  
  601. ;TmpVal1=eax
  602.         shl     edi, 8  ;=edi*256
  603.         movzx   ecx, byte [fat12_buffer.BPB_NumFATs]
  604.         add     edi, ecx
  605. ;TmpVal2=edi
  606.         add     eax, edi
  607.         dec     eax
  608.         cdq
  609.         idiv    edi
  610. ;FATSz = ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx
  611.         mov     word [fat12_buffer.BPB_FATSz16], ax
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620. .fat12: ;fat12
  621. if DEBUG
  622. ; âûâåäåì â îòëàäêå, ÷òî ñîáèðàåìñÿ äåëàòü îáðàç äèñêà c FS=fat12
  623.         pushad
  624.         mov     si, start_making_FAT12_msg
  625.         call    printplain
  626.         popad
  627. end if
  628.  
  629.  
  630.  
  631. ;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000).
  632.         mov     set_ramfs, 12   ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
  633.         movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
  634.         imul    eax, ebx
  635.  
  636.         cmp     eax, 0x10000
  637.         jae     @f
  638.         mov     word [fat12_buffer.BPB_TotSec16], ax
  639.         mov     dword [fat12_buffer.BPB_TotSec32], 0
  640. @@:
  641. ;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò
  642. ;       mov     word [fat12_buffer.BPB_FATSz16],0x9     ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
  643. ;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî
  644. ;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî
  645. ;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü.
  646.         mov     eax, root_dir_entry_count
  647.         mov     word [fat12_buffer.BPB_RootEntCnt], ax  ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
  648. ;ïî äîêóìåíòàöèè ðåêîìåíäóþò îòðåçàòü 16 êá äëÿ ðóò äèð íî ýòî î÷ ìíîãî, äàæå äëÿ êîîñ. èìõî äëÿ íà÷àëà õâàòèò è 7 êá
  649. ;;;;;;;
  650. ;DskSize(â ñåêòîðàõ)*12 (ðàçìåðíîñòü ôàéëîâîé ñèñòåìû, ò.å ïðåäïîëîæèì ñêîëüêî áèòîâ ïîòðåáóåòñÿ äëÿ àäðåñàöèè ýòîãî îáúåìà) /8 (÷òî ïîëó÷èòü ðàçìåð â áàéòàõ)
  651. ;ïîëó÷åííîå ÷èñëî îêðóãëÿåì â áîëüøóþ ñòîðîíó êðàòíîå ñåêòîðó ò.å. 512 áàéò Òàêîé ïîäõîä íå óíèâåðñàëåí, íî ïîêà ïîéäåò
  652. ;âîîáùå ó ìåëêîñîôò ýòî âñå ñ÷èòàåòñÿ ðó÷êàìè, íî ìû áóäåì þçàòü òîëüêî ïîä êîîñ ðàì äèñê ñ ôàò12
  653.         movzx   eax, word [fat12_buffer.BPB_TotSec16]
  654.         imul    eax, 12
  655.         shr     eax, 3  ;äåëèì íà 8 íî ò.å. íàì íóæíî äåëèòü åùå è íà 512 èëè áîëåå â çàâèñèìîñòè îò ðàçìåðîâ êëàñòåðà
  656.         movzx   ebx, word [fat12_buffer.BPB_BytsPerSec] ;ðàçìåð ñåêòîðà
  657.         cdq
  658.         idiv    ebx     ;ðàçäåëèì íà ðàçìåð êëàñòåðà
  659. ;ñåé÷àñ ó íàñ â eax çíà÷åíèå åãî íóæíî îêðóãëèòü â áîëüøóþ ñòîðîíó êðàòíîìó 512 áàéòàì
  660. ;ïðèìåíèì ñëåäóþùåå î÷èñòèì and è äîáàâèì 512 áàéò. òàêèì îáðàçîì âûðàâíèì íà 512 áàéò
  661. ;íî ò.ê. âñå ðàâíî äåëèòü íèæíèé êîä íàì íå íóæåí
  662. ;       and     eax,0xfff200
  663. ;       add     eax,0x200       ;äîáàâèì 512 áàéò        äëÿ 1.44 äèñêåòû èäåàëüíî ïîäõîäèò ))  
  664.  
  665.         inc     ax
  666. ;ïî èäåå äîëæíî íà êàæäóþ ôàò òàáëèöó
  667. ;ðåçåðâèðîâàòüñÿ 9 ñåêòîðîâ ò.å. ïîëó÷àåòñÿ 2*9=18+1 =19 ñåêòîðîâ ò.å. ðóò äèð íàõîäèòüñÿ íà ñ 20 ñåòîðà ò.å. ñ àäðåñà 0õ2600
  668. ;ñåé÷àñ íóæíî âû÷èñëèòü ñêîëüêî áóäåò ñåêòîðîâ çàíèìàòü ôàò ) íóæíî ðàçäåëèòü íà 512
  669. ;FATSz = ñåé÷àñ ÷àñòíîå â eax
  670.         mov     word [fat12_buffer.BPB_FATSz16], ax
  671. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  672. get_firstDataSector ;ïîëó÷èòü ñìåùåíèå äî äàííûõ
  673. ;ñîçäàäèì ïåâóþ çàïèñü â ôàò ïî îïðåäåëåííîìó àäðåñó.
  674. first_create_fat_table
  675. ;çàêèíèì BPB ôàéëîâîé ñèñòåìû çà 1 ìá.
  676. use_BPB_RAM
  677. ;
  678. ;êîïèðîâàíèå ôàéëà.
  679. use_RamdiskFile
  680.  
  681. ;;;; âû÷èñëÿåì óêàçàòåëü íà êîðíåâóþ äèð FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16);
  682. ;       movzx   ebx, [fat12_buffer.BPB_NumFATs]
  683. ;       movzx   eax,ax
  684. ;       imul    eax,ebx
  685. ;eax=(BPB_NumFATs * BPB_FATSz16)
  686. ;       inc     eax
  687. ; BPB_ResvdSecCnt çíà÷åíèå òîëüêî 1 äëÿ fat12/16
  688. ;â eax óêàçàòåëü íà root dir. äëÿ äèñêåòû fat12 äîëæíî ïîëó÷èòüñÿ ïðè êîë-âî êîïèé fat 1  = 1+ (1*1) =2 èëè 3
  689.  
  690. if DEBUG        
  691.         pusha
  692. ;       mov     ax,point_default
  693. ;        mov     ax,cx
  694.         mov     cx, 0x0a
  695.         mov     di, show_db1
  696. ;        mov     dword[ds:di],'    '
  697. ;       mov     word [ds:di+4],'  '
  698.         call    decode
  699. ;Show size
  700.         mov     si, show_db1
  701.         call    printplain
  702. ;
  703. ;       xor     ax,ax
  704. ;       int     0x16
  705.         popa
  706. end if  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714. }
  715.  
  716. macro use_RamdiskSector
  717. {
  718. ;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ
  719.         mov     di, point_default  ;restore value
  720.         mov     cx, save_cx_d
  721.  
  722. .start_RamdiskSector:
  723.         call    get_firs_sym    ;get first symbol on new line
  724.         test    cx, cx
  725.         jz      .end_RamdiskSector      ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
  726.  
  727.         cmp     al, 'R'
  728.         jnz     .start_RamdiskSector
  729. ;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
  730. ;        parse_RamdiskSize
  731.  
  732.         mov     bx, cx
  733.         mov     ax, di
  734.  
  735.         mov     si, parse_RamdiskSector
  736.         mov     cx, parse_RamdiskSector_e - parse_RamdiskSector
  737.         repe cmpsb
  738.         jnz     .RamdiskSector_rest_val    ;is not compare
  739.  
  740.         sub     bx, parse_RamdiskSector_e - parse_RamdiskSector;correct cx
  741.         add     bx, cx
  742.         mov     cx, bx
  743.  
  744.         test    status_flag, flag_found_RamdiskSector           ;îöåíêà ôëàãîâ
  745.         jz      .correct_is_not_set_RamdiskSector
  746.  
  747. ;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
  748. ;       call    printplain
  749. ;       jmp     .get_next_str
  750.  
  751. .correct_is_not_set_RamdiskSector:
  752.         mov     ax, 0x3d20         ;cut al=' ' ah='='
  753.         repe scasb
  754.         jcxz    .end_get_RamS_ERROR_1          ;not found param
  755.        
  756.         cmp     ah, byte [es:di-1]   ;find '='
  757.         jnz     .start_RamdiskSector                    ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
  758.        
  759.         repe scasb                 ;cut ' '
  760.         inc     cx
  761.         dec     di
  762. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  763.         xor     bx, bx
  764.         mov     cx, 4
  765. @@:
  766.         movzx   ax, byte [es:di]
  767.         cmp     al, '0'
  768.         jb      .end_RamdiskSector
  769.         cmp     al, '9'
  770.         ja      .end_RamdiskSector
  771. ;;;;;;;;;;;;;;;;;;;
  772.  
  773.         imul    bx, 10
  774.         xor     al, 0x30
  775.         add     bx, ax
  776.  
  777.         inc     di
  778.  
  779.         loop    @b
  780.         jmp     .end_RamdiskSector
  781.  
  782.  
  783. .RamdiskSector_rest_val:
  784.         mov     cx, bx
  785.         mov     di, ax
  786.         jmp     .start_RamdiskSector
  787. .end_get_RamS_ERROR_1:
  788.  
  789. .end_RamdiskSector:
  790.         mov     ax, bx
  791.  
  792. if DEBUG
  793.         pusha
  794.         movzx   eax, bx;save_cx_d;point_default
  795.         mov     cx, 0x0a
  796.         mov     di, RamdiskSector_msg
  797.         mov     dword[ds:di], '    '
  798.         mov     dword [ds:di+4], '    '
  799.         call    decode
  800. ;Show size
  801.         mov     si, RamdiskSector_msg
  802.         call    printplain
  803.  
  804.         popa
  805. end if  
  806.  
  807. ;       pop     di
  808. ;       pop     es
  809. }
  810.  
  811. macro use_RamdiskCluster
  812. {
  813. ;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ
  814. ;       push    es
  815. ;       push    di
  816.         mov     di, point_default  ;restore value
  817.         mov     cx, save_cx_d
  818. ;       push    ini_data_
  819. ;       pop     es
  820. .start_RamdiskCluster:
  821.         call    get_firs_sym    ;get first symbol on new line
  822.         test    cx, cx
  823.         jz      .end_RamdiskCluster     ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
  824.         cmp     al, 'R'
  825.         jnz     .start_RamdiskCluster
  826. ;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
  827. ;        parse_RamdiskSize
  828.  
  829.         mov     bx, cx
  830.         mov     ax, di
  831.  
  832.         mov     si, parse_RamdiskCluster
  833.         mov     cx, parse_RamdiskCluster_e - parse_RamdiskCluster
  834.         repe cmpsb
  835.         jnz     .RamdiskCluster_rest_val           ;is not compare
  836.  
  837.         sub     bx, parse_RamdiskCluster_e - parse_RamdiskCluster;correct cx
  838.         add     bx, cx
  839.         mov     cx, bx
  840.  
  841.         test    status_flag, flag_found_RamdiskCluster          ;îöåíêà ôëàãîâ
  842.         jz      .correct_is_not_set_RamdiskCluster
  843.  
  844. ;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
  845. ;       call    printplain
  846. ;       jmp     .get_next_str
  847.  
  848. .correct_is_not_set_RamdiskCluster:
  849.         mov     ax, 0x3d20         ;cut al=' ' ah='='
  850.         repe scasb
  851.         jcxz    .end_get_RamSC_ERROR_1          ;not found param
  852.        
  853.         cmp     ah, byte [es:di-1]   ;find '='
  854.         jnz     .start_RamdiskCluster                   ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
  855.        
  856.         repe scasb                 ;cut ' '
  857.         inc     cx
  858.         dec     di
  859. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  860. @@:
  861.         movzx   ax, byte [es:di]
  862.         cmp     al, '0'
  863.         jb      .end_RamdiskCluster
  864.         cmp     al, '9'
  865.         ja      .end_RamdiskCluster
  866. ;;;;;;;;;;;;;;;;;;;
  867.         xor     al, 0x30
  868.  
  869.         jmp     .end_RamdiskCluster
  870.  
  871.  
  872. .RamdiskCluster_rest_val:
  873.         mov     cx, bx
  874.         mov     di, ax
  875.         jmp     .start_RamdiskCluster
  876. .end_get_RamSC_ERROR_1:
  877.  
  878. .end_RamdiskCluster:
  879. if DEBUG
  880.         pusha
  881.         mov     cx, 0x0a
  882.         mov     di, RamdiskCluster_msg
  883. ;        mov     word[ds:di],'  '
  884.         call    decode
  885. ;Show size
  886.         mov     si, RamdiskCluster_msg
  887.         call    printplain
  888.  
  889.         popa
  890. end if  
  891.  
  892. }
  893.  
  894. macro use_Loader_Image
  895. ;ïðåäíàçíà÷åí äëÿ çàãðóçêè îáðàçîâ âûøå 1 Ìá.
  896. ;ïåðâîíà÷àëüíàÿ âåðñèÿ çàãðóæàåò îáðàç äèñêåòû 1.44 ìá
  897. {
  898. local .start_p_LI
  899. local .exit
  900. local .error_LI
  901. local .rest_value_loop
  902. local .found_end_str
  903.         mov     di, point_default  ;restore value
  904.         mov     cx, save_cx_d
  905. ;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
  906. .start_p_LI:
  907.         call    get_firs_sym    ;get first symbol on new line
  908.         test    cx, cx
  909.         jz      .exit   ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
  910.         cmp     al, 'L'
  911.         jnz     .start_p_LI
  912. ;ïðîâåðêà íà çíà÷åíèå LoaderModule
  913. ;        parse_LoaderModule
  914.         mov     bx, cx
  915.         mov     ax, di
  916.  
  917.         mov     si, parse_LoaderImage
  918.         mov     cx, parse_LoaderImage_e - parse_LoaderImage
  919.         repe cmpsb
  920.         jnz     .rest_value_loop           ;is not compare
  921.  
  922.         sub     bx, parse_LoaderImage_e - parse_LoaderImage;correct cx
  923.         add     bx, cx
  924.         mov     cx, bx
  925.  
  926. ;       test    status_flag,flag_found_LM               ;îöåíêà ôëàãîâ
  927. ;       jz      .correct_is_not_set_LI          
  928.  
  929. ;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
  930. ;       call    printplain
  931. ;       jmp     .get_next_str
  932.  
  933. ;.correct_is_not_set_LI:
  934.         mov     ax, 0x3d20         ;cut al=' ' ah='='
  935.         repe scasb
  936.         jcxz    .rest_value_loop_LI          ;not found param timeout
  937.        
  938.         cmp     ah, byte [es:di-1]   ;find '='
  939.         jnz     .rest_value_loop_LI
  940.        
  941.         repe scasb                 ;cut ' '
  942.         inc     cx
  943.         dec     di
  944. ;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
  945. ;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
  946. ;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
  947. ;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
  948. ;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader
  949. ;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
  950. ;ñîõðàíèëè ïåâûå 2 word
  951.         push    dword [es:di-6]
  952.         lea     si, [di-6]
  953.  
  954.         push    word [es:di-2]
  955.         xor     ax, ax
  956.         mov     word [es:di-6], ax      ;âíîñèì íóæíûå çíà÷åíèÿ
  957. ;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
  958.         mov     ax, info_real_mode_size ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
  959.  
  960.  
  961.         mov     word [es:di-4], ax
  962.         mov     word [es:di-2], 16      ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì
  963. ;;;;;; ïîèñê êîíöà ñòðî÷êè
  964. @@:
  965.         mov     al, byte [es:di]
  966.         cmp     al, ' '
  967.         jz      .found_end_str
  968.         cmp     al, 0xa
  969.         jz      .found_end_str
  970.         cmp     al, 0xd
  971.         jz      .found_end_str
  972.         inc     di
  973.         dec     cx
  974.         jnz     @b
  975. ;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè
  976. .found_end_str:
  977. ; ÷òåíèå áëîêà ïî 64 êá â ñåãìåíò è çàáðàñûâàíèå åãî âûøå 1 ìá.
  978.         push    word [es:di]
  979.         xor     ax, ax
  980.         mov     word [es:di], ax
  981. ;        xor     ax,ax   ; function 1 - read file
  982.         mov     di, si  ;file_data
  983.         inc     ax
  984.         push    si
  985.         push    es
  986.         call    far dword [loader_callback]
  987.         push    cs
  988.         pop     ds
  989.  
  990.         pop     es
  991.         pop     si
  992.  
  993.         test    bx, bx
  994.         jnz     .error_LM
  995.  
  996.  
  997. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; çàáðàñûâàíèå áëîêà â 64 êá âûøå 1 ìá.
  998.         mov     si, table_15_87
  999.         push    es
  1000.         push    ds
  1001.         pop     es
  1002.         mov     cx, 256*18
  1003.         mov     ah, 0x87
  1004.         int     0x15
  1005.         pop     es
  1006.         pop     dx cx
  1007.         test    ah, ah
  1008.  
  1009.  
  1010.  
  1011.         jmp     far dword [es:si]
  1012.  
  1013.  
  1014.  
  1015.  
  1016. .rest_value_loop:
  1017.         mov     di, ax
  1018.         mov     cx, bx
  1019.         jmp     .start_p_LI
  1020.  
  1021. .exit:
  1022.  
  1023.  
  1024.  
  1025. }
  1026.  
  1027.  
  1028.  
  1029. macro name_in_root_fat
  1030. ;ìàêðîñ, êîòîðûé çàïèñûâàåò èíôîðìàöèþ î çàãðóæåííîì ôàéëå â êîðíåâóþ ôàò òàáëèöó
  1031. {
  1032.  
  1033. }
  1034.  
  1035.  
  1036.  
  1037. macro use_RamdiskFile
  1038. {
  1039. ;çàãðóçêà ôàéëîâ ñ èñïîëüçîâàíèå callback ñåðâèñà ïåðâè÷íîãî çàãðóç÷èêà
  1040. ;èñïîëüçóåòñÿ òîëüêî äëÿ çàãðóçêè íåîáõîäèìûõ è íåáîëüøèõ ôàéëîâ, ò.ê. äîñòàòî÷íî ìåäëåííî ðàáîòàåò
  1041. ;äëÿ çàãðóçêè èñïîëüçóåò 0õ87 ôóíêöèþ int 0x15 ïðåðûâàíèÿ - çàãðóçêà áëîêîâ äàííûõ äî 64 êá âûøå 1 ìá
  1042. local   .start_loop
  1043. local   ._end
  1044. local   .rest_value_loop
  1045. local   .error
  1046.         mov     di, point_default  ;restore value
  1047.         mov     cx, save_cx_d
  1048.         mov     data_offset, 0  ;clean offset
  1049. ;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
  1050. .start_loop:
  1051.         call    get_firs_sym    ;get first symbol on new line
  1052.         test    cx, cx
  1053.         jz      ._end   ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
  1054.         cmp     al, 'R'
  1055.         jnz     .start_loop
  1056. ;ïðîâåðêà íà çíà÷åíèå RamdiskFile
  1057.         mov     bx, cx
  1058.         mov     ax, di
  1059.  
  1060.         mov     si, parse_RamdiskFile
  1061.         mov     cx, parse_RamdiskFile_e - parse_RamdiskFile
  1062.         repe cmpsb
  1063.         jnz     .rest_value_loop           ;is not compare
  1064.  
  1065.         sub     bx, parse_RamdiskFile_e - parse_RamdiskFile;correct cx
  1066.         add     bx, cx
  1067.         mov     cx, bx
  1068. ;       test    status_flag,flag_found_LM               ;îöåíêà ôëàãîâ
  1069. ;       jz      .correct_is_not_set_LM          
  1070.  
  1071. ;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
  1072. ;       call    printplain
  1073. ;       jmp     .get_next_str
  1074.  
  1075. ;.correct_is_not_set_LM:
  1076.         mov     ax, 0x3d20         ;cut al=' ' ah='='
  1077.         repe scasb
  1078.         test    ecx, ecx
  1079.         jz      .rest_value_loop   ;not found param timeout
  1080.        
  1081.         cmp     ah, byte [es:di-1] ;find '='
  1082.         jnz     .rest_value_loop
  1083.        
  1084.         repe scasb                 ;cut ' '
  1085.         inc     cx
  1086.         dec     di
  1087.  
  1088.         mov     save_di_RAMDISK, di
  1089.         mov     save_cx_RAMDISK, cx
  1090. ;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
  1091. ;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
  1092. ;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
  1093. ;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
  1094. ;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà RamdiskFile = @menu,@menu
  1095. ;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'@menu',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
  1096. ;ñîõðàíèëè ïåâûå 2 word
  1097.  
  1098. ;
  1099. @@:
  1100.         mov     al, byte [es:di]
  1101.         cmp     al, ','         ; ò.å. èùåì ðàçäåëèòåëü
  1102.         jz      .found_end_str
  1103.         inc     di
  1104.         dec     cx
  1105.         jnz     @b
  1106. ;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðøåíèÿ ñòðîêè
  1107. .found_end_str:
  1108. ;        mov    al,byte [es:di]
  1109. ;       cmp     al,' '          ; óáèðàåì ïðîáåëû, åñëè îíè åñòü
  1110. ;       jnz     @f
  1111. ;       inc     di
  1112. ;       dec     cx
  1113. ;       jnz     .found_end_str
  1114.  
  1115. ;@@:
  1116.         mov     point_to_dest_file_name, di
  1117.         inc     di
  1118. ;ïðîâåðêà èíäèâèäóàëüíîñòè èìåíè ôàéëà
  1119. check_name_file
  1120. ;/restore di - point and cx -size section
  1121.         mov     di, save_di_RAMDISK
  1122.         mov     cx, save_cx_RAMDISK
  1123.  
  1124.         test    al, al
  1125.         jnz     .start_loop     ;åñëè â al çíà÷åíèå íå =0, òî òàêîå èìÿ óæå ñóùåñòâóåò â ñèñòåìå.
  1126.  
  1127.  
  1128.  
  1129.         push    dword [es:di-6]
  1130.         lea     si, [di-6]
  1131.  
  1132.         push    word [es:di-2]
  1133.         push    di
  1134.         xor     ax, ax
  1135.         mov     word [es:di-6], ax      ;âíîñèì íóæíûå çíà÷åíèÿ
  1136. ;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
  1137.         mov     ax, info_real_mode_size ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
  1138.  
  1139.  
  1140.         mov     word [es:di-4], ax
  1141.         mov     word [es:di-2], 16      ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ÷èòàåì
  1142.  
  1143.         mov     di, point_to_dest_file_name
  1144.  
  1145. if DEBUG
  1146.         pushad
  1147. ;       mov     ax,di
  1148.         mov     cx, 0x0a
  1149.         mov     di, name_of_seg_get_64
  1150.         mov     dword[ds:di], '    '
  1151.         mov     word[ds:di+4], '  '
  1152.         call    decode
  1153. ;Show size
  1154.         mov     si, name_of_seg_get_64
  1155.         call    printplain
  1156.  
  1157.         popad
  1158. end if  
  1159.  
  1160.         push    word [es:di]
  1161.         push    cx
  1162.         xor     ax, ax
  1163.         mov     word [es:di], ax
  1164. ;        xor     ax,ax   ; function 1 - read file
  1165.         push    di
  1166.         mov     di, si  ;file_data
  1167.         inc     ax
  1168.         push    si
  1169.         push    es
  1170.         push    bp
  1171.  
  1172.         push    es
  1173.         pop     ds
  1174.         push    cs
  1175.         pop     es
  1176.  
  1177.         call    far dword [es:loader_callback]
  1178.  
  1179.  
  1180.         push    cs
  1181.         pop     ds
  1182.  
  1183.         pop     bp
  1184.         pop     es
  1185.         pop     si
  1186.  
  1187.         cmp     bx, 2
  1188.         ja      .error
  1189. ; ñåé÷àñ ó íàñ â dx:ax ðàçìåð ôàéëà, êîòîðûé ìû çàãðóçèëè.
  1190. ; âîçìîæíà ñèòóàöèÿ, êîãäà â bx=1 ò.å. åñòü åùå äàííûå íà äèñêå
  1191.         mov     status_flag_loader_f, bx
  1192.  
  1193.         shl     edx, 16
  1194.         mov     dx, ax
  1195. ;       shr     edx,10  ;ðàçìåð ôàéëà â êá.
  1196. ;;â edx ðàçìåð â áàéòàõ.        
  1197.         mov     save_file_size, edx
  1198.         mov     eax, edx
  1199. ;âîññòàíîâèì ïîëíîñòüþ ôàéë ñöåíàðèÿ
  1200.         pop     di
  1201.         pop     cx      ;äëèííà îñòàòêà ñ 2-îé ÷àñòüþ èìåíè ò.å. ñ èìåíåì íàçíà÷åíèåì.
  1202.         pop     word [es:di]
  1203.         pop     di
  1204.         pop     word [es:di-2]
  1205.         pop     dword [es:di-6]
  1206.        
  1207.  
  1208. if DEBUG
  1209.         pushad
  1210.         mov     cx, 0x0a
  1211.         mov     di, RamdiskFile_msg
  1212.         mov     dword[ds:di], '    '
  1213.         call    decode
  1214. ;Show size
  1215.         mov     si, RamdiskFile_msg
  1216.         call    printplain
  1217.  
  1218.         popad
  1219. end if  
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225.  
  1226.  
  1227.  
  1228.  
  1229.  
  1230. ; çàãðóçèì ÷åìó ó íàñ ðàâåí êëàñòåð
  1231. ;       mov     ax,word [fat12_buffer.BPB_BytsPerSec] ;êîë-âî áàéòîâ â ñåêòîðå ìîæåò áûòü ëþáîå 512 1024 2048 4096 2 áàéòà
  1232. ;       movzx   bx,byte [fat12_buffer.BPB_SecPerClus] ;êîë-âî ñåêòîðîâ â êëàñòåðå
  1233. ;       imul    ax,bx
  1234. ;ñåé÷àñ â eax ðàçìåð êëàñòåðà (512) áàéò
  1235. ;â edx äëèíà ôàéëà â áàéòàõ äî 64 êá    
  1236. ;çàêèíèì ôàéë çà 1 ìá
  1237. ;1 íàì íóæíî ñîñòàâèòü ôàò òàáëèöó ò.å. ïðîèçâåñòè ðàçìåòêó ðàìäèñêà, çàòåì ïåðåíåñåì ïî àäðåñó ôàéë
  1238.  
  1239. ;çàïèñàòü èíôîðàìàöèþ î ôàéëå â êîðíåâóþ äèðåêòîðèþ
  1240. register_file_in_fat
  1241. ;ïåðåíåñòè çà 1 ìá ñîäåðæèìîå ôàéëà
  1242. move_file_up
  1243.  
  1244. ;ïðîâåðèì, çàãðóæåí ëè äî êîíöà ôàéë? ò.å. åñëè ðàçìåð ôàéëà áîëüøå ÷åì 64 êá, òî áóäåò ïîäãðóæàòü îñòàâøèåñÿ áëîêè
  1245.         cmp     status_flag_loader_f, 0x1
  1246.         jnz     @f
  1247. ;íóæíî äîçàãóçèòü äàííûå ôàéëà è ïåðåíåñòè èõ çà 1-ûé ìá ñîãëàñíî ôàò ñòðóêòóðå
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257. @@:
  1258. ;òóò îðãàíèçîâàí öèêë ïî çàãðóçêå ôàéëîâ â êîðíåâóþ äèðåêòîðèþ
  1259.         mov     di, save_di_RAMDISK
  1260.         mov     cx, save_cx_RAMDISK
  1261. if DEBUG        
  1262.         pusha
  1263.         xor     ax, ax
  1264.         int     0x16
  1265.         popa
  1266. end if  
  1267.  
  1268.  
  1269.         jmp     .start_loop
  1270.  
  1271.  
  1272. .error:
  1273.         ;call   error.LoaderModule
  1274. ;fixme!
  1275. .rest_value_loop:
  1276.         mov     di, ax
  1277.         mov     cx, bx
  1278.         jmp     .start_loop
  1279.  
  1280. ._end:
  1281. ;ïåðåíåñåì çà 1-ûé ìá ôàò è ðóò äèð
  1282. move_up_fat_and_root_d
  1283.  
  1284.  
  1285.  
  1286.  
  1287.  
  1288.  
  1289. ;çàãðóçêà áëîêà
  1290. ;       mov     ah,0x87
  1291. ;       mov     cx,     ;size in byte
  1292.        
  1293.  
  1294. ;es:si point to descripts
  1295.  
  1296.  
  1297. }
  1298.  
  1299. macro use_BPB_RAM ;çàêèíóòü ñàìûå ïåðâûå 512 áàéò çà 1-é ìá
  1300. ;äàííûé ìàêðîñ çàêèäûâàåò BPB ñòðóêòóðó ò.å. ïåðâûå 512 áàéò, ïîêà òîëüêî ôàò12 çà 1 ìá
  1301. {
  1302.         mov     ax, fat12_buffer
  1303.         mov     si, table_15_87
  1304.         add     word [si+8*2+2], ax
  1305.         push    es
  1306.         push    ds
  1307.         pop     es
  1308.         mov     cx, 256  ;áóò ñåêòîð  óêëàäûâàåòñÿ â 512 áàéò 512/2=256
  1309.         mov     ah, 0x87
  1310.         int     0x15
  1311.         pop     es
  1312. ;add 512 byte for destination adress
  1313. ;       add     dword [si+8*3+2], 512
  1314. ;        test    ah, ah
  1315. ;        jz    
  1316. if DEBUG        
  1317.         pusha
  1318.         mov     ax, word [si+8*2+2]
  1319.         mov     cx, 0x0a
  1320.         mov     di, BPB_msg
  1321.         call    decode
  1322. ;Show size
  1323.         mov     si, BPB_msg
  1324.         call    printplain
  1325.         popa
  1326. end if  
  1327. }
  1328. macro first_create_fat_table
  1329. ;äàííûé ìàêðîñ ñîçäàåò îôîðìëÿåò 3 ïåðâûõ áàéòà fat òàáëèöû, è óñòàíàâëèâàåò óêàçàòåëü íà ñëåäóþùèé áëîê, è âíîñèò 0 çíà÷åíèå
  1330. ;äëÿ ñìåùåíèÿ â êîðíåâîé òàáëèöå.
  1331. {
  1332.         mov     al, byte [fat12_buffer.BPB_Media]
  1333.  
  1334.  
  1335.         push    ds
  1336.  
  1337.  
  1338.         mov     di, info_real_mode_size
  1339.         add     di, 0x1000
  1340.  
  1341. if DEBUG
  1342.         pushad
  1343.  
  1344.         mov     ax, info_real_mode_size
  1345.         add     ax, 0x1000
  1346. ;       mov     ax,ds
  1347.         mov     cx, 0xa
  1348.                
  1349.         mov     di, first_entry_in_fat
  1350.         mov     dword [di], '    '
  1351.         mov     word [di+4], '  '
  1352.         call    decode
  1353. ;Show size
  1354.         mov     si, first_entry_in_fat
  1355.         call    printplain
  1356.  
  1357.         xor     ax, ax
  1358.         int     0x16
  1359.      
  1360.         popad
  1361. end if
  1362.  
  1363.  
  1364.         push    di   ;  push    word info_real_mode_size+0x1000   ;cëåäóþùèé ñåãìåíò çà çàãðóæåííûì ó÷àñòêîì
  1365.        
  1366.         xor     di, di
  1367.         mov     point_to_free_root, di  ;çíà÷åíèå ñìåùåíèÿ =0 â êîðíåâîé ôàò òàáëèöå îïèñàíèÿ
  1368.  
  1369.         pop     ds   ; çàãðóæåí ñëåäóþùèé ñåãìåíò ò.å. ïóñòîé ñåãìåíò
  1370.  
  1371.         mov     byte [di], al
  1372.         or      ax, -1
  1373.         inc     di
  1374.         mov     word [di], ax
  1375.  
  1376.         pop     ds
  1377.         mov     point_next_fat_str, 3
  1378.  
  1379. if DEBUG        
  1380.         pushad
  1381.         mov     ax, point_next_fat_str
  1382.         mov     cx, 0x0a
  1383.         mov     di, fat_create_msg
  1384.         call    decode
  1385. ;Show size
  1386.         mov     si, fat_create_msg
  1387.         call    printplain
  1388.         popad
  1389. end if  
  1390.  
  1391. }
  1392. macro register_file_in_fat
  1393. ;ìàêðîñ ðåãèñòðàöèè ôàéëà â ôàéëîâîé ñòðóêòóðå Fat
  1394. ;ïîêà ïîääåðæèâàåòñÿ òîëüêî ôàò12, ïîêà ))
  1395. ;âû÷èñëåíèå ñìåæíûõ êëàñòåðîâ è çàíåñåíèå èíôû â fat/
  1396. {
  1397. local   .step2
  1398. local   .step3
  1399. local   .end
  1400. local   .eof_file
  1401.  
  1402. ;di point on root dir íà ôðè ñåêöèþ.
  1403.         push    es
  1404.  
  1405.         mov     ax, info_real_mode_size
  1406.         add     ax, 0x1000
  1407.         mov     es, ax ;        push    word info_real_mode_size+0x1000   ;ñåãìåíò ñëåäóþùèé çà çàãðóæåííûì áëîêîì â 64 êá
  1408.  
  1409. ; îïðåäåëÿåì òèï ôàò ïîêà íå îïðåäåëÿåì, ïîêà òîëüêî ôàò 12
  1410. ; 12 áèò, äëÿ âû÷åñëåíèÿ ñîñåäíèõ êàëàñòåðîâ.
  1411.         mov     di, firstDataSect    ;â ñåêòîðàõ
  1412.         sub     di, size_root_dir
  1413. ;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
  1414.         shl     di, 9;imul 512
  1415.         add     di, point_to_free_root  ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
  1416. ;íåîáõîäèìî âíåñòè çíà÷åíèå â ðóò äèð ò.å. 32 áàéòà
  1417. if DEBUG        
  1418.         pushad
  1419. ;       mov     ax,point_default
  1420. ;        mov     ax,
  1421.         mov     cx, 0x0a
  1422.         mov     di, show_db2
  1423.         mov     dword[ds:di], '    '
  1424.         mov     word [ds:di+4], '  '
  1425.         call    decode
  1426. ;Show size
  1427.         mov     si, show_db2
  1428.         call    printplain
  1429. ;
  1430. ;       xor     ax,ax
  1431. ;       int     0x16
  1432.         popad
  1433. end if  
  1434.  
  1435.  
  1436.  
  1437. ;gs:di - óêàçàòåëü äëÿ âíåñåíèÿ èíôîðàöèè â ðóò îáëàñòü ôàò òàáëèöû èíîðìàöèè î ôàéëå.
  1438.         mov     si, shot_name_fat
  1439.         mov     cx, 11
  1440. ;çàïèøåì â ñòðóêòóðó èìÿ
  1441. @@:
  1442.         lodsb
  1443.         stosb
  1444.         loop    @b
  1445.  
  1446. ;çàïèøåì àòðèáóòû ôàéëà è DIR_NTRes - çàðåçåâðèðîâàííûé áàéò =0
  1447.         xor     ax, ax
  1448.         mov     ah, ATTR_VOLUME_ID
  1449.         mov     word [es:di], ax
  1450.         add     di, 2
  1451. ;DIR_CrtTimeTenth
  1452.         mov     byte [es:di], 100
  1453.         inc     di
  1454. ;DIR_CrtTime
  1455.         mov     word [es:di], 0x032b   ;äàòà
  1456.         add     di, 2
  1457. ;DIR_CrtDate
  1458.         mov     word [es:di], 0x0      ;âðåìÿ ><
  1459.         add     di, 2
  1460. ;DIR_LstAccDate
  1461.         mov     word [es:di], 0x032b   ;äàòà ìîåãî
  1462.         add     di, 2
  1463. ;DIR_FstClusHI
  1464.         mov     word [es:di], 0x0      ;âðåìÿ äëÿ ôàò12 /16 âñåãäà 0
  1465.         add     di, 2
  1466. ;DIR_WrtTime
  1467.         mov     word [es:di], 0x0      ;âðåìÿ ><
  1468.         add     di, 2
  1469. ;DIR_WrtDate
  1470.         mov     word [es:di], 0x032b
  1471.         add     di, 2
  1472.        
  1473.         mov     ax, point_next_fat_str
  1474.         mov     word [es:di], ax
  1475.         add     di, 2
  1476.  
  1477.         push    di
  1478. ;DIR_FstClusLO                  Ìëàäøåå ñëîâî íîìåðà ïåðâîãî êëàñòåðà.
  1479.  ;       mov     ax,point_next_fat_str   ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
  1480. ;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò
  1481.         mov     bx, ax
  1482.         shr     bx, 1
  1483.         add     ax, bx
  1484. ;â àõ ñåé÷àñ FATOffset
  1485. ;ThisFATEntOffset = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
  1486.         mov     bx, word [fat12_buffer.BPB_BytsPerSec]
  1487.         cwd
  1488.         idiv    bx
  1489. ;ax=ThisFATEntOffset= rem (FATOffset / BPB_BytsPerSec) ÷åòíûé èëè íå÷åòíûé óêàçàòåëü.
  1490.         mov     si, ax
  1491. ;íàì íóæíî â öèêëå çàïèñàòü âñå êëàñòåðû êîòîðûå áóäóò èñïîëüçîâàíû äëÿ ðàçìåùåíèÿ ôàéëà.
  1492. ;óçíàåì ðàçìåð êëàñòåðà.
  1493.         movzx   eax, word [fat12_buffer.BPB_BytsPerSec]
  1494.         movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
  1495.         imul    eax, ebx
  1496. ;ax - ðàçìåð êëàñòåðà.
  1497. ;ñåé÷àñ áóäåì çàïèñûâàòü âî âðåìåííûé áóôåð ôàò òàáëèöó äëÿ âûáðàííîãî ôàéëà. Ïîñêîëüêó ìû åãî çàãðóçèëè âîçìîæíî íå ïîëíîñòüþ
  1498. ;ìû îáðàáîòàåì çàïèñü äëÿ ôàò ïîëíîñòüþ, â íå çàâèñèìîñòè îò ïðåäåëà áóôåðà ãäå âîçìîæíà ÷àñòü ôàéëà.  
  1499.         mov     ebx, save_file_size     ;ðàçìåð ôàéëà â áàéòàõ
  1500.        
  1501. @@:
  1502.         sub     ebx, eax
  1503.         cmp     ebx, eax
  1504.         jbe     .eof_file
  1505.  
  1506.         inc     point_next_fat_str
  1507.         mov     cx, point_next_fat_str  ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
  1508. ;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò
  1509.         mov     dx, ax
  1510.         shr     dx, 1
  1511.         add     cx, dx
  1512.  
  1513.  
  1514.  
  1515.         test    si, 0x1
  1516.         jz      .step2
  1517.         shl     cx, 4
  1518.         mov     word[es:si], cx
  1519.         inc     si
  1520.         add     cx, ax
  1521.         jmp     @b
  1522.  
  1523. .step2:
  1524.         and     cx, 0x0FFF
  1525.         mov     word[es:si], cx
  1526.         inc     si
  1527.         add     cx, ax
  1528.         jmp     @b
  1529.  
  1530. .eof_file:
  1531.         mov     cx, 0x0fff
  1532.         test    si, 0x1
  1533.         jz      .step3
  1534.         shl     cx, 4
  1535.         mov     word[es:si], cx
  1536.         jmp     .end
  1537.  
  1538. .step3:
  1539.         and     cx, 0x0FFF
  1540.         mov     word[es:si], cx
  1541.  
  1542. .end:
  1543.         inc     point_next_fat_str
  1544.  
  1545.         pop     di
  1546. ;DIR_FileSize 32-áèòíûé DWORD ñîäåðæèò ðàçìåð ôàéëà â áàéòàõ.
  1547.         mov     eax, save_file_size
  1548.         mov     dword [es:di], eax
  1549.  
  1550. if DEBUG        
  1551.         pushad
  1552.  
  1553.         mov     di, firstDataSect    ;â ñåêòîðàõ
  1554.         sub     di, size_root_dir
  1555. ;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
  1556.         shl     di, 9;imul 512
  1557.         add     di, point_to_free_root  ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
  1558.  
  1559.         push    di
  1560.  
  1561.         mov     si, dest_name_fat
  1562.         mov     cx, 11
  1563.  
  1564. ;çàïèøåì â ñòðóêòóðó èìÿ
  1565. @@:
  1566.         mov     al, byte [es:di]
  1567.         inc     di
  1568.         mov     byte [ds:si], al
  1569.         inc     si
  1570.         loop    @b
  1571.        
  1572.         mov     di, si
  1573.         inc     di
  1574.         pop     ax
  1575.         mov     cx, 0xa
  1576.         call    decode
  1577.  
  1578.         mov     si, dest_name_fat
  1579.         call    printplain
  1580.         popad
  1581.  
  1582. END IF
  1583.  
  1584.  
  1585.  
  1586.  
  1587.  
  1588.         add     point_to_free_root, 32  ;óâåëèöèì ñìåùåíèå äî ñëåäóþùåãî çíà÷åíèÿ.
  1589.         pop     es
  1590.  
  1591. }
  1592.  
  1593.  
  1594.  
  1595.  
  1596.  
  1597. macro get_firstDataSector
  1598. ;ìàêðîñ äëÿ âû÷èñëåíèÿ ïåâîãî ñåêòîðà äàííûõ ò.å. äàííûõ ôàéëîâ â ôàòå
  1599. ;âû÷èñëèì FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;
  1600. {
  1601.         mov     ax, word [fat12_buffer.BPB_FATSz16]
  1602.         movzx   bx, byte [fat12_buffer.BPB_NumFATs]
  1603.         imul    ax, bx  ;9x1=9
  1604. ;ax=BPB_NumFATs * FATSz
  1605.         mov     bx, word [fat12_buffer.BPB_RootEntCnt]  ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
  1606.         shr     bx, 4   ;imul bx,32 and then div 512 -> in bx size in sectors
  1607.         add     ax, bx  ;9+14=23
  1608.         mov     size_root_dir, bx
  1609.         movzx   bx, byte [fat12_buffer.BPB_RsvdSecCnt]  ;add 1 for fat 16/12
  1610.         add     ax, bx
  1611. ;ax=firstDataSector - ãäå íà÷èíàåòñÿ ïåðâûé ñåêòîðî îò 0 ñåêòîðà â ñåêòîðàõ. - ôàêòè÷åñêè = 24 ñåêòîð
  1612.         mov     firstDataSect, ax       ;ñîõðàíèì äëÿ âû÷èñëåíèÿ
  1613. ;       ïîëó÷èìçíà÷åíèå êëàñòåðîâ, ýòî îáúåì â êîòîðûé ìû ìîæåì çàïèñàòü äàííûå
  1614.         mov     bx, word [fat12_buffer.BPB_TotSec16]
  1615.         sub     bx, ax
  1616.         mov     ax, bx
  1617.         movzx   bx, byte [fat12_buffer.BPB_SecPerClus]
  1618.         cwd
  1619.         idiv    bx
  1620.         mov     DataClasters, ax
  1621.  
  1622. if DEBUG        
  1623.         pushad
  1624.         mov     ax, firstDataSect       ;ïåðâûé ñåêòîð äàííûõ
  1625.         mov     cx, 0x0a
  1626.         mov     di, firstDataSect_msg
  1627.         call    decode
  1628. ;Show size
  1629.         mov     si, firstDataSect_msg
  1630.         call    printplain
  1631. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  1632.         mov     ax, size_root_dir       ;ðàçìåð ðóò äèð â ñåòîêòîðàõ
  1633.         mov     cx, 0x0a
  1634.         mov     di, size_root_dir_msg
  1635.         call    decode
  1636. ;Show size
  1637.         mov     si, size_root_dir_msg
  1638.         call    printplain
  1639. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  1640.         mov     ax, DataClasters;êëàñòåðû
  1641.         mov     cx, 0x0a
  1642.         mov     di, DataClasters_msg
  1643.         call    decode
  1644. ;Show size
  1645.         mov     si, DataClasters_msg
  1646.         call    printplain
  1647.         popad
  1648.  
  1649. end if  
  1650.  
  1651. }
  1652.  
  1653. macro use_RamdiskPATHS
  1654. ;ïàðñèíã ïóòè èñòî÷íèêà ôàéëîâ.
  1655. {
  1656.  
  1657. }
  1658.  
  1659. macro use_RamdiskPATHD
  1660. ;ïàðñèíã ïóòè íàçíà÷åíèÿ ôàéëîâ.
  1661. {
  1662.  
  1663. }
  1664. macro check_name_file
  1665. ;ìàêðîñ ïðîâåðêè èìåíè íà ïîâòîð, èìÿ äîëæíî áûòü óíèêàëüíûì.
  1666. ;âõîäíûå äàííûå: es- ñåãìåíò ãäå ëåæèò ôàéë äëÿ ïàðñèíãà ò.å. startos.ini
  1667. ;di - óêàçàòåëü íà èìÿ ôàéëà ò.å. es:di óêàçûâàåò íà èìÿ ôàéëà íàçíà÷åíèÿ
  1668. ;âûõîäíûå äàííûå eax =-1 èìÿ ñîâïàëî, eax=0 èìÿ íå ñîâïàëî.
  1669. {
  1670. local   .no_equal
  1671. local   .exit
  1672. local   .loop_size_root_dir
  1673. ;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
  1674. ;ïðåîáðàçóåì â àíàëîã ôàò çàïèñè ñòî÷êó ñ èìåíåì íàçíà÷åíèÿ
  1675.         convertion_file_name    ; ïðåîáðàçîâàëè èìÿ ïî íóæíûì ïðàâèëàì
  1676.         test    ax, ax
  1677.         jnz     .exit
  1678.  
  1679.         lea     si, [shot_name_fat]     ; desination name of file
  1680.  
  1681. ;âû÷èñëèì óêàçàòåëü íà êîðíåâóþ äèðåêòîðèþ
  1682.         mov     di, firstDataSect
  1683.         sub     di, size_root_dir
  1684. ;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
  1685.         shl     di, 9;imul 512
  1686. ;di= Ýòî ñìåùåíèå îò íà÷àëà áóôåðà äî ðóò äèðåêòîðèè. â ïðåäåëàõ 64 êá.
  1687. ;çàãðóçèì çíà÷åíèå - ò.å. êîë-âî ýëåìåíòîâ, êîòîðûå ìû ìîæåì ïðîñìàòðèâàòü.
  1688.         mov     dx, root_dir_entry_count
  1689.        
  1690.         mov     ax, info_real_mode_size
  1691.         add     ax, 0x1000
  1692.  
  1693.  
  1694.         mov     gs, ax
  1695. .loop_size_root_dir:
  1696. DEBUG1 equ 0
  1697. if DEBUG1        
  1698.         pushad
  1699.         push    di
  1700.         mov     eax, dword[gs:di]
  1701.         lea     si, [check_root_fat_+14]
  1702.         mov     dword [ds:si], '----'
  1703.         mov     dword [ds:si+4], '----'
  1704.         mov     dword [ds:si+8], '----'
  1705.         mov     dword[ds:si], eax
  1706.         mov     eax, dword[gs:di+4]
  1707.         mov     dword[ds:si+4], eax
  1708.         mov     eax, dword[gs:di+8]
  1709.         mov     dword[ds:si+8], eax
  1710.  
  1711. ;
  1712.         xor     eax, eax
  1713.         mov     ax, gs;point_next_fat_str
  1714.         mov     cx, 0x0a
  1715.         mov     di, check_root_fat_
  1716.         mov     dword [di], '    '
  1717.         mov     word [di+4], '  '
  1718.         call    decode
  1719.         xor     eax, eax
  1720.         pop     ax
  1721.         mov     di, (check_root_fat_+7)
  1722.         mov     dword [di], '    '
  1723.         mov     word [di+4], '  '
  1724.         call    decode
  1725.  
  1726. ;Show size
  1727.         lea     si, [check_root_fat_]
  1728.         call    printplain
  1729.  
  1730.         lea     si, [shot_name_fat]
  1731.         call    printplain
  1732.  
  1733.         xor     ax, ax
  1734.         int     0x16
  1735.         popad
  1736. end if  
  1737.  
  1738.         xor     bx, bx
  1739.         mov     cx, 11  ;size of name in struct FAT
  1740.  
  1741. @@:    
  1742.         mov     al, byte [ds:si+bx]     ;ds:si - point to name of convertion variable.
  1743.         mov     ah, byte [gs:di+bx]     ;gs:di - point to name in fat struct
  1744.         inc     bx
  1745.  
  1746. if DEBUG
  1747. ;        pushad
  1748. ;        lea    si,[check_root_fat_+14]
  1749. ;        mov     dword [ds:si],'----'
  1750. ;        mov    word [ds:si],ax
  1751. ;       call    printplain
  1752.  
  1753. ;       xor     ax,ax
  1754. ;       int     0x16
  1755.  
  1756. ;        popad
  1757. end if
  1758.  
  1759.  
  1760.  
  1761.         cmp     ah, al
  1762.         jnz     .no_equal
  1763.  
  1764. ;       dec     cx
  1765. ;       jnz     @b
  1766.         loop    @b
  1767.  
  1768. ;.succesfuly:
  1769. ;ïå÷àëüíî, òàêîå èìÿ óæå èìååòñÿ :(
  1770.         or      ax, -1
  1771.         jmp     .exit
  1772.  
  1773.  
  1774. .no_equal:
  1775.         add     di, 32          ;fat struct =32 byte
  1776.         dec     dx
  1777.         jnz     .loop_size_root_dir
  1778.  
  1779. ;.exit_check_name:
  1780.         and     ax, 0
  1781.  
  1782. .exit:
  1783.  
  1784. if DEBUG        
  1785.         pushad
  1786. ;Show size
  1787.         lea     si, [check_name_fat_msg_n]
  1788.         test    ax, ax
  1789.         jz      @f
  1790.         lea     si, [check_name_fat_msg_y]
  1791.         call    printplain
  1792.         lea     si, [alarm_msg]
  1793. @@:
  1794.         call    printplain
  1795.         popad
  1796. end if  
  1797.  
  1798. }
  1799.  
  1800.  
  1801. macro convertion_file_name
  1802. ;ìàêðîñ êîíâåðòàöèè èìåíè, ýòî íóæíî ïîñêîëüêó ôîðìàò ïðåäñòàâëåííûé íå ñîîòâåòñâóåò ôàò è íàïðÿìóþ ðåäêî ìîæíî êîãäà èñïîëüçîâàòü
  1803. ;ïðåîáðàçîâàíèå èìåíè òèïà hello.asm â 'HELLO   ASM', â ñîîòâåòñòâèè ñ ïðàâèëàìè fat.
  1804. ;âõîäíûå ïàðàìåòðû es:di óêàçàòåëü íà èìÿ ôàéëà êîòîðîå íóæíî ïðåîáðàçîâàòü, êîíå÷íûé áóôåð shot_name_fat
  1805. {
  1806. local   .next_step
  1807. local   .error
  1808. local   .st1
  1809. local   .st2
  1810. local   .st2_l
  1811. local   .st3
  1812. local   .st4_s
  1813. local   .st4
  1814. local   .st5
  1815.  
  1816. ;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
  1817. ;       mov     di,point_to_dest_file_name   âõîäíîé ïàðàìåòð
  1818.         mov     si, shot_name_fat
  1819.         or      first_input, -1 ;ïðè ïåðâîì âõîäå óñòàíàâëèâàåì ôëàã
  1820.         mov     cx, 11  ;äëèííà èìåíè â ñòóêòóðå ôàò òàáëèöû
  1821.  
  1822. @@:    
  1823.         mov     al, byte [es:di]
  1824.         cmp     al, 0xa
  1825.         jz      .st4_s
  1826.         cmp     al, 0xd
  1827.         jz      .st4_s
  1828.         cmp     al, 0x20
  1829.         jz      .st4_s
  1830.  
  1831.         cmp     al, 0x20
  1832.         jb      .error
  1833.         cmp     al, 0x22
  1834.         jz      .error
  1835.         cmp     al, 0x2a
  1836.         jz      .error
  1837.         cmp     al, 0x2b
  1838.         jz      .error
  1839.         cmp     al, 0x2c
  1840.         jz      .error
  1841.         cmp     al, 0x2F
  1842.         jz      .error
  1843.  
  1844.         cmp     al, 0x3a
  1845.         jz      .error
  1846.         cmp     al, 0x3b
  1847.         jz      .error
  1848.         cmp     al, 0x3c
  1849.         jz      .error
  1850.         cmp     al, 0x3d
  1851.         jz      .error
  1852.         cmp     al, 0x3E
  1853.         jz      .error
  1854.         cmp     al, 0x3F
  1855.         jz      .error
  1856.  
  1857.         cmp     al, 0x5b
  1858.         jz      .error
  1859.         cmp     al, 0x5c
  1860.         jz      .error
  1861.         cmp     al, 0x5d
  1862.         jz      .error
  1863.  
  1864.         cmp     al, 0x7c
  1865.         jz      .error
  1866.  
  1867.        
  1868.         cmp     first_input, -1
  1869.         jnz     .next_step
  1870.         and     first_input, 0  ;ñáîðîñèì ôëàã.
  1871.         cmp     al, '.'
  1872.         jz      .error  ;îáðàáîòêà òî÷êè, ôàéë íå ìîæåò íà÷èíàòüñÿ ñ òî÷êè
  1873.  
  1874. .next_step:
  1875.         cmp     al, 0x2e
  1876.         jnz     .st2            ;îáðàáîòêà òî÷êè, â ñåðåäèíå ôàéëà
  1877. ;òóò ó íàñ óñòàíîâëåí ðàçäåëèòåëü
  1878. ;âñå îñòàëüíåî ìåñòî çàéìóò ïðîáåëû
  1879.         mov     al, ' '
  1880.  
  1881. ;!fixme îáðàáîòàíû íå âñå èñêëþ÷åíèÿ :(
  1882.         cmp     cl, 3   ;ôîðìàò ôàéëà òàêîé GIDGIDIIASM ò.å. gidgidii.asm
  1883.         jbe     .st2
  1884.  
  1885.  
  1886. .st3:  
  1887.         mov     byte [si], al
  1888.         inc     si
  1889.         dec     cx
  1890.         cmp     cx, 3
  1891.         ja      .st3
  1892. ;       inc     cx
  1893.         inc     di
  1894.         jmp     @b
  1895.  
  1896. .st2:
  1897.         cmp     al, 0x60
  1898.         jbe     .st2_l
  1899.        
  1900.         xor     al, 0x20;ñäåëàåì çàãëàâíûå áóêâû
  1901. .st2_l:
  1902.         mov     byte [si], al
  1903.         inc     di
  1904.         inc     si
  1905. ;        dec    cx
  1906. ;       jnz     @b
  1907.         loop    @b
  1908. .st5:
  1909.         xor     ax, ax
  1910.         jmp     @f
  1911.  
  1912. ;;;;;;;;ôàéë çàêîí÷èëñÿ, è íóæíî âíåñòè â êîíåö ïðîáåëû
  1913. .st4_s:
  1914.         mov     al, ' '
  1915. .st4:
  1916.         mov     byte [si], al
  1917.         inc     si
  1918.         loop    .st4
  1919.         jmp     .st5
  1920.  
  1921. .error:
  1922.         or      ax, -1
  1923. @@:
  1924.  
  1925. if DEBUG        
  1926.         pushad
  1927.        
  1928.         mov     si, convertion_file_name_msg_y
  1929.         test    ax, ax
  1930.         jz      @f
  1931.         mov     si, convertion_file_name_msg_n
  1932. @@:
  1933.         call    printplain
  1934.  
  1935.         mov     si, shot_name_fat
  1936.         mov     byte [si+12], 0
  1937.         call    printplain
  1938.         popad
  1939.  
  1940. end if  
  1941. }
  1942.  
  1943. macro move_file_up
  1944. ;ìàêðîñ êîòîðûé ïåðåìåùàåò çà 1 ìá ñ ïðàâèëàìè ôàò äàííûå ôàéëà.
  1945. {
  1946. local   .st1
  1947. local   .correct_on_byte
  1948. ;ñåé÷àñ èìååò áûòü ñèòóàöèÿ, êîãäà BPB óæå ïåðåìåùåí çà 1 ìá, ôàò, è ðóò äèð áóäóò ïîçæå ïåðåìåùåíû,
  1949. ;à íàì íóæíî âû÷èñëèòü ìåñòî, è ïåðåíåñòè òóäà ñîäåðæèìîå ôàéëà
  1950. ;ïîëó÷åíîå çíà÷åíèå óêàçûâàåò â áàéòàõ íà íà÷àëî äàííûõ
  1951.  
  1952.         mov     ax, info_real_mode_size ; ñåãìåíò ãäå ðàñïîëîæåíû äàííûå
  1953.         mov     si, table_15_87
  1954.         mov     word [si+8*2+2], ax
  1955. ;ñìåùåíèå äî äàííûõ óæå çà 1-ì ìá
  1956.         movzx   eax, firstDataSect
  1957.         movzx   edx, data_offset
  1958.         add     eax, edx
  1959.  
  1960.         movzx   ebx, word [fat12_buffer.BPB_BytsPerSec]
  1961.         movzx   edx, byte [fat12_buffer.BPB_SecPerClus]
  1962.         imul    bx, dx  ;ïîëó÷èì ðàçìåð êëàñòåðà
  1963.  
  1964.  
  1965.  
  1966.         push    ebx     ;save bx
  1967.  
  1968.         imul    eax, ebx
  1969. ;       shl     eax,9   ;óìíîæèì íà 512
  1970.        
  1971. if DEBUG
  1972.         pushad
  1973.         xor     eax, eax
  1974.         mov     ax, info_real_mode_size
  1975.         mov     cx, 0x0a
  1976.         mov     di, seg_where_get_data
  1977.         mov     dword [di], '    '
  1978.         mov     word [di+4], '  '
  1979.         call    decode
  1980. ;Show size
  1981.         mov     si, seg_where_get_data
  1982.         call    printplain
  1983.         popad
  1984.  
  1985. end if
  1986.  
  1987. ;       mov     bx,word [fat12_buffer.BPB_BytsPerSec]
  1988. ;       movzx   dx,byte [fat12_buffer.BPB_SecPerClus]
  1989. ;       imul    bx,dx
  1990. ;       cwd
  1991. ;       idiv    bx
  1992.  
  1993.         mov     dl, 0x10
  1994.  
  1995. @@:
  1996.         cmp     eax, 0x00010000
  1997.         jb      @f
  1998.  
  1999.         sub     eax, 0x00010000
  2000.         inc     dl
  2001.         jmp     @b
  2002.  
  2003.  
  2004. @@:
  2005.         mov     byte [si+8*3+3], dl     ;êóäà ïèñàòü
  2006.         mov     word [si+8*3+2], ax
  2007.  
  2008.         mov     ecx, save_file_size     ;ðàçìåð ôàéëà â áàéòàõ.
  2009.         cmp     ecx, 0x0000ffff         ;ðàçìåð áëîêà ò.å. 64 êá
  2010.         jbe     .correct_on_byte        ;êîððåêòèðîâêà íà áàéò çíà÷åíèÿ
  2011.  
  2012.  
  2013.  
  2014.         mov     ecx, 0x00010000         ;65536
  2015.         sub     save_file_size, ecx     ;îòíèìèì
  2016. ;       jmp     .st1                    ;ïîëó÷èì 0õ8000
  2017.  
  2018.  
  2019.  
  2020.  
  2021. ;êîððåêòèðîâêà çíà÷åíèÿ äîëæíà áûòü âûïîëåíåíà íà ðàçìåð êëàñòåðà
  2022. .correct_on_byte:
  2023. ;/óçíàåì ðàçìåð êëàñòåðà
  2024.         pop     eax     ;restore size of claster
  2025.         push    ecx
  2026. @@:
  2027.         inc     data_offset
  2028.  
  2029.         cmp     eax, ecx
  2030.         jae     @f
  2031.         sub     ecx, eax
  2032.         jmp     @b
  2033. @@:
  2034.         pop     ecx
  2035.  
  2036.  
  2037.  
  2038.  
  2039.         test    ecx, 0x1
  2040.         jz      .st1
  2041.         inc     ecx
  2042. .st1:
  2043.         shr     ecx, 1    ; ïðåîáðàçîâàòü çíà÷åíèå äëÿ 0x87 function
  2044.  
  2045. ;ïåðåíåñåì áëîê çà 1 ìá        
  2046.         push    es
  2047.         push    ds
  2048.         pop     es
  2049.  
  2050.         mov     ah, 0x87
  2051.         int     0x15
  2052.         pop     es
  2053.  
  2054. if DEBUG
  2055.         pusha
  2056. ;       mov     ax,point_next_fat_str
  2057.         mov     cx, 0x0a
  2058.         mov     di, return_code_af_move
  2059.         call    decode
  2060. ;Show size
  2061.         mov     si, return_code_af_move
  2062.         call    printplain
  2063.         popa
  2064.  
  2065. end if
  2066.  
  2067. }
  2068.  
  2069.  
  2070. macro move_up_fat_and_root_d
  2071. ;ìàêðîñ, êîòîðûé ïîçâîëÿåò ïåðåíåñòè âûøå 1 ìá â ñòðóêòóðó îáðàçà ôàò òàáëèöó è ðóò äèðåêòîðèþ
  2072. {
  2073. local  .st1
  2074.  
  2075.         mov     ax, info_real_mode_size
  2076.         add     ax, 0x1000
  2077.  
  2078.         mov     si, table_15_87
  2079.         mov     word [si+8*2+2], ax
  2080. ;ñìåùåíèå äî äàííûõ
  2081.         mov     ax, 512
  2082.         mov     word [si+8*3+2], ax
  2083. ;fixme! òóò íåîáõîäèìî ñäåëàòü ïîäåðæêó ò.å. ôîðìèðîâàòü ñìåùåíèå ôàéëà â óæå çàïèñàííûõ äàííûõ.
  2084.  
  2085.         movzx   ecx, word [fat12_buffer.BPB_FATSz16]
  2086.         movzx   bx, byte [fat12_buffer.BPB_NumFATs]
  2087.         imul    cx, bx  ;9x1=9
  2088.  
  2089.         add     cx, size_root_dir       ;ðàçìåð êîðíåâîé äèððåêòîðèè
  2090.         shl     ecx, 9  ;imul 512
  2091.  
  2092.  
  2093. ;êîððåêòèðîâêà çíà÷åíèÿ
  2094.         test    ecx, 0x1
  2095.         jz      .st1
  2096.         inc     ecx
  2097. .st1:
  2098.         shr     ecx, 1
  2099.  
  2100.         push    es
  2101.         push    ds
  2102.         pop     es
  2103.  
  2104.         mov     ah, 0x87
  2105.         int     0x15
  2106.         pop     es
  2107.  
  2108. if DEBUG
  2109.         pusha
  2110. ;       mov     ax,point_next_fat_str
  2111.         mov     cx, 0x0a
  2112.         mov     di, return_code_af_fat_m
  2113.         call    decode
  2114. ;Show size
  2115.         mov     si, return_code_af_fat_m
  2116.         call    printplain
  2117.         popa
  2118.  
  2119. end if
  2120.  
  2121. }
  2122.