Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1 ha 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                        ;;
3
;;  BOOTCODE.INC                                          ;;
4
;;                                                        ;;
29 halyavin 5
;;  KolibriOS 16-bit loader,                              ;;
6
;;                        based on bootcode for MenuetOS  ;;
1 ha 7
;;                                                        ;;
8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
 
10
 
11
 
12
;==========================================================================
13
;
14
;                           16 BIT FUNCTIONS
15
;
16
;==========================================================================
17
 
29 halyavin 18
putchar:
19
; in: al=character
76 mario79 20
    mov    ah, 0Eh
21
    mov    bh, 0
22
    int    10h
23
    ret
1 ha 24
 
29 halyavin 25
print:
26
; in: si->string
76 mario79 27
    mov    al, 186
28
    call    putchar
29
    mov    al, ' '
30
    call    putchar
1 ha 31
 
29 halyavin 32
printplain:
33
; in: si->string
76 mario79 34
    pusha
35
    lodsb
29 halyavin 36
@@:
76 mario79 37
    call    putchar
38
    lodsb
39
    cmp    al, 0
40
    jnz    @b
41
    popa
42
    ret
1 ha 43
 
29 halyavin 44
; Now int 16 is used for keyboard support.
45
; This is shorter, simpler and more reliable.
46
if 0
1 ha 47
getkey:      push  ecx
48
             push  edx
49
             add   ebx,0x0101
50
             xor   eax,eax
51
 
52
           gk1:
53
             in    al,0x60
54
             mov   cl,al
55
           gk0:
56
             in    al,0x60
57
             cmp   al,cl
58
             je    gk0
59
             cmp   ax,11
60
             jg    gk0
61
             gk0_1:
62
             mov   cl,al
63
 
64
;             add   al,47
65
;             mov   [ds:keyinbs-0x10000],al
66
;             mov   si,keyinbs-0x10000
67
;             call  printplain
68
 
69
           gk12:
70
             in    al,0x60
71
             cmp   al,cl
72
             je    gk12
73
             cmp   ax,240
74
             jne   gk13
75
             mov   al,cl
76
             jmp   gk14
77
           gk13:
78
             add   cl,128
79
             cmp   al,cl
80
             jne   gk1
81
             sub   al,128
82
           gk14:
83
 
84
             movzx edx,bl
85
             cmp   eax,edx
86
             jb    gk1
87
             movzx edx,bh
88
             cmp   eax,edx
89
             jg    gk1
90
             test  ebx,0x010000
91
             jnz   gk3
92
             mov   cx,0x1000
93
             mov   dx,cx
94
             add   eax,47
95
             mov   cx,ax
96
             cmp   cx,58
97
             jb    gk_nozero
98
             sub   cx,10
99
           gk_nozero:
100
             mov   [ds:keyin-0x10000],cl
101
             mov   si,keyin-0x10000
102
             call  printplain
103
           gk3:
104
             sub   eax,48
105
             pop   edx
106
             pop   ecx
107
             ret
29 halyavin 108
end if
1 ha 109
 
29 halyavin 110
getkey:
111
; get number in range [bl,bh] (bl,bh in ['0'..'9'])
112
; in: bx=range
113
; out: ax=digit (1..9, 10 for 0)
76 mario79 114
    mov    ah, 0
115
    int    16h
116
    cmp    al, bl
117
    jb    getkey
118
    cmp    al, bh
119
    ja    getkey
120
    push    ax
121
    call    putchar
122
    pop    ax
123
    and    ax, 0Fh
124
    jnz    @f
125
    mov    al, 10
29 halyavin 126
@@:
76 mario79 127
    ret
1 ha 128
 
29 halyavin 129
setcursor:
130
; in: dl=column, dh=row
76 mario79 131
    mov    ah, 2
132
    mov    bh, 0
133
    int    10h
134
    ret
29 halyavin 135
 
136
macro _setcursor row,column
137
{
76 mario79 138
    mov    dx, row*256 + column
139
    call    setcursor
29 halyavin 140
}
141
 
40 halyavin 142
pagetable_set:
103 halyavin 143
;eax - physical address
144
;es:di - page table
145
;ecx - number of pages to map
76 mario79 146
    or    al, 7
40 halyavin 147
@@:
76 mario79 148
    stosd
149
    add    eax, 1000h
150
    loop    @b
151
    ret
40 halyavin 152
 
134 diamond 153
boot_read_floppy:
154
        push    si
155
        xor     si, si
156
        mov     ah, 2   ; read
157
@@:
158
        push    ax
159
        int     0x13
160
        pop     ax
161
        jnc     @f
162
        inc     si
163
        cmp     si, 10
164
        jb      @b
165
        mov     si, badsect-0x10000
166
sayerr_plain:
167
        call    printplain
168
        jmp     $
169
@@:
170
        pop     si
171
        ret
172
 
29 halyavin 173
; 16-bit data
174
; videomodes table
82 halyavin 175
		org $+0x10000
29 halyavin 176
gr_table:
76 mario79 177
    dw      0x112+0100000000000000b ,  640 ,  480        ; 1
178
    dw      0x115+0100000000000000b ,  800 ,  600        ; 2
179
    dw      0x118+0100000000000000b , 1024 ,  768        ; 3
180
    dw      0x11B+0100000000000000b , 1280 , 1024        ; 4
181
    dw      0x112 ,  640 , 480                ; 5
182
    dw      0x115 ,  800 , 600                ; 6
183
    dw      0x118 , 1024 , 768                ; 7
184
    dw      0x11B , 1280 ,1024                ; 8
89 diamond 185
    dw    0x13, 640, 480                    ; 9
76 mario79 186
    dw    0x12, 640, 480                    ; 0
29 halyavin 187
 
188
; table for move to extended memory (int 15h, ah=87h)
189
       movedesc:
190
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
191
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
192
 
193
        db      0xff,0xff,0x0,0xa0,0x00,0x93,0x0,0x0
194
        db      0xff,0xff,0x0,0x00,0x10,0x93,0x0,0x0
195
 
