Subversion Repositories Kolibri OS

Rev

Rev 1735 | Rev 2261 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1735 Rev 1962
Line 9... Line 9...
9
;;  KolibriOS 16-bit loader,                                    ;;
9
;;  KolibriOS 16-bit loader,                                    ;;
10
;;                        based on bootcode for MenuetOS        ;;
10
;;                        based on bootcode for MenuetOS        ;;
11
;;                                                              ;;
11
;;                                                              ;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 13... Line 13...
13
 
13
 
Line 14... Line 14...
14
$Revision: 1735 $
14
$Revision: 1962 $
15
 
15
 
16
 
16
 
Line 89... Line 89...
89
        pop     ax
89
        pop     ax
90
        jnc     @f
90
        jnc     @f
91
        inc     si
91
        inc     si
92
        cmp     si, 10
92
        cmp     si, 10
93
        jb      @b
93
        jb      @b
-
 
94
sayerr_badsect:
94
        mov     si, badsect
95
        mov     si, badsect
95
sayerr_plain:
96
sayerr_plain:
96
        call    printplain
97
        call    printplain
97
        jmp     $
98
        jmp     $
98
@@:
99
@@:
Line 143... Line 144...
143
;                           16 BIT CODE
144
;                           16 BIT CODE
144
;
145
;
145
;=========================================================================
146
;=========================================================================
Line 146... Line 147...
146
 
147
 
-
 
148
include 'bootvesa.inc'                 ;Include source for boot vesa 
-
 
149
if defined extended_primary_loader
-
 
150
include 'parsers.inc'
Line 147... Line 151...
147
include 'bootvesa.inc'                 ;Include source for boot vesa 
151
end if
-
 
152
 
-
 
153
start_of_code:
-
 
154
 
-
 
155
if defined extended_primary_loader
-
 
156
; save data from primary loader
-
 
157
        mov     word [cs:bootcallback], si
-
 
158
        mov     word [cs:bootcallback+2], ds
-
 
159
        push    cs
-
 
160
        pop     ds
-
 
161
        mov     [bootdevice], ax
-
 
162
        mov     [bootfs], bx
-
 
163
 
-
 
164
; set up stack
-
 
165
        mov     ax, 3000h
-
 
166
        mov     ss, ax
-
 
167
        mov     sp, 0EC00h
-
 
168
 
-
 
169
; try to load configuration file
-
 
170
        mov     ax, 1
-
 
171
        mov     di, config_file_struct
-
 
172
        call    [bootcallback]
-
 
173
        cld
-
 
174
        push    cs
-
 
175
        pop     es
-
 
176
; bx=0 - ok, bx=1 - part of file loaded, assume this is ok
-
 
177
        cmp     bx, 1
-
 
178
        ja      .config_bad
-
 
179
; configuration file was loaded, parse
-
 
180
; if length is too big, use first 0FFFFh bytes
-
 
181
        test    dx, dx
-
 
182
        jz      @f
-
 
183
        mov     ax, 0FFFFh
-
 
184
@@:
-
 
185
; ds:si will be pointer to current data, dx = limit
-
 
186
        xchg    ax, dx
-
 
187
        push    4000h
-
 
188
        pop     ds
-
 
189
        xor     si, si
-
 
190
.parse_loop:
-
 
191
; skip spaces
-
 
192
        cmp     si, dx
-
 
193
        jae     .parse_done
-
 
194
        lodsb
-
 
195
        cmp     al, ' '
-
 
196
        jbe     .parse_loop
-
 
197
        dec     si
-
 
198
; loop over all possible configuration values
-
 
199
        mov     bx, config_file_variables
-
 
200
.find_variant:
-
 
201
; get length
-
 
202
        mov     cx, [es:bx]
-
 
203
; zero length = end of list
-
 
204
        jecxz   .find_newline
-
 
205
; skip over length
-
 
206
        inc     bx
-
 
207
        inc     bx
-
 
208
        mov     di, bx
-
 
209
; skip over string
-
 
210
        add     bx, cx
-
 
211
; test whether we have at least cx symbols left
-
 
212
        mov     ax, cx
-
 
213
        add     ax, si
-
 
214
        jc      .next_variant1
-
 
215
        cmp     ax, dx
-
 
216
        jae     .next_variant1
-
 
217
; save current position
-
 
218
        push    si
-
 
219
; compare strings
-
 
220
        repz    cmpsb
-
 
221
        jnz     .next_variant2
-
 
222
; strings are equal; look for "=" with possible spaces before and after
-
 
223
@@:
-
 
224
        cmp     si, dx
-
 
225
        jae     .next_variant2
-
 
226
        lodsb
-
 
227
        cmp     al, ' '
-
 
228
        jbe     @b
-
 
229
        cmp     al, '='
-
 
230
        jnz     .next_variant2
-
 
231
; ok, we found the true variant
-
 
232
; ignore saved position on the stack
-
 
233
        pop     ax
-
 
234
; call the parser
-
 
235
        call    word [es:bx]
-
 
236
; line parsed, find next
-
 
237
.find_newline:
-
 
238
        cmp     si, dx
-
 
239
        jae     .parse_done
-
 
240
        lodsb
-
 
241
        cmp     al, 13
-
 
242
        jz      .parse_loop
-
 
243
        cmp     al, 10
-
 
244
        jz      .parse_loop
-
 
245
        jmp     .find_newline
-
 
246
.next_variant2:
-
 
247
; continue to the next variant, restoring current position
-
 
248
        pop     si
-
 
249
.next_variant1:
-
 
250
; continue to the next variant
-
 
251
; skip over the parser
-
 
252
        inc     bx
-
 
253
        inc     bx
-
 
254
        jmp     .find_variant
-
 
255
.parse_done:
-
 
256
.config_bad:
-
 
257
 
-
 
258
; set up segment registers
-
 
259
        push    cs
148
 
260
        pop     ds
149
start_of_code:
261
else
150
        cld
262
        cld
151
; \begin{diamond}[02.12.2005]
263
; \begin{diamond}[02.12.2005]
152
; if bootloader sets ax = 'KL', then ds:si points to loader block
264
; if bootloader sets ax = 'KL', then ds:si points to loader block
Line 173... Line 285...
173
; set up segment registers
285
; set up segment registers
174
        push    cs
286
        push    cs
175
        pop     ds
287
        pop     ds
176
        push    cs
288
        push    cs
177
        pop     es
289
        pop     es
-
 
290
end if
Line 178... Line 291...
178
 
291
 
179
; set videomode
292
; set videomode
180
        mov     ax, 3
293
        mov     ax, 3
Line 376... Line 489...
376
        mov     [es:0x9054], dx
489
        mov     [es:0x9054], dx
Line 377... Line 490...
377
 
490
 
378
apm_end:
491
apm_end:
Line -... Line 492...
-
 
492
        _setcursor d80x25_top_num, 0
379
        _setcursor d80x25_top_num, 0
493
 
380
 
494
if ~ defined extended_primary_loader
381
;CHECK current of code
495
;CHECK current of code
382
        cmp     [cfgmanager.loader_block], -1
496
        cmp     [cfgmanager.loader_block], -1
383
        jz      noloaderblock
497
        jz      noloaderblock
384
        les     bx, [cfgmanager.loader_block]
498
        les     bx, [cfgmanager.loader_block]
385
        cmp     byte [es:bx], 1
499
        cmp     byte [es:bx], 1
386
        mov     si, loader_block_error
500
        mov     si, loader_block_error
387
        jnz     sayerr
501
        jnz     sayerr
-
 
502
        push    0
Line 388... Line 503...
388
        push    0
503
        pop     es
389
        pop     es
504
end if
390
 
505
 
391
noloaderblock:
506
noloaderblock:
Line 402... Line 517...
402
; b) preboot_dma  = use DMA access?
517
; b) preboot_dma  = use DMA access?
403
; c) preboot_vrrm = use VRR?
518
; c) preboot_vrrm = use VRR?
404
; d) preboot_device = from what boot?
519
; d) preboot_device = from what boot?
Line 405... Line 520...
405
 
520
 
-
 
521
; determine default settings
406
; determine default settings
522
if ~ defined extended_primary_loader
-
 
523
        mov     [.bSettingsChanged], 0
Line 407... Line 524...
407
        mov     [.bSettingsChanged], 0
524
end if
408
 
525
 
409
;.preboot_gr_end:
526
;.preboot_gr_end:
410
        mov     di, preboot_device
527
        mov     di, preboot_device
411
; if image in memory is present and [preboot_device] is uninitialized,
528
; if image in memory is present and [preboot_device] is uninitialized,
412
; set it to use this preloaded image
529
; set it to use this preloaded image
-
 
530
        cmp     byte [di], 0
-
 
531
        jnz     .preboot_device_inited
-
 
532
if defined extended_primary_loader
-
 
533
        inc     byte [di]
-
 
534
        cmp     byte [bootdevice], 'f' ; floppy?
-
 
535
        jz      .preboot_device_inited
413
        cmp     byte [di], 0
536
        inc     byte [di]
414
        jnz     .preboot_device_inited
537
else
415
        cmp     [.loader_block], -1
538
        cmp     [.loader_block], -1
416
        jz      @f
539
        jz      @f
417
        les     bx, [.loader_block]
