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

📄 kernel.asm

📁 MenuetOS是一个用汇编开发的32/64位PC操作系统
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;    mov   ecx , ebx
;    shr   ecx , 16
;    add   bx  , cx
;    dec   bx
;;    add   ebx , 15*65536
;    sub   bx  , 15
    mov   ecx , [edi-twdw+4]
    cmp   [esp+2],byte 2
    jne   nosxys26
    mov   ecx , [edi-twdw+0]
  nosxys26:
    mov   dx  , cx
    shl   ecx , 16
    mov   cx  , dx
    add   ebx , ecx
    mov   edi , 0
    mov   ecx , 0xc0c0c0
    mov   ebp , 13
  sysscrl21:
    pusha
    cmp   [esp+32+2],byte 2
    jne   nosxys3
    xchg  eax , ebx
  nosxys3:
    call  draw_line
    popa
    add   ecx , 0x030303
    add   eax , 0x00010001
    dec   ebp
    jnz   sysscrl21
    pop   eax
    popa



    ; Gray 1

    pusha
    push  eax
    mov   esi , scroll_grey_table
    mov   ebp , 3
    pop   edi
    shr   edi , 16
    call  scroll_transparent
    popa
    add   ebx , 3 * 65536

    ; Blue middle

    pusha
    push  eax
    mov   esi , scroll_color_table
    mov   ebp , [edi+24]
    sub   ebp , 6
    pop   edi
    shr   edi , 16
    call  scroll_transparent
    popa

    push  eax
    mov   eax , [edi+24]
    sub   eax , 6
    shl   eax , 16
    add   ebx , eax
    pop   eax

    ; Gray 2

    pusha
    push  eax
    mov   esi , scroll_grey_table
    mov   ebp , 3
    pop   edi
    shr   edi , 16
    call  scroll_transparent
    popa

    ret


scroll_transparent:

; In : ebp = size - esi = pointer to colour table - edi = vertic/horizont

    pusha
    push  edi

    mov   edi , [0x3010]
    mov   ecx , [edi-twdw]
    cmp   [esp],byte 2
    jne   noscxysw3
    mov   ecx , [edi-twdw+4]
  noscxysw3:
    add   ax  , cx
    mov   dx  , ax
    shl   eax , 16
    mov   ax  , dx

    mov   ecx , ebx
    shr   ecx , 16
    add   ecx , ebp
    dec   ecx
    mov   bx  , cx
    mov   ecx , [edi-twdw+4]
    cmp   [esp],byte 2
    jne   noscxysw2
    mov   ecx , [edi-twdw+0]
  noscxysw2:
    mov   dx  , cx
    shl   ecx , 16
    mov   cx  , dx
    add   ebx , ecx
    mov   ebp , 13
  sysscrl2:
    mov   ecx , [esi]
    and   ecx , 0xffffff
    pusha
    cmp   [esp+32],byte 2
    jne   noscxysw
    xchg  eax,ebx
  noscxysw:
    call  draw_line
    popa
    add   esi , 3
    add   eax , 0x00010001
    dec   ebp
    jnz   sysscrl2

    pop   edi
    popa

    ret


scroll_color_table:

    db    159  ,102  ,43
    db    239  ,225  ,166
    db    228  ,206  ,152
    db    220  ,191  ,134
    db    219  ,183  ,121
    db    218  ,185  ,110
    db    201  ,135  ,39
    db    212  ,163  ,46
    db    217  ,176  ,66
    db    226  ,188  ,78
    db    234  ,205  ,93
    db    231  ,204  ,90
    db    156  ,100  ,43

scroll_grey_table:

    db    159,159,159
    db    239,239,239
    db    228,228,228
    db    220,220,220
    db    219,219,219
    db    218,218,218
    db    201,201,201
    db    212,212,212
    db    217,217,217
    db    226,226,226
    db    234,234,234
    db    231,231,231
    db    156,156,156




align 4

readmousepos:

; eax=0 screen relative
; eax=1 window relative
; eax=2 buttons pressed

    test eax,eax
    jnz  nosr
    mov  eax,[0xfb0a]
    shl  eax,16
    mov  ax,[0xfb0c]
    mov  [esp+36],eax
    ret
  nosr:

    cmp  eax,1
    jnz  nowr
    mov  eax,[0xfb0a]
    shl  eax,16
    mov  ax,[0xfb0c]
    mov  esi,[0x3010]
    sub  esi,twdw
    mov  bx,[esi]
    shl  ebx,16
    mov  bx,[esi+4]
    sub  eax,ebx
    mov  [esp+36],eax
    ret
  nowr:

    cmp   eax,2
    jnz   nomb
    movzx eax,byte [0xfb40]
  nomb:
    mov   [esp+36],eax

    ret


detect_devices:

    ret


sys_end:

     mov   eax,[0x3010]
     add   eax,0xa
     mov   [eax],byte 3  ; terminate this program
    waitterm:            ; wait here for termination
     mov   eax,5
     call  delay_hs
     jmp   waitterm



sys_system:

     cmp  eax,1                              ; BOOT
     jnz  nosystemboot
     mov  eax,[0x3004]
     add  eax,2
     mov  [shutdown_processes],eax
     mov  [0xFF00],al
     mov  eax,0
     ret
   shutdown_processes: dd 0x0
   nosystemboot:

     cmp  eax,2                              ; TERMINATE
     jnz  noprocessterminate
     cmp  ebx,2
     jb   noprocessterminate
     mov  edx,[0x3004]
     cmp  ebx,edx
     jg   noprocessterminate
     mov  eax,[0x3004]
     shl  ebx,5
     mov  edx,[ebx+0x3000+4]
     add  ebx,0x3000+0xa
     mov  [ebx],byte 3       ; clear possible i40's

     cmp  edx,[application_table_status]    ; clear app table stat
     jne  noatsc
     mov  [application_table_status],0
   noatsc:

     ret
   noprocessterminate:

     cmp  eax,3                              ; ACTIVATE WINDOW
     jnz  nowindowactivate
     cmp  ebx,2
     jb   nowindowactivate
     cmp  ebx,[0x3004]
     jg   nowindowactivate
     ; edi = position at window_data+
     mov  edi,ebx
     shl  ebx,1
     add  ebx,0xc000
     mov  esi,[ebx]
     and  esi,0xffff
     movzx edx,word [0x3004]
     cmp  esi,edx
     jz   nowindowactivate
     mov  [0xff01],edi
     mov  eax,0
     ret
   nowindowactivate:

     cmp  eax,4                              ; GET IDLETIME
     jnz  nogetidletime
     mov  eax,[idleusesec]
     ret
   nogetidletime:

     cmp  eax,5                              ; GET TSC/SEC
     jnz  nogettscsec
     mov  eax,[0xf600]
     ret
   nogettscsec:

     ret

sys_cd_audio:

     cmp  word [cdbase],word 0
     jnz  cdcon
     mov  eax,1
     ret
   cdcon:

     ; eax=1 cdplay at ebx 0x00FFSSMM
     ; eax=2 get tracklist size of ecx to [ebx]
     ; eax=3 stop/pause playing

     cmp  eax,1
     jnz  nocdp
     call sys_cdplay
     ret
   nocdp:

     cmp eax,2
     jnz nocdtl
     mov edi,[0x3010]
     add edi,0x10
     add ebx,[edi]
     call sys_cdtracklist
     ret
   nocdtl:

     cmp eax,3
     jnz nocdpause
     call sys_cdpause
     ret
   nocdpause:

     mov eax,0xffffff01
     ret



sys_cd_atapi_command:

     pusha

     mov  dx,word [cdbase]
     add  dx,6
     mov  ax,word [cdid]
     out  dx,al
     mov  esi,10
     call delay_ms
     mov  dx,word [cdbase]
     add  dx,7
     in   al,dx
     and  al,0x80
     cmp  al,0
     jnz  res
     jmp  cdl6
   res:
     mov dx,word [cdbase]
     add dx,7
     mov al,0x8
     out dx,al
     mov dx,word [cdbase]
     add dx,0x206
     mov al,0xe
     out dx,al
     mov  esi,1
     call delay_ms
     mov dx,word [cdbase]
     add dx,0x206
     mov al,0x8
     out dx,al
     mov  esi,30
     call delay_ms
     xor  cx,cx
   cdl5:
     inc  cx
     cmp  cx,10
     jz   cdl6
     mov  dx,word [cdbase]
     add  dx,7
     in   al,dx
     and  al,0x88
     cmp  al,0x00
     jz   cdl5
     mov  esi,100
     call delay_ms
     jmp  cdl5
   cdl6:
     mov dx,word [cdbase]
     add dx,4
     mov al,0
     out dx,al
     mov dx,word [cdbase]
     add dx,5
     mov al,0
     out dx,al
     mov dx,word [cdbase]
     add dx,7
     mov al,0xec
     out dx,al
     mov  esi,5
     call delay_ms
     mov dx,word [cdbase]
     add dx,1
     mov al,0
     out dx,al
     add dx,1
     mov al,0
     out dx,al
     add dx,1
     mov al,0
     out dx,al
     add dx,1
     mov al,0
     out dx,al
     add dx,1
     mov al,128
     out dx,al
     add dx,2
     mov al,0xa0
     out dx,al
     xor  cx,cx
     mov  dx,word [cdbase]
     add  dx,7
   cdl1:
     inc  cx
     cmp  cx,100
     jz   cdl2
     in   al,dx
     and  ax,0x88
     cmp  al,0x8
     jz   cdl2
     mov  esi,2
     call delay_ms
     jmp  cdl1
   cdl2:

     popa
     ret