196
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
197
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
198
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
199
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
82 halyavin 200
        	org $-0x10000
29 halyavin 201
 
1 ha 202
;=========================================================================
203
;
204
;                           16 BIT CODE
205
;
206
;=========================================================================
207
 
208
 
209
start_of_code:
76 mario79 210
    cld
29 halyavin 211
; \begin{diamond}[02.12.2005]
76 mario79 212
    cmp    ax, 'KL'
213
    jnz    @f
214
    mov    word [cs:cfgmanager.loader_block-0x10000], si
215
    mov    word [cs:cfgmanager.loader_block+2-0x10000], ds
29 halyavin 216
@@:
217
; \end{diamond}[02.12.2005]
1 ha 218
 
29 halyavin 219
; set up stack
76 mario79 220
    mov    ax, 3000h
221
    mov    ss, ax
222
    mov    sp, 0EC00h
29 halyavin 223
; set up segment registers
76 mario79 224
    push    cs
225
    pop    ds
226
    push    cs
227
    pop    es
1 ha 228
 
29 halyavin 229
; set videomode
76 mario79 230
    mov    ax, 3
1 ha 231
        int  0x10
232
 
134 diamond 233
if lang eq ru
1 ha 234
 ; Load & set russian VGA font (RU.INC)
235
        mov  bp,RU_FNT1-10000h   ; RU_FNT1 - First part
236
          mov  bx,1000h            ; 768 bytes
237
          mov  cx,30h              ; 48 symbols
238
          mov  dx,80h              ; 128 - position of first symbol
239
        mov  ax,1100h
240
          int  10h
241
 
242
        mov  bp,RU_FNT2-10000h   ; RU_FNT2 -Second part
243
        mov  bx,1000h            ; 512 bytes
244
        mov  cx,20h              ; 32 symbols
245
        mov  dx,0E0h             ; 224 - position of first symbol
246
        mov  ax,1100h
247
          int  10h
248
 ; End set VGA russian font
134 diamond 249
end if
1 ha 250
 
29 halyavin 251
; draw frames
76 mario79 252
    push    0xb800
253
    pop    es
254
    xor    di, di
29 halyavin 255
;        mov  si,d80x25-0x10000
256
;        mov  cx,80*25
257
;        mov  ah,1*16+15
258
;       dfl1:
259
;        lodsb
260
;        stosw
261
;        loop dfl1
76 mario79 262
    mov    ah, 1*16+15
29 halyavin 263
; draw top
76 mario79 264
    mov    si, d80x25_top - 0x10000
265
    mov    cx, d80x25_top_num * 80
29 halyavin 266
@@:
76 mario79 267
    lodsb
268
    stosw
269
    loop    @b
29 halyavin 270
; draw spaces
76 mario79 271
    mov    si, space_msg - 0x10000
272
    mov    cx, 25 - d80x25_top_num - d80x25_bottom_num
29 halyavin 273
dfl1:
76 mario79 274
    push    cx
275
    push    si
276
    mov    cx, 80
29 halyavin 277
@@:
76 mario79 278
    lodsb
279
    stosw
280
    loop    @b
281
    pop    si
282
    pop    cx
283
    loop    dfl1
29 halyavin 284
; draw bottom
76 mario79 285
    mov    si, d80x25_bottom - 0x10000
286
    mov    cx, d80x25_bottom_num * 80
29 halyavin 287
@@:
76 mario79 288
    lodsb
289
    stosw
290
    loop    @b
1 ha 291
 
76 mario79 292
    mov    byte [space_msg-0x10000+80], 0    ; now space_msg is null terminated
1 ha 293
 
76 mario79 294
    _setcursor d80x25_top_num,0
1 ha 295
 
296
 
297
; TEST FOR 386+
298
 
76 mario79 299
    mov    bx, 0x4000
1 ha 300
        pushf
301
        pop     ax
302
        mov     dx,ax
29 halyavin 303
        xor     ax,bx
1 ha 304
        push    ax
305
        popf
306
        pushf
307
        pop     ax
29 halyavin 308
        and     ax,bx
309
        and     dx,bx
1 ha 310
        cmp     ax,dx
311
        jnz     cpugood
312
        mov     si,not386-0x10000
40 halyavin 313
sayerr:
1 ha 314
        call    print
315
        jmp     $
316
     cpugood:
317
 
29 halyavin 318
; set up esp
76 mario79 319
    movzx    esp, sp
1 ha 320
 
321
; FLUSH 8042 KEYBOARD CONTROLLER
322
 
323
;// mike.dld [
324
 ;       mov     al,0xED
325
 ;       out     0x60,al
326
 ;       or      cx,-1
327
 ;     @@:
328
 ;       in      al,0x64
329
 ;       test    al,2
330
 ;       jz      @f
331
 ;       loop    @b
332
 ;     @@:
333
 ;       mov     al,0
334
 ;       out     0x60,al
335
 ;       or      cx,-1
336
 ;     @@:
337
 ;       in      al,0x64
338
 ;       test    al,2
339
 ;       jz      @f
340
 ;       loop    @b
341
 ;     @@:
342
;// mike.dld ]
343
 
344
;       mov     ecx,10000
345
;      fl1:
346
;       in      al,0x64
347
;       loop    fl1
348
;       test    al,1
349
;       jz      fl2
350
;       in      al,0x60
351
;       jmp     fl1
352
;      fl2:
353
 
354
;****************************************************************
355
; The function is modified Mario79
356
;*****************************************************************
357
; wait_kbd:        ; variant 1
358
;       mov      cx,2500h  ;çàäåðæêà ïîðÿäêà 10 ìñåê
359
; test_kbd:
360
;       in       al,64h    ;÷èòàåì ñîñòîÿíèå êëàâèàòóðû
361
;       test     al,2      ;ïðîâåðêà áèòà ãîòîâíîñòè
362
;       loopnz   test_kbd
363
 
160 diamond 364
        push    0
365
        pop     es
366
        and     word [es:0x9031], 0
