⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bootcode.inc

📁 Menuet 操作系统源代码。 非常难得的东西
💻 INC
📖 第 1 页 / 共 2 页
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                        ;;
;;  BOOTCODE.INC                                          ;;
;;                                                        ;;
;;  16 bit bootcode for MenuetOS                          ;;
;;                                                        ;;
;;  Copyright 2002 Ville Turjanmaa                        ;;
;;                                                        ;;
;;  See file COPYING for details                          ;;
;;                                                        ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   
   
   
;==========================================================================
;
;                           16 BIT FUNCTIONS
;
;==========================================================================
   
print:       push  si
             mov   si,leftpr-0x10000
             call  printplain
             pop   si
   
printplain:  pusha
             mov   dx,0x1000
             mov   es,dx
             cmp   byte [es:display_atboot-0x10000],2
             je    printplain_exit
             mov   ds,dx
             cld
             lodsb
           prpl1:
             mov   ah,0xe
             xor   bh,bh
             int   0x10
             lodsb
             cmp   al,0
             jne   prpl1
           printplain_exit:
             popa
             ret
   
setbase1000: push ax
             mov  ax,0x1000
             mov  es,ax
             mov  ds,ax
             pop  ax
             ret
   
getkey:      push  ecx
             push  edx
             add   ebx,0x0101
             xor   eax,eax
   
           gk1:
             in    al,0x60
             mov   cl,al
           gk0:
             in    al,0x60
             cmp   al,cl
             je    gk0
             cmp   ax,11
             jg    gk0
             mov   cl,al
   
             add   al,47
             mov   [ds:keyinbs-0x10000],al
             mov   si,keyinbs-0x10000
             call  printplain
   
           gk12:
             in    al,0x60
             cmp   al,cl
             je    gk12
             cmp   ax,240
             jne   gk13
             mov   al,cl
             jmp   gk14
           gk13:
             add   cl,128
             cmp   al,cl
             jne   gk1
             sub   al,128
           gk14:
   
             movzx edx,bl
             cmp   eax,edx
             jb    gk1
             movzx edx,bh
             cmp   eax,edx
             jg    gk1
             test  ebx,0x010000
             jnz   gk3
             mov   cx,0x1000
             mov   dx,cx
             add   eax,47
             mov   cx,ax
             cmp   cx,58
             jb    gk_nozero
             sub   cx,10
           gk_nozero:
             mov   [ds:keyin-0x10000],cl
             mov   si,keyin-0x10000
             call  printplain
           gk3:
             sub   eax,48
             pop   edx
             pop   ecx
             ret
   
   
;=========================================================================
;
;                           16 BIT CODE
;
;=========================================================================
   
   
start_of_code:
   
; DRAW FRAMES
   
        cmp  byte [es:display_atboot-0x10000],2
        je   no_frames_atboot
   
        mov  ax,0x0003
        mov  bx,0x0000
        mov  dx,0x0000
        int  0x10
        call setbase1000
        mov  ax,0xb800
        mov  es,ax
        mov  di,0
        mov  si,d80x25-0x10000
        mov  cx,80*25
        mov  ah,1*16+15
       dfl1:
        cld
        lodsb
        stosw
        loop dfl1
   
      no_frames_atboot:
   
        call setbase1000
   
   
; SAY HI TO USER
   
        mov     si,linef2-0x10000
        call    printplain
        mov     si,version-0x10000
        call    print
   
   
; TEST FOR 386+
   
        pushf
        pop     ax
        mov     dx,ax
        xor     ax,0x4000
        push    ax
        popf
        pushf
        pop     ax
        and     ax,0x4000
        and     dx,0x4000
        cmp     ax,dx
        jnz     cpugood
        mov     si,not386-0x10000
        call    print
        jmp     $
     cpugood:
   
   
; FLUSH 8042 KEYBOARD CONTROLLER
   
        mov     ecx,10000
       fl1:
        in      al,0x64
        loop    fl1
        test    al,1
        jz      fl2
        in      al,0x60
        jmp     fl1
       fl2:
   
   
