Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;
  3. ;; Kolibri OS - based on source code Menuet OS, but not 100% compatible.
  4. ;;
  5. ;; See file COPYING or GNU.TXT for details with these additional details:
  6. ;;     - All code written in 32 bit x86 assembly language
  7. ;;     - No external code (eg. bios) at process execution time
  8. ;;
  9. ;;
  10. ;;   Compile with last version FASM
  11. ;;
  12. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  13. include "kglobals.inc"
  14. include "lang.inc"
  15.  
  16. WinMapAddress           equ     0x460000
  17. display_data       = 0x460000
  18.  
  19. max_processes     equ   255
  20.  
  21. window_data       equ   0x0000
  22. tss_data           equ   0xD20000
  23. ;tss_step           equ   (128+2048) ; tss & i/o - 16384 ports, * 256=557056
  24. tss_step           equ   (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4
  25. draw_data         equ   0xC00000
  26. sysint_stack_data equ   0xC03000
  27.  
  28.  
  29. twdw               equ   (0x3000-window_data)
  30.  
  31. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  32. ;;
  33. ;;   Included files:
  34. ;;
  35. ;;   Kernel16.inc
  36. ;;    - Booteng.inc   English text for bootup
  37. ;;    - Bootcode.inc  Hardware setup
  38. ;;    - Pci16.inc     PCI functions
  39. ;;
  40. ;;   Kernel32.inc
  41. ;;    - Sys32.inc     Process management
  42. ;;    - Shutdown.inc  Shutdown and restart
  43. ;;    - Fat32.inc     Read / write hd
  44. ;;    - Vesa12.inc    Vesa 1.2 driver
  45. ;;    - Vesa20.inc    Vesa 2.0 driver
  46. ;;    - Vga.inc       VGA driver
  47. ;;    - Stack.inc     Network interface
  48. ;;    - Mouse.inc     Mouse pointer
  49. ;;    - Scincode.inc  Window skinning
  50. ;;    - Pci32.inc     PCI functions
  51. ;;
  52. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  53.  
  54.  
  55. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  56. ;;                                                                      ;;
  57. ;;                  16 BIT ENTRY FROM BOOTSECTOR                        ;;
  58. ;;                                                                      ;;
  59. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  60.  
  61. use16
  62.                   org   0x10000
  63. macro diff16 title,l2
  64.  {
  65.   local s,d,l1
  66.   s = l2
  67.   display title,': 0x'
  68.   repeat 8
  69.    d = 48 + s shr ((8-%) shl 2) and $0F
  70.    if d > 57
  71.     d = d + 65-57-1
  72.    end if
  73.    display d
  74.   end repeat
  75.   display 13,10
  76.  }      
  77.                   jmp   start_of_code
  78.  
  79. ; mike.dld {
  80. db 0
  81. dd servetable-0x10000
  82. draw_line       dd __sys_draw_line
  83. disable_mouse   dd __sys_disable_mouse
  84. draw_pointer    dd __sys_draw_pointer
  85. drawbar         dd __sys_drawbar
  86. putpixel        dd __sys_putpixel
  87. ; } mike.dld
  88.  
  89. version           db    'Kolibri OS  version 0.5.1.0      ',13,10,13,10,0
  90.                   ;dd    endofcode-0x10000
  91.  
  92.                   ;db   'Boot02'
  93. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  94. include "boot/preboot.inc"
  95. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  96.  
  97. preboot_lfb       db    0
  98. preboot_bootlog   db    0
  99.  
  100.  
  101. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  102. ;;                                                                      ;;
  103. ;;                      16 BIT INCLUDED FILES                           ;;
  104. ;;                                                                      ;;
  105. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  106.  
  107. include "kernel16.inc"
  108.  
  109. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  110. ;;                                                                      ;;
  111. ;;                  SWITCH TO 32 BIT PROTECTED MODE                     ;;
  112. ;;                                                                      ;;
  113. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  114.  
  115. os_data        =  os_data_l-gdts    ; GDTs
  116. os_code        =  os_code_l-gdts
  117. int_code       equ  int_code_l-gdts
  118. int_data       equ  int_data_l-gdts
  119. tss0sys       equ  tss0sys_l-gdts
  120. graph_data     equ  3+graph_data_l-gdts
  121. tss0           equ  tss0_l-gdts
  122. app_code       equ  3+app_code_l-gdts
  123. app_data       equ  3+app_data_l-gdts
  124.  
  125.  
  126.  
  127. ; CR0 Flags - Protected mode and Paging
  128.  
  129.         mov     ecx,0x00000001
  130.         ;and     ebx,65535
  131.         ;cmp     ebx,00100000000000000b ; lfb -> paging
  132.         ;jb      no_paging
  133.         ;mov     ax,0x0000
  134.         ;mov     es,ax
  135.         ;mov     al,[es:0x901E]
  136.         ;cmp     al,1
  137.         ;je      no_paging
  138.         ;or      ecx, 0x80000000
  139.        ;no_paging:
  140.  
  141. ; Enabling 32 bit protected mode
  142.  
  143.         sidt    [cs:old_ints_h-0x10000]
  144.  
  145.         cli                             ; disable all irqs
  146.         cld
  147.         mov     al,255                  ; mask all irqs
  148.         out     0xa1,al
  149.         out     0x21,al
  150.    l.5: in      al, 0x64                ; Enable A20
  151.         test    al, 2
  152.         jnz     l.5
  153.         mov     al, 0xD1
  154.         out     0x64, al
  155.    l.6: in      al, 0x64
  156.         test    al, 2
  157.         jnz     l.6
  158.         mov     al, 0xDF
  159.         out     0x60, al
  160.         lgdt    [cs:gdts-0x10000]       ; Load GDT
  161.         mov     eax, cr0                ; Turn on paging // protected mode
  162.         or      eax, ecx
  163.         and     eax, 10011111b *65536*256 + 0xffffff ; caching enabled
  164.         mov     cr0, eax
  165.         jmp     byte $+2
  166.         mov     ax,os_data              ; Selector for os
  167.         mov     ds,ax
  168.         mov     es,ax
  169.         mov     fs,ax
  170.         mov     gs,ax
  171.         mov     ss,ax
  172.         mov     esp,0x3ec00             ; Set stack
  173.         jmp     pword os_code:B32       ; jmp to enable 32 bit mode
  174.  
  175. use32
  176.  
  177. iglobal
  178.   boot_memdetect    db   'Determining amount of memory',0
  179.   boot_fonts        db   'Fonts loaded',0
  180.   boot_tss          db   'Setting TSSs',0
  181.   boot_cpuid        db   'Reading CPUIDs',0
  182.   boot_devices      db   'Detecting devices',0
  183.   boot_timer        db   'Setting timer',0
  184.   boot_irqs         db   'Reprogramming IRQs',0
  185.   boot_setmouse     db   'Setting mouse',0
  186.   boot_windefs      db   'Setting window defaults',0
  187.   boot_bgr          db   'Calculating background',0
  188.   boot_resirqports  db   'Reserving IRQs & ports',0
  189.   boot_setrports    db   'Setting addresses for IRQs',0
  190.   boot_setostask    db   'Setting OS task',0
  191.   boot_allirqs      db   'Unmasking all IRQs',0
  192.   boot_tsc          db   'Reading TSC',0
  193.   boot_pal_ega      db   'Setting EGA/CGA 320x200 palette',0
  194.   boot_pal_vga      db   'Setting VGA 640x480 palette',0
  195.   boot_mtrr         db   'Setting MTRR',0
  196.   boot_tasking      db   'All set - press ESC to start',0
  197. endg
  198.  
  199. iglobal
  200.   boot_y dd 10
  201. endg
  202.  
  203. boot_log:
  204.          pushad
  205.  
  206.          mov   edx,esi
  207. .bll3:   inc   edx
  208.          cmp   [edx],byte 0
  209.          jne   .bll3
  210.          sub   edx,esi
  211.          mov   eax,10*65536
  212.          mov   ax,word [boot_y]
  213.          add   [boot_y],dword 10
  214.          mov   ebx,0xffffff
  215.          mov   ecx,esi
  216.          mov   edi,1
  217.          call  dtext
  218.  
  219.          mov   [novesachecksum],1000
  220.          call  checkEgaCga
  221.  
  222.          cmp   [preboot_blogesc],byte 1
  223.          je    .bll2
  224.  
  225.          cmp   esi,boot_tasking
  226.          jne   .bll2
  227.          ; begin ealex 04.08.05
  228. ;         in    al,0x61
  229. ;         and   al,01111111b
  230. ;         out   0x61,al
  231.          ; end ealex 04.08.05
  232. .bll1:   in    al,0x60    ; wait for ESC key press
  233.          cmp   al,129
  234.          jne   .bll1
  235.  
  236. .bll2:   popad
  237.  
  238.          ret
  239.  
  240. uglobal
  241.   cpuid_0    dd  0,0,0,0
  242.   cpuid_1    dd  0,0,0,0
  243.   cpuid_2    dd  0,0,0,0
  244.   cpuid_3    dd  0,0,0,0
  245. endg
  246.  
  247. iglobal
  248.   firstapp   db  'LAUNCHER   '
  249.   char       db  'CHAR    MT '
  250.   char2      db  'CHAR2   MT '
  251.   bootpath   db  '/KOLIBRI    '
  252.   bootpath2  db  0
  253.   vmode      db  'VMODE   MDR'
  254.   vrr_m      db  'VRR_M      '
  255. endg
  256.  
  257.  
  258. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  259. ;;                                                                      ;;
  260. ;;                          32 BIT ENTRY                                ;;
  261. ;;                                                                      ;;
  262. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  263.  
  264. align 4
  265.  
  266. B32:
  267. ; CLEAR 0x280000-0xF00000
  268.  
  269.         xor   eax,eax
  270.         mov   edi,0x280000
  271.         mov   ecx,(0x100000*0xF-0x280000) / 4
  272.         cld
  273.         rep   stosd
  274. ; CLEAR 0x80000-0x90000
  275. ;       xor   eax,eax
  276.         mov   edi,0x80000
  277.         mov   ecx,(0x90000-0x80000)/4
  278. ;       cld        
  279.         rep   stosd
  280.  
  281. ; CLEAR KERNEL UNDEFINED GLOBALS
  282.         mov   edi, endofcode
  283.         mov   ecx, (uglobals_size/4)+4
  284.         rep   stosd
  285.  
  286. ; SAVE & CLEAR 0-0xffff
  287.  
  288.         mov   esi,0x0000
  289.         mov   edi,0x2F0000
  290.         mov   ecx,0x10000 / 4
  291.         cld
  292.         rep   movsd
  293.         xor   eax,eax
  294.         mov   edi,0
  295.         mov   ecx,0x10000 / 4
  296.         cld
  297.         rep   stosd
  298.  
  299. ; SAVE REAL MODE VARIABLES
  300. ;        movzx eax,byte [0x2f0000+0x9010]  ; mouse port
  301. ;        mov   [0xF604],byte 1  ;al
  302.         mov   al,[0x2f0000+0x9000]        ; bpp
  303.         mov   [0xFBF1],al
  304.         movzx eax,word [0x2f0000+0x900A]  ; X max
  305.         dec   eax
  306.         mov   [0xfe00],eax
  307.         movzx eax,word [0x2f0000+0x900C]  ; Y max
  308.         dec   eax
  309.         mov   [0xfe04],eax
  310.         movzx eax,word [0x2f0000+0x9008]  ; screen mode
  311.         mov   [0xFE0C],eax
  312.         mov   eax,[0x2f0000+0x9014]       ; Vesa 1.2 bnk sw add
  313.         mov   [0xE030],eax
  314.         mov   [0xfe08],word 640*4         ; Bytes PerScanLine
  315.         cmp   [0xFE0C],word 0x13          ; 320x200
  316.         je    @f
  317.         cmp   [0xFE0C],word 0x12          ; VGA 640x480
  318.         je    @f
  319.         mov   ax,[0x2f0000+0x9001]        ; for other modes
  320.         mov   [0xfe08],ax
  321.       @@:
  322.  
  323. ; GRAPHICS ADDRESSES
  324.  
  325.         ;mov     eax,0x100000*8                    ; LFB address
  326.         ;cmp     [0xfe0c],word 0x13
  327.         ;je      no_d_lfb
  328.         ;cmp     [0xfe0c],word 0x12
  329.         ;je      no_d_lfb
  330.         ;cmp     [0x2f0000+0x901e],byte 1
  331.         ;jne     no_d_lfb
  332.         mov     byte [0x2f0000+0x901e],0x0
  333.         mov     eax,[0x2f0000+0x9018]
  334.       ;no_d_lfb:
  335.         mov     [0xfe80],eax
  336.  
  337.         cmp     [0xfe0c],word 0100000000000000b
  338.         jge     setvesa20
  339.         cmp     [0xfe0c],word 0x13
  340.         je      v20ga32
  341.         mov     [0xe020],dword Vesa12_putpixel24  ; Vesa 1.2
  342.         mov     [0xe024],dword Vesa12_getpixel24
  343.         cmp     [0xfbf1],byte 24
  344.         jz      ga24
  345.         mov     [0xe020],dword Vesa12_putpixel32
  346.         mov     [0xe024],dword Vesa12_getpixel32
  347.       ga24:
  348.         jmp     v20ga24
  349.       setvesa20:
  350.         mov     [0xe020],dword Vesa20_putpixel24  ; Vesa 2.0
  351.         mov     [0xe024],dword Vesa20_getpixel24
  352.         cmp     [0xfbf1],byte 24
  353.         jz      v20ga24
  354.       v20ga32:
  355.         mov     [0xe020],dword Vesa20_putpixel32
  356.         mov     [0xe024],dword Vesa20_getpixel32
  357.       v20ga24:
  358.         cmp     [0xfe0c],word 0x12                ; 16 C VGA 640x480
  359.         jne     no_mode_0x12
  360.         mov     [0xe020],dword VGA_putpixel
  361.         mov     [0xe024],dword Vesa20_getpixel32
  362.       no_mode_0x12:
  363.  
  364. ; MEMORY MODEL
  365.  
  366. ;        mov     [0xfe84],dword 0x100000*16        ; apps mem base address
  367. ;        movzx   ecx,byte [0x2f0000+0x9030]
  368. ;        dec     ecx
  369. ;        mov     eax,16*0x100000 ; memory-16
  370. ;        shl     eax,cl
  371. ;        mov     [0xfe8c],eax      ; memory for use
  372. ;        cmp     eax,16*0x100000
  373. ;        jne     no16mb
  374. ;        mov     [0xfe84],dword 0xD80000 ; !!! 10 !!!
  375. ;      no16mb:
  376.  
  377. ; init:
  378. ;  1) 0xFE84 - applications base
  379. ;  2) 0xFE8C - total amount of memory
  380.  
  381.         xor     edi, edi
  382.   m_GMS_loop:
  383.         add     edi, 0x400000
  384.         mov     eax, dword [edi]
  385.         mov     dword [edi], 'TEST'
  386.         wbinvd
  387.         cmp     dword [edi], 'TEST'
  388.         jne     m_GMS_exit
  389.         cmp     dword [0], 'TEST'
  390.         je      m_GMS_exit
  391.         mov     dword [es:edi], eax
  392.         jmp     m_GMS_loop
  393.   m_GMS_exit:
  394.         mov     [edi], eax
  395.         ; now edi contains the EXACT amount of memory
  396.  
  397.         mov     eax, 0x100000*16
  398.         cmp     edi, eax ;0x100000*16
  399.         jb      $                 ; less than 16 Mb
  400.  
  401.         mov     dword [0xFE84], eax ;0x100000*16
  402.         cmp     edi, eax ;0x100000*16
  403.         jne     @f
  404.         mov     dword [0xFE84], 0xD80000 ; =0x100000*13.5
  405.       @@:
  406.         mov     dword [0xFE8C], edi
  407.        
  408. ;!!!!!!!!!!!!!!!!!!!!!!!!!!
  409. include 'detect/disks.inc'
  410. ;!!!!!!!!!!!!!!!!!!!!!!!!!!
  411.        
  412. ; CHECK EXTRA REGION
  413. ; ENABLE PAGING
  414.         mov     eax,cr0
  415.         or      eax,0x80000000
  416.         mov     cr0,eax
  417.         jmp     $+2
  418.         mov     dword [0xfe80],0x800000
  419.        
  420. ;Set base of graphic segment to linear address of LFB        
  421.         mov     eax,[0xfe80]                      ; set for gs
  422.         mov     [graph_data_l+2],ax
  423.         shr     eax,16
  424.         mov     [graph_data_l+4],al
  425.         mov     [graph_data_l+7],ah            
  426.  
  427. ; READ RAMDISK IMAGE FROM HD
  428.  
  429. ;!!!!!!!!!!!!!!!!!!!!!!!
  430. include 'boot/rdload.inc'
  431. ;!!!!!!!!!!!!!!!!!!!!!!!
  432. ;    mov    [dma_hdd],1
  433. ; CALCULATE FAT CHAIN FOR RAMDISK
  434.  
  435.         call  calculatefatchain
  436.  
  437. ; LOAD VMODE DRIVER
  438.  
  439. ;!!!!!!!!!!!!!!!!!!!!!!!
  440. include 'vmodeld.inc'
  441. ;!!!!!!!!!!!!!!!!!!!!!!!
  442.  
  443. ; LOAD FONTS I and II
  444.  
  445.         mov   [0x3000],dword 1
  446.         mov   [0x3004],dword 1
  447.         mov   [0x3010],dword 0x3020
  448.  
  449.         mov   eax,char
  450.         mov   esi,12
  451.         xor   ebx,ebx
  452.         mov   ecx,2560;26000
  453.         mov   edx,0x3F600;0x37000
  454.         call  fileread
  455.  
  456.         mov   eax,char2
  457.         mov   esi,12
  458.         xor   ebx,ebx
  459.         mov   ecx,2560;26000
  460.         mov   edx,0x3EC00;0x30000
  461.         call  fileread
  462.  
  463.         mov   esi,boot_fonts
  464.         call  boot_log
  465.  
  466. ; PRINT AMOUNT OF MEMORY
  467.         mov     esi, boot_memdetect
  468.         call    boot_log
  469.  
  470.         movzx   ecx, word [boot_y]
  471.         or      ecx, (10+29*6) shl 16 ; "Determining amount of memory"
  472.         sub     ecx, 10
  473.         mov     edx, 0xFFFFFF
  474.         mov     ebx, [0xFE8C]
  475.         shr     ebx, 20
  476.         mov     edi, 1
  477.         mov     eax, 0x00040000
  478.         call    display_number
  479.        
  480. ; CHECK EXTENDED REGION
  481. ;        mov     dword [0x80000000],0x12345678
  482. ;        cmp     dword [0x80000000],0x12345678
  483. ;        jz      extended_region_found
  484. ;        mov     esi,boot_ext_region
  485. ;        call    boot_log
  486. ;        jmp     $
  487. ;extended_region_found:
  488.        
  489.         call    MEM_Init
  490. ;add 0x800000-0xc00000 area        
  491.         cmp     word [0xfe0c],0x13
  492.         jle     .less_memory
  493.         mov     eax,0x80000000      ;linear address
  494.         mov     ebx,0x400000 shr 12 ;size in pages (4Mb)
  495.         mov     ecx,0x800000        ;physical address
  496.         jmp     .end_first_block
  497. .less_memory:
  498.         mov     eax,0x80180000      ;linear address
  499.         mov     ebx,0x280000 shr 12 ;size in pages (2.5Mb)
  500.         mov     ecx,0x980000        ;physical address
  501. .end_first_block:                
  502.         call    MEM_Add_Heap        ;nobody can lock mutex yet
  503.  
  504.         call    create_general_page_table
  505. ;add 0x1000000(0xd80000)-end_of_memory area
  506.         mov     eax,second_base_address
  507.         mov     ebx,[0xfe8c]
  508.         mov     ecx,[0xfe84]
  509.         sub     ebx,ecx
  510.         shr     ebx,12
  511.         add     eax,ecx
  512.         call    MEM_Add_Heap
  513. ;init physical memory manager.
  514.         call    Init_Physical_Memory_Manager
  515.        
  516. ; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f
  517.  
  518.         mov   esi,boot_irqs
  519.         call  boot_log
  520.         call  rerouteirqs
  521.  
  522.         mov    esi,boot_tss
  523.         call   boot_log
  524.  
  525. ; BUILD SCHEDULER
  526.  
  527.         call   build_scheduler ; sys32.inc
  528.  
  529. ; LOAD IDT
  530.         lidt   [cs:idtreg]
  531.  
  532. ; READ CPUID RESULT
  533.  
  534.         mov     esi,boot_cpuid
  535.         call    boot_log
  536.         pushfd                  ; get current flags
  537.         pop     eax
  538.         mov     ecx,eax
  539.         xor     eax,0x00200000  ; attempt to toggle ID bit
  540.         push    eax
  541.         popfd
  542.         pushfd                  ; get new EFLAGS
  543.         pop     eax
  544.         push    ecx             ; restore original flags
  545.         popfd
  546.         and     eax,0x00200000  ; if we couldn't toggle ID,
  547.         and     ecx,0x00200000  ; then this is i486
  548.         cmp     eax,ecx
  549.         jz      nopentium
  550.         ; It's Pentium or later. Use CPUID
  551.         mov     edi,cpuid_0
  552.         mov     esi,0
  553.       cpuid_new_read:
  554.         mov     eax,esi
  555.         cpuid
  556.         call    cpuid_save
  557.         add     edi,4*4
  558.         cmp     esi,3
  559.         jge     cpuid_done
  560.         cmp     esi,[cpuid_0]
  561.         jge     cpuid_done
  562.         inc     esi
  563.         jmp     cpuid_new_read
  564.       cpuid_save:
  565.         mov     [edi+00],eax
  566.         mov     [edi+04],ebx
  567.         mov     [edi+8],ecx
  568.         mov     [edi+12],edx
  569.         ret
  570.       cpuid_done:
  571.       nopentium:
  572.  
  573. ; CR4 flags - enable fxsave / fxrstore
  574. ;
  575. ;        finit
  576. ;        mov     eax,1
  577. ;        cpuid
  578. ;        test    edx,1000000h
  579. ;        jz      fail_fpu
  580. ;        mov     eax,cr4
  581. ;        or      eax,200h        ; Enable fxsave/fxstor
  582. ;        mov     cr4,eax
  583. ;     fail_fpu:
  584.  
  585. ; DETECT DEVICES
  586.  
  587.         mov    esi,boot_devices
  588.         call   boot_log
  589.         call   detect_devices
  590.  
  591.  ; TIMER SET TO 1/100 S
  592.  
  593.         mov   esi,boot_timer
  594.         call  boot_log
  595.         mov   al,0x34              ; set to 100Hz
  596.         out   0x43,al
  597.         mov   al,0x9b              ; lsb    1193180 / 1193
  598.         out   0x40,al
  599.         mov   al,0x2e              ; msb
  600.         out   0x40,al
  601.  
  602. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  603. ;include 'detect/commouse.inc'
  604. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  605. ; SET MOUSE
  606.  
  607.         mov   esi,boot_setmouse
  608.         call  boot_log
  609.         call  setmouse
  610.  
  611. ; SET PRELIMINARY WINDOW STACK AND POSITIONS
  612.  
  613.         mov   esi,boot_windefs
  614.         call  boot_log
  615.         call  setwindowdefaults
  616.  
  617. ; SET BACKGROUND DEFAULTS
  618.  
  619.         mov   esi,boot_bgr
  620.         call  boot_log
  621.         call  calculatebackground
  622.  
  623. ; RESERVE SYSTEM IRQ'S JA PORT'S
  624.  
  625.         mov   esi,boot_resirqports
  626.         call  boot_log
  627.         call  reserve_irqs_ports
  628.  
  629. ; SET PORTS FOR IRQ HANDLERS
  630.  
  631.         mov  esi,boot_setrports
  632.         call boot_log
  633.         call setirqreadports
  634.  
  635. ; SET UP OS TASK
  636.  
  637.         mov  esi,boot_setostask
  638.         call boot_log
  639.         ; name for OS/IDLE process
  640.         mov  [0x80000+256+0],dword 'OS/I'
  641.         mov  [0x80000+256+4],dword 'DLE '
  642.         ; task list
  643.         mov  [0x3004],dword 2         ; number of processes
  644.         mov  [0x3000],dword 0         ; process count - start with os task
  645.         mov  [0x3020+0xE],byte  1     ; on screen number
  646.         mov  [0x3020+0x4],dword 1     ; process id number
  647.  
  648.         ; set default flags & stacks
  649.         mov  [l.eflags],dword 0x11202 ; sti and resume
  650.         mov  [l.ss0], os_data
  651.         ; osloop - TSS
  652.         mov  eax,cr3
  653.         mov  [l.cr3],eax
  654.         mov  [l.eip],osloop
  655.         mov  [l.esp],sysint_stack_data + 4096*2 ; uses slot 1 stack
  656.         mov  [l.cs],os_code
  657.         mov  [l.ss],os_data
  658.         mov  [l.ds],os_data
  659.         mov  [l.es],os_data
  660.         mov  [l.fs],os_data
  661.         mov  [l.gs],os_data
  662.         ; move tss to tss_data+tss_step
  663.         mov  esi,tss_sceleton
  664.         mov  edi,tss_data+tss_step
  665.         mov  ecx,120/4
  666.         cld
  667.         rep  movsd
  668.  
  669.         mov  ax,tss0
  670.         ltr  ax
  671.  
  672.  
  673. ; READ TSC / SECOND
  674.  
  675.         mov   esi,boot_tsc
  676.         call  boot_log
  677.         call  _rdtsc
  678.         mov   ecx,eax
  679.         mov   esi,250               ; wait 1/4 a second
  680.         call  delay_ms
  681.         call  _rdtsc
  682.         sub   eax,ecx
  683.         shl   eax,2
  684.         mov   [0xf600],eax          ; save tsc / sec
  685.  
  686. ; SET VARIABLES
  687.  
  688.         call  set_variables
  689.  
  690. ; STACK AND FDC
  691.  
  692.         call  stack_init
  693.         call  fdc_init
  694.  
  695. ; PALETTE FOR 320x200 and 640x480 16 col
  696.  
  697.         cmp   [0xfe0c],word 0x12
  698.         jne   no_pal_vga
  699.         mov   esi,boot_pal_vga
  700.         call  boot_log
  701.         call  paletteVGA
  702.       no_pal_vga:
  703.  
  704.         cmp   [0xfe0c],word 0x13
  705.         jne   no_pal_ega
  706.         mov   esi,boot_pal_ega
  707.         call  boot_log
  708.         call  palette320x200
  709.       no_pal_ega:
  710.  
  711. ; LOAD DEFAULT SKIN
  712.  
  713.         call  load_default_skin
  714.  
  715. ; MTRR'S
  716.  
  717.         call  enable_mtrr
  718.  
  719.  
  720. ; LOAD FIRST APPLICATION
  721.         mov   [0x3000],dword 1 ;1
  722.         mov   [0x3004],dword 1 ;1
  723.         cli
  724.         mov   al,[0x2f0000+0x9030]
  725.         cmp   al,1
  726.         jne   no_load_vrr_m
  727.         mov   eax,vrr_m
  728.         call  start_application_fl
  729.         cmp   eax,2                  ; if no vrr_m app found
  730.         je    first_app_found
  731.        
  732.     no_load_vrr_m:    
  733.         mov   eax,firstapp
  734.         call  start_application_fl
  735.  
  736.         cmp   eax,2                  ; if no first app found - halt
  737.         je    first_app_found
  738.         mov   eax, 0xDEADBEEF
  739.         hlt    ;jmp   $
  740.       first_app_found:
  741.         cli
  742.  
  743.         mov   [0x3004],dword 2
  744.         mov   [0x3000],dword 1
  745.  
  746.  
  747. ; START MULTITASKING
  748.  
  749.         mov   esi,boot_tasking
  750.         call  boot_log
  751.  
  752.         mov   [0xe000],byte 1        ; multitasking enabled
  753.  
  754.     mov   al, 0xf6         ; ╤сЁюё ъыртшрЄєЁ√, ЁрчЁх°шЄ№ ёърэшЁютрэшх
  755.         call  kb_write
  756.  
  757.         mov     ecx,0
  758. wait_loop_1:       ; variant 2
  759. ; ўшЄрхь яюЁЄ ёюёЄю эш  яЁюЎхёёюЁр 8042
  760.         in      al,64h
  761.     and     al,00000010b  ; Їыру уюЄютэюёЄш
  762. ; юцшфрхь уюЄютэюёЄ№ яЁюЎхёёюЁр 8042
  763.     loopnz  wait_loop_1
  764.  
  765. ; SET KEYBOARD PARAMETERS
  766.        ; mov   al, 0xED       ; svetodiody - only for testing!
  767.        ; call  kb_write
  768.        ; call  kb_read
  769.        ; mov   al, 111b
  770.        ; call  kb_write
  771.        ; call  kb_read
  772.        
  773.         mov   al, 0xF3       ; set repeat rate & delay
  774.         call  kb_write
  775.         call  kb_read
  776.         mov   al, 00100010b ; 24 500  ;00100100b  ; 20 500
  777.         call  kb_write
  778.         call  kb_read
  779.      ;// mike.dld [
  780.         call  set_lights
  781.      ;// mike.dld ]
  782.  
  783.  
  784. ; UNMASK ALL IRQ'S
  785.  
  786.         mov   esi,boot_allirqs
  787.         call  boot_log
  788.        
  789.         cli                          ;guarantee forbidance of interrupts.
  790.         mov   al,0                   ; unmask all irq's
  791.         out   0xA1,al
  792.         out   0x21,al
  793.  
  794.         mov   ecx,32
  795.  
  796.      ready_for_irqs:
  797.  
  798.         mov   al,0x20                ; ready for irqs
  799.         out   0x20,al
  800.         out   0xa0,al
  801.  
  802.         loop  ready_for_irqs         ; flush the queue
  803.  
  804. ;        mov    [dma_hdd],1
  805.  
  806.         sti
  807.         jmp   $                      ; wait here for timer to take control
  808.  
  809.         ; Fly :)
  810.  
  811. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  812. ;                                                                    ;
  813. ;                         MAIN OS LOOP                               ;
  814. ;                                                                    ;
  815. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  816. align 32
  817. osloop:
  818.  
  819.         call   check_mouse_data
  820.         call   [draw_pointer]
  821.  
  822.         call   checkbuttons
  823.         call   main_loop_sys_getkey
  824.         call   checkwindows
  825.         call   check_window_move_request
  826.  
  827.         call   checkmisc
  828.         call   checkEgaCga
  829.  
  830.         call   stack_handler
  831.  
  832.         call   checkidle
  833.         call   check_fdd_motor_status
  834.         jmp    osloop
  835.  
  836.  
  837. checkidle:
  838.  
  839.         pushad
  840.  
  841.         cmp  [check_idle_semaphore],0
  842.         jne  no_idle_state
  843.  
  844.         call change_task
  845.         mov  eax,[idlemem]
  846.         mov  ebx,[timer_ticks] ;[0xfdf0]
  847.         cmp  eax,ebx
  848.         jnz  idle_exit
  849.         call _rdtsc
  850.         mov  ecx,eax
  851.       idle_loop:
  852.         hlt
  853.         cmp  [check_idle_semaphore],0
  854.         jne  idle_loop_exit
  855.         mov  eax,[timer_ticks] ;[0xfdf0]
  856.         cmp  ebx,eax
  857.         jz   idle_loop
  858.       idle_loop_exit:
  859.         mov  [idlemem],eax
  860.         call _rdtsc
  861.         sub  eax,ecx
  862.         mov  ebx,[idleuse]
  863.         add  ebx,eax
  864.         mov  [idleuse],ebx
  865.  
  866.         popad
  867.         ret
  868.  
  869.       idle_exit:
  870.  
  871.         mov  ebx,[timer_ticks] ;[0xfdf0]
  872.         mov  [idlemem],ebx
  873.         call change_task
  874.  
  875.         popad
  876.         ret
  877.  
  878.       no_idle_state:
  879.  
  880.         dec  [check_idle_semaphore]
  881.  
  882.         mov  ebx,[timer_ticks] ;[0xfdf0]
  883.         mov  [idlemem],ebx
  884.         call change_task
  885.  
  886.         popad
  887.         ret
  888.  
  889. uglobal
  890.   idlemem               dd   0x0
  891.   idleuse               dd   0x0
  892.   idleusesec            dd   0x0
  893.   check_idle_semaphore  dd   0x0
  894. endg
  895.  
  896.  
  897.  
  898. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  899. ;                                                                      ;
  900. ;                   INCLUDED SYSTEM FILES                              ;
  901. ;                                                                      ;
  902. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  903.  
  904.  
  905. include "kernel32.inc"
  906.  
  907.  
  908. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  909. ;                                                                      ;
  910. ;                       KERNEL FUNCTIONS                               ;
  911. ;                                                                      ;
  912. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  913.  
  914. enable_mtrr:
  915.  
  916.         pushad
  917.  
  918.         cmp    [0x2f0000+0x901c],byte 2
  919.         je     no_mtrr
  920.         mov    eax,[0xFE0C]                ; if no LFB then no MTRR
  921.         test   eax,0100000000000000b
  922.         jz     no_mtrr
  923.         mov    edx,[cpuid_1+3*4]           ; edx - MTRR's supported ?
  924.         test   edx,1000000000000b
  925.         jz     no_mtrr
  926.         call   find_empty_mtrr
  927.         cmp    ecx,0
  928.         jz     no_mtrr
  929.         mov    esi,boot_mtrr               ; 'setting mtrr'
  930.         call   boot_log
  931.         mov    edx,0x0                     ; LFB , +8 M , write combine
  932.         mov    eax,[0x2f9018]
  933.         or     eax,1
  934.         wrmsr
  935.         inc    ecx
  936.         mov    edx,0xf
  937.         mov    eax,0xff800800
  938.         wrmsr
  939.         mov    ecx,0x2ff                   ; enable mtrr's
  940.         rdmsr
  941.         or     eax,100000000000b           ; set
  942.         wrmsr
  943.      no_mtrr:
  944.  
  945.         popad
  946.         ret
  947.  
  948.  
  949. find_empty_mtrr:  ; 8 pairs checked
  950.  
  951.         mov    ecx,0x201-2
  952.       mtrr_find:
  953.         add    ecx,2
  954.         cmp    ecx,0x200+8*2
  955.         jge    no_free_mtrr
  956.         rdmsr
  957.         test   eax,0x0800
  958.         jnz    mtrr_find
  959.         dec    ecx
  960.         ret
  961.       no_free_mtrr:
  962.         mov    ecx,0
  963.         ret
  964.  
  965. reserve_irqs_ports:
  966.  
  967.         pushad
  968.  
  969.         mov  [irq_owner+4*0],byte 1    ; timer
  970.         mov  [irq_owner+4*1],byte 1    ; keyboard
  971.         mov  [irq_owner+4*5],byte 1    ; sound blaster
  972.         mov  [irq_owner+4*6],byte 1    ; floppy diskette
  973.         mov  [irq_owner+4*13],byte 1   ; math co-pros
  974.         mov  [irq_owner+4*14],byte 1   ; ide I
  975.         mov  [irq_owner+4*15],byte 1   ; ide II
  976.         movzx eax,byte [0xf604]        ; mouse irq
  977.         dec   eax
  978.         add   eax,mouseirqtable
  979.         movzx eax,byte [eax]
  980.         shl   eax,2
  981.         mov   [irq_owner+eax],byte 1
  982.  
  983.  
  984.                                        ; RESERVE PORTS
  985.         mov   edi,1                    ; 0x00-0xff
  986.         mov   [0x2d0000],edi
  987.         shl   edi,4
  988.         mov   [0x2d0000+edi+0],dword 1
  989.         mov   [0x2d0000+edi+4],dword 0x0
  990.         mov   [0x2d0000+edi+8],dword 0xff
  991.         cmp   [0xf604],byte 2          ; com1 mouse -> 0x3f0-0x3ff
  992.         jne   ripl1
  993.         inc   dword [0x2d0000]
  994.         mov   edi,[0x2d0000]
  995.         shl   edi,4
  996.         mov   [0x2d0000+edi+0],dword 1
  997.         mov   [0x2d0000+edi+4],dword 0x3f0
  998.         mov   [0x2d0000+edi+8],dword 0x3ff
  999.       ripl1:
  1000.         cmp   [0xf604],byte 3          ; com2 mouse -> 0x2f0-0x2ff
  1001.         jne   ripl2
  1002.         inc   dword [0x2d0000]
  1003.         mov   edi,[0x2d0000]
  1004.         shl   edi,4
  1005.         mov   [0x2d0000+edi+0],dword 1
  1006.         mov   [0x2d0000+edi+4],dword 0x2f0
  1007.         mov   [0x2d0000+edi+8],dword 0x2ff
  1008.       ripl2:
  1009.  
  1010.         popad
  1011.         ret
  1012.  
  1013. iglobal
  1014. mouseirqtable   db  12    ; ps2
  1015.                 db  4     ; com1
  1016.                 db  3     ; com2
  1017. endg
  1018.  
  1019. setirqreadports:
  1020.  
  1021.         mov   [irq12read+0],dword 0x60 + 0x01000000  ; read port 0x60 , byte
  1022.         mov   [irq12read+4],dword 0                  ; end of port list
  1023.         mov   [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte
  1024.         mov   [irq04read+4],dword 0                  ; end of port list
  1025.         mov   [irq03read+0],dword 0x2f8 + 0x01000000 ; read port 0x2f8 , byte
  1026.         mov   [irq03read+4],dword 0                  ; end of port list
  1027.  
  1028.         ret
  1029.  
  1030. iglobal
  1031.   process_number dd 0x1
  1032. endg
  1033.  
  1034. uglobal
  1035.   novesachecksum dd 0x0
  1036. endg
  1037.  
  1038. checkEgaCga:
  1039.  
  1040.         cmp    [0xfe0c],dword 0x13
  1041.         je     cnvl
  1042.         ret
  1043.       cnvl:
  1044.  
  1045.         pushad
  1046.         mov    ecx,[0xfb0a]
  1047.         cmp    ecx,[novesachecksum]
  1048.         jne    novesal
  1049.         popad
  1050.         ret
  1051.  
  1052.       novesal:
  1053.         mov    [novesachecksum],ecx
  1054.         mov    ecx,0
  1055.         movzx  eax,word [0xfb0c]
  1056.         cmp    eax,100
  1057.         jge    m13l3
  1058.         mov    eax,100
  1059.       m13l3:
  1060.         cmp    eax,480-100
  1061.         jbe    m13l4
  1062.         mov    eax,480-100
  1063.       m13l4:
  1064.         sub    eax,100
  1065.         imul   eax,640*4
  1066.         add    ecx,eax
  1067.         movzx  eax,word [0xfb0a]
  1068.         cmp    eax,160
  1069.         jge    m13l1
  1070.         mov    eax,160
  1071.       m13l1:
  1072.         cmp    eax,640-160
  1073.         jbe    m13l2
  1074.         mov    eax,640-160
  1075.       m13l2:
  1076.         sub    eax,160
  1077.         shl    eax,2
  1078.         add    ecx,eax
  1079.         mov    esi,[0xfe80]
  1080.         add    esi,ecx
  1081.         mov    edi,0xa0000
  1082.         mov    edx,200
  1083.         mov    ecx,320
  1084.         cld
  1085.      m13pix:
  1086.         lodsd
  1087.         push   eax
  1088.         mov    ebx,eax
  1089.         and    eax,(128+64+32)      ; blue
  1090.         shr    eax,5
  1091.         and    ebx,(128+64+32)*256  ; green
  1092.         shr    ebx,8+2
  1093.         add    eax,ebx
  1094.         pop    ebx
  1095.         and    ebx,(128+64)*256*256 ; red
  1096.         shr    ebx,8+8
  1097.         add    eax,ebx
  1098.         stosb
  1099.         loop   m13pix
  1100.         mov    ecx,320
  1101.         add    esi,4*(640-320)
  1102.         dec    edx
  1103.         jnz    m13pix
  1104.  
  1105.         popad
  1106.         ret
  1107.  
  1108.  
  1109. palette320x200:
  1110.  
  1111.        mov   edx,0x3c8
  1112.        xor   eax, eax
  1113.        out   dx,al
  1114.        mov   ecx,256
  1115.        mov   edx,0x3c9
  1116.        xor   eax,eax
  1117.  
  1118.      palnew:
  1119.        mov   al,0
  1120.        test  ah,64
  1121.        jz    pallbl1
  1122.        add   al,21
  1123.      pallbl1:
  1124.        test  ah,128
  1125.        jz    pallbl2
  1126.        add   al,42
  1127.      pallbl2:
  1128.        out   dx,al
  1129.        mov   al,0
  1130.        test  ah,8
  1131.        jz    pallbl3
  1132.        add   al,8
  1133.      pallbl3:
  1134.        test  ah,16
  1135.        jz    pallbl4
  1136.        add   al,15
  1137.      pallbl4:
  1138.        test  ah,32
  1139.        jz    pallbl5
  1140.        add   al,40
  1141.      pallbl5:
  1142.        out   dx,al
  1143.        mov   al,0
  1144.        test  ah,1
  1145.        jz    pallbl6
  1146.        add   al,8
  1147.      pallbl6:
  1148.        test  ah,2
  1149.        jz    pallbl7
  1150.        add   al,15
  1151.      pallbl7:
  1152.        test  ah,4
  1153.        jz    pallbl8
  1154.        add   al,40
  1155.      pallbl8:
  1156.        out   dx,al
  1157.        add   ah,1
  1158.        loop  palnew
  1159.  
  1160.        ret
  1161.  
  1162. set_variables:
  1163.  
  1164.         mov   ecx,0x100                       ; flush port 0x60
  1165. .fl60:  in    al,0x60
  1166.         loop  .fl60
  1167.         mov   [0xfcff],byte 0                 ; mouse buffer
  1168.         mov   [0xf400],byte 0                 ; keyboard buffer
  1169.         mov   [0xf500],byte 0                 ; button buffer
  1170. ;        mov   [0xfb0a],dword 100*65536+100    ; mouse x/y
  1171.  
  1172.         push  eax
  1173.         mov   ax,[0x2f0000+0x900c]
  1174.         shr   ax,1
  1175.         shl   eax,16
  1176.         mov   ax,[0x2f0000+0x900A]
  1177.         shr   ax,1
  1178.         mov   [0xfb0a],eax
  1179.         pop   eax
  1180.        
  1181.         mov   byte [SB16_Status],0            ; Minazzi Paolo
  1182.         mov   [display_data-12],dword 1       ; tiled background
  1183.         mov   [0xfe88],dword 0x2C0000         ; address of button list
  1184.  
  1185.      ;!! IP 04.02.2005:
  1186.         mov   [next_usage_update], 100
  1187.         mov   byte [0xFFFF], 0 ; change task if possible
  1188.  
  1189.         ret
  1190.  
  1191. ;* mouse centered - start code- Mario79
  1192. mouse_centered:
  1193.         push  eax
  1194.         mov   eax,[0xFE00]
  1195.         shr   eax,1
  1196.         mov   [0xFB0A],ax
  1197.         mov   eax,[0xFE04]
  1198.         shr   eax,1
  1199.         mov   [0xFB0C],ax
  1200.         pop   eax
  1201.         ret
  1202. ;* mouse centered - end code- Mario79
  1203.  
  1204. align 4
  1205.  
  1206. sys_outport:
  1207.  
  1208.     mov   edi,ebx          ; separate flag for read / write
  1209.     and   ebx,65535
  1210.  
  1211.     mov   ecx,[0x2d0000]
  1212.     test  ecx,ecx
  1213.     jne   sopl8
  1214.     mov   [esp+36],dword 1
  1215.     ret
  1216.  
  1217.   sopl8:
  1218.     mov   edx,[0x3010]
  1219.     mov   edx,[edx+0x4]
  1220.     and   ebx,65535
  1221.     cld
  1222.   sopl1:
  1223.  
  1224.     mov   esi,ecx
  1225.     shl   esi,4
  1226.     add   esi,0x2d0000
  1227.     cmp   edx,[esi+0]
  1228.     jne   sopl2
  1229.     cmp   ebx,[esi+4]
  1230.     jb    sopl2
  1231.     cmp   ebx,[esi+8]
  1232.     jg    sopl2
  1233.     jmp   sopl3
  1234.  
  1235.   sopl2:
  1236.  
  1237.     dec   ecx
  1238.     jnz   sopl1
  1239.     mov   [esp+36],dword 1
  1240.     ret
  1241.  
  1242.   sopl3:
  1243.  
  1244.     test  edi,0x80000000 ; read ?
  1245.     jnz   sopl4
  1246.  
  1247.     mov   dx,bx          ; write
  1248.     out   dx,al
  1249.     mov   [esp+36],dword 0
  1250.     ret
  1251.  
  1252.   sopl4:
  1253.  
  1254.     mov   dx,bx          ; read
  1255.     in    al,dx
  1256.     and   eax,0xff
  1257.     mov   [esp+36],dword 0
  1258.     mov   [esp+24],eax
  1259.     ret
  1260.  
  1261.  
  1262.  
  1263. align 4
  1264. sys_sb16:
  1265.  
  1266.      cmp  word [sb16],word 0
  1267.      jnz  sb16l1
  1268.      mov  [esp+36],dword 1
  1269.      ret
  1270.    sb16l1:
  1271.      mov  [esp+36],dword 0
  1272.      cmp  eax,1    ; set volume - main
  1273.      jnz  sb16l2
  1274.      mov  dx,word [sb16]
  1275.      add  dx,4
  1276.      mov  al,0x22
  1277.      out  dx,al
  1278.      mov  esi,1
  1279.      call delay_ms
  1280.      mov  eax,ebx
  1281.      inc  edx
  1282.      out  dx,al
  1283.      ret
  1284.    sb16l2:
  1285.  
  1286.      cmp  eax,2    ; set volume - cd
  1287.      jnz  sb16l3
  1288.      mov  dx,word [sb16]
  1289.      add  dx,4
  1290.      mov  al,0x28
  1291.      out  dx,al
  1292.      mov  esi,1
  1293.      call delay_ms
  1294.      mov  eax,ebx
  1295.      add  edx,1
  1296.      out  dx,al
  1297.      ret
  1298.    sb16l3:
  1299.       mov  [esp+36],dword 2
  1300.       ret
  1301.  
  1302.  
  1303. align 4
  1304.  
  1305. sys_sb16II:
  1306.  
  1307.      cmp  word [sb16],word 0
  1308.      jnz  IIsb16l1
  1309.      mov  [esp+36],dword 1
  1310.      ret
  1311.    IIsb16l1:
  1312.  
  1313.      cmp  eax,1    ; set volume - main
  1314.      jnz  IIsb16l2
  1315.      ; L
  1316.      mov  dx,word [sb16]
  1317.      add  dx,4
  1318.      mov  al,0x30
  1319.      out  dx,al
  1320.      mov  eax,ebx
  1321.      inc  edx
  1322.      out  dx,al
  1323.      ; R
  1324.      mov  dx,word [sb16]
  1325.      add  dx,4
  1326.      mov  al,0x31
  1327.      out  dx,al
  1328.      mov  eax,ebx
  1329.      inc  edx
  1330.      out  dx,al
  1331.      mov  [esp+36],dword 0
  1332.      ret
  1333.    IIsb16l2:
  1334.  
  1335.      cmp  eax,2    ; set volume - cd
  1336.      jnz  IIsb16l3
  1337.      ; L
  1338.      mov  dx,word [sb16]
  1339.      add  dx,4
  1340.      mov  al,0x36
  1341.      out  dx,al
  1342.      mov  eax,ebx
  1343.      inc  edx
  1344.      out  dx,al
  1345.      ; R
  1346.      mov  dx,word [sb16]
  1347.      add  dx,4
  1348.      mov  al,0x37
  1349.      out  dx,al
  1350.      mov  eax,ebx
  1351.      inc  edx
  1352.      out  dx,al
  1353.      mov  [esp+36],dword 0
  1354.      ret
  1355.    IIsb16l3:
  1356.  
  1357.      mov  [esp+36],dword 2
  1358.      ret
  1359.  
  1360.  
  1361. align 4
  1362.  
  1363. sys_wss:
  1364.  
  1365.      cmp  word [wss],word 0
  1366.      jnz  wssl1
  1367.      mov  [esp+36],dword 1
  1368.      ret
  1369.    wssl1:
  1370.  
  1371.      cmp  eax,1    ; set volume - main
  1372.      jnz  wssl2
  1373.      mov  [esp+36],dword 0
  1374.      ret
  1375.    wssl2:
  1376.  
  1377.      cmp  eax,2    ; set volume - cd
  1378.      jnz  wssl3
  1379.      ; L
  1380.      mov  dx,word [wss]
  1381.      add  dx,4
  1382.      mov  al,0x2
  1383.      out  dx,al
  1384.      mov  esi,1
  1385.      call delay_ms
  1386.      mov  eax,ebx
  1387.      inc  edx
  1388.      out  dx,al
  1389.      ; R
  1390.      mov  dx,word [wss]
  1391.      add  dx,4
  1392.      mov  al,0x3
  1393.      out  dx,al
  1394.      mov  esi,1
  1395.      call delay_ms
  1396.      mov  eax,ebx
  1397.      inc  edx
  1398.      out  dx,al
  1399.      mov  [esp+36],dword 0
  1400.      ret
  1401.    wssl3:
  1402.      mov   [esp+36],dword 2
  1403.      ret
  1404.  
  1405. display_number:
  1406.  
  1407. ; eax = print type, al=0 -> ebx is number
  1408. ;                   al=1 -> ebx is pointer
  1409. ;                   ah=0 -> display decimal
  1410. ;                   ah=1 -> display hexadecimal
  1411. ;                   ah=2 -> display binary
  1412. ;                   eax bits 16-21 = number of digits to display (0-32)
  1413. ;                   eax bits 22-31 = reserved
  1414. ;
  1415. ; ebx = number or pointer
  1416. ; ecx = x shl 16 + y
  1417. ; edx = color
  1418.  
  1419.      cmp   eax,0xffff            ; length > 0 ?
  1420.      jge   cont_displ
  1421.      ret
  1422.    cont_displ:
  1423.  
  1424.      cmp   eax,60*0x10000        ; length <= 60 ?
  1425.      jbe   cont_displ2
  1426.      ret
  1427.    cont_displ2:
  1428.  
  1429.      pushad
  1430.  
  1431.      cmp   al,1                  ; ecx is a pointer ?
  1432.      jne   displnl1
  1433.      mov   edi,[0x3010]
  1434.      mov   edi,[edi+0x10]
  1435.      mov   ebx,[edi+ebx]
  1436.    displnl1:
  1437.      sub   esp,64
  1438.  
  1439.      cmp   ah,0                  ; DECIMAL
  1440.      jne   no_display_desnum
  1441.      shr   eax,16
  1442.      and   eax,0x2f
  1443.      push  eax
  1444.      ;mov   edi,[0x3010]
  1445.      ;mov   edi,[edi+0x10]
  1446.      mov   edi,esp
  1447.      add   edi,4+64
  1448.      mov   ecx,eax
  1449.      mov   eax,ebx
  1450.      mov   ebx,10
  1451.    d_desnum:
  1452.      xor   edx,edx
  1453.      div   ebx
  1454.      add   dl,48
  1455.      mov   [edi],dl
  1456.      dec   edi
  1457.      loop  d_desnum
  1458.      pop   eax
  1459.      call  draw_num_text
  1460.      add   esp,64
  1461.      popad
  1462.      ret
  1463.    no_display_desnum:
  1464.  
  1465.      cmp   ah,0x01               ; HEXADECIMAL
  1466.      jne   no_display_hexnum
  1467.      shr   eax,16
  1468.      and   eax,0x2f
  1469.      push  eax
  1470.      ;mov   edi,[0x3010]
  1471.      ;mov   edi,[edi+0x10]
  1472.      mov   edi,esp
  1473.      add   edi,4+64
  1474.      mov   ecx,eax
  1475.      mov   eax,ebx
  1476.      mov   ebx,16
  1477.    d_hexnum:
  1478.      xor   edx,edx
  1479.      div   ebx
  1480.      add   edx,hexletters
  1481.      mov   dl,[edx]
  1482.      mov   [edi],dl
  1483.      dec   edi
  1484.      loop  d_hexnum
  1485.      pop   eax
  1486.      call  draw_num_text
  1487.      add   esp,64
  1488.      popad
  1489.      ret
  1490.    no_display_hexnum:
  1491.  
  1492.      cmp   ah,0x02               ; BINARY
  1493.      jne   no_display_binnum
  1494.      shr   eax,16
  1495.      and   eax,0x2f
  1496.      push  eax
  1497.      ;mov   edi,[0x3010]
  1498.      ;mov   edi,[edi+0x10]
  1499.      mov   edi,esp
  1500.      add   edi,4+64
  1501.      mov   ecx,eax
  1502.      mov   eax,ebx
  1503.      mov   ebx,2
  1504.    d_binnum:
  1505.      xor   edx,edx
  1506.      div   ebx
  1507.      add   dl,48
  1508.      mov   [edi],dl
  1509.      dec   edi
  1510.      loop  d_binnum
  1511.      pop   eax
  1512.      call  draw_num_text
  1513.      add   esp,64
  1514.      popad
  1515.      ret
  1516.    no_display_binnum:
  1517.  
  1518.      add   esp,64
  1519.      popad
  1520.      ret
  1521.  
  1522.  
  1523. draw_num_text:
  1524.  
  1525.      ; dtext
  1526.      ;
  1527.      ; eax x & y
  1528.      ; ebx color
  1529.      ; ecx start of text
  1530.      ; edx length
  1531.      ; edi 1 force
  1532.  
  1533.      mov   edx,eax
  1534.      mov   ecx,65
  1535.      sub   ecx,eax
  1536.      add   ecx,esp
  1537.      add   ecx,4
  1538.      mov   eax,[esp+64+32-8+4]
  1539.      mov   ebx,[esp+64+32-12+4]
  1540.      push  edx                       ; add window start x & y
  1541.      push  ebx
  1542.      mov   edx,[0x3010]
  1543.      mov   ebx,[edx-twdw]
  1544.      shl   ebx,16
  1545.      add   ebx,[edx-twdw+4]
  1546.      add   eax,ebx
  1547.      pop   ebx
  1548.      pop   edx
  1549.      mov   edi,0
  1550.      call  dtext
  1551.  
  1552.      ret
  1553.  
  1554.  
  1555. read_string:
  1556.  
  1557.     ; eax  read_area
  1558.     ; ebx  color of letter
  1559.     ; ecx  color of background
  1560.     ; edx  number of letters to read
  1561.     ; esi  [x start]*65536 + [y_start]
  1562.  
  1563.     ret
  1564.  
  1565.  
  1566. align 4
  1567.  
  1568. sys_setup:
  1569.  
  1570. ; 1=roland mpu midi base , base io address
  1571. ; 2=keyboard   1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus
  1572. ; 3=cd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
  1573. ; 4=sb16 base , base io address
  1574. ; 5=system language, 1eng 2fi 3ger 4rus
  1575. ; 6=wss base , base io address
  1576. ; 7=hd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
  1577. ; 8=fat32 partition in hd
  1578. ; 9
  1579. ; 10 = sound dma channel
  1580. ; 11 = enable lba read
  1581. ; 12 = enable pci access
  1582.  
  1583.  
  1584.      mov  [esp+36],dword 0
  1585.      cmp  eax,1                      ; MIDI
  1586.      jnz  nsyse1
  1587.      cmp  ebx,0x100
  1588.      jb   nsyse1
  1589.      mov  edx,65535
  1590.      cmp  edx,ebx
  1591.      jb   nsyse1
  1592.      mov  [midi_base],bx
  1593.      mov  word [mididp],bx
  1594.      inc  bx
  1595.      mov  word [midisp],bx
  1596.      ret
  1597.  
  1598. midi_base dw 0
  1599.  
  1600.    nsyse1:
  1601.  
  1602.      cmp  eax,2                      ; KEYBOARD
  1603.      jnz  nsyse2
  1604.      cmp  ebx,1
  1605.      jnz  kbnobase
  1606.      mov  edi,[0x3010]
  1607.      add  ecx,[edi+0x10]
  1608.      mov  eax,ecx
  1609.      mov  ebx,keymap
  1610.      mov  ecx,128
  1611.      call memmove
  1612.      ret
  1613.    kbnobase:
  1614.      cmp  ebx,2
  1615.      jnz  kbnoshift
  1616.      mov  edi,[0x3010]
  1617.      add  ecx,[edi+0x10]
  1618.      mov  eax,ecx
  1619.      mov  ebx,keymap_shift
  1620.      mov  ecx,128
  1621.      call memmove
  1622.      ret
  1623.    kbnoshift:
  1624.      cmp  ebx,3
  1625.      jne  kbnoalt
  1626.      mov  edi,[0x3010]
  1627.      add  ecx,[edi+0x10]
  1628.      mov  eax,ecx
  1629.      mov  ebx,keymap_alt
  1630.      mov  ecx,128
  1631.      call memmove
  1632.      ret
  1633.    kbnoalt:
  1634.      cmp  ebx,9
  1635.      jnz  kbnocountry
  1636.      mov  word [keyboard],cx
  1637.      ret
  1638.    kbnocountry:
  1639.      mov  [esp+36],dword 1
  1640.      ret
  1641.    nsyse2:
  1642.      cmp  eax,3                      ; CD
  1643.      jnz  nsyse3
  1644.      mov  [cd_base],bl
  1645.      cmp  ebx,1
  1646.      jnz  noprma
  1647.      mov  [cdbase],0x1f0
  1648.      mov  [cdid],0xa0
  1649.    noprma:
  1650.      cmp  ebx,2
  1651.      jnz  noprsl
  1652.      mov  [cdbase],0x1f0
  1653.      mov  [cdid],0xb0
  1654.    noprsl:
  1655.      cmp  ebx,3
  1656.      jnz  nosema
  1657.      mov  [cdbase],0x170
  1658.      mov  [cdid],0xa0
  1659.    nosema:
  1660.      cmp  ebx,4
  1661.      jnz  nosesl
  1662.      mov  [cdbase],0x170
  1663.      mov  [cdid],0xb0
  1664.    nosesl:
  1665.      ret
  1666.  
  1667. cd_base db 0
  1668.  
  1669.    nsyse3:
  1670.  
  1671.      cmp  eax,4                      ; SB
  1672.      jnz  nsyse4
  1673.      cmp  ebx,0x100
  1674.      jb   nsyse4
  1675.      mov  edx,65535
  1676.      cmp  edx,ebx
  1677.      jb   nsyse4
  1678.      mov  word [sb16],bx
  1679.      ret
  1680.    nsyse4:
  1681.  
  1682.      cmp  eax,5                      ; SYSTEM LANGUAGE
  1683.      jnz  nsyse5
  1684.      mov  [syslang],ebx
  1685.      ret
  1686.    nsyse5:
  1687.  
  1688.      cmp  eax,6                      ; WSS
  1689.      jnz  nsyse6
  1690.      cmp  ebx,0x100
  1691.      jb   nsyse6
  1692.      mov  [wss],ebx
  1693.      ret
  1694.  
  1695. wss_temp dd 0
  1696.  
  1697.    nsyse6:
  1698.  
  1699.      cmp  eax,7                      ; HD BASE
  1700.      jne  nsyse7
  1701.      mov  [hd_base],bl
  1702.      cmp  ebx,1
  1703.      jnz  noprmahd
  1704.      mov  [hdbase],0x1f0
  1705.      mov  [hdid],0x0
  1706.      mov  [hdpos],1
  1707. ;     call set_FAT32_variables
  1708.    noprmahd:
  1709.      cmp  ebx,2
  1710.      jnz  noprslhd
  1711.      mov  [hdbase],0x1f0
  1712.      mov  [hdid],0x10
  1713.      mov  [hdpos],2
  1714. ;     call set_FAT32_variables
  1715.    noprslhd:
  1716.      cmp  ebx,3
  1717.      jnz  nosemahd
  1718.      mov  [hdbase],0x170
  1719.      mov  [hdid],0x0
  1720.      mov  [hdpos],3
  1721. ;     call set_FAT32_variables
  1722.    nosemahd:
  1723.      cmp  ebx,4
  1724.      jnz  noseslhd
  1725.      mov  [hdbase],0x170
  1726.      mov  [hdid],0x10
  1727.      mov  [hdpos],4
  1728. ;     call set_FAT32_variables
  1729.    noseslhd:
  1730.      mov   [0xfe10],dword 0
  1731.     call  reserve_hd1
  1732.     call  clear_hd_cache
  1733.     mov   [hd1_status],0        ; free
  1734.      ret
  1735.  
  1736. hd_base db 0
  1737.  
  1738.    nsyse7:
  1739.  
  1740.      cmp  eax,8                      ; HD PARTITION
  1741.      jne  nsyse8
  1742.      mov  [fat32part],ebx
  1743. ;     call set_FAT32_variables
  1744.     call  reserve_hd1
  1745.     call  clear_hd_cache
  1746.      pusha
  1747.      call  choice_necessity_partition_1
  1748.      popa
  1749.     mov   [hd1_status],0        ; free
  1750.      ret
  1751.    nsyse8:
  1752.  
  1753.      cmp  eax,10                     ; SOUND DMA CHANNEL
  1754.      jne  no_set_sound_dma
  1755.      mov  [sound_dma],ebx
  1756.      ret
  1757.    no_set_sound_dma:
  1758.  
  1759.      cmp  eax,11                     ; ENABLE LBA READ
  1760.      jne  no_set_lba_read
  1761.      and  ebx,1
  1762.      mov  [lba_read_enabled],ebx
  1763.      ret
  1764.    no_set_lba_read:
  1765.  
  1766.      cmp  eax,12                     ; ENABLE PCI ACCESS
  1767.      jne  no_set_pci_access
  1768.      and  ebx,1
  1769.      mov  [pci_access_enabled],ebx
  1770.      ret
  1771.    no_set_pci_access:
  1772.  
  1773. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1774. include 'vmodeint.inc'
  1775. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1776.  
  1777.      mov  [esp+36],dword -1
  1778.      ret
  1779.  
  1780.  
  1781. align 4
  1782.  
  1783. sys_getsetup:
  1784.  
  1785. ; 1=roland mpu midi base , base io address
  1786. ; 2=keyboard   1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus
  1787. ; 3=cd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
  1788. ; 4=sb16 base , base io address
  1789. ; 5=system language, 1eng 2fi 3ger 4rus
  1790. ; 6=wss base
  1791. ; 7=hd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
  1792. ; 8=fat32 partition in hd
  1793. ; 9=get hs timer tic
  1794.  
  1795.      cmp  eax,1
  1796.      jne  ngsyse1
  1797.      movzx eax,[midi_base]
  1798.      mov  [esp+36],eax
  1799.      ret
  1800.    ngsyse1:
  1801.  
  1802.      cmp  eax,2
  1803.      jne  ngsyse2
  1804.      cmp  ebx,1
  1805.      jnz  kbnobaseret
  1806.      mov  edi,[0x3010]
  1807.      add  ecx,[edi+0x10]
  1808.      mov  ebx,ecx
  1809.      mov  eax,keymap
  1810.      mov  ecx,128
  1811.      call memmove
  1812.      ret
  1813.    kbnobaseret:
  1814.      cmp  ebx,2
  1815.      jnz  kbnoshiftret
  1816.      mov  edi,[0x3010]
  1817.      add  ecx,[edi+0x10]
  1818.      mov  ebx,ecx
  1819.      mov  eax,keymap_shift
  1820.      mov  ecx,128
  1821.      call memmove
  1822.      ret
  1823.    kbnoshiftret:
  1824.      cmp  ebx,3
  1825.      jne  kbnoaltret
  1826.      mov  edi,[0x3010]
  1827.      add  ecx,[edi+0x10]
  1828.      mov  ebx,ecx
  1829.      mov  eax,keymap_alt
  1830.      mov  ecx,128
  1831.      call memmove
  1832.      ret
  1833.    kbnoaltret:
  1834.      cmp  ebx,9
  1835.      jnz  ngsyse2
  1836.      movzx eax,word [keyboard]
  1837.      mov  [esp+36],eax
  1838.      ret
  1839.    ngsyse2:
  1840.  
  1841.      cmp  eax,3
  1842.      jnz  ngsyse3
  1843.      movzx eax,[cd_base]
  1844.      mov  [esp+36],eax
  1845.      ret
  1846.    ngsyse3:
  1847.  
  1848.      cmp  eax,4
  1849.      jne  ngsyse4
  1850.      mov  eax,[sb16]
  1851.      mov  [esp+36],eax
  1852.      ret
  1853.    ngsyse4:
  1854.  
  1855.      cmp  eax,5
  1856.      jnz  ngsyse5
  1857.      mov  eax,[syslang]
  1858.      mov  [esp+36],eax
  1859.      ret
  1860.    ngsyse5:
  1861.      cmp  eax,6
  1862.      jnz  ngsyse6
  1863.      mov  eax,[wss]
  1864.      mov  [esp+36],eax
  1865.      ret
  1866.    ngsyse6:
  1867.      cmp  eax,7
  1868.      jnz  ngsyse7
  1869.      movzx eax,[hd_base]
  1870.      mov  [esp+36],eax
  1871.      ret
  1872.    ngsyse7:
  1873.      cmp  eax,8
  1874.      jnz  ngsyse8
  1875.      mov eax,[fat32part]
  1876.      mov  [esp+36],eax
  1877.      ret
  1878.    ngsyse8:
  1879.      cmp  eax,9
  1880.      jne  ngsyse9
  1881.      mov  eax,[timer_ticks] ;[0xfdf0]
  1882.      mov  [esp+36],eax
  1883.      ret
  1884.    ngsyse9:
  1885.      cmp  eax,10
  1886.      jnz  ngsyse10
  1887.      mov eax,[sound_dma]
  1888.      mov  [esp+36],eax
  1889.      ret
  1890.    ngsyse10:
  1891.      cmp  eax,11
  1892.      jnz  ngsyse11
  1893.      mov eax,[lba_read_enabled]
  1894.      mov  [esp+36],eax
  1895.      ret
  1896.    ngsyse11:
  1897.      cmp  eax,12
  1898.      jnz  ngsyse12
  1899.      mov eax,[pci_access_enabled]
  1900.      mov  [esp+36],eax
  1901.      ret
  1902.    ngsyse12:
  1903.      mov  [esp+36],dword 1
  1904.      ret
  1905.  
  1906.  
  1907. align 4
  1908.  
  1909. readmousepos:
  1910.  
  1911. ; eax=0 screen relative
  1912. ; eax=1 window relative
  1913. ; eax=2 buttons pressed
  1914.  
  1915.     test eax,eax
  1916.     jnz  nosr
  1917.     mov  eax,[0xfb0a]
  1918.     shl  eax,16
  1919.     mov  ax,[0xfb0c]
  1920.     mov  [esp+36],eax
  1921.     ret
  1922.   nosr:
  1923.  
  1924.     cmp  eax,1
  1925.     jnz  nowr
  1926.     mov  eax,[0xfb0a]
  1927.     shl  eax,16
  1928.     mov  ax,[0xfb0c]
  1929.     mov  esi,[0x3010]
  1930.     sub  esi,twdw
  1931.     mov  bx,[esi]
  1932.     shl  ebx,16
  1933.     mov  bx,[esi+4]
  1934.     sub  eax,ebx
  1935.     mov  [esp+36],eax
  1936.     ret
  1937.   nowr:
  1938.  
  1939.     cmp   eax,2
  1940.     jnz   nomb
  1941.     movzx eax,byte [0xfb40]
  1942.   nomb:
  1943.     mov   [esp+36],eax
  1944.  
  1945.     ret
  1946.  
  1947. is_input:
  1948.  
  1949.    push edx
  1950.    mov  dx,word [midisp]
  1951.    in   al,dx
  1952.    and  al,0x80
  1953.    pop  edx
  1954.    ret
  1955.  
  1956.  
  1957. is_output:
  1958.  
  1959.    push edx
  1960.    mov  dx,word [midisp]
  1961.    in   al,dx
  1962.    and  al,0x40
  1963.    pop  edx
  1964.    ret
  1965.  
  1966.  
  1967. get_mpu_in:
  1968.  
  1969.    push edx
  1970.    mov  dx,word [mididp]
  1971.    in   al,dx
  1972.    pop  edx
  1973.    ret
  1974.  
  1975.  
  1976. put_mpu_out:
  1977.  
  1978.    push edx
  1979.    mov  dx,word [mididp]
  1980.    out  dx,al
  1981.    pop  edx
  1982.    ret
  1983.  
  1984.  
  1985. setuart:
  1986.  
  1987.  su1:
  1988.    call is_output
  1989.    cmp  al,0
  1990.    jnz  su1
  1991.    mov  dx,word [midisp]
  1992.    mov  al,0xff
  1993.    out  dx,al
  1994.  su2:
  1995.    mov  dx,word [midisp]
  1996.    mov  al,0xff
  1997.    out  dx,al
  1998.    call is_input
  1999.    cmp  al,0
  2000.    jnz  su2
  2001.    call get_mpu_in
  2002.    cmp  al,0xfe
  2003.    jnz  su2
  2004.  su3:
  2005.    call is_output
  2006.    cmp  al,0
  2007.    jnz  su3
  2008.    mov  dx,word [midisp]
  2009.    mov  al,0x3f
  2010.    out  dx,al
  2011.  
  2012.    ret
  2013.  
  2014.  
  2015. align 4
  2016.  
  2017. sys_midi:
  2018.  
  2019.      cmp  [mididp],0
  2020.      jnz  sm0
  2021.      mov  [esp+36],dword 1
  2022.      ret
  2023.    sm0:
  2024.  
  2025.      cmp  eax,1
  2026.      mov  [esp+36],dword 0
  2027.      jnz  smn1
  2028.      call setuart
  2029.      ret
  2030.    smn1:
  2031.  
  2032.      cmp  eax,2
  2033.      jnz  smn2
  2034.    sm10:
  2035.      call get_mpu_in
  2036.      call is_output
  2037.      test al,al
  2038.      jnz  sm10
  2039.      mov  al,bl
  2040.      call put_mpu_out
  2041.      ret
  2042.    smn2:
  2043.  
  2044.      ret
  2045.  
  2046.  
  2047. detect_devices:
  2048. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2049. include 'detect/commouse.inc'
  2050. ;include 'detect/dev_fd.inc'
  2051. ;include 'detect/dev_hdcd.inc'
  2052. ;include 'detect/sear_par.inc'
  2053. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2054.     ret
  2055.  
  2056.  
  2057. sys_end:
  2058.  
  2059.      mov   eax,[0x3010]
  2060.      add   eax,0xa
  2061.      mov   [eax],byte 3  ; terminate this program
  2062.      
  2063.     waitterm:            ; wait here for termination
  2064.      mov   eax,5
  2065.      call  delay_hs
  2066.      jmp   waitterm
  2067.  
  2068. sys_system:
  2069.  
  2070.      cmp  eax,1                              ; BOOT
  2071.      jnz  nosystemboot
  2072.      mov  [0x2f0000+0x9030],byte 0
  2073.   for_shutdown_parameter:    
  2074.      mov  eax,[0x3004]
  2075.      add  eax,2
  2076.      mov  [shutdown_processes],eax
  2077.      mov  [0xFF00],al
  2078.      xor  eax, eax
  2079.      ret
  2080.   uglobal
  2081.    shutdown_processes: dd 0x0
  2082.   endg
  2083.    nosystemboot:
  2084.  
  2085.      cmp  eax,2                              ; TERMINATE
  2086.      jnz  noprocessterminate
  2087.      cmp  ebx,2
  2088.      jb   noprocessterminate
  2089.      mov  edx,[0x3004]
  2090.      cmp  ebx,edx
  2091.      jg   noprocessterminate
  2092.      mov  eax,[0x3004]
  2093.      shl  ebx,5
  2094.      mov  edx,[ebx+0x3000+4]
  2095.      add  ebx,0x3000+0xa
  2096.      
  2097.      ;call MEM_Heap_Lock      ;guarantee that process isn't working with heap
  2098.      mov  [ebx],byte 3       ; clear possible i40's
  2099.      ;call MEM_Heap_UnLock
  2100.  
  2101.      cmp  edx,[application_table_status]    ; clear app table stat
  2102.      jne  noatsc
  2103.      mov  [application_table_status],0
  2104.    noatsc:
  2105.      ret
  2106.    noprocessterminate:
  2107.  
  2108.      cmp  eax,3                              ; ACTIVATE WINDOW
  2109.      jnz  nowindowactivate
  2110.      cmp  ebx,2
  2111.      jb   nowindowactivate
  2112.      cmp  ebx,[0x3004]
  2113.      ja   nowindowactivate
  2114.      ; edi = position at window_data+
  2115.      mov  edi, ebx          ; edi = process number
  2116.      ;shl  ebx, 1
  2117.      ;add  ebx, 0xc000
  2118.      ;mov  esi, [ebx]        ; esi = window stack value
  2119.      ;and  esi, 0xffff       ;       word
  2120.     movzx esi, word [0xC000 + ebx*2]
  2121.      mov  edx, [0x3004] ; edx = number of processes
  2122.      cmp  esi, edx
  2123.      jz   nowindowactivate ; continue if window_stack_value != number_of_processes
  2124.                            ;     i.e. if window is not already active
  2125.  
  2126. ;* start code - get active process (1) - Mario79
  2127.      mov  [window_minimize],2
  2128.      mov  [active_process],edi
  2129. ;* end code - get active process (1) - Mario79
  2130.  
  2131.      mov  [0xff01],edi     ; activate
  2132.      xor  eax, eax
  2133.      ret
  2134.      
  2135.    nowindowactivate:
  2136.  
  2137.      cmp  eax,4                              ; GET IDLETIME
  2138.      jnz  nogetidletime
  2139.      mov  eax,[idleusesec]
  2140.      ret
  2141.    nogetidletime:
  2142.  
  2143.      cmp  eax,5                              ; GET TSC/SEC
  2144.      jnz  nogettscsec
  2145.      mov  eax,[0xf600]
  2146.      ret
  2147.    nogettscsec:
  2148.  
  2149. ;  SAVE ramdisk to /hd/1/menuet.img
  2150. ;!!!!!!!!!!!!!!!!!!!!!!!!
  2151.    include 'blkdev/rdsave.inc'
  2152. ;!!!!!!!!!!!!!!!!!!!!!!!!
  2153. ;* start code - get active process (2) - Mario79
  2154.      cmp  eax,7
  2155.      jnz  nogetactiveprocess
  2156.      mov  eax,[active_process]
  2157.      ret
  2158.  nogetactiveprocess:  
  2159.      cmp  eax,8
  2160.      jnz  nosoundflag
  2161.      cmp  ebx,1
  2162.      jne  nogetsoundflag
  2163.      movzx  eax,byte [sound_flag] ; get sound_flag
  2164.      ret
  2165.  nogetsoundflag:
  2166.      cmp  ebx,2
  2167.      jnz  nosoundflag
  2168.      inc  byte [sound_flag]       ; set sound_flag
  2169.      and byte [sound_flag],1      ;
  2170.      ret    
  2171. nosoundflag:
  2172.      cmp  eax,9                   ; system shutdown with param
  2173.      jnz  noshutdownsystem
  2174.      cmp  ebx,1
  2175.      jl  exit_for_anyone
  2176.      cmp  ebx,4
  2177.      jg   exit_for_anyone
  2178.      mov  [0x2f0000+0x9030],bl
  2179.      jmp  for_shutdown_parameter
  2180. noshutdownsystem:
  2181.      cmp  eax,10                   ; minimize window
  2182.      jnz  nominimizewindow
  2183.      mov   [window_minimize],1
  2184.  exit_for_anyone:
  2185.      ret
  2186. nominimizewindow:
  2187.      cmp  eax,11           ; get disk info table
  2188.      jnz  nogetdiskinfo
  2189.      cmp  ebx,1
  2190.      jnz  full_table
  2191.   small_table:
  2192.      call for_all_tables
  2193.      mov cx,10
  2194.      cld
  2195.      rep movsb
  2196.      ret
  2197.    for_all_tables:
  2198.      mov edi,[3010h]
  2199.      mov edi,[edi+10h]
  2200.      add edi,ecx
  2201.      mov esi,0x40000
  2202.      xor ecx,ecx
  2203.      ret
  2204.   full_table:
  2205.      cmp  ebx,2
  2206.      jnz  exit_for_anyone
  2207.      call for_all_tables
  2208.      mov cx,16384
  2209.      cld
  2210.      rep movsd
  2211.      ret
  2212. nogetdiskinfo:
  2213.      cmp  eax,12      ; get all key pressed with ALT
  2214.      jnz  nogetkey
  2215.      mov   eax,[last_key_press]
  2216.      mov   al,[keyboard_mode_sys]
  2217.      mov   [esp+36],eax
  2218.      mov   [last_key_press],0
  2219.  .finish:
  2220.      ret
  2221. nogetkey:
  2222.      cmp  eax,13      ; get kernel ID and version
  2223.      jnz  nogetkernel_id
  2224.      mov edi,[3010h]
  2225.      mov edi,[edi+10h]
  2226.      add edi,ebx
  2227.      mov esi,version_inf
  2228.      mov ecx,version_end-version_inf
  2229.      cld
  2230.      rep movsb
  2231.      ret
  2232. nogetkernel_id:
  2233.      cmp  eax,14      ; sys wait retrace
  2234.      jnz  nosys_wait_retrace
  2235.      ;wait retrace functions
  2236.  sys_wait_retrace:
  2237.      mov edx,0x3da
  2238.  WaitRetrace_loop:
  2239.      in al,dx
  2240.      test al,1000b
  2241.      jz WaitRetrace_loop
  2242.      mov [esp+36],dword 0
  2243.      ret
  2244. nosys_wait_retrace:
  2245.      cmp  eax,15      ; mouse centered
  2246.      jnz  no_mouse_centered
  2247.      call  mouse_centered
  2248.      mov [esp+36],dword 0
  2249.      ret
  2250. no_mouse_centered:
  2251. ;* end  code - get active process (2) - Mario79
  2252.      ret
  2253. window_minimize db 0
  2254. sound_flag      db 0
  2255. last_key_press  dd 0
  2256. keyboard_mode_sys db 0
  2257.  
  2258. iglobal
  2259. version_inf:
  2260.   db 0,5,1,0  ; version 0.5.1.0
  2261.   db UID_KOLIBRI
  2262.   db 'Kolibri',0
  2263. version_end:
  2264. endg
  2265.  
  2266. UID_NONE=0
  2267. UID_MENUETOS=1   ;official
  2268. UID_KOLIBRI=2    ;russian
  2269.  
  2270. main_loop_sys_getkey:
  2271.     cmp   [0xf400],byte 0
  2272.     je    .finish
  2273.     movzx eax,byte [0xf401]
  2274.     shl   eax,8
  2275.     mov   [last_key_press],eax
  2276.  .finish:
  2277.     ret
  2278.  
  2279. sys_cachetodiskette:
  2280.     pushad
  2281.     cmp  eax,1
  2282.     jne  no_write_all_of_ramdisk
  2283.  
  2284.     call fdc_writeramdisk
  2285.     popad
  2286.     ret
  2287.   no_write_all_of_ramdisk:
  2288.     cmp eax,2
  2289.     jne no_write_part_of_ramdisk
  2290.     call fdc_commitflush
  2291.     popad
  2292.     ret
  2293.   no_write_part_of_ramdisk:
  2294.     cmp  eax,3
  2295.     jne  no_set_fdc
  2296.     call fdc_set
  2297.     popad
  2298.     ret
  2299.   no_set_fdc:
  2300.     cmp  eax,4
  2301.     jne  no_get_fdc
  2302.     popad
  2303.     call fdc_get
  2304.     mov    [esp+36],ecx
  2305.     ret
  2306.   no_get_fdc:
  2307.     popad
  2308.     ret
  2309.  
  2310. uglobal
  2311. ;  bgrchanged  dd  0x0
  2312. endg
  2313.  
  2314. sys_background:
  2315.  
  2316.     cmp   eax,1                            ; BACKGROUND SIZE
  2317.     jnz   nosb1
  2318.     cmp   ebx,0
  2319.     je    sbgrr
  2320.     cmp   ecx,0
  2321.     je    sbgrr
  2322.     mov   [display_data-8],ebx
  2323.     mov   [display_data-4],ecx
  2324. ;    mov   [bgrchanged],1
  2325.   sbgrr:
  2326.     ret
  2327.   nosb1:
  2328.  
  2329.     cmp   eax,2                            ; SET PIXEL
  2330.     jnz   nosb2
  2331.     mov   edx,0x160000-16
  2332.     cmp   edx,ebx
  2333.     jbe   nosb2
  2334.     mov   edx,[ebx]
  2335.     and   edx,0xFF000000 ;255*256*256*256
  2336.     and   ecx,0x00FFFFFF ;255*256*256+255*256+255
  2337.     add   edx,ecx
  2338.     mov   [ebx+0x300000],edx
  2339. ;    mov   [bgrchanged],1
  2340.     ret
  2341.   nosb2:
  2342.  
  2343.     cmp   eax,3                            ; DRAW BACKGROUND
  2344.     jnz   nosb3
  2345. draw_background_temp:
  2346. ;    cmp   [bgrchanged],1 ;0
  2347. ;    je    nosb31
  2348. ;draw_background_temp:
  2349. ;    mov   [bgrchanged],1 ;0
  2350.     mov   [0xfff0],byte 1
  2351.    nosb31:
  2352.     ret
  2353.   nosb3:
  2354.  
  2355.     cmp   eax,4                            ; TILED / STRETCHED
  2356.     jnz   nosb4
  2357.     cmp   ebx,[display_data-12]
  2358.     je    nosb41
  2359.     mov   [display_data-12],ebx
  2360. ;    mov   [bgrchanged],1
  2361.    nosb41:
  2362.     ret
  2363.   nosb4:
  2364.  
  2365.     cmp   eax,5                            ; BLOCK MOVE TO BGR
  2366.     jnz   nosb5
  2367.   ; bughere
  2368.     mov   edi, [0x3010]
  2369.     add   ebx, [edi+0x10]
  2370.  ;   mov   esi, ebx
  2371.  ;   mov   edi, ecx
  2372.     mov   eax, ebx
  2373.     mov   ebx, ecx
  2374.     add   ecx, edx
  2375.     cmp   ecx, 0x160000-16
  2376.     ja    .fin
  2377.  ;   add   edi, 0x300000
  2378.     add   ebx, 0x300000
  2379.     mov   ecx, edx
  2380.     cmp   ecx, 0x160000-16
  2381.     ja    .fin
  2382. ;    mov   [bgrchanged],1
  2383.   ;  cld
  2384.   ;  rep   movsb
  2385.     call  memmove
  2386.   .fin:
  2387.     ret
  2388.   nosb5:
  2389.  
  2390.     ret
  2391.  
  2392.  
  2393. align 4
  2394.  
  2395. sys_getbackground:
  2396.  
  2397.     cmp   eax,1                                  ; SIZE
  2398.     jnz   nogb1
  2399.     mov   eax,[display_data-8]
  2400.     shl   eax,16
  2401.     mov   ax,[display_data-4]
  2402.     mov   [esp+36],eax
  2403.     ret
  2404.   nogb1:
  2405.  
  2406.     cmp   eax,2                                  ; PIXEL
  2407.     jnz   nogb2
  2408.     mov   edx,0x160000-16
  2409.     cmp   edx,ebx
  2410.     jbe   nogb2
  2411.     mov   eax, [ebx+0x300000]
  2412.     and   eax, 0xFFFFFF
  2413.     mov   [esp+36],eax
  2414.     ret
  2415.   nogb2:
  2416.  
  2417.     cmp   eax,4                                  ; TILED / STRETCHED
  2418.     jnz   nogb4
  2419.     mov   eax,[display_data-12]
  2420.   nogb4:
  2421.     mov   [esp+36],eax
  2422.     ret
  2423.  
  2424.  
  2425. align 4
  2426.  
  2427. sys_getkey:
  2428.     mov   [esp+36],dword 1
  2429.     mov   ebx, [0x3000]                          ; TOP OF WINDOW STACK
  2430.     movzx ecx,word [0xC000 + ebx * 2]
  2431.     mov   edx,[0x3004]
  2432.     cmp   ecx,edx
  2433.     jne   .finish
  2434.     cmp   [0xf400],byte 0
  2435.     je    .finish
  2436.     movzx eax,byte [0xf401]
  2437.     shl   eax,8
  2438.     push  eax
  2439.     dec   byte [0xf400]
  2440.     and   byte [0xf400],127
  2441.     movzx ecx,byte [0xf400]
  2442.     add   ecx,2
  2443.  ;   mov   esi,0xf402
  2444.  ;   mov   edi,0xf401
  2445.  ;   cld
  2446.  ;  rep   movsb
  2447.     mov   eax, 0xF402
  2448.     mov   ebx, 0xF401
  2449.     call  memmove
  2450.     pop   eax
  2451.     mov   [last_key_press],eax
  2452.  
  2453.     mov   eax,[kb_state]
  2454.     and   al,110000b
  2455.     cmp   al,100000b
  2456.     je    .yes_win_key
  2457.     cmp   al,10000b
  2458.     je    .yes_win_key
  2459.     mov   eax,[last_key_press]
  2460.     jmp   .no_win_key
  2461. ;    cmp   ah,232
  2462. ;    je    .yes_win_key
  2463. ;    cmp   ah,233
  2464. ;    jne   .no_win_key
  2465.  .yes_win_key:
  2466.     mov   eax,1
  2467.  .no_win_key:
  2468.     mov   [esp+36],eax
  2469.  .finish:
  2470.     ret
  2471.  
  2472.  
  2473. align 4
  2474.  
  2475. sys_getbutton:
  2476.  
  2477.     mov   ebx, [0x3000]                         ; TOP OF WINDOW STACK
  2478.     mov   [esp+36],dword 1
  2479.     movzx ecx, word [0xC000 + ebx * 2]
  2480.     mov   edx, [0x3004] ; less than 256 processes
  2481.     cmp   ecx,edx
  2482.     jne   .exit
  2483.     movzx eax,byte [0xf500]
  2484.     test  eax,eax
  2485.     jz    .exit
  2486.     mov   eax,[0xf501]
  2487.     shl   eax,8
  2488.     mov   [0xf500],byte 0
  2489.     mov   [esp+36],eax
  2490.  .exit:
  2491.     ret
  2492.  
  2493.  
  2494. align 4
  2495.  
  2496. sys_cpuusage:
  2497.  
  2498. ;  RETURN:
  2499. ;
  2500. ;  +00 dword     process cpu usage
  2501. ;  +04  word     position in windowing stack
  2502. ;  +06  word     windowing stack value at current position (cpu nro)
  2503. ;  +10 12 bytes  name
  2504. ;  +22 dword     start in mem
  2505. ;  +26 dword     used mem
  2506. ;  +30 dword     PID , process idenfification number
  2507. ;
  2508.  
  2509.     mov  edi,[0x3010]   ; eax = return area
  2510.     add  edi,0x10
  2511.     add  eax,[edi]
  2512.  
  2513.     cmp  ebx,-1         ; who am I ?
  2514.     jne  no_who_am_i
  2515.     mov  ebx,[0x3000]
  2516.   no_who_am_i:
  2517.  
  2518.     push eax            ; return area
  2519.     push ebx            ; process number
  2520.  
  2521.     push ebx
  2522.     push ebx
  2523.     push eax
  2524.  
  2525.     ; return memory usage
  2526.  
  2527.     xor  edx,edx
  2528.     mov  eax,0x20
  2529.     mul  ebx
  2530.     add  eax,0x3000+0x1c
  2531.     mov  ebx,eax
  2532.     pop  eax
  2533.     mov  ecx,[ebx]
  2534.     mov  [eax],ecx
  2535.     pop  ebx
  2536. ;    mov  ebx,[esp]
  2537. ;    shl  ebx,1
  2538. ;    add  ebx,0xc000
  2539.     mov  cx, [0xC000 + ebx * 2]
  2540.     mov  [eax+4],cx
  2541. ;    mov  ebx,[esp]
  2542. ;    shl  ebx,1
  2543. ;    add  ebx,0xc400
  2544.     mov  cx, [0xC400 + ebx * 2]
  2545.     mov  [eax+6],cx
  2546. ;    pop  ebx
  2547.     push eax
  2548.     mov  eax,ebx
  2549.     shl  eax,8
  2550.     add  eax,0x80000
  2551.     pop  ebx
  2552.     add  ebx,10
  2553.     mov  ecx,11
  2554.     call memmove
  2555.  
  2556.     ; memory usage
  2557.  
  2558.     xor    eax,eax
  2559.     mov    edx,0x100000*16
  2560.     pop    ecx                                   ; get gdt of tss
  2561.     cmp    ecx,1
  2562.     je     os_mem
  2563.     shl    ecx,8
  2564.     mov    edx,[0x80000+ecx+0x8c]
  2565.     mov    eax,std_application_base_address
  2566.     ;add    ecx,0x80000+0x88
  2567.     ;mov    ecx,[ecx]
  2568. ;    shl    ecx,3
  2569.     ; eax run base -> edx used memory
  2570. ;    mov    al,[ecx+gdts+ app_code-3 +4]        ;  base  23:16
  2571. ;    mov    ah,[ecx+gdts+ app_code-3 +7]        ;  base  31:24
  2572. ;    shl    eax,16
  2573. ;    mov    ax,[ecx+gdts+ app_code-3 +2]        ;  base  0:15
  2574. ;    movzx  edx,word [ecx+gdts+ app_code-3 +0]
  2575. ;    shl    edx,12
  2576.  
  2577.   os_mem:
  2578.     dec    edx
  2579.     mov    [ebx+12],eax
  2580.     mov    [ebx+16],edx
  2581.  
  2582.     ; PID (+30)
  2583.  
  2584.     mov    eax,[esp]
  2585.     shl    eax,5
  2586.     add    eax,0x3000+0x4
  2587.     mov    eax,[eax]
  2588.     mov    [ebx+20],eax
  2589.  
  2590.     ; window position and size
  2591.  
  2592.     mov    esi,[esp]
  2593.     shl    esi,5
  2594.     add    esi,window_data
  2595.     mov    edi,[esp+4]
  2596.     add    edi,34
  2597.     mov    ecx,4*4
  2598.     cld
  2599.     rep    movsb
  2600.  
  2601.     ; Process state (+50)
  2602.  
  2603.     mov    eax,[esp]
  2604.     shl    eax,5
  2605.     add    eax,0x3000+0xa
  2606.     mov    eax,[eax]
  2607.     mov    [ebx+40],ax
  2608.  
  2609.  
  2610.     pop    ebx
  2611.     pop    eax
  2612.  
  2613.     ; return number of processes
  2614.  
  2615.     mov    eax,[0x3004]
  2616.     mov    [esp+36],eax
  2617.     ret
  2618.  
  2619.  
  2620.  
  2621.  
  2622. align 4
  2623. sys_clock:
  2624.         cli
  2625.   ; Mikhail Lisovin  xx Jan 2005
  2626.   @@:   mov   al, 10
  2627.         out   0x70, al
  2628.         in    al, 0x71
  2629.         test  al, al
  2630.         jns   @f
  2631.         mov   esi, 1
  2632.         call  delay_ms
  2633.         jmp   @b
  2634.   @@:
  2635.   ; end Lisovin's fix
  2636.  
  2637.         xor   al,al           ; seconds
  2638.         out   0x70,al
  2639.         in    al,0x71
  2640.         movzx ecx,al
  2641.         mov   al,02           ; minutes
  2642.         shl   ecx,16
  2643.         out   0x70,al
  2644.         in    al,0x71
  2645.         movzx edx,al
  2646.         mov   al,04           ; hours
  2647.         shl   edx,8
  2648.         out   0x70,al
  2649.         in    al,0x71
  2650.         add   ecx,edx
  2651.         movzx edx,al
  2652.         add   ecx,edx
  2653.         sti
  2654.         mov   [esp+36],ecx
  2655.         ret
  2656.  
  2657.  
  2658. align 4
  2659.  
  2660. sys_date:
  2661.  
  2662.         cli
  2663.         mov     al,6            ; day of week
  2664.         out     0x70,al
  2665.         in      al,0x71
  2666.         mov     ch,al
  2667.         mov     al,7            ; date
  2668.         out     0x70,al
  2669.         in      al,0x71
  2670.         mov     cl,al
  2671.         mov     al,8            ; month
  2672.         shl     ecx,16
  2673.         out     0x70,al
  2674.         in      al,0x71
  2675.         mov     ch,al
  2676.         mov     al,9            ; year
  2677.         out     0x70,al
  2678.         in      al,0x71
  2679.         mov     cl,al
  2680.         sti
  2681.         mov     [esp+36],ecx
  2682.         ret
  2683.  
  2684.  
  2685. ; redraw status
  2686.  
  2687. sys_redrawstat:
  2688.  
  2689.     cmp  eax,1
  2690.     jne  no_widgets_away
  2691.  
  2692.     ; buttons away
  2693.  
  2694.     mov   ecx,[0x3000]
  2695.  
  2696.   sys_newba2:
  2697.  
  2698.     mov   edi,[0xfe88]
  2699.     cmp   [edi],dword 0  ; empty button list ?
  2700.     je    end_of_buttons_away
  2701.  
  2702.     movzx ebx,word [edi]
  2703.     inc   ebx
  2704.  
  2705.     mov   eax,edi
  2706.  
  2707.   sys_newba:
  2708.  
  2709.     dec   ebx
  2710.     jz    end_of_buttons_away
  2711.  
  2712.     add   eax,0x10
  2713.     cmp   cx,[eax]
  2714.     jnz   sys_newba
  2715.  
  2716.     push  eax ebx ecx
  2717.     mov   ecx,ebx
  2718.     inc   ecx
  2719.     shl   ecx,4
  2720.     mov   ebx,eax
  2721.     add   eax,0x10
  2722.     call  memmove
  2723.     dec   dword [edi]
  2724.     pop   ecx ebx eax
  2725.  
  2726.     jmp   sys_newba2
  2727.  
  2728.   end_of_buttons_away:
  2729.  
  2730.     ret
  2731.  
  2732.   no_widgets_away:
  2733.  
  2734.     cmp   eax,2
  2735.     jnz   srl1
  2736.  
  2737.     mov   edx,[0x3010]      ; return whole screen draw area for this app
  2738.     add   edx,draw_data-0x3000
  2739.     mov   [edx+0],dword 0
  2740.     mov   [edx+4],dword 0
  2741.     mov   eax,[0xfe00]
  2742.     mov   [edx+8],eax
  2743.     mov   eax,[0xfe04]
  2744.     mov   [edx+12],eax
  2745.  
  2746.     mov   edi,[0x3010]
  2747.     sub   edi,twdw
  2748.     mov   [edi+30],byte 1   ; no new position & buttons from app
  2749.  
  2750.     call  sys_window_mouse
  2751.  
  2752.     ret
  2753.  
  2754.   srl1:
  2755.  
  2756.     ret
  2757.  
  2758.  
  2759. sys_drawwindow:
  2760.  
  2761.     mov   edi,ecx
  2762.     shr   edi,16+8
  2763.     and   edi,15
  2764.  
  2765.     cmp   edi,0   ; type I    - original style
  2766.     jne   nosyswI
  2767.     call  sys_set_window
  2768.     call  drawwindow_I
  2769.     ret
  2770.   nosyswI:
  2771.  
  2772.     cmp   edi,1   ; type II   - only reserve area, no draw
  2773.     jne   nosyswII
  2774.     call  sys_set_window
  2775.     call  sys_window_mouse
  2776.     ret
  2777.   nosyswII:
  2778.  
  2779.     cmp   edi,2   ; type III  - new style
  2780.     jne   nosyswIII
  2781.     call  sys_set_window
  2782.     call  drawwindow_III
  2783.     ret
  2784.   nosyswIII:
  2785.  
  2786.     cmp   edi,3   ; type IV - skinned window
  2787.     jne   nosyswIV
  2788.     call  sys_set_window
  2789.     call  drawwindow_IV
  2790.     ret
  2791.   nosyswIV:
  2792.  
  2793.     ret
  2794.  
  2795.  
  2796. sys_set_window:
  2797.  
  2798.     mov   edi,[0x3000]
  2799.     shl   edi,5
  2800.     add   edi,window_data
  2801.  
  2802.     ; colors
  2803.     mov   [edi+16],ecx
  2804.     mov   [edi+20],edx
  2805.     mov   [edi+24],esi
  2806.  
  2807.     ; check flag (?)
  2808.     cmp   [edi+30],byte 1
  2809.     jz    newd
  2810.  
  2811.     push  eax
  2812.     mov   eax,[timer_ticks] ;[0xfdf0]
  2813.     add   eax,100
  2814.     mov   [new_window_starting],eax
  2815.     pop   eax
  2816.  
  2817.     mov   [edi+8],ax
  2818.     mov   [edi+12],bx
  2819.     shr   eax,16
  2820.     shr   ebx,16
  2821.     mov   [edi+00],ax
  2822.     mov   [edi+04],bx
  2823.  
  2824.  
  2825.     call  check_window_position
  2826.  
  2827.  
  2828.     push  ecx esi edi               ; save for window fullscreen/resize
  2829.     mov   esi,edi
  2830.     sub   edi,window_data
  2831.     shr   edi,5
  2832.     shl   edi,8
  2833.     add   edi,0x80000+0x90
  2834.     mov   ecx,4
  2835.     cld
  2836.     rep   movsd
  2837.     pop   edi esi ecx
  2838.  
  2839.     push  eax ebx ecx edx
  2840. ;;;    mov   eax, 1
  2841. ;;;    call  delay_hs
  2842.     movzx eax, word [edi+00]
  2843.     movzx ebx, word [edi+04]
  2844.     movzx ecx, word [edi+8]
  2845.     movzx edx, word [edi+12]
  2846.     add   ecx, eax
  2847.     add   edx, ebx
  2848.     call  calculatescreen
  2849.     pop   edx ecx ebx eax
  2850.  
  2851.     mov   [0xf400],byte 0           ; empty keyboard buffer
  2852.     mov   [0xf500],byte 0           ; empty button buffer
  2853.  
  2854.   newd:
  2855.     mov   [edi+31],byte 0   ; no redraw
  2856.     mov   edx,edi
  2857.  
  2858.     ret
  2859.  
  2860.  
  2861. sys_window_move:
  2862.  
  2863.         cmp  [window_move_pr],0
  2864.         je   mwrl1
  2865.  
  2866.         mov  [esp+36],dword 1         ; return queue error
  2867.  
  2868.         ret
  2869.  
  2870.      mwrl1:
  2871.  
  2872.         mov   edi,[0x3000]            ; requestor process base
  2873.         mov   [window_move_pr],edi
  2874.  
  2875.         mov   [window_move_eax],eax
  2876.         mov   [window_move_ebx],ebx
  2877.         mov   [window_move_ecx],ecx
  2878.         mov   [window_move_edx],edx
  2879.  
  2880.         mov   [esp+36],dword 0        ; return success
  2881.  
  2882.         ret
  2883.  
  2884. type_background_1:
  2885.     cmp   [0xfff0],byte 0               ; background update ?
  2886.     jz    temp_nobackgr
  2887.     mov   [0xfff0],byte 2
  2888.     call  change_task
  2889.     mov   [draw_data+32+0],dword 0
  2890.     mov   [draw_data+32+4],dword 0
  2891.     mov   eax,[0xfe00]
  2892.     mov   ebx,[0xfe04]
  2893.     mov   [draw_data+32+8],eax
  2894.     mov   [draw_data+32+12],ebx
  2895.     call  drawbackground
  2896.     mov   [0xfff0],byte 0
  2897.     mov   [0xfff4],byte 0
  2898. temp_nobackgr:
  2899.     ret
  2900.    
  2901. uglobal
  2902.   window_move_pr   dd  0x0
  2903.   window_move_eax  dd  0x0
  2904.   window_move_ebx  dd  0x0
  2905.   window_move_ecx  dd  0x0
  2906.   window_move_edx  dd  0x0
  2907. endg
  2908.  
  2909. ;ok - 100% work
  2910. ;nt - not tested
  2911. ;---------------------------------------------------------------------------------------------
  2912. ;eax
  2913. ;0 - task switch counter. Ret switch counter in eax. Block. ok.
  2914. ;1 - change task. Ret nothing. Block. ok.
  2915. ;2 - performance control
  2916. ; ebx
  2917. ; 0 - enable or disable (inversion) PCE flag on CR4 for rdmpc in user mode.
  2918. ; returned new cr4 in eax. Ret cr4 in eax. Block. ok.
  2919. ; 1 - is cache enabled. Ret cr0 in eax if enabled else zero in eax. Block. ok.
  2920. ; 2 - enable cache. Ret 1 in eax. Ret nothing. Block. ok.
  2921. ; 3 - disable cache. Ret 0 in eax. Ret nothing. Block. ok.
  2922. ;eax
  2923. ;3 - rdmsr. Counter in edx. (edx:eax) [esi:edi, edx] => [edx:esi, ecx]. Ret in ebx:eax. Block. ok.
  2924. ;4 - wrmsr. Counter in edx. (edx:eax) [esi:edi, edx] => [edx:esi, ecx]. Ret in ebx:eax. Block. ok.
  2925. ;---------------------------------------------------------------------------------------------
  2926. sys_sheduler: ;noname & halyavin
  2927.     cmp eax,0
  2928.     je shed_counter
  2929.     cmp eax,2
  2930.     je perf_control
  2931.     cmp eax,3
  2932.     je rdmsr_instr
  2933.     cmp eax,4
  2934.     je wrmsr_instr
  2935.     cmp eax,1
  2936.     jne not_supported
  2937.     call change_task ;delay,0
  2938. ret
  2939. shed_counter:
  2940.     mov eax,[context_counter]
  2941.     mov [esp+36],eax
  2942. not_supported:
  2943. ret
  2944. perf_control:
  2945.     inc eax ;now eax=3
  2946.     cmp ebx,eax