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

📄 sys32.inc

📁 MenuetOS是一个用汇编开发的32/64位PC操作系统
💻 INC
📖 第 1 页 / 共 5 页
字号:
      mov   eax,[0x3000]
      mov   [tasknum+ecx],eax

      mov   eax,[ebx]
      mov   [reg1+ecx],eax
      mov   eax,[ebx+4]
      mov   [reg2+ecx],eax

      mov   ecx,8
      imul  ecx,[esp]
      mov   eax,[tss0sys_l+ecx]
      mov   [ebx],eax
      mov   eax,[tss0sys_l+ecx+4]
      mov   [ebx+4],eax

      call  save_registers

      mov   esi,[0x3000]
      imul  esi,tss_step
      add   esi,tss_data

      mov   eax,[esi+l.eax-tss_sceleton]
      mov   ebx,[esi+l.ebx-tss_sceleton]
      mov   ecx,[esi+l.ecx-tss_sceleton]

      pusha

      mov   edi,[esi+l.eax-tss_sceleton]
      mov   eax,[esi+l.ebx-tss_sceleton]
      mov   ebx,[esi+l.ecx-tss_sceleton]
      mov   ecx,[esi+l.edx-tss_sceleton]
      mov   edx,[esi+l.esi-tss_sceleton]
      mov   esi,[esi+l.edi-tss_sceleton]

      sti
      push   eax
      and    edi,0xff
      call   dword [servetable+edi*4]
      pop    eax
      cli

      popa

      mov   esi,[0x3000]
      imul  esi,tss_step
      add   esi,tss_data

      mov   [esi+l.eax-tss_sceleton],eax
      mov   [esi+l.ebx-tss_sceleton],ebx
      mov   [esi+l.ecx-tss_sceleton],ecx

      mov   ebx,[0x3000]
      shl   ebx,3
      add   ebx,tss0_l

      mov   ecx,[0x3000]
      shl   ecx,2

      mov   eax,[reg1+ecx]
      mov   [ebx],eax
      mov   eax,[reg2+ecx]
      mov   [ebx+4],eax

      mov    edi,[0x3000]          ; no syscall interrupt in use anymore
      imul   edi,256
      mov    [edi+0x80000+0xB0],eax

      mov   [tasknum+ecx],dword 0

      mov    edi,8
      pop    eax        ; this handler
      mov    [usedi40+eax],byte 0
      imul   edi,eax
      mov    [edi+tss0sys_l +5], word 01010000b *256 +11101001b

      mov   ebx,[0x3000]
      shl   bx,3
      add   bx,tss0t
      mov   [tss_s3],bx

        db    0xea
tss_t3  dd    0
tss_s3  dw    tss0t

      jmp    i40

tasknum:    times (max_processes+10) dd 0,0
reg1:       times (max_processes+10) dd 0,0
reg2:       times (max_processes+10) dd 0,0
usedi40:    times (max_processes+10) db 0,0
schd                  dd 0x0

save_registers:

      mov   esi,[0x3000]
      imul  esi,tss_step
      add   esi,tss_data

      mov   eax,[esi+l.eax-tss_sceleton]
      mov   ebx,[esi+l.ebx-tss_sceleton]
      mov   ecx,[esi+l.ecx-tss_sceleton]
      mov   edx,[esi+l.edx-tss_sceleton]
      mov   edi,[esi+l.edi-tss_sceleton]
      mov   ebp,[esi+l.ebp-tss_sceleton]

      mov   esi,[esi+l.esi-tss_sceleton]

      pusha
      mov   esi,[0x3010]
      mov   eax,[esi+0x4]
      mov   esi,esp
      inc   [save_syscall_count]
      mov   edi,[save_syscall_count]
      and   edi,15
      shl   edi,6
      add   edi,save_syscall_data+32
      mov   [edi-32],eax
      mov   ecx,32 / 4
      cld
      rep   movsd
      popa
      ret

save_syscall_count                dd 0x0
save_syscall_data: times 64*16    dd 0x0

align 4