; DISPLAY VESA INFORMATION
   
        mov     ax,0x0
        mov     es,ax
        mov     ax,0x4f00
        mov     di,0xa000
        int     0x10
        cmp     ax,0x004f
        je      vesaok2
        mov     dx,0x1000
        mov     es,dx
        mov     si,novesa-0x10000
        call    print
        mov     ax,16
        jmp     novesafound
       vesaok2:
        mov     ax,[es:di+4]
        mov     dx,ax
        add     ax,48*256+48
        push    word 0x1000
        pop     es
        mov     [es:vervesa+19-0x10000],ah
        mov     [es:vervesa+21-0x10000],al
        mov     si,vervesa-0x10000
        call    print
      novesafound:
        call    setbase1000
   
   
; ASK GRAPHICS MODE
   
        movzx   eax,byte [es:preboot_graph-0x10000]
        cmp     eax,0
        jne     pre_graph
        mov     si,gr_mode-0x10000
        call    printplain
       gml0:
        mov     ebx,0x0A01
        call    getkey
       pre_graph:
        cmp     eax,1
        jl      sgml1
        cmp     eax,8
        jg      sgml1
        mov     si,ax
        sub     si,1
        shl     si,4
        add     si,gr_table-0x10000
        mov     bx,[es:si+0]
        mov     cx,[es:si+4]
        mov     dx,[es:si+8]
        jmp     gml10
       sgml1:
        cmp     al,9
        jnz     gml00
        mov     bx,0x13
        mov     cx,640
        mov     dx,480
        push    word 0x0
        pop     es
        mov     [es:0x9000],byte 32
        push    word 0x1000
        pop     es
        jmp     gml10
       gml00:
        cmp     al,0xa
        jnz     gml02
        mov     bx,0x12
        mov     cx,640
        mov     dx,480
        push    word 0x0
        pop     es
        mov     [es:0x9000],byte 32
        push    word 0x1000
        pop     es
        jmp     gml10
       gml02:
        jmp     gml0
       gr_table:
        dd      0x112+0100000000000000b ,  640 ,  480 , 0
        dd      0x115+0100000000000000b ,  800 ,  600 , 0
        dd      0x118+0100000000000000b , 1024 ,  768 , 0
        dd      0x11B+0100000000000000b , 1280 , 1024 , 0
        dd      0x112 ,  640 , 480 , 0
        dd      0x115 ,  800 , 600 , 0
        dd      0x118 , 1024 , 768 , 0
        dd      0x11B , 1280 ,1024 , 0
       gml10:
        push    word 0x0000
        pop     es
        mov     [es:0x9008],bx
        mov     [es:0x900A],cx
        mov     [es:0x900C],dx
        push    word 0x1000
        pop     es
        mov     ax,32
        cmp     bx,0x13
        je      nov
        cmp     bx,0x12
        je      nov
   
   
   
; FIND VESA 2.0 LFB & BPP
   
        mov     ax,0x4f01
        mov     cx,bx
        and     cx,0xfff
        push    word 0x0000
        pop     es
        mov     di,0xa000
        int     0x10
        ; LFB
        mov     ecx,[es:di+0x28]
        mov     [es:0x9018],ecx
        push    ecx
        ; BPP
        movzx   ax,byte [es:di+0x19]
        mov     [es:0x9000],ax
        ; ---- vbe voodoo
        BytesPerScanLine equ 0x10
        push ax
        mov ax, [es:di+BytesPerScanLine]
        mov [es:0x9001],ax
        pop ax
        ; -----
       nov:
        cmp     ax,24
        jnz     nbpp24
        mov     si,bt24-0x10000
        jmp     bppl
       nbpp24:
        cmp     ax,32
        jnz     nbpp32
        mov     si,bt32-0x10000
        jmp     bppl
       nbpp32:
        mov     si,btns-0x10000
        call    print
        jmp     $
       bppl:
        call    printplain
   
   
; FIND VESA 1.2 PM BANK SWITCH ADDRESS
   
        mov     ax,0x4f0A
        mov     bx,0x0
        int     0x10
        xor     eax,eax
        xor     ebx,ebx
        mov     ax,es
        shl     eax,4
        mov     bx,di
        add     eax,ebx
        xor     ebx,ebx
        mov     bx,[es:di]
        add     eax,ebx
        push    word 0x0
        pop     es
        mov     [es:0x9014],eax
        push    word 0x1000

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -