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

📄 kernel.asm

📁 MenuetOS是一个用汇编开发的32/64位PC操作系统
💻 ASM
📖 第 1 页 / 共 5 页
字号:
     mov  eax,keymap_alt
     mov  ecx,128
     call memmove
     ret
   kbnoaltret:
     cmp  ebx,9
     jnz  ngsyse2
     movzx eax,word [keyboard]
     mov  [esp+36],eax
     ret
   ngsyse2:

     cmp  eax,3
     jnz  ngsyse3
     mov  [esp+36],dword 0
     ret
   ngsyse3:

     cmp  eax,4
     jne  ngsyse4
     mov  [esp+36],dword 0
     ret
   ngsyse4:

     cmp  eax,5
     jnz  ngsyse5
     mov  eax,[syslang]
     mov  [esp+36],eax
     ret
   ngsyse5:

     cmp  eax,9
     jne  ngsyse9
     mov  eax,[0xfdf0]
     mov  edi,[0x3000]
     imul edi,256
     add  edi,0x80000
     cmp  [edi],dword 0x4B415551
     je   ftl1
     cmp  [edi+3],dword 0x4B415551
     je   ftl1
     jmp  ftl2
   ftl1:
     imul eax , 2
   ftl2:
     mov  [esp+36],eax
     ret
   ngsyse9:

     mov  [esp+36],dword 1
     ret

scroll_step  equ 32
scroll_base  equ 0xDA0000
scroll_max   equ 2000

scroll_top:  dd  0x0

scrolling: dd 0x0

align 4

check_scrolls:

    mov   [scrolling],byte 0

  chcsl9:

    cmp   [0xfb40],byte 0
    je    chcsl1

    mov   esi , [0x3004]
    shl   esi , 1
    add   esi , 0xc400
    movzx esi , word [esi]

    mov   ebp , 0
    mov   edi , scroll_base

    mov   [esisave],esi

  check_scroll_list:

    ; Process slot

    mov   esi , [esisave]

    mov   [edisave],edi

    cmp   [edi+20],esi
    jne   new_scroll_check ; chcsl1

    shl   esi , 5
    add   esi , window_data

    ; 0xfb40 - buttons
    ; 0xfb0a - word x
    ; 0xfb0c - word y

    ; X

 ;   mov   eax , [edi+0]
 ;   and   eax , 0xffff
 ;   add   eax , [esi+0]

    mov   eax , [esi+0]
    cmp   [edi+2],byte 2
    jne   chscrl12
    mov   eax , [esi+4]
  chscrl12:
    add   eax , [edi+0]
    and   eax , 0xffff
    mov   ebx , eax
    add   ebx , 13
    movzx ecx , word [0xfb0a]
    cmp   [edi+2],byte 2
    jne   chscrl1
    movzx ecx , word [0xfb0c]
  chscrl1:
    cmp   [scrolling],byte 1
    je    chcsl95
    cmp   ecx , eax
    jb    new_scroll_check ; chcsl1
    cmp   ecx , ebx
    ja    new_scroll_check ; chcsl1
  chcsl95:

    ; Y

 ;   mov   eax , [edi+4+2]
 ;   and   eax , 0xffff
 ;   add   eax , [esi+4]

    mov   eax , [esi+4]
    cmp   [edi+2],byte 2
    jne   chscrl14
    mov   eax , [esi+0]
  chscrl14:
    add   eax , [edi+4+2]
    and   eax , 0xffff

    mov   ebx , [edi+4]
    and   ebx , 0xffff
    add   ebx , eax
    movzx ecx , word [0xfb0c]
    cmp   [edi+2],byte 2
    jne   chscrl2
    movzx ecx , word [0xfb0a]
  chscrl2:
    cmp   [scrolling],byte 1
    je    chcsl96
    cmp   ecx , eax
    jb    new_scroll_check ; chcsl1
    cmp   ecx , ebx
    ja    new_scroll_check ; chcsl1
  chcsl96:

    jmp   scrfoundl1

    esisave: dd 0x0
    edisave: dd 0x0

  new_scroll_check:

    add   edi , scroll_step

    inc   ebp
    cmp   ebp , [scroll_top]
    jbe   check_scroll_list

    jmp   chcsl1 ; no scrolls found

  scrfoundl1:

  more_scroll:

    mov   edi , [edisave]

    mov   esi , [esisave]
    shl   esi , 5
    add   esi , window_data

