Subversion Repositories Kolibri OS

Rev

Rev 3742 | Rev 3771 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;
  3. ;; Copyright (C) KolibriOS team 2004-2013. All rights reserved.
  4. ;; PROGRAMMING:
  5. ;; Ivan Poddubny
  6. ;; Marat Zakiyanov (Mario79)
  7. ;; VaStaNi
  8. ;; Trans
  9. ;; Mihail Semenyako (mike.dld)
  10. ;; Sergey Kuzmin (Wildwest)
  11. ;; Andrey Halyavin (halyavin)
  12. ;; Mihail Lisovin (Mihasik)
  13. ;; Andrey Ignatiev (andrew_programmer)
  14. ;; NoName
  15. ;; Evgeny Grechnikov (Diamond)
  16. ;; Iliya Mihailov (Ghost)
  17. ;; Sergey Semyonov (Serge)
  18. ;; Johnny_B
  19. ;; SPraid (simba)
  20. ;; Hidnplayr
  21. ;; Alexey Teplov (<Lrz>)
  22. ;; Rus
  23. ;; Nable
  24. ;; shurf
  25. ;; Alver
  26. ;; Maxis
  27. ;; Galkov
  28. ;; CleverMouse
  29. ;; tsdima
  30. ;; turbanoff
  31. ;; Asper
  32. ;; art_zh
  33. ;;
  34. ;; Data in this file was originally part of MenuetOS project which is
  35. ;; distributed under the terms of GNU GPL. It is modified and redistributed as
  36. ;; part of KolibriOS project under the terms of GNU GPL.
  37. ;;
  38. ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa
  39. ;; PROGRAMMING:
  40. ;;
  41. ;; Ville Mikael Turjanmaa, villemt@itu.jyu.fi
  42. ;; - main os coding/design
  43. ;; Jan-Michael Brummer, BUZZ2@gmx.de
  44. ;; Felix Kaiser, info@felix-kaiser.de
  45. ;; Paolo Minazzi, paolo.minazzi@inwind.it
  46. ;; quickcode@mail.ru
  47. ;; Alexey, kgaz@crosswinds.net
  48. ;; Juan M. Caravaca, bitrider@wanadoo.es
  49. ;; kristol@nic.fi
  50. ;; Mike Hibbett, mikeh@oceanfree.net
  51. ;; Lasse Kuusijarvi, kuusijar@lut.fi
  52. ;; Jarek Pelczar, jarekp3@wp.pl
  53. ;;
  54. ;; KolibriOS is distributed in the hope that it will be useful, but WITHOUT ANY
  55. ;; WARRANTY. No author or distributor accepts responsibility to anyone for the
  56. ;; consequences of using it or for whether it serves any particular purpose or
  57. ;; works at all, unless he says so in writing. Refer to the GNU General Public
  58. ;; License (the "GPL") for full details.
  59. ;
  60. ;; Everyone is granted permission to copy, modify and redistribute KolibriOS,
  61. ;; but only under the conditions described in the GPL. A copy of this license
  62. ;; is supposed to have been given to you along with KolibriOS so you can know
  63. ;; your rights and responsibilities. It should be in a file named COPYING.
  64. ;; Among other things, the copyright notice and this notice must be preserved
  65. ;; on all copies.
  66. ;;
  67. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  68.  
  69. format binary as "mnt"
  70.  
  71. include 'macros.inc'
  72. include 'struct.inc'
  73.  
  74. $Revision: 3762 $
  75.  
  76.  
  77. USE_COM_IRQ     equ 1      ; make irq 3 and irq 4 available for PCI devices
  78. VESA_1_2_VIDEO equ 0      ; enable vesa 1.2 bank switch functions
  79.  
  80. ; Enabling the next line will enable serial output console
  81. ;debug_com_base  equ 0x3f8  ; 0x3f8 is com1, 0x2f8 is com2, 0x3e8 is com3, 0x2e8 is com4, no irq's are used
  82. ; The following constant, if nonzero, duplicates debug output to the screen.
  83. debug_direct_print equ 0
  84.  
  85. include "proc32.inc"
  86. include "kglobals.inc"
  87. include "lang.inc"
  88. include "encoding.inc"
  89.  
  90. include "const.inc"
  91. max_processes   equ   255
  92. tss_step         equ   (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4
  93.  
  94.  
  95. os_stack       equ  (os_data_l-gdts)    ; GDTs
  96. os_code       equ  (os_code_l-gdts)
  97. graph_data     equ  (3+graph_data_l-gdts)
  98. tss0           equ  (tss0_l-gdts)
  99. app_code       equ  (3+app_code_l-gdts)
  100. app_data       equ  (3+app_data_l-gdts)
  101. app_tls       equ  (3+tls_data_l-gdts)
  102. pci_code_sel   equ  (pci_code_32-gdts)
  103. pci_data_sel   equ  (pci_data_32-gdts)
  104.  
  105.  
  106. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  107. ;;
  108. ;;   Included files:
  109. ;;
  110. ;;   Kernel16.inc
  111. ;;    - Booteng.inc   English text for bootup
  112. ;;    - Bootcode.inc  Hardware setup
  113. ;;    - Pci16.inc     PCI functions
  114. ;;
  115. ;;   Kernel32.inc
  116. ;;    - Sys32.inc     Process management
  117. ;;    - Shutdown.inc  Shutdown and restart
  118. ;;    - Fat32.inc     Read / write hd
  119. ;;    - Vesa12.inc    Vesa 1.2 driver
  120. ;;    - Vesa20.inc    Vesa 2.0 driver
  121. ;;    - Vga.inc       VGA driver
  122. ;;    - Stack.inc     Network interface
  123. ;;    - Mouse.inc     Mouse pointer
  124. ;;    - Scincode.inc  Window skinning
  125. ;;    - Pci32.inc     PCI functions
  126. ;;
  127. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  128.  
  129.  
  130. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  131. ;;                                                                      ;;
  132. ;;                  16 BIT ENTRY FROM BOOTSECTOR                        ;;
  133. ;;                                                                      ;;
  134. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  135.  
  136. use16
  137.                   org   0x0
  138.         jmp     start_of_code
  139.  
  140. if lang eq sp
  141. include "kernelsp.inc"  ; spanish kernel messages
  142. else
  143. version db    'Kolibri OS  version 0.7.7.0+     ',13,10,13,10,0
  144. end if
  145.  
  146. include "boot/bootstr.inc"     ; language-independent boot messages
  147. include "boot/preboot.inc"
  148.  
  149. if lang eq ge
  150. include "boot/bootge.inc"     ; german system boot messages
  151. else if lang eq sp
  152. include "boot/bootsp.inc"     ; spanish system boot messages
  153. else if lang eq ru
  154. include "boot/bootru.inc"      ; russian system boot messages
  155. include "boot/ru.inc"          ; Russian font
  156. else if lang eq et
  157. include "boot/bootet.inc"      ; estonian system boot messages
  158. include "boot/et.inc"          ; Estonian font
  159. else
  160. include "boot/booten.inc"      ; english system boot messages
  161. end if
  162.  
  163. include "boot/bootcode.inc"    ; 16 bit system boot code
  164. include "bus/pci/pci16.inc"
  165. include "detect/biosdisk.inc"
  166.  
  167. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  168. ;;                                                                      ;;
  169. ;;                  SWITCH TO 32 BIT PROTECTED MODE                     ;;
  170. ;;                                                                      ;;
  171. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  172.  
  173.  
  174. ; CR0 Flags - Protected mode and Paging
  175.  
  176.         mov     ecx, CR0_PE
  177.  
  178. ; Enabling 32 bit protected mode
  179.  
  180.         sidt    [cs:old_ints_h]
  181.  
  182.         cli                             ; disable all irqs
  183.         cld
  184.         mov     al, 255                 ; mask all irqs
  185.         out     0xa1, al
  186.         out     0x21, al
  187.    l.5:
  188.         in      al, 0x64                ; Enable A20
  189.         test    al, 2
  190.         jnz     l.5
  191.         mov     al, 0xD1
  192.         out     0x64, al
  193.    l.6:
  194.         in      al, 0x64
  195.         test    al, 2
  196.         jnz     l.6
  197.         mov     al, 0xDF
  198.         out     0x60, al
  199.    l.7:
  200.         in      al, 0x64
  201.         test    al, 2
  202.         jnz     l.7
  203.         mov     al, 0xFF
  204.         out     0x64, al
  205.  
  206.         lgdt    [cs:tmp_gdt]            ; Load GDT
  207.         mov     eax, cr0                ; protected mode
  208.         or      eax, ecx
  209.         and     eax, 10011111b *65536*256 + 0xffffff ; caching enabled
  210.         mov     cr0, eax
  211.         jmp     pword os_code:B32       ; jmp to enable 32 bit mode
  212.  
  213. align 8
  214. tmp_gdt:
  215.  
  216.         dw     23
  217.         dd     tmp_gdt+0x10000
  218.         dw     0
  219.  
  220.         dw     0xffff
  221.         dw     0x0000
  222.         db     0x00
  223.         dw     11011111b *256 +10011010b
  224.         db     0x00
  225.  
  226.         dw     0xffff
  227.         dw     0x0000
  228.         db     0x00
  229.         dw     11011111b *256 +10010010b
  230.         db     0x00
  231.  
  232. include "data16.inc"
  233.  
  234. if ~ lang eq sp
  235. diff16 "end of bootcode",0,$+0x10000
  236. end if
  237.  
  238. use32
  239. org $+0x10000
  240.  
  241. align 4
  242. B32:
  243.         mov     ax, os_stack       ; Selector for os
  244.         mov     ds, ax
  245.         mov     es, ax
  246.         mov     fs, ax
  247.         mov     gs, ax
  248.         mov     ss, ax
  249.         mov     esp, 0x006CC00       ; Set stack
  250.  
  251. ; CLEAR 0x280000 - HEAP_BASE
  252.  
  253.         xor     eax, eax
  254.         mov     edi, CLEAN_ZONE
  255.         mov     ecx, (HEAP_BASE-OS_BASE-CLEAN_ZONE) / 4
  256.         cld
  257.         rep stosd
  258.  
  259. ; CLEAR KERNEL UNDEFINED GLOBALS
  260.         mov     edi, endofcode-OS_BASE
  261.         mov     ecx, 0x90000
  262.         sub     ecx, edi
  263.         shr     ecx, 2
  264.         rep stosd
  265.  
  266. ; SAVE & CLEAR 0-0xffff
  267.  
  268.         mov     edi, 0x1000
  269.         mov     ecx, 0x8000 / 4
  270.         rep stosd
  271.         mov     edi, 0xa000
  272.         mov     ecx, 0x6000 / 4
  273.         rep stosd
  274.  
  275.         call    test_cpu
  276.         bts     [cpu_caps-OS_BASE], CAPS_TSC    ;force use rdtsc
  277.  
  278.         call    check_acpi
  279.         call    init_BIOS32
  280. ; MEMORY MODEL
  281.         call    mem_test
  282.         call    init_mem
  283.         call    init_page_map
  284.  
  285. ; ENABLE PAGING
  286.  
  287.         mov     eax, sys_pgdir-OS_BASE
  288.         mov     cr3, eax
  289.  
  290.         mov     eax, cr0
  291.         or      eax, CR0_PG+CR0_WP
  292.         mov     cr0, eax
  293.  
  294.         lgdt    [gdts]
  295.         jmp     pword os_code:high_code
  296.  
  297. align 4
  298. bios32_entry    dd ?
  299. tmp_page_tabs   dd ?
  300.  
  301. use16
  302. org $-0x10000
  303. include "boot/shutdown.inc" ; shutdown or restart
  304. org $+0x10000
  305. use32
  306.  
  307. __DEBUG__ fix 1
  308. __DEBUG_LEVEL__ fix 1
  309. include 'init.inc'
  310.  
  311. org OS_BASE+$
  312.  
  313. include 'fdo.inc'
  314.  
  315. align 4
  316. high_code:
  317.         mov     ax, os_stack
  318.         mov     bx, app_data
  319.         mov     cx, app_tls
  320.         mov     ss, ax
  321.         add     esp, OS_BASE
  322.  
  323.         mov     ds, bx
  324.         mov     es, bx
  325.         mov     fs, cx
  326.         mov     gs, bx
  327.  
  328.         bt      [cpu_caps], CAPS_PGE
  329.         jnc     @F
  330.  
  331.         or      dword [sys_pgdir+(OS_BASE shr 20)], PG_GLOBAL
  332.  
  333.         mov     ebx, cr4
  334.         or      ebx, CR4_PGE
  335.         mov     cr4, ebx
  336. @@:
  337.         xor     eax, eax
  338.         mov     dword [sys_pgdir], eax
  339.         mov     dword [sys_pgdir+4], eax
  340.  
  341.         mov     eax, cr3
  342.         mov     cr3, eax          ; flush TLB
  343.  
  344.         mov     ecx, pg_data.mutex
  345.         call    mutex_init
  346.  
  347.         mov     ecx, disk_list_mutex
  348.         call    mutex_init
  349.  
  350.         mov     ecx, keyboard_list_mutex
  351.         call    mutex_init
  352.  
  353.         mov     ecx, unpack_mutex
  354.         call    mutex_init
  355.  
  356.         mov     ecx, application_table_mutex
  357.         call    mutex_init
  358.  
  359.         mov     ecx, ide_mutex
  360.         call    mutex_init
  361.         mov     ecx, ide_channel1_mutex
  362.         call    mutex_init
  363.         mov     ecx, ide_channel2_mutex
  364.         call    mutex_init
  365.  
  366. ; SAVE REAL MODE VARIABLES
  367.         xor     eax, eax
  368.         mov     ax, [BOOT_VARS + BOOT_IDE_INTERR_16]
  369.         mov     [IDE_Interrupt], ax
  370.         mov     ax, [BOOT_VARS + BOOT_IDE_PI_16]
  371.         mov     [IDEContrProgrammingInterface], ax
  372.         mov     ax, [BOOT_VARS + BOOT_IDE_BASE_ADDR]
  373.         mov     [IDEContrRegsBaseAddr], ax
  374.         mov     ax, [BOOT_VARS + BOOT_IDE_BAR0_16]
  375.         mov     [IDE_BAR0_val], ax
  376.  
  377.         cmp     ax, 0
  378.         je      @f
  379.         cmp     ax, 1
  380.         je      @f
  381.         and     ax, 0xfff0
  382.         mov     [StandardATABases], ax
  383.         mov     [hd_address_table], eax
  384.         mov     [hd_address_table+8], eax
  385. @@:
  386.         mov     ax, [BOOT_VARS + BOOT_IDE_BAR1_16]
  387.         mov     [IDE_BAR1_val], ax
  388.         mov     ax, [BOOT_VARS + BOOT_IDE_BAR2_16]
  389.         mov     [IDE_BAR2_val], ax
  390.  
  391.         cmp     ax, 0
  392.         je      @f
  393.         cmp     ax, 1
  394.         je      @f
  395.         and     ax, 0xfff0
  396.         mov     [StandardATABases+2], ax
  397.         mov     [hd_address_table+16], eax
  398.         mov     [hd_address_table+24], eax
  399. @@:
  400.         mov     ax, [BOOT_VARS + BOOT_IDE_BAR3_16]
  401.         mov     [IDE_BAR3_val], ax
  402.  
  403. ; --------------- APM ---------------------
  404.  
  405. ; init selectors
  406.         mov     ebx, [BOOT_VARS+BOOT_APM_ENTRY]        ; offset of APM entry point
  407.         movzx   eax, word [BOOT_VARS+BOOT_APM_CODE_32] ; real-mode segment base address of
  408.                                                                                 ; protected-mode 32-bit code segment
  409.         movzx   ecx, word [BOOT_VARS+BOOT_APM_CODE_16]; real-mode segment base address of
  410.                                                                                 ; protected-mode 16-bit code segment
  411.         movzx   edx, word [BOOT_VARS+BOOT_APM_DATA_16]; real-mode segment base address of
  412.                                                                                 ; protected-mode 16-bit data segment
  413.  
  414.         shl     eax, 4
  415.         mov     [dword apm_code_32 + 2], ax
  416.         shr     eax, 16
  417.         mov     [dword apm_code_32 + 4], al
  418.  
  419.         shl     ecx, 4
  420.         mov     [dword apm_code_16 + 2], cx
  421.         shr     ecx, 16
  422.         mov     [dword apm_code_16 + 4], cl
  423.  
  424.         shl     edx, 4
  425.         mov     [dword apm_data_16 + 2], dx
  426.         shr     edx, 16
  427.         mov     [dword apm_data_16 + 4], dl
  428.  
  429.         mov     dword[apm_entry], ebx
  430.         mov     word [apm_entry + 4], apm_code_32 - gdts
  431.  
  432.         mov     eax, [BOOT_VARS + BOOT_APM_VERSION] ; version & flags
  433.         mov     [apm_vf], eax
  434. ; -----------------------------------------
  435.         mov     al, [BOOT_VARS+BOOT_DMA]            ; DMA access
  436.         mov     [allow_dma_access], al
  437.         movzx   eax, byte [BOOT_VARS+BOOT_BPP]      ; bpp
  438.         mov     [_display.bpp], eax
  439.         mov     [_display.vrefresh], 60
  440.  
  441.         movzx   eax, word [BOOT_VARS+BOOT_X_RES]; X max
  442.         mov     [_display.width], eax
  443.         mov     [display_width_standard], eax
  444.         dec     eax
  445.         mov     [Screen_Max_X], eax
  446.         mov     [screen_workarea.right], eax
  447.         movzx   eax, word [BOOT_VARS+BOOT_Y_RES]; Y max
  448.         mov     [_display.height], eax
  449.         mov     [display_height_standard], eax
  450.         dec     eax
  451.         mov     [Screen_Max_Y], eax
  452.         mov     [screen_workarea.bottom], eax
  453.         movzx   eax, word [BOOT_VARS+BOOT_VESA_MODE] ; screen mode
  454.         mov     dword [SCR_MODE], eax
  455. ;        mov     eax, [BOOT_VAR+0x9014]             ; Vesa 1.2 bnk sw add
  456. ;        mov     [BANK_SWITCH], eax
  457.         mov     eax, 640 *4                         ; Bytes PerScanLine
  458.         cmp     [SCR_MODE], word 0x13               ; 320x200
  459.         je      @f
  460.         cmp     [SCR_MODE], word 0x12               ; VGA 640x480
  461.         je      @f
  462.         movzx   eax, word[BOOT_VARS+BOOT_PITCH]      ; for other modes
  463. @@:
  464.         mov     [_display.pitch], eax
  465.         mov     eax, [_display.width]
  466.         mul     [_display.height]
  467.         mov     [_WinMapSize], eax
  468.  
  469.         call    calculate_fast_getting_offset_for_WinMapAddress
  470. ; for Qemu or non standart video cards
  471. ; Unfortunately [BytesPerScanLine] does not always
  472. ;                             equal to [_display.width] * [ScreenBPP] / 8
  473.         call    calculate_fast_getting_offset_for_LFB
  474.  
  475.         mov     esi, BOOT_VARS+0x9080
  476.         movzx   ecx, byte [esi-1]
  477.         mov     [NumBiosDisks], ecx
  478.         mov     edi, BiosDisksData
  479.         rep movsd
  480.  
  481. ; GRAPHICS ADDRESSES
  482.  
  483.         mov     eax, [BOOT_VARS+BOOT_LFB]
  484.         mov     [LFBAddress], eax
  485.  
  486.         cmp     [SCR_MODE], word 0100000000000000b
  487.         jge     setvesa20
  488.         cmp     [SCR_MODE], word 0x13  ; EGA 320*200 256 colors
  489.         je      v20ga32
  490.         jmp     v20ga24
  491.  
  492. setvesa20:
  493.         mov     [PUTPIXEL], dword Vesa20_putpixel24 ; Vesa 2.0
  494.         mov     [GETPIXEL], dword Vesa20_getpixel24
  495.         cmp     byte [_display.bpp], 24
  496.         jz      v20ga24
  497. v20ga32:
  498.         mov     [PUTPIXEL], dword Vesa20_putpixel32
  499.         mov     [GETPIXEL], dword Vesa20_getpixel32
  500.         jmp     no_mode_0x12
  501. v20ga24:
  502.         cmp     [SCR_MODE], word 0x12               ; 16 C VGA 640x480
  503.         jne     no_mode_0x12
  504.         mov     [PUTPIXEL], dword VGA_putpixel
  505.         mov     [GETPIXEL], dword Vesa20_getpixel32
  506. no_mode_0x12:
  507.  
  508.         mov     [MOUSE_PICTURE], dword mousepointer
  509.         mov     [_display.check_mouse], check_mouse_area_for_putpixel
  510.         mov     [_display.check_m_pixel], check_mouse_area_for_getpixel
  511.  
  512. ; -------- Fast System Call init ----------
  513. ; Intel SYSENTER/SYSEXIT (AMD CPU support it too)
  514.         bt      [cpu_caps], CAPS_SEP
  515.         jnc     .SEnP  ; SysEnter not Present
  516.         xor     edx, edx
  517.         mov     ecx, MSR_SYSENTER_CS
  518.         mov     eax, os_code
  519.         wrmsr
  520.         mov     ecx, MSR_SYSENTER_ESP
  521. ;           mov eax, sysenter_stack ; Check it
  522.         xor     eax, eax
  523.         wrmsr
  524.         mov     ecx, MSR_SYSENTER_EIP
  525.         mov     eax, sysenter_entry
  526.         wrmsr
  527. .SEnP:
  528. ; AMD SYSCALL/SYSRET
  529.         cmp     byte[cpu_vendor], 'A'
  530.         jne     .noSYSCALL
  531.         mov     eax, 0x80000001
  532.         cpuid
  533.         test    edx, 0x800  ; bit_11 - SYSCALL/SYSRET support
  534.         jz      .noSYSCALL
  535.         mov     ecx, MSR_AMD_EFER
  536.         rdmsr
  537.         or      eax, 1 ; bit_0 - System Call Extension (SCE)
  538.         wrmsr
  539.  
  540.         ; !!!! It`s dirty hack, fix it !!!
  541.         ; Bits of EDX :
  542.         ; Bit 31–16 During the SYSRET instruction, this field is copied into the CS register
  543.         ;  and the contents of this field, plus 8, are copied into the SS register.
  544.         ; Bit 15–0 During the SYSCALL instruction, this field is copied into the CS register
  545.         ;  and the contents of this field, plus 8, are copied into the SS register.
  546.  
  547.         ; mov   edx, (os_code + 16) * 65536 + os_code
  548.         mov     edx, 0x1B0008
  549.  
  550.         mov     eax, syscall_entry
  551.         mov     ecx, MSR_AMD_STAR
  552.         wrmsr
  553. .noSYSCALL:
  554. ; -----------------------------------------
  555.         stdcall alloc_page
  556.         stdcall map_page, tss-0xF80, eax, PG_SW
  557.         stdcall alloc_page
  558.         stdcall map_page, tss+0x80, eax, PG_SW
  559.         stdcall alloc_page
  560.         stdcall map_page, tss+0x1080, eax, PG_SW
  561.  
  562. ; LOAD IDT
  563.  
  564.         call    build_interrupt_table ;lidt is executed
  565.           ;lidt [idtreg]
  566.  
  567.         call    init_kernel_heap
  568.         stdcall kernel_alloc, (RING0_STACK_SIZE+512) * 2
  569.         mov     [os_stack_seg], eax
  570.  
  571.         lea     esp, [eax+RING0_STACK_SIZE]
  572.  
  573.         mov     [tss._ss0], os_stack
  574.         mov     [tss._esp0], esp
  575.         mov     [tss._esp], esp
  576.         mov     [tss._cs], os_code
  577.         mov     [tss._ss], os_stack
  578.         mov     [tss._ds], app_data
  579.         mov     [tss._es], app_data
  580.         mov     [tss._fs], app_data
  581.         mov     [tss._gs], app_data
  582.         mov     [tss._io], 128
  583. ;Add IO access table - bit array of permitted ports
  584.         mov     edi, tss._io_map_0
  585.         xor     eax, eax
  586.         not     eax
  587.         mov     ecx, 8192/4
  588.         rep stosd                    ; access to 4096*8=65536 ports
  589.  
  590.         mov     ax, tss0
  591.         ltr     ax
  592.  
  593.         mov     [LFBSize], 0xC00000
  594.         call    init_LFB
  595.         call    init_fpu
  596.         call    init_malloc
  597.  
  598.         stdcall alloc_kernel_space, 0x51000
  599.         mov     [default_io_map], eax
  600.  
  601.         add     eax, 0x2000
  602.         mov     [ipc_tmp], eax
  603.         mov     ebx, 0x1000
  604.  
  605.         add     eax, 0x40000
  606.         mov     [proc_mem_map], eax
  607.  
  608.         add     eax, 0x8000
  609.         mov     [proc_mem_pdir], eax
  610.  
  611.         add     eax, ebx
  612.         mov     [proc_mem_tab], eax
  613.  
  614.         add     eax, ebx
  615.         mov     [tmp_task_pdir], eax
  616.  
  617.         add     eax, ebx
  618.         mov     [tmp_task_ptab], eax
  619.  
  620.         add     eax, ebx
  621.         mov     [ipc_pdir], eax
  622.  
  623.         add     eax, ebx
  624.         mov     [ipc_ptab], eax
  625.  
  626.         stdcall kernel_alloc, (unpack.LZMA_BASE_SIZE+(unpack.LZMA_LIT_SIZE shl \
  627.                 (unpack.lc+unpack.lp)))*4
  628.  
  629.         mov     [unpack.p], eax
  630.  
  631.         call    init_events
  632.         mov     eax, srv.fd-SRV.fd
  633.         mov     [srv.fd], eax
  634.         mov     [srv.bk], eax
  635.  
  636. ;Set base of graphic segment to linear address of LFB
  637.         mov     eax, [LFBAddress]         ; set for gs
  638.         mov     [graph_data_l+2], ax
  639.         shr     eax, 16
  640.         mov     [graph_data_l+4], al
  641.         mov     [graph_data_l+7], ah
  642.  
  643.         stdcall kernel_alloc, [_WinMapSize]
  644.         mov     [_WinMapAddress], eax
  645.  
  646.         xor     eax, eax
  647.         inc     eax
  648.  
  649. ; set background
  650.  
  651.         mov     [BgrDrawMode], eax
  652.         mov     [BgrDataWidth], eax
  653.         mov     [BgrDataHeight], eax
  654.         mov     [mem_BACKGROUND], 4
  655.         mov     [img_background], static_background_data
  656.  
  657. ; SET UP OS TASK
  658.  
  659.         mov     esi, boot_setostask
  660.         call    boot_log
  661.  
  662.         mov     edx, SLOT_BASE+256
  663.         mov     ebx, [os_stack_seg]
  664.         add     ebx, 0x2000
  665.         call    setup_os_slot
  666.         mov     dword [edx], 'IDLE'
  667.         sub     [edx+APPDATA.saved_esp], 4
  668.         mov     eax, [edx+APPDATA.saved_esp]
  669.         mov     dword [eax], idle_thread
  670.         mov     ecx, IDLE_PRIORITY
  671.         call    scheduler_add_thread
  672.  
  673.         mov     edx, SLOT_BASE+256*2
  674.         mov     ebx, [os_stack_seg]
  675.         call    setup_os_slot
  676.         mov     dword [edx], 'OS'
  677.         xor     ecx, ecx
  678.         call    scheduler_add_thread
  679.  
  680.         mov     dword [CURRENT_TASK], 2
  681.         mov     dword [TASK_COUNT], 2
  682.         mov     dword [current_slot], SLOT_BASE + 256*2
  683.         mov     dword [TASK_BASE], CURRENT_TASK + 32*2
  684.  
  685.  
  686. ; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f
  687.         mov     esi, boot_initirq
  688.         call    boot_log
  689.         call    init_irqs
  690.  
  691.         mov     esi, boot_picinit
  692.         call    boot_log
  693.         call    PIC_init
  694.  
  695.         mov     esi, boot_v86machine
  696.         call    boot_log
  697. ; Initialize system V86 machine
  698.         call    init_sys_v86
  699.  
  700.         mov     esi, boot_inittimer
  701.         call    boot_log
  702. ; Initialize system timer (IRQ0)
  703.         call    PIT_init
  704.  
  705. ; CALCULATE FAT CHAIN FOR RAMDISK
  706.  
  707.         call    calculatefatchain
  708.  
  709.         mov     esi, boot_initapic
  710.         call    boot_log
  711. ; Try to Initialize APIC
  712.         call    APIC_init
  713.  
  714.         mov     esi, boot_enableirq
  715.         call    boot_log
  716. ; Enable timer IRQ (IRQ0) and hard drives IRQs (IRQ14, IRQ15)
  717. ; they are used: when partitions are scanned, hd_read relies on timer
  718.         call    unmask_timer
  719.         stdcall enable_irq, 2               ; @#$%! PIC
  720.         stdcall enable_irq, 6               ; FDD
  721.         stdcall enable_irq, 13              ; co-processor
  722.  
  723.         mov     esi, boot_disabling_ide
  724.         call    boot_log
  725. ;--------------------------------------
  726. ; Disable IDE interrupts, because the search
  727. ; for IDE partitions is in the PIO mode.
  728. ;--------------------------------------
  729. .disable_IDE_interrupt:
  730. ; Disable interrupts in IDE controller for PIO
  731.         mov     al, 2
  732.         mov     dx, [IDE_BAR1_val] ;0x3F6
  733.         add     dx, 2
  734.         out     dx, al
  735.         mov     dx, [IDE_BAR3_val] ;0x76
  736.         add     dx, 2
  737.         out     dx, al
  738. ;-----------------------------------------------------------------------------
  739. ;!!!!!!!!!!!!!!!!!!!!!!!!!!
  740. ;        mov     esi, boot_detectdisks
  741. ;        call    boot_log
  742. ;include 'detect/disks.inc'
  743.         mov     esi, boot_detectfloppy
  744.         call    boot_log
  745. include 'detect/dev_fd.inc'
  746.         mov     esi, boot_detecthdcd
  747.         call    boot_log
  748. include 'detect/dev_hdcd.inc'
  749.         mov     esi, boot_getcache
  750.         call    boot_log
  751. include 'detect/getcache.inc'
  752.         mov     esi, boot_detectpart
  753.         call    boot_log
  754. include 'detect/sear_par.inc'
  755. ;!!!!!!!!!!!!!!!!!!!!!!!!!!
  756.  
  757.         mov     esi, boot_init_sys
  758.         call    boot_log
  759.         call    Parser_params
  760.  
  761. if ~ defined extended_primary_loader
  762. ; ramdisk image should be loaded by extended primary loader if it exists
  763. ; READ RAMDISK IMAGE FROM HD
  764.  
  765. ;!!!!!!!!!!!!!!!!!!!!!!!
  766. include 'boot/rdload.inc'
  767. ;!!!!!!!!!!!!!!!!!!!!!!!
  768. end if
  769. ;    mov    [dma_hdd],1
  770.  
  771. if 0
  772.         mov     ax, [OS_BASE+0x10000+bx_from_load]
  773.         cmp     ax, 'r1'; if using not ram disk, then load librares and parameters {SPraid.simba}
  774.         je      no_lib_load
  775.  
  776.         mov     esi, boot_loadlibs
  777.         call    boot_log
  778. ; LOADING LIBRARES
  779.         stdcall dll.Load, @IMPORT           ; loading librares for kernel (.obj files)
  780.         call    load_file_parse_table       ; prepare file parse table
  781.         call    set_kernel_conf             ; configure devices and gui
  782. no_lib_load:
  783. end if
  784.  
  785. ; Display APIC status
  786.         mov     esi, boot_APIC_found
  787.         cmp     [irq_mode], IRQ_APIC
  788.         je      @f
  789.         mov     esi, boot_APIC_nfound
  790. @@:
  791.         call    boot_log
  792.  
  793. ; PRINT AMOUNT OF MEMORY
  794.         mov     esi, boot_memdetect
  795.         call    boot_log
  796.  
  797.         movzx   ecx, word [boot_y]
  798.         if lang eq ru
  799.         or      ecx, (10+30*6) shl 16
  800.         else if lang eq sp
  801.         or      ecx, (10+33*6) shl 16
  802.         else
  803.         or      ecx, (10+29*6) shl 16
  804.         end if
  805.         sub     ecx, 10
  806.         mov     edx, 0xFFFFFF
  807.         mov     ebx, [MEM_AMOUNT]
  808.         shr     ebx, 20
  809.         xor     edi, edi
  810.         mov     eax, 0x00040000
  811.         inc     edi
  812.         call    display_number_force
  813.  
  814. ; BUILD SCHEDULER
  815.  
  816. ;        call    build_scheduler; sys32.inc
  817.  
  818. ;        mov     esi, boot_devices
  819. ;        call    boot_log
  820.  
  821.         mov     [pci_access_enabled], 1
  822.         call    pci_enum
  823.  
  824.         stdcall load_driver, szVidintel
  825.  
  826.         call    usb_init
  827.  
  828. ; SET PRELIMINARY WINDOW STACK AND POSITIONS
  829.  
  830.         mov     esi, boot_windefs
  831.         call    boot_log
  832.         call    set_window_defaults
  833.  
  834. ; SET BACKGROUND DEFAULTS
  835.  
  836.         mov     esi, boot_bgr
  837.         call    boot_log
  838.         call    init_background
  839.         call    calculatebackground
  840.  
  841. ; RESERVE SYSTEM IRQ'S JA PORT'S
  842.  
  843.         mov     esi, boot_resirqports
  844.         call    boot_log
  845.         call    reserve_irqs_ports
  846.  
  847.         call    init_display
  848.         mov     eax, [def_cursor]
  849.         mov     [SLOT_BASE+APPDATA.cursor+256], eax
  850.         mov     [SLOT_BASE+APPDATA.cursor+256*2], eax
  851.  
  852. ; PRINT CPU FREQUENCY
  853.  
  854.         mov     esi, boot_cpufreq
  855.         call    boot_log
  856.  
  857.         cli                         ;FIXME check IF
  858.         rdtsc
  859.         mov     ecx, eax
  860.         mov     esi, 250            ; wait 1/4 a second
  861.         call    delay_ms
  862.         rdtsc
  863.  
  864.         sub     eax, ecx
  865.         xor     edx, edx
  866.         shld    edx, eax, 2
  867.         shl     eax, 2
  868.         mov     dword [cpu_freq], eax
  869.         mov     dword [cpu_freq+4], edx
  870.         mov     ebx, 1000000
  871.         div     ebx
  872.         mov     ebx, eax
  873.  
  874.         movzx   ecx, word [boot_y]
  875.         if lang eq ru
  876.         add     ecx, (10+19*6) shl 16 - 10
  877.         else if lang eq sp
  878.         add     ecx, (10+25*6) shl 16 - 10
  879.         else
  880.         add     ecx, (10+17*6) shl 16 - 10
  881.         end if
  882.  
  883.         mov     edx, 0xFFFFFF
  884.         xor     edi, edi
  885.         mov     eax, 0x00040000
  886.         inc     edi
  887.         call    display_number_force
  888.  
  889. ; SET VARIABLES
  890.  
  891.         call    set_variables
  892.  
  893. ; STACK AND FDC
  894.  
  895.         call    stack_init
  896.         call    fdc_init
  897.  
  898. ; PALETTE FOR 320x200 and 640x480 16 col
  899.  
  900.         cmp     [SCR_MODE], word 0x12
  901.         jne     no_pal_vga
  902.         mov     esi, boot_pal_vga
  903.         call    boot_log
  904.         call    paletteVGA
  905.       no_pal_vga:
  906.  
  907.         cmp     [SCR_MODE], word 0x13
  908.         jne     no_pal_ega
  909.         mov     esi, boot_pal_ega
  910.         call    boot_log
  911.         call    palette320x200
  912.       no_pal_ega:
  913.  
  914. ; LOAD DEFAULT SKIN
  915.  
  916.         call    load_default_skin
  917.  
  918. ;protect io permission map
  919.  
  920.         mov     esi, [default_io_map]
  921.         stdcall map_page, esi, [SLOT_BASE+256+APPDATA.io_map], PG_MAP
  922.         add     esi, 0x1000
  923.         stdcall map_page, esi, [SLOT_BASE+256+APPDATA.io_map+4], PG_MAP
  924.  
  925.         stdcall map_page, tss._io_map_0, \
  926.                 [SLOT_BASE+256+APPDATA.io_map], PG_MAP
  927.         stdcall map_page, tss._io_map_1, \
  928.                 [SLOT_BASE+256+APPDATA.io_map+4], PG_MAP
  929.  
  930. ; LOAD FIRST APPLICATION
  931.         cli
  932.  
  933.         mov     ebp, firstapp
  934.         call    fs_execute_from_sysdir
  935.         test    eax, eax
  936.         jns     first_app_found
  937.  
  938.         mov     esi, boot_failed
  939.         call    boot_log
  940.  
  941.         mov     eax, 0xDEADBEEF      ; otherwise halt
  942.         hlt
  943.  
  944. first_app_found:
  945.  
  946.         cli
  947.  
  948. ; SET KEYBOARD PARAMETERS
  949.         mov     al, 0xf6       ; reset keyboard, scan enabled
  950.         call    kb_write
  951.         test    ah, ah
  952.         jnz     .no_keyboard
  953.  
  954.         ; wait until 8042 is ready
  955.         xor     ecx, ecx
  956.       @@:
  957.         in      al, 64h
  958.         and     al, 00000010b
  959.         loopnz  @b
  960.  
  961. iglobal
  962. align 4
  963. ps2_keyboard_functions:
  964.         dd      .end - $
  965.         dd      0       ; no close
  966.         dd      ps2_set_lights
  967. .end:
  968. endg
  969.         stdcall register_keyboard, ps2_keyboard_functions, 0
  970.        ; mov   al, 0xED       ; Keyboard LEDs - only for testing!
  971.        ; call  kb_write
  972.        ; call  kb_read
  973.        ; mov   al, 111b
  974.        ; call  kb_write
  975.        ; call  kb_read
  976.  
  977.         mov     al, 0xF3     ; set repeat rate & delay
  978.         call    kb_write
  979. ;        call  kb_read
  980.         mov     al, 0; 30 250 ;00100010b ; 24 500  ;00100100b  ; 20 500
  981.         call    kb_write
  982. ;        call  kb_read
  983.      ;// mike.dld [
  984.         call    set_lights
  985.      ;// mike.dld ]
  986.         stdcall attach_int_handler, 1, irq1, 0
  987.         DEBUGF  1, "K : IRQ0 error code %x\n", eax
  988. .no_keyboard:
  989.  
  990. ; SET MOUSE
  991.  
  992.         stdcall load_driver, szPS2MDriver
  993. ;        stdcall load_driver, szCOM_MDriver
  994.  
  995.         mov     esi, boot_setmouse
  996.         call    boot_log
  997.         call    setmouse
  998.  
  999. ; Setup serial output console (if enabled)
  1000.  
  1001. if defined debug_com_base
  1002.  
  1003.         ; enable Divisor latch
  1004.  
  1005.         mov     dx, debug_com_base+3
  1006.         mov     al, 1 shl 7
  1007.         out     dx, al
  1008.  
  1009.         ; Set speed to 115200 baud (max speed)
  1010.  
  1011.         mov     dx, debug_com_base
  1012.         mov     al, 0x01
  1013.         out     dx, al
  1014.  
  1015.         mov     dx, debug_com_base+1
  1016.         mov     al, 0x00
  1017.         out     dx, al
  1018.  
  1019.         ; No parity, 8bits words, one stop bit, dlab bit back to 0
  1020.  
  1021.         mov     dx, debug_com_base+3
  1022.         mov     al, 3
  1023.         out     dx, al
  1024.  
  1025.         ; disable interrupts
  1026.  
  1027.         mov     dx, debug_com_base+1
  1028.         mov     al, 0
  1029.         out     dx, al
  1030.  
  1031.         ; clear +  enable fifo (64 bits)
  1032.  
  1033.         mov     dx, debug_com_base+2
  1034.         mov     al, 0x7 + 1 shl 5
  1035.         out     dx, al
  1036.  
  1037.  
  1038. end if
  1039.         mov     eax, [version_inf.rev]
  1040.         DEBUGF  1, "K : kernel SVN r%d\n", eax
  1041.  
  1042.         mov     eax, [cpu_count]
  1043.         test    eax, eax
  1044.         jnz     @F
  1045.         mov     al, 1                             ; at least one CPU
  1046. @@:
  1047.         DEBUGF  1, "K : %d CPU detected\n", eax
  1048.  
  1049.         DEBUGF  1, "K : BAR0 %x \n", [IDE_BAR0_val]:4
  1050.         DEBUGF  1, "K : BAR1 %x \n", [IDE_BAR1_val]:4
  1051.         DEBUGF  1, "K : BAR2 %x \n", [IDE_BAR2_val]:4
  1052.         DEBUGF  1, "K : BAR3 %x \n", [IDE_BAR3_val]:4
  1053.         DEBUGF  1, "K : BAR4 %x \n", [IDEContrRegsBaseAddr]:4
  1054.         DEBUGF  1, "K : IDEContrProgrammingInterface %x \n", [IDEContrProgrammingInterface]:4
  1055.         DEBUGF  1, "K : IDE_Interrupt %x \n", [IDE_Interrupt]:4
  1056. ; START MULTITASKING
  1057.  
  1058. ; A 'All set - press ESC to start' messages if need
  1059. if preboot_blogesc
  1060.         mov     esi, boot_tasking
  1061.         call    boot_log
  1062. .bll1:
  1063.         in      al, 0x60        ; wait for ESC key press
  1064.         cmp     al, 129
  1065.         jne     .bll1
  1066. end if
  1067.  
  1068.         cmp     [IDEContrRegsBaseAddr], 0
  1069.         setnz   [dma_hdd]
  1070.  
  1071. ;-----------------------------------------------------------------------------
  1072. ; set interrupts for IDE Controller
  1073. ;-----------------------------------------------------------------------------
  1074.         mov     esi, boot_set_int_IDE
  1075.         call    boot_log
  1076. set_interrupts_for_IDE_controllers:
  1077.         mov     ax, [IDEContrProgrammingInterface]
  1078.         cmp     ax, 0x0180
  1079.         je      .pata_ide
  1080.  
  1081.         cmp     ax, 0x018a
  1082.         jne     .sata_ide
  1083. ;--------------------------------------
  1084. .pata_ide:
  1085.         cmp     [IDEContrRegsBaseAddr], 0
  1086.         je      .end_set_interrupts
  1087.  
  1088.         stdcall attach_int_handler, 14, IDE_common_irq_handler, 0
  1089.         DEBUGF  1, "K : Set IDE IRQ14 return code %x\n", eax
  1090.         stdcall attach_int_handler, 15, IDE_common_irq_handler, 0
  1091.         DEBUGF  1, "K : Set IDE IRQ15 return code %x\n", eax
  1092.  
  1093.         stdcall enable_irq, 14
  1094.         stdcall enable_irq, 15
  1095.  
  1096.         jmp     .enable_IDE_interrupt
  1097. ;--------------------------------------
  1098. .sata_ide:
  1099.         cmp     ax, 0x0185
  1100.         je      .sata_ide_1
  1101.  
  1102.         cmp     ax, 0x018f
  1103.         jne     .end_set_interrupts
  1104. ;--------------------------------------
  1105. .sata_ide_1:
  1106.         cmp     [IDEContrRegsBaseAddr], 0
  1107.         je      .end_set_interrupts
  1108.  
  1109.         mov     ax, [IDE_Interrupt]
  1110.         movzx   eax, al
  1111.         stdcall attach_int_handler, eax, IDE_common_irq_handler, 0
  1112.         DEBUGF  1, "K : Set IDE IRQ%d return code %x\n", [IDE_Interrupt]:2, eax
  1113.  
  1114.         stdcall enable_irq, eax
  1115. ;--------------------------------------
  1116. .enable_IDE_interrupt:
  1117.         mov     esi, boot_enabling_ide
  1118.         call    boot_log
  1119. ; Enable interrupts in IDE controller for DMA
  1120.         mov     al, 0
  1121.         mov     dx, [IDE_BAR1_val] ;0x3F6
  1122.         add     dx, 2
  1123.         out     dx, al
  1124.         mov     dx, [IDE_BAR3_val] ;0x76
  1125.         add     dx, 2
  1126.         out     dx, al
  1127. ;--------------------------------------
  1128. .end_set_interrupts:
  1129. ;-----------------------------------------------------------------------------
  1130.         cmp     [dma_hdd], 0
  1131.         je      .print_pio
  1132. .print_dma:
  1133.         DEBUGF  1, "K : IDE DMA mode\n"
  1134.         jmp     .continue
  1135.  
  1136. .print_pio:
  1137.         DEBUGF  1, "K : IDE PIO mode\n"
  1138. .continue:
  1139.  
  1140.         mov     [timer_ticks_enable], 1         ; for cd driver
  1141.  
  1142.         sti
  1143. ;        call    change_task
  1144.  
  1145.         jmp     osloop
  1146.  
  1147.  
  1148.         ; Fly :)
  1149.  
  1150. include 'unpacker.inc'
  1151.  
  1152. align 4
  1153. boot_log:
  1154.         pushad
  1155.  
  1156.         mov     ebx, 10*65536
  1157.         mov     bx, word [boot_y]
  1158.         add     [boot_y], dword 10
  1159.         mov     ecx, 0x80ffffff; ASCIIZ string with white color
  1160.         xor     edi, edi
  1161.         mov     edx, esi
  1162.         inc     edi
  1163.         call    dtext
  1164.  
  1165.         mov     [novesachecksum], 1000
  1166.         call    checkVga_N13
  1167.  
  1168.         popad
  1169.  
  1170.         ret
  1171.  
  1172. ; in: edx -> APPDATA for OS/IDLE slot
  1173. ; in: ebx = stack base
  1174. proc setup_os_slot
  1175.         xor     eax, eax
  1176.         mov     ecx, 256/4
  1177.         mov     edi, edx
  1178.         rep stosd
  1179.  
  1180.         mov     eax, tss+0x80
  1181.         call    get_pg_addr
  1182.         inc     eax
  1183.         mov     [edx+APPDATA.io_map], eax
  1184.         mov     eax, tss+0x1080
  1185.         call    get_pg_addr
  1186.         inc     eax
  1187.         mov     [edx+APPDATA.io_map+4], eax
  1188.  
  1189.         mov     dword [edx+APPDATA.pl0_stack], ebx
  1190.         lea     edi, [ebx+0x2000-512]
  1191.         mov     dword [edx+APPDATA.fpu_state], edi
  1192.         mov     dword [edx+APPDATA.saved_esp0], edi
  1193.         mov     dword [edx+APPDATA.saved_esp], edi
  1194.         mov     dword [edx+APPDATA.terminate_protection], 1 ; make unkillable
  1195.  
  1196.         mov     esi, fpu_data
  1197.         mov     ecx, 512/4
  1198.         cld
  1199.         rep movsd
  1200.  
  1201.         lea     eax, [edx+APP_OBJ_OFFSET]
  1202.         mov     dword [edx+APPDATA.fd_obj], eax
  1203.         mov     dword [edx+APPDATA.bk_obj], eax
  1204.  
  1205.         mov     dword [edx+APPDATA.cur_dir], sysdir_path
  1206.  
  1207.         mov     [edx + APPDATA.dir_table], sys_pgdir - OS_BASE
  1208.  
  1209.         mov     eax, edx
  1210.         shr     eax, 3
  1211.         add     eax, CURRENT_TASK - (SLOT_BASE shr 3)
  1212.         mov     [eax+TASKDATA.wnd_number], dh
  1213.         mov     byte [eax+TASKDATA.pid], dh
  1214.  
  1215.         ret
  1216. endp
  1217.  
  1218. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1219. ;                                                                    ;
  1220. ;                    MAIN OS LOOP START                              ;
  1221. ;                                                                    ;
  1222. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1223. align 32
  1224. osloop:
  1225.         mov     edx, osloop_has_work?
  1226.         xor     ecx, ecx
  1227.         call    Wait_events
  1228.         xor     eax, eax
  1229.         xchg    eax, [osloop_nonperiodic_work]
  1230.         test    eax, eax
  1231.         jz      .no_periodic
  1232. ;        call    [draw_pointer]
  1233.         call    __sys_draw_pointer
  1234.         call    window_check_events
  1235.         call    mouse_check_events
  1236.         call    checkmisc
  1237.         call    checkVga_N13
  1238. .no_periodic:
  1239.         call    stack_handler
  1240.         call    check_fdd_motor_status
  1241.         call    check_ATAPI_device_event
  1242.         call    check_lights_state
  1243.         call    check_timers
  1244.         jmp     osloop
  1245. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1246. ;                                                                    ;
  1247. ;                      MAIN OS LOOP END                              ;
  1248. ;                                                                    ;
  1249. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1250. proc osloop_has_work?
  1251.         cmp     [osloop_nonperiodic_work], 0
  1252.         jnz     .yes
  1253.         call    stack_handler_has_work?
  1254.         jnz     .yes
  1255.         call    check_fdd_motor_status_has_work?
  1256.         jnz     .yes
  1257.         call    check_ATAPI_device_event_has_work?
  1258.         jnz     .yes
  1259.         call    check_lights_state_has_work?
  1260.         jnz     .yes
  1261.         call    check_timers_has_work?
  1262.         jnz     .yes
  1263. .no:
  1264.         xor     eax, eax
  1265.         ret
  1266. .yes:
  1267.         xor     eax, eax
  1268.         inc     eax
  1269.         ret
  1270. endp
  1271.  
  1272. proc wakeup_osloop
  1273.         mov     [osloop_nonperiodic_work], 1
  1274.         ret
  1275. endp
  1276.  
  1277. uglobal
  1278. align 4
  1279. osloop_nonperiodic_work dd      ?
  1280. endg
  1281.  
  1282. align 4
  1283. idle_thread:
  1284.         sti
  1285. idle_loop:
  1286.         hlt
  1287.         jmp     idle_loop
  1288.  
  1289.  
  1290.  
  1291. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1292. ;                                                                      ;
  1293. ;                   INCLUDED SYSTEM FILES                              ;
  1294. ;                                                                      ;
  1295. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1296.  
  1297.  
  1298. include "kernel32.inc"
  1299.  
  1300.  
  1301. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1302. ;                                                                      ;
  1303. ;                       KERNEL FUNCTIONS                               ;
  1304. ;                                                                      ;
  1305. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1306.  
  1307. reserve_irqs_ports:
  1308.  
  1309.  
  1310. ; RESERVE PORTS
  1311.         mov     eax, RESERVED_PORTS
  1312.         mov     ecx, 1
  1313.  
  1314.         mov     [eax], dword 4
  1315.  
  1316.         mov     [eax+16], ecx
  1317.         mov     [eax+16+4], dword 0
  1318.         mov     [eax+16+8], dword 0x2D
  1319.  
  1320.         mov     [eax+32], ecx
  1321.         mov     [eax+32+4], dword 0x30
  1322.         mov     [eax+32+8], dword 0x4D
  1323.  
  1324.         mov     [eax+48], ecx
  1325.         mov     [eax+48+4], dword 0x50
  1326.         mov     [eax+48+8], dword 0xDF
  1327.  
  1328.         mov     [eax+64], ecx
  1329.         mov     [eax+64+4], dword 0xE5
  1330.         mov     [eax+64+8], dword 0xFF
  1331.  
  1332.         ret
  1333.  
  1334.  
  1335. iglobal
  1336.   process_number dd 0x2
  1337. endg
  1338.  
  1339. set_variables:
  1340.  
  1341.         mov     ecx, 0x16                    ; flush port 0x60
  1342. .fl60:
  1343.         in      al, 0x60
  1344.         loop    .fl60
  1345.         push    eax
  1346.  
  1347.         mov     ax, [BOOT_VARS+BOOT_Y_RES]
  1348.         shr     ax, 1
  1349.         shl     eax, 16
  1350.         mov     ax, [BOOT_VARS+BOOT_X_RES]
  1351.         shr     ax, 1
  1352.         mov     [MOUSE_X], eax
  1353.         call    wakeup_osloop
  1354.  
  1355.         xor     eax, eax
  1356.         mov     [BTN_ADDR], dword BUTTON_INFO ; address of button list
  1357.  
  1358.         mov     byte [KEY_COUNT], al              ; keyboard buffer
  1359.         mov     byte [BTN_COUNT], al              ; button buffer
  1360. ;        mov   [MOUSE_X],dword 100*65536+100    ; mouse x/y
  1361.  
  1362.         pop     eax
  1363.         ret
  1364.  
  1365. align 4
  1366. ;input  eax=43,bl-byte of output, ecx - number of port
  1367. sys_outport:
  1368.  
  1369.         mov     edi, ecx   ; separate flag for read / write
  1370.         and     ecx, 65535
  1371.  
  1372.         mov     eax, [RESERVED_PORTS]
  1373.         test    eax, eax
  1374.         jnz     .sopl8
  1375.         inc     eax
  1376.         mov     [esp+32], eax
  1377.         ret
  1378.  
  1379.   .sopl8:
  1380.         mov     edx, [TASK_BASE]
  1381.         mov     edx, [edx+0x4]
  1382.     ;and   ecx,65535
  1383.     ;cld - set on interrupt 0x40
  1384.   .sopl1:
  1385.  
  1386.         mov     esi, eax
  1387.         shl     esi, 4
  1388.         add     esi, RESERVED_PORTS
  1389.         cmp     edx, [esi+0]
  1390.         jne     .sopl2
  1391.         cmp     ecx, [esi+4]
  1392.         jb      .sopl2
  1393.         cmp     ecx, [esi+8]
  1394.         jg      .sopl2
  1395. .sopl3:
  1396.  
  1397.         test    edi, 0x80000000; read ?
  1398.         jnz     .sopl4
  1399.  
  1400.         mov     eax, ebx
  1401.         mov     dx, cx   ; write
  1402.         out     dx, al
  1403.         and     [esp+32], dword 0
  1404.         ret
  1405.  
  1406.         .sopl2:
  1407.  
  1408.         dec     eax
  1409.         jnz     .sopl1
  1410.         inc     eax
  1411.         mov     [esp+32], eax
  1412.         ret
  1413.  
  1414.  
  1415.   .sopl4:
  1416.  
  1417.         mov     dx, cx   ; read
  1418.         in      al, dx
  1419.         and     eax, 0xff
  1420.         and     [esp+32], dword 0
  1421.         mov     [esp+20], eax
  1422.         ret
  1423.  
  1424. display_number:
  1425. ;It is not optimization
  1426.         mov     eax, ebx
  1427.         mov     ebx, ecx
  1428.         mov     ecx, edx
  1429.         mov     edx, esi
  1430.         mov     esi, edi
  1431. ; eax = print type, al=0 -> ebx is number
  1432. ;                   al=1 -> ebx is pointer
  1433. ;                   ah=0 -> display decimal
  1434. ;                   ah=1 -> display hexadecimal
  1435. ;                   ah=2 -> display binary
  1436. ;                   eax bits 16-21 = number of digits to display (0-32)
  1437. ;                   eax bits 22-31 = reserved
  1438. ;
  1439. ; ebx = number or pointer
  1440. ; ecx = x shl 16 + y
  1441. ; edx = color
  1442.         xor     edi, edi
  1443. display_number_force:
  1444.         push    eax
  1445.         and     eax, 0x3fffffff
  1446.         cmp     eax, 0xffff     ; length > 0 ?
  1447.         pop     eax
  1448.         jge     cont_displ
  1449.         ret
  1450.    cont_displ:
  1451.         push    eax
  1452.         and     eax, 0x3fffffff
  1453.         cmp     eax, 61*0x10000  ; length <= 60 ?
  1454.         pop     eax
  1455.         jb      cont_displ2
  1456.         ret
  1457.    cont_displ2:
  1458.  
  1459.         pushad
  1460.  
  1461.         cmp     al, 1            ; ecx is a pointer ?
  1462.         jne     displnl1
  1463.         mov     ebp, ebx
  1464.         add     ebp, 4
  1465.         mov     ebp, [ebp+std_application_base_address]
  1466.         mov     ebx, [ebx+std_application_base_address]
  1467.  displnl1:
  1468.         sub     esp, 64
  1469.  
  1470.         test    ah, ah            ; DECIMAL
  1471.         jnz     no_display_desnum
  1472.         shr     eax, 16
  1473.         and     eax, 0xC03f
  1474. ;     and   eax,0x3f
  1475.         push    eax
  1476.         and     eax, 0x3f
  1477.         mov     edi, esp
  1478.         add     edi, 4+64-1
  1479.         mov     ecx, eax
  1480.         mov     eax, ebx
  1481.         mov     ebx, 10
  1482.  d_desnum:
  1483.         xor     edx, edx
  1484.         call    division_64_bits
  1485.         div     ebx
  1486.         add     dl, 48
  1487.         mov     [edi], dl
  1488.         dec     edi
  1489.         loop    d_desnum
  1490.         pop     eax
  1491.         call    normalize_number
  1492.         call    draw_num_text
  1493.         add     esp, 64
  1494.         popad
  1495.         ret
  1496.    no_display_desnum:
  1497.  
  1498.         cmp     ah, 0x01         ; HEXADECIMAL
  1499.         jne     no_display_hexnum
  1500.         shr     eax, 16
  1501.         and     eax, 0xC03f
  1502. ;     and   eax,0x3f
  1503.         push    eax
  1504.         and     eax, 0x3f
  1505.         mov     edi, esp
  1506.         add     edi, 4+64-1
  1507.         mov     ecx, eax
  1508.         mov     eax, ebx
  1509.         mov     ebx, 16
  1510.    d_hexnum:
  1511.         xor     edx, edx
  1512.         call    division_64_bits
  1513.         div     ebx
  1514.    hexletters = __fdo_hexdigits
  1515.         add     edx, hexletters
  1516.         mov     dl, [edx]
  1517.         mov     [edi], dl
  1518.         dec     edi
  1519.         loop    d_hexnum
  1520.         pop     eax
  1521.         call    normalize_number
  1522.         call    draw_num_text
  1523.         add     esp, 64
  1524.         popad
  1525.         ret
  1526.    no_display_hexnum:
  1527.  
  1528.         cmp     ah, 0x02         ; BINARY
  1529.         jne     no_display_binnum
  1530.         shr     eax, 16
  1531.         and     eax, 0xC03f
  1532. ;     and   eax,0x3f
  1533.         push    eax
  1534.         and     eax, 0x3f
  1535.         mov     edi, esp
  1536.         add     edi, 4+64-1
  1537.         mov     ecx, eax
  1538.         mov     eax, ebx
  1539.         mov     ebx, 2
  1540.    d_binnum:
  1541.         xor     edx, edx
  1542.         call    division_64_bits
  1543.         div     ebx
  1544.         add     dl, 48
  1545.         mov     [edi], dl
  1546.         dec     edi
  1547.         loop    d_binnum
  1548.         pop     eax
  1549.         call    normalize_number
  1550.         call    draw_num_text
  1551.         add     esp, 64
  1552.         popad
  1553.         ret
  1554.    no_display_binnum:
  1555.  
  1556.         add     esp, 64
  1557.         popad
  1558.         ret
  1559.  
  1560. normalize_number:
  1561.         test    ah, 0x80
  1562.         jz      .continue
  1563.         mov     ecx, 48
  1564.         and     eax, 0x3f
  1565. @@:
  1566.         inc     edi
  1567.         cmp     [edi], cl
  1568.         jne     .continue
  1569.         dec     eax
  1570.         cmp     eax, 1
  1571.         ja      @r
  1572.         mov     al, 1
  1573. .continue:
  1574.         and     eax, 0x3f
  1575.         ret
  1576.  
  1577. division_64_bits:
  1578.         test    [esp+1+4], byte 0x40
  1579.         jz      .continue
  1580.         push    eax
  1581.         mov     eax, ebp
  1582.         div     ebx
  1583.         mov     ebp, eax
  1584.         pop     eax
  1585. .continue:
  1586.         ret
  1587.  
  1588. draw_num_text:
  1589.         mov     esi, eax
  1590.         mov     edx, 64+4
  1591.         sub     edx, eax
  1592.         add     edx, esp
  1593.         mov     ebx, [esp+64+32-8+4]
  1594. ; add window start x & y
  1595.         mov     ecx, [TASK_BASE]
  1596.  
  1597.         mov     edi, [CURRENT_TASK]
  1598.         shl     edi, 8
  1599.  
  1600.         mov     eax, [ecx-twdw+WDATA.box.left]
  1601.         add     eax, [edi+SLOT_BASE+APPDATA.wnd_clientbox.left]
  1602.         shl     eax, 16
  1603.         add     eax, [ecx-twdw+WDATA.box.top]
  1604.         add     eax, [edi+SLOT_BASE+APPDATA.wnd_clientbox.top]
  1605.         add     ebx, eax
  1606.         mov     ecx, [esp+64+32-12+4]
  1607.         and     ecx, not 0x80000000     ; force counted string
  1608.         mov     eax, [esp+64+8]         ; background color (if given)
  1609.         mov     edi, [esp+64+4]
  1610.         jmp     dtext
  1611.  
  1612. align 4
  1613.  
  1614. sys_setup:
  1615.  
  1616. ; 1=roland mpu midi base , base io address
  1617. ; 2=keyboard   1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus
  1618. ; 3=cd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
  1619. ; 5=system language, 1eng 2fi 3ger 4rus
  1620. ; 7=hd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
  1621. ; 8=fat32 partition in hd
  1622. ; 9
  1623. ; 10 = sound dma channel
  1624. ; 11 = enable lba read
  1625. ; 12 = enable pci access
  1626.  
  1627.  
  1628.         and     [esp+32], dword 0
  1629.         dec     ebx                             ; MIDI
  1630.         jnz     nsyse1
  1631.         cmp     ecx, 0x100
  1632.  
  1633.         jb      nsyse1
  1634.         mov     esi, 65535
  1635.         cmp     esi, ecx
  1636.  
  1637.         jb      nsyse1
  1638.         mov     [midi_base], cx ;bx
  1639.         mov     word [mididp], cx;bx
  1640.         inc     cx              ;bx
  1641.         mov     word [midisp], cx;bx
  1642.         ret
  1643.  
  1644. iglobal
  1645. midi_base dw 0
  1646. endg
  1647.  
  1648.    nsyse1:
  1649.         dec     ebx                              ; KEYBOARD
  1650.         jnz     nsyse2
  1651.         mov     edi, [TASK_BASE]
  1652.         mov     eax, [edi+TASKDATA.mem_start]
  1653.         add     eax, edx
  1654.  
  1655.         dec     ecx
  1656.         jnz     kbnobase
  1657.         mov     ebx, keymap
  1658.         mov     ecx, 128
  1659.         call    memmove
  1660.         ret
  1661.    kbnobase:
  1662.         dec     ecx
  1663.         jnz     kbnoshift
  1664.  
  1665.         mov     ebx, keymap_shift
  1666.         mov     ecx, 128
  1667.         call    memmove
  1668.         ret
  1669.    kbnoshift:
  1670.         dec     ecx
  1671.         jnz     kbnoalt
  1672.         mov     ebx, keymap_alt
  1673.         mov     ecx, 128
  1674.         call    memmove
  1675.         ret
  1676.    kbnoalt:
  1677.         sub     ecx, 6
  1678.         jnz     kbnocountry
  1679.         mov     word [keyboard], dx
  1680.         ret
  1681.    kbnocountry:
  1682.         mov     [esp+32], dword 1
  1683.         ret
  1684.    nsyse2:
  1685.         dec     ebx                         ; CD
  1686.         jnz     nsyse4
  1687.  
  1688.         test    ecx, ecx
  1689.         jz      nosesl
  1690.  
  1691.         cmp     ecx, 4
  1692.         ja      nosesl
  1693.         mov     [cd_base], cl
  1694.  
  1695.         dec     ecx
  1696.         jnz     noprma
  1697.         mov     eax, [hd_address_table]
  1698.         mov     [cdbase], eax   ;0x1f0
  1699.         mov     [cdid], 0xa0
  1700.    noprma:
  1701.  
  1702.         dec     ecx
  1703.         jnz     noprsl
  1704.         mov     eax, [hd_address_table]
  1705.         mov     [cdbase], eax   ;0x1f0
  1706.         mov     [cdid], 0xb0
  1707.    noprsl:
  1708.         dec     ecx
  1709.         jnz     nosema
  1710.         mov     eax, [hd_address_table+16]
  1711.         mov     [cdbase], eax   ;0x170
  1712.         mov     [cdid], 0xa0
  1713.    nosema:
  1714.         dec     ecx
  1715.         jnz     nosesl
  1716.         mov     eax, [hd_address_table+16]
  1717.         mov     [cdbase], eax   ;0x170
  1718.         mov     [cdid], 0xb0
  1719.    nosesl:
  1720.         ret
  1721.  
  1722. iglobal
  1723. cd_base db 0
  1724.  
  1725. endg
  1726.    nsyse4:
  1727.  
  1728.         sub     ebx, 2           ; SYSTEM LANGUAGE
  1729.         jnz     nsyse5
  1730.         mov     [syslang], ecx
  1731.         ret
  1732.    nsyse5:
  1733.  
  1734.         sub     ebx, 2          ; HD BASE - obsolete
  1735.         jnz     nsyse7
  1736.  
  1737.    nosethd:
  1738.         ret
  1739.  
  1740. nsyse7:
  1741.  
  1742. ;     cmp  eax,8                      ; HD PARTITION - obsolete
  1743.         dec     ebx
  1744.         jnz     nsyse8
  1745.         ret
  1746.  
  1747. nsyse8:
  1748. ;     cmp  eax,11                     ; ENABLE LBA READ
  1749.         and     ecx, 1
  1750.         sub     ebx, 3
  1751.         jnz     no_set_lba_read
  1752.         mov     [lba_read_enabled], ecx
  1753.         ret
  1754.  
  1755. no_set_lba_read:
  1756. ;     cmp  eax,12                     ; ENABLE PCI ACCESS
  1757.         dec     ebx
  1758.         jnz     sys_setup_err
  1759.         mov     [pci_access_enabled], ecx
  1760.         ret
  1761.  
  1762. sys_setup_err:
  1763.         or      [esp+32], dword -1
  1764.         ret
  1765.  
  1766. align 4
  1767.  
  1768. sys_getsetup:
  1769.  
  1770. ; 1=roland mpu midi base , base io address
  1771. ; 2=keyboard   1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus
  1772. ; 3=cd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
  1773. ; 5=system language, 1eng 2fi 3ger 4rus
  1774. ; 7=hd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
  1775. ; 8=fat32 partition in hd
  1776. ; 9=get hs timer tic
  1777.  
  1778. ;     cmp  eax,1
  1779.         dec     ebx
  1780.         jnz     ngsyse1
  1781.         movzx   eax, [midi_base]
  1782.         mov     [esp+32], eax
  1783.         ret
  1784. ngsyse1:
  1785. ;     cmp  eax,2
  1786.         dec     ebx
  1787.         jnz     ngsyse2
  1788.  
  1789.         mov     edi, [TASK_BASE]
  1790.         mov     ebx, [edi+TASKDATA.mem_start]
  1791.         add     ebx, edx
  1792.  
  1793. ;     cmp  ebx,1
  1794.         dec     ecx
  1795.         jnz     kbnobaseret
  1796.         mov     eax, keymap
  1797.         mov     ecx, 128
  1798.         call    memmove
  1799.         ret
  1800. kbnobaseret:
  1801. ;     cmp  ebx,2
  1802.         dec     ecx
  1803.         jnz     kbnoshiftret
  1804.  
  1805.         mov     eax, keymap_shift
  1806.         mov     ecx, 128
  1807.         call    memmove
  1808.         ret
  1809. kbnoshiftret:
  1810. ;     cmp  ebx,3
  1811.         dec     ecx
  1812.         jne     kbnoaltret
  1813.  
  1814.         mov     eax, keymap_alt
  1815.         mov     ecx, 128
  1816.         call    memmove
  1817.         ret
  1818. kbnoaltret:
  1819. ;     cmp  ebx,9
  1820.         sub     ecx, 6
  1821.         jnz     ngsyse2
  1822.         movzx   eax, word [keyboard]
  1823.         mov     [esp+32], eax
  1824.         ret
  1825.  
  1826.  
  1827. ngsyse2:
  1828. ;         cmp  eax,3
  1829.         dec     ebx
  1830.         jnz     ngsyse3
  1831.         movzx   eax, [cd_base]
  1832.         mov     [esp+32], eax
  1833.         ret
  1834. ngsyse3:
  1835. ;         cmp  eax,5
  1836.         sub     ebx, 2
  1837.         jnz     ngsyse5
  1838.         mov     eax, [syslang]
  1839.         mov     [esp+32], eax
  1840.         ret
  1841. ngsyse5:
  1842. ;     cmp  eax,7
  1843.         sub     ebx, 2
  1844.         jnz     ngsyse7
  1845.         xor     eax, eax
  1846.         mov     [esp+32], eax
  1847.         ret
  1848. ngsyse7:
  1849. ;     cmp  eax,8
  1850.         dec     ebx
  1851.         jnz     ngsyse8
  1852.         mov     eax, [fat32part]
  1853.         mov     [esp+32], eax
  1854.         ret
  1855. ngsyse8:
  1856. ;     cmp  eax,9
  1857.         dec     ebx
  1858.         jnz     ngsyse9
  1859.         mov     eax, [timer_ticks];[0xfdf0]
  1860.         mov     [esp+32], eax
  1861.         ret
  1862. ngsyse9:
  1863. ;     cmp  eax,11
  1864.         sub     ebx, 2
  1865.         jnz     ngsyse11
  1866.         mov     eax, [lba_read_enabled]
  1867.         mov     [esp+32], eax
  1868.         ret
  1869. ngsyse11:
  1870. ;     cmp  eax,12
  1871.         dec     ebx
  1872.         jnz     ngsyse12
  1873.         mov     eax, [pci_access_enabled]
  1874.         mov     [esp+32], eax
  1875.         ret
  1876. ngsyse12:
  1877.         mov     [esp+32], dword 1
  1878.         ret
  1879.  
  1880.  
  1881. get_timer_ticks:
  1882.         mov     eax, [timer_ticks]
  1883.         ret
  1884.  
  1885. iglobal
  1886. align 4
  1887. mousefn dd msscreen, mswin, msbutton, msset
  1888.         dd app_load_cursor
  1889.         dd app_set_cursor
  1890.         dd app_delete_cursor
  1891.         dd msz
  1892. endg
  1893.  
  1894. readmousepos:
  1895.  
  1896. ; eax=0 screen relative
  1897. ; eax=1 window relative
  1898. ; eax=2 buttons pressed
  1899. ; eax=3 set mouse pos   ; reserved
  1900. ; eax=4 load cursor
  1901. ; eax=5 set cursor
  1902. ; eax=6 delete cursor   ; reserved
  1903. ; eax=7 get mouse_z
  1904.  
  1905.         cmp     ebx, 7
  1906.         ja      msset
  1907.         jmp     [mousefn+ebx*4]
  1908. msscreen:
  1909.         mov     eax, [MOUSE_X]
  1910.         shl     eax, 16
  1911.         mov     ax, [MOUSE_Y]
  1912.         mov     [esp+36-4], eax
  1913.         ret
  1914. mswin:
  1915.         mov     eax, [MOUSE_X]
  1916.         shl     eax, 16
  1917.         mov     ax, [MOUSE_Y]
  1918.         mov     esi, [TASK_BASE]
  1919.         mov     bx, word [esi-twdw+WDATA.box.left]
  1920.         shl     ebx, 16
  1921.         mov     bx, word [esi-twdw+WDATA.box.top]
  1922.         sub     eax, ebx
  1923.  
  1924.         mov     edi, [CURRENT_TASK]
  1925.         shl     edi, 8
  1926.         sub     ax, word[edi+SLOT_BASE+APPDATA.wnd_clientbox.top]
  1927.         rol     eax, 16
  1928.         sub     ax, word[edi+SLOT_BASE+APPDATA.wnd_clientbox.left]
  1929.         rol     eax, 16
  1930.         mov     [esp+36-4], eax
  1931.         ret
  1932. msbutton:
  1933.         movzx   eax, byte [BTN_DOWN]
  1934.         mov     [esp+36-4], eax
  1935.         ret
  1936. msz:
  1937.         mov     edi, [TASK_COUNT]
  1938.         movzx   edi, word [WIN_POS + edi*2]
  1939.         cmp     edi, [CURRENT_TASK]
  1940.         jne     @f
  1941.         mov     ax, [MOUSE_SCROLL_H]
  1942.         shl     eax, 16
  1943.         mov     ax, [MOUSE_SCROLL_V]
  1944.         mov     [esp+36-4], eax
  1945.         and     [MOUSE_SCROLL_H], word 0
  1946.         and     [MOUSE_SCROLL_V], word 0
  1947.         ret
  1948.        @@:
  1949.         and     [esp+36-4], dword 0
  1950. ;           ret
  1951. msset:
  1952.         ret
  1953.  
  1954. app_load_cursor:
  1955.         cmp     ecx, OS_BASE
  1956.         jae     msset
  1957.         stdcall load_cursor, ecx, edx
  1958.         mov     [esp+36-4], eax
  1959.         ret
  1960.  
  1961. app_set_cursor:
  1962.         stdcall set_cursor, ecx
  1963.         mov     [esp+36-4], eax
  1964.         ret
  1965.  
  1966. app_delete_cursor:
  1967.         stdcall delete_cursor, ecx
  1968.         mov     [esp+36-4], eax
  1969.         ret
  1970.  
  1971. is_input:
  1972.  
  1973.         push    edx
  1974.         mov     dx, word [midisp]
  1975.         in      al, dx
  1976.         and     al, 0x80
  1977.         pop     edx
  1978.         ret
  1979.  
  1980. is_output:
  1981.  
  1982.         push    edx
  1983.         mov     dx, word [midisp]
  1984.         in      al, dx
  1985.         and     al, 0x40
  1986.         pop     edx
  1987.         ret
  1988.  
  1989.  
  1990. get_mpu_in:
  1991.  
  1992.         push    edx
  1993.         mov     dx, word [mididp]
  1994.         in      al, dx
  1995.         pop     edx
  1996.         ret
  1997.  
  1998.  
  1999. put_mpu_out:
  2000.  
  2001.         push    edx
  2002.         mov     dx, word [mididp]
  2003.         out     dx, al
  2004.         pop     edx
  2005.         ret
  2006.  
  2007.  
  2008.  
  2009. align 4
  2010.  
  2011. sys_midi:
  2012.         cmp     [mididp], 0
  2013.         jnz     sm0
  2014.         mov     [esp+36], dword 1
  2015.         ret
  2016. sm0:
  2017.         and     [esp+36], dword 0
  2018.         dec     ebx
  2019.         jnz     smn1
  2020.  ;    call setuart
  2021. su1:
  2022.         call    is_output
  2023.         test    al, al
  2024.         jnz     su1
  2025.         mov     dx, word [midisp]
  2026.         mov     al, 0xff
  2027.         out     dx, al
  2028. su2:
  2029.         mov     dx, word [midisp]
  2030.         mov     al, 0xff
  2031.         out     dx, al
  2032.         call    is_input
  2033.         test    al, al
  2034.         jnz     su2
  2035.         call    get_mpu_in
  2036.         cmp     al, 0xfe
  2037.         jnz     su2
  2038. su3:
  2039.         call    is_output
  2040.         test    al, al
  2041.         jnz     su3
  2042.         mov     dx, word [midisp]
  2043.         mov     al, 0x3f
  2044.         out     dx, al
  2045.         ret
  2046. smn1:
  2047.         dec     ebx
  2048.         jnz     smn2
  2049. sm10:
  2050.         call    get_mpu_in
  2051.         call    is_output
  2052.         test    al, al
  2053.         jnz     sm10
  2054.         mov     al, bl
  2055.         call    put_mpu_out
  2056.         smn2:
  2057.         ret
  2058.  
  2059. detect_devices:
  2060. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2061. ;include 'detect/commouse.inc'
  2062. ;include 'detect/ps2mouse.inc'
  2063. ;include 'detect/dev_fd.inc'
  2064. ;include 'detect/dev_hdcd.inc'
  2065. ;include 'detect/sear_par.inc'
  2066. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2067.         ret
  2068.  
  2069. sys_end:
  2070. ;--------------------------------------
  2071.         cmp     [_display.select_cursor], 0
  2072.         je      @f
  2073. ; restore default cursor before killing
  2074.         pusha
  2075.         mov     ecx, [current_slot]
  2076.         call    restore_default_cursor_before_killing
  2077.         popa
  2078. @@:
  2079. ;--------------------------------------
  2080. ; kill all sockets this process owns
  2081.         pusha
  2082.         mov     edx, [TASK_BASE]
  2083.         mov     edx, [edx+TASKDATA.pid]
  2084.         call    SOCKET_process_end
  2085.         popa
  2086. ;--------------------------------------
  2087.         mov     ecx, [current_slot]
  2088.         mov     eax, [ecx+APPDATA.tls_base]
  2089.         test    eax, eax
  2090.         jz      @F
  2091.  
  2092.         stdcall user_free, eax
  2093. @@:
  2094.  
  2095.         mov     eax, [TASK_BASE]
  2096.         mov     [eax+TASKDATA.state], 3; terminate this program
  2097.         call    wakeup_osloop
  2098.  
  2099. .waitterm:            ; wait here for termination
  2100.         call    change_task
  2101.         jmp     .waitterm
  2102. ;------------------------------------------------------------------------------
  2103. align 4
  2104. restore_default_cursor_before_killing:
  2105.         pushfd
  2106.         cli
  2107.         mov     eax, [def_cursor]
  2108.         mov     [ecx+APPDATA.cursor], eax
  2109.  
  2110.         movzx   eax, word [MOUSE_Y]
  2111.         movzx   ebx, word [MOUSE_X]
  2112. ;        mov     ecx, [Screen_Max_X]
  2113. ;        inc     ecx
  2114. ;        mul     ecx
  2115.         mov     eax, [d_width_calc_area + eax*4]
  2116.  
  2117.         add     eax, [_WinMapAddress]
  2118.         movzx   edx, byte [ebx+eax]
  2119.         shl     edx, 8
  2120.         mov     esi, [edx+SLOT_BASE+APPDATA.cursor]
  2121.  
  2122.         cmp     esi, [current_cursor]
  2123.         je      @f
  2124.  
  2125.         push    esi
  2126.         call    [_display.select_cursor]
  2127.         mov     [current_cursor], esi
  2128. @@:
  2129.         mov     [redrawmouse_unconditional], 1
  2130.         call    wakeup_osloop
  2131.         popfd
  2132.         ret
  2133. ;------------------------------------------------------------------------------
  2134. iglobal
  2135. align 4
  2136. sys_system_table:
  2137.         dd      sysfn_deactivate        ; 1 = deactivate window
  2138.         dd      sysfn_terminate         ; 2 = terminate thread
  2139.         dd      sysfn_activate          ; 3 = activate window
  2140.         dd      sysfn_getidletime       ; 4 = get idle time
  2141.         dd      sysfn_getcpuclock       ; 5 = get cpu clock
  2142.         dd      sysfn_saveramdisk       ; 6 = save ramdisk
  2143.         dd      sysfn_getactive         ; 7 = get active window
  2144.         dd      sysfn_sound_flag        ; 8 = get/set sound_flag
  2145.         dd      sysfn_shutdown          ; 9 = shutdown with parameter
  2146.         dd      sysfn_minimize          ; 10 = minimize window
  2147.         dd      sysfn_getdiskinfo       ; 11 = get disk subsystem info
  2148.         dd      sysfn_lastkey           ; 12 = get last pressed key
  2149.         dd      sysfn_getversion        ; 13 = get kernel version
  2150.         dd      sysfn_waitretrace       ; 14 = wait retrace
  2151.         dd      sysfn_centermouse       ; 15 = center mouse cursor
  2152.         dd      sysfn_getfreemem        ; 16 = get free memory size
  2153.         dd      sysfn_getallmem         ; 17 = get total memory size
  2154.         dd      sysfn_terminate2        ; 18 = terminate thread using PID
  2155.                                         ;                 instead of slot
  2156.         dd      sysfn_mouse_acceleration; 19 = set/get mouse acceleration
  2157.         dd      sysfn_meminfo           ; 20 = get extended memory info
  2158.         dd      sysfn_pid_to_slot       ; 21 = get slot number for pid
  2159.         dd      sysfn_min_rest_window   ; 22 = minimize and restore any window
  2160.         dd      sysfn_min_windows       ; 23 = minimize all windows
  2161.         dd      sysfn_set_screen_sizes  ; 24 = set screen sizes for Vesa
  2162. sysfn_num = ($ - sys_system_table)/4
  2163. endg
  2164. ;------------------------------------------------------------------------------
  2165. sys_system:
  2166.         dec     ebx
  2167.         cmp     ebx, sysfn_num
  2168.         jae     @f
  2169.         jmp     dword [sys_system_table + ebx*4]
  2170. @@:
  2171.         ret
  2172. ;------------------------------------------------------------------------------
  2173. sysfn_shutdown:          ; 18.9 = system shutdown
  2174.         cmp     ecx, 1
  2175.         jl      exit_for_anyone
  2176.         cmp     ecx, 4
  2177.         jg      exit_for_anyone
  2178.         mov     [BOOT_VARS+0x9030], cl
  2179.  
  2180.         mov     eax, [TASK_COUNT]
  2181.         mov     [SYS_SHUTDOWN], al
  2182.         mov     [shutdown_processes], eax
  2183.         call    wakeup_osloop
  2184.         and     dword [esp+32], 0
  2185.  exit_for_anyone:
  2186.         ret
  2187.   uglobal
  2188.    shutdown_processes:
  2189.                        dd 0x0
  2190.   endg
  2191. ;------------------------------------------------------------------------------
  2192. sysfn_terminate:        ; 18.2 = TERMINATE
  2193.         push    ecx
  2194.         cmp     ecx, 2
  2195.         jb      noprocessterminate
  2196.         mov     edx, [TASK_COUNT]
  2197.         cmp     ecx, edx
  2198.         ja      noprocessterminate
  2199.         mov     eax, [TASK_COUNT]
  2200.         shl     ecx, 5
  2201.         mov     edx, [ecx+CURRENT_TASK+TASKDATA.pid]
  2202.         add     ecx, CURRENT_TASK+TASKDATA.state
  2203.         cmp     byte [ecx], 9
  2204.         jz      noprocessterminate
  2205.         push    ecx edx
  2206.         lea     edx, [(ecx-(CURRENT_TASK and 1FFFFFFFh)-TASKDATA.state)*8+SLOT_BASE]
  2207.         call    request_terminate
  2208.         pop     edx ecx
  2209.         test    eax, eax
  2210.         jz      noprocessterminate
  2211. ;--------------------------------------
  2212. ; terminate all network sockets it used
  2213.         pusha
  2214.         mov     eax, edx
  2215.         call    SOCKET_process_end
  2216.         popa
  2217. ;--------------------------------------
  2218.         cmp     [_display.select_cursor], 0
  2219.         je      .restore_end
  2220. ; restore default cursor before killing
  2221.         pusha
  2222.         mov     ecx, [esp+32]
  2223.         shl     ecx, 8
  2224.         add     ecx, SLOT_BASE
  2225.         mov     eax, [def_cursor]
  2226.         cmp     [ecx+APPDATA.cursor], eax
  2227.         je      @f
  2228.         call    restore_default_cursor_before_killing
  2229. @@:
  2230.         popa
  2231. .restore_end:
  2232. ;--------------------------------------
  2233.      ;call MEM_Heap_Lock      ;guarantee that process isn't working with heap
  2234.         mov     [ecx], byte 3; clear possible i40's
  2235.         call    wakeup_osloop
  2236.      ;call MEM_Heap_UnLock
  2237.  
  2238.         cmp     edx, [application_table_owner]; clear app table stat
  2239.         jne     noatsc
  2240.         call    unlock_application_table
  2241. noatsc:
  2242. noprocessterminate:
  2243.         add     esp, 4
  2244.         ret
  2245. ;------------------------------------------------------------------------------
  2246. sysfn_terminate2:
  2247. ;lock application_table_status mutex
  2248. .table_status:
  2249.         call    lock_application_table
  2250.         mov     eax, ecx
  2251.         call    pid_to_slot
  2252.         test    eax, eax
  2253.         jz      .not_found
  2254.         mov     ecx, eax
  2255.         cli
  2256.         call    sysfn_terminate
  2257.         call    unlock_application_table
  2258.         sti
  2259.         and     dword [esp+32], 0
  2260.         ret
  2261. .not_found:
  2262.         call    unlock_application_table
  2263.         or      dword [esp+32], -1
  2264.         ret
  2265. ;------------------------------------------------------------------------------
  2266. sysfn_deactivate:         ; 18.1 = DEACTIVATE WINDOW
  2267.         cmp     ecx, 2
  2268.         jb      .nowindowdeactivate
  2269.         cmp     ecx, [TASK_COUNT]
  2270.         ja      .nowindowdeactivate
  2271.  
  2272.         movzx   esi, word [WIN_STACK + ecx*2]
  2273.         cmp     esi, 1
  2274.         je      .nowindowdeactivate ; already deactive
  2275.  
  2276.         mov     edi, ecx
  2277.         shl     edi, 5
  2278.         add     edi, window_data
  2279.         movzx   esi, word [WIN_STACK + ecx * 2]
  2280.         lea     esi, [WIN_POS + esi * 2]
  2281.         call    window._.window_deactivate
  2282.  
  2283.         call    syscall_display_settings._.calculate_whole_screen
  2284.         call    syscall_display_settings._.redraw_whole_screen
  2285. .nowindowdeactivate:
  2286.         ret
  2287. ;------------------------------------------------------------------------------
  2288. sysfn_activate:         ; 18.3 = ACTIVATE WINDOW
  2289.         cmp     ecx, 2
  2290.         jb      .nowindowactivate
  2291.         cmp     ecx, [TASK_COUNT]
  2292.         ja      .nowindowactivate
  2293. ;-------------------------------------
  2294. @@:
  2295. ; If the window is captured and moved by the user,
  2296. ; then you can't change the position in window stack!!!
  2297.         mov     al, [mouse.active_sys_window.action]
  2298.         and     al, WINDOW_MOVE_AND_RESIZE_FLAGS
  2299.         test    al, al
  2300.         jz      @f
  2301.         call    change_task
  2302.         jmp     @b
  2303. @@:
  2304. ;-------------------------------------
  2305.         mov     [window_minimize], 2; restore window if minimized
  2306.         call    wakeup_osloop
  2307.  
  2308.         movzx   esi, word [WIN_STACK + ecx*2]
  2309.         cmp     esi, [TASK_COUNT]
  2310.         je      .nowindowactivate; already active
  2311.  
  2312.         mov     edi, ecx
  2313.         shl     edi, 5
  2314.         add     edi, window_data
  2315.         movzx   esi, word [WIN_STACK + ecx * 2]
  2316.         lea     esi, [WIN_POS + esi * 2]
  2317.         call    waredraw
  2318. .nowindowactivate:
  2319.         ret
  2320. ;------------------------------------------------------------------------------
  2321. sysfn_getidletime:              ; 18.4 = GET IDLETIME
  2322.         mov     eax, [CURRENT_TASK+32+TASKDATA.cpu_usage]
  2323.         mov     [esp+32], eax
  2324.         ret
  2325. ;------------------------------------------------------------------------------
  2326. sysfn_getcpuclock:              ; 18.5 = GET TSC/SEC
  2327.         mov     eax, dword [cpu_freq]
  2328.         mov     [esp+32], eax
  2329.         ret
  2330. ;------------------------------------------------------------------------------
  2331. get_cpu_freq:
  2332.         mov     eax, dword [cpu_freq]
  2333.         mov     edx, dword [cpu_freq+4]
  2334.         ret
  2335. ;  SAVE ramdisk to /hd/1/menuet.img
  2336. ;!!!!!!!!!!!!!!!!!!!!!!!!
  2337.    include 'blkdev/rdsave.inc'
  2338. ;!!!!!!!!!!!!!!!!!!!!!!!!
  2339. ;------------------------------------------------------------------------------
  2340. align 4
  2341. sysfn_getactive:        ; 18.7 = get active window
  2342.         mov     eax, [TASK_COUNT]
  2343.         movzx   eax, word [WIN_POS + eax*2]
  2344.         mov     [esp+32], eax
  2345.         ret
  2346. ;------------------------------------------------------------------------------
  2347. sysfn_sound_flag:       ; 18.8 = get/set sound_flag
  2348. ;     cmp  ecx,1
  2349.         dec     ecx
  2350.         jnz     nogetsoundflag
  2351.         movzx   eax, byte [sound_flag]; get sound_flag
  2352.         mov     [esp+32], eax
  2353.         ret
  2354.  nogetsoundflag:
  2355. ;     cmp  ecx,2
  2356.         dec     ecx
  2357.         jnz     nosoundflag
  2358.         xor     byte [sound_flag], 1
  2359.  nosoundflag:
  2360.         ret
  2361. ;------------------------------------------------------------------------------
  2362. sysfn_minimize:         ; 18.10 = minimize window
  2363.         mov     [window_minimize], 1
  2364.         call    wakeup_osloop
  2365.         ret
  2366. ;------------------------------------------------------------------------------
  2367. align 4
  2368. sysfn_getdiskinfo:      ; 18.11 = get disk info table
  2369. ;     cmp  ecx,1
  2370.         dec     ecx
  2371.         jnz     full_table
  2372.   small_table:
  2373.         call    for_all_tables
  2374.         mov     ecx, 10
  2375.         cld
  2376.         rep movsb
  2377.         ret
  2378.    for_all_tables:
  2379.         mov     edi, edx
  2380.         mov     esi, DRIVE_DATA
  2381.         ret
  2382.   full_table:
  2383. ;     cmp  ecx,2
  2384.         dec     ecx
  2385.         jnz     exit_for_anyone
  2386.         call    for_all_tables
  2387.         mov     ecx, DRIVE_DATA_SIZE/4
  2388.         cld
  2389.         rep movsd
  2390.         ret
  2391. ;------------------------------------------------------------------------------
  2392. sysfn_lastkey:          ; 18.12 = return 0 (backward compatibility)
  2393.         and     dword [esp+32], 0
  2394.         ret
  2395. ;------------------------------------------------------------------------------
  2396. sysfn_getversion:       ; 18.13 = get kernel ID and version
  2397.         mov     edi, ecx
  2398.         mov     esi, version_inf
  2399.         mov     ecx, version_end-version_inf
  2400.         rep movsb
  2401.         ret
  2402. ;------------------------------------------------------------------------------
  2403. sysfn_waitretrace:     ; 18.14 = sys wait retrace
  2404.      ;wait retrace functions
  2405.  sys_wait_retrace:
  2406.         mov     edx, 0x3da
  2407.  WaitRetrace_loop:
  2408.         in      al, dx
  2409.         test    al, 1000b
  2410.         jz      WaitRetrace_loop
  2411.         and     [esp+32], dword 0
  2412.         ret
  2413. ;------------------------------------------------------------------------------
  2414. align 4
  2415. sysfn_centermouse:      ; 18.15 = mouse centered
  2416. ; removed here by <Lrz>
  2417. ;     call  mouse_centered
  2418. ;* mouse centered - start code- Mario79
  2419. ;mouse_centered:
  2420. ;        push  eax
  2421.         mov     eax, [Screen_Max_X]
  2422.         shr     eax, 1
  2423.         mov     [MOUSE_X], ax
  2424.         mov     eax, [Screen_Max_Y]
  2425.         shr     eax, 1
  2426.         mov     [MOUSE_Y], ax
  2427.         call    wakeup_osloop
  2428. ;        ret
  2429. ;* mouse centered - end code- Mario79
  2430.         xor     eax, eax
  2431.         and     [esp+32], eax
  2432. ;        pop   eax
  2433.         ret
  2434. ;------------------------------------------------------------------------------
  2435. align 4
  2436. sysfn_mouse_acceleration: ; 18.19 = set/get mouse features
  2437.         test    ecx, ecx; get mouse speed factor
  2438.         jnz     .set_mouse_acceleration
  2439.         xor     eax, eax
  2440.         mov     ax, [mouse_speed_factor]
  2441.         mov     [esp+32], eax
  2442.         ret
  2443.  .set_mouse_acceleration:
  2444. ;     cmp  ecx,1  ; set mouse speed factor
  2445.         dec     ecx
  2446.         jnz     .get_mouse_delay
  2447.         mov     [mouse_speed_factor], dx
  2448.         ret
  2449.  .get_mouse_delay:
  2450. ;     cmp  ecx,2  ; get mouse delay
  2451.         dec     ecx
  2452.         jnz     .set_mouse_delay
  2453.         mov     eax, [mouse_delay]
  2454.         mov     [esp+32], eax
  2455.         ret
  2456.  .set_mouse_delay:
  2457. ;     cmp  ecx,3  ; set mouse delay
  2458.         dec     ecx
  2459.         jnz     .set_pointer_position
  2460.         mov     [mouse_delay], edx
  2461.         ret
  2462.  .set_pointer_position:
  2463. ;     cmp  ecx,4  ; set mouse pointer position
  2464.         dec     ecx
  2465.         jnz     .set_mouse_button
  2466.         cmp     dx, word[Screen_Max_Y]
  2467.         ja      .end
  2468.         rol     edx, 16
  2469.         cmp     dx, word[Screen_Max_X]
  2470.         ja      .end
  2471.         mov     [MOUSE_X], edx
  2472.         call    wakeup_osloop
  2473.         ret
  2474.  .set_mouse_button:
  2475. ;     cmp   ecx,5  ; set mouse button features
  2476.         dec     ecx
  2477.         jnz     .end
  2478.         mov     [BTN_DOWN], dl
  2479.         mov     [mouse_active], 1
  2480.         call    wakeup_osloop
  2481.  .end:
  2482.         ret
  2483. ;------------------------------------------------------------------------------
  2484. sysfn_getfreemem:
  2485.         mov     eax, [pg_data.pages_free]
  2486.         shl     eax, 2
  2487.         mov     [esp+32], eax
  2488.         ret
  2489. ;------------------------------------------------------------------------------
  2490. sysfn_getallmem:
  2491.         mov     eax, [MEM_AMOUNT]
  2492.         shr     eax, 10
  2493.         mov     [esp+32], eax
  2494.         ret
  2495. ;------------------------------------------------------------------------------
  2496. sysfn_pid_to_slot:
  2497.         mov     eax, ecx
  2498.         call    pid_to_slot
  2499.         mov     [esp+32], eax
  2500.         ret
  2501. ;------------------------------------------------------------------------------
  2502. sysfn_min_rest_window:
  2503.         pushad
  2504.         mov     eax, edx ; ebx - operating
  2505.         shr     ecx, 1
  2506.         jnc     @f
  2507.         call    pid_to_slot
  2508. @@:
  2509.         or      eax, eax ; eax - number of slot
  2510.         jz      .error
  2511.         cmp     eax, 255    ; varify maximal slot number
  2512.         ja      .error
  2513.         movzx   eax, word [WIN_STACK + eax*2]
  2514.         shr     ecx, 1
  2515.         jc      .restore
  2516.  ; .minimize:
  2517.         call    minimize_window
  2518.         jmp     .exit
  2519. .restore:
  2520.         call    restore_minimized_window
  2521. .exit:
  2522.         popad
  2523.         xor     eax, eax
  2524.         mov     [esp+32], eax
  2525.         ret
  2526. .error:
  2527.         popad
  2528.         xor     eax, eax
  2529.         dec     eax
  2530.         mov     [esp+32], eax
  2531.         ret
  2532. ;------------------------------------------------------------------------------
  2533. sysfn_min_windows:
  2534.         call    minimize_all_window
  2535.         mov     [esp+32], eax
  2536.         call    change_task
  2537.         ret
  2538. ;------------------------------------------------------------------------------
  2539. sysfn_set_screen_sizes:
  2540.         cmp     [SCR_MODE], word 0x13
  2541.         jbe     .exit
  2542.  
  2543.         cmp     [_display.select_cursor], select_cursor
  2544.         jne     .exit
  2545.  
  2546.         cmp     ecx, [display_width_standard]
  2547.         ja      .exit
  2548.  
  2549.         cmp     edx, [display_height_standard]
  2550.         ja      .exit
  2551.  
  2552.         pushfd
  2553.         cli
  2554.         mov     eax, ecx
  2555.         mov     ecx, [_display.pitch]
  2556.         mov     [_display.width], eax
  2557.         dec     eax
  2558.         mov     [_display.height], edx
  2559.         dec     edx
  2560. ; eax - new Screen_Max_X
  2561. ; edx - new Screen_Max_Y
  2562.         mov     [do_not_touch_winmap], 1
  2563.         call    set_screen
  2564.         mov     [do_not_touch_winmap], 0
  2565.         popfd
  2566.         call    change_task
  2567. .exit:
  2568.         ret
  2569. ;------------------------------------------------------------------------------
  2570. uglobal
  2571. screen_workarea RECT
  2572. display_width_standard dd 0
  2573. display_height_standard dd 0
  2574. do_not_touch_winmap db 0
  2575. window_minimize db 0
  2576. sound_flag      db 0
  2577.  
  2578. endg
  2579.  
  2580. UID_NONE=0
  2581. UID_MENUETOS=1   ;official
  2582. UID_KOLIBRI=2    ;russian
  2583.  
  2584. iglobal
  2585. version_inf:
  2586.         db 0,7,7,0  ; version 0.7.7.0
  2587.         db 0
  2588. .rev    dd __REV__
  2589. version_end:
  2590. endg
  2591. ;------------------------------------------------------------------------------
  2592. align 4
  2593. sys_cachetodiskette:
  2594.         cmp     ebx, 1
  2595.         jne     .no_floppy_a_save
  2596.         mov     [flp_number], 1
  2597.         jmp     .save_image_on_floppy
  2598. ;--------------------------------------
  2599. align 4
  2600. .no_floppy_a_save:
  2601.         cmp     ebx, 2
  2602.         jne     .no_floppy_b_save
  2603.         mov     [flp_number], 2
  2604. ;--------------------------------------
  2605. align 4
  2606. .save_image_on_floppy:
  2607.         call    save_image
  2608.         mov     [esp + 32], dword 0
  2609.         cmp     [FDC_Status], 0
  2610.         je      .yes_floppy_save
  2611. ;--------------------------------------
  2612. align 4
  2613. .no_floppy_b_save:
  2614.         mov     [esp + 32], dword 1
  2615. ;--------------------------------------
  2616. align 4
  2617. .yes_floppy_save:
  2618.         ret
  2619. ;------------------------------------------------------------------------------
  2620. uglobal
  2621. ;  bgrchanged  dd  0x0
  2622. align 4
  2623. bgrlockpid dd 0
  2624. bgrlock db 0
  2625. endg
  2626. ;------------------------------------------------------------------------------
  2627. align 4
  2628. sys_background:
  2629.         cmp     ebx, 1                     ; BACKGROUND SIZE
  2630.         jnz     nosb1
  2631.         test    ecx, ecx
  2632.         jz      sbgrr
  2633.  
  2634.         test    edx, edx
  2635.         jz      sbgrr
  2636. ;--------------------------------------
  2637. align 4
  2638. @@:
  2639. ;;Maxis use atomic bts for mutexes  4.4.2009
  2640.         bts     dword [bgrlock], 0
  2641.         jnc     @f
  2642.         call    change_task
  2643.         jmp     @b
  2644. ;--------------------------------------
  2645. align 4
  2646. @@:
  2647.         mov     [BgrDataWidth], ecx
  2648.         mov     [BgrDataHeight], edx
  2649. ;    mov   [bgrchanged],1
  2650.  
  2651.         pushad
  2652. ; return memory for old background
  2653.         mov     eax, [img_background]
  2654.         cmp     eax, static_background_data
  2655.         jz      @f
  2656.         stdcall kernel_free, eax
  2657. ;--------------------------------------
  2658. align 4
  2659. @@:
  2660. ; calculate RAW size
  2661.         xor     eax, eax
  2662.         inc     eax
  2663.         cmp     [BgrDataWidth], eax
  2664.         jae     @f
  2665.         mov     [BgrDataWidth], eax
  2666. ;--------------------------------------
  2667. align 4
  2668. @@:
  2669.         cmp     [BgrDataHeight], eax
  2670.         jae     @f
  2671.         mov     [BgrDataHeight], eax
  2672. ;--------------------------------------
  2673. align 4
  2674. @@:
  2675.         mov     eax, [BgrDataWidth]
  2676.         imul    eax, [BgrDataHeight]
  2677.         lea     eax, [eax*3]
  2678. ; it is reserved with aligned to the boundary of 4 KB pages,
  2679. ; otherwise there may be exceptions a page fault for vesa20_drawbackground_tiled
  2680. ; because the 32 bit read is used for  high performance: "mov eax,[esi]"
  2681.         shr     eax, 12
  2682.         inc     eax
  2683.         shl     eax, 12
  2684.         mov     [mem_BACKGROUND], eax
  2685. ; get memory for new background
  2686.         stdcall kernel_alloc, eax
  2687.         test    eax, eax
  2688.         jz      .memfailed
  2689.         mov     [img_background], eax
  2690.         jmp     .exit
  2691. ;--------------------------------------
  2692. align 4
  2693. .memfailed:
  2694. ; revert to static monotone data
  2695.         mov     [img_background], static_background_data
  2696.         xor     eax, eax
  2697.         inc     eax
  2698.         mov     [BgrDataWidth], eax
  2699.         mov     [BgrDataHeight], eax
  2700.         mov     [mem_BACKGROUND], 4
  2701. ;--------------------------------------
  2702. align 4
  2703. .exit:
  2704.         popad
  2705.         mov     [bgrlock], 0
  2706. ;--------------------------------------
  2707. align 4
  2708. sbgrr:
  2709.         ret
  2710. ;------------------------------------------------------------------------------
  2711. align 4
  2712. nosb1:
  2713.         cmp     ebx, 2                     ; SET PIXEL
  2714.         jnz     nosb2
  2715.  
  2716.         mov     eax, [img_background]
  2717.         test    ecx, ecx
  2718.         jz      @f
  2719.         cmp     eax, static_background_data
  2720.         jz      .ret
  2721. ;--------------------------------------
  2722. align 4
  2723. @@:
  2724.         mov     ebx, [mem_BACKGROUND]
  2725.         add     ebx, 4095
  2726.         and     ebx, -4096
  2727.         sub     ebx, 4
  2728.         cmp     ecx, ebx
  2729.         ja      .ret
  2730.  
  2731.         mov     ebx, [eax+ecx]
  2732.         and     ebx, 0xFF000000;255*256*256*256
  2733.         and     edx, 0x00FFFFFF;255*256*256+255*256+255
  2734.         add     edx, ebx
  2735.         mov     [eax+ecx], edx
  2736. ;--------------------------------------
  2737. align 4
  2738. .ret:
  2739.         ret
  2740. ;------------------------------------------------------------------------------
  2741. align 4
  2742. nosb2:
  2743.         cmp     ebx, 3                     ; DRAW BACKGROUND
  2744.         jnz     nosb3
  2745. ;--------------------------------------
  2746. align 4
  2747. draw_background_temp:
  2748.         mov     [background_defined], 1
  2749.         call    force_redraw_background
  2750. ;--------------------------------------
  2751. align 4
  2752. nosb31:
  2753.         ret
  2754. ;------------------------------------------------------------------------------
  2755. align 4
  2756. nosb3:
  2757.         cmp     ebx, 4                     ; TILED / STRETCHED
  2758.         jnz     nosb4
  2759.         cmp     ecx, [BgrDrawMode]
  2760.         je      nosb41
  2761.         mov     [BgrDrawMode], ecx
  2762. ;--------------------------------------
  2763. align 4
  2764. nosb41:
  2765.         ret
  2766. ;------------------------------------------------------------------------------
  2767. align 4
  2768. nosb4:
  2769.         cmp     ebx, 5                     ; BLOCK MOVE TO BGR
  2770.         jnz     nosb5
  2771.         cmp     [img_background], static_background_data
  2772.         jnz     @f
  2773.         test    edx, edx
  2774.         jnz     .fin
  2775.         cmp     esi, 4
  2776.         ja      .fin
  2777. ;--------------------------------------
  2778. align 4
  2779. @@:
  2780.   ; bughere
  2781.         mov     eax, ecx
  2782.         mov     ebx, edx
  2783.         add     ebx, [img_background];IMG_BACKGROUND
  2784.         mov     ecx, esi
  2785.         call    memmove
  2786. ;--------------------------------------
  2787. align 4
  2788. .fin:
  2789.         ret
  2790. ;------------------------------------------------------------------------------
  2791. align 4
  2792. nosb5:
  2793.         cmp     ebx, 6
  2794.         jnz     nosb6
  2795. ;--------------------------------------
  2796. align 4
  2797. ;;Maxis use atomic bts for mutex 4.4.2009
  2798. @@:
  2799.         bts     dword [bgrlock], 0
  2800.         jnc     @f
  2801.         call    change_task
  2802.         jmp     @b
  2803. ;--------------------------------------
  2804. align 4
  2805. @@:
  2806.         mov     eax, [CURRENT_TASK]
  2807.         mov     [bgrlockpid], eax
  2808.         cmp     [img_background], static_background_data
  2809.         jz      .nomem
  2810.         stdcall user_alloc, [mem_BACKGROUND]
  2811.         mov     [esp+32], eax
  2812.         test    eax, eax
  2813.         jz      .nomem
  2814.         mov     ebx, eax
  2815.         shr     ebx, 12
  2816.         or      dword [page_tabs+(ebx-1)*4], DONT_FREE_BLOCK
  2817.         mov     esi, [img_background]
  2818.         shr     esi, 12
  2819.         mov     ecx, [mem_BACKGROUND]
  2820.         add     ecx, 0xFFF
  2821.         shr     ecx, 12
  2822. ;--------------------------------------
  2823. align 4
  2824. .z:
  2825.         mov     eax, [page_tabs+ebx*4]
  2826.         test    al, 1
  2827.         jz      @f
  2828.         call    free_page
  2829. ;--------------------------------------
  2830. align 4
  2831. @@:
  2832.         mov     eax, [page_tabs+esi*4]
  2833.         or      al, PG_UW
  2834.         mov     [page_tabs+ebx*4], eax
  2835.         mov     eax, ebx
  2836.         shl     eax, 12
  2837.         invlpg  [eax]
  2838.         inc     ebx
  2839.         inc     esi
  2840.         loop    .z
  2841.         ret
  2842. ;--------------------------------------
  2843. align 4
  2844. .nomem:
  2845.         and     [bgrlockpid], 0
  2846.         mov     [bgrlock], 0
  2847. ;------------------------------------------------------------------------------
  2848. align 4
  2849. nosb6:
  2850.         cmp     ebx, 7
  2851.         jnz     nosb7
  2852.         cmp     [bgrlock], 0
  2853.         jz      .err
  2854.         mov     eax, [CURRENT_TASK]
  2855.         cmp     [bgrlockpid], eax
  2856.         jnz     .err
  2857.         mov     eax, ecx
  2858.         mov     ebx, ecx
  2859.         shr     eax, 12
  2860.         mov     ecx, [page_tabs+(eax-1)*4]
  2861.         test    cl, USED_BLOCK+DONT_FREE_BLOCK
  2862.         jz      .err
  2863.         jnp     .err
  2864.         push    eax
  2865.         shr     ecx, 12
  2866.         dec     ecx
  2867. ;--------------------------------------
  2868. align 4
  2869. @@:
  2870.         and     dword [page_tabs+eax*4], 0
  2871.         mov     edx, eax
  2872.         shl     edx, 12
  2873.         push    eax
  2874.         invlpg  [edx]
  2875.         pop     eax
  2876.         inc     eax
  2877.         loop    @b
  2878.         pop     eax
  2879.         and     dword [page_tabs+(eax-1)*4], not DONT_FREE_BLOCK
  2880.         stdcall user_free, ebx
  2881.         mov     [esp+32], eax
  2882.         and     [bgrlockpid], 0
  2883.         mov     [bgrlock], 0
  2884.