Subversion Repositories Kolibri OS

Rev

Rev 1151 | 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 aka <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. ;start of the project 13.02.2008 year.
  28. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  29. ;Secondary Loader copyright Alexey Teplov aka <Lrz> & K Soft team
  30. ;if you need log preproc
  31. ;/////////////
  32. ;include 'listing.inc'
  33. ;enable listing
  34. ;////////////
  35. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  36. ;start of code:
  37. ;;;;;;;;;;;;;;;
  38. DEBUG equ 1
  39. root_dir_entry_count    equ     224     ;êîë-âî ýëåìåíòîâ â êîðíåâîé äèððåêòîðèè
  40. ;point_to_fat_struc     equ     0xA000  ;âðåìåííûé áóôåð, êóäà áóäåò ðàçìåùåíà Fat òàáëèöà, è çàòåì ïåðåíåñåíà çà 1 ìá
  41. ini_data_               equ     0x2000  ;ôàéë ãäå ðàçìåùåí ôàéë ñöåíàðèÿ çàãðóçêè, òàì ïðîèñõîäèò ñèíòàêñè÷åñêèé ðàçáîð
  42. size_show_section       equ     18
  43. default_timeout_value   equ     5       ;default value to timeout is will was some errors
  44. flag_found_default      equ     0x1     ;default value is found
  45. flag_found_timeout      equ     0x2     ;timeout value is found
  46. flag_found_LM           equ     0x1     ;found LM value
  47. flag_found_RS           equ     0x2     ;found RS value
  48. flag_found_GTRFMS       equ     0x4     ;found type RamFS
  49. flag_found_RamdiskSector equ    0x8     ;found RamdiskSector
  50. flag_found_RamdiskCluster equ   0x16    ;found RamdiskCluster
  51. ;statick data ýòè äàííûå íå ïðåäîïðåäåëÿþòñÿ â òå÷åíèè âûïîëíåíèÿ âñåé ïðîãðàììû.
  52. save_cx         equ     word [bp-2]     ;save cx size ini file
  53. ret_on_ch       equ     word [bp-4]     ;point to return   ðàçðóøàåìîå çíà÷åíèå
  54. save_cx_d       equ     word [bp-6]     ;save cx - size default section and working section                                
  55. status_flag     equ     word [bp-8]     ;status flag
  56. point_loader    equ     word [bp-10]
  57. point_default   equ     word [bp-12]    ;point to default
  58.  
  59. ;äàííûå êîòîðûå çàâèñèìû îò âåòêè âûïîëíåíèÿ è êîòîðûå ìîãóò áûòü ïåðåîïðåäåëåíû â ïðîöåññå âûïîëíåíèÿ ïðîãðàììû.
  60. point_to_hframe equ     word [bp-14]    ;point on start frame (for change section)
  61. point_to_1      equ     word [bp-16]
  62. point_to_2      equ     word [bp-18]
  63. point_to_3      equ     word [bp-20]
  64. point_to_4      equ     word [bp-22]
  65. point_to_5      equ     word [bp-24]
  66. point_to_6      equ     word [bp-26]
  67. point_to_7      equ     word [bp-28]
  68. point_to_8      equ     word [bp-30]
  69. point_to_9      equ     word [bp-32]
  70. point_to_10     equ     word [bp-34]
  71. point_to_11     equ     word [bp-36]
  72. point_to_12     equ     word [bp-38]
  73. point_to_13     equ     word [bp-40]
  74. point_to_14     equ     word [bp-42]
  75. point_to_15     equ     word [bp-44]
  76. point_to_16     equ     word [bp-46]
  77. point_to_16     equ     word [bp-48]
  78. point_to_17     equ     word [bp-50]
  79. point_to_18     equ     word [bp-52]
  80. ;here array for fast scroling  16 word - poin to start section
  81. point_to_point_def      equ     word [bp-54]
  82. point_to_eframe equ     word [bp-56]    ;point on point frame
  83.  
  84.  
  85.  
  86. ; òóò ðàñïîëîæåíî âðåìåííîå õðàíèëèùå äëÿ cx è di ïðè ïåðåõîäå íà ñëåäóþùèé áóôåð ïðè ïîèñêå ñåêöèé
  87. find_sec_di     equ     word [bp-58]    ;òóò áóäåò õðàíèòüñÿ di
  88. info_real_mode_size     equ     word [bp-60];òóò õðàíèòüñÿ èíôîðìàöèÿ î çàíÿòîé îáëàñòè ò.å. ðàçìåð, ìîæíî óçíàòü ñêîëüêî îñòàëîñü ìåñòà âû÷èñëèâ
  89. free_ad_memory  equ     word    [bp-62] ;ñêîëüêî ó íàñ ðàñøèðåííîé ïàìÿòè äëÿ ôîðìèðîâàíèÿ ðàì äèñêà è çàãðóçêè ìîäóëåé
  90. show_errors_sect equ    word    [bp-64] ;ïåðåìåíàÿ êîòîðàÿ õðàíèò áèòû îøèáîê äëÿ êàæäîé ëîãè÷åñêîé ñåêöèè.
  91. save_descript_size      equ     word    [bp-66] ;save descript size previos section ñîõðàíèì ðàçìåð ïðåäûäóùåé ñåêöèè êîòîðóþ âûâîäèëè
  92. save_ramdisksize        equ     dword   [bp-70] ;save size of ramdisk in byte
  93. save_file_size          equ     dword   [bp-74] ;save size of reading file
  94. set_ramfs               equ     word    [bp-76] ;îïðåäåëåííûé òèï ôàéëîâîé ñèñòåìû,íóæíî äëÿ ôîðìèðîâàíèÿ ðàì äèñêà
  95. point_next_fat_str      equ     word    [bp-78] ;óêàçàòåëü íà ñëåäóþùèé ýëåìåíò fat òàáëèöû
  96. size_root_dir           equ     word    [bp-80] ;êîë-âî ýëåìåíòîâ â ñåêòîðàõ ïî 512 áàéò êîðíåâîé äèðåêòîðèè
  97. firstDataSect           equ     word    [bp-82] ;ïåðâûé ñåêòîð äàííûõ â ñåòîðàõ îò 0
  98. DataClasters            equ     word    [bp-84] ;ðàçìåð ìàññèâà äîñòóïíîé äëÿ çàïèñè äàííûõ â êëàñòåðàõ.
  99. point_to_free_root      equ     word    [bp-86] ;óêàçàòåëü íà ñëåäóþùèé ïóñòóþ çàïèñü â ðóò äèð
  100. point_to_dest_file_name equ     word    [bp-88] ;óêàçûâàåò íà íà÷àëî èìåíè ôàéëà íàçíà÷åíèÿ.
  101. data_offset             equ     word    [bp-90] ;ñìåùåíèå â êëàñòåðàõ äëÿ çàïèñàííûõ äàííûõ ò.å ïåðåêèíóòûõ çà 1-é ìá
  102. first_input             equ     word    [bp-92] ;ïîëå äëÿ ôëàãîâ â ïðåîáðàçîâàíèè èìåíè.
  103. save_di_RAMDISK         equ     word    [bp-94] ;ñîõðàíèì di -óêàçàòåëÿ ïðè îáðàáîòêå ñåêöèè
  104. save_cx_RAMDISK         equ     word    [bp-96] ;ñîõðàíèì ðàçìåð îñòàòêà ñåêöèè
  105. status_flag_loader_f    equ     word    [bp-98] ;ñîõðàíèì ðåçóëüòàò âûïîëåíåíèÿ çàãðóçêè ôàéëà
  106. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  107. ;äàííûå êîòîðûå èñïîëüçóþòñÿ ïðè îáðàáîòêå ñåêöèè, ò.å. ïîñëå íàæàòèÿ Enter, óæå íå âîçìîæíî âåðíóòüñÿ â ïåðâîíà÷àëüíûé ýêðàí
  108. ;äëÿ âîçâðàòà, íåîáõîäèìî ïåðåçàïóñòèòü ïîëíîñòüþ êîä ò.å. ñòàðòîâàòü ñ 0õ1000:0000
  109.  
  110.  
  111.  
  112.  
  113. use16
  114.                   org   0x0
  115.                   jmp   start
  116. include 'boot_st.inc'
  117. include 'debug_msg.inc'   ;here is message from debug
  118. include 'parse_dat.inc'
  119. include 'sl_proc.inc'
  120. include 'parse.inc'
  121. include 'parse_loader.inc'
  122. include 'parse_any.inc'
  123. include 'parse_def_sect.inc'
  124. include 'parse_err.inc'
  125.  
  126. file_data  dw 0x0,ini_data_  ;ôîðìàò: ñìåùåíèå: ñåãìåíò ò.ê. èñïîëüçóåòñÿ les
  127. size_data  dw 16 ;16 áëîêîâ ïî 4 êá ò.å ïðåäåë äî 64 êá
  128. name_ini_f db 'kord/startos.ini',0
  129.  
  130. ;////////////
  131. loader_callback dd ?
  132. load_drive dw ?
  133. load_ft    dw ?
  134. ;Start code
  135.  
  136. start:
  137. ; Save far pointer to callback procedure, ds:si is point
  138.         mov     word [cs:loader_callback], si
  139.         mov     word [cs:loader_callback+2], ds
  140. ; Save type of drive
  141.         mov     word [cs:load_drive],ax
  142. ; Save type of FT
  143.         mov     word [cs:load_ft],bx
  144. ; set up stack
  145.         mov     ax, cs
  146.         mov     ss, ax
  147.         xor     sp, sp
  148. ; set up segment registers
  149.         mov     ds,ax
  150.         mov     es,ax
  151. ; just to be sure: force DF=0, IF=1
  152.         cld
  153.         sti
  154.  
  155. ; set videomode
  156.         mov     ax,3
  157.         int     0x10
  158.  
  159.         mov     si,version
  160.         call    printplain
  161.         mov     al,'#'
  162.         mov     cx,80
  163. ;input cx=size al=char áóäåò âûâäåí ñèìâîë ñêîëüêî ðàç óêàçàíî â cx
  164. @@:
  165.         call    putchar
  166.         loop    @b
  167.  
  168.  
  169.  
  170.   if DEBUG
  171.         mov si,stack_msg
  172.         call printplain
  173.   end if
  174.  
  175. ; Require 586 or higher processor (cpuid and rdtsc,rdmsr/wrmsr commands)
  176. ; install int 6 (#UD) handler
  177.         xor     bx, bx
  178.         mov     ds, bx
  179.         push    word [bx+6*4+2]
  180.         push    word [bx+6*4]
  181.         mov     word [bx+6*4], ud16
  182.         mov     word [bx+6*4+2], cs
  183. ; issue CPUID command
  184.         xor     eax, eax        ; N.B.: will cause #UD before 386
  185.         cpuid                   ; N.B.: will cause #UD before later 486s
  186.         test    eax, eax
  187.         jz      cpubad
  188. ; get processor features
  189.         xor     eax, eax
  190.         inc     ax
  191.         cpuid
  192.         test    dl, 10h         ; CPUID[1].edx[4] - TSC support
  193.         jz      cpubad
  194.         test    dl, 20h         ; CPUID[1].edx[5] - MSR support
  195.         jnz     cpugood
  196.  
  197. ud16:   ; #UD handler, called if processor did not recognize some commands
  198. cpubad:
  199. ; restore int 6 (#UD) handler
  200.         pop     word [6*4]
  201.         pop     word [6*4+2]
  202. ; say error
  203.         push    cs
  204.         pop     ds
  205.         mov     si, badprocessor
  206. sayerr:
  207.         call    printplain
  208.         jmp     $
  209.  
  210. cpugood:
  211. ; restore int 6 (#UD) handler
  212.         pop     dword [6*4]
  213.         push    cs
  214.         pop     ds
  215.  
  216. ; set up esp
  217.         movzx   esp, sp
  218.  
  219. ;Load  startos.ini
  220.         xor     ax,ax   ; function 1 - read file
  221.         mov     di,file_data
  222.         inc     ax
  223.         call    far  dword [loader_callback]
  224.         push    cs
  225.         push    cs
  226.         pop     ds
  227.         pop     es
  228.  
  229.         test    bx,bx
  230.         jnz     error_ini
  231.  
  232. ;Check config file in current dir
  233.         push    ax      ;save size file
  234.   if DEBUG
  235.         mov     cx,0x0a
  236.         mov     di,show_decode
  237.         call    decode
  238. ;Show size
  239.         mov     si,show_string
  240.         call    printplain
  241.   end if
  242.  
  243.  
  244. ;Show message
  245.         mov     si,load_ini
  246.         call    printplain
  247.  
  248.         pop     cx      ;restore size file
  249. use_parse               ;parsing startos.ini
  250. ;
  251.         jmp     ini_loaded
  252.  
  253. ;SET DEFAULT Not use ini file
  254. error_ini:
  255.         mov     si, error_ini_f1    ;Error: cannot load ini file, buffer is full
  256.         dec     bx
  257.         jz      err_show_ini
  258.         mov     si, error_ini_f2    ;Error: ini file not found
  259.         dec     bx
  260.         jz      err_show_ini
  261.         mov     si, error_ini_f3    ;Error: cannot read ini file
  262.         dec     bx
  263.         jz      err_show_ini
  264.  
  265.         mov     si, error_ini_nf    ;Error: unrecognized error when loading ini file
  266. err_show_ini:
  267.         call    printplain
  268.         mov     si, error_ini_common
  269.         call    printplain
  270. ; wait for keypress
  271.         mov     ah, 0
  272.         int     16h
  273.  
  274. ini_loaded:
  275.  
  276.         jmp $
  277.  
  278.  
  279.  
  280.  
  281. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  282. ;DATA
  283. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  284. ; table for move to extended memory (int 15h, ah=87h)
  285. align 8
  286. table_15_87:
  287.         db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
  288.         db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
  289.  
  290.         db      0xff,0xff
  291.         db      0x0,0x10
  292.         db      0x00,0x93,0x0,0x0
  293.  
  294.         db      0xff,0xff,0x0,0x00,0x10,0x93,0x0,0x0
  295.  
  296.         db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
  297.         db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
  298.         db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
  299.         db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
  300.  
  301. fat12_buffer:
  302. .BS_jmpBoot             db 0x90,0x90,0x90       ;3 áàéòà   NOP èíñòðóêöèÿ - íè÷åãî íå äåëàòü
  303. .BS_OEMName             db 'K SyS 64'   ;8 áàéò
  304. .BPB_BytsPerSec         dw      512     ;êîë-âî áàéòîâ â ñåêòîðå ìîæåò áûòü ëþáîå 512 1024 2048 4096 2 áàéòà
  305. .BPB_SecPerClus         db      0x1     ;êîë-âî ñåêòîðîâ â êëàñòåðå
  306. .BPB_RsvdSecCnt         dw      0x1     ;äëÿ FAt12/16 òîëüêî 1, äëÿ FAT32 îáû÷íî 32    
  307. .BPB_NumFATs            db      0x1     ;êîë-âî ôàò òàáëèö, íà òîò ñëó÷àé åñëè áóäåò ñáðîñ íà äèñêåòó îáðàçà ðàì äèñêà
  308. .BPB_RootEntCnt         dw      512     ;äëÿ ìàê ñîâìåñòèìîñòè ñ fat16
  309. .BPB_TotSec16           dw      0x0     ;êë-âî ñåêòîðîâ
  310. .BPB_Media              db      0xF0
  311. .BPB_FATSz16            dw      0x0
  312. .BPB_SecPerTrk          dw      0x0     ;ñîäåðæèò ãåîìåòðèþ äèñêà äëÿ RAMFS íà êàê áû áåç ðàçíèöû, ïîêà ïóñòîå ïîëå, ïîçæå âíåñòè ðåàëüíûå çíà÷åíèÿ.
  313. .BPB_NumHeads           dw      0x0
  314. .BPB_HiddSec            dd      0x0     ;êîë-âî ñêðûòûõ ñåêòîðîâ
  315. .BPB_TotSec32           dd      0x0
  316. .BS_DrvNum              db      'R'     ;îò ñëîâà RAM
  317. .BS_Reserved1           db      0x0
  318. .BS_BootSig             db      0x29
  319. .BS_VolID               db      'RFKS' 
  320. .BS_VolLab              db      'RAM DISK FS'   ;11 ñèìâîëîâ
  321. .BS_FilSysType          db      'FAT12   '      ;8 ñèìâîëîâ
  322. ;62 áàéòà ñòðóêòóðà fat12.
  323.  
  324.  
  325.  
  326.  
  327. ;ñòðóêòóðà äëÿ äèððåêòîðèè fat
  328. struc FAT_32_entry ;Byte Directory Entry Structure
  329. {
  330. .DIR_Name       rb      11
  331. .DIR_Attr       db      ?
  332. .DIR_NTRes      db      ?
  333. .DIR_CrtTimeTenth db    ?
  334. .DIR_CrtTime    dw      ?
  335. .DIR_CrtDate    dw      ?
  336. .DIR_LstAccDate dw      ?
  337. .DIR_FstClusHI  dw      ?
  338. .DIR_WrtTime    dw      ?
  339. .DIR_WrtDate    dw      ?
  340. .DIR_FstClusLO  dw      ?
  341. .DIR_FileSize   dd      ?
  342.  
  343.  
  344. }
  345. ;Òóò áóäóò ðàñïîëîãàòñüÿ äàííûå, êîòîðûå çàòðóäíèòåëüíî ðàñïîëîãàòü â ñòåêîâîé îáëàñòè....
  346. ;;;
  347. ;timer
  348. shot_name_fat   rb      11
  349. if DEBUG
  350.                 rb      1       ;íóæåí äëÿ îòëàäêè è âûâîäà èìåíè ôàéëà ïîñëå ïðåîáðàçîâàíèÿ
  351. dest_name_fat   rb      12
  352. end if
  353. value_timeout   rw      1       ;value to timeout
  354. old_timer       rd      1       ;ñòàðîå çíà÷åíèå âåêòîðà òàéìåðà
  355. start_timer     rd      1       ;çíà÷åíèå òàéìåðà
  356. timer_          rd      1       ;íîâîå çíà÷åíèå âåêòîðà òàéìåðà ò.å. SL
  357. start_stack     rw      1       ;save stack
  358. save_bp_from_timer rw   1       ;save bp from timer
  359.  
  360.