164 serge 367
; \begin{Mario79}
368
; find HDD IDE DMA PCI device
160 diamond 369
; check for PCI BIOS
370
        mov     ax, 0xB101
371
        int     0x1A
372
        jc      .nopci
373
        cmp     edx, 'PCI '
374
        jnz     .nopci
375
; find PCI class code
376
; class 1 = mass storage
377
; subclass 1 = IDE controller
378
; a) class 1, subclass 1, programming interface 0x80
379
        mov     ax, 0xB103
380
        mov     ecx, 1*10000h + 1*100h + 0x80
381
        mov     si, 0   ; device index = 0
382
        int     0x1A
383
        jnc     .found
384
; b) class 1, subclass 1, programming interface 0x85
385
        mov     ax, 0xB103
386
        mov     ecx, 1*10000h + 1*100h + 0x85
387
        mov     si, 0   ; device index = 0
388
        int     0x1A
389
        jnc     .found
390
; c) class 1, subclass 1, programming interface 0x8A
391
        mov     ax, 0xB103
392
        mov     ecx, 1*10000h + 1*100h + 0x8A
393
        mov     si, 0
394
        int     0x1A
395
        jc      .nopci
396
.found:
397
; get memory base
398
        mov     ax, 0xB10A
399
        mov     di, 0x20        ; memory base is config register at 0x20
400
        int     0x1A
401
        jc      .nopci
402
        and     cx, 0xFFF0      ; clear address decode type
403
        mov     [es:0x9031], cx
404
.nopci:
164 serge 405
; \end{Mario79}
160 diamond 406
 
1 ha 407
    mov   al,0xf6         ; Ñáðîñ êëàâèàòóðû, ðàçðåøèòü ñêàíèðîâàíèå
408
    out   0x60,al
29 halyavin 409
    xor   cx,cx
1 ha 410
wait_loop:       ; variant 2
411
; reading state of port of 8042 controller
164 serge 412
        in      al,64h
1 ha 413
        and     al,00000010b  ; ready flag
164 serge 414
; wait until 8042 controller is ready
1 ha 415
        loopnz  wait_loop
416
 
76 mario79 417
; --------------- APM ---------------------
418
    push    0
419
    pop    es
420
    mov    word [es : 0x9044], 0        ; ver = 0.0 (APM not found)
421
    mov    ax, 0x5300
422
    xor    bx, bx
423
    int    0x15
424
    jc    apm_end                ; APM not found
425
    test    cx, 2
426
    jz    apm_end                ; APM 32-bit protected-mode interface not supported
427
    mov    [es : 0x9044], ax        ; Save APM Version
428
    mov    [es : 0x9046], cx        ; Save APM flags
164 serge 429
 
76 mario79 430
    ; Write APM ver ----
82 halyavin 431
    and    ax, 0xf0f
76 mario79 432
    add    ax, '00'
82 halyavin 433
    mov    si, msg_apm - 0x10000
434
    mov    [si + 5], ah
435
    mov    [si + 7], al
76 mario79 436
    _setcursor 0, 3
437
    call    printplain
438
    _setcursor d80x25_top_num,0
439
    ; ------------------
164 serge 440
 
76 mario79 441
    mov    ax, 0x5304            ; Disconnect interface
442
    xor    bx, bx
443
    int    0x15
444
    mov    ax, 0x5303            ; Connect 32 bit mode interface
445
    xor    bx, bx
446
    int    0x15
447
    ; init selectors
448
    movzx    eax, ax ; real-mode segment base address of protected-mode 32-bit code segment
449
    shl    eax, 4
450
    mov    [apm_code_32 - 0x10000 + 2], ax
451
    shr    eax, 16
452
    mov    [apm_code_32 - 0x10000 + 4], al
453
    movzx    ecx, cx ; real-mode segment base address of protected-mode 16-bit code segment
454
    shl    ecx, 4
455
    mov    [apm_code_16 - 0x10000 + 2], cx
456
    shr    ecx, 16
457
    mov    [apm_code_16 - 0x10000 + 4], cl
458
    movzx    edx, dx ; real-mode segment base address of protected-mode 16-bit data segment
459
    shl    edx, 4
460
    mov    [apm_data_16 - 0x10000 + 2], dx
461
    shr    edx, 16
462
    mov    [apm_data_16 - 0x10000 + 4], dl
463
    mov    [es : 0x9040], ebx              ; offset of APM entry point
464
apm_end:
164 serge 465
; -----------------------------------------
76 mario79 466
 
1 ha 467
; DISPLAY VESA INFORMATION
468
 
76 mario79 469
    push    0
470
    pop    es
1 ha 471
        mov     ax,0x4f00
472
        mov     di,0xa000
473
        int     0x10
474
        cmp     ax,0x004f
76 mario79 475
        mov    si, novesa-0x10000
476
        jnz    @f
164 serge 477
        mov bx, word [es:di+0x12]
478
        shl ebx,16
479
        mov [es:0x9050], ebx
1 ha 480
        mov     ax,[es:di+4]
481
        add     ax,'0'*256+'0'
76 mario79 482
        mov    si,vervesa-0x10000
40 halyavin 483
        mov     [si+vervesa_off], ah
484
        mov     [si+vervesa_off+2], al
29 halyavin 485
@@:     call    print
1 ha 486
 
29 halyavin 487
; \begin{diamond}[30.11.2005]
488
cfgmanager:
489
; settings:
490
; a) preboot_graph = graphical mode
491
;    preboot_gprobe = probe this mode?
492
; b) preboot_mtrr = use hardware acceleration?
493
; c) preboot_vrrm = use VRR?
494
; d) preboot_device = from what boot?
76 mario79 495
    mov    di, preboot_graph-0x10000
29 halyavin 496
; check bootloader block
143 diamond 497
    cmp    [.loader_block-0x10000], -1
164 serge 498
    jz    .noloaderblock
76 mario79 499
    les    bx, [.loader_block-0x10000]
500
    cmp    byte [es:bx], 1
501
    mov    si, loader_block_error-0x10000
502
    jnz    sayerr