;    mov   eax , [edi+4+2]
;    and   eax , 0xffff
;    add   eax , [esi+4]
;    mov   ebx , [edi+4]
;    and   ebx , 0xffff
;    add   ebx , eax

    mov   eax , [esi+4]
    cmp   [edi+2],byte 2
    jne   chscrl142
    mov   eax , [esi+0]
  chscrl142:
    add   eax , [edi+4+2]
    and   eax , 0xffff

    mov   ebx , [edi+4]
    and   ebx , 0xffff
    add   ebx , eax

    movzx ecx , word [0xfb0c]
    cmp   [edi+2],byte 2
    jne   chscrl22
    movzx ecx , word [0xfb0a]
  chscrl22:

    mov   esi , [esisave]

    mov   ebp , edi

    ;;;;;

    add   eax , 15
    sub   ebx , 15

    cmp   [scrolling],byte 1
    je    chcsl97

    ; Top button

    cmp   ecx , eax
    ja    chcsl32
    mov   eax , [ebp+16]
    dec   eax
    jmp   chcsl3
  chcsl32:

    ; Low button

    cmp   ecx , ebx
    jb    chcsl33
    mov   eax , [ebp+16]
    inc   eax
    jmp   chcsl3
  chcsl33:

  chcsl97:

    ; Read glider 

    movzx ecx , word [0xfb0c]
    cmp   [edi+2],byte 2
    jne   chscrl3
    movzx ecx , word [0xfb0a]
  chscrl3:

    cmp   ecx , eax     ; Below lowest point
    jae   scroll_fine_1
    mov   eax , ecx
    jmp   scrolljmp
  scroll_fine_1:
    push  eax
    mov   eax , [edi+24]
    shr   eax , 1
    sub   ecx , eax  ; glider size / 2
    pop   eax
  scrolljmp:

    cmp   ecx , eax     ; Below lowest point
    jae   scroll_fine_11
    mov   eax , ecx
  scroll_fine_11:

    sub   ecx , eax
    mov   eax , ecx

    mov   edi , [ebp+4]
    and   edi , 0xffff
    sub   edi , 15+15                 ; Heads
    sub   edi , [ebp+24]              ; Glider size
                                      ; edi = Glide area from:to

    imul  eax , [ebp+12]
    xor   edx , edx
    cmp   edi , 0
    jne   noediz
    mov   edi , 1
  noediz:
    div   edi
    add   eax , [ebp+8]

    push  ebx  ; Above highest point
    mov   ebx , [ebp+8]
    add   ebx , [ebp+12]
    dec   ebx
    cmp   eax , ebx
    jbe   scroll_fine_2
    mov   eax , ebx
  scroll_fine_2:
    pop   ebx

    cmp   eax , [ebp+16]
    je    chcsl4
    mov   [0xf500],byte 1
    mov   [0xf501],eax
  chcsl4:

    mov   eax , 1
    call  delay_hs
    call  osloop_without_gui_response

    mov   [scrolling],byte 1

    cmp   [0xfb40],byte 0
    jne   more_scroll ; chcsl9

    mov   [scrolling],byte 0

    jmp   chcsl1

  chcsl3:

    mov   [0xf500],byte 1
    mov   [0xf501],eax

  chcsl2:
    mov   eax , 1
    call  delay_hs
    call  osloop_without_gui_response
    cmp   [0xfb40],byte 0
    jne   chcsl2

  chcsl1:

    ret

remove_scrolls:

; In : edx = Process slot

    pusha

    mov   edi , scroll_base
    mov   ebp , scroll_max
  remscrl1:
    cmp  [edi+20],edx
    jne   remscrl2
    mov  [edi+20],dword 0
  remscrl2:

    add   edi , scroll_step
    dec   ebp
    jnz   remscrl1

    popa

    ret


check_scroll_table:

; Out : free address or current address

    push  ecx ebp

    mov   edi , scroll_base
    mov   ecx , [0x3000]
    mov   ebp , [scroll_top]
    cmp   ebp , 0
    je    cstl21
  cstl1:
    cmp  [edi+0],eax
    jne  cstl2
    cmp  [edi+4],ebx
    jne  cstl2
    cmp  [edi+20],ecx
    jne  cstl2

    ; Scroll position found

    pop  ebp ecx
    ret
  cstl2:
    add   edi , scroll_step
    dec   ebp
    jnz   cstl1

  cstl21:

    ; Not found or list empty

    ; Find empty slot

    mov   edi , scroll_base
    mov   ecx , [0x3000]
    mov   ebp , 0
  cstl51:
    cmp  [edi+20],dword 0
    jne  cstl52

    ; Empty slot found - check scroll_top

    inc   ebp
    cmp   ebp , [scroll_top]
    jbe   cstl53
    mov   [scroll_top], ebp
  cstl53:

    pop   ebp ecx
    ret
  cstl52:
    add   edi , scroll_step
    inc   ebp
    cmp   ebp , scroll_max
    jb    cstl51

    pop  ebp ecx

    ; No empty slots

    sub   edi , scroll_step

    ret