sys_cdplay:

     mov  ax,5
     push ax
     push ebx
   cdplay:
     call sys_cd_atapi_command
     cli
     mov  dx,word [cdbase]
     mov  ax,0x0047
     out  dx,ax
     mov  al,1
     mov  ah,[esp+0] ; min xx
     out  dx,ax
     mov  ax,[esp+1] ; fr sec
     out  dx,ax
     mov  ax,256+99
     out  dx,ax
     mov  ax,0x0001
     out  dx,ax
     mov  ax,0x0000
     out  dx,ax
     mov  esi,10
     call delay_ms
     sti
     add  dx,7
     in   al,dx
     test al,1
     jz   cdplayok
     mov  ax,[esp+4]
     dec  ax
     mov  [esp+4],ax
     cmp  ax,0
     jz   cdplayfail
     jmp  cdplay
   cdplayfail:
   cdplayok:
     pop  ebx
     pop  ax
     mov  eax,0
     ret


sys_cdtracklist:

     push ebx
   tcdplay:
     call sys_cd_atapi_command
     mov  dx,word [cdbase]
     mov  ax,0x43+2*256
     out  dx,ax
     mov  ax,0x0
     out  dx,ax
     mov  ax,0x0
     out  dx,ax
     mov  ax,0x0
     out  dx,ax
     mov  ax,200
     out  dx,ax
     mov  ax,0x0
     out  dx,ax
     in   al,dx
     mov  cx,1000
     mov  dx,word [cdbase]
     add  dx,7
     cld
   cdtrnwewait:
     mov  esi,10
     call delay_ms
     in   al,dx
     and  al,128
     cmp  al,0
     jz   cdtrl1
     loop cdtrnwewait
   cdtrl1:
     ; read the result
     mov  ecx,[esp+0]
     mov  dx,word [cdbase]
   cdtrread:
     add  dx,7
     in   al,dx
     and  al,8
     cmp  al,8
     jnz  cdtrdone
     sub  dx,7
     in   ax,dx
     mov  [ecx],ax
     add  ecx,2
     jmp  cdtrread
   cdtrdone:
     pop  ecx
     mov  eax,0
     ret


sys_cdpause:

     call sys_cd_atapi_command

     mov  dx,word [cdbase]
     mov  ax,0x004B
     out  dx,ax
     mov  ax,0
     out  dx,ax
     mov  ax,0
     out  dx,ax
     mov  ax,0
     out  dx,ax
     mov  ax,0
     out  dx,ax
     mov  ax,0
     out  dx,ax

     mov  esi,10
     call delay_ms
     add  dx,7
     in   al,dx

     mov  eax,0
     ret


sys_cachetodiskette:
    pusha
    cmp  eax,1
    jne  no_write_all_of_ramdisk
    call fdc_writeramdisk
    popa
    ret
  no_write_all_of_ramdisk:
    cmp eax,2
    jne no_write_part_of_ramdisk
    call fdc_commitflush
    popa
    ret
  no_write_part_of_ramdisk:
    cmp  eax,3
    jne  no_set_fdc
    call fdc_set
    popa
    ret
  no_set_fdc:
    cmp  eax,4
    jne  no_get_fdc
    popa
    call fdc_get
    mov    [esp+36],ecx
    ret
   no_get_fdc:
                                popa
    ret


bgrchanged  dd  0x0

sys_background:

    cmp   eax,1                            ; BACKGROUND SIZE
    jnz   nosb1
    cmp   ebx,0
    je    sbgrr
    cmp   ecx,0
    je    sbgrr
    mov   [0x400000-8],ebx
    mov   [0x400000-4],ecx
    mov   [bgrchanged],1
  sbgrr:
    ret
  nosb1:

    cmp   eax,2                            ; SET PIXEL
    jnz   nosb2
    mov   edx,0x100000-16
    cmp   edx,ebx
    jbe   nosb2
    mov   edx,[ebx]
    and   edx,255*256*256*256
    and   ecx,255*256*256+255*256+255
    add   edx,ecx
    mov  

⌨️ 快捷键说明

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