Subversion Repositories Kolibri OS

Rev

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