align 4

sys_scroll:

;        mov   eax , 113
;  eax   mov   ebx , 001 shl 16 + 260
;  ebx   mov   ecx , 060 shl 16 + 180
;  ecx   mov   edx , 1000
;  edx   mov   esi , 200
;  esi   mov   edi , [scroll_value]

    call check_scroll_table ; edi = free address or current address

    cmp  edx , 1
    jge  noscrollsizesml
    mov  edx , 1
  noscrollsizesml:

    ; Value within limits

    cmp  esi , ecx
    jae  scrl1
    mov  esi , ecx
  scrl1:
    push ecx
    add  ecx , edx
    dec  ecx
    cmp  esi , ecx
    jbe  scrl2
    mov  esi , ecx
  scrl2:
    pop  ecx

    ; Save values

    mov  [edi+0],eax
    mov  [edi+4],ebx
    mov  [edi+8],ecx
    mov  [edi+12],edx
    mov  [edi+16],esi
    push  eax
    mov   eax , [0x3000]
    mov  [edi+20],eax      ; Process slot - If Zero = slot no used
    pop   eax
          
    pusha
    and   ebx , 0xffff
    sub   ebx , 15+15
    mov   eax , ebx
    mov   ebx , edx
    xor   edx , edx
    div   ebx
    cmp   eax , 25
    jge   scsizefine
    mov   eax , 25
  scsizefine:
    mov  [edi+24],eax ; Scroll size
    popa

    mov   ebp , eax
    shr   ebp , 16  ; save for vertical / horizontal draw

    ; Transparent head 1

    pusha
    push  ebp
    mov   esi , scroll_grey_table
    mov   ebp , 15
    pop   edi
    call  scroll_transparent
    popa

    ; Transparent head 2

    pusha
    push  ebp
    mov   ecx , ebx
    shl   ecx , 16
    add   ebx , ecx
    mov   ecx , 15 shl 16
    sub   ebx , ecx
    mov   esi , scroll_grey_table
    mov   ebp , 15
    pop   edi
    call  scroll_transparent
    popa

    ; Draw glider

    mov   ebp , ebx ; Save for background

    add   ebx , 15 * 65536

    ;  ecx   mov   edx , 1000
    ;  edx   mov   esi , 200
    ;  esi   mov   edi , [scroll_value]

    push  eax ecx edx edi

    mov   eax , edi
    mov   edi , ebx
    and   edi , 0xffff
    sub   edi , 15+15                 ; Heads
    sub   edi , [eax+24]              ; Glider size
                                      ; edi = Glide area from:to
    sub   esi , ecx
    imul  esi , edi
    mov   eax , esi
    mov   ecx , edx
    cmp   ecx , 1
    je    nodece
    dec   ecx
  nodece:
    mov   edx , 0
    div   ecx

    shl   eax , 16
    add   ebx , eax

    pop   edi edx ecx eax

    ; Gray scroll area 1

    pusha
    push  eax
    mov   ecx , ebx
    mov   ebx , ebp
    shr   ecx , 16
    mov   bx  , cx
;    sub   bx  , 2
    mov   edi , [0x3010]
    mov   ecx , [edi-twdw]
    cmp   [esp+2],byte 2
    jne   nosxys23
    mov   ecx , [edi-twdw+4]
  nosxys23:
    add   ax  , cx
    mov   dx  , ax
    shl   eax , 16
    mov   ax  , dx
;    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   nosxys24
    mov   ecx , [edi-twdw+0]
  nosxys24:
    mov   dx  , cx
    shl   ecx , 16
    mov   cx  , dx
    add   ebx , ecx
    mov   edi , 0
    mov   ecx , 0xc0c0c0
    mov   ebp , 13
  sysscrl1:
    pusha
    cmp   [esp+32+2],byte 2
    jne   nosxys2
    xchg  eax , ebx
  nosxys2:
    call  draw_line
    popa
    add   ecx , 0x030303
    add   eax , 0x00010001
    dec   ebp
    jnz   sysscrl1
    pop   eax
    popa


    ; Gray scroll area 2

    pusha
    push  eax
    shr   ebx , 16
    add   ebx , [edi+24]
    shl   ebx , 16
    mov   ecx , [edi+4+2]
    mov   bx  , cx
    mov   ecx , [edi+4]
    add   bx  , cx
    sub   bx  , 15
    sub   ebx , 0x00010001

;    mov   ecx , ebx
;    mov   ebx , ebp
;    shr   ecx , 16
;    mov   bx  , cx

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

⌨️ 快捷键说明

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