503
    test    byte [es:bx+1], 1
504
    jz    @f
29 halyavin 505
; image in memory present
76 mario79 506
    cmp    [di+preboot_device-preboot_graph], 0
507
    jnz    @f
508
    mov    [di+preboot_device-preboot_graph], 3
29 halyavin 509
@@:
510
.noloaderblock:
511
; determine default settings
76 mario79 512
    mov    [.bSettingsChanged-0x10000], 0
513
    cmp    byte [di], 0
514
    jnz    .preboot_gr_end
515
    mov    [di+preboot_gprobe-preboot_graph], 0
516
    mov    al, [vervesa+vervesa_off-0x10000]
517
    cmp    al, 'x'
518
    jz    .novesa
519
    cmp    al, '1'
520
    jz    .vesa12
521
    mov    [di+preboot_gprobe-preboot_graph], 2
522
    mov    al, 3
523
    jmp    @f
29 halyavin 524
.vesa12:
76 mario79 525
    mov    al, 7
526
    jmp    @f
29 halyavin 527
.novesa:
76 mario79 528
    mov    al, 10
29 halyavin 529
@@:
76 mario79 530
    mov    [di], al
29 halyavin 531
.preboot_gr_end:
76 mario79 532
    cmp    [di+preboot_mtrr-preboot_graph], 1
533
    adc    [di+preboot_mtrr-preboot_graph], 0
534
    cmp    [di+preboot_vrrm-preboot_graph], 1
535
    adc    [di+preboot_vrrm-preboot_graph], 0
536
    cmp    [di+preboot_device-preboot_graph], 1
537
    adc    [di+preboot_device-preboot_graph], 0
29 halyavin 538
; notify user
76 mario79 539
    mov    si, linef-0x10000
540
    call    print
541
    mov    si, start_msg-0x10000
542
    call    print
543
    mov    si, time_msg-0x10000
544
    call    print
29 halyavin 545
; get start time
76 mario79 546
    call    .gettime
547
    mov    [.starttime-0x10000], eax
82 halyavin 548
    mov    word [.timer-0x10000], .newtimer
76 mario79 549
    mov    word [.timer-0x10000+2], cs
29 halyavin 550
.printcfg:
76 mario79 551
    _setcursor 9,0
552
    mov    si, current_cfg_msg-0x10000
553
    call    print
554
    mov    si, curvideo_msg-0x10000
555
    call    print
556
    mov    al, [preboot_graph-0x10000]
557
    cmp    al, 8
558
    ja    .pnovesa
559
    mov    dl, al
560
    and    eax, 3
561
    mov    si, [modes_msg-0x10000+eax*2]
562
    call    printplain
563
    mov    si, modevesa20-0x10000
564
    cmp    dl, 4
565
    jbe    @f
566
    mov    si, modevesa12-0x10000
29 halyavin 567
@@:
76 mario79 568
    call    printplain
569
    cmp    dl, 4
570
    ja    .x
571
    mov    si, probeno_msg-0x10000
572
    cmp    [preboot_gprobe-0x10000], 2
573
    jnz    @f
574
    mov    si, probeok_msg-0x10000
29 halyavin 575
@@:
76 mario79 576
    call    printplain
29 halyavin 577
.x:
76 mario79 578
    jmp    .c
29 halyavin 579
.pnovesa:
76 mario79 580
    cmp    al, 9
581
    mov    si, mode9-0x10000
582
    jz    @b
583
    mov    si, mode10-0x10000
584
    jmp    @b
29 halyavin 585
.c:
76 mario79 586
    mov    si, linef-0x10000
587
    call    printplain
588
    mov    si, mtrr_msg-0x10000
589
    cmp    [preboot_mtrr-0x10000], 1
590
    call    .say_on_off
591
    mov    si, vrrm_msg-0x10000
592
    cmp    [preboot_vrrm-0x10000], 1
593
    call    .say_on_off
594
    mov    si, preboot_device_msg-0x10000
595
    call    print
596
    mov    al, [preboot_device-0x10000]
597
    and    eax, 3
598
    mov    si, [preboot_device_msgs-0x10000+eax*2]
599
    call    printplain
29 halyavin 600
.wait:
76 mario79 601
    _setcursor 25,0        ; out of screen
34 halyavin 602
; set timer interrupt handler
76 mario79 603
    cli
604
    push    0
605
    pop    es
606
    mov    eax, [es:8*4]
607
    mov    [.oldtimer-0x10000], eax
608
    mov    eax, [.timer-0x10000]
609
    mov    [es:8*4], eax
610
    sti
29 halyavin 611
; wait for keypressed
76 mario79 612
    mov    ah, 0
613
    int    16h
614
    push    ax
29 halyavin 615
; restore timer interrupt
76 mario79 616
    push    0
617
    pop    es
618
    mov    eax, [.oldtimer-0x10000]
619
    mov    [es:8*4], eax
620
    mov    [.timer-0x10000], eax
621
    _setcursor 7,0
622
    mov    si, space_msg-0x10000
623
    call    printplain
624
    pop    ax
29 halyavin 625
; switch on key
76 mario79 626
    cmp    al, 13
627
    jz    .continue
628
    or    al, 20h
629
    cmp    al, 'a'
630
    jz    .change_a
631
    cmp    al, 'b'
632
    jz    .change_b
633
    cmp    al, 'c'
634
    jz    .change_c
635
    cmp    al, 'd'
636
    jnz    .wait
637
    _setcursor 15,0
638
    mov     si,bdev-0x10000
639
    call    print
640
    mov     bx,'13'
641
    call    getkey
642
    mov    [preboot_device-0x10000], al
643
    _setcursor 13,0
29 halyavin 644
.d:
76 mario79 645
    mov    [.bSettingsChanged-0x10000], 1
646
    mov    si, space_msg-0x10000
647
    call    printplain
648
    _setcursor 15,0
649
    mov    cx, 6
29 halyavin 650
@@:
76 mario79 651
    call    printplain
652
    loop    @b
653
    jmp    .printcfg
