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

📄 sys32.inc

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

      mov   eax,[esi+l.eax-tss_sceleton]      
      mov   ebx,[esi+l.ebx-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,128
      add   esi,0x40000

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

      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   [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 256 dd 0x0
reg1:       times 256 dd 0x0
reg2:       times 256 dd 0x0
usedi40:    times 256 db 0x0
schd                  dd 0x0

save_registers:
   
      mov   esi,[0x3000]   
      imul  esi,128
      add   esi,0x40000
      
      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
   
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:     

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

        call  show_error_parameters

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

        sti
        
        jmp   $

s1:

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

        call  show_error_parameters

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

        sti
        
        jmp   $

s2:

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

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

        sti
        
        jmp   $

s3:

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

        call  show_error_parameters

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

        sti
        
        jmp   $

s4:

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

        call  show_error_parameters

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

        sti
        
        jmp   $

s5:

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

        call  show_error_parameters

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

        sti
        
        jmp   $

s6:

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

        call  show_error_parameters

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

        sti
        
        jmp   $
   
   
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,128
        add   esi,0x40000
        mov   edi,fpu_tss
        mov   ecx,120
        cld
        rep   movsb

        mov   esi,[0x3000]  
        imul  esi,128
        add   esi,0x40000

        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:

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

        call  show_error_parameters

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

        sti
        
        jmp   $

s9:

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

        call  show_error_parameters

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

        sti
        
        jmp   $

sa:

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

        call  show_error_parameters

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

        sti
        
        jmp   $

sb:

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

        call  show_error_parameters

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

        sti
        
        jmp   $

sc:

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

        call  show_error_parameters

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

        sti
        
        jmp   $

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

        call  show_error_parameters

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

        sti
        
        jmp   $

se:

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

        call  show_error_parameters

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

        sti
        
        jmp   $
        
sf:

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

        call  show_error_parameters

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

        sti
        
        jmp   $

s10:

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

        call  show_error_parameters

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

        sti
        
        jmp   $

s11:

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

        call  show_error_parameters

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

        sti
        
        jmp   $
   
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 'K : Process - forced terminate INT: 00000000',13,10,0
process_pid    db 'K : Process - forced terminate PID: 00000000',13,10,0
process_eip    db 'K : Process - forced terminate EIP: 00000000',13,10,0

write_error_to  dd  0x0

show_error_parameters:

        mov    [write_error_to],process_pid+43
        mov    eax,[0x3000]

⌨️ 快捷键说明

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