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

📄 kernel.asm

📁 Menuet 操作系统源代码。 非常难得的东西
💻 ASM
📖 第 1 页 / 共 5 页
字号:

; LOAD FIRST APPLICATION

        mov   [0x3000],dword 1
        mov   [0x3004],dword 1

        mov   eax,firstapp           
        call  start_application_fl

        mov   [0x3004],dword 2
        mov   [0x3000],dword 0


; START MULTITASKING

        mov   esi,boot_tasking
        call  boot_log

        mov   [0xe000],byte 1        ; multitasking enabled


; UNMASK ALL IRQ'S
   
        mov   esi,boot_allirqs
        call  boot_log
        
        mov   al,0
        out   0xA1,al
        out   0x21,al

        sti
        jmp   $                      ; wait here for timer to take control
   
        ; Fly :)

   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                    ;
;                         MAIN OS LOOP                               ;
;                                                                    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

osloop:

        call   checkmouse
        call   checkbuttons
        call   checkwindows
        call   checkmisc
        call   checkEgaCga
        call   stack_handler
        call   checkidle

        jmp    osloop

checkidle:
   
        pusha
   
        cmp  [check_idle_semaphore],0
        jne  no_idle_state
   
        call change_task
        mov  eax,[idlemem]
        mov  ebx,[0xfdf0]
        cmp  eax,ebx
        jnz  idle_exit
        call _rdtsc
        mov  ecx,eax
      idle_loop:
        mov  eax,[0xfdf0]
        cmp  ebx,eax
        jz   idle_loop
        mov  [idlemem],eax
        call _rdtsc
        sub  eax,ecx
        mov  ebx,[idleuse]
        add  ebx,eax
        mov  [idleuse],ebx
   
        popa
        ret
   
      idle_exit:
   
        mov  ebx,[0xfdf0]
        mov  [idlemem],ebx
        call change_task
   
        popa
        ret
   
      no_idle_state:
   
        dec  [check_idle_semaphore]
   
        mov  ebx,[0xfdf0]
        mov  [idlemem],ebx
        call change_task
   
        popa
        ret
   
idlemem               dd   0x0
idleuse               dd   0x0
idleusesec            dd   0x0
check_idle_semaphore  dd   0x0

   
   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                      ;
;                   INCLUDED SYSTEM FILES                              ;
;                                                                      ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   
   
include "KERNEL32.INC"
   

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                      ;
;                       KERNEL FUNCTIONS                               ;
;                                                                      ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   
enable_mtrr:
   
        pusha
   
        cmp    [0x2f0000+0x901c],byte 2
        je     no_mtrr
        mov    eax,[0xFE0C]                ; if no LFB then no MTRR
        test   eax,0100000000000000b
        jz     no_mtrr
        mov    edx,[cpuid_1+3*4]           ; edx - MTRR's supported ?
        test   edx,1000000000000b
        jz     no_mtrr
        call   find_empty_mtrr
        cmp    ecx,0
        jz     no_mtrr
        mov    esi,boot_mtrr               ; 'setting mtrr'
        call   boot_log
        mov    edx,0x0                     ; LFB , +8 M , write combine
        mov    eax,[0x2f9018]
        or     eax,1
        wrmsr
        inc    ecx
        mov    edx,0xf
        mov    eax,0xff800800
        wrmsr
        mov    ecx,0x2ff                   ; enable mtrr's
        rdmsr
        or     eax,100000000000b           ; set
        wrmsr
     no_mtrr:
   
        popa
        ret
   
setwindowdefaults:
   
        pusha
   
        xor   eax,eax
        mov   ecx,0xc000
       swdl:
        inc   eax
        add   ecx,2
        mov   [ecx+0x000],ax          ; process no
        mov   [ecx+0x400],ax          ; positions in stack
        cmp   ecx,0xc400-2            ; the more high, the more surface
        jnz   swdl
   
        popa
        ret
   
find_empty_mtrr:  ; 8 pairs checked
   
        mov    ecx,0x201-2
      mtrr_find:
        add    ecx,2
        cmp    ecx,0x200+8*2
        jge    no_free_mtrr
        rdmsr
        test   eax,0x0800
        jnz    mtrr_find
        dec    ecx
        ret
      no_free_mtrr:
        mov    ecx,0
        ret
   