29 halyavin 654
.change_a:
76 mario79 655
    _setcursor 15,0
656
    mov    si, gr_mode-0x10000
657
    call    printplain
658
    mov     bx, '09'
659
    call    getkey
660
    mov    [preboot_graph-0x10000], al
661
    cmp    al, 4
662
    ja    @f
663
    mov    si, probetext-0x10000
664
    call    printplain
665
    mov    bx, '12'
666
    call    getkey
667
    mov    [preboot_gprobe-0x10000], al
29 halyavin 668
@@:
76 mario79 669
    _setcursor 10,0
670
    jmp    .d
29 halyavin 671
.change_b:
76 mario79 672
    _setcursor 15,0
673
    mov    si, gr_acc-0x10000
674
    call    print
675
    mov    bx, '12'
676
    call    getkey
677
    mov    [preboot_mtrr-0x10000], al
678
    _setcursor 11,0
679
    jmp    .d
29 halyavin 680
.change_c:
76 mario79 681
    _setcursor 15,0
682
    mov    si, vrrmprint-0x10000
683
    call    print
684
    mov    bx, '12'
685
    call    getkey
686
    mov    [preboot_vrrm-0x10000], al
687
    _setcursor 12,0
688
    jmp    .d
40 halyavin 689
.say_on_off:
76 mario79 690
    pushf
691
    call    print
692
    mov    si, on_msg-0x10000
693
    popf
694
    jz    @f
695
    mov    si, off_msg-0x10000
696
@@:    call    printplain
697
    ret
40 halyavin 698
; novesa and vervesa strings are not used at the moment of executing this code
699
virtual at novesa
29 halyavin 700
.oldtimer dd ?
701
.starttime dd ?
702
.bSettingsChanged db ?
34 halyavin 703
.timer dd ?
40 halyavin 704
end virtual
82 halyavin 705
	org $+0x10000
143 diamond 706
.loader_block dd -1
82 halyavin 707
	org $-0x10000
29 halyavin 708
.gettime:
76 mario79 709
    mov    ah, 0
710
    int    1Ah
711
    xchg    ax, cx
712
    shl    eax, 10h
713
    xchg    ax, dx
714
    ret
29 halyavin 715
.newtimer:
76 mario79 716
    push    ds
717
    push    cs
718
    pop    ds
719
    pushf
720
    call    [.oldtimer-0x10000]
721
    pushad
722
    call    .gettime
723
    sub    eax, [.starttime-0x10000]
724
    sub    ax, 18*5
725
    jae    .timergo
726
    neg    ax
727
    add    ax, 18-1
728
    mov    bx, 18
729
    xor    dx, dx
730
    div    bx
29 halyavin 731
if lang eq ru
732
; ¯®¤®¦¤¨â¥ 5 ᥪ㭤, 4/3/2 ᥪ㭤ë, 1 ᥪ㭤ã
76 mario79 733
    cmp    al, 5
734
    mov    cl, ' '
735
    jae    @f
736
    cmp    al, 1
737
    mov    cl, 'ã'
738
    jz    @f
739
    mov    cl, 'ë'
740
@@:    mov    [time_str+9-0x10000], cl
29 halyavin 741
else
742
; wait 5/4/3/2 seconds, 1 second
76 mario79 743
    cmp    al, 1
744
    mov    cl, 's'
745
    ja    @f
746
    mov    cl, ' '
747
@@:    mov    [time_str+9-0x10000], cl
29 halyavin 748
end if
76 mario79 749
    add    al, '0'
750
    mov    [time_str+1-0x10000], al
751
    mov    si, time_msg-0x10000
752
    _setcursor 7,0
753
    call    print
754
    _setcursor 25,0
755
    popad
756
    pop    ds
757
    iret
29 halyavin 758
.timergo:
76 mario79 759
    push    0
760
    pop    es
761
    mov    eax, [.oldtimer-0x10000]
762
    mov    [es:8*4], eax
763
    mov    sp, 0EC00h
29 halyavin 764
.continue:
76 mario79 765
    sti
766
    _setcursor 6,0
767
    mov    si, space_msg-0x10000
768
    call    printplain
769
    call    printplain
770
    _setcursor 6,0
771
    mov    si, loading_msg-0x10000
772
    call    print
773
    _setcursor 15,0
774
    cmp    [.bSettingsChanged-0x10000], 0
775
    jz    .load
143 diamond 776
    cmp    [.loader_block-0x10000], -1
76 mario79 777
    jz    .load
778
    les    bx, [.loader_block-0x10000]
779
    mov    eax, [es:bx+3]
780
    push    ds
781
    pop    es
782
    test    eax, eax
783
    jz    .load
784
    push    eax
785
    mov    si, save_quest-0x10000
786
    call    print
29 halyavin 787
.waityn:
76 mario79 788
    mov    ah, 0
789
    int    16h
790
    or    al, 20h
791
    cmp    al, 'n'
792
    jz    .loadc
793
    cmp    al, 'y'
794
    jnz    .waityn
795
    call    putchar
796
    mov    byte [space_msg-0x10000+80], 186
797
    pop    eax
798
    push    cs
82 halyavin 799
    push    .cont
76 mario79 800
    push    eax
801
    retf
29 halyavin 802
.loadc:
76 mario79 803
    pop    eax
29 halyavin 804
.cont:
76 mario79 805
    push    cs
806
    pop    ds
807
    mov    si, space_msg-0x10000
808
    mov    byte [si+80], 0
809
    _setcursor 15,0
810
    call    printplain
811
    _setcursor 15,0
29 halyavin 812
.load:
813
; \end{diamond}[02.12.2005]
1 ha 814
 
815
; ASK GRAPHICS MODE
816
 
76 mario79 817
    movzx    ax, [preboot_graph-0x10000]
818
    push    0
819
    pop    es
29 halyavin 820
; address is gr_table+6*(ax-1)-0x10000
76 mario79 821
        add    ax, ax
822
        lea    si, [gr_table-0x10000 + eax + eax*2 - 6]
29 halyavin 823
        mov     bx,[si+0]
