Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2455 mario79 3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
2288 clevermous 4
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
7
;;  BOOTCODE.INC                                                ;;
8
;;                                                              ;;
9
;;  KolibriOS 16-bit loader,                                    ;;
10
;;                        based on bootcode for MenuetOS        ;;
11
;;                                                              ;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13
 
14
$Revision: 3777 $
15
 
16
 
17
;==========================================================================
18
;
19
;                           16 BIT FUNCTIONS
20
;
21
;==========================================================================
22
 
23
 
24
putchar:
25
; in: al=character
26
        mov     ah, 0Eh
27
        mov     bh, 0
28
        int     10h
29
        ret
30
 
31
print:
32
; in: si->string
33
        mov     al, 186
34
        call    putchar
35
        mov     al, ' '
36
        call    putchar
37
 
38
printplain:
39
; in: si->string
40
        pusha
41
        lodsb
42
@@:
43
        call    putchar
44
        lodsb
45
        test    al, al
46
        jnz     @b
47
        popa
48
        ret
49
 
50
getkey:
51
; get number in range [bl,bh] (bl,bh in ['0'..'9'])
52
; in: bx=range
53
; out: ax=digit (1..9, 10 for 0)
54
        mov     ah, 0
55
        int     16h
56
        cmp     al, bl
57
        jb      getkey
58
        cmp     al, bh
59
        ja      getkey
60
        push    ax
61
        call    putchar
62
        pop     ax
63
        and     ax, 0Fh
64
        jnz     @f
65
        mov     al, 10
66
@@:
67
        ret
68
 
69
setcursor:
70
; in: dl=column, dh=row
71
        mov     ah, 2
72
        mov     bh, 0
73
        int     10h
74
        ret
75
 
76
macro _setcursor row,column
77
{
78
        mov     dx, row*256 + column
79
        call    setcursor
80
}
81
 
82
boot_read_floppy:
83
        push    si
84
        xor     si, si
85
        mov     ah, 2   ; read
86
@@:
87
        push    ax
88
        int     0x13
89
        pop     ax
90
        jnc     @f
91
        inc     si
92
        cmp     si, 10
93
        jb      @b
94
sayerr_badsect:
95
        mov     si, badsect
96
sayerr_plain:
97
        call    printplain
98
        jmp     $
99
@@:
100
        pop     si
101
        ret
102
 
103
; convert abs. sector number (AX) to BIOS T:H:S
104
; sector number = (abs.sector%BPB_SecPerTrk)+1
105
; pre.track number = (abs.sector/BPB_SecPerTrk)
106
; head number = pre.track number%BPB_NumHeads
107
; track number = pre.track number/BPB_NumHeads
108
; Return: cl - sector number
109
;         ch - track number
110
;         dl - drive number (0 = a:)
111
;         dh - head number
112
conv_abs_to_THS:
113
        push    bx
114
        mov     bx, word [BPB_SecPerTrk]
115
        xor     dx, dx
116
        div     bx
117
        inc     dx
118
        mov     cl, dl                          ; cl = sector number
119
        mov     bx, word [BPB_NumHeads]
120
        xor     dx, dx
121
        div     bx
122
        ; !!!!!!! ax = track number, dx = head number
123
        mov     ch, al                          ; ch=track number
124
        xchg    dh, dl                          ; dh=head number
125
        mov     dl, 0                           ; dl=0 (drive 0 (a:))
126
        pop     bx
127
        retn
128
; needed variables
129
BPB_SecPerTrk   dw      0                       ; sectors per track
130
BPB_NumHeads    dw      0                       ; number of heads
131
BPB_FATSz16     dw      0                       ; size of FAT
132
BPB_RootEntCnt  dw      0                       ; count of root dir. entries
133
BPB_BytsPerSec  dw      0                       ; bytes per sector
134
BPB_RsvdSecCnt  dw      0                       ; number of reserved sectors
135
BPB_TotSec16    dw      0                       ; count of the sectors on the volume
136
BPB_SecPerClus  db      0                       ; number of sectors per cluster
137
BPB_NumFATs     db      0                       ; number of FAT tables
138
abs_sector_adj  dw      0                       ; adjustment to make abs. sector number
139
end_of_FAT      dw      0                       ; end of FAT table
140
FirstDataSector dw      0                       ; begin of data
141
 
142
;=========================================================================
143
;
144
;                           16 BIT CODE
145
;
146
;=========================================================================
147
 
148
include 'bootvesa.inc'                 ;Include source for boot vesa
149
if defined extended_primary_loader
150
include 'parsers.inc'
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
260
        pop     ds
261
else
262
        cld
263
; \begin{diamond}[02.12.2005]
264
; if bootloader sets ax = 'KL', then ds:si points to loader block
265
        cmp     ax, 'KL'
266
        jnz     @f
267
        mov     word [cs:cfgmanager.loader_block], si
268
        mov     word [cs:cfgmanager.loader_block+2], ds
269
@@:
270
; \end{diamond}[02.12.2005]
271
 
272
; if bootloader sets cx = 'HA' and dx = 'RD', then bx contains identifier of source hard disk
273
; (see comment to bx_from_load)
274
        cmp     cx, 'HA'
275
        jnz     no_hd_load
276
        cmp     dx, 'RD'
277
        jnz     no_hd_load
278
        mov     word [cs:bx_from_load], bx              ; {SPraid}[13.03.2007]
279
no_hd_load:
280
 
281
; set up stack
282
        mov     ax, 3000h
283
        mov     ss, ax
284
        mov     sp, 0EC00h
285
; set up segment registers
286
        push    cs
287
        pop     ds
288
        push    cs
289
        pop     es
290
end if
291
 
292
; set videomode
293
        mov     ax, 3
294
        int     0x10
295
 
296
if lang eq ru
297
 ; Load & set russian VGA font (RU.INC)
298
        mov     bp, RU_FNT1             ; RU_FNT1 - First part
299
        mov     bx, 1000h               ; 768 bytes
300
        mov     cx, 30h                 ; 48 symbols
301
        mov     dx, 80h                 ; 128 - position of first symbol
302
        mov     ax, 1100h
303
        int     10h
304
 
305
        mov     bp, RU_FNT2             ; RU_FNT2 -Second part
306
        mov     bx, 1000h               ; 512 bytes
307
        mov     cx, 20h                 ; 32 symbols
308
        mov     dx, 0E0h                ; 224 - position of first symbol
309
        mov     ax, 1100h
310
        int     10h
311
 ; End set VGA russian font