reserve_irqs_ports:
   
        pusha
   
        mov  [irq_owner+4*0],byte 1    ; timer
        mov  [irq_owner+4*1],byte 1    ; keyboard
        mov  [irq_owner+4*5],byte 1    ; sound blaster
        mov  [irq_owner+4*6],byte 1    ; floppy diskette
        mov  [irq_owner+4*13],byte 1   ; math co-pros
        mov  [irq_owner+4*14],byte 1   ; ide I
        mov  [irq_owner+4*15],byte 1   ; ide II
        movzx eax,byte [0xf604]        ; mouse irq
        dec   eax
        add   eax,mouseirqtable
        movzx eax,byte [eax]
        shl   eax,2
        mov   [irq_owner+eax],byte 1
   
   
                                       ; RESERVE PORTS
        mov   edi,1                    ; 0x00-0xff
        mov   [0x2d0000],edi
        shl   edi,4
        mov   [0x2d0000+edi+0],dword 1
        mov   [0x2d0000+edi+4],dword 0x0
        mov   [0x2d0000+edi+8],dword 0xff
        cmp   [0xf604],byte 2          ; com1 mouse -> 0x3f0-0x3ff
        jne   ripl1
        inc   dword [0x2d0000]
        mov   edi,[0x2d0000]
        shl   edi,4
        mov   [0x2d0000+edi+0],dword 1
        mov   [0x2d0000+edi+4],dword 0x3f0
        mov   [0x2d0000+edi+8],dword 0x3ff
      ripl1:
        cmp   [0xf604],byte 3          ; com2 mouse -> 0x2f0-0x2ff
        jne   ripl2
        inc   dword [0x2d0000]
        mov   edi,[0x2d0000]
        shl   edi,4
        mov   [0x2d0000+edi+0],dword 1
        mov   [0x2d0000+edi+4],dword 0x2f0
        mov   [0x2d0000+edi+8],dword 0x2ff
      ripl2:
   
        popa
        ret
   
mouseirqtable   db  12    ; ps2
                db  4     ; com1
                db  3     ; com2
   