824
        mov     cx,[si+2]
825
        mov     dx,[si+4]
76 mario79 826
        cmp    al, 9*2
827
        mov    al, 32    ; BPP
828
        jb    @f
829
        mov    [es:0x9000], al
164 serge 830
        mov    dword [es:0x9018], 0xFFFFFFFF; 0x800000
29 halyavin 831
       @@:
1 ha 832
        mov     [es:0x9008],bx
833
        mov     [es:0x900A],cx
834
        mov     [es:0x900C],dx
76 mario79 835
        test    bh, bh
836
        jz    nov
1 ha 837
 
838
; USE DEFAULTS OR PROBE
839
 
840
; bx - mode : cx - x size : dx - y size
76 mario79 841
    cmp    [preboot_gprobe-0x10000], 1
842
    jz    noprobe
1 ha 843
 
844
        mov     bx,0x100
845
     newprobe:
846
        inc     bx
847
        cmp     bx,0x17f
76 mario79 848
        mov    si,prnotfnd-0x10000
849
        jz    sayerr
1 ha 850
 
851
     probemore:
76 mario79 852
         push    cx
1 ha 853
        mov     ax,0x4f01
854
        mov     cx,bx
855
        and     cx,0xfff
856
        mov     di,0xa000
857
        int     0x10
76 mario79 858
        pop    cx
1 ha 859
 
76 mario79 860
    test    byte [es:di], 80h    ; lfb?
861
    jz    newprobe
862
    cmp    [es:di+0x12], cx    ; x size?
863
    jnz    newprobe
864
    cmp    [es:di+0x14], dx    ; y size?
865
    jnz    newprobe
866
    cmp    byte [es:di+0x19], 32 ;24
867
    jb    newprobe
1 ha 868
 
40 halyavin 869
;       add     bx,0100000000000000b
76 mario79 870
    or    bh, 40h
1 ha 871
        mov     [es:0x9008],bx
872
 
873
     noprobe:
874
 
875
 
876
; FIND VESA 2.0 LFB & BPP
877
 
878
        mov     ax,0x4f01
879
        mov     cx,bx
880
        and     cx,0xfff
881
        mov     di,0xa000
882
        int     0x10
883
        ; LFB
40 halyavin 884
        mov     eax,[es:di+0x28]
885
        mov     [es:0x9018],eax
1 ha 886
        ; ---- vbe voodoo
887
        BytesPerScanLine equ 0x10
888
        mov ax, [es:di+BytesPerScanLine]
889
        mov [es:0x9001],ax
29 halyavin 890
        ; BPP
40 halyavin 891
        mov     al,byte [es:di+0x19]
29 halyavin 892
        mov     [es:0x9000],al
1 ha 893
       nov:
40 halyavin 894
        cmp     al,24
76 mario79 895
        mov    si,bt24-0x10000
896
        jz    bppl
40 halyavin 897
        cmp     al,32
1 ha 898
        mov     si,bt32-0x10000
29 halyavin 899
        jz     bppl
1 ha 900
        mov     si,btns-0x10000
76 mario79 901
        jmp    sayerr
40 halyavin 902
       bppl:
1 ha 903
        call    print
904
 
905
 
906
; FIND VESA 1.2 PM BANK SWITCH ADDRESS
907
 
76 mario79 908
    push    es
1 ha 909
        mov     ax,0x4f0A
76 mario79 910
        xor    bx, bx
1 ha 911
        int     0x10
912
        xor     eax,eax
913
        mov     ax,es
914
        shl     eax,4
29 halyavin 915
        movzx   ebx,di
1 ha 916
        add     eax,ebx
917
        mov     bx,[es:di]
918
        add     eax,ebx
919
        pop     es
920
        mov     [es:0x9014],eax
921
 
922
 
923
; GRAPHICS ACCELERATION
924
 
29 halyavin 925
        mov     al, [preboot_mtrr-0x10000]
1 ha 926
        mov     [es:0x901C],al
927
 
928
; VRR_M USE
929
 
29 halyavin 930
        mov     al,[preboot_vrrm-0x10000]
1 ha 931
        mov     [es:0x9030],al
932
 
933
 
934
; MEMORY MODEL
935
 
936
;        movzx   eax,byte [es:preboot_memory-0x10000]
937
;        cmp     eax,0
938
;        jne     pre_mem
939
;;;;;;;;;;;;;;;;;;;;;;;;;
940
; mario79 - memory size ;
941
;;;;;;;;;;;;;;;;;;;;;;;;;
942
;           mov ax,0E801h
943
;;;           xor bx,bx    ; thanks to Alexei for bugfix [18.07.2004]
944
;           xor cx, cx
945
;           xor dx, dx
946
;           int 0x15
947
;           movzx ebx, dx ;bx
948
;           movzx eax, cx ;ax
949
;           shl   ebx,6   ; ïåðåâîä â êèëîáàéòû (x64)
950
;           add   eax,ebx
951
;           add eax, 1000h ;440h
952
;           cmp eax,40000h ; 256?
953
;           jge mem_256_z
954
;           cmp eax,20000h ; 128?
955
;           jge mem_128_z
956
;           cmp eax,10000h ; 64?
957
;           jge mem_64_z
958
;           cmp eax,8000h ; 32?
959
;           jge mem_32_z
960
;           jmp mem_16_z
961
;
962
;mem_256_z: mov     si,memokz256-0x10000
963
;           call    printplain
964
;           mov eax,5
965
;           jmp pre_mem
966
;mem_128_z: mov     si,memokz128-0x10000
967
;           call    printplain
968
;           mov eax,4
969
;           jmp pre_mem
970
;mem_64_z:  mov     si,memokz64-0x10000
971
;           call    printplain
972
;           mov eax,3
973
;           jmp pre_mem
974
;mem_32_z:  mov     si,memokz32-0x10000
975
;           call    printplain
976
;           mov eax,2
977
;           jmp pre_mem
978
;mem_16_z:  mov     si,memokz16-0x10000
979
;           call    printplain
980
;           mov eax,1
981
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
982
;      pre_mem:
983
;        push    word 0x0000
984
;        pop     es
985
;        mov     [es:0x9030],al
986
;        push    word 0x1000
987
;        pop     es
988
;        mov     si,linef-0x10000
989
;        call    printplain
990
 