312
else if lang eq et
313
        mov     bp, ET_FNT              ; ET_FNT1
314
        mov     bx, 1000h               ;
315
        mov     cx, 255                 ; 256 symbols
316
        xor     dx, dx                  ; 0 - position of first symbol
317
        mov     ax, 1100h
318
        int     10h
319
end if
320
 
321
; draw frames
322
        push    0xb800
323
        pop     es
324
        xor     di, di
325
        mov     ah, 1*16+15
326
 
327
; draw top
328
        mov     si, d80x25_top
329
        mov     cx, d80x25_top_num * 80
330
@@:
331
        lodsb
332
        stosw
333
        loop    @b
334
; draw spaces
335
        mov     si, space_msg
336
        mov     dx, 25 - d80x25_top_num - d80x25_bottom_num
337
dfl1:
338
        push    si
339
        mov     cx, 80
340
@@:
341
        lodsb
342
        stosw
343
        loop    @b
344
        pop     si
345
        dec     dx
346
        jnz     dfl1
347
; draw bottom
348
        mov     si, d80x25_bottom
349
        mov     cx, d80x25_bottom_num * 80
350
@@:
351
        lodsb
352
        stosw
353
        loop    @b
354
 
355
        mov     byte [space_msg+80], 0    ; now space_msg is null terminated
356
 
357
        _setcursor d80x25_top_num,0
358
 
359
 
360
; TEST FOR 386+
361
 
362
        mov     bx, 0x4000
363
        pushf
364
        pop     ax
365
        mov     dx, ax
366
        xor     ax, bx
367
        push    ax
368
        popf
369
        pushf
370
        pop     ax
371
        and     ax, bx
372
        and     dx, bx
373
        cmp     ax, dx
374
        jnz     cpugood
375
        mov     si, not386
376
sayerr:
377
        call    print
378
        jmp     $
379
     cpugood:
380
 
381
        push    0
382
        popf
383
        sti
384
 
385
; set up esp
386
        movzx   esp, sp
387
 
388
        push    0
389
        pop     es
3711 clevermous 390
        xor     ax, ax
391
        and     word [es:BOOT_IDE_BASE_ADDR], ax        ;0
392
        and     word [es:BOOT_IDE_BAR0_16], ax  ;0
393
        and     word [es:BOOT_IDE_BAR1_16], ax  ;0
394
        and     word [es:BOOT_IDE_BAR2_16], ax  ;0
395
        and     word [es:BOOT_IDE_BAR3_16], ax  ;0
2288 clevermous 396
; \begin{Mario79}
397
; find HDD IDE DMA PCI device
398
; check for PCI BIOS
399
        mov     ax, 0xB101
400
        int     0x1A
401
        jc      .nopci
402
        cmp     edx, 'PCI '
403
        jnz     .nopci
404
; find PCI class code
405
; class 1 = mass storage
406
; subclass 1 = IDE controller
407
; a) class 1, subclass 1, programming interface 0x80
3712 mario79 408
; This is a Parallel IDE Controller which uses IRQs 14 and 15.
2288 clevermous 409
        mov     ax, 0xB103
410
        mov     ecx, 1*10000h + 1*100h + 0x80
3702 mario79 411
        mov     [es:BOOT_IDE_PI_16], cx
2288 clevermous 412
        xor     si, si  ; device index = 0
413
        int     0x1A
3712 mario79 414
        jnc     .found_1 ; Parallel IDE Controller
3702 mario79 415
; b) class 1, subclass 1, programming interface 0x8f
2288 clevermous 416
        mov     ax, 0xB103
3702 mario79 417
        mov     ecx, 1*10000h + 1*100h + 0x8f
418
        mov     [es:BOOT_IDE_PI_16], cx
2288 clevermous 419
        xor     si, si  ; device index = 0
420
        int     0x1A
421
        jnc     .found
422
; c) class 1, subclass 1, programming interface 0x85
423
        mov     ax, 0xB103
424
        mov     ecx, 1*10000h + 1*100h + 0x85
3702 mario79 425
        mov     [es:BOOT_IDE_PI_16], cx
426
        xor     si, si  ; device index = 0
2288 clevermous 427
        int     0x1A
3702 mario79 428
        jnc     .found
429
; d) class 1, subclass 1, programming interface 0x8A
3712 mario79 430
; This is a Parallel IDE Controller which uses IRQs 14 and 15.
3702 mario79 431
        mov     ax, 0xB103
432
        mov     ecx, 1*10000h + 1*100h + 0x8A
433
        mov     [es:BOOT_IDE_PI_16], cx
434
        xor     si, si  ; device index = 0
435
        int     0x1A
3712 mario79 436
        jnc     .found_1 ; Parallel IDE Controller
3774 mario79 437
; Controller not found!
438
        xor     ax, ax
439
        mov     [es:BOOT_IDE_PI_16], ax
3711 clevermous 440
        jmp     .nopci
3774 mario79 441
;--------------------------------------
3702 mario79 442
.found_1:
443
; get memory base BAR4
2288 clevermous 444
        mov     ax, 0xB10A
445
        mov     di, 0x20        ; memory base is config register at 0x20
3711 clevermous 446
        push    cx
2288 clevermous 447
        int     0x1A
3711 clevermous 448
        jc      .no_BAR4        ;.nopci
3774 mario79 449
        and     cx, 0xFFFC      ; clear address decode type
2466 Serge 450
        mov     [es:BOOT_IDE_BASE_ADDR], cx
3702 mario79 451
.no_BAR4:
3711 clevermous 452
        pop     cx
3774 mario79 453
;--------------------------------------
3762 mario79 454
.found:
455
; get Interrupt Line
456
        mov     ax, 0xB10A
457
        mov     di, 0x3c        ; memory base is config register at 0x3c
458
        push    cx
459
        int     0x1A
460
        jc      .no_Interrupt        ;.nopci
3774 mario79 461
 
3762 mario79 462
        mov     [es:BOOT_IDE_INTERR_16], cx
463
.no_Interrupt:
464
        pop     cx
3774 mario79 465
;--------------------------------------
3702 mario79 466
; get memory base BAR0
467
        mov     ax, 0xB10A
3712 mario79 468
        mov     di, 0x10        ; memory base is config register at 0x10
3711 clevermous 469
        push    cx
3702 mario79 470
        int     0x1A
3711 clevermous 471
        jc      .no_BAR0        ;.nopci
3774 mario79 472
 
3702 mario79 473
        mov     [es:BOOT_IDE_BAR0_16], cx