servetable:

      dd sys_drawwindow          ; 0-DrawWindow
      dd syscall_setpixel        ; 1-SetPixel
      dd sys_getkey              ; 2-GetKey
      dd sys_clock               ; 3-GetTime
      dd syscall_writetext       ; 4-WriteText
      dd delay_hs                ; 5-DelayHs
      dd syscall_openramdiskfile ; 6-OpenRamdiskFile
      dd syscall_putimage        ; 7-PutImage
      dd sys_button              ; 8-DefineButton
      dd sys_cpuusage            ; 9-GetProcessInfo
      dd sys_waitforevent        ; 10-WaitForEvent
      dd sys_getevent            ; 11-CheckForEvent
      dd sys_redrawstat          ; 12-BeginDraw and EndDraw
      dd syscall_drawrect        ; 13-DrawRect
      dd syscall_getscreensize   ; 14-GetScreenSize
      dd sys_background          ; 15-bgr
      dd sys_cachetodiskette     ; 16-FlushFloppyCache
      dd sys_getbutton           ; 17-GetButton
      dd syscall_system          ; 18-Shutdown,KillApp,WindowActivate
      dd syscall_startapp        ; 19-StartApp
      dd sys_midi                ; 20-ResetMidi and OutputMidi
      dd sys_setup               ; 21-SetMidiBase,SetKeymap,SetShiftKeymap,.
      dd undefined_syscall       ; 22-not used
      dd sys_wait_event_timeout  ; 23-TimeOutWaitForEvent
      dd syscall_cdaudio         ; 24-PlayCdTrack,StopCd and GetCdPlaylist
      dd sys_sb16                ; 25-SetSb16
      dd sys_getsetup            ; 26-GetMidiBase,GetKeymap,GetShiftKeymap,.
      dd sys_wss                 ; 27-SetWssMainVol and SetWssCdVol
      dd sys_sb16II              ; 28-SetSb16
      dd sys_date                ; 29-GetDate
      dd syscall_readhd          ; 30-ReadHd
      dd syscall_starthdapp      ; 31-StartHdApp
      dd syscall_delramdiskfile  ; 32-DelRamdiskFile
      dd syscall_writeramdiskfile; 33-WriteRamdiskFile
      dd read_floppy_file        ; 34-ReadFloppyDrive
      dd syscall_getpixel        ; 35-GetPixel
      dd syscall_readstring      ; 36-ReadString (not yet ready)
      dd readmousepos            ; 37-GetMousePosition_ScreenRelative,.
      dd syscall_drawline        ; 38-DrawLine
      dd sys_getbackground       ; 39-GetBackgroundSize,ReadBgrData,.
      dd set_app_param           ; 40-WantEvents
      dd syscall_getirqowner     ; 41-GetIrqOwner
      dd get_irq_data            ; 42-ReadIrqData
      dd sys_outport             ; 43-SendDeviceData
      dd sys_programirq          ; 44-ProgramIrqs
      dd reserve_free_irq        ; 45-ReserveIrq and FreeIrq
      dd syscall_reserveportarea ; 46-ReservePortArea and FreePortArea
      dd display_number          ; 47-WriteNum
      dd display_settings        ; 48-SetRedrawType and SetButtonType
      dd syscall_appints         ; 49-AppInts
      dd random_shaped_window    ; 50-Window shape & scale
      dd syscall_threads         ; 51-Threads
      dd stack_driver_stat       ; 52-Stack driver status
      dd socket                  ; 53-Socket interface
      dd user_events             ; 54-User events
      dd sound_interface         ; 55-Sound interface
      dd write_to_hd             ; 56-Write a file to hd
      dd delete_from_hd          ; 57-Delete a file from hd
      dd file_system             ; 58-Common file system interface
      dd sys_trace               ; 59-System call trace
      dd sys_ipc                 ; 60-Inter Process Communication
      dd sys_gs                  ; 61-Direct graphics access
      dd sys_pci                 ; 62-PCI functions
      dd sys_msg_board           ; 63-System message board
      dd sys_resize_app_memory   ; 64-Resize application memory usage
      dd undefined_syscall       ; 65-UTF
      dd sys_process_def         ; 66-Process definitions - keyboard
      dd sys_window_move         ; 67-Window move or resize

      times (113-67-1) dd undefined_syscall

      dd sys_scroll              ; 113-Srolls

      times 255 - ( ($-servetable) /4 )  dd undefined_syscall

      dd sys_end                 ; -1-end application

tss_sceleton:

l.back   dw 0,0
l.esp0   dd 0
l.ss0    dw 0,0
l.esp1   dd 0
l.ss1    dw 0,0
l.esp2   dd 0
l.ss2    dw 0,0
l.cr3    dd 0
l.eip    dd 0
l.eflags dd 0
l.eax    dd 0
l.ecx    dd 0
l.edx    dd 0
l.ebx    dd 0
l.esp    dd 0
l.ebp    dd 0
l.esi    dd 0
l.edi    dd 0
l.es     dw 0,0
l.cs     dw 0,0
l.ss     dw 0,0
l.ds     dw 0,0
l.fs     dw 0,0
l.gs     dw 0,0
l.ldt    dw 0,0
l.trap   dw 0
l.io     dw 0

s0:
        cli

        mov   [error_interrupt],0x0
        mov   [error_interrupt_entry],dword s0

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task


s1:
        cli

        mov   [error_interrupt],0x1
        mov   [error_interrupt_entry],dword s1

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

s2:
        cli

        mov   [error_interrupt],0x2
        mov   [error_interrupt_entry],dword s2

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

s3:
        cli

        mov   [error_interrupt],0x3
        mov   [error_interrupt_entry],dword s3

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

s4:
        cli

        mov   [error_interrupt],0x4
        mov   [error_interrupt_entry],dword s4

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

s5:
        cli

        mov   [error_interrupt],0x5
        mov   [error_interrupt_entry],dword s5

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

s6:
        cli

        mov   [error_interrupt],0x6
        mov   [error_interrupt_entry],dword s6

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task


prev_user_of_fpu dd 0x1 ; set to OS