991
 
992
 
993
 
994
; DIRECT WRITE TO LFB, PAGING DISABLED
995
 
996
;        movzx   eax,byte [es:preboot_lfb-0x10000]
997
;        mov     eax,1                             ; paging disabled
998
;        cmp     eax,0
999
;        jne     pre_lfb
1000
;        mov     si,gr_direct-0x10000
1001
;        call    printplain
29 halyavin 1002
;        mov     ebx,'12'
1 ha 1003
;        call    getkey
1004
;      pre_lfb:
1005
;        push    word 0x0000
1006
;        pop     es
1007
;        mov     [es:0x901E],al
1008
;        mov     ax,0x1000
1009
;        mov     es,ax
1010
;        mov     si,linef-0x10000
1011
;        call    printplain
1012
        mov     [es:0x901E],byte 1
1013
 
1014
 
1015
 
1016
; BOOT DEVICE
1017
 
76 mario79 1018
    mov    al, [preboot_device-0x10000]
40 halyavin 1019
        dec     al
29 halyavin 1020
        mov     [boot_dev-0x10000],al
1 ha 1021
 
1022
; READ DISKETTE TO MEMORY
1023
 
40 halyavin 1024
;        cmp     [boot_dev-0x10000],0
1 ha 1025
        jne     no_sys_on_floppy
1026
        mov     si,diskload-0x10000
1027
        call    print
76 mario79 1028
        xor    ax, ax            ; reset drive
1029
        xor    dx, dx
1 ha 1030
        int     0x13
134 diamond 1031
; now load floppy image to memory
1032
; at first load boot sector and first FAT table
1033
        mov     cx, 0x0001      ; startcyl,startsector
1034
        xor     dx, dx          ; starthead,drive
1035
        mov     al, 1+9         ; no of sectors to read
1036
        mov     bx, 0xB000      ; es:bx -> data area
1037
        call    boot_read_floppy
1038
; and copy them to extended memory
1039
        mov     si, movedesc-0x10000
1040
        mov     [si+8*2+3], bh
1041
        push    es
1042
        push    ds
1043
        pop     es
1044
        mov     cx, 256*10
1045
        mov     ah, 0x87
1046
        int     0x15
76 mario79 1047
        test    ah, ah
134 diamond 1048
        jz      @f
1049
sayerr_floppy:
1050
        mov     dx, 0x3f2
1051
        mov     al, 0
1052
        out     dx, al
1053
        mov     si, memmovefailed-0x10000
1054
        jmp     sayerr_plain
1055
@@:
1056
        add     dword [si+8*3+2], 512*10
1057
; copy FAT to second copy
1058
        mov     byte [si+8*2+3], 0xB2
1059
        mov     cx, 256*9
1060
        mov     ah, 0x87
1061
        int     0x15
1062
        pop     es
1063
        test    ah, ah
1064
        jnz     sayerr_floppy
1065
        add     dword [si+8*3+2], 512*9
1066
; calculate total number of sectors to read
1067
        mov     ax, 1+9+14      ; boot+FAT+root
1068
        mov     di, 0xB203
1069
.calc_loop:
1070
        test    word [es:di], 0xFFF
1071
        jz      @f
1072
        inc     ax
1073
@@:
1074
        test    word [es:di+1], 0xFFF0
1075
        jz      @f
1076
        inc     ax
1077
@@:
1078
        add     di, 3
1079
        cmp     di, 0xB200+1440*3
1080
        jb      .calc_loop
1081
        push    ax
1082
        mov     bp, 1+9         ; already read sectors
1083
; now read rest
1084
        mov     byte [si+8*2+3], 0xA0
1085
        mov     di, 2-14        ; absolute sector-31
1086
        mov     cx, 0x0002      ; cylinder=0, sector=2
1087
        mov     dx, 0x0100      ; head=1, disk=0
1088
.read_loop:
1089
; determine whether sector must be read
1090
        cmp     di, 2
1091
        jl      .read
1092
        mov     bx, di
1093
        shr     bx, 1
1094
        jnc     .even
1095
        test    word [es:bx+di+0xB200], 0xFFF0
1096
        jmp     @f
1097
.even:
1098
        test    word [es:bx+di+0xB200], 0xFFF
1099
@@:
1100
        jz      .skip
1101
.read:
1102
        mov     bx, 0xA000
1103
        mov     al, 1           ; 1 sector
1104
        call    boot_read_floppy
1105
        inc     bp
76 mario79 1106
        push    es
1107
        push    ds
1 ha 1108
        pop     es
134 diamond 1109
        pusha
1110
        mov     cx, 256
1111
        mov     ah, 0x87
1 ha 1112
        int     0x15
134 diamond 1113
        test    ah, ah
1 ha 1114
        popa
134 diamond 1115
        pop     es
1116
        jnz     sayerr_floppy
1117
.skip:
1118
        add     dword [si+8*3+2], 512
1119
        inc     cx
1120
        cmp     cl, 19
1121
        jnz     @f
1122
        mov     cl, 1
1 ha 1123
        inc     dh
134 diamond 1124
        cmp     dh, 2
1125
        jnz     @f
1126
        mov     dh, 0
1 ha 1127
        inc     ch
29 halyavin 1128
@@:
134 diamond 1129
        pop     ax
1130
        push    ax
1131
        pusha
1132
; draw percentage
1133
; total sectors: ax
1134
; read sectors: bp
1135
        xchg    ax, bp
1136
        mov     cx, 100
1137
        mul     cx
1138
        div     bp
1139
        aam
1140
        xchg    al, ah
1141
        add     ax, '00'
1142
        mov     si, pros-0x10000
1143
        cmp     [si], ax
1144
        jz      @f
1145
        mov     [si], ax
1 ha 1146
        call    printplain
