Subversion Repositories Kolibri OS

Rev

Rev 709 | Rev 730 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  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: 713 $
  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.         cmp     al, 0
  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.         mov     si, badsect
  95. sayerr_plain:
  96.         call    printplain
  97.         jmp     $
  98. @@:
  99.         pop     si
  100.         ret
  101.  
  102. ;=========================================================================
  103. ;
  104. ;                           16 BIT CODE
  105. ;
  106. ;=========================================================================
  107.  
  108. include 'bootvesa.inc'                 ;Include source for boot vesa
  109.  
  110. start_of_code:
  111.         cld
  112. ; \begin{diamond}[02.12.2005]
  113. ; if bootloader sets ax = 'KL', then ds:si points to loader block
  114.         cmp     ax, 'KL'
  115.         jnz     @f
  116.         mov     word [cs:cfgmanager.loader_block], si
  117.         mov     word [cs:cfgmanager.loader_block+2], ds
  118. @@:
  119. ; \end{diamond}[02.12.2005]
  120.  
  121. ; if bootloader sets cx = 'HA' and dx = 'RD', then bx contains identifier of source hard disk
  122. ; (see comment to bx_from_load)
  123.         cmp     cx, 'HA'
  124.         jnz     no_hd_load
  125.         cmp     dx,'RD'
  126.         jnz     no_hd_load
  127.         mov     word [cs:bx_from_load], bx              ; {SPraid}[13.03.2007]
  128. no_hd_load:
  129.  
  130. ; set up stack
  131.         mov     ax, 3000h
  132.         mov     ss, ax
  133.         mov     sp, 0EC00h
  134. ; set up segment registers
  135.         push    cs
  136.         pop     ds
  137.         push    cs
  138.         pop     es
  139.  
  140. ; set videomode
  141.         mov     ax, 3
  142.         int     0x10
  143.  
  144. if lang eq ru
  145.  ; Load & set russian VGA font (RU.INC)
  146.         mov     bp, RU_FNT1             ; RU_FNT1 - First part
  147.         mov     bx, 1000h               ; 768 bytes
  148.         mov     cx, 30h                 ; 48 symbols
  149.         mov     dx, 80h                 ; 128 - position of first symbol
  150.         mov     ax, 1100h
  151.         int     10h
  152.  
  153.         mov     bp, RU_FNT2             ; RU_FNT2 -Second part
  154.         mov     bx, 1000h               ; 512 bytes
  155.         mov     cx, 20h                 ; 32 symbols
  156.         mov     dx, 0E0h                ; 224 - position of first symbol
  157.         mov     ax, 1100h
  158.         int     10h
  159.  ; End set VGA russian font
  160. else if lang eq et
  161.         mov     bp, ET_FNT              ; ET_FNT1
  162.         mov     bx, 1000h               ;
  163.         mov     cx, 255                 ; 256 symbols
  164.         xor     dx, dx                  ; 0 - position of first symbol
  165.         mov     ax, 1100h
  166.         int     10h
  167. end if
  168.  
  169. ; draw frames
  170.         push    0xb800
  171.         pop     es
  172.         xor     di, di
  173.         mov     ah, 1*16+15
  174.  
  175. ; draw top
  176.         mov     si, d80x25_top
  177.         mov     cx, d80x25_top_num * 80
  178. @@:
  179.         lodsb
  180.         stosw
  181.         loop    @b
  182. ; draw spaces
  183.         mov     si, space_msg
  184.         mov     dx, 25 - d80x25_top_num - d80x25_bottom_num
  185. dfl1:
  186.         push    si
  187.         mov     cx, 80
  188. @@:
  189.         lodsb
  190.         stosw
  191.         loop    @b
  192.         pop     si
  193.         dec     dx
  194.         jnz     dfl1
  195. ; draw bottom
  196.         mov     si, d80x25_bottom
  197.         mov     cx, d80x25_bottom_num * 80
  198. @@:
  199.         lodsb
  200.         stosw
  201.         loop    @b
  202.  
  203.         mov     byte [space_msg+80], 0    ; now space_msg is null terminated
  204.  
  205.         _setcursor d80x25_top_num,0
  206.  
  207.  
  208. ; TEST FOR 386+
  209.  
  210.         mov     bx, 0x4000
  211.         pushf
  212.         pop     ax
  213.         mov     dx, ax
  214.         xor     ax, bx
  215.         push    ax
  216.         popf
  217.         pushf
  218.         pop     ax
  219.         and     ax, bx
  220.         and     dx, bx
  221.         cmp     ax, dx
  222.         jnz     cpugood
  223.         mov     si, not386
  224. sayerr:
  225.         call    print
  226.         jmp     $
  227.      cpugood:
  228.  
  229.         push    0
  230.         popf
  231.         sti
  232.  
  233. ; set up esp
  234.         movzx   esp, sp
  235.  
  236.         push    0
  237.         pop     es
  238.         and     word [es:0x9031], 0
  239. ; \begin{Mario79}
  240. ; find HDD IDE DMA PCI device
  241. ; check for PCI BIOS
  242.         mov     ax, 0xB101
  243.         int     0x1A
  244.         jc      .nopci
  245.         cmp     edx, 'PCI '
  246.         jnz     .nopci
  247. ; find PCI class code
  248. ; class 1 = mass storage
  249. ; subclass 1 = IDE controller
  250. ; a) class 1, subclass 1, programming interface 0x80
  251.         mov     ax, 0xB103
  252.         mov     ecx, 1*10000h + 1*100h + 0x80
  253.         xor     si, si  ; device index = 0
  254.         int     0x1A
  255.         jnc     .found
  256. ; b) class 1, subclass 1, programming interface 0x8A
  257.         mov     ax, 0xB103
  258.         mov     ecx, 1*10000h + 1*100h + 0x8A
  259.         xor     si, si  ; device index = 0
  260.         int     0x1A
  261.         jnc     .found
  262. ; c) class 1, subclass 1, programming interface 0x85
  263.         mov     ax, 0xB103
  264.         mov     ecx, 1*10000h + 1*100h + 0x85
  265.         xor     si, si
  266.         int     0x1A
  267.         jc      .nopci
  268. .found:
  269. ; get memory base
  270.         mov     ax, 0xB10A
  271.         mov     di, 0x20        ; memory base is config register at 0x20
  272.         int     0x1A
  273.         jc      .nopci
  274.         and     cx, 0xFFF0      ; clear address decode type
  275.         mov     [es:0x9031], cx
  276. .nopci:
  277. ; \end{Mario79}
  278.  
  279.         mov     al, 0xf6        ; Ñáðîñ êëàâèàòóðû, ðàçðåøèòü ñêàíèðîâàíèå
  280.         out     0x60, al
  281.         xor     cx, cx
  282. wait_loop:       ; variant 2
  283. ; reading state of port of 8042 controller
  284.         in      al, 64h
  285.         and     al, 00000010b  ; ready flag
  286. ; wait until 8042 controller is ready
  287.         loopnz  wait_loop
  288.  
  289. ;;;/diamond today   5.02.2008
  290. ; set keyboard typematic rate & delay
  291.         mov     al, 0xf3
  292.         out     0x60, al
  293.         xor     cx, cx
  294. @@:
  295.         in      al, 64h
  296.         test    al, 2
  297.         loopnz  @b
  298.         mov     al, 0
  299.         out     0x60, al
  300.         xor     cx, cx
  301. @@:
  302.         in      al, 64h
  303.         test    al, 2
  304.         loopnz  @b
  305. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  306. ; --------------- APM ---------------------
  307.         and     word [es:0x9044], 0     ; ver = 0.0 (APM not found)
  308.         mov     ax, 0x5300
  309.         xor     bx, bx
  310.         int     0x15
  311.         jc      apm_end                 ; APM not found
  312.         test    cx, 2
  313.         jz      apm_end                 ; APM 32-bit protected-mode interface not supported
  314.         mov     [es:0x9044], ax         ; Save APM Version
  315.         mov     [es:0x9046], cx         ; Save APM flags
  316.  
  317.         ; Write APM ver ----
  318.         and     ax, 0xf0f
  319.         add     ax, '00'
  320.         mov     si, msg_apm
  321.         mov     [si + 5], ah
  322.         mov     [si + 7], al
  323.         _setcursor 0, 3
  324.         call    printplain
  325.         ; ------------------
  326.  
  327.         mov     ax, 0x5304              ; Disconnect interface
  328.         xor     bx, bx
  329.         int     0x15
  330.         mov     ax, 0x5303              ; Connect 32 bit mode interface
  331.         xor     bx, bx
  332.         int     0x15
  333.  
  334.         mov     [es:0x9040], ebx
  335.         mov     [es:0x9050], ax
  336.         mov     [es:0x9052], cx
  337.         mov     [es:0x9054], dx
  338.  
  339. apm_end:
  340.         _setcursor d80x25_top_num, 0
  341.  
  342. ;CHECK current of code
  343.         cmp     [cfgmanager.loader_block], -1
  344.         jz      noloaderblock
  345.         les     bx, [cfgmanager.loader_block]
  346.         cmp     byte [es:bx], 1
  347.         mov     si, loader_block_error
  348.         jnz     sayerr
  349.  
  350. noloaderblock:
  351. ; DISPLAY VESA INFORMATION
  352.          call    print_vesa_info
  353.          call    calc_vmodes_table
  354.          call    check_first_parm  ;check and enable cursor_pos
  355.  
  356.  
  357. ; \begin{diamond}[30.11.2005]
  358. cfgmanager:
  359. ; settings:
  360. ; a) preboot_graph = graphical mode
  361. ;    preboot_gprobe = probe this mode?
  362. ; b) preboot_dma  = use DMA access?
  363. ; c) preboot_vrrm = use VRR?
  364. ; d) preboot_device = from what boot?
  365.  
  366. ; determine default settings
  367.         mov     [.bSettingsChanged], 0
  368.  
  369. ;.preboot_gr_end:
  370. ; following 6 lines set variables to 1 if its current value is 0
  371.         cmp     byte[preboot_dma], 1
  372.         adc     byte[preboot_dma], 0
  373.         cmp     byte[preboot_vrrm], 1
  374.         adc     byte[preboot_vrrm], 0
  375.         cmp     byte[preboot_device], 1
  376.         adc     byte[preboot_device], 0
  377. ; notify user
  378.         _setcursor 5,2
  379.  
  380.         mov     si, linef
  381.         call    printplain
  382.         mov     si, start_msg
  383.         call    print
  384.         mov     si, time_msg
  385.         call    print
  386. ; get start time
  387.         call    .gettime
  388.         mov     [.starttime], eax
  389.         mov     word [.timer], .newtimer
  390.         mov     word [.timer+2], cs
  391. .printcfg:
  392.         _setcursor 9,0
  393.         mov     si, current_cfg_msg
  394.         call    print
  395.         mov     si, curvideo_msg
  396.         call    print
  397.  
  398.             call    draw_current_vmode
  399.  
  400.         mov     si, usebd_msg
  401.         cmp     [preboot_biosdisk], 1
  402.         call    .say_on_off
  403.         mov     si, vrrm_msg
  404.         cmp     [preboot_vrrm], 1
  405.         call    .say_on_off
  406.         mov     si, preboot_device_msg
  407.         call    print
  408.         mov     al, [preboot_device]
  409.         and     eax, 7
  410.         mov     si, [preboot_device_msgs+eax*2]
  411.         call    printplain
  412. .wait:
  413.         _setcursor 25,0         ; out of screen
  414. ; set timer interrupt handler
  415.         cli
  416.         push    0
  417.         pop     es
  418.         push    dword [es:8*4]
  419.         pop     dword [.oldtimer]
  420.         push    dword [.timer]
  421.         pop     dword [es:8*4]    
  422. ;        mov     eax, [es:8*4]
  423. ;        mov     [.oldtimer], eax
  424. ;        mov     eax, [.timer]
  425. ;        mov     [es:8*4], eax
  426.         sti
  427. ; wait for keypressed
  428.         xor     ax,ax
  429.         int     16h
  430.         push    ax
  431. ; restore timer interrupt
  432. ;        push    0
  433. ;        pop     es
  434.         mov     eax, [.oldtimer]
  435.         mov     [es:8*4], eax
  436.         mov     [.timer], eax
  437.         _setcursor 7,0
  438.         mov     si, space_msg
  439.         call    printplain
  440.         pop     ax
  441. ; switch on key
  442.         cmp     al, 13
  443.         jz      .continue
  444.         or      al, 20h
  445.         cmp     al, 'a'
  446.         jz      .change_a
  447.         cmp     al, 'b'
  448.         jz      .change_b
  449.         cmp     al, 'c'
  450.         jz      .change_c
  451.         cmp     al, 'd'
  452.         jnz     .wait
  453.         _setcursor 15,0
  454.         mov     si, bdev
  455.         call    print
  456.         mov     bx, '14'
  457.         call    getkey
  458.         mov     [preboot_device], al
  459.         _setcursor 13,0
  460. .d:
  461.         mov     [.bSettingsChanged], 1
  462.         call    clear_vmodes_table             ;clear vmodes_table
  463.         jmp    .printcfg
  464. .change_a:
  465. .loops:
  466.         call    draw_vmodes_table
  467.  
  468.         xor     ax,ax
  469.         int     0x16
  470. ;        call    clear_table_cursor             ;clear current position of cursor
  471.  
  472.         mov     si,word [cursor_pos]
  473.  
  474.         cmp     ah,0x48;x,0x48E0               ; up
  475.         jne     .down
  476.         cmp     si,modes_table
  477.         jbe     .loops
  478.         sub     word [cursor_pos],size_of_step
  479.         jmp     .loops
  480.  
  481. .down:  cmp     ah,0x50;x,0x50E0               ; down
  482.         jne     .enter
  483.         cmp     word[es:si+10],-1
  484.         je      .loops        
  485.         add     word [cursor_pos],size_of_step
  486.         jmp     .loops
  487.  
  488. .enter: cmp     al,0x0D;x,0x1C0D               ; enter
  489.         jne     .loops
  490.         push    word [cursor_pos]
  491.         pop     word [preboot_graph]           ;save choose
  492.         jmp    .d
  493.  
  494. .change_b:
  495.         _setcursor 15,0
  496. ;        mov     si, ask_dma
  497. ;        call    print
  498. ;        mov     bx, '13'
  499. ;        call    getkey
  500. ;        mov     [preboot_dma], al
  501.         mov     si, ask_bd
  502.         call    print
  503.         mov     bx, '12'
  504.         call    getkey
  505.         mov     [preboot_biosdisk], al
  506.         _setcursor 11,0
  507.         jmp     .d
  508. .change_c:
  509.         _setcursor 15,0
  510.         mov     si, vrrmprint
  511.         call    print
  512.         mov     bx, '12'
  513.         call    getkey
  514.         mov     [preboot_vrrm], al
  515.         _setcursor 12,0
  516.         jmp     .d
  517. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  518. .say_on_off:
  519.         pushf
  520.         call    print
  521.         mov     si, on_msg
  522.         popf
  523.         jz      @f
  524.         mov     si, off_msg
  525. @@:     jmp     printplain
  526. ; novesa and vervesa strings are not used at the moment of executing this code
  527. virtual at novesa
  528. .oldtimer dd ?
  529. .starttime dd ?
  530. .bSettingsChanged db ?
  531. .timer dd ?
  532. end virtual
  533. .loader_block dd -1
  534. .gettime:
  535.         mov     ah, 0
  536.         int     1Ah
  537.         xchg    ax, cx
  538.         shl     eax, 10h
  539.         xchg    ax, dx
  540.         ret
  541. .newtimer:
  542.         push    ds
  543.         push    cs
  544.         pop     ds
  545.         pushf
  546.         call    [.oldtimer]
  547.         pushad
  548.         call    .gettime
  549.         sub     eax, [.starttime]
  550.         sub     ax, 18*5
  551.         jae     .timergo
  552.         neg     ax
  553.         add     ax, 18-1
  554.         mov     bx, 18
  555.         xor     dx, dx
  556.         div     bx
  557. if lang eq ru
  558. ; ¯®¤®¦¤¨â¥ 5 ᥪ㭤, 4/3/2 ᥪ㭤ë, 1 ᥪ㭤ã
  559.         cmp     al, 5
  560.         mov     cl, ' '
  561.         jae     @f
  562.         cmp     al, 1
  563.         mov     cl, 'ã'
  564.         jz      @f
  565.         mov     cl, 'ë'
  566. @@:     mov     [time_str+9], cl
  567. else if lang eq et
  568.         cmp     al, 1
  569.         ja      @f
  570.         mov     [time_str+9], ' '
  571.         mov     [time_str+10],' '
  572. @@:
  573. else
  574. ; wait 5/4/3/2 seconds, 1 second
  575.         cmp     al, 1
  576.         mov     cl, 's'
  577.         ja      @f
  578.         mov     cl, ' '
  579. @@:     mov     [time_str+9], cl
  580. end if
  581.         add     al, '0'
  582.         mov     [time_str+1], al
  583.         mov     si, time_msg
  584.         _setcursor 7,0
  585.         call    print
  586.         _setcursor 25,0
  587.         popad
  588.         pop     ds
  589.         iret
  590. .timergo:
  591.         push    0
  592.         pop     es
  593.         mov     eax, [.oldtimer]
  594.         mov     [es:8*4], eax
  595.         mov     sp, 0EC00h
  596. .continue:
  597.         sti
  598.         _setcursor 6,0
  599.         mov     si, space_msg
  600.         call    printplain
  601.         call    printplain
  602.         _setcursor 6,0
  603.         mov     si, loading_msg
  604.         call    print
  605.         _setcursor 15,0
  606.         cmp     [.bSettingsChanged], 0
  607.         jz      .load
  608.         cmp     [.loader_block], -1
  609.         jz      .load
  610.         les     bx, [.loader_block]
  611.         mov     eax, [es:bx+3]
  612.         push    ds
  613.         pop     es
  614.         test    eax, eax
  615.         jz      .load
  616.         push    eax
  617.         mov     si, save_quest
  618.         call    print
  619. .waityn:
  620.         mov     ah, 0
  621.         int     16h
  622.         or      al, 20h
  623.         cmp     al, 'n'
  624.         jz      .loadc
  625.         cmp     al, 'y'
  626.         jnz     .waityn
  627.         call    putchar
  628.         mov     byte [space_msg+80], 186
  629.         pop     eax
  630.         push    cs
  631.         push    .cont
  632.         push    eax
  633.         retf
  634. .loadc:
  635.         pop     eax
  636. .cont:
  637.         push    cs
  638.         pop     ds
  639.         mov     si, space_msg
  640.         mov     byte [si+80], 0
  641.         _setcursor 15,0
  642.         call    printplain
  643.         _setcursor 15,0
  644. .load:
  645. ; \end{diamond}[02.12.2005]
  646.  
  647. ; ASK GRAPHICS MODE
  648.  
  649.         call    set_vmode
  650.  
  651. ; GRAPHICS ACCELERATION
  652. ; force yes
  653.         mov     [es:0x901C], byte 1
  654.  
  655. ; DMA ACCESS TO HD
  656.  
  657.         mov     al, [preboot_dma]
  658.         mov     [es:0x901F], al
  659.  
  660. ; VRR_M USE
  661.  
  662.         mov     al,[preboot_vrrm]
  663.         mov     [es:0x9030], al
  664.         mov     [es:0x901E], byte 1
  665.  
  666. ; BOOT DEVICE
  667.  
  668.         mov     al, [preboot_device]
  669.         dec     al
  670.         mov     [boot_dev], al
  671.  
  672. ; READ DISKETTE TO MEMORY
  673.  
  674. ;        cmp     [boot_dev],0
  675.         jne     no_sys_on_floppy
  676.         mov     si,diskload
  677.         call    print
  678.         xor     ax, ax            ; reset drive
  679.         xor     dx, dx
  680.         int     0x13
  681. ; do we boot from CD-ROM?
  682.         mov     ah, 41h
  683.         mov     bx, 55AAh
  684.         xor     dx, dx
  685.         int     0x13
  686.         jc      .nocd
  687.         cmp     bx, 0AA55h
  688.         jnz     .nocd
  689.         mov     ah, 48h
  690.         push    ds
  691.         push    es
  692.         pop     ds
  693.         mov     si, 0xa000
  694.         mov     word [si], 30
  695.         int     0x13
  696.         pop     ds
  697.         jc      .nocd
  698.         push    ds
  699.         lds     si, [es:si+26]
  700.         test    byte [ds:si+10], 40h
  701.         pop     ds
  702.         jz      .nocd
  703. ; yes - read all floppy by 18 sectors
  704.         mov     cx, 0x0001      ; startcyl,startsector
  705. .a1:
  706.         push    cx dx
  707.         mov     al, 18
  708.         mov     bx, 0xa000
  709.         call    boot_read_floppy
  710.         mov     si, movedesc
  711.         push    es
  712.         push    ds
  713.         pop     es
  714.         mov     cx, 256*18
  715.         mov     ah, 0x87
  716.         int     0x15
  717.         pop     es
  718.         pop     dx cx
  719.         test    ah, ah
  720.         jnz     sayerr_floppy
  721.         add     dword [si+8*3+2], 512*18
  722.         inc     dh
  723.         cmp     dh, 2
  724.         jnz     .a1
  725.         mov     dh, 0
  726.         inc     ch
  727.         cmp     ch, 80
  728.         jae     ok_sys_on_floppy
  729.         pusha
  730.         mov     al, ch
  731.         shr     ch, 2
  732.         add     al, ch
  733.         aam
  734.         xchg    al, ah
  735.         add     ax, '00'
  736.         mov     si, pros
  737.         mov     [si], ax
  738.         call    printplain
  739.         popa
  740.         jmp     .a1
  741. .nocd:
  742. ; no - read only used sectors from floppy
  743. ; now load floppy image to memory
  744. ; at first load boot sector and first FAT table
  745.         mov     cx, 0x0001      ; startcyl,startsector
  746.         xor     dx, dx          ; starthead,drive
  747.         mov     al, 1+9         ; no of sectors to read
  748.         mov     bx, 0xB000      ; es:bx -> data area
  749.         call    boot_read_floppy
  750. ; and copy them to extended memory
  751.         mov     si, movedesc
  752.         mov     [si+8*2+3], bh
  753.         push    es
  754.         push    ds
  755.         pop     es
  756.         mov     cx, 256*10
  757.         mov     ah, 0x87
  758.         int     0x15
  759.         test    ah, ah
  760.         jz      @f
  761. sayerr_floppy:
  762.         mov     dx, 0x3f2
  763.         mov     al, 0
  764.         out     dx, al
  765.         mov     si, memmovefailed
  766.         jmp     sayerr_plain
  767. @@:
  768.         add     dword [si+8*3+2], 512*10
  769. ; copy FAT to second copy
  770.         mov     byte [si+8*2+3], 0xB2
  771.         mov     cx, 256*9
  772.         mov     ah, 0x87
  773.         int     0x15
  774.         pop     es
  775.         test    ah, ah
  776.         jnz     sayerr_floppy
  777.         add     dword [si+8*3+2], 512*9
  778. ; calculate total number of sectors to read
  779.         mov     ax, 1+9+14      ; boot+FAT+root
  780.         mov     di, 0xB203
  781. .calc_loop:
  782.         test    word [es:di], 0xFFF
  783.         jz      @f
  784.         inc     ax
  785. @@:
  786.         test    word [es:di+1], 0xFFF0
  787.         jz      @f
  788.         inc     ax
  789. @@:
  790.         add     di, 3
  791.         cmp     di, 0xB200+1440*3
  792.         jb      .calc_loop
  793.         push    ax
  794.         mov     bp, 1+9         ; already read sectors
  795. ; now read rest
  796.         mov     byte [si+8*2+3], 0xA0
  797.         mov     di, 2-14        ; absolute sector-31
  798.         mov     cx, 0x0002      ; cylinder=0, sector=2
  799.         mov     dx, 0x0100      ; head=1, disk=0
  800. .read_loop:
  801. ; determine whether sector must be read
  802.         cmp     di, 2
  803.         jl      .read
  804.         mov     bx, di
  805.         shr     bx, 1
  806.         jnc     .even
  807.         test    word [es:bx+di+0xB200], 0xFFF0
  808.         jmp     @f
  809. .even:
  810.         test    word [es:bx+di+0xB200], 0xFFF
  811. @@:
  812.         jz      .skip
  813. .read:
  814.         mov     bx, 0xA000
  815.         mov     al, 1           ; 1 sector
  816.         call    boot_read_floppy
  817.         inc     bp
  818.         push    es
  819.         push    ds
  820.         pop     es
  821.         pusha
  822.         mov     cx, 256
  823.         mov     ah, 0x87
  824.         int     0x15
  825.         test    ah, ah
  826.         popa
  827.         pop     es
  828.         jnz     sayerr_floppy
  829. .skip:
  830.         add     dword [si+8*3+2], 512
  831.         inc     cx
  832.         cmp     cl, 19
  833.         jnz     @f
  834.         mov     cl, 1
  835.         inc     dh
  836.         cmp     dh, 2
  837.         jnz     @f
  838.         mov     dh, 0
  839.         inc     ch
  840. @@:
  841.         pop     ax
  842.         push    ax
  843.         pusha
  844. ; draw percentage
  845. ; total sectors: ax
  846. ; read sectors: bp
  847.         xchg    ax, bp
  848.         mov     cx, 100
  849.         mul     cx
  850.         div     bp
  851.         aam
  852.         xchg    al, ah
  853.         add     ax, '00'
  854.         mov     si, pros
  855.         cmp     [si], ax
  856.         jz      @f
  857.         mov     [si], ax
  858.         call    printplain
  859. @@:
  860.         popa
  861.         inc     di
  862.         cmp     di, 2880-31
  863.         jnz     .read_loop
  864.  
  865. ;        mov     cx, 0x0001      ; startcyl,startsector
  866. ;        xor     dx, dx          ; starthead,drive
  867. ;        push    word 80*2               ; read no of sect
  868. ;       reads:
  869. ;        pusha
  870. ;        xor     si,si
  871. ;       newread:
  872. ;        mov     bx,0xa000               ; es:bx -> data area
  873. ;        mov     ax,0x0200+18            ; read, no of sectors to read
  874. ;        int     0x13
  875. ;        test    ah, ah
  876. ;        jz      goodread
  877. ;        inc    si
  878. ;        cmp     si,10
  879. ;        jnz     newread
  880. ;        mov     si,badsect-0x10000
  881. ;sayerr_plain:
  882. ;        call    printplain
  883. ;        jmp     $
  884. ;       goodread:
  885. ;        ; move -> 1mb
  886. ;        mov     si,movedesc-0x10000
  887. ;        push    es
  888. ;        push    ds
  889. ;        pop     es
  890. ;        mov     cx,256*18
  891. ;        mov     ah,0x87
  892. ;        int     0x15
  893. ;        pop    es
  894. ;
  895. ;        test    ah,ah                  ; was the move successfull ?
  896. ;        je      goodmove
  897. ;        mov     dx,0x3f2              ; floppy motor off
  898. ;        mov     al,0
  899. ;        out     dx,al
  900. ;        mov     si,memmovefailed-0x10000
  901. ;        jmp    sayerr_plain
  902. ;      goodmove:
  903. ;
  904. ;    add    dword [movedesc-0x10000+0x18+2], 512*18
  905. ;        popa
  906. ;        inc     dh
  907. ;        cmp     dh,2
  908. ;        jnz     bb2
  909. ;        mov     dh,0
  910. ;        inc     ch
  911. ;        pusha                        ; print prosentage
  912. ;        mov     si,pros-0x10000
  913. ;    shr    ch, 2
  914. ;    mov    al, '5'
  915. ;    test    ch, 1
  916. ;    jnz    @f
  917. ;    mov    al, '0'
  918. ;@@:
  919. ;    mov    [si+1], al
  920. ;    shr    ch, 1
  921. ;    add    ch, '0'
  922. ;    mov    [si], ch
  923. ;        call    printplain
  924. ;        popa
  925. ;       bb2:
  926. ;        pop     ax
  927. ;        dec     ax
  928. ;        push    ax
  929. ;        jnz     reads
  930. ;       readdone:
  931. ;        pop     ax
  932.  
  933. ok_sys_on_floppy:
  934.         mov     si, backspace2
  935.         call    printplain
  936.         mov     si, okt
  937.         call    printplain
  938. no_sys_on_floppy:
  939.         xor     ax, ax          ; reset drive
  940.         xor     dx, dx
  941.         int     0x13
  942.         mov     dx, 0x3f2       ; floppy motor off
  943.         mov     al, 0
  944.         out     dx, al
  945.  
  946.  
  947. ; SET GRAPHICS
  948.  
  949.         xor     ax, ax
  950.         mov     es, ax
  951.  
  952.         mov     ax, [es:0x9008]         ; vga & 320x200
  953.         mov     bx, ax
  954.         cmp     ax, 0x13
  955.         je      setgr
  956.         cmp     ax, 0x12
  957.         je      setgr
  958.         mov     ax, 0x4f02              ; Vesa
  959. setgr:
  960.         int     0x10
  961.         test    ah, ah
  962.         mov     si, fatalsel
  963.         jnz     v_mode_error
  964. ; set mode 0x12 graphics registers:
  965.         cmp     bx, 0x12
  966.         jne     gmok2
  967.  
  968.         mov     al, 0x05
  969.         mov     dx, 0x03ce
  970.         push    dx
  971.         out     dx, al      ; select GDC mode register
  972.         mov     al, 0x02
  973.         inc     dx
  974.         out     dx, al      ; set write mode 2
  975.  
  976.         mov     al, 0x02
  977.         mov     dx, 0x03c4
  978.         out     dx, al      ; select VGA sequencer map mask register
  979.         mov     al, 0x0f
  980.         inc     dx
  981.         out     dx, al      ; set mask for all planes 0-3
  982.  
  983.         mov     al, 0x08
  984.         pop     dx
  985.         out     dx, al      ; select GDC bit mask register
  986.                            ; for writes to 0x03cf
  987. gmok2:
  988.         push    ds
  989.         pop     es
  990.