Subversion Repositories Kolibri OS

Rev

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

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