Subversion Repositories Kolibri OS

Rev

Rev 1151 | Rev 1231 | 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. @@:     mov     al,byte [es:di]
  1093.         cmp     al,','          ; ò.å. èùåì ðàçäåëèòåëü
  1094.         jz      .found_end_str
  1095.         inc     di
  1096.         dec     cx
  1097.         jnz     @b
  1098. ;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðøåíèÿ ñòðîêè
  1099. .found_end_str:
  1100. ;        mov    al,byte [es:di]
  1101. ;       cmp     al,' '          ; óáèðàåì ïðîáåëû, åñëè îíè åñòü
  1102. ;       jnz     @f
  1103. ;       inc     di
  1104. ;       dec     cx
  1105. ;       jnz     .found_end_str
  1106.  
  1107. ;@@:
  1108.         mov     point_to_dest_file_name,di
  1109.         inc     di
  1110. ;ïðîâåðêà èíäèâèäóàëüíîñòè èìåíè ôàéëà
  1111. check_name_file
  1112. ;/restore di - point and cx -size section
  1113.         mov     di,save_di_RAMDISK
  1114.         mov     cx,save_cx_RAMDISK
  1115.  
  1116.         test    al,al
  1117.         jnz     .start_loop     ;åñëè â al çíà÷åíèå íå =0, òî òàêîå èìÿ óæå ñóùåñòâóåò â ñèñòåìå.
  1118.  
  1119.  
  1120.  
  1121.         push    dword [es:di-6]
  1122.         lea     si,[di-6]
  1123.  
  1124.         push    word  [es:di-2]
  1125.         push    di
  1126.         xor     ax,ax
  1127.         mov     word [es:di-6],ax       ;âíîñèì íóæíûå çíà÷åíèÿ
  1128. ;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
  1129.         mov     ax,info_real_mode_size  ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
  1130.  
  1131.  
  1132.         mov     word [es:di-4],ax
  1133.         mov     word [es:di-2],16       ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ÷èòàåì
  1134.  
  1135.         mov     di,point_to_dest_file_name
  1136.  
  1137. if DEBUG
  1138.         pushad
  1139. ;       mov     ax,di
  1140.         mov     cx,0x0a
  1141.         mov     di,name_of_seg_get_64
  1142.         mov     dword[ds:di],'    '
  1143.         mov     word[ds:di+4],'  '
  1144.         call    decode
  1145. ;Show size
  1146.         mov     si,name_of_seg_get_64
  1147.         call    printplain
  1148.  
  1149.         popad
  1150. end if  
  1151.  
  1152.         push    word [es:di]
  1153.         push    cx
  1154.         xor     ax,ax
  1155.         mov     word [es:di],ax
  1156. ;        xor     ax,ax   ; function 1 - read file
  1157.         push    di
  1158.         mov     di,si   ;file_data
  1159.         inc     ax
  1160.         push    si
  1161.         push    es
  1162.         push    bp
  1163.  
  1164.         push    es
  1165.         pop     ds
  1166.         push    cs
  1167.         pop     es
  1168.  
  1169.         call    far  dword [es:loader_callback]
  1170.  
  1171.  
  1172.         push    cs
  1173.         pop     ds
  1174.  
  1175.         pop     bp
  1176.         pop     es
  1177.         pop     si
  1178.  
  1179.         cmp    bx,2
  1180.         ja     .error
  1181. ; ñåé÷àñ ó íàñ â dx:ax ðàçìåð ôàéëà, êîòîðûé ìû çàãðóçèëè.
  1182. ; âîçìîæíà ñèòóàöèÿ, êîãäà â bx=1 ò.å. åñòü åùå äàííûå íà äèñêå
  1183.         mov     status_flag_loader_f,bx
  1184.  
  1185.         shl     edx,16
  1186.         mov     dx,ax
  1187. ;       shr     edx,10  ;ðàçìåð ôàéëà â êá.
  1188. ;;â edx ðàçìåð â áàéòàõ.        
  1189.         mov     save_file_size,edx
  1190.         mov     eax,edx
  1191. ;âîññòàíîâèì ïîëíîñòüþ ôàéë ñöåíàðèÿ
  1192.         pop     di
  1193.         pop     cx      ;äëèííà îñòàòêà ñ 2-îé ÷àñòüþ èìåíè ò.å. ñ èìåíåì íàçíà÷åíèåì.
  1194.         pop     word [es:di]
  1195.         pop     di
  1196.         pop     word  [es:di-2]
  1197.         pop     dword [es:di-6]
  1198.        
  1199.  
  1200. if DEBUG
  1201.         pushad
  1202.         mov     cx,0x0a
  1203.         mov     di,RamdiskFile_msg
  1204.         mov     dword[ds:di],'    '
  1205.         call    decode
  1206. ;Show size
  1207.         mov     si,RamdiskFile_msg
  1208.         call    printplain
  1209.  
  1210.         popad
  1211. end if  
  1212.  
  1213.  
  1214.  
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.  
  1221.  
  1222. ; çàãðóçèì ÷åìó ó íàñ ðàâåí êëàñòåð
  1223. ;       mov     ax,word [fat12_buffer.BPB_BytsPerSec] ;êîë-âî áàéòîâ â ñåêòîðå ìîæåò áûòü ëþáîå 512 1024 2048 4096 2 áàéòà
  1224. ;       movzx   bx,byte [fat12_buffer.BPB_SecPerClus] ;êîë-âî ñåêòîðîâ â êëàñòåðå
  1225. ;       imul    ax,bx
  1226. ;ñåé÷àñ â eax ðàçìåð êëàñòåðà (512) áàéò
  1227. ;â edx äëèíà ôàéëà â áàéòàõ äî 64 êá    
  1228. ;çàêèíèì ôàéë çà 1 ìá
  1229. ;1 íàì íóæíî ñîñòàâèòü ôàò òàáëèöó ò.å. ïðîèçâåñòè ðàçìåòêó ðàìäèñêà, çàòåì ïåðåíåñåì ïî àäðåñó ôàéë
  1230.  
  1231. ;çàïèñàòü èíôîðàìàöèþ î ôàéëå â êîðíåâóþ äèðåêòîðèþ
  1232. register_file_in_fat
  1233. ;ïåðåíåñòè çà 1 ìá ñîäåðæèìîå ôàéëà
  1234. move_file_up
  1235.  
  1236. ;ïðîâåðèì, çàãðóæåí ëè äî êîíöà ôàéë? ò.å. åñëè ðàçìåð ôàéëà áîëüøå ÷åì 64 êá, òî áóäåò ïîäãðóæàòü îñòàâøèåñÿ áëîêè
  1237.         cmp     status_flag_loader_f,0x1
  1238.         jnz     @f
  1239. ;íóæíî äîçàãóçèòü äàííûå ôàéëà è ïåðåíåñòè èõ çà 1-ûé ìá ñîãëàñíî ôàò ñòðóêòóðå
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249. @@:
  1250. ;òóò îðãàíèçîâàí öèêë ïî çàãðóçêå ôàéëîâ â êîðíåâóþ äèðåêòîðèþ
  1251.         mov     di,save_di_RAMDISK
  1252.         mov     cx,save_cx_RAMDISK
  1253. if DEBUG        
  1254.         pusha
  1255.         xor     ax,ax
  1256.         int     0x16
  1257.         popa
  1258. end if  
  1259.  
  1260.  
  1261.         jmp     .start_loop
  1262.  
  1263.  
  1264. .error:
  1265.         ;call   error.LoaderModule
  1266. ;fixme!
  1267. .rest_value_loop:
  1268.         mov     di,ax
  1269.         mov     cx,bx
  1270.         jmp     .start_loop
  1271.  
  1272. ._end:
  1273. ;ïåðåíåñåì çà 1-ûé ìá ôàò è ðóò äèð
  1274. move_up_fat_and_root_d
  1275.  
  1276.  
  1277.  
  1278.  
  1279.  
  1280.  
  1281. ;çàãðóçêà áëîêà
  1282. ;       mov     ah,0x87
  1283. ;       mov     cx,     ;size in byte
  1284.        
  1285.  
  1286. ;es:si point to descripts
  1287.  
  1288.  
  1289. }
  1290.  
  1291. macro use_BPB_RAM ;çàêèíóòü ñàìûå ïåðâûå 512 áàéò çà 1-é ìá
  1292. ;äàííûé ìàêðîñ çàêèäûâàåò BPB ñòðóêòóðó ò.å. ïåðâûå 512 áàéò, ïîêà òîëüêî ôàò12 çà 1 ìá
  1293. {
  1294.         mov     ax,fat12_buffer
  1295.         mov     si,table_15_87
  1296.         add     word [si+8*2+2],ax
  1297.         push    es
  1298.         push    ds
  1299.         pop     es
  1300.         mov     cx,256   ;áóò ñåêòîð  óêëàäûâàåòñÿ â 512 áàéò 512/2=256
  1301.         mov     ah, 0x87
  1302.         int     0x15
  1303.         pop     es
  1304. ;add 512 byte for destination adress
  1305. ;       add     dword [si+8*3+2], 512
  1306. ;        test    ah, ah
  1307. ;        jz    
  1308. if DEBUG        
  1309.         pusha
  1310.         mov     ax,word [si+8*2+2]
  1311.         mov     cx,0x0a
  1312.         mov     di,BPB_msg
  1313.         call    decode                                                                    
  1314. ;Show size
  1315.         mov     si,BPB_msg
  1316.         call    printplain
  1317.         popa
  1318. end if  
  1319. }
  1320. macro first_create_fat_table
  1321. ;äàííûé ìàêðîñ ñîçäàåò îôîðìëÿåò 3 ïåðâûõ áàéòà fat òàáëèöû, è óñòàíàâëèâàåò óêàçàòåëü íà ñëåäóþùèé áëîê, è âíîñèò 0 çíà÷åíèå
  1322. ;äëÿ ñìåùåíèÿ â êîðíåâîé òàáëèöå.
  1323. {
  1324.         mov     al,byte [fat12_buffer.BPB_Media]
  1325.  
  1326.  
  1327.         push    ds
  1328.  
  1329.  
  1330.         mov     di,info_real_mode_size
  1331.         add     di,0x1000
  1332.  
  1333. if DEBUG
  1334.         pushad
  1335.  
  1336.         mov     ax,info_real_mode_size
  1337.         add     ax,0x1000
  1338. ;       mov     ax,ds
  1339.         mov     cx,0xa
  1340.                
  1341.         mov     di,first_entry_in_fat
  1342.         mov     dword [di],'    '
  1343.         mov     word  [di+4],'  '
  1344.         call    decode                                                                    
  1345. ;Show size
  1346.         mov     si,first_entry_in_fat
  1347.         call    printplain
  1348.  
  1349.         xor     ax,ax
  1350.         int     0x16
  1351.      
  1352.         popad
  1353. end if
  1354.  
  1355.  
  1356.         push    di   ;  push    word info_real_mode_size+0x1000   ;cëåäóþùèé ñåãìåíò çà çàãðóæåííûì ó÷àñòêîì
  1357.        
  1358.         xor     di,di
  1359.         mov     point_to_free_root,di   ;çíà÷åíèå ñìåùåíèÿ =0 â êîðíåâîé ôàò òàáëèöå îïèñàíèÿ
  1360.  
  1361.         pop     ds   ; çàãðóæåí ñëåäóþùèé ñåãìåíò ò.å. ïóñòîé ñåãìåíò
  1362.  
  1363.         mov     byte [di],al
  1364.         or      ax,-1
  1365.         inc     di
  1366.         mov     word [di],ax
  1367.  
  1368.         pop     ds
  1369.         mov     point_next_fat_str,3
  1370.  
  1371. if DEBUG        
  1372.         pushad
  1373.         mov     ax,point_next_fat_str
  1374.         mov     cx,0x0a
  1375.         mov     di,fat_create_msg
  1376.         call    decode                                                                    
  1377. ;Show size
  1378.         mov     si,fat_create_msg
  1379.         call    printplain
  1380.         popad
  1381. end if  
  1382.  
  1383. }
  1384. macro register_file_in_fat
  1385. ;ìàêðîñ ðåãèñòðàöèè ôàéëà â ôàéëîâîé ñòðóêòóðå Fat
  1386. ;ïîêà ïîääåðæèâàåòñÿ òîëüêî ôàò12, ïîêà ))
  1387. ;âû÷èñëåíèå ñìåæíûõ êëàñòåðîâ è çàíåñåíèå èíôû â fat/
  1388. {
  1389. local   .step2
  1390. local   .step3
  1391. local   .end
  1392. local   .eof_file
  1393.  
  1394. ;di point on root dir íà ôðè ñåêöèþ.
  1395.         push    es
  1396.  
  1397.         mov     ax,info_real_mode_size
  1398.         add     ax,0x1000
  1399.         mov     es,ax  ;        push    word info_real_mode_size+0x1000   ;ñåãìåíò ñëåäóþùèé çà çàãðóæåííûì áëîêîì â 64 êá
  1400.  
  1401. ; îïðåäåëÿåì òèï ôàò ïîêà íå îïðåäåëÿåì, ïîêà òîëüêî ôàò 12
  1402. ; 12 áèò, äëÿ âû÷åñëåíèÿ ñîñåäíèõ êàëàñòåðîâ.
  1403.         mov     di,firstDataSect     ;â ñåêòîðàõ
  1404.         sub     di,size_root_dir
  1405. ;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
  1406.         shl     di,9 ;imul 512
  1407.         add     di,point_to_free_root   ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
  1408. ;íåîáõîäèìî âíåñòè çíà÷åíèå â ðóò äèð ò.å. 32 áàéòà
  1409. if DEBUG        
  1410.         pushad
  1411. ;       mov     ax,point_default
  1412. ;        mov     ax,
  1413.         mov     cx,0x0a
  1414.         mov     di,show_db2
  1415.         mov     dword[ds:di],'    '
  1416.        mov     word [ds:di+4],'  '
  1417.         call    decode                                                                    
  1418. ;Show size
  1419.         mov     si,show_db2
  1420.         call    printplain
  1421. ;
  1422. ;       xor     ax,ax
  1423. ;       int     0x16
  1424.         popad
  1425. end if  
  1426.  
  1427.  
  1428.  
  1429. ;gs:di - óêàçàòåëü äëÿ âíåñåíèÿ èíôîðàöèè â ðóò îáëàñòü ôàò òàáëèöû èíîðìàöèè î ôàéëå.
  1430.         mov     si,shot_name_fat
  1431.         mov     cx,11
  1432. ;çàïèøåì â ñòðóêòóðó èìÿ
  1433. @@:     lodsb
  1434.         stosb
  1435.         loop    @b
  1436.  
  1437. ;çàïèøåì àòðèáóòû ôàéëà è DIR_NTRes - çàðåçåâðèðîâàííûé áàéò =0
  1438.         xor     ax,ax
  1439.         mov     ah,ATTR_VOLUME_ID
  1440.         mov     word [es:di],ax
  1441.         add     di,2
  1442. ;DIR_CrtTimeTenth
  1443.         mov     byte [es:di],100
  1444.         inc     di
  1445. ;DIR_CrtTime
  1446.         mov     word [es:di],0x032b    ;äàòà
  1447.         add     di,2
  1448. ;DIR_CrtDate
  1449.         mov     word [es:di],0x0       ;âðåìÿ ><
  1450.         add     di,2
  1451. ;DIR_LstAccDate
  1452.         mov     word [es:di],0x032b    ;äàòà ìîåãî
  1453.         add     di,2
  1454. ;DIR_FstClusHI
  1455.         mov     word [es:di],0x0       ;âðåìÿ äëÿ ôàò12 /16 âñåãäà 0
  1456.         add     di,2
  1457. ;DIR_WrtTime
  1458.         mov     word [es:di],0x0       ;âðåìÿ ><
  1459.         add     di,2
  1460. ;DIR_WrtDate
  1461.         mov     word [es:di],0x032b    
  1462.         add     di,2
  1463.        
  1464.         mov     ax,point_next_fat_str
  1465.         mov     word [es:di],ax
  1466.         add     di,2
  1467.  
  1468.         push    di
  1469. ;DIR_FstClusLO                  Ìëàäøåå ñëîâî íîìåðà ïåðâîãî êëàñòåðà.
  1470.  ;       mov     ax,point_next_fat_str   ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
  1471. ;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò
  1472.         mov     bx,ax
  1473.         shr     bx,1
  1474.         add     ax,bx
  1475. ;â àõ ñåé÷àñ FATOffset
  1476. ;ThisFATEntOffset = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
  1477.         mov     bx, word [fat12_buffer.BPB_BytsPerSec]
  1478.         cwd
  1479.         idiv    bx
  1480. ;ax=ThisFATEntOffset= rem (FATOffset / BPB_BytsPerSec) ÷åòíûé èëè íå÷åòíûé óêàçàòåëü.
  1481.         mov     si,ax
  1482. ;íàì íóæíî â öèêëå çàïèñàòü âñå êëàñòåðû êîòîðûå áóäóò èñïîëüçîâàíû äëÿ ðàçìåùåíèÿ ôàéëà.
  1483. ;óçíàåì ðàçìåð êëàñòåðà.
  1484.         movzx   eax,word [fat12_buffer.BPB_BytsPerSec]
  1485.         movzx   ebx,byte [fat12_buffer.BPB_SecPerClus]
  1486.         imul    eax,ebx
  1487. ;ax - ðàçìåð êëàñòåðà.
  1488. ;ñåé÷àñ áóäåì çàïèñûâàòü âî âðåìåííûé áóôåð ôàò òàáëèöó äëÿ âûáðàííîãî ôàéëà. Ïîñêîëüêó ìû åãî çàãðóçèëè âîçìîæíî íå ïîëíîñòüþ
  1489. ;ìû îáðàáîòàåì çàïèñü äëÿ ôàò ïîëíîñòüþ, â íå çàâèñèìîñòè îò ïðåäåëà áóôåðà ãäå âîçìîæíà ÷àñòü ôàéëà.  
  1490.         mov     ebx,save_file_size      ;ðàçìåð ôàéëà â áàéòàõ
  1491.        
  1492. @@:     sub     ebx,eax
  1493.         cmp     ebx,eax
  1494.         jbe     .eof_file
  1495.  
  1496.         inc     point_next_fat_str
  1497.         mov     cx,point_next_fat_str   ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
  1498. ;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò
  1499.         mov     dx,ax
  1500.         shr     dx,1
  1501.         add     cx,dx
  1502.  
  1503.  
  1504.  
  1505.         test    si,0x1
  1506.         jz      .step2
  1507.         shl     cx,4
  1508.         mov     word[es:si],cx
  1509.         inc     si
  1510.         add     cx,ax
  1511.         jmp     @b
  1512.  
  1513. .step2: and     cx,0x0FFF
  1514.         mov     word[es:si],cx
  1515.         inc     si
  1516.         add     cx,ax
  1517.         jmp     @b
  1518.  
  1519. .eof_file:
  1520.         mov     cx,0x0fff
  1521.         test    si,0x1
  1522.         jz      .step3
  1523.         shl     cx,4
  1524.         mov     word[es:si],cx
  1525.         jmp     .end
  1526.  
  1527. .step3: and     cx,0x0FFF
  1528.         mov     word[es:si],cx
  1529.  
  1530. .end:   inc     point_next_fat_str
  1531.  
  1532.         pop     di
  1533. ;DIR_FileSize 32-áèòíûé DWORD ñîäåðæèò ðàçìåð ôàéëà â áàéòàõ.
  1534.         mov     eax,save_file_size
  1535.         mov     dword [es:di],eax
  1536.  
  1537. if DEBUG        
  1538.         pushad
  1539.  
  1540.         mov     di,firstDataSect     ;â ñåêòîðàõ
  1541.         sub     di,size_root_dir
  1542. ;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
  1543.         shl     di,9 ;imul 512
  1544.         add     di,point_to_free_root   ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
  1545.  
  1546.         push    di
  1547.  
  1548.         mov     si,dest_name_fat
  1549.         mov     cx,11
  1550.  
  1551. ;çàïèøåì â ñòðóêòóðó èìÿ
  1552. @@:     mov     al,byte [es:di]
  1553.         inc     di
  1554.         mov     byte [ds:si],al
  1555.         inc     si
  1556.         loop    @b
  1557.        
  1558.         mov     di,si
  1559.         inc     di
  1560.         pop     ax
  1561.         mov     cx,0xa
  1562.         call    decode
  1563.  
  1564.         mov     si,dest_name_fat
  1565.         call    printplain
  1566.         popad
  1567.  
  1568. END IF
  1569.  
  1570.  
  1571.  
  1572.  
  1573.  
  1574.         add     point_to_free_root,32   ;óâåëèöèì ñìåùåíèå äî ñëåäóþùåãî çíà÷åíèÿ.
  1575.         pop     es
  1576.  
  1577. }
  1578.  
  1579.  
  1580.  
  1581.  
  1582.  
  1583. macro get_firstDataSector
  1584. ;ìàêðîñ äëÿ âû÷èñëåíèÿ ïåâîãî ñåêòîðà äàííûõ ò.å. äàííûõ ôàéëîâ â ôàòå
  1585. ;âû÷èñëèì FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;
  1586. {
  1587.         mov     ax,word [fat12_buffer.BPB_FATSz16]
  1588.         movzx   bx,byte [fat12_buffer.BPB_NumFATs]
  1589.         imul    ax,bx   ;9x1=9
  1590. ;ax=BPB_NumFATs * FATSz
  1591.         mov     bx,word [fat12_buffer.BPB_RootEntCnt]   ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
  1592.         shr     bx,4    ;imul bx,32 and then div 512 -> in bx size in sectors
  1593.         add     ax,bx   ;9+14=23
  1594.         mov     size_root_dir,bx
  1595.         movzx   bx,byte [fat12_buffer.BPB_RsvdSecCnt]   ;add 1 for fat 16/12
  1596.         add     ax,bx
  1597. ;ax=firstDataSector - ãäå íà÷èíàåòñÿ ïåðâûé ñåêòîðî îò 0 ñåêòîðà â ñåêòîðàõ. - ôàêòè÷åñêè = 24 ñåêòîð
  1598.         mov     firstDataSect,ax        ;ñîõðàíèì äëÿ âû÷èñëåíèÿ
  1599. ;       ïîëó÷èìçíà÷åíèå êëàñòåðîâ, ýòî îáúåì â êîòîðûé ìû ìîæåì çàïèñàòü äàííûå
  1600.         mov     bx,word [fat12_buffer.BPB_TotSec16]
  1601.         sub     bx,ax
  1602.         mov     ax,bx
  1603.         movzx   bx,byte [fat12_buffer.BPB_SecPerClus]
  1604.         cwd
  1605.         idiv    bx
  1606.         mov     DataClasters,ax
  1607.  
  1608. if DEBUG        
  1609.         pushad
  1610.         mov     ax,firstDataSect        ;ïåðâûé ñåêòîð äàííûõ
  1611.         mov     cx,0x0a
  1612.         mov     di,firstDataSect_msg
  1613.         call    decode                                                                    
  1614. ;Show size
  1615.         mov     si,firstDataSect_msg
  1616.         call    printplain
  1617. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  1618.         mov     ax,size_root_dir        ;ðàçìåð ðóò äèð â ñåòîêòîðàõ
  1619.         mov     cx,0x0a
  1620.         mov     di,size_root_dir_msg
  1621.         call    decode                                                                    
  1622. ;Show size
  1623.         mov     si,size_root_dir_msg
  1624.         call    printplain
  1625. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  1626.         mov     ax,DataClasters ;êëàñòåðû
  1627.         mov     cx,0x0a
  1628.         mov     di,DataClasters_msg
  1629.         call    decode                                                                    
  1630. ;Show size
  1631.         mov     si,DataClasters_msg
  1632.         call    printplain
  1633.         popad
  1634.  
  1635. end if  
  1636.  
  1637. }
  1638.  
  1639. macro use_RamdiskPATHS
  1640. ;ïàðñèíã ïóòè èñòî÷íèêà ôàéëîâ.
  1641. {
  1642.  
  1643. }
  1644.  
  1645. macro use_RamdiskPATHD
  1646. ;ïàðñèíã ïóòè íàçíà÷åíèÿ ôàéëîâ.
  1647. {
  1648.  
  1649. }
  1650. macro check_name_file
  1651. ;ìàêðîñ ïðîâåðêè èìåíè íà ïîâòîð, èìÿ äîëæíî áûòü óíèêàëüíûì.
  1652. ;âõîäíûå äàííûå: es- ñåãìåíò ãäå ëåæèò ôàéë äëÿ ïàðñèíãà ò.å. startos.ini
  1653. ;di - óêàçàòåëü íà èìÿ ôàéëà ò.å. es:di óêàçûâàåò íà èìÿ ôàéëà íàçíà÷åíèÿ
  1654. ;âûõîäíûå äàííûå eax =-1 èìÿ ñîâïàëî, eax=0 èìÿ íå ñîâïàëî.
  1655. {
  1656. local   .no_equal
  1657. local   .exit
  1658. local   .loop_size_root_dir
  1659. ;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
  1660. ;ïðåîáðàçóåì â àíàëîã ôàò çàïèñè ñòî÷êó ñ èìåíåì íàçíà÷åíèÿ
  1661.         convertion_file_name    ; ïðåîáðàçîâàëè èìÿ ïî íóæíûì ïðàâèëàì
  1662.         test    ax,ax
  1663.         jnz     .exit
  1664.  
  1665.         mov     si,shot_name_fat
  1666.  
  1667. ;âû÷èñëèì óêàçàòåëü íà êîðíåâóþ äèðåêòîðèþ
  1668.         mov     di,firstDataSect
  1669.         sub     di,size_root_dir
  1670. ;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
  1671.         shl     di,9 ;imul 512
  1672. ;di= Ýòî ñìåùåíèå îò íà÷àëà áóôåðà äî ðóò äèðåêòîðèè. â ïðåäåëàõ 64 êá.
  1673. ;çàãðóçèì çíà÷åíèå - ò.å. êîë-âî ýëåìåíòîâ, êîòîðûå ìû ìîæåì ïðîñìàòðèâàòü.
  1674.         mov     dx,root_dir_entry_count
  1675.         mov     si,point_to_dest_file_name
  1676.        
  1677.         mov     ax,info_real_mode_size
  1678.         add     ax,0x1000
  1679.  
  1680.  
  1681.         mov     gs,ax
  1682. .loop_size_root_dir:
  1683.  
  1684. if DEBUG        
  1685. ;        pushad
  1686. ;       push    di
  1687. ;        mov    eax,dword[gs:di]
  1688. ;        mov    si,(check_root_fat_+14)
  1689. ;        mov     dword [ds:si],'____'
  1690. ;       mov     dword [ds:si+4],'____'
  1691. ;        mov    dword[ds:si],eax
  1692. ;        mov    eax,dword[gs:di+4]
  1693. ;        mov    dword[ds:si+4],eax
  1694. ;
  1695. ;
  1696. ;       xor     eax,eax
  1697. ;        mov     ax,gs;point_next_fat_str
  1698. ;        mov     cx,0x0a
  1699. ;        mov     di,check_root_fat_
  1700. ;        mov     dword [di],'    '
  1701. ;        mov     word  [di+4],'  '
  1702. ;        call    decode
  1703. ;       xor     eax,eax
  1704. ;       pop     ax
  1705. ;       mov     di,(check_root_fat_+7)
  1706. ;        mov     dword [di],'    '
  1707. ;        mov     word  [di+4],'  '
  1708. ;        call    decode
  1709.  
  1710. ;Show size
  1711. ;        mov     si,check_root_fat_
  1712. ;        call    printplain
  1713.  
  1714. ;       xor     ax,ax
  1715. ;       int     0x16
  1716. ;        popad
  1717. end if  
  1718.  
  1719.         xor     bx,bx
  1720.         mov     cx,11   ;size of name in struct FAT
  1721.  
  1722. @@:    
  1723.         mov     al,byte [es:si+bx]
  1724.         mov     ah,byte [gs:di+bx]      ;gs:di - point to name in fat struct
  1725.         inc     bx
  1726.  
  1727.         cmp     ah,al
  1728.         jnz     .no_equal
  1729.  
  1730. ;       dec     cx
  1731. ;       jnz     @b
  1732.         loop    @b
  1733.  
  1734. ;.succesfuly:
  1735. ;ïå÷àëüíî, òàêîå èìÿ óæå èìååòñÿ :(
  1736.         or      ax,-1
  1737.         jmp     .exit
  1738.  
  1739.  
  1740. .no_equal:
  1741.         add     di,32           ;fat struct =32 byte
  1742.         dec     dx
  1743.         jnz     .loop_size_root_dir
  1744.  
  1745. ;.exit_check_name:
  1746.         and     ax,0
  1747.  
  1748. .exit:
  1749.  
  1750. if DEBUG        
  1751.         pushad
  1752. ;Show size
  1753.         mov     si,check_name_fat_msg_n
  1754.         test    ax,ax
  1755.         jz      @f
  1756.         mov     si,check_name_fat_msg_y
  1757. @@:     call    printplain
  1758.         popad
  1759. end if  
  1760.  
  1761. }
  1762.  
  1763.  
  1764. macro convertion_file_name
  1765. ;ìàêðîñ êîíâåðòàöèè èìåíè, ýòî íóæíî ïîñêîëüêó ôîðìàò ïðåäñòàâëåííûé íå ñîîòâåòñâóåò ôàò è íàïðÿìóþ ðåäêî ìîæíî êîãäà èñïîëüçîâàòü
  1766. ;ïðåîáðàçîâàíèå èìåíè òèïà hello.asm â 'HELLO   ASM', â ñîîòâåòñòâèè ñ ïðàâèëàìè fat.
  1767. ;âõîäíûå ïàðàìåòðû es:di óêàçàòåëü íà èìÿ ôàéëà êîòîðîå íóæíî ïðåîáðàçîâàòü, êîíå÷íûé áóôåð shot_name_fat
  1768. {
  1769. local   .next_step
  1770. local   .error
  1771. local   .st1
  1772. local   .st2
  1773. local   .st2_l
  1774. local   .st3
  1775. local   .st4_s
  1776. local   .st4
  1777. local   .st5
  1778.  
  1779. ;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
  1780. ;       mov     di,point_to_dest_file_name   âõîäíîé ïàðàìåòð
  1781.         mov     si,shot_name_fat
  1782.         or      first_input,-1  ;ïðè ïåðâîì âõîäå óñòàíàâëèâàåì ôëàã
  1783.         mov     cx,11   ;äëèííà èìåíè â ñòóêòóðå ôàò òàáëèöû
  1784.  
  1785. @@:    
  1786.         mov     al,byte [es:di]
  1787.         cmp     al,0xa
  1788.         jz      .st4_s
  1789.         cmp     al,0xd
  1790.         jz      .st4_s
  1791.         cmp     al,0x20
  1792.         jz      .st4_s
  1793.  
  1794.         cmp     al,0x20
  1795.         jb      .error
  1796.         cmp     al,0x22
  1797.         jz      .error
  1798.         cmp     al,0x2a
  1799.         jz      .error
  1800.         cmp     al,0x2b
  1801.         jz      .error
  1802.         cmp     al,0x2c
  1803.         jz      .error
  1804.         cmp     al,0x2F
  1805.         jz      .error
  1806.  
  1807.         cmp     al,0x3a
  1808.         jz      .error
  1809.         cmp     al,0x3b
  1810.         jz      .error
  1811.         cmp     al,0x3c
  1812.         jz      .error
  1813.         cmp     al,0x3d
  1814.         jz      .error
  1815.         cmp     al,0x3E
  1816.         jz      .error
  1817.         cmp     al,0x3F
  1818.         jz      .error
  1819.  
  1820.         cmp     al,0x5b
  1821.         jz      .error
  1822.         cmp     al,0x5c
  1823.         jz      .error
  1824.         cmp     al,0x5d
  1825.         jz      .error
  1826.  
  1827.         cmp     al,0x7c
  1828.         jz      .error
  1829.  
  1830.        
  1831.         cmp     first_input,-1
  1832.         jnz     .next_step
  1833.         and     first_input,0   ;ñáîðîñèì ôëàã.
  1834.         cmp     al,'.'
  1835.         jz      .error  ;îáðàáîòêà òî÷êè, ôàéë íå ìîæåò íà÷èíàòüñÿ ñ òî÷êè
  1836.  
  1837. .next_step:
  1838.         cmp     al,0x2e
  1839.         jnz     .st2            ;îáðàáîòêà òî÷êè, â ñåðåäèíå ôàéëà
  1840. ;òóò ó íàñ óñòàíîâëåí ðàçäåëèòåëü
  1841. ;âñå îñòàëüíåî ìåñòî çàéìóò ïðîáåëû
  1842.         mov     al,' '
  1843.  
  1844. ;!fixme îáðàáîòàíû íå âñå èñêëþ÷åíèÿ :(
  1845.         cmp     cl,3    ;ôîðìàò ôàéëà òàêîé GIDGIDIIASM ò.å. gidgidii.asm
  1846.         jbe     .st2
  1847.  
  1848.  
  1849. .st3:  
  1850.         mov     byte [si],al
  1851.         inc     si
  1852.         dec     cx
  1853.         cmp     cx,3
  1854.         ja      .st3
  1855. ;       inc     cx
  1856.         inc     di
  1857.         jmp     @b
  1858.  
  1859. .st2:
  1860.         cmp     al,0x60
  1861.         jbe     .st2_l
  1862.        
  1863.         xor     al,0x20 ;ñäåëàåì çàãëàâíûå áóêâû
  1864. .st2_l: mov     byte [si],al
  1865.         inc     di
  1866.         inc     si
  1867. ;        dec    cx
  1868. ;       jnz     @b
  1869.         loop    @b
  1870. .st5:   xor     ax,ax
  1871.         jmp     @f
  1872.  
  1873. ;;;;;;;;ôàéë çàêîí÷èëñÿ, è íóæíî âíåñòè â êîíåö ïðîáåëû
  1874. .st4_s: mov     al,' '
  1875. .st4:   mov     byte [si],al
  1876.         inc     si
  1877.         loop    .st4
  1878.         jmp     .st5
  1879.  
  1880. .error: or      ax,-1
  1881. @@:
  1882.  
  1883. if DEBUG        
  1884.         pushad
  1885.        
  1886.         mov     si,convertion_file_name_msg_y
  1887.         test    ax,ax
  1888.         jz      @f
  1889.         mov     si,convertion_file_name_msg_n
  1890. @@:     call    printplain
  1891.  
  1892.         mov     si,shot_name_fat
  1893.         mov     byte [si+12],0
  1894.         call    printplain
  1895.         popad
  1896.  
  1897. end if  
  1898. }
  1899.  
  1900. macro move_file_up
  1901. ;ìàêðîñ êîòîðûé ïåðåìåùàåò çà 1 ìá ñ ïðàâèëàìè ôàò äàííûå ôàéëà.
  1902. {
  1903. local   .st1
  1904. local   .correct_on_byte
  1905. ;ñåé÷àñ èìååò áûòü ñèòóàöèÿ, êîãäà BPB óæå ïåðåìåùåí çà 1 ìá, ôàò, è ðóò äèð áóäóò ïîçæå ïåðåìåùåíû,
  1906. ;à íàì íóæíî âû÷èñëèòü ìåñòî, è ïåðåíåñòè òóäà ñîäåðæèìîå ôàéëà
  1907. ;ïîëó÷åíîå çíà÷åíèå óêàçûâàåò â áàéòàõ íà íà÷àëî äàííûõ
  1908.  
  1909.         mov     ax,info_real_mode_size  ; ñåãìåíò ãäå ðàñïîëîæåíû äàííûå
  1910.         mov     si,table_15_87
  1911.         mov     word [si+8*2+2],ax
  1912. ;ñìåùåíèå äî äàííûõ óæå çà 1-ì ìá
  1913.         movzx   eax,firstDataSect
  1914.         movzx   edx,data_offset
  1915.         add     eax,edx
  1916.  
  1917.         movzx   ebx,word [fat12_buffer.BPB_BytsPerSec]
  1918.         movzx   edx,byte [fat12_buffer.BPB_SecPerClus]
  1919.         imul    bx,dx   ;ïîëó÷èì ðàçìåð êëàñòåðà
  1920.  
  1921.  
  1922.  
  1923.         push    ebx     ;save bx
  1924.  
  1925.         imul    eax,ebx
  1926. ;       shl     eax,9   ;óìíîæèì íà 512
  1927.        
  1928. if DEBUG
  1929.         pushad
  1930.         xor     eax,eax
  1931.         mov     ax,info_real_mode_size
  1932.         mov     cx,0x0a
  1933.         mov     di,seg_where_get_data
  1934.         mov     dword [di],'    '
  1935.         mov     word  [di+4],'  '
  1936.         call    decode                                                                    
  1937. ;Show size
  1938.         mov     si,seg_where_get_data
  1939.         call    printplain
  1940.         popad
  1941.  
  1942. end if
  1943.  
  1944. ;       mov     bx,word [fat12_buffer.BPB_BytsPerSec]
  1945. ;       movzx   dx,byte [fat12_buffer.BPB_SecPerClus]
  1946. ;       imul    bx,dx
  1947. ;       cwd
  1948. ;       idiv    bx
  1949.  
  1950.         mov     dl,0x10
  1951.  
  1952. @@:     cmp     eax,0x00010000
  1953.         jb      @f
  1954.  
  1955.         sub     eax,0x00010000
  1956.         inc     dl
  1957.         jmp     @b
  1958.  
  1959.  
  1960. @@:     mov     byte [si+8*3+3],dl      ;êóäà ïèñàòü
  1961.         mov     word [si+8*3+2],ax
  1962.  
  1963.         mov     ecx,save_file_size      ;ðàçìåð ôàéëà â áàéòàõ.
  1964.         cmp     ecx,0x0000ffff          ;ðàçìåð áëîêà ò.å. 64 êá
  1965.         jbe     .correct_on_byte        ;êîððåêòèðîâêà íà áàéò çíà÷åíèÿ
  1966.  
  1967.  
  1968.  
  1969.         mov     ecx,0x00010000          ;65536
  1970.         sub     save_file_size,ecx      ;îòíèìèì
  1971. ;       jmp     .st1                    ;ïîëó÷èì 0õ8000
  1972.  
  1973.  
  1974.  
  1975.  
  1976. ;êîððåêòèðîâêà çíà÷åíèÿ äîëæíà áûòü âûïîëåíåíà íà ðàçìåð êëàñòåðà
  1977. .correct_on_byte:
  1978. ;/óçíàåì ðàçìåð êëàñòåðà
  1979.         pop     eax     ;restore size of claster
  1980.         push    ecx
  1981. @@:     inc     data_offset
  1982.  
  1983.         cmp     eax,ecx
  1984.         jae     @f
  1985.         sub     ecx,eax
  1986.         jmp     @b
  1987. @@:     pop     ecx
  1988.  
  1989.  
  1990.  
  1991.  
  1992.         test    ecx,0x1
  1993.         jz      .st1
  1994.         inc     ecx
  1995. .st1:   shr     ecx,1     ; ïðåîáðàçîâàòü çíà÷åíèå äëÿ 0x87 function
  1996.  
  1997. ;ïåðåíåñåì áëîê çà 1 ìá        
  1998.         push    es
  1999.         push    ds
  2000.         pop     es
  2001.  
  2002.         mov     ah, 0x87
  2003.         int     0x15
  2004.         pop     es
  2005.  
  2006. if DEBUG
  2007.         pusha
  2008. ;       mov     ax,point_next_fat_str
  2009.         mov     cx,0x0a
  2010.         mov     di,return_code_af_move
  2011.         call    decode                                                                    
  2012. ;Show size
  2013.         mov     si,return_code_af_move
  2014.         call    printplain
  2015.         popa
  2016.  
  2017. end if
  2018.  
  2019. }
  2020.  
  2021.  
  2022. macro move_up_fat_and_root_d
  2023. ;ìàêðîñ, êîòîðûé ïîçâîëÿåò ïåðåíåñòè âûøå 1 ìá â ñòðóêòóðó îáðàçà ôàò òàáëèöó è ðóò äèðåêòîðèþ
  2024. {
  2025. local  .st1
  2026.  
  2027.         mov     ax,info_real_mode_size
  2028.         add     ax,0x1000
  2029.  
  2030.         mov     si,table_15_87
  2031.         mov     word [si+8*2+2],ax
  2032. ;ñìåùåíèå äî äàííûõ
  2033.         mov     ax,512
  2034.         mov     word [si+8*3+2],ax
  2035. ;fixme! òóò íåîáõîäèìî ñäåëàòü ïîäåðæêó ò.å. ôîðìèðîâàòü ñìåùåíèå ôàéëà â óæå çàïèñàííûõ äàííûõ.
  2036.  
  2037.         movzx   ecx,word [fat12_buffer.BPB_FATSz16]
  2038.         movzx   bx,byte [fat12_buffer.BPB_NumFATs]
  2039.         imul    cx,bx   ;9x1=9
  2040.  
  2041.         add     cx,size_root_dir        ;ðàçìåð êîðíåâîé äèððåêòîðèè
  2042.         shl     ecx,9   ;imul 512
  2043.  
  2044.  
  2045. ;êîððåêòèðîâêà çíà÷åíèÿ
  2046.         test    ecx,0x1
  2047.         jz      .st1
  2048.         inc     ecx
  2049. .st1:   shr     ecx,1
  2050.  
  2051.         push    es
  2052.         push    ds
  2053.         pop     es
  2054.  
  2055.         mov     ah, 0x87
  2056.         int     0x15
  2057.         pop     es
  2058.  
  2059. if DEBUG
  2060.         pusha
  2061. ;       mov     ax,point_next_fat_str
  2062.         mov     cx,0x0a
  2063.         mov     di,return_code_af_fat_m
  2064.         call    decode                                                                    
  2065. ;Show size
  2066.         mov     si,return_code_af_fat_m
  2067.         call    printplain
  2068.         popa
  2069.  
  2070. end if
  2071.  
  2072. }