474
.no_BAR0:
3711 clevermous 475
        pop     cx
3774 mario79 476
;--------------------------------------
3702 mario79 477
; get memory base BAR1
478
        mov     ax, 0xB10A
3712 mario79 479
        mov     di, 0x14        ; memory base is config register at 0x14
3711 clevermous 480
        push    cx
3702 mario79 481
        int     0x1A
3711 clevermous 482
        jc      .no_BAR1        ;.nopci
3774 mario79 483
 
3702 mario79 484
        mov     [es:BOOT_IDE_BAR1_16], cx
485
.no_BAR1:
3711 clevermous 486
        pop     cx
3774 mario79 487
;--------------------------------------
3702 mario79 488
; get memory base BAR2
489
        mov     ax, 0xB10A
3712 mario79 490
        mov     di, 0x18        ; memory base is config register at 0x18
3711 clevermous 491
        push    cx
3702 mario79 492
        int     0x1A
3711 clevermous 493
        jc      .no_BAR2        ;.nopci
3774 mario79 494
 
3702 mario79 495
        mov     [es:BOOT_IDE_BAR2_16], cx
496
.no_BAR2:
3711 clevermous 497
        pop     cx
3774 mario79 498
;--------------------------------------
3702 mario79 499
; get memory base BAR3
500
        mov     ax, 0xB10A
3712 mario79 501
        mov     di, 0x1C        ; memory base is config register at 0x1c
3711 clevermous 502
        push    cx
3702 mario79 503
        int     0x1A
3711 clevermous 504
        jc      .no_BAR3        ;.nopci
3774 mario79 505
 
3702 mario79 506
        mov     [es:BOOT_IDE_BAR3_16], cx
507
.no_BAR3:
3711 clevermous 508
        pop     cx
3774 mario79 509
;--------------------------------------
2288 clevermous 510
.nopci:
511
; \end{Mario79}
512
 
3539 clevermous 513
        mov     al, 0xf6        ; Сброс клавиатуры, разрешить сканирование
2288 clevermous 514
        out     0x60, al
515
        xor     cx, cx
516
wait_loop:       ; variant 2
517
; reading state of port of 8042 controller
518
        in      al, 64h
519
        and     al, 00000010b  ; ready flag
520
; wait until 8042 controller is ready
521
        loopnz  wait_loop
522
 
523
;;;/diamond today   5.02.2008
524
; set keyboard typematic rate & delay
525
        mov     al, 0xf3
526
        out     0x60, al
527
        xor     cx, cx
528
@@:
529
        in      al, 64h
530
        test    al, 2
531
        loopnz  @b
532
        mov     al, 0
533
        out     0x60, al
534
        xor     cx, cx
535
@@:
536
        in      al, 64h
537
        test    al, 2
538
        loopnz  @b
539
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
540
; --------------- APM ---------------------
2466 Serge 541
        and     word [es:BOOT_APM_VERSION], 0     ; ver = 0.0 (APM not found)
2288 clevermous 542
        mov     ax, 0x5300
543
        xor     bx, bx
544
        int     0x15
545
        jc      apm_end                 ; APM not found
546
        test    cx, 2
547
        jz      apm_end                 ; APM 32-bit protected-mode interface not supported
2466 Serge 548
        mov     [es:BOOT_APM_VERSION], ax         ; Save APM Version
549
        mov     [es:BOOT_APM_FLAGS], cx           ; Save APM flags
2288 clevermous 550
 
551
        ; Write APM ver ----
552
        and     ax, 0xf0f
553
        add     ax, '00'
554
        mov     si, msg_apm
555
        mov     [si + 5], ah
556
        mov     [si + 7], al
557
        _setcursor 0, 3
558
        call    printplain
559
        ; ------------------
560
 
561
        mov     ax, 0x5304              ; Disconnect interface
562
        xor     bx, bx
563
        int     0x15
564
        mov     ax, 0x5303              ; Connect 32 bit mode interface
565
        xor     bx, bx
566
        int     0x15
567
 
2466 Serge 568
        mov     [es:BOOT_APM_ENTRY], ebx
569
        mov     [es:BOOT_APM_CODE_32], ax
570
        mov     [es:BOOT_APM_CODE_16], cx
571
        mov     [es:BOOT_APM_DATA_16], dx
2288 clevermous 572
 
573
apm_end:
574
        _setcursor d80x25_top_num, 0
575
 
576
if ~ defined extended_primary_loader
577
;CHECK current of code
578
        cmp     [cfgmanager.loader_block], -1
579
        jz      noloaderblock
580
        les     bx, [cfgmanager.loader_block]
581
        cmp     byte [es:bx], 1
582
        mov     si, loader_block_error
583
        jnz     sayerr
584
        push    0
585
        pop     es
586
end if
587
 
588
noloaderblock:
589
; DISPLAY VESA INFORMATION
590
        call    print_vesa_info
591
        call    calc_vmodes_table
592
        call    check_first_parm   ;check and enable cursor_pos
593
 
594
; \begin{diamond}[30.11.2005]
595
cfgmanager:
596
; settings:
597
; a) preboot_graph = graphical mode
598
;    preboot_gprobe = probe this mode?
3777 yogev_ezra 599
; b) preboot_biosdisk  = use BIOS disks through V86 emulation? // (earlier was: preboot_dma  = use DMA access?)
600
; c) preboot_debug = duplicates kernel debug output to the screen // (earlier was: preboot_vrrm = use VRR?)
601
;    // VRR is an obsolete functionality, used only with CRT monitors: increase display frequency by reducing screen resolution
602
; d) preboot_launcher = start the first app (right now it's LAUNCHER) after kernel is loaded?
603
; e) preboot_device = from where to boot?
2288 clevermous 604
 
605
; determine default settings
606
if ~ defined extended_primary_loader
607
        mov     [.bSettingsChanged], 0
608
end if
609
 
610
;.preboot_gr_end:
611
        mov     di, preboot_device
612
; if image in memory is present and [preboot_device] is uninitialized,
613
; set it to use this preloaded image
614
        cmp     byte [di], 0
615
        jnz     .preboot_device_inited
616
if defined extended_primary_loader
617
        inc     byte [di]
618
        cmp     byte [bootdevice], 'f' ; floppy?
619
        jz      .preboot_device_inited
620
        inc     byte [di]
621
else
622
        cmp     [.loader_block], -1
623
        jz      @f
624
        les     bx, [.loader_block]
625
        test    byte [es:bx+1], 1