540
        les     bx, [.loader_block]
418
        test    byte [es:bx+1], 1
541
        test    byte [es:bx+1], 1
419
        jz      @f
542
        jz      @f
420
        mov     byte [di], 3
543
        mov     byte [di], 3
421
        jmp     .preboot_device_inited
544
        jmp     .preboot_device_inited
422
@@:
545
@@:
-
 
546
; otherwise, set [preboot_device] to 1 (default value - boot from floppy)
423
; otherwise, set [preboot_device] to 1 (default value - boot from floppy)
547
        mov     byte [di], 1
424
        mov     byte [di], 1
548
end if
425
.preboot_device_inited:
549
.preboot_device_inited:
426
; following 4 lines set variables to 1 if its current value is 0
550
; following 4 lines set variables to 1 if its current value is 0
427
        cmp     byte [di+preboot_dma-preboot_device], 1
551
        cmp     byte [di+preboot_dma-preboot_device], 1
Line 464... Line 588...
464
        cmp     [preboot_vrrm], 1
588
        cmp     [preboot_vrrm], 1
465
        call    .say_on_off
589
        call    .say_on_off
466
        mov     si, preboot_device_msg
590
        mov     si, preboot_device_msg
467
        call    print
591
        call    print
468
        mov     al, [preboot_device]
592
        mov     al, [preboot_device]
-
 
593
if defined extended_primary_loader
-
 
594
        and     eax, 3
-
 
595
else
469
        and     eax, 7
596
        and     eax, 7
-
 
597
end if
470
        mov     si, [preboot_device_msgs+eax*2]
598
        mov     si, [preboot_device_msgs+eax*2]
471
        call    printplain
599
        call    printplain
472
.show_remarks:
600
.show_remarks:
473
; show remarks in gray color
601
; show remarks in gray color
474
        mov     di, ((21-num_remarks)*80 + 2)*2
602
        mov     di, ((21-num_remarks)*80 + 2)*2
Line 551... Line 679...
551
        cmp     al, 'd'
679
        cmp     al, 'd'
552
        jnz     .show_remarks
680
        jnz     .show_remarks
553
        _setcursor 15,0
681
        _setcursor 15,0
554
        mov     si, bdev
682
        mov     si, bdev
555
        call    print
683
        call    print
-
 
684
if defined extended_primary_loader
-
 
685
        mov     bx, '12'
-
 
686
else
556
        mov     bx, '14'
687
        mov     bx, '14'
-
 
688
end if
557
        call    getkey
689
        call    getkey
558
        mov     [preboot_device], al
690
        mov     [preboot_device], al
559
        _setcursor 13,0
691
        _setcursor 13,0
560
.d:
692
.d:
-
 
693
if ~ defined extended_primary_loader
561
        mov     [.bSettingsChanged], 1
694
        mov     [.bSettingsChanged], 1
-
 
695
end if
562
        call    clear_vmodes_table             ;clear vmodes_table
696
        call    clear_vmodes_table             ;clear vmodes_table
563
        jmp    .printcfg
697
        jmp    .printcfg
564
.change_a:
698
.change_a:
565
.loops:
699
.loops:
566
        call    draw_vmodes_table
700
        call    draw_vmodes_table
Line 670... Line 804...
670
@@:     jmp     printplain
804
@@:     jmp     printplain
671
; novesa and vervesa strings are not used at the moment of executing this code
805
; novesa and vervesa strings are not used at the moment of executing this code
672
virtual at novesa
806
virtual at novesa
673
.oldtimer dd ?
807
.oldtimer dd ?
674
.starttime dd ?
808
.starttime dd ?
-
 
809
if ~ defined extended_primary_loader
675
.bSettingsChanged db ?
810
.bSettingsChanged db ?
-
 
811
end if
676
.timer dd ?
812
.timer dd ?
677
end virtual
813
end virtual
-
 
814
if ~ defined extended_primary_loader
678
.loader_block dd -1
815
.loader_block dd -1
-
 
816
end if
679
.gettime:
817
.gettime:
680
        mov     ah, 0
818
        mov     ah, 0
681
        int     1Ah
819
        int     1Ah
682
        xchg    ax, cx
820
        xchg    ax, cx
683
        shl     eax, 10h
821
        shl     eax, 10h
Line 690... Line 828...
690
        pushf
828
        pushf
691
        call    [.oldtimer]
829
        call    [.oldtimer]
692
        pushad
830
        pushad
693
        call    .gettime
831
        call    .gettime
694
        sub     eax, [.starttime]
832
        sub     eax, [.starttime]
-
 
833
if defined extended_primary_loader
-
 
834
        sub     ax, [preboot_timeout]
-
 
