Subversion Repositories Kolibri OS

Rev

Rev 1635 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1151 Lrz 1
; Copyright (c) 2008-2009, 
1065 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  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
;
1151 Lrz 15
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname  ''AS IS'' AND ANY
1065 Lrz 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  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.
1151 Lrz 28
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29
;Secondary Loader copyright Alexey Teplov nickname 
1065 Lrz 30
;if you need log preproc
31
;/////////////
32
;include 'listing.inc'
33
;enable listing
34
;////////////
1151 Lrz 35
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
36
;start of code:                                                               ;
37
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1065 Lrz 38
use16
39
                  org   0x0
2434 Serge 40
        jmp     start
1151 Lrz 41
include 'sl_equ.inc'            ; в файле размещены все equ предопределения
1065 Lrz 42
include 'boot_st.inc'
1151 Lrz 43
include 'debug_msg.inc'         ;here is message from debug
1065 Lrz 44
include 'parse_dat.inc'
45
include 'sl_proc.inc'
46
include 'parse.inc'
47
include 'parse_loader.inc'
48
include 'parse_any.inc'
49
include 'parse_def_sect.inc'
1151 Lrz 50
include 'parse_err.inc'
1065 Lrz 51
 
52
file_data  dw 0x0,ini_data_  ;формат: смещение: сегмент т.к. используется les
53
size_data  dw 16 ;16 блоков по 4 кб т.е предел до 64 кб
54
name_ini_f db 'kord/startos.ini',0
55
 
56
;////////////
57
loader_callback dd ?
58
load_drive dw ?
59
load_ft    dw ?
60
;Start code
61
 
62
start:
63
; Save far pointer to callback procedure, ds:si is point
64
        mov     word [cs:loader_callback], si
65
        mov     word [cs:loader_callback+2], ds
66
; Save type of drive
2434 Serge 67
        mov     word [cs:load_drive], ax
1065 Lrz 68
; Save type of FT
2434 Serge 69
        mov     word [cs:load_ft], bx
1065 Lrz 70
; set up stack
71
        mov     ax, cs
72
        mov     ss, ax
73
        xor     sp, sp
74
; set up segment registers
2434 Serge 75
        mov     ds, ax
76
        mov     es, ax
1065 Lrz 77
; just to be sure: force DF=0, IF=1
78
        cld
79
        sti
80
 
81
; set videomode
2434 Serge 82
        mov     ax, 3
1065 Lrz 83
        int     0x10
84
 
2434 Serge 85
        mov     si, version
1065 Lrz 86
        call    printplain
2434 Serge 87
        mov     al, '#'
88
        mov     cx, 80
1065 Lrz 89
;input cx=size al=char будет вывден символ сколько раз указано в cx
90
@@:
1151 Lrz 91
        call    putchar
92
        loop    @b
1065 Lrz 93
 
1151 Lrz 94
  if DEBUG
2434 Serge 95
        pushad
96
        mov     ax, cs
97
        shl     eax, 4  ; в десятичной системе  адрес сегмента
98
        mov     cx, 0xa
99
        mov     di, cseg_msg
100
        call    decode
1151 Lrz 101
;***************
2434 Serge 102
        mov     si, cseg_msg
103
        call    printplain
104
        popad
1151 Lrz 105
  end if
1065 Lrz 106
 
107
 
108
  if DEBUG
2434 Serge 109
        mov     si, stack_msg
110
        call    printplain
1065 Lrz 111
  end if
112
 