s7:
        mov    edi,7
        imul   edi,8
        mov    [edi+gdts+ tss0i +5], word 01010000b *256 +11101001b

        mov    edi,[0x3000]
        imul   edi,8
        mov    [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b

        mov   esi,[0x3000]
        imul  esi,tss_step
        add   esi,tss_data
        mov   edi,fpu_tss
        mov   ecx,120
        cld
        rep   movsb

        mov   esi,[0x3000]
        imul  esi,tss_step
        add   esi,tss_data

        mov   word [esi+l.cs-tss_sceleton],int_code
        mov   word [esi+l.ss-tss_sceleton],int_data
        mov   word [esi+l.ds-tss_sceleton],int_data
        mov   word [esi+l.es-tss_sceleton],int_data
        mov   word [esi+l.fs-tss_sceleton],int_data
        mov   word [esi+l.gs-tss_sceleton],int_data
        mov   dword [esi+l.esp-tss_sceleton],fpu_stack+4*8
        mov   dword [esi+l.eip-tss_sceleton],fpu_handler
        mov   dword [esi+l.eflags-tss_sceleton],0x11002

        mov     ebx,[0x3000]
        shl     bx,3
        add     bx,tss0t
        mov     [tss_s7],bx

        db    0xea
        dd    0
tss_s7  dw    tss0t

        jmp    s7

fpu_tss:  times 128 db 0

fpu_handler:

        clts

        mov    eax,[prev_user_of_fpu]
        shl    eax,8
        add    eax,0x80000+0x10
        fsave  [eax]

        mov    eax,[0x3000]
        mov    [prev_user_of_fpu],eax
        shl    eax,8
        add    eax,0x80000
        cmp    [eax+0x7f],byte 0
        je     bs7_first_fpu
        frstor [eax+0x10]
      bs7_first_fpu:
        mov    [eax+0x7f],byte 1

        movzx  eax,word [fpu_tss+l.ss-tss_sceleton]  ; push ss
        push   eax
        mov    eax,[fpu_tss+l.esp-tss_sceleton]      ; push esp
        push   eax
        mov    eax,[fpu_tss+l.eflags-tss_sceleton]   ; push eflags
        push   eax

        movzx  eax,word [fpu_tss+l.cs-tss_sceleton]  ; push cs
        push   eax
        mov    eax,[fpu_tss+l.eip-tss_sceleton]      ; push eip
        push   eax

        push   dword [fpu_tss+l.eax-tss_sceleton]

        mov    ax,[fpu_tss+l.es-tss_sceleton]
        mov    es,ax
        mov    ax,[fpu_tss+l.fs-tss_sceleton]
        mov    fs,ax
        mov    ax,[fpu_tss+l.gs-tss_sceleton]
        mov    gs,ax
        mov    ax,[fpu_tss+l.ds-tss_sceleton]
        mov    ds,ax

        pop    eax

        iret

fpu_stack: times 10*4 db 0

s8:
        cli

        mov   [error_interrupt],0x8
        mov   [error_interrupt_entry],dword s8

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

s9:
        cli

        mov   [error_interrupt],0x9
        mov   [error_interrupt_entry],dword s9

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

sa:
        cli

        mov   [error_interrupt],0xa
        mov   [error_interrupt_entry],dword sa

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

sb:
        cli

        mov   [error_interrupt],0xb
        mov   [error_interrupt_entry],dword sb

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

sc:
        cli

        mov   [error_interrupt],0xc
        mov   [error_interrupt_entry],dword sc

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

sd:
        cli

        mov   [error_interrupt],0xd
        mov   [error_interrupt_entry],dword sd

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

se:
        cli

        mov   [error_interrupt],0xe
        mov   [error_interrupt_entry],dword se

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

sf:
        cli

        mov   [error_interrupt],0xf
        mov   [error_interrupt_entry],dword sf

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

s10:
        cli

        mov   [error_interrupt],0x10
        mov   [error_interrupt_entry],dword s10

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

s11:
        cli

        mov   [error_interrupt],0x11
        mov   [error_interrupt_entry],dword s11

        call  show_error_parameters

        mov   edx,[0x3010]
        mov   [edx+0xa],byte 4

        jmp   change_task

writehex:

      pusha

      mov  ecx,eax
      mov  ax,word [printerrorat]
      shl  eax,16
      mov  ax,[esp+32+4]
      sub  ax,60
      mov  edx,1
      mov  esi,8
      mov  ebx,0xffffff
    whl1:
      push ecx
      and  ecx,0xf
      add  ecx,hexletters
      mov  edi,1

      mov  cl,[ecx]
      mov  edi,[write_error_to]
      mov  [edi],cl
      dec  [write_error_to]

      pop  ecx
      shr  ecx,4
      sub  eax,6*65536
      dec  esi
      jnz  whl1

      popa
      ret


hexletters  db '0123456789ABCDEF'

error_interrupt         dd  -1
error_interrupt_entry   dd  -1

printerrorat            dd 300

process_error  db 'Kernel : Process - Forced terminate INT: 00000000',13,10,0

⌨️ 快捷键说明

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