134 diamond 1147
@@:
1 ha 1148
        popa
134 diamond 1149
        inc     di
1150
        cmp     di, 2880-31
1151
        jnz     .read_loop
1152
 
1153
;        mov     cx, 0x0001      ; startcyl,startsector
1154
;        xor     dx, dx          ; starthead,drive
1155
;        push    word 80*2               ; read no of sect
1156
;       reads:
1157
;        pusha
1158
;        xor     si,si
1159
;       newread:
1160
;        mov     bx,0xa000               ; es:bx -> data area
1161
;        mov     ax,0x0200+18            ; read, no of sectors to read
1162
;        int     0x13
1163
;        test    ah, ah
1164
;        jz      goodread
1165
;        inc    si
1166
;        cmp     si,10
1167
;        jnz     newread
1168
;        mov     si,badsect-0x10000
1169
;sayerr_plain:
1170
;        call    printplain
1171
;        jmp     $
1172
;       goodread:
1173
;        ; move -> 1mb
1174
;        mov     si,movedesc-0x10000
1175
;        push    es
1176
;        push    ds
1177
;        pop     es
1178
;        mov     cx,256*18
1179
;        mov     ah,0x87
1180
;        int     0x15
1181
;        pop    es
1182
;
1183
;        test    ah,ah                  ; was the move successfull ?
1184
;        je      goodmove
1185
;        mov     dx,0x3f2              ; floppy motor off
1186
;        mov     al,0
1187
;        out     dx,al
1188
;        mov     si,memmovefailed-0x10000
1189
;        jmp    sayerr_plain
1190
;      goodmove:
1191
;
1192
;    add    dword [movedesc-0x10000+0x18+2], 512*18
1193
;        popa
1194
;        inc     dh
1195
;        cmp     dh,2
1196
;        jnz     bb2
1197
;        mov     dh,0
1198
;        inc     ch
1199
;        pusha                        ; print prosentage
1200
;        mov     si,pros-0x10000
1201
;    shr    ch, 2
1202
;    mov    al, '5'
1203
;    test    ch, 1
1204
;    jnz    @f
1205
;    mov    al, '0'
1206
;@@:
1207
;    mov    [si+1], al
1208
;    shr    ch, 1
1209
;    add    ch, '0'
1210
;    mov    [si], ch
1211
;        call    printplain
1212
;        popa
1213
;       bb2:
1214
;        pop     ax
1215
;        dec     ax
1216
;        push    ax
1217
;        jnz     reads
1218
;       readdone:
1219
;        pop     ax
40 halyavin 1220
        mov     si,backspace2-0x10000
1 ha 1221
        call    printplain
1222
        mov     si,okt-0x10000
1223
        call    printplain
1224
       no_sys_on_floppy:
76 mario79 1225
        xor    ax, ax        ; reset drive
1226
        xor    dx, dx
1 ha 1227
        int     0x13
1228
       mov dx,0x3f2 ; floppy motor off
1229
       mov al,0
29 halyavin 1230
       out dx,al
1 ha 1231
 
76 mario79 1232
    push    es
1 ha 1233
; PAGE TABLE
1234
 
76 mario79 1235
    push    dword [es:0x9018]
164 serge 1236
;
1237
;        mmap_mem equ 64                ; amount of memory to map
1238
;
76 mario79 1239
        push    0x6000
1240
        pop    es                    ; es:di = 6000:0
164 serge 1241
;        xor     di,di
1242
;        mov     cx,256*mmap_mem         ; Map (mapmem) M
1243
;; initialize as identity mapping
1244
;        xor    eax, eax
1245
;        call    pagetable_set
1246
;
1247
;
1 ha 1248
; 4 KB PAGE DIRECTORY
164 serge 1249
;
1250
       push    0x7F00
1251
       pop    es                ; es:di = 7F00:0
1252
;        xor     di, di
1253
;        mov     cx, 64 / 4
1254
;        mov     eax, 0x60007            ; for 0 M
1255
;        call    pagetable_set
1256
;        xor     si,si
1257
;        mov     di,second_base_address shr 20
1258
;        mov     cx,64/2
1259
;        rep     movs word [es:di], [es:si]
1 ha 1260
 
164 serge 1261
;        mov     eax, 0x7F000 +8+16      ; Page directory and enable caches
1262
;        mov     cr3, eax
1 ha 1263
 
1264
; SET GRAPHICS
1265
 
76 mario79 1266
    pop    es
164 serge 1267
 
1268
        xor ax, ax
1269
        mov es, ax
1270
 
1271
        mov   ax,[es:0x9008]        ; vga & 320x200
76 mario79 1272
        mov    bx, ax
1 ha 1273
        cmp     ax,0x13
1274
        je      setgr
1275
        cmp     ax,0x12
1276
        je      setgr
1277
        mov     ax,0x4f02            ; Vesa
1278
       setgr:
1279
        int     0x10
76 mario79 1280
        test    ah,ah
1281
        mov    si, fatalsel-0x10000
1282
        jnz    sayerr
1 ha 1283
; set mode 0x12 graphics registers:
1284
        cmp     bx,0x12
1285
        jne     gmok2
1286
 
1287
        mov     al,0x05
1288
        mov     dx,0x03ce
40 halyavin 1289
        push    dx
1 ha 1290
        out     dx,al      ; select GDC mode register
1291
        mov     al,0x02
76 mario79 1292
        inc    dx
1 ha 1293
        out     dx,al      ; set write mode 2
1294
 
1295
        mov     al,0x02
1296
        mov     dx,0x03c4
1297
        out     dx,al      ; select VGA sequencer map mask register
1298
        mov     al,0x0f
76 mario79 1299
        inc    dx
1 ha 1300
        out     dx,al      ; set mask for all planes 0-3
1301
 
1302
        mov     al,0x08
76 mario79 1303
        pop    dx
1 ha 1304
        out     dx,al      ; select GDC bit mask register
1305
                           ; for writes to 0x03cf
1306
 
1307
       gmok2:
76 mario79 1308
        push    ds
1309
        pop    es