113
; Require 586 or higher processor (cpuid and rdtsc,rdmsr/wrmsr commands)
114
; install int 6 (#UD) handler
115
        xor     bx, bx
116
        mov     ds, bx
117
        push    word [bx+6*4+2]
118
        push    word [bx+6*4]
119
        mov     word [bx+6*4], ud16
120
        mov     word [bx+6*4+2], cs
121
; issue CPUID command
122
        xor     eax, eax        ; N.B.: will cause #UD before 386
123
        cpuid                   ; N.B.: will cause #UD before later 486s
124
        test    eax, eax
125
        jz      cpubad
126
; get processor features
127
        xor     eax, eax
128
        inc     ax
129
        cpuid
130
        test    dl, 10h         ; CPUID[1].edx[4] - TSC support
131
        jz      cpubad
132
        test    dl, 20h         ; CPUID[1].edx[5] - MSR support
133
        jnz     cpugood
134
 
135
ud16:   ; #UD handler, called if processor did not recognize some commands
136
cpubad:
137
; restore int 6 (#UD) handler
138
        pop     word [6*4]
139
        pop     word [6*4+2]
140
; say error
141
        push    cs
142
        pop     ds
143
        mov     si, badprocessor
144
sayerr:
145
        call    printplain
146
        jmp     $
147
 
148
cpugood:
149
; restore int 6 (#UD) handler
150
        pop     dword [6*4]
151
        push    cs
152
        pop     ds
153
 
154
; set up esp
155
        movzx   esp, sp
156
 
1151 Lrz 157
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
158
; init memory
159
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
160
 
161
 
162
 
163
 
164
; Load  startos.ini
2434 Serge 165
        mov     cx, loop_read_startos_file      ;кол-во попыток чтения файла конфигурации startos.ini
1151 Lrz 166
align 4
167
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
168
;  Load startos.ini                                                           ;
169
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
170
load_startos_file:
171
 
2434 Serge 172
        xor     ax, ax
173
        mov     di, file_data
1151 Lrz 174
        inc     ax        ;function 1 - read file
175
        push    cx
2434 Serge 176
        call    far dword [loader_callback]
1151 Lrz 177
        pop     cx
1065 Lrz 178
        push    cs
1151 Lrz 179
        push    cs
1065 Lrz 180
        pop     ds
181
        pop     es
182
 
2434 Serge 183
        test    bx, bx
1151 Lrz 184
        jz      check_conf_file
185
        dec     cx
186
        jnz     load_startos_file
1065 Lrz 187
 
188
;SET DEFAULT Not use ini file
189
error_ini:
190
        mov     si, error_ini_f1    ;Error: cannot load ini file, buffer is full
191
        dec     bx
192
        jz      err_show_ini
193
        mov     si, error_ini_f2    ;Error: ini file not found
194
        dec     bx
195
        jz      err_show_ini
196
        mov     si, error_ini_f3    ;Error: cannot read ini file
197
        dec     bx
198
        jz      err_show_ini
199
 
200
        mov     si, error_ini_nf    ;Error: unrecognized error when loading ini file
201
err_show_ini:
202
        call    printplain
203
        mov     si, error_ini_common
204
        call    printplain
205
; wait for keypress
2434 Serge 206
        xor     ax, ax
1065 Lrz 207
        int     16h
208
 
209
ini_loaded:
210
 
2434 Serge 211
        jmp     $
1065 Lrz 212
 
1151 Lrz 213
align 4
214
check_conf_file:
215
;Check config file in current dir
216
        push    ax      ;save size file
217
  if DEBUG
2434 Serge 218
        mov     cx, 0x0a
219
        mov     di, show_decode
1151 Lrz 220
        call    decode
221
;Show size
2434 Serge 222
        mov     si, show_string
1151 Lrz 223
        call    printplain
224
  end if
1065 Lrz 225
 
226
 
1151 Lrz 227
;Show message
2434 Serge 228
        mov     si, load_ini
1151 Lrz 229
        call    printplain
1065 Lrz 230
 
1151 Lrz 231
        pop     cx      ;restore size file
232
use_parse               ;parsing startos.ini
233
;
234
        jmp     ini_loaded
235
 
1065 Lrz 236
;;;;;;;;;;;;;;;;;;;;;;;;;;;
237
;DATA
238
;;;;;;;;;;;;;;;;;;;;;;;;;;;
239
; table for move to extended memory (int 15h, ah=87h)
1151 Lrz 240
align 4
1065 Lrz 241
table_15_87:
242
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
243
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
244
 
245
        db      0xff,0xff
1151 Lrz 246
        db      0x0,0x10
247
        db      0x00,0x93,0x0,0x0
1065 Lrz 248
 
249
        db      0xff,0xff,0x0,0x00,0x10,0x93,0x0,0x0
250
 
251
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
252
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
253
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
254
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
255
 
256
fat12_buffer:
1151 Lrz 257
.BS_jmpBoot             db 0x90,0x90,0x90       ;3 байта   NOP инструкция - ничего не делать
258
.BS_OEMName             db 'K SyS 64'   ;8 байт
259
.BPB_BytsPerSec         dw      512     ;кол-во байтов в секторе может быть любое 512 1024 2048 4096 2 байта
260
.BPB_SecPerClus         db      0x1     ;кол-во секторов в кластере
261
.BPB_RsvdSecCnt         dw      0x1     ;для FAt12/16 только 1, для FAT32 обычно 32
262
.BPB_NumFATs            db      0x1     ;кол-во фат таблиц, на тот случай если будет сброс на дискету образа рам диска
263
.BPB_RootEntCnt         dw      512     ;для мак совместимости с fat16
264
.BPB_TotSec16           dw      0x0     ;кл-во секторов
265
.BPB_Media              db      0xF0
266
.BPB_FATSz16            dw      0x0
267
.BPB_SecPerTrk          dw      0x0     ;содержит геометрию диска для RAMFS на как бы без разницы, пока пустое поле, позже внести реальные значения.
268
.BPB_NumHeads           dw      0x0
269
.BPB_HiddSec            dd      0x0     ;кол-во скрытых секторов
270
.BPB_TotSec32           dd      0x0
271
.BS_DrvNum              db      'R'     ;от слова RAM
272
.BS_Reserved1           db      0x0
273
.BS_BootSig             db      0x29
274
.BS_VolID               db      'RFKS'
275
.BS_VolLab              db      'RAM DISK FS'   ;11 символов
276
.BS_FilSysType          db      'FAT12   '      ;8 символов
1065 Lrz 277
;62 байта структура fat12.
1156 Lrz 278
db (512-($-fat12_buffer))dup(0x90)
1065 Lrz 279
 
280
 
281
 
282
;структура для дирректории fat
283
struc FAT_32_entry ;Byte Directory Entry Structure
284
{
1151 Lrz 285
.DIR_Name       rb      11
286
.DIR_Attr       db      ?
287
.DIR_NTRes      db      ?
288
.DIR_CrtTimeTenth db    ?
289
.DIR_CrtTime    dw      ?
290
.DIR_CrtDate    dw      ?
291
.DIR_LstAccDate dw      ?
292
.DIR_FstClusHI  dw      ?
293
.DIR_WrtTime    dw      ?
294
.DIR_WrtDate    dw      ?
295
.DIR_FstClusLO  dw      ?
296
.DIR_FileSize   dd      ?
1065 Lrz 297
 
298
 
299
}
300
;Тут будут распологатсья данные, которые затруднительно распологать в стековой области....
301
;;;
302
;timer
1151 Lrz 303
shot_name_fat   rb      11      ;временный буфер для fat12, в нем храняться имена файлов приведенные к правилам FAT /* вдальнейшем перенести в стэк
1156 Lrz 304
 
1065 Lrz 305
if DEBUG
1151 Lrz 306
                rb      1       ;нужен для отладки и вывода имени файла после преобразования
1156 Lrz 307
dest_name_fat   db      24 dup('_');12
2434 Serge 308
db      0x0
1065 Lrz 309
end if
1156 Lrz 310
 
1151 Lrz 311
value_timeout   rw      1       ;value to timeout
312
old_timer       rd      1       ;старое значение вектора таймера
313
start_timer     rd      1       ;значение таймера
314
timer_          rd      1       ;новое значение вектора таймера т.е. SL
315
start_stack     rw      1       ;save stack
316
save_bp_from_timer rw   1       ;save bp from timer
1065 Lrz 317