Subversion Repositories Kolibri OS

Rev

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