setirqreadports:
   
        mov   [irq12read+0],dword 0x60 + 0x01000000  ; read port 0x60 , byte
        mov   [irq12read+4],dword 0                  ; end of port list
        mov   [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte
        mov   [irq04read+4],dword 0                  ; end of port list
        mov   [irq03read+0],dword 0x2f8 + 0x01000000 ; read port 0x2f8 , byte
        mov   [irq03read+4],dword 0                  ; end of port list
   
        ret
   
process_number dd 0x1
novesachecksum dd 0x0
   
checkEgaCga:
   
        cmp    [0xfe0c],dword 0x13
        je     cnvl
        ret
      cnvl:
   
        pusha
        mov    ecx,[0xfb0a]
        cmp    ecx,[novesachecksum]
        jne    novesal
        popa
        ret
   
      novesal:
        mov    [novesachecksum],ecx
        mov    ecx,0
        movzx  eax,word [0xfb0c]
        cmp    eax,100
        jge    m13l3
        mov    eax,100
      m13l3:
        cmp    eax,480-100
        jbe    m13l4
        mov    eax,480-100
      m13l4:
        sub    eax,100
        imul   eax,640*4
        add    ecx,eax
        movzx  eax,word [0xfb0a]
        cmp    eax,160
        jge    m13l1
        mov    eax,160
      m13l1:
        cmp    eax,640-160
        jbe    m13l2
        mov    eax,640-160
      m13l2:
        sub    eax,160
        shl    eax,2
        add    ecx,eax
        mov    esi,[0xfe80]
        add    esi,ecx
        mov    edi,0xa0000
        mov    edx,200
        mov    ecx,320
        cld
     m13pix:
        lodsd
        push   eax
        mov    ebx,eax
        and    eax,(128+64+32)      ; blue
        shr    eax,5
        and    ebx,(128+64+32)*256  ; green
        shr    ebx,8+2
        add    eax,ebx
        pop    ebx
        and    ebx,(128+64)*256*256 ; red
        shr    ebx,8+8
        add    eax,ebx
        stosb
        loop   m13pix
        mov    ecx,320
        add    esi,4*(640-320)
        dec    edx
        jnz    m13pix
   
        popa
        ret
   
   
palette320x200:
   
       mov   edx,0x3c8
       xor   eax,eax
       out   dx,al
       mov   ecx,256
       mov   edx,0x3c9
       xor   eax,eax
   
     palnew:
       mov   al,0
       test  ah,64
       jz    pallbl1
       add   al,21
     pallbl1:
       test  ah,128
       jz    pallbl2
       add   al,42
     pallbl2:
       out   dx,al
       mov   al,0
       test  ah,8
       jz    pallbl3
       add   al,8
     pallbl3:
       test  ah,16
       jz    pallbl4
       add   al,15
     pallbl4:
       test  ah,32
       jz    pallbl5
       add   al,40
     pallbl5:
       out   dx,al
       mov   al,0
       test  ah,1
       jz    pallbl6
       add   al,8
     pallbl6:
       test  ah,2
       jz    pallbl7
       add   al,15
     pallbl7:
       test  ah,4
       jz    pallbl8
       add   al,40
     pallbl8:
       out   dx,al
       add   ah,1
       loop  palnew
   
       ret
   
set_variables:
   
        mov   ecx,0x100                       ; flush port 0x60
.fl60:  in    al,0x60
        loop  .fl60
        mov   [0xfcff],byte 0                 ; mouse buffer
        mov   [0xf400],byte 0                 ; keyboard buffer
        mov   [0xf500],byte 0                 ; button buffer
        mov   [0xfb0a],dword 100*65536+100    ; mouse x/y
        mov   byte [SB16_Status],0            ; Minazzi Paolo
        mov   [0x400000-12],dword 1           ; tiled background
        mov   [0xfe88],dword 0x2C0000         ; address of button list
   
        call  stack_init
   
        ret
   
align 4
   
sys_outport:
   
    mov   ecx,[0x2d0000]
    test  ecx,ecx
    jne   sopl8
    mov   [esp+36],dword 1
    ret
   
  sopl8:
    mov   edx,[0x3010]
    mov   edx,[edx+0x4]
    and   ebx,65535
    cld
  sopl1:
   
    mov   esi,ecx
    shl   esi,4
    add   esi,0x2d0000
    cmp   edx,[esi+0]
    jne   sopl2
    cmp   ebx,[esi+4]
    jb    sopl2
    cmp   ebx,[esi+8]
    jg    sopl2
    jmp   sopl3
   
  sopl2:
   
    dec   ecx
    jnz   sopl1
    mov   [esp+36],dword 1
    ret
   
  sopl3:
   
    mov   dx,bx
    out   dx,al
    mov   [esp+36],dword 0
    ret
   
checkscreenpixel:
   
    mov   esi,[0x3004]
    inc   esi
   
  sciloop:
   
    cmp   esi,2
    jg    scic3
    mov   ecx,1          ; os pixel
    ret
   
  scic3:
   
    dec   esi
   
    mov   ecx,esi
    shl   ecx,1
    add   ecx,0xc400
    movzx edx,word [ecx]
    mov   edi,edx
    shl   edi,5
    add   edi,0x2000
    mov   ecx,[edi+0]
    mov   edx,[edi+4]
    cmp   ecx,eax
    jbe   sci1
    jmp   sciloop
  sci1:
    cmp   edx,ebx
    jbe   sci2
    jmp   sciloop
  sci2:
    add   ecx,[edi+8]
    add   edx,[edi+12]
    cmp   eax,ecx
    jbe   sci3
    jmp   sciloop
  sci3:
    cmp   ebx,edx
    jbe   sci4
    jmp   sciloop
  sci4:
   
    mov   ecx,esi
    shl   ecx,1
    movzx ecx,word [ecx+0xc400]       ; process of pixel
   
    ; check that the process has a rectangle window
   
    mov   edx,ecx
    shl   edx,8
    add   edx,0x80000+0x80
    cmp   [edx],dword 0
    je    rect_shaped
   
  rand_shaped:
   
    pusha
   
    sub   eax,[edi+0]
    sub   ebx,[edi+4]
    push  ecx
    mov   ecx,[edx+4]
    shr   eax,cl
    shr   ebx,cl
    mov   esi,[edi+8]
    add   esi,1
    shr   esi,cl
    imul  ebx,esi
    add   eax,ebx
    add   eax,[edx]
    pop   ecx
    mov   edx,ecx
    shl   edx,5
    add   eax,[edx+0x3000+0x10]
    cmp   [eax],byte 1
    je    rand_window_pixel
   
    popa
    jmp   sciloop
   
  rand_window_pixel:
   
    popa
   
  rect_shaped:
   
    shl   ecx,5
    add   ecx,0x3000
    movzx ecx,byte [ecx+0xe]   ; screen id of process
   
    ret
   
   
calculatescreen:
   
;  eax  x start
;  ebx  y start
;  ecx  x end
;  edx  y end
   
     pusha
     push eax
   
   csp1:
   
     push ecx
     push edx
     push eax
     push ebx
   
     call checkscreenpixel
   
     mov  eax,[esp+4]
     mov  ebx,[esp+0]
     mov  esi,eax
     mov  eax,[0xfe00]
     inc  eax
     mul  ebx
     add  eax,esi
     add  eax,0x400000
     mov  [eax],cl
   
     pop  ebx
     pop  eax
     pop  edx
     pop  ecx
   
     inc  eax
     cmp  eax,ecx
     jbe  csp1
     mov  eax,[esp]
     inc  ebx
     cmp  ebx,edx
     jbe  csp1
   
     pop  eax
     popa
     ret
   
   
setscreen:
   
;  eax  x start
;  ebx  y start
;  ecx  x end
;  edx  y end
   
     pusha
   
     push esi
     push eax
   
   csp11:
   
     push eax
     push ebx
     push ecx
     push edx
   
     mov  esi,eax
     mov  eax,[0xfe00]
     inc  eax
     mul  ebx
     add  eax,esi
     add  eax,0x400000
   
     mov  cl,[esp+20]

⌨️ 快捷键说明

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