626
        jz      @f
627
        mov     byte [di], 3
628
        jmp     .preboot_device_inited
629
@@:
630
; otherwise, set [preboot_device] to 1 (default value - boot from floppy)
631
        mov     byte [di], 1
632
end if
633
.preboot_device_inited:
634
; following 4 lines set variables to 1 if its current value is 0
635
        cmp     byte [di+preboot_dma-preboot_device], 1
636
        adc     byte [di+preboot_dma-preboot_device], 0
3777 yogev_ezra 637
        cmp     byte [di+preboot_launcher-preboot_device], 1        ; Start LAUNCHER by default
638
        adc     byte [di+preboot_launcher-preboot_device], 0
3702 mario79 639
;        cmp     byte [di+preboot_biosdisk-preboot_device], 1
640
;        adc     byte [di+preboot_biosdisk-preboot_device], 0
2288 clevermous 641
;; default value for VRR is OFF
642
;        cmp     byte [di+preboot_vrrm-preboot_device], 0
643
;        jnz    @f
644
;        mov    byte [di+preboot_vrrm-preboot_device], 2
645
;@@:
646
; notify user
647
        _setcursor 5,2
648
 
649
        mov     si, linef
650
        call    printplain
651
        mov     si, start_msg
652
        call    print
653
        mov     si, time_msg
654
        call    print
655
; get start time
656
        call    .gettime
657
        mov     [.starttime], eax
658
        mov     word [.timer], .newtimer
659
        mov     word [.timer+2], cs
660
.printcfg:
661
 
662
        _setcursor 9,0
663
        mov     si, current_cfg_msg
664
        call    print
665
        mov     si, curvideo_msg
666
        call    print
667
 
668
        call    draw_current_vmode
669
 
670
        mov     si, usebd_msg
671
        cmp     [preboot_biosdisk], 1
672
        call    .say_on_off
673
;        mov     si, vrrm_msg
674
;        cmp     [preboot_vrrm], 1
675
;        call    .say_on_off
3777 yogev_ezra 676
        mov     si, debug_mode_msg
677
        cmp     [preboot_debug], 1
678
        call    .say_on_off
679
        mov     si, launcher_msg
680
        cmp     [preboot_launcher], 1
681
        call    .say_on_off
2288 clevermous 682
        mov     si, preboot_device_msg
683
        call    print
684
        mov     al, [preboot_device]
685
if defined extended_primary_loader
686
        and     eax, 3
687
else
688
        and     eax, 7
689
end if
690
        mov     si, [preboot_device_msgs+eax*2]
691
        call    printplain
692
.show_remarks:
693
; show remarks in gray color
694
        mov     di, ((21-num_remarks)*80 + 2)*2
695
        push    0xB800
696
        pop     es
697
        mov     cx, num_remarks
698
        mov     si, remarks
699
.write_remarks:
700
        lodsw
701
        push    si
702
        xchg    ax, si
703
        mov     ah, 1*16+7      ; background: blue (1), foreground: gray (7)
704
        push    di
705
.write_remark:
706
        lodsb
707
        test    al, al
708
        jz      @f
709
        stosw
710
        jmp     .write_remark
711
@@:
712
        pop     di
713
        pop     si
714
        add     di, 80*2
715
        loop    .write_remarks
716
.wait:
717
        _setcursor 25,0         ; out of screen
718
; set timer interrupt handler
719
        cli
720
        push    0
721
        pop     es
722
        push    dword [es:8*4]
723
        pop     dword [.oldtimer]
724
        push    dword [.timer]
725
        pop     dword [es:8*4]
726
;        mov     eax, [es:8*4]
727
;        mov     [.oldtimer], eax
728
;        mov     eax, [.timer]
729
;        mov     [es:8*4], eax
730
        sti
731
; wait for keypressed
732
        xor     ax, ax
733
        int     16h
734
        push    ax
735
; restore timer interrupt
736
;        push    0
737
;        pop     es
738
        mov     eax, [.oldtimer]
739
        mov     [es:8*4], eax
740
        mov     [.timer], eax
741
 
742
        _setcursor 7,0
743
        mov     si, space_msg
744
        call    printplain
745
; clear remarks and restore normal attributes
746
        push    es
747
        mov     di, ((21-num_remarks)*80 + 2)*2
748
        push    0xB800
749
        pop     es
750
        mov     cx, num_remarks
751
        mov     ax, ' ' + (1*16 + 15)*100h
752
@@:
753
        push    cx
754
        mov     cx, 76
755
        rep stosw
756
        pop     cx
757
        add     di, 4*2
758
        loop    @b
759
        pop     es
760
        pop     ax
761
; switch on key
762
        cmp     al, 13
763
        jz      .continue
764
        or      al, 20h
3777 yogev_ezra 765
        cmp     al, 'a'         ; select graphical mode
2288 clevermous 766
        jz      .change_a
3760 hidnplayr 767
        cmp     al, 'q'         ; Trick to make 'A' key on azerty keyboard work
768
        je      .change_a
3777 yogev_ezra 769
        cmp     al, 'b'         ; use BIOS disks? // (selecting YES will make BIOS disks visible as /bd)
2288 clevermous 770
        jz      .change_b
3777 yogev_ezra 771
        cmp     al, 'c'         ; load kernel in debug mode?  // (earlier was: use VRR?)
772
        jz      .change_c
773
        cmp     al, 'd'         ; start launcher after kernel is loaded?
774
        jz      .change_d
775
        cmp     al, 'e'         ; select boot origin
2288 clevermous 776
        jnz     .show_remarks
3777 yogev_ezra 777
; e) preboot_device = from where to boot?
778
        _setcursor 16,0
2288 clevermous 779
        mov     si, bdev
780
        call    print
781
if defined extended_primary_loader
782
        mov     bx, '12'
783
else
784
        mov     bx, '14'
785
end if
786
        call    getkey
787
        mov     [preboot_device], al
3777 yogev_ezra 788
        _setcursor 14,0
2288 clevermous 789
.d:
790
if ~ defined extended_primary_loader
791
        mov     [.bSettingsChanged], 1
792
end if
793
        call    clear_vmodes_table             ;clear vmodes_table
794
        jmp     .printcfg
795
.change_a:
796
.loops:
797
        call    draw_vmodes_table
798
        _setcursor 25,0         ; out of screen
799
        xor     ax, ax
800
        int     0x16
801
;        call    clear_table_cursor             ;clear current position of cursor
802
 
803
        mov     si, word [cursor_pos]