835
else
695
        sub     ax, 18*5
836
        sub     ax, 18*5
-
 
837
end if
696
        jae     .timergo
838
        jae     .timergo
697
        neg     ax
839
        neg     ax
698
        add     ax, 18-1
840
        add     ax, 18-1
699
        mov     bx, 18
841
        mov     bx, 18
700
        xor     dx, dx
842
        xor     dx, dx
Line 746... Line 888...
746
        call    printplain
888
        call    printplain
747
        _setcursor 6,0
889
        _setcursor 6,0
748
        mov     si, loading_msg
890
        mov     si, loading_msg
749
        call    print
891
        call    print
750
        _setcursor 15,0
892
        _setcursor 15,0
-
 
893
if ~ defined extended_primary_loader
751
        cmp     [.bSettingsChanged], 0
894
        cmp     [.bSettingsChanged], 0
752
        jz      .load
895
        jz      .load
753
        cmp     [.loader_block], -1
896
        cmp     [.loader_block], -1
754
        jz      .load
897
        jz      .load
755
        les     bx, [.loader_block]
898
        les     bx, [.loader_block]
Line 786... Line 929...
786
        mov     byte [si+80], 0
929
        mov     byte [si+80], 0
787
        _setcursor 15,0
930
        _setcursor 15,0
788
        call    printplain
931
        call    printplain
789
        _setcursor 15,0
932
        _setcursor 15,0
790
.load:
933
.load:
-
 
934
end if
791
; \end{diamond}[02.12.2005]
935
; \end{diamond}[02.12.2005]
Line 792... Line 936...
792
 
936
 
Line 793... Line 937...
793
; ASK GRAPHICS MODE
937
; ASK GRAPHICS MODE
Line 965... Line 1109...
965
        jz      @f
1109
        jz      @f
966
sayerr_floppy:
1110
sayerr_floppy:
967
        mov     dx, 0x3f2
1111
        mov     dx, 0x3f2
968
        mov     al, 0
1112
        mov     al, 0
969
        out     dx, al
1113
        out     dx, al
-
 
1114
sayerr_memmove:
970
        mov     si, memmovefailed
1115
        mov     si, memmovefailed
971
        jmp     sayerr_plain
1116
        jmp     sayerr_plain
972
@@:
1117
@@:
973
        pop     ax                      ; restore from stack count of words in boot+FAT
1118
        pop     ax                      ; restore from stack count of words in boot+FAT
974
        shl     ax, 1                   ; make bytes count from count of words
1119
        shl     ax, 1                   ; make bytes count from count of words
Line 1143... Line 1288...
1143
        int     0x13
1288
        int     0x13
1144
        mov     dx, 0x3f2       ; floppy motor off
1289
        mov     dx, 0x3f2       ; floppy motor off
1145
        mov     al, 0
1290
        mov     al, 0
1146
        out     dx, al
1291
        out     dx, al
Line -... Line 1292...
-
 
1292
 
-
 
1293
if defined extended_primary_loader
-
 
1294
        cmp     [boot_dev], 1
-
 
1295
        jne     no_sys_from_primary
-
 
1296
; load kolibri.img using callback from primary loader
-
 
1297
        and     word [movedesc + 24 + 2], 0
-
 
1298
        mov     byte [movedesc + 24 + 4], 10h
-
 
1299
; read in blocks of 64K until file is fully loaded
-
 
1300
        mov     ax, 1
-
 
1301
.repeat:
-
 
1302
        mov     di, image_file_struct
-
 
1303
        call    [bootcallback]
-
 
1304
        push    cs
-
 
1305
        pop     ds
-
 
1306
        push    cs
-
 
1307
        pop     es
-
 
1308
        cmp     bx, 1
-
 
1309
        ja      sayerr_badsect
-
 
1310
        push    bx
-
 
1311
        mov     si, movedesc
-
 
1312
        and     word [si + 16 + 2], 0
-
 
1313
        mov     byte [si + 16 + 4], 4
-
 
1314
        mov     ah, 87h
-
 
1315
        mov     cx, 8000h
-
 
1316
        int     15h
-
 
1317
        pop     bx
-
 
1318
        test    ah, ah
-
 
1319
        jnz     sayerr_memmove
-
 
1320
        inc     byte [si + 24 + 4]
-
 
1321
        test    bx, bx
-
 
1322
        jz      no_sys_from_primary
-
 
1323
        mov     ax, 2
-
 
1324
        jmp     .repeat
-
 
1325
no_sys_from_primary:
Line 1147... Line 1326...
1147
 
1326
end if
Line 1148... Line 1327...
1148
 
1327
 
1149
; SET GRAPHICS
1328
; SET GRAPHICS