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

📄 kernel.asm

📁 Menuet 操作系统源代码。 非常难得的东西
💻 ASM
📖 第 1 页 / 共 5 页
字号:
sys_getsetup:
   
; 1=roland mpu midi base , base io address
; 2=keyboard   1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus
; 3=cd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
; 4=sb16 base , base io address
; 5=system language, 1eng 2fi 3ger 4rus
; 6=wss base
; 7=hd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
; 8=fat32 partition in hd
; 9=get hs timer tic
   
     cmp  eax,1
     jne  ngsyse1
     mov  [esp+36],dword 0
     ret
   ngsyse1:
   
     cmp  eax,2
     jne  ngsyse2
     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  [esp+36],eax
     ret
   ngsyse9:
   
     mov  [esp+36],dword 1
     ret
   
   
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,0x1000
    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
   
is_input:
   
   push edx
   mov  dx,word [midisp]
   in   al,dx
   and  al,0x80
   pop  edx
   ret
   
   
is_output:
   
   push edx
   mov  dx,word [midisp]
   in   al,dx
   and  al,0x40
   pop  edx
   ret
   
   
get_mpu_in:
   
   push edx
   mov  dx,word [mididp]
   in   al,dx
   pop  edx
   ret
   
   
put_mpu_out:
   
   push edx
   mov  dx,word [mididp]
   out  dx,al
   pop  edx
   ret
   
   
setuart:
   
 su1:
   call is_output
   cmp  al,0
   jnz  su1
   mov  dx,word [midisp]
   mov  al,0xff
   out  dx,al
 su2:
   mov  dx,word [midisp]
   mov  al,0xff
   out  dx,al
   call is_input
   cmp  al,0
   jnz  su2
   call get_mpu_in
   cmp  al,0xfe
   jnz  su2
 su3:
   call is_output
   cmp  al,0
   jnz  su3
   mov  dx,word [midisp]
   mov  al,0x3f
   out  dx,al
   
   ret
   
   
align 4
   
sys_midi:
   
     cmp  [mididp],0
     jnz  sm0
     mov  [esp+36],dword 1
     ret
   sm0:
   
     cmp  eax,1
     mov  [esp+36],dword 0
     jnz  smn1
     call setuart
     ret
   smn1:
   
     cmp  eax,2
     jnz  smn2
   sm10:
     call get_mpu_in
     call is_output
     test al,al
     jnz  sm10
     mov  al,bl
     call put_mpu_out
     ret
   smn2:
   
     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  [0xFF00],byte 50
     xor  eax,eax
     ret
   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
     add  ebx,0x3000+0xa
     mov  [ebx],byte 3       ; clear possible i40's
     ret
   noprocessterminate:
   
     cmp  eax,3                              ; ACTIVATE WINDOW
     jnz  nowindowactivate
     cmp  ebx,2
     jb   nowindowactivate
     cmp  ebx,[0x3004]
     jg   nowindowactivate
     ; edi = position at 0x2000+
     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
     xor  eax,eax
     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:
   
     cmp  eax,6 			     ; SAVE FLOPPY IMAGE (HD version only)
     jnz  nosaveimage

     call restorefatchain      ; restore FAT !!!

     mov  eax,image_save
     mov  ebx,1440*1024        ; size 1440 Kb
     mov  ecx,0x100000	       ; address of image
     mov  edx,path	       ; path = 0 (root dir)

;     mov [esp+28],eax	       ; for file_wite function
;     mov [esp+24],ecx
;     mov [esp+16],ebx
;     mov [esp+20],edx
     call file_write

     ret

     path db 0

   nosaveimage:
     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
     test al,al
     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
     test ax,ax
     jz   cdplayfail
     jmp  cdplay
   cdplayfail:
   cdplayok:
     pop  ebx
     pop  ax
     xor  eax,eax
     ret
   
   
sys_cdtracklist:
   
     push ebx
   tcdplay:
     call sys_cd_atapi_command
     mov  dx,word [cdbase]
     mov  ax,0x43+2*256
     out  dx,ax
     xor  ax,ax
     out  dx,ax
     xor  ax,ax
     out  dx,ax
     xor  ax,ax
     out  dx,ax
     mov  ax,200
     out  dx,ax
     xor  ax,ax
     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
     xor  eax,eax
     ret
   
   
sys_cdpause:
   
     call sys_cd_atapi_command
   
     mov  dx,word [cdbase]
     mov  ax,0x004B
     out  dx,ax
     xor  ax,ax
     out  dx,ax
     xor  ax,ax
     out  dx,ax
     xor  ax,ax
     out  dx,ax
     xor  ax,ax
     out  dx,ax
     xor  ax,ax
     out  dx,ax
   
     mov  esi,10
     call delay_ms
     add  dx,7
     in   al,dx
   
     xor  eax,eax
     ret
   
   
   
sys_cachetodiskette:
   
    pusha
   
    popa
    ret
   
   
bgrchanged  dd  0x0
   
   
sys_background:
   
    cmp   eax,1                            ; BACKGROUND SIZE
    jnz   nosb1
    mov   [0x400000-8],ebx
    mov   [0x400000-4],ecx
    mov   [bgrchanged],1
    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   [ebx+0x300000],edx
    mov   [bgrchanged],1
    ret
  nosb2:
   
    cmp   eax,3                            ; DRAW BACKGROUND
    jnz   nosb3
    cmp   [bgrchanged],0
    je    nosb31
    mov   [bgrchanged],0
    mov   [0xfff0],byte 1
   nosb31:
    ret
  nosb3:
   
    cmp   eax,4                            ; TILED / STRETCHED
    jnz   nosb4
    cmp   ebx,[0x400000-12]
    je    nosb41
    mov   [0x400000-12],ebx
    mov   [bgrchanged],1
   nosb41:
    ret
  nosb4:
   
    cmp   eax,5                            ; BLOCK MOVE TO BGR
    jnz   nosb5

⌨️ 快捷键说明

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