804
 
805
        cmp     ah, 0x48;x,0x48E0               ; up
806
        jne     .down
807
        cmp     si, modes_table
808
        jbe     .loops
809
        sub     word [cursor_pos], size_of_step
810
        jmp     .loops
811
 
812
.down:
813
        cmp     ah, 0x50;x,0x50E0               ; down
814
        jne     .pgup
815
        cmp     word[es:si+10], -1
816
        je      .loops
817
        add     word [cursor_pos], size_of_step
818
        jmp     .loops
819
 
820
.pgup:
821
        cmp     ah, 0x49                ; page up
822
        jne     .pgdn
823
        sub     si, size_of_step*long_v_table
824
        cmp     si, modes_table
825
        jae     @f
826
        mov     si, modes_table
827
@@:
828
        mov     word [cursor_pos], si
829
        mov     si, word [home_cursor]
830
        sub     si, size_of_step*long_v_table
831
        cmp     si, modes_table
832
        jae     @f
833
        mov     si, modes_table
834
@@:
835
        mov     word [home_cursor], si
836
        jmp     .loops
837
 
838
.pgdn:
839
        cmp     ah, 0x51                ; page down
840
        jne     .enter
841
        mov     ax, [end_cursor]
842
        add     si, size_of_step*long_v_table
843
        cmp     si, ax
844
        jb      @f
845
        mov     si, ax
846
        sub     si, size_of_step
847
@@:
848
        mov     word [cursor_pos], si
849
        mov     si, word [home_cursor]
850
        sub     ax, size_of_step*long_v_table
851
        add     si, size_of_step*long_v_table
852
        cmp     si, ax
853
        jb      @f
854
        mov     si, ax
855
@@:
856
        mov     word [home_cursor], si
857
        jmp     .loops
858
 
859
.enter:
860
        cmp     al, 0x0D;x,0x1C0D               ; enter
861
        jne     .loops
862
        push    word [cursor_pos]
863
        pop     bp
864
        push    word [es:bp]
865
        pop     word [x_save]
866
        push    word [es:bp+2]
867
        pop     word [y_save]
868
        push    word [es:bp+6]
869
        pop     word [number_vm]
870
        mov     word [preboot_graph], bp          ;save choose
871
 
872
        jmp     .d
873
 
3777 yogev_ezra 874
.change_b:                      ; b) preboot_biosdisk  = use BIOS disks through V86 emulation?
875
        _setcursor 16,0
876
;        mov     si, ask_dma    // (earlier was: preboot_dma  = use DMA access?)
2288 clevermous 877
;        call    print
878
;        mov     bx, '13'
879
;        call    getkey
880
;        mov     [preboot_dma], al
881
        mov     si, ask_bd
882
        call    print
883
        mov     bx, '12'
884
        call    getkey
885
        mov     [preboot_biosdisk], al
886
        _setcursor 11,0
887
        jmp     .d
3777 yogev_ezra 888
;.change_c:                     ; //  VRR is an obsolete functionality, used only with CRT monitors
889
;        _setcursor 16,0
2288 clevermous 890
;        mov     si, vrrmprint
891
;        call    print
892
;        mov     bx, '12'
893
;        call    getkey
894
;        mov     [preboot_vrrm], al
895
;        _setcursor 12,0
896
;        jmp     .d
3777 yogev_ezra 897
.change_c:                     ; c) preboot_debug = duplicates kernel debug output to the screen
898
        _setcursor 16,0
899
        mov     si, ask_debug
900
        call    print
901
        mov     bx, '12'
902
        call    getkey
903
        mov     [preboot_debug], al
904
        _setcursor 12,0
905
        jmp     .d
906
.change_d:                     ; d) preboot_launcher = start the first app (right now it's LAUNCHER) after kernel is loaded?
907
        _setcursor 16,0
908
        mov     si, ask_launcher
909
        call    print
910
        mov     bx, '12'
911
        call    getkey
912
        mov     [preboot_launcher], al
913
        _setcursor 13,0
914
        jmp     .d
2288 clevermous 915
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
916
.say_on_off:
917
        pushf
918
        call    print
919
        mov     si, on_msg
920
        popf
921
        jz      @f
922
        mov     si, off_msg
923
@@:
924
        jmp     printplain
925
; novesa and vervesa strings are not used at the moment of executing this code
926
virtual at novesa
927
.oldtimer dd ?
928
.starttime dd ?
929
if ~ defined extended_primary_loader
930
.bSettingsChanged db ?
931
end if
932
.timer dd ?
933
end virtual
934
if ~ defined extended_primary_loader
935
.loader_block dd -1
936
end if
937
.gettime:
938
        mov     ah, 0
939
        int     1Ah
940
        xchg    ax, cx
941
        shl     eax, 10h
942
        xchg    ax, dx
943
        ret
944
.newtimer:
945
        push    ds
946
        push    cs
947
        pop     ds
948
        pushf
949
        call    [.oldtimer]
950
        pushad
951
        call    .gettime
952
        sub     eax, [.starttime]
953
if defined extended_primary_loader
954
        sub     ax, [preboot_timeout]
955
else
956
        sub     ax, 18*5
957
end if
958
        jae     .timergo
959
        neg     ax
960
        add     ax, 18-1
961
        mov     bx, 18
962
        xor     dx, dx
963
        div     bx
964
if lang eq ru
3539 clevermous 965
; подождите 5 секунд, 4/3/2 секунды, 1 секунду
2288 clevermous 966
        cmp     al, 5
967
        mov     cl, ' '
968
        jae     @f
969
        cmp     al, 1
3539 clevermous 970
        mov     cl, 0xE3 ; 'у' in cp866
2288 clevermous 971
        jz      @f
3539 clevermous 972
        mov     cl, 0xEB ; 'ы' in cp866
2288 clevermous 973
@@:
974
        mov     [time_str+9], cl
975
else if lang eq et
976
        cmp     al, 1
977
        ja      @f
3539 clevermous 978
        mov     byte [time_str+9], ' '
979
        mov     byte [time_str+10], ' '
2288 clevermous 980
@@:
3274 esevece 981
else if lang eq sp
982
; esperar 5/4/3/2 segundos, 1 segundo
983
        cmp     al, 1
984
        mov     cl, 's'
985
        ja      @f
986
        mov     cl, ' '
987
@@:
988
        mov     [time_str+10], cl
2288 clevermous 989
else
990
; wait 5/4/3/2 seconds, 1 second
991
        cmp     al, 1
992
        mov     cl, 's'
993
        ja      @f
994
        mov     cl, ' '
995
@@:
996
        mov     [time_str+9], cl
997
end if
998
        add     al, '0'
999
        mov     [time_str+1], al
1000
        mov     si, time_msg
1001
        _setcursor 7,0
1002
        call    print
1003
        _setcursor 25,0
1004
        popad
1005
        pop     ds
1006
        iret
1007
.timergo:
1008
        push    0
1009
        pop     es
1010
        mov     eax, [.oldtimer]
1011
        mov     [es:8*4], eax
1012
        mov     sp, 0EC00h
1013
.continue:
1014
        sti
1015
        _setcursor 6,0
1016
        mov     si, space_msg
1017
        call    printplain
1018
        call    printplain
1019
        _setcursor 6,0
1020
        mov     si, loading_msg
1021
        call    print
3777 yogev_ezra 1022
        _setcursor 16,0
2288 clevermous 1023
if ~ defined extended_primary_loader
1024
        cmp     [.bSettingsChanged], 0
1025
        jz      .load
1026
        cmp     [.loader_block], -1
1027
        jz      .load
1028
        les     bx, [.loader_block]
1029
        mov     eax, [es:bx+3]
1030
        push    ds
1031
        pop     es
1032
        test    eax, eax
1033
        jz      .load
1034
        push    eax
1035
        mov     si, save_quest
1036
        call    print
1037
.waityn:
1038
        mov     ah, 0
1039
        int     16h
1040
        or      al, 20h
1041
        cmp     al, 'n'
1042
        jz      .loadc
3430 esevece 1043
        if lang eq sp
1044
        cmp     al, 's'
1045
        else
2288 clevermous 1046
        cmp     al, 'y'
3430 esevece 1047
        end if
2288 clevermous 1048
        jnz     .waityn
1049
        call    putchar
1050
        mov     byte [space_msg+80], 186
1051
 
1052
        pop     eax
1053
        push    cs
1054
        push    .cont
1055
        push    eax
1056
        retf                          ;call back
1057
.loadc:
1058
        pop     eax
1059
.cont:
1060
        push    cs
1061
        pop     ds
1062
        mov     si, space_msg
1063
        mov     byte [si+80], 0
3777 yogev_ezra 1064
        _setcursor 16,0
2288 clevermous 1065
        call    printplain
3777 yogev_ezra 1066
        _setcursor 16,0
2288 clevermous 1067
.load:
1068
end if
1069
; \end{diamond}[02.12.2005]
1070
 
1071
; ASK GRAPHICS MODE
1072
 
1073
        call    set_vmode
1074
 
1075
; GRAPHICS ACCELERATION
1076
; force yes
2466 Serge 1077
        mov     [es:BOOT_MTRR], byte 1
2288 clevermous 1078
 
1079
; DMA ACCESS TO HD
1080
 
1081
        mov     al, [preboot_dma]
2466 Serge 1082
        mov     [es:BOOT_DMA], al
2288 clevermous 1083
 
1084
;; VRR_M USE
1085
;
1086
;        mov     al,[preboot_vrrm]
3777 yogev_ezra 1087
;        mov     [es:BOOT_VRR], al              ;// 0x9030
2288 clevermous 1088
 
3777 yogev_ezra 1089
; Set kernel DEBUG mode - if nonzero, duplicates debug output to the screen.
1090
        mov     al, [preboot_debug]
1091
        mov     [es:BOOT_DEBUG_PRINT], al       ;// 0x901E
1092
 
1093
; Start the first app (right now it's LAUNCHER) after kernel is loaded?
1094
        mov     al, [preboot_launcher]
1095
        mov     [es:BOOT_LAUNCHER_START], al    ;// 0x901D
1096
 
2288 clevermous 1097
; BOOT DEVICE
1098
 
1099
        mov     al, [preboot_device]
1100
        dec     al
1101
        mov     [boot_dev], al
1102
 
1103
; GET MEMORY MAP
1104
include '../detect/biosmem.inc'
1105
 
1106
; READ DISKETTE TO MEMORY
1107
 
1108
        cmp     [boot_dev], 0
1109
        jne     no_sys_on_floppy
1110
        mov     si, diskload
1111
        call    print
1112
        xor     ax, ax            ; reset drive
1113
        xor     dx, dx
1114
        int     0x13
1115
; do we boot from CD-ROM?
1116
        mov     ah, 41h
1117
        mov     bx, 55AAh
1118
        xor     dx, dx
1119
        int     0x13
1120
        jc      .nocd
1121
        cmp     bx, 0AA55h
1122
        jnz     .nocd
1123
        mov     ah, 48h
1124
        push    ds
1125
        push    es
1126
        pop     ds
1127
        mov     si, 0xa000
1128
        mov     word [si], 30
1129
        int     0x13
1130
        pop     ds
1131
        jc      .nocd
1132
        push    ds
1133
        lds     si, [es:si+26]
1134
        test    byte [ds:si+10], 40h
1135
        pop     ds
1136
        jz      .nocd
1137
; yes - read all floppy by 18 sectors
1138
 
1139
; TODO: !!!! read only first sector and set variables !!!!!
1140
; ...
1141
; TODO: !!! then read flippy image track by track
1142
 
1143
        mov     cx, 0x0001      ; startcyl,startsector
1144
.a1:
1145
        push    cx dx
1146
        mov     al, 18
1147
        mov     bx, 0xa000
1148
        call    boot_read_floppy
1149
        mov     si, movedesc
1150
        push    es
1151
        push    ds
1152
        pop     es
1153
        mov     cx, 256*18
1154
        mov     ah, 0x87
1155
        int     0x15
1156
        pop     es
1157
        pop     dx cx
1158
        test    ah, ah
1159
        jnz     sayerr_floppy
1160
        add     dword [si+8*3+2], 512*18
1161
        inc     dh
1162
        cmp     dh, 2
1163
        jnz     .a1
1164
        mov     dh, 0
1165
        inc     ch
1166
        cmp     ch, 80
1167
        jae     ok_sys_on_floppy
1168
        pusha
1169
        mov     al, ch
1170
        shr     ch, 2
1171
        add     al, ch
1172
        aam
1173
        xchg    al, ah
1174
        add     ax, '00'
1175
        mov     si, pros
1176
        mov     [si], ax
1177
        call    printplain
1178
        popa
1179
        jmp     .a1
1180
.nocd:
1181
; no - read only used sectors from floppy
1182
; now load floppy image to memory
1183
; at first load boot sector and first FAT table
1184
 
1185
; read only first sector and fill variables
1186
        mov     cx, 0x0001      ; first logical sector
1187
        xor     dx, dx          ; head = 0, drive = 0 (a:)
1188
        mov     al, 1           ; read one sector
1189
        mov     bx, 0xB000      ; es:bx -> data area
1190
        call    boot_read_floppy
1191
; fill the necessary parameters to work with a floppy
1192
        mov     ax, word [es:bx+24]
1193
        mov     word [BPB_SecPerTrk], ax
1194
        mov     ax, word [es:bx+26]
1195
        mov     word [BPB_NumHeads], ax
1196
        mov     ax, word [es:bx+17]
1197
        mov     word [BPB_RootEntCnt], ax
1198
        mov     ax, word [es:bx+14]
1199
        mov     word [BPB_RsvdSecCnt], ax
1200
        mov     ax, word [es:bx+19]
1201
        mov     word [BPB_TotSec16], ax
1202
        mov     al, byte [es:bx+13]
1203
        mov     byte [BPB_SecPerClus], al
1204
        mov     al, byte [es:bx+16]
1205
        mov     byte [BPB_NumFATs], al
1206
; 18.11.2008
1207
        mov     ax, word [es:bx+22]
1208
        mov     word [BPB_FATSz16], ax
1209
        mov     cx, word [es:bx+11]
1210
        mov     word [BPB_BytsPerSec], cx
1211
 
1212
; count of clusters in FAT12 ((size_of_FAT*2)/3)
1213
;        mov     ax, word [BPB_FATSz16]
1214
;        mov     cx, word [BPB_BytsPerSec]
1215
;end  18.11.2008
1216
        xor     dx, dx
1217
        mul     cx
1218
        shl     ax, 1
1219
        mov     cx, 3
1220
        div     cx              ; now ax - number of clusters in FAT12
1221
        mov     word [end_of_FAT], ax
1222
 
1223
; load first FAT table
1224
        mov     cx, 0x0002      ; startcyl,startsector          ; TODO!!!!!
1225
        xor     dx, dx          ; starthead,drive
1226
        mov     al, byte [BPB_FATSz16]     ; no of sectors to read
1227
        add     bx, word [BPB_BytsPerSec]  ; es:bx -> data area
1228
        call    boot_read_floppy
1229
        mov     bx, 0xB000
1230
 
1231
; and copy them to extended memory
1232
        mov     si, movedesc
1233
        mov     [si+8*2+3], bh          ; from
1234
 
1235
        mov     ax, word [BPB_BytsPerSec]
1236
        shr     ax, 1                   ; words per sector
1237
        mov     cx, word [BPB_RsvdSecCnt]
1238
        add     cx, word [BPB_FATSz16]
1239
        mul     cx
1240
        push    ax                      ; save to stack count of words in boot+FAT
1241
        xchg    ax, cx
1242
 
1243
        push    es
1244
        push    ds
1245
        pop     es
1246
        mov     ah, 0x87
1247
        int     0x15
1248
        pop     es
1249
        test    ah, ah
1250
        jz      @f
1251
sayerr_floppy:
1252
        mov     dx, 0x3f2
1253
        mov     al, 0
1254
        out     dx, al
1255
sayerr_memmove:
1256
        mov     si, memmovefailed
1257
        jmp     sayerr_plain
1258
@@:
1259
        pop     ax                      ; restore from stack count of words in boot+FAT
1260
        shl     ax, 1                   ; make bytes count from count of words
1261
        and     eax, 0ffffh
1262
        add     dword [si+8*3+2], eax
1263
 
1264
; copy first FAT to second copy
1265
; TODO: BPB_NumFATs !!!!!
1266
        add     bx, word [BPB_BytsPerSec]       ; !!! TODO: may be need multiply by BPB_RsvdSecCnt !!!
1267
        mov     byte [si+8*2+3], bh     ; bx - begin of FAT
1268
 
1269
        mov     ax, word [BPB_BytsPerSec]
1270
        shr     ax, 1                   ; words per sector
1271
        mov     cx, word [BPB_FATSz16]
1272
        mul     cx
1273
        mov     cx, ax                  ; cx - count of words in FAT
1274
 
1275
        push    es
1276
        push    ds
1277
        pop     es
1278
        mov     ah, 0x87
1279
        int     0x15
1280
        pop     es
1281
        test    ah, ah
1282
        jnz     sayerr_floppy
1283
 
1284
        mov     ax, cx
1285
        shl     ax, 1
1286
        and     eax, 0ffffh             ; ax - count of bytes in FAT
1287
        add     dword [si+8*3+2], eax
1288
 
1289
; reading RootDir
1290
; TODO: BPB_NumFATs
1291
        add     bx, ax
1292
        add     bx, 100h
1293
        and     bx, 0ff00h                      ; bx - place in buffer to write RootDir
1294
        push    bx
1295
 
1296
        mov     bx, word [BPB_BytsPerSec]
1297
        shr     bx, 5                           ; divide bx by 32
1298
        mov     ax, word [BPB_RootEntCnt]
1299
        xor     dx, dx
1300
        div     bx
1301
        push    ax                              ; ax - count of RootDir sectors
1302
 
1303
        mov     ax, word [BPB_FATSz16]
1304
        xor     cx, cx
1305
        mov     cl, byte [BPB_NumFATs]
1306
        mul     cx
1307
        add     ax, word [BPB_RsvdSecCnt]       ; ax - first sector of RootDir
1308
 
1309
        mov     word [FirstDataSector], ax
1310
        pop     bx
1311
        push    bx
1312
        add     word [FirstDataSector], bx      ; Begin of data region of floppy
1313
 
1314
; read RootDir
1315
        call    conv_abs_to_THS
1316
        pop     ax
1317
        pop     bx                              ; place in buffer to write
1318
        push    ax
1319
        call    boot_read_floppy                ; read RootDir into buffer
1320
; copy RootDir
1321
        mov     byte [si+8*2+3], bh             ; from buffer
1322
        pop     ax                              ; ax = count of RootDir sectors
1323
        mov     cx, word [BPB_BytsPerSec]
1324
        mul     cx
1325
        shr     ax, 1
1326
        mov     cx, ax                          ; count of words to copy
1327
        push    es
1328
        push    ds
1329
        pop     es
1330
        mov     ah, 0x87
1331
        int     0x15
1332
        pop     es
1333
 
1334
        mov     ax, cx
1335
        shl     ax, 1
1336
        and     eax, 0ffffh             ; ax - count of bytes in RootDir
1337
        add     dword [si+8*3+2], eax   ; add count of bytes copied
1338
 
1339
; Reading data clusters from floppy
1340
        mov     byte [si+8*2+3], bh
1341
        push    bx
1342
 
1343
        mov     di, 2                   ; First data cluster
1344
.read_loop:
1345
        mov     bx, di
1346
        shr     bx, 1                   ; bx+di = di*1.5
1347
        jnc     .even
1348
        test    word [es:bx+di+0xB200], 0xFFF0  ; TODO: may not be 0xB200 !!!
1349
        jmp     @f
1350
.even:
1351
        test    word [es:bx+di+0xB200], 0xFFF   ; TODO: may not be 0xB200 !!!
1352
 
1353
@@:
1354
        jz      .skip
1355
; read cluster di
1356
;.read:
1357
        ;conv cluster di to abs. sector ax
1358
        ; ax = (N-2) * BPB_SecPerClus + FirstDataSector
1359
        mov     ax, di
1360
        sub     ax, 2
1361
        xor     bx, bx
1362
        mov     bl, byte [BPB_SecPerClus]
1363
        mul     bx
1364
        add     ax, word [FirstDataSector]
1365
        call    conv_abs_to_THS
1366
        pop     bx
1367
        push    bx
1368
        mov     al, byte [BPB_SecPerClus]       ; number of sectors in cluster
1369
        call    boot_read_floppy
1370
        push    es
1371
        push    ds
1372
        pop     es
1373
        pusha
1374
;
1375
        mov     ax, word [BPB_BytsPerSec]
1376
        xor     cx, cx
1377
        mov     cl, byte [BPB_SecPerClus]
1378
        mul     cx
1379
        shr     ax, 1                           ; ax = (BPB_BytsPerSec * BPB_SecPerClus)/2
1380
        mov     cx, ax                          ; number of words to copy (count words in cluster)
1381
;
1382
        mov     ah, 0x87
1383
        int     0x15                            ; copy data
1384
        test    ah, ah
1385
        popa
1386
        pop     es
1387
        jnz     sayerr_floppy
1388
; skip cluster di
1389
.skip:
1390
        mov     ax, word [BPB_BytsPerSec]
1391
        xor     cx, cx
1392
        mov     cl, byte [BPB_SecPerClus]
1393
        mul     cx
1394
        and     eax, 0ffffh             ; ax - count of bytes in cluster
1395
        add     dword [si+8*3+2], eax
1396
 
1397
        mov     ax, word [end_of_FAT]   ; max cluster number
1398
        pusha
1399
; draw percentage
1400
; total clusters: ax
1401
; read clusters: di
1402
        xchg    ax, di
1403
        mov     cx, 100
1404
        mul     cx
1405
        div     di
1406
        aam
1407
        xchg    al, ah
1408
        add     ax, '00'
1409
        mov     si, pros
1410
        cmp     [si], ax
1411
        jz      @f
1412
        mov     [si], ax
1413
        call    printplain
1414
@@:
1415
        popa
1416
        inc     di
1417
        cmp     di, word [end_of_FAT]   ; max number of cluster
1418
        jnz     .read_loop
1419
        pop     bx                      ; clear stack
1420
 
1421
ok_sys_on_floppy:
1422
        mov     si, backspace2
1423
        call    printplain
1424
        mov     si, okt
1425
        call    printplain
1426
no_sys_on_floppy:
1427
        xor     ax, ax          ; reset drive
1428
        xor     dx, dx
1429
        int     0x13
1430
        mov     dx, 0x3f2       ; floppy motor off
1431
        mov     al, 0
1432
        out     dx, al
1433
 
1434
if defined extended_primary_loader
1435
        cmp     [boot_dev], 1
1436
        jne     no_sys_from_primary
1437
; load kolibri.img using callback from primary loader
1438
        and     word [movedesc + 24 + 2], 0
1439
        mov     byte [movedesc + 24 + 4], 10h
1440
; read in blocks of 64K until file is fully loaded
1441
        mov     ax, 1
1442
.repeat:
1443
        mov     di, image_file_struct
1444
        call    [bootcallback]
1445
        push    cs
1446
        pop     ds
1447
        push    cs
1448
        pop     es
1449
        cmp     bx, 1
1450
        ja      sayerr_badsect
1451
        push    bx
1452
        mov     si, movedesc
1453
        and     word [si + 16 + 2], 0
1454
        mov     byte [si + 16 + 4], 4
1455
        mov     ah, 87h
1456
        mov     cx, 8000h
1457
        int     15h
1458
        pop     bx
1459
        test    ah, ah
1460
        jnz     sayerr_memmove
1461
        inc     byte [si + 24 + 4]
1462
        test    bx, bx
1463
        jz      no_sys_from_primary
1464
        mov     ax, 2
1465
        jmp     .repeat
1466
no_sys_from_primary:
1467
end if
1468
 
1469
; SET GRAPHICS
1470
 
1471
        xor     ax, ax
1472
        mov     es, ax
1473
 
2466 Serge 1474
        mov     ax, [es:BOOT_VESA_MODE]         ; vga & 320x200
2288 clevermous 1475
        mov     bx, ax
1476
        cmp     ax, 0x13
1477
        je      setgr
1478
        cmp     ax, 0x12
1479
        je      setgr
1480
        mov     ax, 0x4f02              ; Vesa
1481
setgr:
1482
        int     0x10
1483
        test    ah, ah
1484
        mov     si, fatalsel
1485
        jnz     v_mode_error
1486
; set mode 0x12 graphics registers:
1487
        cmp     bx, 0x12
1488
        jne     gmok2
1489
 
1490
        mov     al, 0x05
1491
        mov     dx, 0x03ce
1492
        push    dx
1493
        out     dx, al      ; select GDC mode register
1494
        mov     al, 0x02
1495
        inc     dx
1496
        out     dx, al      ; set write mode 2
1497
 
1498
        mov     al, 0x02
1499
        mov     dx, 0x03c4
1500
        out     dx, al      ; select VGA sequencer map mask register
1501
        mov     al, 0x0f
1502
        inc     dx
1503
        out     dx, al      ; set mask for all planes 0-3
1504
 
1505
        mov     al, 0x08
1506
        pop     dx
1507
        out     dx, al      ; select GDC bit mask register
1508
                           ; for writes to 0x03cf
1509
gmok2:
1510
        push    ds
1511
        pop     es