Subversion Repositories Kolibri OS

Rev

Rev 5359 | Rev 5363 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;
5154 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved.
2288 clevermous 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 ()
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
 
3383 hidnplayr 69
format binary as "mnt"
70
 
2288 clevermous 71
include 'macros.inc'
2381 hidnplayr 72
include 'struct.inc'
2288 clevermous 73
 
74
$Revision: 5360 $
75
 
76
 
77
USE_COM_IRQ     equ 1      ; make irq 3 and irq 4 available for PCI devices
3627 Serge 78
VESA_1_2_VIDEO  equ 0      ; enable vesa 1.2 bank switch functions
2288 clevermous 79
 
80
; Enabling the next line will enable serial output console
3556 hidnplayr 81
;debug_com_base  equ 0x3f8  ; 0x3f8 is com1, 0x2f8 is com2, 0x3e8 is com3, 0x2e8 is com4, no irq's are used
2288 clevermous 82
 
83
include "proc32.inc"
84
include "kglobals.inc"
85
include "lang.inc"
3539 clevermous 86
include "encoding.inc"
2288 clevermous 87
 
88
include "const.inc"
3777 yogev_ezra 89
 
90
iglobal
91
; The following variable, if equal to 1, duplicates debug output to the screen.
92
debug_direct_print db 0
93
; Start the first app (LAUNCHER) after kernel is loaded? (1=yes, 2 or 0=no)
94
launcher_start db 1
95
endg
96
 
2288 clevermous 97
max_processes    equ   255
98
tss_step         equ   (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4
99
 
100
os_stack       equ  (os_data_l-gdts)    ; GDTs
101
os_code        equ  (os_code_l-gdts)
102
graph_data     equ  (3+graph_data_l-gdts)
103
tss0           equ  (tss0_l-gdts)
104
app_code       equ  (3+app_code_l-gdts)
105
app_data       equ  (3+app_data_l-gdts)
106
app_tls        equ  (3+tls_data_l-gdts)
107
pci_code_sel   equ  (pci_code_32-gdts)
108
pci_data_sel   equ  (pci_data_32-gdts)
109
 
110
 
111
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
112
;;
113
;;   Included files:
114
;;
115
;;   Kernel16.inc
116
;;    - Booteng.inc   English text for bootup
117
;;    - Bootcode.inc  Hardware setup
118
;;    - Pci16.inc     PCI functions
119
;;
120
;;   Kernel32.inc
121
;;    - Sys32.inc     Process management
122
;;    - Shutdown.inc  Shutdown and restart
123
;;    - Fat32.inc     Read / write hd
124
;;    - Vesa12.inc    Vesa 1.2 driver
125
;;    - Vesa20.inc    Vesa 2.0 driver
126
;;    - Vga.inc       VGA driver
127
;;    - Stack.inc     Network interface
128
;;    - Mouse.inc     Mouse pointer
129
;;    - Scincode.inc  Window skinning
130
;;    - Pci32.inc     PCI functions
131
;;
132
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
133
 
134
 
135
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
136
;;                                                                      ;;
137
;;                  16 BIT ENTRY FROM BOOTSECTOR                        ;;
138
;;                                                                      ;;
139
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
140
 
141
use16
142
                  org   0x0
143
        jmp     start_of_code
144
 
3287 esevece 145
if lang eq sp
146
include "kernelsp.inc"  ; spanish kernel messages
3927 kaitz 147
else if lang eq et
148
version db    'Kolibri OS  versioon 0.7.7.0+    ',13,10,13,10,0
3287 esevece 149
else
2288 clevermous 150
version db    'Kolibri OS  version 0.7.7.0+     ',13,10,13,10,0
3287 esevece 151
end if
2288 clevermous 152
 
153
include "boot/bootstr.inc"     ; language-independent boot messages
154
include "boot/preboot.inc"
155
 
3274 esevece 156
if lang eq ge
157
include "boot/bootge.inc"     ; german system boot messages
158
else if lang eq sp
159
include "boot/bootsp.inc"     ; spanish system boot messages
2288 clevermous 160
else if lang eq ru
161
include "boot/bootru.inc"      ; russian system boot messages
162
include "boot/ru.inc"          ; Russian font
163
else if lang eq et
164
include "boot/bootet.inc"      ; estonian system boot messages
165
include "boot/et.inc"          ; Estonian font
166
else
3274 esevece 167
include "boot/booten.inc"      ; english system boot messages
2288 clevermous 168
end if
169
 
170
include "boot/bootcode.inc"    ; 16 bit system boot code
171
include "bus/pci/pci16.inc"
172
include "detect/biosdisk.inc"
173
 
174
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
175
;;                                                                      ;;
176
;;                  SWITCH TO 32 BIT PROTECTED MODE                     ;;
177
;;                                                                      ;;
178
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
179
 
180
 
181
; CR0 Flags - Protected mode and Paging
182
 
183
        mov     ecx, CR0_PE
184
 
185
; Enabling 32 bit protected mode
186
 
187
        sidt    [cs:old_ints_h]
188
 
189
        cli                             ; disable all irqs
190
        cld
191
        mov     al, 255                 ; mask all irqs
192
        out     0xa1, al
193
        out     0x21, al
194
   l.5:
195
        in      al, 0x64                ; Enable A20
196
        test    al, 2
197
        jnz     l.5
198
        mov     al, 0xD1
199
        out     0x64, al
200
   l.6:
201
        in      al, 0x64
202
        test    al, 2
203
        jnz     l.6
204
        mov     al, 0xDF
205
        out     0x60, al
206
   l.7:
207
        in      al, 0x64
208
        test    al, 2
209
        jnz     l.7
210
        mov     al, 0xFF
211
        out     0x64, al
212
 
213
        lgdt    [cs:tmp_gdt]            ; Load GDT
214
        mov     eax, cr0                ; protected mode
215
        or      eax, ecx
216
        and     eax, 10011111b *65536*256 + 0xffffff ; caching enabled
217
        mov     cr0, eax
218
        jmp     pword os_code:B32       ; jmp to enable 32 bit mode
219
 
220
align 8
221
tmp_gdt:
222
 
223
        dw     23
224
        dd     tmp_gdt+0x10000
225
        dw     0
226
 
227
        dw     0xffff
228
        dw     0x0000
229
        db     0x00
230
        dw     11011111b *256 +10011010b
231
        db     0x00
232
 
233
        dw     0xffff
234
        dw     0x0000
235
        db     0x00
236
        dw     11011111b *256 +10010010b
237
        db     0x00
238
 
239
include "data16.inc"
240
 
3627 Serge 241
if ~ lang eq sp
242
diff16 "end of bootcode",0,$+0x10000
243
end if
244
 
2288 clevermous 245
use32
246
org $+0x10000
247
 
248
align 4
249
B32:
250
        mov     ax, os_stack       ; Selector for os
251
        mov     ds, ax
252
        mov     es, ax
253
        mov     fs, ax
254
        mov     gs, ax
255
        mov     ss, ax
256
        mov     esp, 0x006CC00       ; Set stack
257
 
258
; CLEAR 0x280000 - HEAP_BASE
259
 
260
        xor     eax, eax
261
        mov     edi, CLEAN_ZONE
262
        mov     ecx, (HEAP_BASE-OS_BASE-CLEAN_ZONE) / 4
263
        cld
264
        rep stosd
265
 
266
; CLEAR KERNEL UNDEFINED GLOBALS
267
        mov     edi, endofcode-OS_BASE
268
        mov     ecx, 0x90000
269
        sub     ecx, edi
270
        shr     ecx, 2
271
        rep stosd
272
 
273
; SAVE & CLEAR 0-0xffff
274
 
275
        mov     edi, 0x1000
3732 Serge 276
        mov     ecx, 0x8000 / 4
2288 clevermous 277
        rep stosd
3732 Serge 278
        mov     edi, 0xa000
279
        mov     ecx, 0x6000 / 4
280
        rep stosd
2288 clevermous 281
 
282
        call    test_cpu
283
        bts     [cpu_caps-OS_BASE], CAPS_TSC    ;force use rdtsc
284
 
285
        call    check_acpi
286
        call    init_BIOS32
287
; MEMORY MODEL
288
        call    mem_test
289
        call    init_mem
290
        call    init_page_map
291
 
292
; ENABLE PAGING
293
 
5130 serge 294
        mov     eax, sys_proc-OS_BASE+PROC.pdt_0
2288 clevermous 295
        mov     cr3, eax
296
 
297
        mov     eax, cr0
298
        or      eax, CR0_PG+CR0_WP
299
        mov     cr0, eax
300
 
301
        lgdt    [gdts]
302
        jmp     pword os_code:high_code
303
 
304
align 4
305
bios32_entry    dd ?
306
tmp_page_tabs   dd ?
307
 
308
use16
309
org $-0x10000
310
include "boot/shutdown.inc" ; shutdown or restart
311
org $+0x10000
5033 clevermous 312
 
313
ap_init16:
314
        cli
315
        lgdt    [cs:gdts_ap-ap_init16]
316
        mov     eax, [cs:cr3_ap-ap_init16]
317
        mov     cr3, eax
318
        mov     eax, [cs:cr4_ap-ap_init16]
319
        mov     cr4, eax
320
        mov     eax, CR0_PE+CR0_PG+CR0_WP
321
        mov     cr0, eax
322
        jmp     pword os_code:ap_init_high
323
align 16
324
gdts_ap:
325
        dw     gdte-gdts-1
326
        dd     gdts
327
        dw     0
328
cr3_ap  dd     ?
329
cr4_ap  dd     ?
330
ap_init16_size = $ - ap_init16
2288 clevermous 331
use32
332
 
333
__DEBUG__ fix 1
334
__DEBUG_LEVEL__ fix 1
335
include 'init.inc'
336
 
337
org OS_BASE+$
338
 
2443 Serge 339
include 'fdo.inc'
340
 
2288 clevermous 341
align 4
342
high_code:
343
        mov     ax, os_stack
344
        mov     bx, app_data
345
        mov     cx, app_tls
346
        mov     ss, ax
347
        add     esp, OS_BASE
348
 
349
        mov     ds, bx
350
        mov     es, bx
351
        mov     fs, cx
352
        mov     gs, bx
353
 
5360 serge 354
        xor     eax, eax
355
        mov     ebx, 0xFFFFF000+PG_SHARED+PG_NOCACHE+PG_UWR
356
        bt      [cpu_caps], CAPS_PAT
357
        setc    al
358
        shl     eax, 7
359
        or      ebx, eax
360
 
5359 serge 361
        mov     eax, PG_GLOBAL
2288 clevermous 362
        bt      [cpu_caps], CAPS_PGE
363
        jnc     @F
364
 
5359 serge 365
        or      [sys_proc+PROC.pdt_0+(OS_BASE shr 20)], eax
5360 serge 366
        or      ebx, eax
2288 clevermous 367
 
5360 serge 368
        mov     eax, cr4
369
        or      eax, CR4_PGE
370
        mov     cr4, eax
2288 clevermous 371
@@:
5360 serge 372
        mov     [pte_valid_mask], ebx
373
 
2288 clevermous 374
        xor     eax, eax
5130 serge 375
        mov     dword [sys_proc+PROC.pdt_0], eax
376
        mov     dword [sys_proc+PROC.pdt_0+4], eax
2288 clevermous 377
 
378
        mov     eax, cr3
379
        mov     cr3, eax          ; flush TLB
380
 
381
        mov     ecx, pg_data.mutex
382
        call    mutex_init
383
 
384
        mov     ecx, disk_list_mutex
385
        call    mutex_init
386
 
2601 clevermous 387
        mov     ecx, keyboard_list_mutex
388
        call    mutex_init
389
 
2489 mario79 390
        mov     ecx, unpack_mutex
391
        call    mutex_init
392
 
3534 clevermous 393
        mov     ecx, application_table_mutex
394
        call    mutex_init
395
 
3742 clevermous 396
        mov     ecx, ide_mutex
397
        call    mutex_init
398
        mov     ecx, ide_channel1_mutex
399
        call    mutex_init
400
        mov     ecx, ide_channel2_mutex
401
        call    mutex_init
4700 mario79 402
        mov     ecx, ide_channel3_mutex
403
        call    mutex_init
404
        mov     ecx, ide_channel4_mutex
405
        call    mutex_init
406
        mov     ecx, ide_channel5_mutex
407
        call    mutex_init
408
        mov     ecx, ide_channel6_mutex
409
        call    mutex_init
3774 mario79 410
;-----------------------------------------------------------------------------
2288 clevermous 411
; SAVE REAL MODE VARIABLES
3774 mario79 412
;-----------------------------------------------------------------------------
2288 clevermous 413
; --------------- APM ---------------------
414
 
415
; init selectors
3732 Serge 416
        mov     ebx, [BOOT_VARS+BOOT_APM_ENTRY]        ; offset of APM entry point
417
        movzx   eax, word [BOOT_VARS+BOOT_APM_CODE_32] ; real-mode segment base address of
2288 clevermous 418
                                                                                ; protected-mode 32-bit code segment
3732 Serge 419
        movzx   ecx, word [BOOT_VARS+BOOT_APM_CODE_16]; real-mode segment base address of
2288 clevermous 420
                                                                                ; protected-mode 16-bit code segment
3732 Serge 421
        movzx   edx, word [BOOT_VARS+BOOT_APM_DATA_16]; real-mode segment base address of
2288 clevermous 422
                                                                                ; protected-mode 16-bit data segment
423
 
424
        shl     eax, 4
425
        mov     [dword apm_code_32 + 2], ax
426
        shr     eax, 16
427
        mov     [dword apm_code_32 + 4], al
428
 
429
        shl     ecx, 4
430
        mov     [dword apm_code_16 + 2], cx
431
        shr     ecx, 16
432
        mov     [dword apm_code_16 + 4], cl
433
 
434
        shl     edx, 4
435
        mov     [dword apm_data_16 + 2], dx
436
        shr     edx, 16
437
        mov     [dword apm_data_16 + 4], dl
438
 
439
        mov     dword[apm_entry], ebx
440
        mov     word [apm_entry + 4], apm_code_32 - gdts
441
 
3732 Serge 442
        mov     eax, [BOOT_VARS + BOOT_APM_VERSION] ; version & flags
2288 clevermous 443
        mov     [apm_vf], eax
444
; -----------------------------------------
3732 Serge 445
        mov     al, [BOOT_VARS+BOOT_DMA]            ; DMA access
2288 clevermous 446
        mov     [allow_dma_access], al
3732 Serge 447
        movzx   eax, byte [BOOT_VARS+BOOT_BPP]      ; bpp
5154 hidnplayr 448
        mov     [_display.bits_per_pixel], eax
2288 clevermous 449
        mov     [_display.vrefresh], 60
3777 yogev_ezra 450
        mov     al, [BOOT_VARS+BOOT_DEBUG_PRINT]    ; If nonzero, duplicates debug output to the screen
451
        mov     [debug_direct_print], al
452
        mov     al, [BOOT_VARS+BOOT_LAUNCHER_START] ; Start the first app (LAUNCHER) after kernel is loaded?
453
        mov     [launcher_start], al
3732 Serge 454
        movzx   eax, word [BOOT_VARS+BOOT_X_RES]; X max
2288 clevermous 455
        mov     [_display.width], eax
2654 mario79 456
        mov     [display_width_standard], eax
2288 clevermous 457
        dec     eax
458
        mov     [screen_workarea.right], eax
3732 Serge 459
        movzx   eax, word [BOOT_VARS+BOOT_Y_RES]; Y max
2288 clevermous 460
        mov     [_display.height], eax
2654 mario79 461
        mov     [display_height_standard], eax
2288 clevermous 462
        dec     eax
463
        mov     [screen_workarea.bottom], eax
3732 Serge 464
        movzx   eax, word [BOOT_VARS+BOOT_VESA_MODE] ; screen mode
3606 Serge 465
        mov     dword [SCR_MODE], eax
466
;        mov     eax, [BOOT_VAR+0x9014]             ; Vesa 1.2 bnk sw add
2407 mario79 467
;        mov     [BANK_SWITCH], eax
3606 Serge 468
        mov     eax, 640 *4                         ; Bytes PerScanLine
469
        cmp     [SCR_MODE], word 0x13               ; 320x200
2288 clevermous 470
        je      @f
3606 Serge 471
        cmp     [SCR_MODE], word 0x12               ; VGA 640x480
2288 clevermous 472
        je      @f
3732 Serge 473
        movzx   eax, word[BOOT_VARS+BOOT_PITCH]      ; for other modes
3606 Serge 474
@@:
5351 serge 475
        mov     [_display.lfb_pitch], eax
2288 clevermous 476
        mov     eax, [_display.width]
477
        mul     [_display.height]
5351 serge 478
        mov     [_display.win_map_size], eax
2288 clevermous 479
 
2438 mario79 480
        call    calculate_fast_getting_offset_for_WinMapAddress
2480 mario79 481
; for Qemu or non standart video cards
3481 Serge 482
; Unfortunately [BytesPerScanLine] does not always
2480 mario79 483
;                             equal to [_display.width] * [ScreenBPP] / 8
484
        call    calculate_fast_getting_offset_for_LFB
2438 mario79 485
 
3732 Serge 486
        mov     esi, BOOT_VARS+0x9080
2288 clevermous 487
        movzx   ecx, byte [esi-1]
488
        mov     [NumBiosDisks], ecx
489
        mov     edi, BiosDisksData
490
        rep movsd
491
 
5154 hidnplayr 492
setvideomode:
2288 clevermous 493
 
3732 Serge 494
        mov     eax, [BOOT_VARS+BOOT_LFB]
2288 clevermous 495
        mov     [LFBAddress], eax
496
 
5154 hidnplayr 497
        cmp     word [SCR_MODE], 0x0012                 ; VGA (640x480 16 colors)
498
        je      .vga
499
        cmp     word [SCR_MODE], 0x0013                 ; MCGA (320*200 256 colors)
500
        je      .32bpp
501
        cmp     byte [_display.bits_per_pixel], 32
502
        je      .32bpp
503
        cmp     byte [_display.bits_per_pixel], 24
504
        je      .24bpp
505
        cmp     byte [_display.bits_per_pixel], 16
506
        je      .16bpp
507
;        cmp     byte [_display.bits_per_pixel], 15
508
;        je      .15bpp
2436 mario79 509
 
5154 hidnplayr 510
  .vga:
511
        mov     [PUTPIXEL], VGA_putpixel
512
        mov     [GETPIXEL], Vesa20_getpixel32           ; Conversion buffer is 32 bpp
513
        mov     [_display.bytes_per_pixel], 4           ; Conversion buffer is 32 bpp
514
        jmp     .finish
2288 clevermous 515
 
5154 hidnplayr 516
;  .15bpp:
517
;        mov     [PUTPIXEL], Vesa20_putpixel15
518
;        mov     [GETPIXEL], Vesa20_getpixel15
519
;        mov     [_display.bytes_per_pixel], 2
520
;        jmp     .finish
521
 
522
  .16bpp:
523
        mov     [PUTPIXEL], Vesa20_putpixel16
524
        mov     [GETPIXEL], Vesa20_getpixel16
525
        mov     [_display.bytes_per_pixel], 2
526
        jmp     .finish
527
 
528
  .24bpp:
529
        mov     [PUTPIXEL], Vesa20_putpixel24
530
        mov     [GETPIXEL], Vesa20_getpixel24
531
        mov     [_display.bytes_per_pixel], 3
532
        jmp     .finish
533
 
534
  .32bpp:
535
        mov     [PUTPIXEL], Vesa20_putpixel32
536
        mov     [GETPIXEL], Vesa20_getpixel32
537
        mov     [_display.bytes_per_pixel], 4
538
;        jmp     .finish
539
 
540
  .finish:
541
        mov     [MOUSE_PICTURE], mousepointer
2642 mario79 542
        mov     [_display.check_mouse], check_mouse_area_for_putpixel
543
        mov     [_display.check_m_pixel], check_mouse_area_for_getpixel
544
 
2288 clevermous 545
; -------- Fast System Call init ----------
546
; Intel SYSENTER/SYSEXIT (AMD CPU support it too)
547
        bt      [cpu_caps], CAPS_SEP
548
        jnc     .SEnP  ; SysEnter not Present
549
        xor     edx, edx
550
        mov     ecx, MSR_SYSENTER_CS
551
        mov     eax, os_code
552
        wrmsr
553
        mov     ecx, MSR_SYSENTER_ESP
554
;           mov eax, sysenter_stack ; Check it
555
        xor     eax, eax
556
        wrmsr
557
        mov     ecx, MSR_SYSENTER_EIP
558
        mov     eax, sysenter_entry
559
        wrmsr
560
.SEnP:
561
; AMD SYSCALL/SYSRET
562
        cmp     byte[cpu_vendor], 'A'
563
        jne     .noSYSCALL
564
        mov     eax, 0x80000001
565
        cpuid
566
        test    edx, 0x800  ; bit_11 - SYSCALL/SYSRET support
567
        jz      .noSYSCALL
568
        mov     ecx, MSR_AMD_EFER
569
        rdmsr
570
        or      eax, 1 ; bit_0 - System Call Extension (SCE)
571
        wrmsr
572
 
573
        ; !!!! It`s dirty hack, fix it !!!
574
        ; Bits of EDX :
3539 clevermous 575
        ; Bit 31–16 During the SYSRET instruction, this field is copied into the CS register
2288 clevermous 576
        ;  and the contents of this field, plus 8, are copied into the SS register.
3539 clevermous 577
        ; Bit 15–0 During the SYSCALL instruction, this field is copied into the CS register
2288 clevermous 578
        ;  and the contents of this field, plus 8, are copied into the SS register.
579
 
580
        ; mov   edx, (os_code + 16) * 65536 + os_code
581
        mov     edx, 0x1B0008
582
 
583
        mov     eax, syscall_entry
584
        mov     ecx, MSR_AMD_STAR
585
        wrmsr
586
.noSYSCALL:
587
; -----------------------------------------
588
        stdcall alloc_page
5356 serge 589
        stdcall map_page, tss-0xF80, eax, PG_SWR
2288 clevermous 590
        stdcall alloc_page
5356 serge 591
        stdcall map_page, tss+0x80, eax, PG_SWR
2288 clevermous 592
        stdcall alloc_page
5356 serge 593
        stdcall map_page, tss+0x1080, eax, PG_SWR
2288 clevermous 594
 
595
; LOAD IDT
596
 
597
        call    build_interrupt_table ;lidt is executed
598
          ;lidt [idtreg]
599
 
600
        call    init_kernel_heap
3534 clevermous 601
        stdcall kernel_alloc, (RING0_STACK_SIZE+512) * 2
2288 clevermous 602
        mov     [os_stack_seg], eax
603
 
604
        lea     esp, [eax+RING0_STACK_SIZE]
605
 
606
        mov     [tss._ss0], os_stack
607
        mov     [tss._esp0], esp
608
        mov     [tss._esp], esp
609
        mov     [tss._cs], os_code
610
        mov     [tss._ss], os_stack
611
        mov     [tss._ds], app_data
612
        mov     [tss._es], app_data
613
        mov     [tss._fs], app_data
614
        mov     [tss._gs], app_data
615
        mov     [tss._io], 128
616
;Add IO access table - bit array of permitted ports
617
        mov     edi, tss._io_map_0
618
        xor     eax, eax
619
        not     eax
620
        mov     ecx, 8192/4
621
        rep stosd                    ; access to 4096*8=65536 ports
622
 
623
        mov     ax, tss0
624
        ltr     ax
625
 
2991 Serge 626
        mov     [LFBSize], 0xC00000
2288 clevermous 627
        call    init_LFB
628
        call    init_fpu
629
        call    init_malloc
630
 
5130 serge 631
        stdcall alloc_kernel_space, 0x50000         ; FIXME check size
2288 clevermous 632
        mov     [default_io_map], eax
633
 
634
        add     eax, 0x2000
635
        mov     [ipc_tmp], eax
636
        mov     ebx, 0x1000
637
 
638
        add     eax, 0x40000
639
        mov     [proc_mem_map], eax
640
 
641
        add     eax, 0x8000
642
        mov     [proc_mem_pdir], eax
643
 
644
        add     eax, ebx
645
        mov     [proc_mem_tab], eax
646
 
647
        add     eax, ebx
648
        mov     [tmp_task_ptab], eax
649
 
650
        add     eax, ebx
651
        mov     [ipc_pdir], eax
652
 
653
        add     eax, ebx
654
        mov     [ipc_ptab], eax
655
 
656
        stdcall kernel_alloc, (unpack.LZMA_BASE_SIZE+(unpack.LZMA_LIT_SIZE shl \
657
                (unpack.lc+unpack.lp)))*4
658
 
659
        mov     [unpack.p], eax
660
 
661
        call    init_events
2384 hidnplayr 662
        mov     eax, srv.fd-SRV.fd
2288 clevermous 663
        mov     [srv.fd], eax
664
        mov     [srv.bk], eax
665
 
666
;Set base of graphic segment to linear address of LFB
667
        mov     eax, [LFBAddress]         ; set for gs
668
        mov     [graph_data_l+2], ax
669
        shr     eax, 16
670
        mov     [graph_data_l+4], al
671
        mov     [graph_data_l+7], ah
672
 
5351 serge 673
        stdcall kernel_alloc, [_display.win_map_size]
674
        mov     [_display.win_map], eax
2288 clevermous 675
 
676
        xor     eax, eax
677
        inc     eax
678
 
679
; set background
680
 
681
        mov     [BgrDrawMode], eax
682
        mov     [BgrDataWidth], eax
683
        mov     [BgrDataHeight], eax
684
        mov     [mem_BACKGROUND], 4
685
        mov     [img_background], static_background_data
686
 
4199 mario79 687
; set clipboard
688
 
689
        xor     eax, eax
690
        mov     [clipboard_slots], eax
691
        mov     [clipboard_write_lock], eax
692
        stdcall kernel_alloc, 4096
693
        test    eax, eax
694
        jnz     @f
695
 
696
        dec     eax
697
@@:
698
        mov     [clipboard_main_list], eax
699
 
3296 clevermous 700
; SET UP OS TASK
701
 
702
        mov     esi, boot_setostask
703
        call    boot_log
704
 
5130 serge 705
        mov     edi, sys_proc
706
        list_init edi
707
        lea     ecx, [edi+PROC.thr_list]
708
        list_init ecx
709
        mov     [edi+PROC.pdt_0_phys], sys_proc-OS_BASE+PROC.pdt_0
710
 
711
        mov     eax, -1
712
        mov     edi, thr_slot_map+4
713
        mov     [edi-4], dword 0xFFFFFFF8
714
        stosd
715
        stosd
716
        stosd
717
        stosd
718
        stosd
719
        stosd
720
        stosd
721
 
722
        mov     [current_process], sys_proc
723
 
724
        mov     edx, SLOT_BASE+256*1
3534 clevermous 725
        mov     ebx, [os_stack_seg]
726
        add     ebx, 0x2000
727
        call    setup_os_slot
728
        mov     dword [edx], 'IDLE'
729
        sub     [edx+APPDATA.saved_esp], 4
730
        mov     eax, [edx+APPDATA.saved_esp]
731
        mov     dword [eax], idle_thread
732
        mov     ecx, IDLE_PRIORITY
733
        call    scheduler_add_thread
3296 clevermous 734
 
3534 clevermous 735
        mov     edx, SLOT_BASE+256*2
736
        mov     ebx, [os_stack_seg]
737
        call    setup_os_slot
738
        mov     dword [edx], 'OS'
739
        xor     ecx, ecx
740
        call    scheduler_add_thread
3296 clevermous 741
 
3534 clevermous 742
        mov     dword [CURRENT_TASK], 2
743
        mov     dword [TASK_COUNT], 2
744
        mov     dword [current_slot], SLOT_BASE + 256*2
745
        mov     dword [TASK_BASE], CURRENT_TASK + 32*2
3296 clevermous 746
 
5033 clevermous 747
; Move other CPUs to deep sleep, if it is useful
748
uglobal
749
use_mwait_for_idle db 0
750
endg
751
        cmp     [cpu_vendor+8], 'ntel'
752
        jnz     .no_wake_cpus
753
        bt      [cpu_caps+4], CAPS_MONITOR-32
754
        jnc     .no_wake_cpus
755
        dbgstr 'using mwait for idle loop'
756
        inc     [use_mwait_for_idle]
757
        mov     ebx, [cpu_count]
758
        cmp     ebx, 1
759
        jbe     .no_wake_cpus
760
        call    create_trampoline_pgmap
761
        mov     [cr3_ap+OS_BASE], eax
762
        mov     eax, cr4
763
        mov     [cr4_ap+OS_BASE], eax
764
        mov     esi, OS_BASE + ap_init16
765
        mov     edi, OS_BASE + 8000h
766
        mov     ecx, (ap_init16_size + 3) / 4
767
        rep movsd
5359 serge 768
        stdcall map_io_mem, [acpi_lapic_base], 0x1000, PG_GLOBAL+PG_NOCACHE+PG_SWR
5033 clevermous 769
        mov     [LAPIC_BASE], eax
770
        lea     edi, [eax+300h]
771
        mov     esi, smpt+4
772
        dec     ebx
773
.wake_cpus_loop:
774
        lodsd
5049 clevermous 775
        push    esi
776
        xor     esi, esi
777
        inc     esi
5033 clevermous 778
        shl     eax, 24
779
        mov     [edi+10h], eax
780
; assert INIT IPI
781
        mov     dword [edi], 0C500h
5049 clevermous 782
        call    delay_ms
5033 clevermous 783
@@:
784
        test    dword [edi], 1000h
785
        jnz     @b
786
; deassert INIT IPI
787
        mov     dword [edi], 8500h
5049 clevermous 788
        call    delay_ms
5033 clevermous 789
@@:
790
        test    dword [edi], 1000h
791
        jnz     @b
792
; send STARTUP IPI
793
        mov     dword [edi], 600h + (8000h shr 12)
5049 clevermous 794
        call    delay_ms
5033 clevermous 795
@@:
796
        test    dword [edi], 1000h
797
        jnz     @b
5049 clevermous 798
        pop     esi
5033 clevermous 799
        dec     ebx
800
        jnz     .wake_cpus_loop
801
        mov     eax, [cpu_count]
802
        dec     eax
803
@@:
804
        cmp     [ap_initialized], eax
805
        jnz     @b
806
        mov     eax, [cr3_ap+OS_BASE]
807
        call    free_page
808
.no_wake_cpus:
2288 clevermous 809
 
5033 clevermous 810
 
2288 clevermous 811
; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f
2642 mario79 812
        mov     esi, boot_initirq
813
        call    boot_log
814
        call    init_irqs
2288 clevermous 815
 
2642 mario79 816
        mov     esi, boot_picinit
817
        call    boot_log
2288 clevermous 818
        call    PIC_init
819
 
2642 mario79 820
        mov     esi, boot_v86machine
821
        call    boot_log
2288 clevermous 822
; Initialize system V86 machine
823
        call    init_sys_v86
824
 
2642 mario79 825
        mov     esi, boot_inittimer
826
        call    boot_log
2288 clevermous 827
; Initialize system timer (IRQ0)
828
        call    PIT_init
829
 
4273 clevermous 830
; Register ramdisk file system
4772 mario79 831
        cmp     [boot_dev+OS_BASE+0x10000], 1
832
        je      @f
3613 clevermous 833
 
4772 mario79 834
        call    register_ramdisk
835
;--------------------------------------
836
@@:
2642 mario79 837
        mov     esi, boot_initapic
838
        call    boot_log
2288 clevermous 839
; Try to Initialize APIC
840
        call    APIC_init
841
 
2642 mario79 842
        mov     esi, boot_enableirq
843
        call    boot_log
3785 mario79 844
; Enable timer IRQ (IRQ0) and co-processor IRQ (IRQ13)
2288 clevermous 845
; they are used: when partitions are scanned, hd_read relies on timer
846
        call    unmask_timer
847
        stdcall enable_irq, 2               ; @#$%! PIC
848
        stdcall enable_irq, 13              ; co-processor
4741 hidnplayr 849
 
850
; Setup serial output console (if enabled)
851
if defined debug_com_base
852
 
853
        ; reserve port so nobody else will use it
854
        xor     ebx, ebx
855
        mov     ecx, debug_com_base
856
        mov     edx, debug_com_base+7
857
        call    r_f_port_area
858
 
859
        ; enable Divisor latch
860
        mov     dx, debug_com_base+3
861
        mov     al, 1 shl 7
862
        out     dx, al
863
 
864
        ; Set speed to 115200 baud (max speed)
865
        mov     dx, debug_com_base
866
        mov     al, 0x01
867
        out     dx, al
868
 
869
        mov     dx, debug_com_base+1
870
        mov     al, 0x00
871
        out     dx, al
872
 
873
        ; No parity, 8bits words, one stop bit, dlab bit back to 0
874
        mov     dx, debug_com_base+3
875
        mov     al, 3
876
        out     dx, al
877
 
878
        ; disable interrupts
879
        mov     dx, debug_com_base+1
880
        mov     al, 0
881
        out     dx, al
882
 
883
        ; clear +  enable fifo (64 bits)
884
        mov     dx, debug_com_base+2
885
        mov     al, 0x7 + 1 shl 5
886
        out     dx, al
887
 
888
end if
889
 
890
 
4575 mario79 891
;-----------------------------------------------------------------------------
892
; show SVN version of kernel on the message board
893
;-----------------------------------------------------------------------------
894
        mov     eax, [version_inf.rev]
895
        DEBUGF  1, "K : kernel SVN r%d\n", eax
896
;-----------------------------------------------------------------------------
897
; show CPU count on the message board
898
;-----------------------------------------------------------------------------
899
        mov     eax, [cpu_count]
900
        test    eax, eax
901
        jnz     @F
902
        mov     al, 1                             ; at least one CPU
903
@@:
904
        DEBUGF  1, "K : %d CPU detected\n", eax
905
;-----------------------------------------------------------------------------
906
; detect Floppy drives
907
;-----------------------------------------------------------------------------
908
        mov     esi, boot_detectfloppy
909
        call    boot_log
910
include 'detect/dev_fd.inc'
911
;-----------------------------------------------------------------------------
4624 mario79 912
; create pci-devices list
4575 mario79 913
;-----------------------------------------------------------------------------
4624 mario79 914
        mov     [pci_access_enabled], 1
915
        call    pci_enum
3762 mario79 916
;-----------------------------------------------------------------------------
4624 mario79 917
; initialisation IDE ATA code
4575 mario79 918
;-----------------------------------------------------------------------------
4624 mario79 919
include 'detect/init_ata.inc'
4575 mario79 920
;-----------------------------------------------------------------------------
2288 clevermous 921
if 0
922
        mov     ax, [OS_BASE+0x10000+bx_from_load]
923
        cmp     ax, 'r1'; if using not ram disk, then load librares and parameters {SPraid.simba}
924
        je      no_lib_load
2642 mario79 925
 
926
        mov     esi, boot_loadlibs
927
        call    boot_log
2288 clevermous 928
; LOADING LIBRARES
929
        stdcall dll.Load, @IMPORT           ; loading librares for kernel (.obj files)
930
        call    load_file_parse_table       ; prepare file parse table
931
        call    set_kernel_conf             ; configure devices and gui
932
no_lib_load:
933
end if
934
 
935
; Display APIC status
936
        mov     esi, boot_APIC_found
937
        cmp     [irq_mode], IRQ_APIC
938
        je      @f
939
        mov     esi, boot_APIC_nfound
940
@@:
2642 mario79 941
        call    boot_log
2288 clevermous 942
 
943
; PRINT AMOUNT OF MEMORY
944
        mov     esi, boot_memdetect
945
        call    boot_log
946
 
947
        movzx   ecx, word [boot_y]
948
        if lang eq ru
949
        or      ecx, (10+30*6) shl 16
3274 esevece 950
        else if lang eq sp
951
        or      ecx, (10+33*6) shl 16
952
        else
2288 clevermous 953
        or      ecx, (10+29*6) shl 16
3274 esevece 954
        end if
2288 clevermous 955
        sub     ecx, 10
956
        mov     edx, 0xFFFFFF
957
        mov     ebx, [MEM_AMOUNT]
958
        shr     ebx, 20
959
        xor     edi, edi
960
        mov     eax, 0x00040000
961
        inc     edi
962
        call    display_number_force
963
 
964
; BUILD SCHEDULER
965
 
2642 mario79 966
;        call    build_scheduler; sys32.inc
2288 clevermous 967
 
2642 mario79 968
;        mov     esi, boot_devices
969
;        call    boot_log
2288 clevermous 970
 
4578 clevermous 971
        call    clear_pci_ide_interrupts
4575 mario79 972
 
4297 yogev_ezra 973
include "detect/vortex86.inc"                     ; Vortex86 SoC detection code
974
 
5039 clevermous 975
        stdcall load_pe_driver, szVidintel, 0
3508 clevermous 976
 
3520 clevermous 977
        call    usb_init
978
 
2288 clevermous 979
; SET PRELIMINARY WINDOW STACK AND POSITIONS
980
 
981
        mov     esi, boot_windefs
982
        call    boot_log
983
        call    set_window_defaults
984
 
985
; SET BACKGROUND DEFAULTS
986
 
987
        mov     esi, boot_bgr
988
        call    boot_log
989
        call    init_background
990
        call    calculatebackground
991
 
992
; RESERVE SYSTEM IRQ'S JA PORT'S
993
 
994
        mov     esi, boot_resirqports
995
        call    boot_log
996
        call    reserve_irqs_ports
997
 
998
        call    init_display
999
        mov     eax, [def_cursor]
1000
        mov     [SLOT_BASE+APPDATA.cursor+256], eax
3534 clevermous 1001
        mov     [SLOT_BASE+APPDATA.cursor+256*2], eax
2288 clevermous 1002
 
3501 Serge 1003
; PRINT CPU FREQUENCY
2288 clevermous 1004
 
3501 Serge 1005
        mov     esi, boot_cpufreq
2288 clevermous 1006
        call    boot_log
3501 Serge 1007
 
1008
        cli                         ;FIXME check IF
1009
        rdtsc
2288 clevermous 1010
        mov     ecx, eax
1011
        mov     esi, 250            ; wait 1/4 a second
1012
        call    delay_ms
3501 Serge 1013
        rdtsc
5031 clevermous 1014
        sti
3501 Serge 1015
 
2288 clevermous 1016
        sub     eax, ecx
3481 Serge 1017
        xor     edx, edx
1018
        shld    edx, eax, 2
2288 clevermous 1019
        shl     eax, 2
3481 Serge 1020
        mov     dword [cpu_freq], eax
1021
        mov     dword [cpu_freq+4], edx
3502 Serge 1022
        mov     ebx, 1000000
1023
        div     ebx
3501 Serge 1024
        mov     ebx, eax
2288 clevermous 1025
 
1026
        movzx   ecx, word [boot_y]
1027
        if lang eq ru
3501 Serge 1028
        add     ecx, (10+19*6) shl 16 - 10
3274 esevece 1029
        else if lang eq sp
3501 Serge 1030
        add     ecx, (10+25*6) shl 16 - 10
3274 esevece 1031
        else
3501 Serge 1032
        add     ecx, (10+17*6) shl 16 - 10
3274 esevece 1033
        end if
3501 Serge 1034
 
2288 clevermous 1035
        mov     edx, 0xFFFFFF
1036
        xor     edi, edi
1037
        mov     eax, 0x00040000
1038
        inc     edi
1039
        call    display_number_force
1040
 
1041
; SET VARIABLES
1042
 
1043
        call    set_variables
1044
 
1045
; STACK AND FDC
1046
 
1047
        call    stack_init
1048
        call    fdc_init
1049
 
1050
; PALETTE FOR 320x200 and 640x480 16 col
1051
 
1052
        cmp     [SCR_MODE], word 0x12
1053
        jne     no_pal_vga
1054
        mov     esi, boot_pal_vga
1055
        call    boot_log
1056
        call    paletteVGA
1057
      no_pal_vga:
1058
 
1059
        cmp     [SCR_MODE], word 0x13
1060
        jne     no_pal_ega
1061
        mov     esi, boot_pal_ega
1062
        call    boot_log
1063
        call    palette320x200
1064
      no_pal_ega:
1065
 
1066
; LOAD DEFAULT SKIN
1067
 
1068
        call    load_default_skin
1069
 
1070
;protect io permission map
1071
 
1072
        mov     esi, [default_io_map]
5356 serge 1073
        stdcall map_page, esi, [SLOT_BASE+256+APPDATA.io_map], PG_READ
2288 clevermous 1074
        add     esi, 0x1000
5356 serge 1075
        stdcall map_page, esi, [SLOT_BASE+256+APPDATA.io_map+4], PG_READ
2288 clevermous 1076
 
1077
        stdcall map_page, tss._io_map_0, \
5356 serge 1078
                [SLOT_BASE+256+APPDATA.io_map], PG_READ
2288 clevermous 1079
        stdcall map_page, tss._io_map_1, \
5356 serge 1080
                [SLOT_BASE+256+APPDATA.io_map+4], PG_READ
2288 clevermous 1081
 
1082
; SET KEYBOARD PARAMETERS
1083
        mov     al, 0xf6       ; reset keyboard, scan enabled
5012 clevermous 1084
        call    kb_write_wait_ack
2601 clevermous 1085
        test    ah, ah
1086
        jnz     .no_keyboard
2288 clevermous 1087
 
2601 clevermous 1088
iglobal
1089
align 4
1090
ps2_keyboard_functions:
1091
        dd      .end - $
1092
        dd      0       ; no close
1093
        dd      ps2_set_lights
1094
.end:
1095
endg
1096
        stdcall register_keyboard, ps2_keyboard_functions, 0
2288 clevermous 1097
       ; mov   al, 0xED       ; Keyboard LEDs - only for testing!
5012 clevermous 1098
       ; call  kb_write_wait_ack
2288 clevermous 1099
       ; mov   al, 111b
5012 clevermous 1100
       ; call  kb_write_wait_ack
2288 clevermous 1101
 
1102
        mov     al, 0xF3     ; set repeat rate & delay
5012 clevermous 1103
        call    kb_write_wait_ack
2288 clevermous 1104
        mov     al, 0; 30 250 ;00100010b ; 24 500  ;00100100b  ; 20 500
5012 clevermous 1105
        call    kb_write_wait_ack
2288 clevermous 1106
     ;// mike.dld [
1107
        call    set_lights
1108
     ;// mike.dld ]
1109
        stdcall attach_int_handler, 1, irq1, 0
4734 mario79 1110
        DEBUGF  1, "K : IRQ1 return code %x\n", eax
2601 clevermous 1111
.no_keyboard:
2288 clevermous 1112
 
4553 hidnplayr 1113
; Load PS/2 mouse driver
2288 clevermous 1114
 
5044 clevermous 1115
        stdcall load_pe_driver, szPS2MDriver, 0
2288 clevermous 1116
 
1117
        mov     esi, boot_setmouse
1118
        call    boot_log
1119
        call    setmouse
1120
 
5031 clevermous 1121
; LOAD FIRST APPLICATION
1122
        cmp     byte [launcher_start], 1        ; Check if starting LAUNCHER is selected on blue screen (1 = yes)
1123
        jnz     first_app_found
1124
 
1125
        cli
1126
        mov     ebp, firstapp
1127
        call    fs_execute_from_sysdir
1128
        test    eax, eax
1129
        jns     first_app_found
1130
 
1131
        mov     esi, boot_failed
1132
        call    boot_log
1133
 
1134
        mov     eax, 0xDEADBEEF      ; otherwise halt
1135
        hlt
1136
 
1137
first_app_found:
1138
 
2288 clevermous 1139
; START MULTITASKING
1140
 
1141
; A 'All set - press ESC to start' messages if need
1142
if preboot_blogesc
1143
        mov     esi, boot_tasking
1144
        call    boot_log
1145
.bll1:
1146
        in      al, 0x60        ; wait for ESC key press
1147
        cmp     al, 129
1148
        jne     .bll1
1149
end if
1150
 
1151
        mov     [timer_ticks_enable], 1         ; for cd driver
1152
 
1153
        sti
4734 mario79 1154
 
4608 clevermous 1155
        call    mtrr_validate
1156
 
2288 clevermous 1157
        jmp     osloop
1158
 
1159
 
1160
        ; Fly :)
1161
 
5033 clevermous 1162
uglobal
1163
align 4
1164
ap_initialized  dd      0
1165
endg
1166
 
1167
ap_init_high:
1168
        mov     ax, os_stack
1169
        mov     bx, app_data
1170
        mov     cx, app_tls
1171
        mov     ss, ax
1172
        mov     ds, bx
1173
        mov     es, bx
1174
        mov     fs, cx
1175
        mov     gs, bx
1176
        xor     esp, esp
5130 serge 1177
        mov     eax, sys_proc-OS_BASE+PROC.pdt_0
5033 clevermous 1178
        mov     cr3, eax
1179
        lock inc [ap_initialized]
1180
        jmp     idle_loop
1181
 
1182
 
2288 clevermous 1183
include 'unpacker.inc'
1184
 
1185
align 4
1186
boot_log:
1187
        pushad
1188
 
1189
        mov     ebx, 10*65536
1190
        mov     bx, word [boot_y]
1191
        add     [boot_y], dword 10
1192
        mov     ecx, 0x80ffffff; ASCIIZ string with white color
1193
        xor     edi, edi
1194
        mov     edx, esi
1195
        inc     edi
1196
        call    dtext
1197
 
1198
        mov     [novesachecksum], 1000
1199
        call    checkVga_N13
1200
 
1201
        popad
1202
 
1203
        ret
1204
 
3534 clevermous 1205
; in: edx -> APPDATA for OS/IDLE slot
1206
; in: ebx = stack base
1207
proc setup_os_slot
1208
        xor     eax, eax
1209
        mov     ecx, 256/4
1210
        mov     edi, edx
1211
        rep stosd
1212
 
3535 clevermous 1213
        mov     eax, tss+0x80
1214
        call    get_pg_addr
1215
        inc     eax
1216
        mov     [edx+APPDATA.io_map], eax
1217
        mov     eax, tss+0x1080
1218
        call    get_pg_addr
1219
        inc     eax
1220
        mov     [edx+APPDATA.io_map+4], eax
1221
 
3534 clevermous 1222
        mov     dword [edx+APPDATA.pl0_stack], ebx
1223
        lea     edi, [ebx+0x2000-512]
1224
        mov     dword [edx+APPDATA.fpu_state], edi
1225
        mov     dword [edx+APPDATA.saved_esp0], edi
1226
        mov     dword [edx+APPDATA.saved_esp], edi
1227
        mov     dword [edx+APPDATA.terminate_protection], 1 ; make unkillable
1228
 
1229
        mov     esi, fpu_data
1230
        mov     ecx, 512/4
1231
        cld
1232
        rep movsd
1233
 
1234
        lea     eax, [edx+APP_OBJ_OFFSET]
1235
        mov     dword [edx+APPDATA.fd_obj], eax
1236
        mov     dword [edx+APPDATA.bk_obj], eax
1237
 
1238
        mov     dword [edx+APPDATA.cur_dir], sysdir_path
1239
 
5130 serge 1240
        mov     [edx + APPDATA.process], sys_proc
3534 clevermous 1241
 
5130 serge 1242
        lea     ebx, [edx+APPDATA.list]
1243
        lea     ecx, [sys_proc+PROC.thr_list]
1244
        list_add_tail ebx, ecx
1245
 
3534 clevermous 1246
        mov     eax, edx
1247
        shr     eax, 3
1248
        add     eax, CURRENT_TASK - (SLOT_BASE shr 3)
1249
        mov     [eax+TASKDATA.wnd_number], dh
1250
        mov     byte [eax+TASKDATA.pid], dh
1251
 
1252
        ret
1253
endp
1254
 
2288 clevermous 1255
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1256
;                                                                    ;
1257
;                    MAIN OS LOOP START                              ;
1258
;                                                                    ;
1259
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1260
align 32
1261
osloop:
3534 clevermous 1262
        mov     edx, osloop_has_work?
1263
        xor     ecx, ecx
1264
        call    Wait_events
1265
        xor     eax, eax
1266
        xchg    eax, [osloop_nonperiodic_work]
1267
        test    eax, eax
1268
        jz      .no_periodic
4734 mario79 1269
 
2453 mario79 1270
        call    __sys_draw_pointer
2288 clevermous 1271
        call    window_check_events
1272
        call    mouse_check_events
1273
        call    checkmisc
1274
        call    checkVga_N13
4734 mario79 1275
;--------------------------------------
3534 clevermous 1276
.no_periodic:
2288 clevermous 1277
        call    stack_handler
1278
        call    check_fdd_motor_status
1279
        call    check_ATAPI_device_event
2601 clevermous 1280
        call    check_lights_state
2288 clevermous 1281
        call    check_timers
4734 mario79 1282
 
2288 clevermous 1283
        jmp     osloop
1284
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1285
;                                                                    ;
1286
;                      MAIN OS LOOP END                              ;
1287
;                                                                    ;
1288
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3534 clevermous 1289
proc osloop_has_work?
1290
        cmp     [osloop_nonperiodic_work], 0
1291
        jnz     .yes
1292
        call    stack_handler_has_work?
1293
        jnz     .yes
4273 clevermous 1294
        call    check_fdd_motor_status_has_work?
1295
        jnz     .yes
3534 clevermous 1296
        call    check_ATAPI_device_event_has_work?
1297
        jnz     .yes
1298
        call    check_lights_state_has_work?
1299
        jnz     .yes
1300
        call    check_timers_has_work?
1301
        jnz     .yes
1302
.no:
1303
        xor     eax, eax
2288 clevermous 1304
        ret
3534 clevermous 1305
.yes:
1306
        xor     eax, eax
1307
        inc     eax
1308
        ret
1309
endp
2288 clevermous 1310
 
3534 clevermous 1311
proc wakeup_osloop
1312
        mov     [osloop_nonperiodic_work], 1
1313
        ret
1314
endp
1315
 
2288 clevermous 1316
uglobal
3534 clevermous 1317
align 4
1318
osloop_nonperiodic_work dd      ?
2288 clevermous 1319
endg
1320
 
5033 clevermous 1321
uglobal
1322
align 64
1323
idle_addr       rb      64
1324
endg
1325
 
3534 clevermous 1326
idle_thread:
1327
        sti
5033 clevermous 1328
 
1329
; The following code can be executed by all CPUs in the system.
1330
; All other parts of the kernel do not expect multi-CPU.
1331
; Also, APs don't even have a stack here.
1332
; Beware. Don't do anything here. Anything at all.
3534 clevermous 1333
idle_loop:
5033 clevermous 1334
        cmp     [use_mwait_for_idle], 0
1335
        jnz     idle_loop_mwait
1336
 
1337
idle_loop_hlt:
3534 clevermous 1338
        hlt
5033 clevermous 1339
        jmp     idle_loop_hlt
2288 clevermous 1340
 
5033 clevermous 1341
idle_loop_mwait:
1342
        mov     eax, idle_addr
1343
        xor     ecx, ecx
1344
        xor     edx, edx
1345
        monitor
1346
        xor     ecx, ecx
1347
        mov     eax, 20h        ; or 10h
1348
        mwait
1349
        jmp     idle_loop_mwait
2288 clevermous 1350
 
3534 clevermous 1351
 
2288 clevermous 1352
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1353
;                                                                      ;
1354
;                   INCLUDED SYSTEM FILES                              ;
1355
;                                                                      ;
1356
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1357
 
1358
 
1359
include "kernel32.inc"
1360
 
1361
 
1362
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1363
;                                                                      ;
1364
;                       KERNEL FUNCTIONS                               ;
1365
;                                                                      ;
1366
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1367
 
1368
reserve_irqs_ports:
1369
 
1370
 
1371
; RESERVE PORTS
1372
        mov     eax, RESERVED_PORTS
1373
        mov     ecx, 1
1374
 
1375
        mov     [eax], dword 4
1376
 
1377
        mov     [eax+16], ecx
1378
        mov     [eax+16+4], dword 0
3426 hidnplayr 1379
        mov     [eax+16+8], dword 0x2D
2288 clevermous 1380
 
1381
        mov     [eax+32], ecx
1382
        mov     [eax+32+4], dword 0x30
1383
        mov     [eax+32+8], dword 0x4D
1384
 
1385
        mov     [eax+48], ecx
1386
        mov     [eax+48+4], dword 0x50
3426 hidnplayr 1387
        mov     [eax+48+8], dword 0xDF
2288 clevermous 1388
 
1389
        mov     [eax+64], ecx
1390
        mov     [eax+64+4], dword 0xE5
1391
        mov     [eax+64+8], dword 0xFF
1392
 
1393
        ret
1394
 
1395
 
1396
iglobal
3534 clevermous 1397
  process_number dd 0x2
2288 clevermous 1398
endg
1399
 
1400
set_variables:
1401
 
1402
        mov     ecx, 0x16                    ; flush port 0x60
1403
.fl60:
1404
        in      al, 0x60
1405
        loop    .fl60
1406
        push    eax
1407
 
3732 Serge 1408
        mov     ax, [BOOT_VARS+BOOT_Y_RES]
2288 clevermous 1409
        shr     ax, 1
1410
        shl     eax, 16
3732 Serge 1411
        mov     ax, [BOOT_VARS+BOOT_X_RES]
2288 clevermous 1412
        shr     ax, 1
1413
        mov     [MOUSE_X], eax
3534 clevermous 1414
        call    wakeup_osloop
2288 clevermous 1415
 
1416
        xor     eax, eax
1417
        mov     [BTN_ADDR], dword BUTTON_INFO ; address of button list
1418
 
1419
        mov     byte [KEY_COUNT], al              ; keyboard buffer
1420
        mov     byte [BTN_COUNT], al              ; button buffer
1421
;        mov   [MOUSE_X],dword 100*65536+100    ; mouse x/y
1422
 
1423
        pop     eax
1424
        ret
1425
 
1426
align 4
1427
;input  eax=43,bl-byte of output, ecx - number of port
1428
sys_outport:
1429
 
1430
        mov     edi, ecx   ; separate flag for read / write
1431
        and     ecx, 65535
1432
 
1433
        mov     eax, [RESERVED_PORTS]
1434
        test    eax, eax
1435
        jnz     .sopl8
1436
        inc     eax
1437
        mov     [esp+32], eax
1438
        ret
1439
 
1440
  .sopl8:
1441
        mov     edx, [TASK_BASE]
1442
        mov     edx, [edx+0x4]
1443
    ;and   ecx,65535
1444
    ;cld - set on interrupt 0x40
1445
  .sopl1:
1446
 
1447
        mov     esi, eax
1448
        shl     esi, 4
1449
        add     esi, RESERVED_PORTS
1450
        cmp     edx, [esi+0]
1451
        jne     .sopl2
1452
        cmp     ecx, [esi+4]
1453
        jb      .sopl2
1454
        cmp     ecx, [esi+8]
1455
        jg      .sopl2
1456
.sopl3:
1457
 
1458
        test    edi, 0x80000000; read ?
1459
        jnz     .sopl4
1460
 
1461
        mov     eax, ebx
1462
        mov     dx, cx   ; write
1463
        out     dx, al
1464
        and     [esp+32], dword 0
1465
        ret
1466
 
1467
        .sopl2:
1468
 
1469
        dec     eax
1470
        jnz     .sopl1
1471
        inc     eax
1472
        mov     [esp+32], eax
1473
        ret
1474
 
1475
 
1476
  .sopl4:
1477
 
1478
        mov     dx, cx   ; read
1479
        in      al, dx
1480
        and     eax, 0xff
1481
        and     [esp+32], dword 0
1482
        mov     [esp+20], eax
1483
        ret
1484
 
1485
display_number:
1486
;It is not optimization
1487
        mov     eax, ebx
1488
        mov     ebx, ecx
1489
        mov     ecx, edx
1490
        mov     edx, esi
1491
        mov     esi, edi
1492
; eax = print type, al=0 -> ebx is number
1493
;                   al=1 -> ebx is pointer
1494
;                   ah=0 -> display decimal
1495
;                   ah=1 -> display hexadecimal
1496
;                   ah=2 -> display binary
1497
;                   eax bits 16-21 = number of digits to display (0-32)
1498
;                   eax bits 22-31 = reserved
1499
;
1500
; ebx = number or pointer
1501
; ecx = x shl 16 + y
1502
; edx = color
1503
        xor     edi, edi
1504
display_number_force:
1505
        push    eax
1506
        and     eax, 0x3fffffff
1507
        cmp     eax, 0xffff     ; length > 0 ?
1508
        pop     eax
1509
        jge     cont_displ
1510
        ret
1511
   cont_displ:
1512
        push    eax
1513
        and     eax, 0x3fffffff
1514
        cmp     eax, 61*0x10000  ; length <= 60 ?
1515
        pop     eax
1516
        jb      cont_displ2
1517
        ret
1518
   cont_displ2:
1519
 
1520
        pushad
1521
 
1522
        cmp     al, 1            ; ecx is a pointer ?
1523
        jne     displnl1
1524
        mov     ebp, ebx
1525
        add     ebp, 4
1526
        mov     ebp, [ebp+std_application_base_address]
1527
        mov     ebx, [ebx+std_application_base_address]
1528
 displnl1:
1529
        sub     esp, 64
1530
 
1531
        test    ah, ah            ; DECIMAL
1532
        jnz     no_display_desnum
1533
        shr     eax, 16
1534
        and     eax, 0xC03f
1535
;     and   eax,0x3f
1536
        push    eax
1537
        and     eax, 0x3f
1538
        mov     edi, esp
1539
        add     edi, 4+64-1
1540
        mov     ecx, eax
1541
        mov     eax, ebx
1542
        mov     ebx, 10
1543
 d_desnum:
1544
        xor     edx, edx
1545
        call    division_64_bits
1546
        div     ebx
1547
        add     dl, 48
1548
        mov     [edi], dl
1549
        dec     edi
1550
        loop    d_desnum
1551
        pop     eax
1552
        call    normalize_number
1553
        call    draw_num_text
1554
        add     esp, 64
1555
        popad
1556
        ret
1557
   no_display_desnum:
1558
 
1559
        cmp     ah, 0x01         ; HEXADECIMAL
1560
        jne     no_display_hexnum
1561
        shr     eax, 16
1562
        and     eax, 0xC03f
1563
;     and   eax,0x3f
1564
        push    eax
1565
        and     eax, 0x3f
1566
        mov     edi, esp
1567
        add     edi, 4+64-1
1568
        mov     ecx, eax
1569
        mov     eax, ebx
1570
        mov     ebx, 16
1571
   d_hexnum:
1572
        xor     edx, edx
1573
        call    division_64_bits
1574
        div     ebx
1575
   hexletters = __fdo_hexdigits
1576
        add     edx, hexletters
1577
        mov     dl, [edx]
1578
        mov     [edi], dl
1579
        dec     edi
1580
        loop    d_hexnum
1581
        pop     eax
1582
        call    normalize_number
1583
        call    draw_num_text
1584
        add     esp, 64
1585
        popad
1586
        ret
1587
   no_display_hexnum:
1588
 
1589
        cmp     ah, 0x02         ; BINARY
1590
        jne     no_display_binnum
1591
        shr     eax, 16
1592
        and     eax, 0xC03f
1593
;     and   eax,0x3f
1594
        push    eax
1595
        and     eax, 0x3f
1596
        mov     edi, esp
1597
        add     edi, 4+64-1
1598
        mov     ecx, eax
1599
        mov     eax, ebx
1600
        mov     ebx, 2
1601
   d_binnum:
1602
        xor     edx, edx
1603
        call    division_64_bits
1604
        div     ebx
1605
        add     dl, 48
1606
        mov     [edi], dl
1607
        dec     edi
1608
        loop    d_binnum
1609
        pop     eax
1610
        call    normalize_number
1611
        call    draw_num_text
1612
        add     esp, 64
1613
        popad
1614
        ret
1615
   no_display_binnum:
1616
 
1617
        add     esp, 64
1618
        popad
1619
        ret
1620
 
1621
normalize_number:
1622
        test    ah, 0x80
1623
        jz      .continue
1624
        mov     ecx, 48
1625
        and     eax, 0x3f
1626
@@:
1627
        inc     edi
1628
        cmp     [edi], cl
1629
        jne     .continue
1630
        dec     eax
1631
        cmp     eax, 1
1632
        ja      @r
1633
        mov     al, 1
1634
.continue:
1635
        and     eax, 0x3f
1636
        ret
1637
 
1638
division_64_bits:
1639
        test    [esp+1+4], byte 0x40
1640
        jz      .continue
1641
        push    eax
1642
        mov     eax, ebp
1643
        div     ebx
1644
        mov     ebp, eax
1645
        pop     eax
1646
.continue:
1647
        ret
1648
 
1649
draw_num_text:
1650
        mov     esi, eax
1651
        mov     edx, 64+4
1652
        sub     edx, eax
1653
        add     edx, esp
1654
        mov     ebx, [esp+64+32-8+4]
1655
; add window start x & y
1656
        mov     ecx, [TASK_BASE]
1657
 
1658
        mov     edi, [CURRENT_TASK]
1659
        shl     edi, 8
1660
 
1661
        mov     eax, [ecx-twdw+WDATA.box.left]
1662
        add     eax, [edi+SLOT_BASE+APPDATA.wnd_clientbox.left]
1663
        shl     eax, 16
1664
        add     eax, [ecx-twdw+WDATA.box.top]
1665
        add     eax, [edi+SLOT_BASE+APPDATA.wnd_clientbox.top]
1666
        add     ebx, eax
1667
        mov     ecx, [esp+64+32-12+4]
1668
        and     ecx, not 0x80000000     ; force counted string
1669
        mov     eax, [esp+64+8]         ; background color (if given)
1670
        mov     edi, [esp+64+4]
1671
        jmp     dtext
4700 mario79 1672
;-----------------------------------------------------------------------------
1673
iglobal
1674
midi_base dw 0
1675
endg
1676
;-----------------------------------------------------------------------------
2288 clevermous 1677
align 4
1678
sys_setup:
4700 mario79 1679
;  1 = roland mpu midi base , base io address
1680
;  2 = keyboard   1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus
1681
;  3 = not used
1682
;  4 = not used
1683
;  5 = system language, 1eng 2fi 3ger 4rus
1684
;  6 = not used
1685
;  7 = not used
1686
;  8 = not used
1687
;  9 = not used
1688
; 10 = not used
2288 clevermous 1689
; 11 = enable lba read
1690
; 12 = enable pci access
4700 mario79 1691
;-----------------------------------------------------------------------------
1692
        and     [esp+32], dword 0
1693
; F.21.1 - set MPU MIDI base port
1694
        dec     ebx
1695
        jnz     @f
2288 clevermous 1696
 
1697
        cmp     ecx, 0x100
4700 mario79 1698
        jb      @f
2288 clevermous 1699
 
1700
        mov     esi, 65535
1701
        cmp     esi, ecx
4700 mario79 1702
        jb      @f
2288 clevermous 1703
 
4700 mario79 1704
        mov     [midi_base], cx
1705
        mov     word [mididp], cx
1706
        inc     cx
1707
        mov     word [midisp], cx
2288 clevermous 1708
        ret
4700 mario79 1709
;--------------------------------------
1710
@@:
1711
; F.21.2 - set keyboard layout
1712
        dec     ebx
1713
        jnz     @f
2288 clevermous 1714
 
1715
        mov     edi, [TASK_BASE]
1716
        mov     eax, [edi+TASKDATA.mem_start]
1717
        add     eax, edx
4700 mario79 1718
; 1 = normal layout
1719
        dec     ecx
1720
        jnz     .shift
2288 clevermous 1721
 
1722
        mov     ebx, keymap
1723
        mov     ecx, 128
1724
        call    memmove
1725
        ret
4700 mario79 1726
;--------------------------------------
1727
.shift:
1728
; 2 = layout at pressed Shift
2288 clevermous 1729
        dec     ecx
4700 mario79 1730
        jnz     .alt
2288 clevermous 1731
 
1732
        mov     ebx, keymap_shift
1733
        mov     ecx, 128
1734
        call    memmove
1735
        ret
4700 mario79 1736
;--------------------------------------
1737
.alt:
1738
; 3 = layout at pressed Alt
2288 clevermous 1739
        dec     ecx
4700 mario79 1740
        jnz     .country
1741
 
2288 clevermous 1742
        mov     ebx, keymap_alt
1743
        mov     ecx, 128
1744
        call    memmove
1745
        ret
4700 mario79 1746
;--------------------------------------
1747
.country:
1748
; country identifier
2288 clevermous 1749
        sub     ecx, 6
4700 mario79 1750
        jnz     .error
1751
 
2288 clevermous 1752
        mov     word [keyboard], dx
1753
        ret
4700 mario79 1754
;--------------------------------------
1755
@@:
1756
; F.21.5 - set system language
1757
        sub     ebx, 3
1758
        jnz     @f
2288 clevermous 1759
 
1760
        mov     [syslang], ecx
1761
        ret
4700 mario79 1762
;--------------------------------------
1763
@@:
1764
; F.21.11 - enable/disable low-level access to HD
1765
        and     ecx, 1
1766
        sub     ebx, 6
1767
        jnz     @f
2288 clevermous 1768
 
4700 mario79 1769
        mov     [lba_read_enabled], ecx
2288 clevermous 1770
        ret
4700 mario79 1771
;--------------------------------------
1772
@@:
1773
; F.21.12 - enable/disable low-level access to PCI
2288 clevermous 1774
        dec     ebx
4700 mario79 1775
        jnz     .error
2288 clevermous 1776
 
1777
        mov     [pci_access_enabled], ecx
1778
        ret
4700 mario79 1779
;--------------------------------------
1780
.error:
2288 clevermous 1781
        or      [esp+32], dword -1
1782
        ret
4700 mario79 1783
;-----------------------------------------------------------------------------
2288 clevermous 1784
align 4
1785
sys_getsetup:
4700 mario79 1786
;  1 = roland mpu midi base , base io address
1787
;  2 = keyboard   1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus
1788
;  3 = not used
1789
;  4 = not used
1790
;  5 = system language, 1eng 2fi 3ger 4rus
1791
;  6 = not used
1792
;  7 = not used
1793
;  8 = not used
1794
;  9 = get hs timer tic
1795
; 10 = not used
1796
; 11 = get the state "lba read"
1797
; 12 = get the state "pci access"
1798
;-----------------------------------------------------------------------------
1799
; F.26.1 - get MPU MIDI base port
1800
        dec     ebx
1801
        jnz     @f
2288 clevermous 1802
 
1803
        movzx   eax, [midi_base]
1804
        mov     [esp+32], eax
1805
        ret
4700 mario79 1806
;--------------------------------------
1807
@@:
1808
; F.26.2 - get keyboard layout
2288 clevermous 1809
        dec     ebx
4700 mario79 1810
        jnz     @f
2288 clevermous 1811
 
1812
        mov     edi, [TASK_BASE]
1813
        mov     ebx, [edi+TASKDATA.mem_start]
1814
        add     ebx, edx
4700 mario79 1815
; 1 = normal layout
1816
        dec     ecx
1817
        jnz     .shift
2288 clevermous 1818
 
1819
        mov     eax, keymap
1820
        mov     ecx, 128
1821
        call    memmove
1822
        ret
4700 mario79 1823
;--------------------------------------
1824
.shift:
1825
; 2 = layout with pressed Shift
2288 clevermous 1826
        dec     ecx
4700 mario79 1827
        jnz     .alt
2288 clevermous 1828
 
1829
        mov     eax, keymap_shift
1830
        mov     ecx, 128
1831
        call    memmove
1832
        ret
4700 mario79 1833
;--------------------------------------
1834
.alt:
1835
; 3 = layout with pressed Alt
2288 clevermous 1836
        dec     ecx
4700 mario79 1837
        jne     .country
2288 clevermous 1838
 
1839
        mov     eax, keymap_alt
1840
        mov     ecx, 128
1841
        call    memmove
1842
        ret
4700 mario79 1843
;--------------------------------------
1844
.country:
1845
; 9 = country identifier
2288 clevermous 1846
        sub     ecx, 6
4700 mario79 1847
        jnz     .error
1848
 
2288 clevermous 1849
        movzx   eax, word [keyboard]
1850
        mov     [esp+32], eax
1851
        ret
4700 mario79 1852
;--------------------------------------
1853
@@:
1854
; F.26.5 - get system language
1855
        sub     ebx, 3
1856
        jnz     @f
2288 clevermous 1857
 
1858
        mov     eax, [syslang]
1859
        mov     [esp+32], eax
1860
        ret
4700 mario79 1861
;--------------------------------------
1862
@@:
1863
; F.26.9 - get the value of the time counter
4573 clevermous 1864
        sub     ebx, 4
4700 mario79 1865
        jnz     @f
1866
 
1867
        mov     eax, [timer_ticks]
2288 clevermous 1868
        mov     [esp+32], eax
1869
        ret
4700 mario79 1870
;--------------------------------------
1871
@@:
1872
; F.26.11 - Find out whether low-level HD access is enabled
2288 clevermous 1873
        sub     ebx, 2
4700 mario79 1874
        jnz     @f
1875
 
2288 clevermous 1876
        mov     eax, [lba_read_enabled]
1877
        mov     [esp+32], eax
1878
        ret
4700 mario79 1879
;--------------------------------------
1880
@@:
1881
; F.26.12 - Find out whether low-level PCI access is enabled
2288 clevermous 1882
        dec     ebx
4700 mario79 1883
        jnz     .error
1884
 
2288 clevermous 1885
        mov     eax, [pci_access_enabled]
1886
        mov     [esp+32], eax
1887
        ret
4700 mario79 1888
;--------------------------------------
1889
.error:
1890
        or      [esp+32], dword -1
2288 clevermous 1891
        ret
4700 mario79 1892
;-----------------------------------------------------------------------------
2288 clevermous 1893
get_timer_ticks:
1894
        mov     eax, [timer_ticks]
1895
        ret
4700 mario79 1896
;-----------------------------------------------------------------------------
2288 clevermous 1897
iglobal
1898
align 4
1899
mousefn dd msscreen, mswin, msbutton, msset
1900
        dd app_load_cursor
1901
        dd app_set_cursor
1902
        dd app_delete_cursor
1903
        dd msz
1904
endg
4700 mario79 1905
;-----------------------------------------------------------------------------
2288 clevermous 1906
readmousepos:
1907
 
1908
; eax=0 screen relative
1909
; eax=1 window relative
1910
; eax=2 buttons pressed
1911
; eax=3 set mouse pos   ; reserved
1912
; eax=4 load cursor
1913
; eax=5 set cursor
1914
; eax=6 delete cursor   ; reserved
1915
; eax=7 get mouse_z
1916
 
1917
        cmp     ebx, 7
1918
        ja      msset
1919
        jmp     [mousefn+ebx*4]
1920
msscreen:
1921
        mov     eax, [MOUSE_X]
1922
        shl     eax, 16
1923
        mov     ax, [MOUSE_Y]
1924
        mov     [esp+36-4], eax
1925
        ret
1926
mswin:
1927
        mov     eax, [MOUSE_X]
1928
        shl     eax, 16
1929
        mov     ax, [MOUSE_Y]
1930
        mov     esi, [TASK_BASE]
1931
        mov     bx, word [esi-twdw+WDATA.box.left]
1932
        shl     ebx, 16
1933
        mov     bx, word [esi-twdw+WDATA.box.top]
1934
        sub     eax, ebx
1935
 
1936
        mov     edi, [CURRENT_TASK]
1937
        shl     edi, 8
1938
        sub     ax, word[edi+SLOT_BASE+APPDATA.wnd_clientbox.top]
1939
        rol     eax, 16
1940
        sub     ax, word[edi+SLOT_BASE+APPDATA.wnd_clientbox.left]
1941
        rol     eax, 16
1942
        mov     [esp+36-4], eax
1943
        ret
1944
msbutton:
1945
        movzx   eax, byte [BTN_DOWN]
1946
        mov     [esp+36-4], eax
1947
        ret
1948
msz:
1949
        mov     edi, [TASK_COUNT]
1950
        movzx   edi, word [WIN_POS + edi*2]
1951
        cmp     edi, [CURRENT_TASK]
1952
        jne     @f
1953
        mov     ax, [MOUSE_SCROLL_H]
1954
        shl     eax, 16
1955
        mov     ax, [MOUSE_SCROLL_V]
1956
        mov     [esp+36-4], eax
1957
        and     [MOUSE_SCROLL_H], word 0
1958
        and     [MOUSE_SCROLL_V], word 0
1959
        ret
1960
       @@:
1961
        and     [esp+36-4], dword 0
1962
;           ret
1963
msset:
1964
        ret
1965
 
1966
app_load_cursor:
1967
        cmp     ecx, OS_BASE
1968
        jae     msset
1969
        stdcall load_cursor, ecx, edx
1970
        mov     [esp+36-4], eax
1971
        ret
1972
 
1973
app_set_cursor:
1974
        stdcall set_cursor, ecx
1975
        mov     [esp+36-4], eax
1976
        ret
1977
 
1978
app_delete_cursor:
1979
        stdcall delete_cursor, ecx
1980
        mov     [esp+36-4], eax
1981
        ret
1982
 
1983
is_input:
1984
 
1985
        push    edx
1986
        mov     dx, word [midisp]
1987
        in      al, dx
1988
        and     al, 0x80
1989
        pop     edx
1990
        ret
1991
 
1992
is_output:
1993
 
1994
        push    edx
1995
        mov     dx, word [midisp]
1996
        in      al, dx
1997
        and     al, 0x40
1998
        pop     edx
1999
        ret
2000
 
2001
 
2002
get_mpu_in:
2003
 
2004
        push    edx
2005
        mov     dx, word [mididp]
2006
        in      al, dx
2007
        pop     edx
2008
        ret
2009
 
2010
 
2011
put_mpu_out:
2012
 
2013
        push    edx
2014
        mov     dx, word [mididp]
2015
        out     dx, al
2016
        pop     edx
2017
        ret
2018
 
2019
 
2020
 
2021
align 4
2022
 
2023
sys_midi:
2024
        cmp     [mididp], 0
2025
        jnz     sm0
2026
        mov     [esp+36], dword 1
2027
        ret
2028
sm0:
2029
        and     [esp+36], dword 0
2030
        dec     ebx
2031
        jnz     smn1
2032
 ;    call setuart
2033
su1:
2034
        call    is_output
2035
        test    al, al
2036
        jnz     su1
2037
        mov     dx, word [midisp]
2038
        mov     al, 0xff
2039
        out     dx, al
2040
su2:
2041
        mov     dx, word [midisp]
2042
        mov     al, 0xff
2043
        out     dx, al
2044
        call    is_input
2045
        test    al, al
2046
        jnz     su2
2047
        call    get_mpu_in
2048
        cmp     al, 0xfe
2049
        jnz     su2
2050
su3:
2051
        call    is_output
2052
        test    al, al
2053
        jnz     su3
2054
        mov     dx, word [midisp]
2055
        mov     al, 0x3f
2056
        out     dx, al
2057
        ret
2058
smn1:
2059
        dec     ebx
2060
        jnz     smn2
2061
sm10:
2062
        call    get_mpu_in
2063
        call    is_output
2064
        test    al, al
2065
        jnz     sm10
2066
        mov     al, bl
2067
        call    put_mpu_out
2068
        smn2:
2069
        ret
2070
 
2071
detect_devices:
2072
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2073
;include 'detect/commouse.inc'
2074
;include 'detect/ps2mouse.inc'
2075
;include 'detect/dev_fd.inc'
2076
;include 'detect/dev_hdcd.inc'
2077
;include 'detect/sear_par.inc'
2078
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2079
        ret
2080
 
2081
sys_end:
2430 mario79 2082
;--------------------------------------
2083
        cmp     [_display.select_cursor], 0
2084
        je      @f
2085
; restore default cursor before killing
2086
        pusha
2087
        mov     ecx, [current_slot]
2435 mario79 2088
        call    restore_default_cursor_before_killing
2430 mario79 2089
        popa
2090
@@:
2091
;--------------------------------------
3545 hidnplayr 2092
; kill all sockets this process owns
2093
        pusha
2094
        mov     edx, [TASK_BASE]
2095
        mov     edx, [edx+TASKDATA.pid]
2096
        call    SOCKET_process_end
2097
        popa
2098
;--------------------------------------
2288 clevermous 2099
        mov     ecx, [current_slot]
2100
        mov     eax, [ecx+APPDATA.tls_base]
2101
        test    eax, eax
2102
        jz      @F
2103
 
2104
        stdcall user_free, eax
2105
@@:
2106
 
2107
        mov     eax, [TASK_BASE]
2108
        mov     [eax+TASKDATA.state], 3; terminate this program
3534 clevermous 2109
        call    wakeup_osloop
2288 clevermous 2110
 
3597 Serge 2111
.waitterm:            ; wait here for termination
2112
        call    change_task
2113
        jmp     .waitterm
2435 mario79 2114
;------------------------------------------------------------------------------
2452 mario79 2115
align 4
2435 mario79 2116
restore_default_cursor_before_killing:
2468 mario79 2117
        pushfd
2118
        cli
2435 mario79 2119
        mov     eax, [def_cursor]
2120
        mov     [ecx+APPDATA.cursor], eax
2288 clevermous 2121
 
2435 mario79 2122
        movzx   eax, word [MOUSE_Y]
2123
        movzx   ebx, word [MOUSE_X]
2446 mario79 2124
        mov     eax, [d_width_calc_area + eax*4]
2125
 
5351 serge 2126
        add     eax, [_display.win_map]
2435 mario79 2127
        movzx   edx, byte [ebx+eax]
2128
        shl     edx, 8
2129
        mov     esi, [edx+SLOT_BASE+APPDATA.cursor]
2452 mario79 2130
 
2131
        cmp     esi, [current_cursor]
2132
        je      @f
2133
 
2435 mario79 2134
        push    esi
2135
        call    [_display.select_cursor]
2136
        mov     [current_cursor], esi
2452 mario79 2137
@@:
2450 mario79 2138
        mov     [redrawmouse_unconditional], 1
3534 clevermous 2139
        call    wakeup_osloop
2468 mario79 2140
        popfd
2435 mario79 2141
        ret
2142
;------------------------------------------------------------------------------
2288 clevermous 2143
iglobal
2144
align 4
2145
sys_system_table:
2146
        dd      sysfn_deactivate        ; 1 = deactivate window
2147
        dd      sysfn_terminate         ; 2 = terminate thread
2148
        dd      sysfn_activate          ; 3 = activate window
2149
        dd      sysfn_getidletime       ; 4 = get idle time
2150
        dd      sysfn_getcpuclock       ; 5 = get cpu clock
2151
        dd      sysfn_saveramdisk       ; 6 = save ramdisk
2152
        dd      sysfn_getactive         ; 7 = get active window
2153
        dd      sysfn_sound_flag        ; 8 = get/set sound_flag
2154
        dd      sysfn_shutdown          ; 9 = shutdown with parameter
2155
        dd      sysfn_minimize          ; 10 = minimize window
2156
        dd      sysfn_getdiskinfo       ; 11 = get disk subsystem info
2157
        dd      sysfn_lastkey           ; 12 = get last pressed key
2158
        dd      sysfn_getversion        ; 13 = get kernel version
2159
        dd      sysfn_waitretrace       ; 14 = wait retrace
2160
        dd      sysfn_centermouse       ; 15 = center mouse cursor
2161
        dd      sysfn_getfreemem        ; 16 = get free memory size
2162
        dd      sysfn_getallmem         ; 17 = get total memory size
2163
        dd      sysfn_terminate2        ; 18 = terminate thread using PID
2164
                                        ;                 instead of slot
2165
        dd      sysfn_mouse_acceleration; 19 = set/get mouse acceleration
2166
        dd      sysfn_meminfo           ; 20 = get extended memory info
2167
        dd      sysfn_pid_to_slot       ; 21 = get slot number for pid
2168
        dd      sysfn_min_rest_window   ; 22 = minimize and restore any window
2648 mario79 2169
        dd      sysfn_min_windows       ; 23 = minimize all windows
2654 mario79 2170
        dd      sysfn_set_screen_sizes  ; 24 = set screen sizes for Vesa
2288 clevermous 2171
sysfn_num = ($ - sys_system_table)/4
2172
endg
2173
;------------------------------------------------------------------------------
2174
sys_system:
2175
        dec     ebx
2176
        cmp     ebx, sysfn_num
2177
        jae     @f
2178
        jmp     dword [sys_system_table + ebx*4]
2179
@@:
2180
        ret
2181
;------------------------------------------------------------------------------
2182
sysfn_shutdown:          ; 18.9 = system shutdown
2183
        cmp     ecx, 1
2184
        jl      exit_for_anyone
2185
        cmp     ecx, 4
2186
        jg      exit_for_anyone
3732 Serge 2187
        mov     [BOOT_VARS+0x9030], cl
2288 clevermous 2188
 
2189
        mov     eax, [TASK_COUNT]
2190
        mov     [SYS_SHUTDOWN], al
2191
        mov     [shutdown_processes], eax
3534 clevermous 2192
        call    wakeup_osloop
2288 clevermous 2193
        and     dword [esp+32], 0
2194
 exit_for_anyone:
2195
        ret
2196
  uglobal
2197
   shutdown_processes:
2198
                       dd 0x0
2199
  endg
2200
;------------------------------------------------------------------------------
2201
sysfn_terminate:        ; 18.2 = TERMINATE
2472 mario79 2202
        push    ecx
2288 clevermous 2203
        cmp     ecx, 2
2204
        jb      noprocessterminate
2205
        mov     edx, [TASK_COUNT]
2206
        cmp     ecx, edx
2207
        ja      noprocessterminate
2208
        mov     eax, [TASK_COUNT]
2209
        shl     ecx, 5
2210
        mov     edx, [ecx+CURRENT_TASK+TASKDATA.pid]
2211
        add     ecx, CURRENT_TASK+TASKDATA.state
2212
        cmp     byte [ecx], 9
2213
        jz      noprocessterminate
3296 clevermous 2214
        push    ecx edx
2215
        lea     edx, [(ecx-(CURRENT_TASK and 1FFFFFFFh)-TASKDATA.state)*8+SLOT_BASE]
2216
        call    request_terminate
2217
        pop     edx ecx
2218
        test    eax, eax
2219
        jz      noprocessterminate
2430 mario79 2220
;--------------------------------------
3545 hidnplayr 2221
; terminate all network sockets it used
2222
        pusha
2223
        mov     eax, edx
2224
        call    SOCKET_process_end
2225
        popa
2226
;--------------------------------------
2430 mario79 2227
        cmp     [_display.select_cursor], 0
2452 mario79 2228
        je      .restore_end
2430 mario79 2229
; restore default cursor before killing
2230
        pusha
2231
        mov     ecx, [esp+32]
2232
        shl     ecx, 8
2435 mario79 2233
        add     ecx, SLOT_BASE
2452 mario79 2234
        mov     eax, [def_cursor]
2235
        cmp     [ecx+APPDATA.cursor], eax
2236
        je      @f
2435 mario79 2237
        call    restore_default_cursor_before_killing
2452 mario79 2238
@@:
2430 mario79 2239
        popa
2452 mario79 2240
.restore_end:
2430 mario79 2241
;--------------------------------------
2288 clevermous 2242
     ;call MEM_Heap_Lock      ;guarantee that process isn't working with heap
2243
        mov     [ecx], byte 3; clear possible i40's
3534 clevermous 2244
        call    wakeup_osloop
2288 clevermous 2245
     ;call MEM_Heap_UnLock
2246
 
3534 clevermous 2247
        cmp     edx, [application_table_owner]; clear app table stat
2288 clevermous 2248
        jne     noatsc
3534 clevermous 2249
        call    unlock_application_table
2468 mario79 2250
noatsc:
2251
noprocessterminate:
2472 mario79 2252
        add     esp, 4
2288 clevermous 2253
        ret
2254
;------------------------------------------------------------------------------
2255
sysfn_terminate2:
2256
;lock application_table_status mutex
2257
.table_status:
3534 clevermous 2258
        call    lock_application_table
2288 clevermous 2259
        mov     eax, ecx
2260
        call    pid_to_slot
2261
        test    eax, eax
2262
        jz      .not_found
2263
        mov     ecx, eax
2264
        cli
2265
        call    sysfn_terminate
3534 clevermous 2266
        call    unlock_application_table
2288 clevermous 2267
        sti
2268
        and     dword [esp+32], 0
2269
        ret
2270
.not_found:
3534 clevermous 2271
        call    unlock_application_table
2288 clevermous 2272
        or      dword [esp+32], -1
2273
        ret
2274
;------------------------------------------------------------------------------
2275
sysfn_deactivate:         ; 18.1 = DEACTIVATE WINDOW
2276
        cmp     ecx, 2
2277
        jb      .nowindowdeactivate
2278
        cmp     ecx, [TASK_COUNT]
2279
        ja      .nowindowdeactivate
2408 Serge 2280
 
2288 clevermous 2281
        movzx   esi, word [WIN_STACK + ecx*2]
2282
        cmp     esi, 1
2283
        je      .nowindowdeactivate ; already deactive
2284
 
2285
        mov     edi, ecx
2286
        shl     edi, 5
2287
        add     edi, window_data
2288
        movzx   esi, word [WIN_STACK + ecx * 2]
2289
        lea     esi, [WIN_POS + esi * 2]
2290
        call    window._.window_deactivate
2408 Serge 2291
 
2288 clevermous 2292
        call    syscall_display_settings._.calculate_whole_screen
2293
        call    syscall_display_settings._.redraw_whole_screen
2294
.nowindowdeactivate:
2295
        ret
3455 mario79 2296
;------------------------------------------------------------------------------
2288 clevermous 2297
sysfn_activate:         ; 18.3 = ACTIVATE WINDOW
2298
        cmp     ecx, 2
2299
        jb      .nowindowactivate
2300
        cmp     ecx, [TASK_COUNT]
2301
        ja      .nowindowactivate
3455 mario79 2302
;-------------------------------------
2303
@@:
2304
; If the window is captured and moved by the user,
2305
; then you can't change the position in window stack!!!
2306
        mov     al, [mouse.active_sys_window.action]
2307
        and     al, WINDOW_MOVE_AND_RESIZE_FLAGS
2308
        test    al, al
2309
        jz      @f
2310
        call    change_task
2311
        jmp     @b
2312
@@:
2313
;-------------------------------------
2288 clevermous 2314
        mov     [window_minimize], 2; restore window if minimized
3534 clevermous 2315
        call    wakeup_osloop
2288 clevermous 2316
 
2317
        movzx   esi, word [WIN_STACK + ecx*2]
2318
        cmp     esi, [TASK_COUNT]
2319
        je      .nowindowactivate; already active
2320
 
2321
        mov     edi, ecx
2322
        shl     edi, 5
2323
        add     edi, window_data
2324
        movzx   esi, word [WIN_STACK + ecx * 2]
2325
        lea     esi, [WIN_POS + esi * 2]
2326
        call    waredraw
2327
.nowindowactivate:
2328
        ret
2329
;------------------------------------------------------------------------------
2330
sysfn_getidletime:              ; 18.4 = GET IDLETIME
3534 clevermous 2331
        mov     eax, [CURRENT_TASK+32+TASKDATA.cpu_usage]
2288 clevermous 2332
        mov     [esp+32], eax
2333
        ret
2334
;------------------------------------------------------------------------------
2335
sysfn_getcpuclock:              ; 18.5 = GET TSC/SEC
3481 Serge 2336
        mov     eax, dword [cpu_freq]
2288 clevermous 2337
        mov     [esp+32], eax
2338
        ret
2339
;------------------------------------------------------------------------------
3481 Serge 2340
get_cpu_freq:
2341
        mov     eax, dword [cpu_freq]
2342
        mov     edx, dword [cpu_freq+4]
2343
        ret
2288 clevermous 2344
;  SAVE ramdisk to /hd/1/menuet.img
2345
;!!!!!!!!!!!!!!!!!!!!!!!!
2346
   include 'blkdev/rdsave.inc'
2347
;!!!!!!!!!!!!!!!!!!!!!!!!
2348
;------------------------------------------------------------------------------
2349
align 4
2350
sysfn_getactive:        ; 18.7 = get active window
2351
        mov     eax, [TASK_COUNT]
2352
        movzx   eax, word [WIN_POS + eax*2]
2353
        mov     [esp+32], eax
2354
        ret
2355
;------------------------------------------------------------------------------
2356
sysfn_sound_flag:       ; 18.8 = get/set sound_flag
2357
;     cmp  ecx,1
2358
        dec     ecx
2359
        jnz     nogetsoundflag
2360
        movzx   eax, byte [sound_flag]; get sound_flag
2361
        mov     [esp+32], eax
2362
        ret
2363
 nogetsoundflag:
2364
;     cmp  ecx,2
2365
        dec     ecx
2366
        jnz     nosoundflag
2367
        xor     byte [sound_flag], 1
2368
 nosoundflag:
2369
        ret
2370
;------------------------------------------------------------------------------
2371
sysfn_minimize:         ; 18.10 = minimize window
2372
        mov     [window_minimize], 1
3534 clevermous 2373
        call    wakeup_osloop
2288 clevermous 2374
        ret
2375
;------------------------------------------------------------------------------
2376
align 4
2377
sysfn_getdiskinfo:      ; 18.11 = get disk info table
2378
        dec     ecx
4641 mario79 2379
        jnz     .exit
2380
.small_table:
2288 clevermous 2381
        mov     edi, edx
2382
        mov     esi, DRIVE_DATA
4641 mario79 2383
        mov     ecx, DRIVE_DATA_SIZE ;10
2288 clevermous 2384
        cld
4641 mario79 2385
        rep movsb
2386
.exit:
2288 clevermous 2387
        ret
2388
;------------------------------------------------------------------------------
2389
sysfn_lastkey:          ; 18.12 = return 0 (backward compatibility)
2390
        and     dword [esp+32], 0
2391
        ret
2392
;------------------------------------------------------------------------------
2393
sysfn_getversion:       ; 18.13 = get kernel ID and version
2394
        mov     edi, ecx
2395
        mov     esi, version_inf
2396
        mov     ecx, version_end-version_inf
2397
        rep movsb
2398
        ret
2399
;------------------------------------------------------------------------------
2400
sysfn_waitretrace:     ; 18.14 = sys wait retrace
2401
     ;wait retrace functions
2402
 sys_wait_retrace:
2403
        mov     edx, 0x3da
2404
 WaitRetrace_loop:
2405
        in      al, dx
2406
        test    al, 1000b
2407
        jz      WaitRetrace_loop
2408
        and     [esp+32], dword 0
2409
        ret
2410
;------------------------------------------------------------------------------
2411
align 4
2412
sysfn_centermouse:      ; 18.15 = mouse centered
2413
; removed here by 
2414
;     call  mouse_centered
2415
;* mouse centered - start code- Mario79
2416
;mouse_centered:
2417
;        push  eax
5350 serge 2418
        mov     eax, [_display.width]
2288 clevermous 2419
        shr     eax, 1
2420
        mov     [MOUSE_X], ax
5350 serge 2421
        mov     eax, [_display.height]
2288 clevermous 2422
        shr     eax, 1
2423
        mov     [MOUSE_Y], ax
3534 clevermous 2424
        call    wakeup_osloop
2288 clevermous 2425
;        ret
2426
;* mouse centered - end code- Mario79
2427
        xor     eax, eax
2428
        and     [esp+32], eax
2429
;        pop   eax
2430
        ret
2431
;------------------------------------------------------------------------------
2432
align 4
2433
sysfn_mouse_acceleration: ; 18.19 = set/get mouse features
2434
        test    ecx, ecx; get mouse speed factor
2435
        jnz     .set_mouse_acceleration
2436
        xor     eax, eax
2437
        mov     ax, [mouse_speed_factor]
2438
        mov     [esp+32], eax
2439
        ret
2440
 .set_mouse_acceleration:
2441
;     cmp  ecx,1  ; set mouse speed factor
2442
        dec     ecx
2443
        jnz     .get_mouse_delay
2444
        mov     [mouse_speed_factor], dx
2445
        ret
2446
 .get_mouse_delay:
2447
;     cmp  ecx,2  ; get mouse delay
2448
        dec     ecx
2449
        jnz     .set_mouse_delay
2450
        mov     eax, [mouse_delay]
2451
        mov     [esp+32], eax
2452
        ret
2453
 .set_mouse_delay:
2454
;     cmp  ecx,3  ; set mouse delay
2455
        dec     ecx
2456
        jnz     .set_pointer_position
2457
        mov     [mouse_delay], edx
2458
        ret
2459
 .set_pointer_position:
2460
;     cmp  ecx,4  ; set mouse pointer position
2461
        dec     ecx
2462
        jnz     .set_mouse_button
5350 serge 2463
        cmp     dx, word[_display.height]
2464
        jae     .end
2288 clevermous 2465
        rol     edx, 16
5350 serge 2466
        cmp     dx, word[_display.width]
2467
        jae     .end
2288 clevermous 2468
        mov     [MOUSE_X], edx
4381 hidnplayr 2469
        mov     [mouse_active], 1
3534 clevermous 2470
        call    wakeup_osloop
2288 clevermous 2471
        ret
2472
 .set_mouse_button:
2473
;     cmp   ecx,5  ; set mouse button features
2474
        dec     ecx
2475
        jnz     .end
2476
        mov     [BTN_DOWN], dl
2477
        mov     [mouse_active], 1
3534 clevermous 2478
        call    wakeup_osloop
2288 clevermous 2479
 .end:
2480
        ret
2481
;------------------------------------------------------------------------------
2482
sysfn_getfreemem:
2483
        mov     eax, [pg_data.pages_free]
2484
        shl     eax, 2
2485
        mov     [esp+32], eax
2486
        ret
2648 mario79 2487
;------------------------------------------------------------------------------
2288 clevermous 2488
sysfn_getallmem:
2489
        mov     eax, [MEM_AMOUNT]
2490
        shr     eax, 10
2491
        mov     [esp+32], eax
2492
        ret
2648 mario79 2493
;------------------------------------------------------------------------------
2288 clevermous 2494
sysfn_pid_to_slot:
2495
        mov     eax, ecx
2496
        call    pid_to_slot
2497
        mov     [esp+32], eax
2498
        ret
2648 mario79 2499
;------------------------------------------------------------------------------
2288 clevermous 2500
sysfn_min_rest_window:
2501
        pushad
2502
        mov     eax, edx ; ebx - operating
2503
        shr     ecx, 1
2504
        jnc     @f
2505
        call    pid_to_slot
2506
@@:
2507
        or      eax, eax ; eax - number of slot
2508
        jz      .error
2509
        cmp     eax, 255    ; varify maximal slot number
2510
        ja      .error
2511
        movzx   eax, word [WIN_STACK + eax*2]
2512
        shr     ecx, 1
2513
        jc      .restore
2514
 ; .minimize:
2515
        call    minimize_window
2516
        jmp     .exit
2517
.restore:
2518
        call    restore_minimized_window
2519
.exit:
2520
        popad
2521
        xor     eax, eax
2522
        mov     [esp+32], eax
2523
        ret
2524
.error:
2525
        popad
2526
        xor     eax, eax
2527
        dec     eax
2528
        mov     [esp+32], eax
2529
        ret
2648 mario79 2530
;------------------------------------------------------------------------------
2531
sysfn_min_windows:
2532
        call    minimize_all_window
2533
        mov     [esp+32], eax
2534
        call    change_task
2535
        ret
2536
;------------------------------------------------------------------------------
2654 mario79 2537
sysfn_set_screen_sizes:
2538
        cmp     [SCR_MODE], word 0x13
2539
        jbe     .exit
2540
 
2541
        cmp     [_display.select_cursor], select_cursor
2542
        jne     .exit
2543
 
2544
        cmp     ecx, [display_width_standard]
2545
        ja      .exit
2546
 
2547
        cmp     edx, [display_height_standard]
2548
        ja      .exit
2549
 
2550
        pushfd
2551
        cli
2552
        mov     eax, ecx
5351 serge 2553
        mov     ecx, [_display.lfb_pitch]
2654 mario79 2554
        mov     [_display.width], eax
2555
        dec     eax
2556
        mov     [_display.height], edx
2557
        dec     edx
2558
; eax - new Screen_Max_X
2559
; edx - new Screen_Max_Y
2560
        mov     [do_not_touch_winmap], 1
2561
        call    set_screen
2562
        mov     [do_not_touch_winmap], 0
2563
        popfd
2564
        call    change_task
2565
.exit:
2566
        ret
2567
;------------------------------------------------------------------------------
2288 clevermous 2568
uglobal
2569
screen_workarea RECT
2654 mario79 2570
display_width_standard dd 0
2571
display_height_standard dd 0
2572
do_not_touch_winmap db 0
2288 clevermous 2573
window_minimize db 0
2574
sound_flag      db 0
2654 mario79 2575
 
2288 clevermous 2576
endg
2577
 
2578
UID_NONE=0
2579
UID_MENUETOS=1   ;official
2580
UID_KOLIBRI=2    ;russian
2581
 
2582
iglobal
2583
version_inf:
3454 mario79 2584
        db 0,7,7,0  ; version 0.7.7.0
2585
        db 0
2586
.rev    dd __REV__
2288 clevermous 2587
version_end:
2588
endg
2515 mario79 2589
;------------------------------------------------------------------------------
2590
align 4
2288 clevermous 2591
sys_cachetodiskette:
2592
        cmp     ebx, 1
4273 clevermous 2593
        jb      .no_floppy_save
2288 clevermous 2594
        cmp     ebx, 2
4273 clevermous 2595
        ja      .no_floppy_save
2288 clevermous 2596
        call    save_image
4273 clevermous 2597
        mov     [esp + 32], eax
2598
        ret
2599
.no_floppy_save:
2288 clevermous 2600
        mov     [esp + 32], dword 1
2601
        ret
2515 mario79 2602
;------------------------------------------------------------------------------
2288 clevermous 2603
uglobal
2604
;  bgrchanged  dd  0x0
2605
align 4
2606
bgrlockpid dd 0
2607
bgrlock db 0
2608
endg
2515 mario79 2609
;------------------------------------------------------------------------------
2610
align 4
2288 clevermous 2611
sys_background:
2612
        cmp     ebx, 1                     ; BACKGROUND SIZE
2613
        jnz     nosb1
2614
        test    ecx, ecx
2615
        jz      sbgrr
2547 mario79 2616
 
2288 clevermous 2617
        test    edx, edx
2618
        jz      sbgrr
2515 mario79 2619
;--------------------------------------
2620
align 4
2288 clevermous 2621
@@:
2622
;;Maxis use atomic bts for mutexes  4.4.2009
2623
        bts     dword [bgrlock], 0
2624
        jnc     @f
2625
        call    change_task
2626
        jmp     @b
2515 mario79 2627
;--------------------------------------
2628
align 4
2288 clevermous 2629
@@:
2630
        mov     [BgrDataWidth], ecx
2631
        mov     [BgrDataHeight], edx
2632
;    mov   [bgrchanged],1
2633
 
2634
        pushad
2635
; return memory for old background
2636
        mov     eax, [img_background]
2637
        cmp     eax, static_background_data
2638
        jz      @f
2639
        stdcall kernel_free, eax
2515 mario79 2640
;--------------------------------------
2641
align 4
2288 clevermous 2642
@@:
2643
; calculate RAW size
2644
        xor     eax, eax
2645
        inc     eax
2646
        cmp     [BgrDataWidth], eax
2647
        jae     @f
2648
        mov     [BgrDataWidth], eax
2515 mario79 2649
;--------------------------------------
2650
align 4
2288 clevermous 2651
@@:
2652
        cmp     [BgrDataHeight], eax
2653
        jae     @f
2654
        mov     [BgrDataHeight], eax
2515 mario79 2655
;--------------------------------------
2656
align 4
2288 clevermous 2657
@@:
2658
        mov     eax, [BgrDataWidth]
2659
        imul    eax, [BgrDataHeight]
2660
        lea     eax, [eax*3]
2464 mario79 2661
; it is reserved with aligned to the boundary of 4 KB pages,
2662
; otherwise there may be exceptions a page fault for vesa20_drawbackground_tiled
2663
; because the 32 bit read is used for  high performance: "mov eax,[esi]"
2664
        shr     eax, 12
2665
        inc     eax
2666
        shl     eax, 12
2288 clevermous 2667
        mov     [mem_BACKGROUND], eax
2668
; get memory for new background
2669
        stdcall kernel_alloc, eax
2670
        test    eax, eax
2671
        jz      .memfailed
2672
        mov     [img_background], eax
2673
        jmp     .exit
2515 mario79 2674
;--------------------------------------
2675
align 4
2288 clevermous 2676
.memfailed:
2677
; revert to static monotone data
2678
        mov     [img_background], static_background_data
2679
        xor     eax, eax
2680
        inc     eax
2681
        mov     [BgrDataWidth], eax
2682
        mov     [BgrDataHeight], eax
2683
        mov     [mem_BACKGROUND], 4
2515 mario79 2684
;--------------------------------------
2685
align 4
2288 clevermous 2686
.exit:
2687
        popad
2688
        mov     [bgrlock], 0
2515 mario79 2689
;--------------------------------------
2690
align 4
2691
sbgrr:
2288 clevermous 2692
        ret
2515 mario79 2693
;------------------------------------------------------------------------------
2694
align 4
2288 clevermous 2695
nosb1:
2696
        cmp     ebx, 2                     ; SET PIXEL
2697
        jnz     nosb2
2698
 
2699
        mov     eax, [img_background]
2700
        test    ecx, ecx
2701
        jz      @f
2702
        cmp     eax, static_background_data
2703
        jz      .ret
2515 mario79 2704
;--------------------------------------
2705
align 4
2288 clevermous 2706
@@:
2707
        mov     ebx, [mem_BACKGROUND]
2708
        add     ebx, 4095
2709
        and     ebx, -4096
2710
        sub     ebx, 4
2711
        cmp     ecx, ebx
2712
        ja      .ret
2713
 
2714
        mov     ebx, [eax+ecx]
2715
        and     ebx, 0xFF000000;255*256*256*256
2716
        and     edx, 0x00FFFFFF;255*256*256+255*256+255
2717
        add     edx, ebx
2718
        mov     [eax+ecx], edx
2515 mario79 2719
;--------------------------------------
2720
align 4
2288 clevermous 2721
.ret:
2722
        ret
2515 mario79 2723
;------------------------------------------------------------------------------
2724
align 4
2288 clevermous 2725
nosb2:
2726
        cmp     ebx, 3                     ; DRAW BACKGROUND
2727
        jnz     nosb3
2515 mario79 2728
;--------------------------------------
2729
align 4
2288 clevermous 2730
draw_background_temp:
2731
        mov     [background_defined], 1
2732
        call    force_redraw_background
2515 mario79 2733
;--------------------------------------
2734
align 4
2735
nosb31:
2288 clevermous 2736
        ret
2515 mario79 2737
;------------------------------------------------------------------------------
2738
align 4
2739
nosb3:
2288 clevermous 2740
        cmp     ebx, 4                     ; TILED / STRETCHED
2741
        jnz     nosb4
2742
        cmp     ecx, [BgrDrawMode]
2743
        je      nosb41
2744
        mov     [BgrDrawMode], ecx
2515 mario79 2745
;--------------------------------------
2746
align 4
2747
nosb41:
2288 clevermous 2748
        ret
2515 mario79 2749
;------------------------------------------------------------------------------
2750
align 4
2751
nosb4:
2288 clevermous 2752
        cmp     ebx, 5                     ; BLOCK MOVE TO BGR
2753
        jnz     nosb5
2754
        cmp     [img_background], static_background_data
2755
        jnz     @f
2756
        test    edx, edx
2757
        jnz     .fin
2758
        cmp     esi, 4
2759
        ja      .fin
2515 mario79 2760
;--------------------------------------
2761
align 4
2762
@@:
2288 clevermous 2763
  ; bughere
2764
        mov     eax, ecx
2765
        mov     ebx, edx
2766
        add     ebx, [img_background];IMG_BACKGROUND
2767
        mov     ecx, esi
2768
        call    memmove
2515 mario79 2769
;--------------------------------------
2770
align 4
2771
.fin:
2288 clevermous 2772
        ret
2515 mario79 2773
;------------------------------------------------------------------------------
2774
align 4
2775
nosb5:
2288 clevermous 2776
        cmp     ebx, 6
2777
        jnz     nosb6
2515 mario79 2778
;--------------------------------------
2779
align 4
2288 clevermous 2780
;;Maxis use atomic bts for mutex 4.4.2009
2781
@@:
2782
        bts     dword [bgrlock], 0
2783
        jnc     @f
2784
        call    change_task
2785
        jmp     @b
2515 mario79 2786
;--------------------------------------
2787
align 4
2288 clevermous 2788
@@:
2789
        mov     eax, [CURRENT_TASK]
2790
        mov     [bgrlockpid], eax
2791
        cmp     [img_background], static_background_data
2792
        jz      .nomem
2793
        stdcall user_alloc, [mem_BACKGROUND]
2794
        mov     [esp+32], eax
2795
        test    eax, eax
2796
        jz      .nomem
2797
        mov     ebx, eax
2798
        shr     ebx, 12
2799
        or      dword [page_tabs+(ebx-1)*4], DONT_FREE_BLOCK
2800
        mov     esi, [img_background]
2801
        shr     esi, 12
2802
        mov     ecx, [mem_BACKGROUND]
2803
        add     ecx, 0xFFF
2804
        shr     ecx, 12
2515 mario79 2805
;--------------------------------------
2806
align 4
2288 clevermous 2807
.z:
2808
        mov     eax, [page_tabs+ebx*4]
2809
        test    al, 1
2810
        jz      @f
2811
        call    free_page
2515 mario79 2812
;--------------------------------------
2813
align 4
2288 clevermous 2814
@@:
2815
        mov     eax, [page_tabs+esi*4]
5356 serge 2816
        or      al, PG_UWR
2288 clevermous 2817
        mov     [page_tabs+ebx*4], eax
2818
        mov     eax, ebx
2819
        shl     eax, 12
2820
        invlpg  [eax]
2821
        inc     ebx
2822
        inc     esi
2823
        loop    .z
2824
        ret
2515 mario79 2825
;--------------------------------------
2826
align 4
2288 clevermous 2827
.nomem:
2828
        and     [bgrlockpid], 0
2829
        mov     [bgrlock], 0
2515 mario79 2830
;------------------------------------------------------------------------------
2831
align 4
2288 clevermous 2832
nosb6:
2833
        cmp     ebx, 7
2834
        jnz     nosb7
2835
        cmp     [bgrlock], 0
2836
        jz      .err
2837
        mov     eax, [CURRENT_TASK]
2838
        cmp     [bgrlockpid], eax
2839
        jnz     .err
2840
        mov     eax, ecx
2841
        mov     ebx, ecx
2842
        shr     eax, 12
2843
        mov     ecx, [page_tabs+(eax-1)*4]
2844
        test    cl, USED_BLOCK+DONT_FREE_BLOCK
2845
        jz      .err
2846
        jnp     .err
2847
        push    eax
2848
        shr     ecx, 12
2849
        dec     ecx
2515 mario79 2850
;--------------------------------------
2851
align 4
2288 clevermous 2852
@@:
2853
        and     dword [page_tabs+eax*4], 0
2854
        mov     edx, eax
2855
        shl     edx, 12
2856
        push    eax
2857
        invlpg  [edx]
2858
        pop     eax
2859
        inc     eax
2860
        loop    @b
2861
        pop     eax
2862
        and     dword [page_tabs+(eax-1)*4], not DONT_FREE_BLOCK
2863
        stdcall user_free, ebx
2864
        mov     [esp+32], eax
2865
        and     [bgrlockpid], 0
2866
        mov     [bgrlock], 0
2867
        ret
2515 mario79 2868
;--------------------------------------
2869
align 4
2288 clevermous 2870
.err:
2871
        and     dword [esp+32], 0
2872
        ret
2515 mario79 2873
;------------------------------------------------------------------------------
2874
align 4
2288 clevermous 2875
nosb7:
2515 mario79 2876
        cmp     ebx, 8
2877
        jnz     nosb8
2537 mario79 2878
 
3536 clevermous 2879
        mov     ecx, [current_slot]
2880
        xor     eax, eax
2881
        xchg    eax, [ecx+APPDATA.draw_bgr_x]
2515 mario79 2882
        mov     [esp + 32], eax ; eax = [left]*65536 + [right]
3536 clevermous 2883
        xor     eax, eax
2884
        xchg    eax, [ecx+APPDATA.draw_bgr_y]
2515 mario79 2885
        mov     [esp + 20], eax ; ebx = [top]*65536 + [bottom]
2288 clevermous 2886
        ret
2515 mario79 2887
;------------------------------------------------------------------------------
2888
align 4
2889
nosb8:
2547 mario79 2890
        cmp     ebx, 9
2891
        jnz     nosb9
2892
; ecx = [left]*65536 + [right]
2893
; edx = [top]*65536 + [bottom]
5350 serge 2894
        mov     eax, [_display.width]
2895
        mov     ebx, [_display.height]
2896
        dec     eax
2897
        dec     ebx
2547 mario79 2898
; check [right]
2899
        cmp     cx, ax
2900
        ja      .exit
2901
; check [left]
2902
        ror     ecx, 16
2903
        cmp     cx, ax
2904
        ja      .exit
2905
; check [bottom]
2906
        cmp     dx, bx
2907
        ja      .exit
2908
; check [top]
2909
        ror     edx, 16
2910
        cmp     dx, bx
2911
        ja      .exit
2912
 
2913
        movzx   eax, cx  ; [left]
2914
        movzx   ebx, dx  ; [top]
2915
 
2916
        shr     ecx, 16 ; [right]
2917
        shr     edx, 16 ; [bottom]
2918
 
2919
        mov     [background_defined], 1
2920
 
2921
        mov     [draw_data+32 + RECT.left], eax
2922
        mov     [draw_data+32 + RECT.top], ebx
2923
 
2924
        mov     [draw_data+32 + RECT.right], ecx
2925
        mov     [draw_data+32 + RECT.bottom], edx
2926
 
2927
        inc     byte[REDRAW_BACKGROUND]
3534 clevermous 2928
        call    wakeup_osloop
2547 mario79 2929
;--------------------------------------
2930
align 4
2931
.exit:
2515 mario79 2932
        ret
2933
;------------------------------------------------------------------------------
2934
align 4
2547 mario79 2935
nosb9:
2936
        ret
2937
;------------------------------------------------------------------------------
2938
align 4
2537 mario79 2939
uglobal
2940
  BG_Rect_X_left_right  dd   0x0
2941
  BG_Rect_Y_top_bottom  dd   0x0
2942
endg
2943
;------------------------------------------------------------------------------
2944
align 4
2288 clevermous 2945
force_redraw_background:
2946
        and     [draw_data+32 + RECT.left], 0
2947
        and     [draw_data+32 + RECT.top], 0
2948
        push    eax ebx
5350 serge 2949
        mov     eax, [_display.width]
2950
        mov     ebx, [_display.height]
2951
        dec     eax
2952
        dec     ebx
2288 clevermous 2953
        mov     [draw_data+32 + RECT.right], eax
2954
        mov     [draw_data+32 + RECT.bottom], ebx
2955
        pop     ebx eax
2956
        inc     byte[REDRAW_BACKGROUND]
3534 clevermous 2957
        call    wakeup_osloop
2288 clevermous 2958
        ret
2515 mario79 2959
;------------------------------------------------------------------------------
2288 clevermous 2960
align 4
2961
sys_getbackground:
2962
;    cmp   eax,1                                  ; SIZE
2963
        dec     ebx
2964
        jnz     nogb1
2965
        mov     eax, [BgrDataWidth]
2966
        shl     eax, 16
3588 Serge 2967
        mov     ax, word [BgrDataHeight]
2288 clevermous 2968
        mov     [esp+32], eax
2969
        ret
2515 mario79 2970
;------------------------------------------------------------------------------
2971
align 4
2288 clevermous 2972
nogb1:
2973
;    cmp   eax,2                                  ; PIXEL
2974
        dec     ebx
2975
        jnz     nogb2
2976
 
2977
        mov     eax, [img_background]
2978
        test    ecx, ecx
2979
        jz      @f
2980
        cmp     eax, static_background_data
2981
        jz      .ret
2515 mario79 2982
;--------------------------------------
2983
align 4
2288 clevermous 2984
@@:
2985
        mov     ebx, [mem_BACKGROUND]
2986
        add     ebx, 4095
2987
        and     ebx, -4096
2988
        sub     ebx, 4
2989
        cmp     ecx, ebx
2990
        ja      .ret
2991
 
2992
        mov     eax, [ecx+eax]
2993
 
2994
        and     eax, 0xFFFFFF
2995
        mov     [esp+32], eax
2515 mario79 2996
;--------------------------------------
2997
align 4
2288 clevermous 2998
.ret:
2999
        ret
2515 mario79 3000
;------------------------------------------------------------------------------
3001
align 4
3002
nogb2:
2288 clevermous 3003
 
3004
;    cmp   eax,4                                  ; TILED / STRETCHED
3005
        dec     ebx
3006
        dec     ebx
3007
        jnz     nogb4
3008
        mov     eax, [BgrDrawMode]
2515 mario79 3009
;--------------------------------------
3010
align 4
3011
nogb4:
2288 clevermous 3012
        mov     [esp+32], eax
3013
        ret
2515 mario79 3014
;------------------------------------------------------------------------------
2288 clevermous 3015
align 4
3016
sys_getkey:
3017
        mov     [esp + 32], dword 1
3018
        ; test main buffer
3019
        mov     ebx, [CURRENT_TASK]                          ; TOP OF WINDOW STACK
3020
        movzx   ecx, word [WIN_STACK + ebx * 2]
3021
        mov     edx, [TASK_COUNT]
3022
        cmp     ecx, edx
3023
        jne     .finish
3024
        cmp     [KEY_COUNT], byte 0
3025
        je      .finish
4588 mario79 3026
        movzx   ax, byte [KEY_BUFF + 120 + 2]
2288 clevermous 3027
        shl     eax, 8
4588 mario79 3028
        mov     al, byte [KEY_BUFF]
3029
        shl     eax, 8
2288 clevermous 3030
        push    eax
3031
        dec     byte [KEY_COUNT]
3032
        and     byte [KEY_COUNT], 127
3033
        movzx   ecx, byte [KEY_COUNT]
3034
        add     ecx, 2
3035
        mov     eax, KEY_BUFF + 1
3036
        mov     ebx, KEY_BUFF
3037
        call    memmove
4588 mario79 3038
        add     eax, 120 + 2
3039
        add     ebx, 120 + 2
3040
        call    memmove
2288 clevermous 3041
        pop     eax
2515 mario79 3042
;--------------------------------------
3043
align 4
2288 clevermous 3044
.ret_eax:
3045
        mov     [esp + 32], eax
3046
        ret
2515 mario79 3047
;--------------------------------------
3048
align 4
2288 clevermous 3049
.finish:
3050
; test hotkeys buffer
3051
        mov     ecx, hotkey_buffer
2515 mario79 3052
;--------------------------------------
3053
align 4
2288 clevermous 3054
@@:
3055
        cmp     [ecx], ebx
3056
        jz      .found
3057
        add     ecx, 8
3058
        cmp     ecx, hotkey_buffer + 120 * 8
3059
        jb      @b
3060
        ret
2515 mario79 3061
;--------------------------------------
3062
align 4
2288 clevermous 3063
.found:
3064
        mov     ax, [ecx + 6]
3065
        shl     eax, 16
3066
        mov     ah, [ecx + 4]
3067
        mov     al, 2
3068
        and     dword [ecx + 4], 0
3069
        and     dword [ecx], 0
3070
        jmp     .ret_eax
2515 mario79 3071
;------------------------------------------------------------------------------
2288 clevermous 3072
align 4
3073
sys_getbutton:
3074
        mov     ebx, [CURRENT_TASK]                         ; TOP OF WINDOW STACK
3075
        mov     [esp + 32], dword 1
3076
        movzx   ecx, word [WIN_STACK + ebx * 2]
3077
        mov     edx, [TASK_COUNT] ; less than 256 processes
3078
        cmp     ecx, edx
3079
        jne     .exit
3080
        movzx   eax, byte [BTN_COUNT]
3081
        test    eax, eax
3082
        jz      .exit
3083
        mov     eax, [BTN_BUFF]
3084
        and     al, 0xFE                                    ; delete left button bit
3085
        mov     [BTN_COUNT], byte 0
3086
        mov     [esp + 32], eax
2515 mario79 3087
;--------------------------------------
3088
align 4
2288 clevermous 3089
.exit:
3090
        ret
2515 mario79 3091
;------------------------------------------------------------------------------
2288 clevermous 3092
align 4
3093
sys_cpuusage:
3094
 
3095
;  RETURN:
3096
;
3097
;  +00 dword     process cpu usage
3098
;  +04  word     position in windowing stack
3099
;  +06  word     windowing stack value at current position (cpu nro)
3100
;  +10 12 bytes  name
3101
;  +22 dword     start in mem
3102
;  +26 dword     used mem
3103
;  +30 dword     PID , process idenfification number
3104
;
3105
 
3106
        cmp     ecx, -1 ; who am I ?
3107
        jne     .no_who_am_i
3108
        mov     ecx, [CURRENT_TASK]
3109
  .no_who_am_i:
3110
        cmp     ecx, max_processes
3111
        ja      .nofillbuf
3112
 
3113
; +4: word: position of the window of thread in the window stack
3114
        mov     ax, [WIN_STACK + ecx * 2]
3115
        mov     [ebx+4], ax
3116
; +6: word: number of the thread slot, which window has in the window stack
3117
;           position ecx (has no relation to the specific thread)
3118
        mov     ax, [WIN_POS + ecx * 2]
3119
        mov     [ebx+6], ax
3120
 
3121
        shl     ecx, 5
3122
 
3123
; +0: dword: memory usage
3124
        mov     eax, [ecx+CURRENT_TASK+TASKDATA.cpu_usage]
3125
        mov     [ebx], eax
3126
; +10: 11 bytes: name of the process
3127
        push    ecx
3128
        lea     eax, [ecx*8+SLOT_BASE+APPDATA.app_name]
3129
        add     ebx, 10
3130
        mov     ecx, 11
3131
        call    memmove
3132
        pop     ecx
3133
 
3134
; +22: address of the process in memory
3135
; +26: size of used memory - 1
3136
        push    edi
3137
        lea     edi, [ebx+12]
3138
        xor     eax, eax
3139
        mov     edx, 0x100000*16
3140
        cmp     ecx, 1 shl 5
3141
        je      .os_mem
5130 serge 3142
        mov     edx, [SLOT_BASE+ecx*8+APPDATA.process]
3143
        mov     edx, [edx+PROC.mem_used]
2288 clevermous 3144
        mov     eax, std_application_base_address
3145
.os_mem:
3146
        stosd
3147
        lea     eax, [edx-1]
3148
        stosd
3149
 
3150
; +30: PID/TID
3151
        mov     eax, [ecx+CURRENT_TASK+TASKDATA.pid]
3152
        stosd
3153
 
3154
    ; window position and size
3155
        push    esi
3156
        lea     esi, [ecx + window_data + WDATA.box]
3157
        movsd
3158
        movsd
3159
        movsd
3160
        movsd
3161
 
3162
    ; Process state (+50)
3163
        mov     eax, dword [ecx+CURRENT_TASK+TASKDATA.state]
3164
        stosd
3165
 
3166
    ; Window client area box
3167
        lea     esi, [ecx*8 + SLOT_BASE + APPDATA.wnd_clientbox]
3168
        movsd
3169
        movsd
3170
        movsd
3171
        movsd
3172
 
3173
    ; Window state
3174
        mov     al, [ecx+window_data+WDATA.fl_wstate]
3175
        stosb
3176
 
3177
    ; Event mask (+71)
3178
        mov     EAX, dword [ECX+CURRENT_TASK+TASKDATA.event_mask]
3179
        stosd
4286 Serge 3180
 
4262 0CodErr 3181
    ; Keyboard mode (+75)
3182
        mov     al, byte [ecx*8 + SLOT_BASE + APPDATA.keyboard_mode]
4286 Serge 3183
        stosb
2288 clevermous 3184
 
3185
        pop     esi
3186
        pop     edi
3187
 
3188
.nofillbuf:
3189
    ; return number of processes
3190
 
3191
        mov     eax, [TASK_COUNT]
3192
        mov     [esp+32], eax
3193
        ret
3194
 
3195
align 4
3196
sys_clock:
3197
        cli
3198
  ; Mikhail Lisovin  xx Jan 2005
3199
  @@:
3200
        mov     al, 10
3201
        out     0x70, al
3202
        in      al, 0x71
3203
        test    al, al
3204
        jns     @f
3205
        mov     esi, 1
3206
        call    delay_ms
3207
        jmp     @b
3208
  @@:
3209
  ; end Lisovin's fix
3210
 
3211
        xor     al, al        ; seconds
3212
        out     0x70, al
3213
        in      al, 0x71
3214
        movzx   ecx, al
3215
        mov     al, 02        ; minutes
3216
        shl     ecx, 16
3217
        out     0x70, al
3218
        in      al, 0x71
3219
        movzx   edx, al
3220
        mov     al, 04        ; hours
3221
        shl     edx, 8
3222
        out     0x70, al
3223
        in      al, 0x71
3224
        add     ecx, edx
3225
        movzx   edx, al
3226
        add     ecx, edx
3227
        sti
3228
        mov     [esp + 32], ecx
3229
        ret
3230
 
3231
 
3232
align 4
3233
 
3234
sys_date:
3235
 
3236
        cli
3237
  @@:
3238
        mov     al, 10
3239
        out     0x70, al
3240
        in      al, 0x71
3241
        test    al, al
3242
        jns     @f
3243
        mov     esi, 1
3244
        call    delay_ms
3245
        jmp     @b
3246
  @@:
3247
 
3248
        mov     ch, 0
3249
        mov     al, 7           ; date
3250
        out     0x70, al
3251
        in      al, 0x71
3252
        mov     cl, al
3253
        mov     al, 8           ; month
3254
        shl     ecx, 16
3255
        out     0x70, al
3256
        in      al, 0x71
3257
        mov     ch, al
3258
        mov     al, 9           ; year
3259
        out     0x70, al
3260
        in      al, 0x71
3261
        mov     cl, al
3262
        sti
3263
        mov     [esp+32], ecx
3264
        ret
3265
 
3266
 
3267
; redraw status
3268
 
3269
sys_redrawstat:
3270
        cmp     ebx, 1
3271
        jne     no_widgets_away
3272
        ; buttons away
3273
        mov     ecx, [CURRENT_TASK]
3274
  sys_newba2:
3275
        mov     edi, [BTN_ADDR]
3276
        cmp     [edi], dword 0  ; empty button list ?
3277
        je      end_of_buttons_away
3278
        movzx   ebx, word [edi]
3279
        inc     ebx
3280
        mov     eax, edi
3281
  sys_newba:
3282
        dec     ebx
3283
        jz      end_of_buttons_away
3284
 
3285
        add     eax, 0x10
3286
        cmp     cx, [eax]
3287
        jnz     sys_newba
3288
 
3289
        push    eax ebx ecx
3290
        mov     ecx, ebx
3291
        inc     ecx
3292
        shl     ecx, 4
3293
        mov     ebx, eax
3294
        add     eax, 0x10
3295
        call    memmove
3296
        dec     dword [edi]
3297
        pop     ecx ebx eax
3298
 
3299
        jmp     sys_newba2
3300
 
3301
  end_of_buttons_away:
3302
 
3303
        ret
3304
 
3305
  no_widgets_away:
3306
 
3307
        cmp     ebx, 2
3308
        jnz     srl1
3309
 
3310
        mov     edx, [TASK_BASE]      ; return whole screen draw area for this app
3311
        add     edx, draw_data - CURRENT_TASK
3312
        mov     [edx + RECT.left], 0
3313
        mov     [edx + RECT.top], 0
5350 serge 3314
        mov     eax, [_display.width]
3315
        dec     eax
2288 clevermous 3316
        mov     [edx + RECT.right], eax
5350 serge 3317
        mov     eax, [_display.height]
3318
        dec     eax
2288 clevermous 3319
        mov     [edx + RECT.bottom], eax
3320
 
3321
  srl1:
3322
        ret
3323
 
3324
;ok - 100% work
3325
;nt - not tested
3326
;---------------------------------------------------------------------------------------------
3327
;eax
3328
;0 - task switch counter. Ret switch counter in eax. Block. ok.
3329
;1 - change task. Ret nothing. Block. ok.
3330
;2 - performance control
3331
; ebx
3332
; 0 - enable or disable (inversion) PCE flag on CR4 for rdmpc in user mode.
3333
; returned new cr4 in eax. Ret cr4 in eax. Block. ok.
3334
; 1 - is cache enabled. Ret cr0 in eax if enabled else zero in eax. Block. ok.
3335
; 2 - enable cache. Ret 1 in eax. Ret nothing. Block. ok.
3336
; 3 - disable cache. Ret 0 in eax. Ret nothing. Block. ok.
3337
;eax
3338
;3 - rdmsr. Counter in edx. (edx:eax) [esi:edi, edx] => [edx:esi, ecx]. Ret in ebx:eax. Block. ok.
3339
;4 - wrmsr. Counter in edx. (edx:eax) [esi:edi, edx] => [edx:esi, ecx]. Ret in ebx:eax. Block. ok.
3340
;---------------------------------------------------------------------------------------------
3341
iglobal
3342
align 4
3343
sheduler:
3344
        dd      sys_sheduler.00
3345
        dd      change_task
3346
        dd      sys_sheduler.02
3347
        dd      sys_sheduler.03
3348
        dd      sys_sheduler.04
3349
endg
3350
sys_sheduler:
3351
;rewritten by   29.12.2009
3352
        jmp     dword [sheduler+ebx*4]
3353
;.shed_counter:
3354
.00:
3355
        mov     eax, [context_counter]
3356
        mov     [esp+32], eax
3357
        ret
3358
 
3359
.02:
3360
;.perf_control:
3361
        inc     ebx                     ;before ebx=2, ebx=3
3362
        cmp     ebx, ecx                ;if ecx=3, ebx=3
3363
        jz      cache_disable
3364
 
3365
        dec     ebx                     ;ebx=2
3366
        cmp     ebx, ecx                ;
3367
        jz      cache_enable            ;if ecx=2 and ebx=2
3368
 
3369
        dec     ebx                     ;ebx=1
3370
        cmp     ebx, ecx
3371
        jz      is_cache_enabled        ;if ecx=1 and ebx=1
3372
 
3373
        dec     ebx
3374
        test    ebx, ecx                ;ebx=0 and ecx=0
3375
        jz      modify_pce              ;if ecx=0
3376
 
3377
        ret
3378
 
3379
.03:
3380
;.rdmsr_instr:
3381
;now counter in ecx
3382
;(edx:eax) esi:edi => edx:esi
3383
        mov     eax, esi
3384
        mov     ecx, edx
3385
        rdmsr
3386
        mov     [esp+32], eax
3387
        mov     [esp+20], edx           ;ret in ebx?
3388
        ret
3389
 
3390
.04:
3391
;.wrmsr_instr:
3392
;now counter in ecx
3393
;(edx:eax) esi:edi => edx:esi
3394
        ; Fast Call MSR can't be destroy
3539 clevermous 3395
        ; Но MSR_AMD_EFER можно изменять, т.к. в этом регистре лиш
3396
        ; включаются/выключаются расширенные возможности
2288 clevermous 3397
        cmp     edx, MSR_SYSENTER_CS
3398
        je      @f
3399
        cmp     edx, MSR_SYSENTER_ESP
3400
        je      @f
3401
        cmp     edx, MSR_SYSENTER_EIP
3402
        je      @f
3403
        cmp     edx, MSR_AMD_STAR
3404
        je      @f
3405
 
3406
        mov     eax, esi
3407
        mov     ecx, edx
3408
        wrmsr
3409
        ; mov   [esp + 32], eax
3410
        ; mov   [esp + 20], edx ;ret in ebx?
3411
@@:
3412
        ret
3413
 
3414
cache_disable:
3415
        mov     eax, cr0
3416
        or      eax, 01100000000000000000000000000000b
3417
        mov     cr0, eax
3418
        wbinvd  ;set MESI
3419
        ret
3420
 
3421
cache_enable:
3422
        mov     eax, cr0
3423
        and     eax, 10011111111111111111111111111111b
3424
        mov     cr0, eax
3425
        ret
3426
 
3427
is_cache_enabled:
3428
        mov     eax, cr0
3429
        mov     ebx, eax
3430
        and     eax, 01100000000000000000000000000000b
3431
        jz      cache_disabled
3432
        mov     [esp+32], ebx
3433
cache_disabled:
3434
        mov     dword [esp+32], eax;0
3435
        ret
3436
 
3437
modify_pce:
3438
        mov     eax, cr4
3439
;       mov ebx,0
3440
;       or  bx,100000000b ;pce
3441
;       xor eax,ebx ;invert pce
3442
        bts     eax, 8;pce=cr4[8]
3443
        mov     cr4, eax
3444
        mov     [esp+32], eax
3445
        ret
3446
;---------------------------------------------------------------------------------------------
3447
 
3448
 
3449
iglobal
3450
  cpustring db 'CPU',0
3451
endg
3452
 
3453
uglobal
3454
background_defined    db    0    ; diamond, 11.04.2006
3455
endg
2513 mario79 3456
;-----------------------------------------------------------------------------
2288 clevermous 3457
align 4
3458
checkmisc:
3459
        cmp     [ctrl_alt_del], 1
3460
        jne     nocpustart
3461
 
3462
        mov     ebp, cpustring
3463
        call    fs_execute_from_sysdir
3464
 
3465
        mov     [ctrl_alt_del], 0
2513 mario79 3466
;--------------------------------------
3467
align 4
2288 clevermous 3468
nocpustart:
3469
        cmp     [mouse_active], 1
3470
        jne     mouse_not_active
3471
        mov     [mouse_active], 0
2411 Serge 3472
 
2288 clevermous 3473
        xor     edi, edi
2411 Serge 3474
        mov     ebx, CURRENT_TASK
3475
 
2288 clevermous 3476
        mov     ecx, [TASK_COUNT]
2408 Serge 3477
        movzx   eax, word [WIN_POS + ecx*2]     ; active window
3478
        shl     eax, 8
2414 Serge 3479
        push    eax
2408 Serge 3480
 
2414 Serge 3481
        movzx   eax, word [MOUSE_X]
3482
        movzx   edx, word [MOUSE_Y]
2513 mario79 3483
;--------------------------------------
2408 Serge 3484
align 4
3485
.set_mouse_event:
2288 clevermous 3486
        add     edi, 256
2411 Serge 3487
        add     ebx, 32
3488
        test    [ebx+TASKDATA.event_mask], 0x80000000
2414 Serge 3489
        jz      .pos_filter
3490
 
3491
        cmp     edi, [esp]                      ; skip if filtration active
3492
        jne     .skip
2513 mario79 3493
;--------------------------------------
3494
align 4
2414 Serge 3495
.pos_filter:
3496
        test    [ebx+TASKDATA.event_mask], 0x40000000
2411 Serge 3497
        jz      .set
2288 clevermous 3498
 
2414 Serge 3499
        mov     esi, [ebx-twdw+WDATA.box.left]
3500
        cmp     eax, esi
3501
        jb      .skip
3502
        add     esi, [ebx-twdw+WDATA.box.width]
3503
        cmp     eax, esi
3504
        ja      .skip
3505
 
3506
        mov     esi, [ebx-twdw+WDATA.box.top]
3507
        cmp     edx, esi
3508
        jb      .skip
3509
        add     esi, [ebx-twdw+WDATA.box.height]
3510
        cmp     edx, esi
3511
        ja      .skip
2513 mario79 3512
;--------------------------------------
3513
align 4
2411 Serge 3514
.set:
2513 mario79 3515
        or      [edi+SLOT_BASE+APPDATA.event_mask], 100000b  ; set event 6
3516
;--------------------------------------
3517
align 4
2411 Serge 3518
.skip:
2408 Serge 3519
        loop    .set_mouse_event
3520
 
2414 Serge 3521
        pop     eax
2513 mario79 3522
;--------------------------------------
3523
align 4
2288 clevermous 3524
mouse_not_active:
2580 mario79 3525
        cmp     byte[REDRAW_BACKGROUND], 0         ; background update ?
2288 clevermous 3526
        jz      nobackgr
2524 mario79 3527
 
2288 clevermous 3528
        cmp     [background_defined], 0
3529
        jz      nobackgr
2513 mario79 3530
;--------------------------------------
3531
align 4
3536 clevermous 3532
backgr:
2537 mario79 3533
        mov     eax, [draw_data+32 + RECT.left]
3534
        shl     eax, 16
3535
        add     eax, [draw_data+32 + RECT.right]
3536
        mov     [BG_Rect_X_left_right], eax ; [left]*65536 + [right]
3537
 
3538
        mov     eax, [draw_data+32 + RECT.top]
3539
        shl     eax, 16
3540
        add     eax, [draw_data+32 + RECT.bottom]
3541
        mov     [BG_Rect_Y_top_bottom], eax ; [top]*65536 + [bottom]
3542
 
2288 clevermous 3543
        call    drawbackground
2580 mario79 3544
;        DEBUGF  1, "K : drawbackground\n"
2620 mario79 3545
;        DEBUGF  1, "K : backg x %x\n",[BG_Rect_X_left_right]
3546
;        DEBUGF  1, "K : backg y %x\n",[BG_Rect_Y_top_bottom]
2513 mario79 3547
;--------- set event 5 start ----------
3548
        push    ecx edi
3549
        xor     edi, edi
3550
        mov     ecx, [TASK_COUNT]
3551
;--------------------------------------
3552
align 4
3553
set_bgr_event:
3554
        add     edi, 256
3536 clevermous 3555
        mov     eax, [BG_Rect_X_left_right]
3556
        mov     edx, [BG_Rect_Y_top_bottom]
3557
        cmp     [edi+SLOT_BASE+APPDATA.draw_bgr_x], 0
3558
        jz      .set
3559
.join:
3611 clevermous 3560
        cmp     word [edi+SLOT_BASE+APPDATA.draw_bgr_x], ax
3561
        jae     @f
3562
        mov     word [edi+SLOT_BASE+APPDATA.draw_bgr_x], ax
3563
@@:
3564
        shr     eax, 16
3536 clevermous 3565
        cmp     word [edi+SLOT_BASE+APPDATA.draw_bgr_x+2], ax
3566
        jbe     @f
3567
        mov     word [edi+SLOT_BASE+APPDATA.draw_bgr_x+2], ax
3568
@@:
3611 clevermous 3569
        cmp     word [edi+SLOT_BASE+APPDATA.draw_bgr_y], dx
3536 clevermous 3570
        jae     @f
3611 clevermous 3571
        mov     word [edi+SLOT_BASE+APPDATA.draw_bgr_y], dx
3536 clevermous 3572
@@:
3611 clevermous 3573
        shr     edx, 16
3536 clevermous 3574
        cmp     word [edi+SLOT_BASE+APPDATA.draw_bgr_y+2], dx
3575
        jbe     @f
3576
        mov     word [edi+SLOT_BASE+APPDATA.draw_bgr_y+2], dx
3577
@@:
3578
        jmp     .common
3579
.set:
3580
        mov     [edi+SLOT_BASE+APPDATA.draw_bgr_x], eax
3581
        mov     [edi+SLOT_BASE+APPDATA.draw_bgr_y], edx
3582
.common:
2513 mario79 3583
        or      [edi+SLOT_BASE+APPDATA.event_mask], 10000b  ; set event 5
3584
        loop    set_bgr_event
3585
        pop     edi ecx
3586
;--------- set event 5 stop -----------
2580 mario79 3587
        dec     byte[REDRAW_BACKGROUND]    ; got new update request?
3536 clevermous 3588
        jnz     backgr
2513 mario79 3589
 
3536 clevermous 3590
        xor     eax, eax
2288 clevermous 3591
        mov     [draw_data+32 + RECT.left], eax
3592
        mov     [draw_data+32 + RECT.top], eax
3593
        mov     [draw_data+32 + RECT.right], eax
3594
        mov     [draw_data+32 + RECT.bottom], eax
2513 mario79 3595
;--------------------------------------
3596
align 4
2288 clevermous 3597
nobackgr:
2513 mario79 3598
; system shutdown request
2288 clevermous 3599
        cmp     [SYS_SHUTDOWN], byte 0
3600
        je      noshutdown
3601
 
3602
        mov     edx, [shutdown_processes]
3603
 
3604
        cmp     [SYS_SHUTDOWN], dl
3325 clevermous 3605
        jne     noshutdown
2288 clevermous 3606
 
3607
        lea     ecx, [edx-1]
3608
        mov     edx, OS_BASE+0x3040
3325 clevermous 3609
        jecxz   no_mark_system_shutdown
2513 mario79 3610
;--------------------------------------
3611
align 4
2288 clevermous 3612
markz:
3296 clevermous 3613
        push    ecx edx
3325 clevermous 3614
        cmp     [edx+TASKDATA.state], 9
3615
        jz      .nokill
3616
        lea     edx, [(edx-(CURRENT_TASK and 1FFFFFFFh))*8+SLOT_BASE]
5130 serge 3617
        cmp     [edx+APPDATA.process], sys_proc
3325 clevermous 3618
        jz      .nokill
3296 clevermous 3619
        call    request_terminate
3325 clevermous 3620
        jmp     .common
3621
.nokill:
3622
        dec     byte [SYS_SHUTDOWN]
3623
        xor     eax, eax
3624
.common:
3296 clevermous 3625
        pop     edx ecx
3626
        test    eax, eax
3627
        jz      @f
2288 clevermous 3628
        mov     [edx+TASKDATA.state], byte 3
3296 clevermous 3629
@@:
2288 clevermous 3630
        add     edx, 0x20
3631
        loop    markz
3534 clevermous 3632
        call    wakeup_osloop
2513 mario79 3633
;--------------------------------------
3634
align 4
2288 clevermous 3635
@@:
2513 mario79 3636
no_mark_system_shutdown:
2288 clevermous 3637
        dec     byte [SYS_SHUTDOWN]
3638
        je      system_shutdown
2513 mario79 3639
;--------------------------------------
3640
align 4
2288 clevermous 3641
noshutdown:
3642
        mov     eax, [TASK_COUNT]           ; termination
3643
        mov     ebx, TASK_DATA+TASKDATA.state
3644
        mov     esi, 1
2513 mario79 3645
;--------------------------------------
3646
align 4
2288 clevermous 3647
newct:
3648
        mov     cl, [ebx]
3649
        cmp     cl, byte 3
3325 clevermous 3650
        jz      .terminate
2513 mario79 3651
 
2288 clevermous 3652
        cmp     cl, byte 4
3325 clevermous 3653
        jnz     .noterminate
3654
.terminate:
3655
        pushad
3493 mario79 3656
        mov     ecx, eax
3657
        shl     ecx, 8
3658
        add     ecx, SLOT_BASE
3659
        call    restore_default_cursor_before_killing
3660
        popad
3661
 
3662
        pushad
3325 clevermous 3663
        call    terminate
3664
        popad
3665
        cmp     byte [SYS_SHUTDOWN], 0
3666
        jz      .noterminate
3667
        dec     byte [SYS_SHUTDOWN]
3668
        je      system_shutdown
2288 clevermous 3669
 
3325 clevermous 3670
.noterminate:
2288 clevermous 3671
        add     ebx, 0x20
3672
        inc     esi
3673
        dec     eax
3674
        jnz     newct
3675
        ret
2513 mario79 3676
;-----------------------------------------------------------------------------
3677
align 4
2288 clevermous 3678
redrawscreen:
3679
; eax , if process window_data base is eax, do not set flag/limits
3680
 
3681
        pushad
3682
        push    eax
3683
 
3684
;;;         mov   ebx,2
3685
;;;         call  delay_hs
3686
 
3687
         ;mov   ecx,0               ; redraw flags for apps
3688
        xor     ecx, ecx
2513 mario79 3689
;--------------------------------------
3690
align 4
3691
newdw2:
2288 clevermous 3692
        inc     ecx
3693
        push    ecx
3694
 
3695
        mov     eax, ecx
3696
        shl     eax, 5
3697
        add     eax, window_data
3698
 
3699
        cmp     eax, [esp+4]
3700
        je      not_this_task
3701
                                   ; check if window in redraw area
3702
        mov     edi, eax
3703
 
3704
        cmp     ecx, 1             ; limit for background
3705
        jz      bgli
3706
 
3707
        mov     eax, [edi + WDATA.box.left]
3708
        mov     ebx, [edi + WDATA.box.top]
3709
 
3710
        mov     ecx, [draw_limits.bottom] ; ecx = area y end     ebx = window y start
3711
        cmp     ecx, ebx
3712
        jb      ricino
3713
 
3714
        mov     ecx, [draw_limits.right] ; ecx = area x end     eax = window x start
3715
        cmp     ecx, eax
3716
        jb      ricino
3717
 
3718
        mov     eax, [edi + WDATA.box.left]
3719
        mov     ebx, [edi + WDATA.box.top]
3720
        mov     ecx, [edi + WDATA.box.width]
3721
        mov     edx, [edi + WDATA.box.height]
3722
        add     ecx, eax
3723
        add     edx, ebx
3724
 
3725
        mov     eax, [draw_limits.top]  ; eax = area y start     edx = window y end
3726
        cmp     edx, eax
3727
        jb      ricino
3728
 
3729
        mov     eax, [draw_limits.left]  ; eax = area x start     ecx = window x end
3730
        cmp     ecx, eax
3731
        jb      ricino
2513 mario79 3732
;--------------------------------------
3733
align 4
3734
bgli:
2288 clevermous 3735
        cmp     dword[esp], 1
3736
        jnz     .az
2513 mario79 3737
 
2288 clevermous 3738
        cmp     byte[REDRAW_BACKGROUND], 0
3739
        jz      .az
2513 mario79 3740
 
2288 clevermous 3741
        mov     dl, 0
3742
        lea     eax, [edi+draw_data-window_data]
3743
        mov     ebx, [draw_limits.left]
3744
        cmp     ebx, [eax+RECT.left]
3745
        jae     @f
2513 mario79 3746
 
2288 clevermous 3747
        mov     [eax+RECT.left], ebx
3748
        mov     dl, 1
2513 mario79 3749
;--------------------------------------
3750
align 4
3751
@@:
2288 clevermous 3752
        mov     ebx, [draw_limits.top]
3753
        cmp     ebx, [eax+RECT.top]
3754
        jae     @f
2513 mario79 3755
 
2288 clevermous 3756
        mov     [eax+RECT.top], ebx
3757
        mov     dl, 1
2513 mario79 3758
;--------------------------------------
3759
align 4
3760
@@:
2288 clevermous 3761
        mov     ebx, [draw_limits.right]
3762
        cmp     ebx, [eax+RECT.right]
3763
        jbe     @f
2513 mario79 3764
 
2288 clevermous 3765
        mov     [eax+RECT.right], ebx
3766
        mov     dl, 1
2513 mario79 3767
;--------------------------------------
3768
align 4
3769
@@:
2288 clevermous 3770
        mov     ebx, [draw_limits.bottom]
3771
        cmp     ebx, [eax+RECT.bottom]
3772
        jbe     @f
2513 mario79 3773
 
2288 clevermous 3774
        mov     [eax+RECT.bottom], ebx
3775
        mov     dl, 1
2513 mario79 3776
;--------------------------------------
3777
align 4
3778
@@:
2288 clevermous 3779
        add     byte[REDRAW_BACKGROUND], dl
3534 clevermous 3780
        call    wakeup_osloop
2288 clevermous 3781
        jmp     newdw8
2513 mario79 3782
;--------------------------------------
3783
align 4
3784
.az:
2288 clevermous 3785
        mov     eax, edi
3786
        add     eax, draw_data-window_data
3787
 
3788
        mov     ebx, [draw_limits.left]        ; set limits
3789
        mov     [eax + RECT.left], ebx
3790
        mov     ebx, [draw_limits.top]
3791
        mov     [eax + RECT.top], ebx
3792
        mov     ebx, [draw_limits.right]
3793
        mov     [eax + RECT.right], ebx
3794
        mov     ebx, [draw_limits.bottom]
3795
        mov     [eax + RECT.bottom], ebx
3796
 
3797
        sub     eax, draw_data-window_data
3798
 
3799
        cmp     dword [esp], 1
3800
        jne     nobgrd
3801
        inc     byte[REDRAW_BACKGROUND]
3534 clevermous 3802
        call    wakeup_osloop
2513 mario79 3803
;--------------------------------------
3804
align 4
3805
newdw8:
3806
nobgrd:
3936 mario79 3807
;--------------------------------------
3808
        push    eax  edi ebp
3809
        mov     edi, [esp+12]
3810
        cmp     edi, 1
3811
        je      .found
2288 clevermous 3812
 
3936 mario79 3813
        mov     eax, [draw_limits.left]
3814
        mov     ebx, [draw_limits.top]
3815
        mov     ecx, [draw_limits.right]
3816
        sub     ecx, eax
3817
        test    ecx, ecx
3818
        jz      .not_found
3819
 
3820
        mov     edx, [draw_limits.bottom]
3821
        sub     edx, ebx
3822
        test    edx, edx
3823
        jz      .not_found
3824
 
3825
; eax - x, ebx - y
3826
; ecx - size x, edx - size y
3827
        add     ebx, edx
3828
;--------------------------------------
3829
align 4
3830
.start_y:
3831
        push    ecx
3832
;--------------------------------------
3833
align 4
3834
.start_x:
3835
        add     eax, ecx
3836
        mov     ebp, [d_width_calc_area + ebx*4]
5351 serge 3837
        add     ebp, [_display.win_map]
3936 mario79 3838
        movzx   ebp, byte[eax+ebp] ; get value for current point
3839
        cmp     ebp, edi
3840
        jne     @f
3841
 
3842
        pop     ecx
3843
        jmp     .found
3844
;--------------------------------------
3845
align 4
3846
@@:
3847
        sub     eax, ecx
3848
 
3849
        dec     ecx
3850
        jnz     .start_x
3851
 
3852
        pop     ecx
3853
        dec     ebx
3854
        dec     edx
3855
        jnz     .start_y
3856
;--------------------------------------
3857
align 4
3858
.not_found:
3859
        pop     ebp edi eax
3860
        jmp     ricino
3861
;--------------------------------------
3862
align 4
3863
.found:
3864
        pop     ebp edi eax
3865
 
2288 clevermous 3866
        mov     [eax + WDATA.fl_redraw], byte 1  ; mark as redraw
2513 mario79 3867
;--------------------------------------
3868
align 4
3869
ricino:
3870
not_this_task:
2288 clevermous 3871
        pop     ecx
3872
 
3873
        cmp     ecx, [TASK_COUNT]
3874
        jle     newdw2
3875
 
3876
        pop     eax
3877
        popad
3878
        ret
2513 mario79 3879
;-----------------------------------------------------------------------------
3880
align 4
2288 clevermous 3881
calculatebackground:   ; background
5351 serge 3882
        mov     edi, [_display.win_map]              ; set os to use all pixels
2288 clevermous 3883
        mov     eax, 0x01010101
5351 serge 3884
        mov     ecx, [_display.win_map_size]
2288 clevermous 3885
        shr     ecx, 2
3886
        rep stosd
3887
 
3888
        mov     byte[REDRAW_BACKGROUND], 0            ; do not draw background!
3889
        ret
2513 mario79 3890
;-----------------------------------------------------------------------------
2288 clevermous 3891
uglobal
3892
  imax    dd 0x0
3893
endg
2513 mario79 3894
;-----------------------------------------------------------------------------
3895
align 4
2288 clevermous 3896
delay_ms:     ; delay in 1/1000 sec
3897
        push    eax
3898
        push    ecx
3899
 
3900
        mov     ecx, esi
3901
        ; 
3902
        imul    ecx, 33941
3903
        shr     ecx, 9
3904
        ; 
3905
 
3906
        in      al, 0x61
3907
        and     al, 0x10
3908
        mov     ah, al
3909
        cld
2513 mario79 3910
;--------------------------------------
3911
align 4
3912
cnt1:
2288 clevermous 3913
        in      al, 0x61
3914
        and     al, 0x10
3915
        cmp     al, ah
3916
        jz      cnt1
3917
 
3918
        mov     ah, al
3919
        loop    cnt1
3920
 
3921
        pop     ecx
3922
        pop     eax
3923
        ret
2513 mario79 3924
;-----------------------------------------------------------------------------
2411 Serge 3925
align 4
2288 clevermous 3926
set_app_param:
3927
        mov     edi, [TASK_BASE]
2408 Serge 3928
        mov     eax, ebx
3929
        btr     eax, 3                           ; move MOUSE_FILTRATION
3930
        mov     ebx, [current_slot]              ; bit into event_filter
3931
        setc    byte [ebx+APPDATA.event_filter]
3932
        xchg    eax, [edi + TASKDATA.event_mask] ; set new event mask
3933
        mov     [esp+32], eax                    ; return old mask value
2288 clevermous 3934
        ret
2513 mario79 3935
;-----------------------------------------------------------------------------
3303 clevermous 3936
 
3937
; this is for syscall
3938
proc delay_hs_unprotected
3939
        call    unprotect_from_terminate
3940
        call    delay_hs
3941
        call    protect_from_terminate
3942
        ret
3943
endp
3944
 
3597 Serge 3945
if 1
2513 mario79 3946
align 4
2288 clevermous 3947
delay_hs:     ; delay in 1/100 secs
3948
; ebx = delay time
3949
 
3595 Serge 3950
        pushad
3951
        push    ebx
3952
        xor     esi, esi
3953
        mov     ecx, MANUAL_DESTROY
3954
        call    create_event
3955
        test    eax, eax
3956
        jz      .done
2288 clevermous 3957
 
3595 Serge 3958
        mov     ebx, edx
3959
        mov     ecx, [esp]
3597 Serge 3960
        push    edx
3595 Serge 3961
        push    eax
3962
        call    wait_event_timeout
3963
        pop     eax
3597 Serge 3964
        pop     ebx
3595 Serge 3965
        call    destroy_event
3966
.done:
3967
        add     esp, 4
3968
        popad
2288 clevermous 3969
        ret
3596 Serge 3970
 
3971
else
3972
 
3973
align 4
3974
delay_hs:     ; delay in 1/100 secs
3975
; ebx = delay time
3976
        push    ecx
3977
        push    edx
3978
 
3979
        mov     edx, [timer_ticks]
3980
;--------------------------------------
3981
align 4
3982
newtic:
3983
        mov     ecx, [timer_ticks]
3984
        sub     ecx, edx
3985
        cmp     ecx, ebx
3986
        jae     zerodelay
3987
 
3988
        call    change_task
3989
 
3990
        jmp     newtic
3991
;--------------------------------------
3992
align 4
3993
zerodelay:
3994
        pop     edx
3995
        pop     ecx
3996
        ret
3997
end if
3998
 
2513 mario79 3999
;-----------------------------------------------------------------------------
2288 clevermous 4000
align 16        ;very often call this subrutine
4001
memmove:       ; memory move in bytes
4002
; eax = from
4003
; ebx = to
4004
; ecx = no of bytes
4005
        test    ecx, ecx
4006
        jle     .ret
4007
 
4008
        push    esi edi ecx
4009
 
4010
        mov     edi, ebx
4011
        mov     esi, eax
4012
 
4013
        test    ecx, not 11b
4014
        jz      @f
4015
 
4016
        push    ecx
4017
        shr     ecx, 2
4018
        rep movsd
4019
        pop     ecx
4020
        and     ecx, 11b
4021
        jz      .finish
2513 mario79 4022
;--------------------------------------
4023
align 4
4024
@@:
2288 clevermous 4025
        rep movsb
2513 mario79 4026
;--------------------------------------
4027
align 4
4028
.finish:
2288 clevermous 4029
        pop     ecx edi esi
2513 mario79 4030
;--------------------------------------
4031
align 4
4032
.ret:
2288 clevermous 4033
        ret
2513 mario79 4034
;-----------------------------------------------------------------------------
2288 clevermous 4035
;  Sysfunction 34, read_floppy_file, is obsolete. Use 58 or 70 function instead.
4036
;align 4
4037
;
4038
;read_floppy_file:
4039
;
4040
;; as input
4041
;;
4042
;; eax pointer to file
4043
;; ebx file lenght
4044
;; ecx start 512 byte block number
4045
;; edx number of blocks to read
4046
;; esi pointer to return/work area (atleast 20 000 bytes)
4047
;;
4048
;;
4049
;; on return
4050
;;
4051
;; eax = 0 command succesful
4052
;;       1 no fd base and/or partition defined
4053
;;       2 yet unsupported FS
4054
;;       3 unknown FS
4055
;;       4 partition not defined at hd
4056
;;       5 file not found
4057
;; ebx = size of file
4058
;
4059
;     mov   edi,[TASK_BASE]
4060
;     add   edi,0x10
4061
;     add   esi,[edi]
4062
;     add   eax,[edi]
4063
;
4064
;     pushad
4065
;     mov  edi,esi
4066
;     add  edi,1024
4067
;     mov  esi,0x100000+19*512
4068
;     sub  ecx,1
4069
;     shl  ecx,9
4070
;     add  esi,ecx
4071
;     shl  edx,9
4072
;     mov  ecx,edx
4073
;     cld
4074
;     rep  movsb
4075
;     popad
4076
;
4077
;     mov   [esp+36],eax
4078
;     mov   [esp+24],ebx
4079
;     ret
4080
 
4081
 
4082
 
4083
align 4
4084
set_io_access_rights:
4085
        push    edi eax
4086
        mov     edi, tss._io_map_0
4087
;     mov   ecx,eax
4088
;     and   ecx,7    ; offset in byte
4089
;     shr   eax,3    ; number of byte
4090
;     add   edi,eax
4091
;     mov   ebx,1
4092
;     shl   ebx,cl
4093
        test    ebp, ebp
4094
;     cmp   ebp,0                ; enable access - ebp = 0
4095
        jnz     .siar1
4096
;     not   ebx
4097
;     and   [edi],byte bl
4098
        btr     [edi], eax
4099
        pop     eax edi
4100
        ret
4101
.siar1:
4102
        bts     [edi], eax
4103
  ;  or    [edi],byte bl        ; disable access - ebp = 1
4104
        pop     eax edi
4105
        ret
4106
;reserve/free group of ports
4107
;  * eax = 46 - number function
4108
;  * ebx = 0 - reserve, 1 - free
4109
;  * ecx = number start arrea of ports
4110
;  * edx = number end arrea of ports (include last number of port)
4111
;Return value:
4112
;  * eax = 0 - succesful
4113
;  * eax = 1 - error
4114
;  * The system has reserve this ports:
4115
;    0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (include last number of port).
4116
;destroys eax,ebx, ebp
4117
r_f_port_area:
4118
 
4119
        test    ebx, ebx
4120
        jnz     free_port_area
4121
;     je    r_port_area
4122
;     jmp   free_port_area
4123
 
4124
;   r_port_area:
4125
 
4126
;     pushad
4127
 
4128
        cmp     ecx, edx      ; beginning > end ?
4129
        ja      rpal1
4130
        cmp     edx, 65536
4131
        jae     rpal1
4132
        mov     eax, [RESERVED_PORTS]
4133
        test    eax, eax      ; no reserved areas ?
4134
        je      rpal2
4135
        cmp     eax, 255      ; max reserved
4136
        jae     rpal1
4137
 rpal3:
4138
        mov     ebx, eax
4139
        shl     ebx, 4
4140
        add     ebx, RESERVED_PORTS
4141
        cmp     ecx, [ebx+8]
4142
        ja      rpal4
4143
        cmp     edx, [ebx+4]
4144
        jae     rpal1
4145
;     jb    rpal4
4146
;     jmp   rpal1
4147
 rpal4:
4148
        dec     eax
4149
        jnz     rpal3
4150
        jmp     rpal2
4151
   rpal1:
4152
;     popad
4153
;     mov   eax,1
4154
        xor     eax, eax
4155
        inc     eax
4156
        ret
4157
   rpal2:
4158
;     popad
4159
     ; enable port access at port IO map
4160
        cli
4161
        pushad                        ; start enable io map
4162
 
4163
        cmp     edx, 65536;16384
4164
        jae     no_unmask_io; jge
4165
        mov     eax, ecx
4166
;       push    ebp
4167
        xor     ebp, ebp               ; enable - eax = port
4168
new_port_access:
4169
;     pushad
4170
        call    set_io_access_rights
4171
;     popad
4172
        inc     eax
4173
        cmp     eax, edx
4174
        jbe     new_port_access
4175
;       pop     ebp
4176
no_unmask_io:
4177
        popad                         ; end enable io map
4178
        sti
4179
 
4180
        mov     eax, [RESERVED_PORTS]
4181
        add     eax, 1
4182
        mov     [RESERVED_PORTS], eax
4183
        shl     eax, 4
4184
        add     eax, RESERVED_PORTS
4185
        mov     ebx, [TASK_BASE]
4186
        mov     ebx, [ebx+TASKDATA.pid]
4187
        mov     [eax], ebx
4188
        mov     [eax+4], ecx
4189
        mov     [eax+8], edx
4190
 
4191
        xor     eax, eax
4192
        ret
4193
 
4194
free_port_area:
4195
 
4196
;     pushad
4197
        mov     eax, [RESERVED_PORTS]; no reserved areas ?
4198
        test    eax, eax
4199
        jz      frpal2
4200
        mov     ebx, [TASK_BASE]
4201
        mov     ebx, [ebx+TASKDATA.pid]
4202
   frpal3:
4203
        mov     edi, eax
4204
        shl     edi, 4
4205
        add     edi, RESERVED_PORTS
4206
        cmp     ebx, [edi]
4207
        jne     frpal4
4208
        cmp     ecx, [edi+4]
4209
        jne     frpal4
4210
        cmp     edx, [edi+8]
4211
        jne     frpal4
4212
        jmp     frpal1
4213
   frpal4:
4214
        dec     eax
4215
        jnz     frpal3
4216
   frpal2:
4217
;     popad
4218
        inc     eax
4219
        ret
4220
   frpal1:
4221
        push    ecx
4222
        mov     ecx, 256
4223
        sub     ecx, eax
4224
        shl     ecx, 4
4225
        mov     esi, edi
4226
        add     esi, 16
4227
        cld
4228
        rep movsb
4229
 
4230
        dec     dword [RESERVED_PORTS]
4231
;popad
4232
;disable port access at port IO map
4233
 
4234
;     pushad                        ; start disable io map
4235
        pop     eax     ;start port
4236
        cmp     edx, 65536;16384
4237
        jge     no_mask_io
4238
 
4239
;     mov   eax,ecx
4240
        xor     ebp, ebp
4241
        inc     ebp
4242
new_port_access_disable:
4243
;     pushad
4244
;     mov   ebp,1                  ; disable - eax = port
4245
        call    set_io_access_rights
4246
;     popad
4247
        inc     eax
4248
        cmp     eax, edx
4249
        jbe     new_port_access_disable
4250
no_mask_io:
4251
;     popad                         ; end disable io map
4252
        xor     eax, eax
4253
        ret
2430 mario79 4254
;-----------------------------------------------------------------------------
2288 clevermous 4255
align 4
4256
drawbackground:
2430 mario79 4257
dbrv20:
2288 clevermous 4258
        cmp     [BgrDrawMode], dword 1
4259
        jne     bgrstr
4260
        call    vesa20_drawbackground_tiled
2453 mario79 4261
;        call    [draw_pointer]
4262
        call    __sys_draw_pointer
2288 clevermous 4263
        ret
2430 mario79 4264
;--------------------------------------
4265
align 4
4266
bgrstr:
2288 clevermous 4267
        call    vesa20_drawbackground_stretch
2453 mario79 4268
;        call    [draw_pointer]
4269
        call    __sys_draw_pointer
2288 clevermous 4270
        ret
2430 mario79 4271
;-----------------------------------------------------------------------------
2288 clevermous 4272
align 4
4273
syscall_putimage:                       ; PutImage
4274
sys_putimage:
4275
        test    ecx, 0x80008000
4276
        jnz     .exit
4277
        test    ecx, 0x0000FFFF
4278
        jz      .exit
4279
        test    ecx, 0xFFFF0000
4280
        jnz     @f
2430 mario79 4281
;--------------------------------------
4282
align 4
4283
.exit:
2288 clevermous 4284
        ret
2430 mario79 4285
;--------------------------------------
4286
align 4
4287
@@:
2288 clevermous 4288
        mov     edi, [current_slot]
4289
        add     dx, word[edi+APPDATA.wnd_clientbox.top]
4290
        rol     edx, 16
4291
        add     dx, word[edi+APPDATA.wnd_clientbox.left]
4292
        rol     edx, 16
2430 mario79 4293
;--------------------------------------
4294
align 4
4295
.forced:
2288 clevermous 4296
        push    ebp esi 0
4297
        mov     ebp, putimage_get24bpp
4298
        mov     esi, putimage_init24bpp
2430 mario79 4299
;--------------------------------------
4300
align 4
2288 clevermous 4301
sys_putimage_bpp:
2430 mario79 4302
        call    vesa20_putimage
2288 clevermous 4303
        pop     ebp esi ebp
2430 mario79 4304
        ret
4305
;        jmp     [draw_pointer]
4306
;-----------------------------------------------------------------------------
2288 clevermous 4307
align 4
4308
sys_putimage_palette:
4309
; ebx = pointer to image
4310
; ecx = [xsize]*65536 + [ysize]
4311
; edx = [xstart]*65536 + [ystart]
4312
; esi = number of bits per pixel, must be 8, 24 or 32
4313
; edi = pointer to palette
4314
; ebp = row delta
4315
        mov     eax, [CURRENT_TASK]
4316
        shl     eax, 8
4317
        add     dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.top]
4318
        rol     edx, 16
4319
        add     dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.left]
4320
        rol     edx, 16
2430 mario79 4321
;--------------------------------------
4322
align 4
2288 clevermous 4323
.forced:
4324
        cmp     esi, 1
4325
        jnz     @f
4326
        push    edi
4327
        mov     eax, [edi+4]
4328
        sub     eax, [edi]
4329
        push    eax
4330
        push    dword [edi]
4331
        push    0ffffff80h
4332
        mov     edi, esp
4333
        call    put_mono_image
4334
        add     esp, 12
4335
        pop     edi
4336
        ret
2430 mario79 4337
;--------------------------------------
4338
align 4
2288 clevermous 4339
@@:
4340
        cmp     esi, 2
4341
        jnz     @f
4342
        push    edi
4343
        push    0ffffff80h
4344
        mov     edi, esp
4345
        call    put_2bit_image
4346
        pop     eax
4347
        pop     edi
4348
        ret
2430 mario79 4349
;--------------------------------------
4350
align 4
2288 clevermous 4351
@@:
4352
        cmp     esi, 4
4353
        jnz     @f
4354
        push    edi
4355
        push    0ffffff80h
4356
        mov     edi, esp
4357
        call    put_4bit_image
4358
        pop     eax
4359
        pop     edi
4360
        ret
2430 mario79 4361
;--------------------------------------
4362
align 4
2288 clevermous 4363
@@:
4364
        push    ebp esi ebp
4365
        cmp     esi, 8
4366
        jnz     @f
4367
        mov     ebp, putimage_get8bpp
4368
        mov     esi, putimage_init8bpp
4369
        jmp     sys_putimage_bpp
2430 mario79 4370
;--------------------------------------
4371
align 4
2288 clevermous 4372
@@:
2727 dunkaist 4373
        cmp     esi, 9
4374
        jnz     @f
4375
        mov     ebp, putimage_get9bpp
4376
        mov     esi, putimage_init9bpp
4377
        jmp     sys_putimage_bpp
4378
;--------------------------------------
4379
align 4
4380
@@:
2288 clevermous 4381
        cmp     esi, 15
4382
        jnz     @f
4383
        mov     ebp, putimage_get15bpp
4384
        mov     esi, putimage_init15bpp
4385
        jmp     sys_putimage_bpp
2430 mario79 4386
;--------------------------------------
4387
align 4
2288 clevermous 4388
@@:
4389
        cmp     esi, 16
4390
        jnz     @f
4391
        mov     ebp, putimage_get16bpp
4392
        mov     esi, putimage_init16bpp
4393
        jmp     sys_putimage_bpp
2430 mario79 4394
;--------------------------------------
4395
align 4
2288 clevermous 4396
@@:
4397
        cmp     esi, 24
4398
        jnz     @f
4399
        mov     ebp, putimage_get24bpp
4400
        mov     esi, putimage_init24bpp
4401
        jmp     sys_putimage_bpp
2430 mario79 4402
;--------------------------------------
4403
align 4
2288 clevermous 4404
@@:
4405
        cmp     esi, 32
4406
        jnz     @f
4407
        mov     ebp, putimage_get32bpp
4408
        mov     esi, putimage_init32bpp
4409
        jmp     sys_putimage_bpp
2430 mario79 4410
;--------------------------------------
4411
align 4
2288 clevermous 4412
@@:
4413
        pop     ebp esi ebp
4414
        ret
2430 mario79 4415
;-----------------------------------------------------------------------------
4416
align 4
2288 clevermous 4417
put_mono_image:
4418
        push    ebp esi ebp
4419
        mov     ebp, putimage_get1bpp
4420
        mov     esi, putimage_init1bpp
4421
        jmp     sys_putimage_bpp
2430 mario79 4422
;-----------------------------------------------------------------------------
4423
align 4
2288 clevermous 4424
put_2bit_image:
4425
        push    ebp esi ebp
4426
        mov     ebp, putimage_get2bpp
4427
        mov     esi, putimage_init2bpp
4428
        jmp     sys_putimage_bpp
2430 mario79 4429
;-----------------------------------------------------------------------------
4430
align 4
2288 clevermous 4431
put_4bit_image:
4432
        push    ebp esi ebp
4433
        mov     ebp, putimage_get4bpp
4434
        mov     esi, putimage_init4bpp
4435
        jmp     sys_putimage_bpp
2430 mario79 4436
;-----------------------------------------------------------------------------
4437
align 4
2288 clevermous 4438
putimage_init24bpp:
4439
        lea     eax, [eax*3]
4440
putimage_init8bpp:
2727 dunkaist 4441
putimage_init9bpp:
2288 clevermous 4442
        ret
2430 mario79 4443
;-----------------------------------------------------------------------------
2288 clevermous 4444
align 16
4445
putimage_get24bpp:
4446
        movzx   eax, byte [esi+2]
4447
        shl     eax, 16
4448
        mov     ax, [esi]
4449
        add     esi, 3
4450
        ret     4
2430 mario79 4451
;-----------------------------------------------------------------------------
2288 clevermous 4452
align 16
4453
putimage_get8bpp:
4454
        movzx   eax, byte [esi]
4455
        push    edx
4456
        mov     edx, [esp+8]
4457
        mov     eax, [edx+eax*4]
4458
        pop     edx
4459
        inc     esi
4460
        ret     4
2430 mario79 4461
;-----------------------------------------------------------------------------
2727 dunkaist 4462
align 16
4463
putimage_get9bpp:
4464
        lodsb
4465
        mov     ah, al
4466
        shl     eax, 8
4467
        mov     al, ah
4468
        ret     4
4469
;-----------------------------------------------------------------------------
2430 mario79 4470
align 4
2288 clevermous 4471
putimage_init1bpp:
4472
        add     eax, ecx
4473
        push    ecx
4474
        add     eax, 7
4475
        add     ecx, 7
4476
        shr     eax, 3
4477
        shr     ecx, 3
4478
        sub     eax, ecx
4479
        pop     ecx
4480
        ret
2430 mario79 4481
;-----------------------------------------------------------------------------
2288 clevermous 4482
align 16
4483
putimage_get1bpp:
4484
        push    edx
4485
        mov     edx, [esp+8]
4486
        mov     al, [edx]
4487
        add     al, al
4488
        jnz     @f
4489
        lodsb
4490
        adc     al, al
4491
@@:
4492
        mov     [edx], al
4493
        sbb     eax, eax
4494
        and     eax, [edx+8]
4495
        add     eax, [edx+4]
4496
        pop     edx
4497
        ret     4
2430 mario79 4498
;-----------------------------------------------------------------------------
4499
align 4
2288 clevermous 4500
putimage_init2bpp:
4501
        add     eax, ecx
4502
        push    ecx
4503
        add     ecx, 3
4504
        add     eax, 3
4505
        shr     ecx, 2
4506
        shr     eax, 2
4507
        sub     eax, ecx
4508
        pop     ecx
4509
        ret
2430 mario79 4510
;-----------------------------------------------------------------------------
2288 clevermous 4511
align 16
4512
putimage_get2bpp:
4513
        push    edx
4514
        mov     edx, [esp+8]
4515
        mov     al, [edx]
4516
        mov     ah, al
4517
        shr     al, 6
4518
        shl     ah, 2
4519
        jnz     .nonewbyte
4520
        lodsb
4521
        mov     ah, al
4522
        shr     al, 6
4523
        shl     ah, 2
4524
        add     ah, 1
4525
.nonewbyte:
4526
        mov     [edx], ah
4527
        mov     edx, [edx+4]
4528
        movzx   eax, al
4529
        mov     eax, [edx+eax*4]
4530
        pop     edx
4531
        ret     4
2430 mario79 4532
;-----------------------------------------------------------------------------
4533
align 4
2288 clevermous 4534
putimage_init4bpp:
4535
        add     eax, ecx
4536
        push    ecx
4537
        add     ecx, 1
4538
        add     eax, 1
4539
        shr     ecx, 1
4540
        shr     eax, 1
4541
        sub     eax, ecx
4542
        pop     ecx
4543
        ret
2430 mario79 4544
;-----------------------------------------------------------------------------
2288 clevermous 4545
align 16
4546
putimage_get4bpp:
4547
        push    edx
4548
        mov     edx, [esp+8]
4549
        add     byte [edx], 80h
4550
        jc      @f
4551
        movzx   eax, byte [edx+1]
4552
        mov     edx, [edx+4]
4553
        and     eax, 0x0F
4554
        mov     eax, [edx+eax*4]
4555
        pop     edx
4556
        ret     4
4557
@@:
4558
        movzx   eax, byte [esi]
4559
        add     esi, 1
4560
        mov     [edx+1], al
4561
        shr     eax, 4
4562
        mov     edx, [edx+4]
4563
        mov     eax, [edx+eax*4]
4564
        pop     edx
4565
        ret     4
2430 mario79 4566
;-----------------------------------------------------------------------------
4567
align 4
2288 clevermous 4568
putimage_init32bpp:
4569
        shl     eax, 2
4570
        ret
2430 mario79 4571
;-----------------------------------------------------------------------------
2288 clevermous 4572
align 16
4573
putimage_get32bpp:
4574
        lodsd
4575
        ret     4
2430 mario79 4576
;-----------------------------------------------------------------------------
4577
align 4
2288 clevermous 4578
putimage_init15bpp:
4579
putimage_init16bpp:
4580
        add     eax, eax
4581
        ret
2430 mario79 4582
;-----------------------------------------------------------------------------
2288 clevermous 4583
align 16
4584
putimage_get15bpp:
4585
; 0RRRRRGGGGGBBBBB -> 00000000RRRRR000GGGGG000BBBBB000
4586
        push    ecx edx
4587
        movzx   eax, word [esi]
4588
        add     esi, 2
4589
        mov     ecx, eax
4590
        mov     edx, eax
4591
        and     eax, 0x1F
4592
        and     ecx, 0x1F shl 5
4593
        and     edx, 0x1F shl 10
4594
        shl     eax, 3
4595
        shl     ecx, 6
4596
        shl     edx, 9
4597
        or      eax, ecx
4598
        or      eax, edx
4599
        pop     edx ecx
4600
        ret     4
2430 mario79 4601
;-----------------------------------------------------------------------------
2288 clevermous 4602
align 16
4603
putimage_get16bpp:
4604
; RRRRRGGGGGGBBBBB -> 00000000RRRRR000GGGGGG00BBBBB000
4605
        push    ecx edx
4606
        movzx   eax, word [esi]
4607
        add     esi, 2
4608
        mov     ecx, eax
4609
        mov     edx, eax
4610
        and     eax, 0x1F
4611
        and     ecx, 0x3F shl 5
4612
        and     edx, 0x1F shl 11
4613
        shl     eax, 3
4614
        shl     ecx, 5
4615
        shl     edx, 8
4616
        or      eax, ecx
4617
        or      eax, edx
4618
        pop     edx ecx
4619
        ret     4
2430 mario79 4620
;-----------------------------------------------------------------------------
4621
;align 4
2288 clevermous 4622
; eax x beginning
4623
; ebx y beginning
4624
; ecx x end
4625
        ; edx y end
4626
; edi color
2430 mario79 4627
;__sys_drawbar:
4628
;        mov     esi, [current_slot]
4629
;        add     eax, [esi+APPDATA.wnd_clientbox.left]
4630
;        add     ecx, [esi+APPDATA.wnd_clientbox.left]
4631
;        add     ebx, [esi+APPDATA.wnd_clientbox.top]
4632
;        add     edx, [esi+APPDATA.wnd_clientbox.top]
4633
;--------------------------------------
4634
;align 4
4635
;.forced:
4636
;        call    vesa20_drawbar
2407 mario79 4637
;        call    [draw_pointer]
4638
;        ret
2430 mario79 4639
;-----------------------------------------------------------------------------
4640
align 4
5012 clevermous 4641
kb_write_wait_ack:
2288 clevermous 4642
 
4643
        push    ecx edx
4644
 
4645
        mov     dl, al
4646
        mov     ecx, 0x1ffff; last 0xffff, new value in view of fast CPU's
5012 clevermous 4647
.wait_output_ready:
2288 clevermous 4648
        in      al, 0x64
4649
        test    al, 2
5012 clevermous 4650
        jz      @f
4651
        loop    .wait_output_ready
2288 clevermous 4652
        mov     ah, 1
5012 clevermous 4653
        jmp     .nothing
4654
@@:
2288 clevermous 4655
        mov     al, dl
4656
        out     0x60, al
5012 clevermous 4657
        mov     ecx, 0xfffff; last 0xffff, new value in view of fast CPU's
4658
.wait_ack:
2288 clevermous 4659
        in      al, 0x64
5012 clevermous 4660
        test    al, 1
4661
        jnz     @f
4662
        loop    .wait_ack
2288 clevermous 4663
        mov     ah, 1
5012 clevermous 4664
        jmp     .nothing
4665
@@:
4666
        in      al, 0x60
2288 clevermous 4667
        xor     ah, ah
4668
 
5012 clevermous 4669
.nothing:
2288 clevermous 4670
        pop     edx ecx
4671
 
4672
        ret
2430 mario79 4673
;-----------------------------------------------------------------------------
2288 clevermous 4674
 
4675
setmouse:  ; set mousepicture -pointer
4676
           ; ps2 mouse enable
4677
 
2430 mario79 4678
;        mov     [MOUSE_PICTURE], dword mousepointer
2288 clevermous 4679
 
4680
        cli
4681
 
4682
        ret
4683
 
4684
if used _rdtsc
4685
_rdtsc:
4686
        bt      [cpu_caps], CAPS_TSC
4687
        jnc     ret_rdtsc
4688
        rdtsc
4689
        ret
4690
   ret_rdtsc:
4691
        mov     edx, 0xffffffff
4692
        mov     eax, 0xffffffff
4693
        ret
4694
end if
4695
 
4696
sys_msg_board_str:
4697
 
4698
        pushad
4699
   @@:
4700
        cmp     [esi], byte 0
4701
        je      @f
3614 shikhin 4702
        mov     ebx, 1
4703
        movzx   ecx, byte [esi]
2288 clevermous 4704
        call    sys_msg_board
4705
        inc     esi
4706
        jmp     @b
4707
   @@:
4708
        popad
4709
        ret
4710
 
4711
sys_msg_board_byte:
4712
; in: al = byte to display
4713
; out: nothing
4714
; destroys: nothing
4715
        pushad
4716
        mov     ecx, 2
4717
        shl     eax, 24
4718
        jmp     @f
4719
 
4720
sys_msg_board_word:
4721
; in: ax = word to display
4722
; out: nothing
4723
; destroys: nothing
4724
        pushad
4725
        mov     ecx, 4
4726
        shl     eax, 16
4727
        jmp     @f
4728
 
4729
sys_msg_board_dword:
4730
; in: eax = dword to display
4731
; out: nothing
4732
; destroys: nothing
4733
        pushad
4734
        mov     ecx, 8
4735
@@:
4736
        push    ecx
4737
        rol     eax, 4
4738
        push    eax
4739
        and     al, 0xF
4740
        cmp     al, 10
4741
        sbb     al, 69h
4742
        das
3614 shikhin 4743
        mov     cl, al
4744
        xor     ebx, ebx
4745
        inc     ebx
2288 clevermous 4746
        call    sys_msg_board
4747
        pop     eax
4748
        pop     ecx
4749
        loop    @b
4750
        popad
4751
        ret
4752
 
3392 clevermous 4753
msg_board_data_size = 65536 ; Must be power of two
4754
 
2288 clevermous 4755
uglobal
3392 clevermous 4756
  msg_board_data  rb msg_board_data_size
2288 clevermous 4757
  msg_board_count dd 0x0
4758
endg
4759
 
4760
sys_msg_board:
4761
 
3614 shikhin 4762
; ebx=1 : write :  bl byte to write
4763
; ebx=2 :  read :  ebx=0 -> no data, ebx=1 -> data in al
2288 clevermous 4764
 
3614 shikhin 4765
        push    eax ebx                 ; Save eax and ebx, since we're restoring their order required.
4766
        mov     eax, ebx
4767
        mov     ebx, ecx
4768
 
2288 clevermous 4769
        mov     ecx, [msg_board_count]
4770
        cmp     eax, 1
4771
        jne     .smbl1
4772
 
4773
if defined debug_com_base
4774
 
4775
        push    dx ax
4776
 
4777
       @@:                              ; Wait for empty transmit register  (yes, this slows down system..)
4778
        mov     dx, debug_com_base+5
4779
        in      al, dx
4780
        test    al, 1 shl 5
4781
        jz      @r
4782
 
4783
        mov     dx, debug_com_base      ; Output the byte
4784
        mov     al, bl
4785
        out     dx, al
4786
 
4787
        pop     ax dx
4788
 
4789
end if
4790
 
4791
        mov     [msg_board_data+ecx], bl
3777 yogev_ezra 4792
; // if debug_direct_print == 1
4793
        cmp     byte [debug_direct_print], 1
4794
        jnz     @f
3507 clevermous 4795
        pusha
4796
iglobal
3778 mario79 4797
msg_board_pos   dd      (42*6)*65536+10 ; for printing debug output on the screen
3507 clevermous 4798
endg
4799
        lea     edx, [msg_board_data+ecx]
4800
        mov     ecx, 0x40FFFFFF
4801
        mov     ebx, [msg_board_pos]
4802
        mov     edi, 1
4803
        mov     esi, 1
4804
        call    dtext
4805
        popa
4806
        add     word [msg_board_pos+2], 6
4807
        cmp     bl, 10
4808
        jnz     @f
3778 mario79 4809
        mov     word [msg_board_pos+2], (42*6)
3507 clevermous 4810
        add     word [msg_board_pos], 10
5350 serge 4811
        mov     ax, word [_display.width]
3507 clevermous 4812
        cmp     word [msg_board_pos], ax
5350 serge 4813
        jb      @f
3507 clevermous 4814
        mov     word [msg_board_pos], 10
4815
@@:
3777 yogev_ezra 4816
; // end if
4817
 
3534 clevermous 4818
if 0
4819
        pusha
4820
        mov     al, bl
4821
        mov     edx, 402h
4822
        out     dx, al
4823
        popa
4824
end if
2288 clevermous 4825
        inc     ecx
3392 clevermous 4826
        and     ecx, msg_board_data_size - 1
2288 clevermous 4827
        mov     [msg_board_count], ecx
3614 shikhin 4828
 
4829
        pop     ebx eax
2288 clevermous 4830
        ret
4831
.smbl1:
4832
        cmp     eax, 2
4833
        jne     .smbl2
4834
        test    ecx, ecx
4835
        jz      .smbl21
3614 shikhin 4836
 
4837
        add     esp, 8                  ; Returning data in ebx and eax, so no need to restore them.
2288 clevermous 4838
        mov     eax, msg_board_data+1
4839
        mov     ebx, msg_board_data
4840
        movzx   edx, byte [ebx]
4841
        call    memmove
4842
        dec     [msg_board_count]
3614 shikhin 4843
        mov     [esp + 32], edx ;eax
4844
        mov     [esp + 20], dword 1
2288 clevermous 4845
        ret
4846
.smbl21:
3614 shikhin 4847
        mov     [esp+32], ecx
4848
        mov     [esp+20], ecx
2288 clevermous 4849
.smbl2:
3614 shikhin 4850
        pop     ebx eax
2288 clevermous 4851
        ret
4852
 
4853
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4854
;; 66 sys function.                                                ;;
4855
;; in eax=66,ebx in [0..5],ecx,edx                                 ;;
4856
;; out eax                                                         ;;
4857
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4858
iglobal
4859
align 4
4860
f66call:
4861
           dd sys_process_def.1   ; 1 = set keyboard mode
4862
           dd sys_process_def.2   ; 2 = get keyboard mode
4863
           dd sys_process_def.3   ; 3 = get keyboard ctrl, alt, shift
2709 mario79 4864
           dd sys_process_def.4   ; 4 = set system-wide hotkey
4865
           dd sys_process_def.5   ; 5 = delete installed hotkey
4866
           dd sys_process_def.6   ; 6 = disable input, work only hotkeys
4867
           dd sys_process_def.7   ; 7 = enable input, opposition to f.66.6
2288 clevermous 4868
endg
2709 mario79 4869
;-----------------------------------------------------------------------------
4870
align 4
2288 clevermous 4871
sys_process_def:
4872
        dec     ebx
2709 mario79 4873
        cmp     ebx, 7
4874
        jae     .not_support    ;if >=8 then or eax,-1
2288 clevermous 4875
 
4876
        mov     edi, [CURRENT_TASK]
4877
        jmp     dword [f66call+ebx*4]
4878
 
4879
.not_support:
4880
        or      eax, -1
4881
        ret
2709 mario79 4882
;-----------------------------------------------------------------------------
4883
align 4
2288 clevermous 4884
.1:
4885
        shl     edi, 8
4886
        mov     [edi+SLOT_BASE + APPDATA.keyboard_mode], cl
4887
 
4888
        ret
2709 mario79 4889
;-----------------------------------------------------------------------------
4890
align 4
2288 clevermous 4891
.2:                             ; 2 = get keyboard mode
4892
        shl     edi, 8
4893
        movzx   eax, byte [SLOT_BASE+edi + APPDATA.keyboard_mode]
4894
        mov     [esp+32], eax
4895
        ret
2709 mario79 4896
;-----------------------------------------------------------------------------
4897
align 4
2288 clevermous 4898
.3:                             ;3 = get keyboard ctrl, alt, shift
4899
        mov     eax, [kb_state]
4900
        mov     [esp+32], eax
4901
        ret
2709 mario79 4902
;-----------------------------------------------------------------------------
4903
align 4
2288 clevermous 4904
.4:
4905
        mov     eax, hotkey_list
4906
@@:
4907
        cmp     dword [eax+8], 0
4908
        jz      .found_free
4909
        add     eax, 16
4910
        cmp     eax, hotkey_list+16*256
4911
        jb      @b
4912
        mov     dword [esp+32], 1
4913
        ret
4914
.found_free:
4915
        mov     [eax+8], edi
4916
        mov     [eax+4], edx
4917
        movzx   ecx, cl
4918
        lea     ecx, [hotkey_scancodes+ecx*4]
4919
        mov     edx, [ecx]
4920
        mov     [eax], edx
4921
        mov     [ecx], eax
4922
        mov     [eax+12], ecx
3383 hidnplayr 4923
        test    edx, edx
4924
        jz      @f
2288 clevermous 4925
        mov     [edx+12], eax
4926
@@:
4927
        and     dword [esp+32], 0
4928
        ret
2709 mario79 4929
;-----------------------------------------------------------------------------
4930
align 4
2288 clevermous 4931
.5:
4932
        movzx   ebx, cl
4933
        lea     ebx, [hotkey_scancodes+ebx*4]
4934
        mov     eax, [ebx]
4935
.scan:
4936
        test    eax, eax
4937
        jz      .notfound
4938
        cmp     [eax+8], edi
4939
        jnz     .next
4940
        cmp     [eax+4], edx
4941
        jz      .found
4942
.next:
4943
        mov     eax, [eax]
4944
        jmp     .scan
4945
.notfound:
4946
        mov     dword [esp+32], 1
4947
        ret
4948
.found:
4949
        mov     ecx, [eax]
4950
        jecxz   @f
4951
        mov     edx, [eax+12]
4952
        mov     [ecx+12], edx
4953
@@:
4954
        mov     ecx, [eax+12]
4955
        mov     edx, [eax]
4956
        mov     [ecx], edx
4957
        xor     edx, edx
4958
        mov     [eax+4], edx
4959
        mov     [eax+8], edx
4960
        mov     [eax+12], edx
4961
        mov     [eax], edx
4962
        mov     [esp+32], edx
4963
        ret
2709 mario79 4964
;-----------------------------------------------------------------------------
4965
align 4
4966
.6:
4967
        pushfd
4968
        cli
4969
        mov     eax, [PID_lock_input]
4970
        test    eax, eax
4971
        jnz     @f
4972
; get current PID
4973
        mov     eax, [CURRENT_TASK]
4974
        shl     eax, 5
4975
        mov     eax, [eax+CURRENT_TASK+TASKDATA.pid]
4976
; set current PID for lock input
4977
        mov     [PID_lock_input], eax
4978
@@:
4979
        popfd
4980
        ret
4981
;-----------------------------------------------------------------------------
4982
align 4
4983
.7:
4984
        mov     eax, [PID_lock_input]
4985
        test    eax, eax
4986
        jz      @f
4987
; get current PID
4988
        mov     ebx, [CURRENT_TASK]
4989
        shl     ebx, 5
4990
        mov     ebx, [ebx+CURRENT_TASK+TASKDATA.pid]
4991
; compare current lock input with current PID
4992
        cmp     ebx, eax
4993
        jne     @f
2288 clevermous 4994
 
2709 mario79 4995
        xor     eax, eax
4996
        mov     [PID_lock_input], eax
4997
@@:
4998
        ret
4999
;-----------------------------------------------------------------------------
5000
uglobal
5001
  PID_lock_input dd 0x0
5002
endg
2288 clevermous 5003
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5004
;; 61 sys function.                                                ;;
5005
;; in eax=61,ebx in [1..3]                                         ;;
5006
;; out eax                                                         ;;
5007
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5008
iglobal
5009
align 4
5010
f61call:
5011
           dd sys_gs.1   ; resolution
5012
           dd sys_gs.2   ; bits per pixel
5013
           dd sys_gs.3   ; bytes per scanline
5014
endg
5015
 
5016
 
5017
align 4
5018
 
5019
sys_gs:                         ; direct screen access
5020
        dec     ebx
5021
        cmp     ebx, 2
5022
        ja      .not_support
5023
        jmp     dword [f61call+ebx*4]
5024
.not_support:
5025
        or      [esp+32], dword -1
5026
        ret
5027
 
5028
 
5029
.1:                             ; resolution
5350 serge 5030
        mov     eax, [_display.width]
2288 clevermous 5031
        shl     eax, 16
5350 serge 5032
        mov     ax, word [_display.height]
2288 clevermous 5033
        mov     [esp+32], eax
5034
        ret
5035
.2:                             ; bits per pixel
5154 hidnplayr 5036
        mov     eax, [_display.bits_per_pixel]
2288 clevermous 5037
        mov     [esp+32], eax
5038
        ret
5039
.3:                             ; bytes per scanline
5351 serge 5040
        mov     eax, [_display.lfb_pitch]
2288 clevermous 5041
        mov     [esp+32], eax
5042
        ret
5043
 
5044
align 4  ;  system functions
5045
 
5046
syscall_setpixel:                       ; SetPixel
5047
 
5048
        mov     eax, ebx
5049
        mov     ebx, ecx
5050
        mov     ecx, edx
5051
        mov     edx, [TASK_BASE]
5052
        add     eax, [edx-twdw+WDATA.box.left]
5053
        add     ebx, [edx-twdw+WDATA.box.top]
5054
        mov     edi, [current_slot]
5055
        add     eax, [edi+APPDATA.wnd_clientbox.left]
5056
        add     ebx, [edi+APPDATA.wnd_clientbox.top]
5057
        xor     edi, edi ; no force
2430 mario79 5058
        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 save to mouseunder area
2453 mario79 5059
;        jmp     [putpixel]
5060
        jmp     __sys_putpixel
2288 clevermous 5061
 
5062
align 4
5063
 
5064
syscall_writetext:                      ; WriteText
5065
 
5066
        mov     eax, [TASK_BASE]
5067
        mov     ebp, [eax-twdw+WDATA.box.left]
5068
        push    esi
5069
        mov     esi, [current_slot]
5070
        add     ebp, [esi+APPDATA.wnd_clientbox.left]
5071
        shl     ebp, 16
5072
        add     ebp, [eax-twdw+WDATA.box.top]
5073
        add     bp, word[esi+APPDATA.wnd_clientbox.top]
5074
        pop     esi
3462 mario79 5075
        test    ecx, 0x08000000  ; redirect the output to the user area
5076
        jnz     @f
2288 clevermous 5077
        add     ebx, ebp
3462 mario79 5078
align 4
5079
@@:
2288 clevermous 5080
        mov     eax, edi
2536 mario79 5081
        test    ecx, 0x08000000  ; redirect the output to the user area
5082
        jnz     dtext
2288 clevermous 5083
        xor     edi, edi
5084
        jmp     dtext
5085
 
5086
align 4
5087
 
5088
syscall_drawrect:                       ; DrawRect
5089
 
5090
        mov     edi, edx ; color + gradient
5091
        and     edi, 0x80FFFFFF
5092
        test    bx, bx  ; x.size
5093
        je      .drectr
5094
        test    cx, cx ; y.size
5095
        je      .drectr
5096
 
5097
        mov     eax, ebx ; bad idea
5098
        mov     ebx, ecx
5099
 
5100
        movzx   ecx, ax ; ecx - x.size
5101
        shr     eax, 16 ; eax - x.coord
5102
        movzx   edx, bx ; edx - y.size
5103
        shr     ebx, 16 ; ebx - y.coord
5104
        mov     esi, [current_slot]
5105
 
5106
        add     eax, [esi + APPDATA.wnd_clientbox.left]
5107
        add     ebx, [esi + APPDATA.wnd_clientbox.top]
5108
        add     ecx, eax
5109
        add     edx, ebx
2453 mario79 5110
;        jmp     [drawbar]
5111
        jmp     vesa20_drawbar
2288 clevermous 5112
.drectr:
5113
        ret
5114
 
5115
align 4
5116
syscall_getscreensize:                  ; GetScreenSize
5350 serge 5117
        mov     ax, word [_display.width]
5118
        dec     ax
2288 clevermous 5119
        shl     eax, 16
5350 serge 5120
        mov     ax, word [_display.height]
5121
        dec     ax
2288 clevermous 5122
        mov     [esp + 32], eax
5123
        ret
4700 mario79 5124
;-----------------------------------------------------------------------------
2288 clevermous 5125
align 4
4713 mario79 5126
syscall_cdaudio:
4711 mario79 5127
; ECX - position of CD/DVD-drive
5128
; from 0=Primary Master to 3=Secondary Slave for first IDE contr.
5129
; from 4=Primary Master to 7=Secondary Slave for second IDE contr.
5130
; from 8=Primary Master to 11=Secondary Slave for third IDE contr.
5131
        cmp     ecx, 11
5132
        ja      .exit
5133
 
5134
        mov     eax, ecx
5135
        shr     eax, 2
5136
        lea     eax, [eax*5]
5137
        mov     al, [eax+DRIVE_DATA+1]
5138
 
5139
        push    ecx ebx
5140
        mov     ebx, ecx
5141
        and     ebx, 11b
5142
        shl     ebx, 1
5143
        mov     cl, 6
5144
        sub     cl, bl
5145
        shr     al, cl
5146
        test    al, 2 ; it's not an ATAPI device
5147
        pop     ebx ecx
5148
 
5149
        jz      .exit
5150
 
4700 mario79 5151
        cmp     ebx, 4
5152
        je      .eject
2288 clevermous 5153
 
5154
        cmp     ebx, 5
4700 mario79 5155
        je      .load
4711 mario79 5156
;--------------------------------------
5157
.exit:
4700 mario79 5158
        ret
5159
;--------------------------------------
2288 clevermous 5160
.load:
5161
        call    .reserve
5162
        call    LoadMedium
5163
        jmp     .free
4700 mario79 5164
;--------------------------------------
2288 clevermous 5165
.eject:
5166
        call    .reserve
5167
        call    clear_CD_cache
5168
        call    allow_medium_removal
5169
        call    EjectMedium
5170
        jmp     .free
4700 mario79 5171
;--------------------------------------
2288 clevermous 5172
.reserve:
5173
        call    reserve_cd
4700 mario79 5174
 
5175
        mov     ebx, ecx
5176
        inc     ebx
5177
        mov     [cdpos], ebx
5178
 
2288 clevermous 5179
        mov     eax, ecx
5180
        shr     eax, 1
5181
        and     eax, 1
5182
        inc     eax
5183
        mov     [ChannelNumber], ax
5184
        mov     eax, ecx
5185
        and     eax, 1
5186
        mov     [DiskNumber], al
5187
        call    reserve_cd_channel
5188
        ret
4700 mario79 5189
;--------------------------------------
2288 clevermous 5190
.free:
5191
        call    free_cd_channel
5192
        and     [cd_status], 0
5193
        ret
2511 mario79 5194
;-----------------------------------------------------------------------------
2288 clevermous 5195
align 4
2511 mario79 5196
syscall_getpixel_WinMap:                       ; GetPixel WinMap
5350 serge 5197
        cmp     ebx, [_display.width]
5198
        jb      @f
5199
        cmp     ecx, [_display.height]
5200
        jb      @f
2511 mario79 5201
        xor     eax, eax
5202
        jmp     .store
5203
;--------------------------------------
5204
align 4
5205
@@:
5206
        mov     eax, [d_width_calc_area + ecx*4]
5351 serge 5207
        add     eax, [_display.win_map]
2511 mario79 5208
        movzx   eax, byte[eax+ebx]        ; get value for current point
5209
;--------------------------------------
5210
align 4
5211
.store:
5212
        mov     [esp + 32], eax
5213
        ret
5214
;-----------------------------------------------------------------------------
5215
align 4
2288 clevermous 5216
syscall_getpixel:                       ; GetPixel
5350 serge 5217
        mov     ecx, [_display.width]
2288 clevermous 5218
        xor     edx, edx
5219
        mov     eax, ebx
5220
        div     ecx
5221
        mov     ebx, edx
5222
        xchg    eax, ebx
2430 mario79 5223
        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 use mouseunder area
2288 clevermous 5224
        call    dword [GETPIXEL]; eax - x, ebx - y
5225
        mov     [esp + 32], ecx
5226
        ret
2509 mario79 5227
;-----------------------------------------------------------------------------
2288 clevermous 5228
align 4
5229
syscall_getarea:
5230
;eax = 36
5231
;ebx = pointer to bufer for img BBGGRRBBGGRR...
5232
;ecx = [size x]*65536 + [size y]
5233
;edx = [start x]*65536 + [start y]
5234
        pushad
5235
        mov     edi, ebx
5236
        mov     eax, edx
5237
        shr     eax, 16
5238
        mov     ebx, edx
5239
        and     ebx, 0xffff
5240
        dec     eax
5241
        dec     ebx
5242
     ; eax - x, ebx - y
5243
        mov     edx, ecx
5244
 
5245
        shr     ecx, 16
5246
        and     edx, 0xffff
5247
        mov     esi, ecx
5248
     ; ecx - size x, edx - size y
5249
 
5250
        mov     ebp, edx
5251
        dec     ebp
5252
        lea     ebp, [ebp*3]
5253
 
5254
        imul    ebp, esi
5255
 
5256
        mov     esi, ecx
5257
        dec     esi
5258
        lea     esi, [esi*3]
5259
 
5260
        add     ebp, esi
5261
        add     ebp, edi
5262
 
5263
        add     ebx, edx
2509 mario79 5264
;--------------------------------------
5265
align 4
2288 clevermous 5266
.start_y:
5267
        push    ecx edx
2509 mario79 5268
;--------------------------------------
5269
align 4
2288 clevermous 5270
.start_x:
5271
        push    eax ebx ecx
5272
        add     eax, ecx
5273
 
2430 mario79 5274
        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 use mouseunder area
2288 clevermous 5275
        call    dword [GETPIXEL]; eax - x, ebx - y
5276
 
5277
        mov     [ebp], cx
5278
        shr     ecx, 16
5279
        mov     [ebp+2], cl
5280
 
5281
        pop     ecx ebx eax
5282
        sub     ebp, 3
5283
        dec     ecx
5284
        jnz     .start_x
5285
        pop     edx ecx
5286
        dec     ebx
5287
        dec     edx
5288
        jnz     .start_y
5289
        popad
5290
        ret
2509 mario79 5291
;-----------------------------------------------------------------------------
5292
align 4
5293
syscall_putarea_backgr:
5294
;eax = 25
5295
;ebx = pointer to bufer for img BBGGRRBBGGRR...
5296
;ecx = [size x]*65536 + [size y]
5297
;edx = [start x]*65536 + [start y]
5298
        pushad
5299
        mov     edi, ebx
5300
        mov     eax, edx
5301
        shr     eax, 16
5302
        mov     ebx, edx
5303
        and     ebx, 0xffff
5304
        dec     eax
5305
        dec     ebx
5306
; eax - x, ebx - y
5307
        mov     edx, ecx
5308
        shr     ecx, 16
5309
        and     edx, 0xffff
5310
        mov     esi, ecx
5311
; ecx - size x, edx - size y
5312
        mov     ebp, edx
5313
        dec     ebp
5314
        shl     ebp, 2
2288 clevermous 5315
 
2509 mario79 5316
        imul    ebp, esi
5317
 
5318
        mov     esi, ecx
5319
        dec     esi
5320
        shl     esi, 2
5321
 
5322
        add     ebp, esi
5323
        add     ebp, edi
5324
 
5325
        add     ebx, edx
5326
;--------------------------------------
2288 clevermous 5327
align 4
2509 mario79 5328
.start_y:
5329
        push    ecx edx
5330
;--------------------------------------
5331
align 4
5332
.start_x:
5333
        push    eax ecx
5334
        add     eax, ecx
2288 clevermous 5335
 
2509 mario79 5336
        mov     ecx, [ebp]
5337
        rol     ecx, 8
5338
        test    cl, cl        ; transparensy = 0
5339
        jz      .no_put
5340
 
5341
        xor     cl, cl
5342
        ror     ecx, 8
5343
 
5344
        pushad
5345
        mov     edx, [d_width_calc_area + ebx*4]
5351 serge 5346
        add     edx, [_display.win_map]
2509 mario79 5347
        movzx   edx, byte [eax+edx]
5348
        cmp     dl, byte 1
5349
        jne     @f
5350
 
5351
        call    dword [PUTPIXEL]; eax - x, ebx - y
5352
;--------------------------------------
5353
align 4
5354
@@:
5355
        popad
5356
;--------------------------------------
5357
align 4
5358
.no_put:
5359
        pop     ecx eax
2991 Serge 5360
 
2509 mario79 5361
        sub     ebp, 4
5362
        dec     ecx
5363
        jnz     .start_x
5364
 
5365
        pop     edx ecx
5366
        dec     ebx
5367
        dec     edx
5368
        jnz     .start_y
5369
 
5370
        popad
5371
        ret
5372
;-----------------------------------------------------------------------------
5373
align 4
2288 clevermous 5374
syscall_drawline:                       ; DrawLine
5375
 
5376
        mov     edi, [TASK_BASE]
5377
        movzx   eax, word[edi-twdw+WDATA.box.left]
5378
        mov     ebp, eax
5379
        mov     esi, [current_slot]
5380
        add     ebp, [esi+APPDATA.wnd_clientbox.left]
5381
        add     ax, word[esi+APPDATA.wnd_clientbox.left]
5382
        add     ebp, ebx
5383
        shl     eax, 16
5384
        movzx   ebx, word[edi-twdw+WDATA.box.top]
5385
        add     eax, ebp
5386
        mov     ebp, ebx
5387
        add     ebp, [esi+APPDATA.wnd_clientbox.top]
5388
        add     bx, word[esi+APPDATA.wnd_clientbox.top]
5389
        add     ebp, ecx
5390
        shl     ebx, 16
5391
        xor     edi, edi
5392
        add     ebx, ebp
5393
        mov     ecx, edx
2453 mario79 5394
;        jmp     [draw_line]
5395
        jmp     __sys_draw_line
2288 clevermous 5396
 
5397
 
5398
align 4
5399
syscall_reserveportarea:                ; ReservePortArea and FreePortArea
5400
 
5401
        call    r_f_port_area
5402
        mov     [esp+32], eax
5403
        ret
5404
 
5405
align 4
5406
syscall_threads:                        ; CreateThreads
5407
;
4105 Serge 5408
;   ecx=thread entry point
5409
;   edx=thread stack pointer
2288 clevermous 5410
;
5411
; on return : eax = pid
5412
 
4105 Serge 5413
        xor     ebx, ebx
2288 clevermous 5414
        call    new_sys_threads
5415
 
5416
        mov     [esp+32], eax
5417
        ret
5418
 
5419
align 4
5420
 
5421
paleholder:
5422
        ret
2438 mario79 5423
;------------------------------------------------------------------------------
2288 clevermous 5424
align 4
2438 mario79 5425
calculate_fast_getting_offset_for_WinMapAddress:
5426
; calculate data area for fast getting offset to _WinMapAddress
2446 mario79 5427
        xor     eax, eax
2438 mario79 5428
        mov     ecx, [_display.height]
5429
        mov     edi, d_width_calc_area
5430
        cld
5431
@@:
5432
        stosd
5433
        add     eax, [_display.width]
5434
        dec     ecx
5435
        jnz     @r
5436
        ret
5437
;------------------------------------------------------------------------------
5438
align 4
2480 mario79 5439
calculate_fast_getting_offset_for_LFB:
5440
; calculate data area for fast getting offset to LFB
5441
        xor     eax, eax
5442
        mov     ecx, [_display.height]
5443
        mov     edi, BPSLine_calc_area
5444
        cld
5445
@@:
5446
        stosd
5351 serge 5447
        add     eax, [_display.lfb_pitch]
2480 mario79 5448
        dec     ecx
5449
        jnz     @r
5450
        ret
5451
;------------------------------------------------------------------------------
5452
align 4
2288 clevermous 5453
set_screen:
2654 mario79 5454
; in:
5455
; eax - new Screen_Max_X
5456
; ecx - new BytesPerScanLine
5457
; edx - new Screen_Max_Y
2288 clevermous 5458
 
5459
        pushfd
5460
        cli
5461
 
5351 serge 5462
        mov     [_display.lfb_pitch], ecx
2288 clevermous 5463
 
5464
        mov     [screen_workarea.right], eax
5465
        mov     [screen_workarea.bottom], edx
5466
 
5467
        push    ebx
5468
        push    esi
5469
        push    edi
5470
 
5471
        pushad
5472
 
2654 mario79 5473
        cmp     [do_not_touch_winmap], 1
5474
        je      @f
5475
 
5351 serge 5476
        stdcall kernel_free, [_display.win_map]
2288 clevermous 5477
 
5478
        mov     eax, [_display.width]
5479
        mul     [_display.height]
5351 serge 5480
        mov     [_display.win_map_size], eax
2288 clevermous 5481
 
5482
        stdcall kernel_alloc, eax
5351 serge 5483
        mov     [_display.win_map], eax
2288 clevermous 5484
        test    eax, eax
5485
        jz      .epic_fail
2654 mario79 5486
; store for f.18.24
5487
        mov     eax, [_display.width]
5488
        mov     [display_width_standard], eax
2288 clevermous 5489
 
2654 mario79 5490
        mov     eax, [_display.height]
5491
        mov     [display_height_standard], eax
5492
@@:
2438 mario79 5493
        call    calculate_fast_getting_offset_for_WinMapAddress
2545 mario79 5494
; for Qemu or non standart video cards
2991 Serge 5495
; Unfortunately [BytesPerScanLine] does not always
2545 mario79 5496
;                             equal to [_display.width] * [ScreenBPP] / 8
5497
        call    calculate_fast_getting_offset_for_LFB
2288 clevermous 5498
        popad
5499
 
5500
        call    repos_windows
5501
        xor     eax, eax
5502
        xor     ebx, ebx
5350 serge 5503
        mov     ecx, [_display.width]
5504
        mov     edx, [_display.height]
5505
        dec     ecx
5506
        dec     edx
2288 clevermous 5507
        call    calculatescreen
5508
        pop     edi
5509
        pop     esi
5510
        pop     ebx
5511
 
5512
        popfd
5513
        ret
5514
 
5515
.epic_fail:
5516
        hlt                     ; Houston, we've had a problem
5517
 
5518
; --------------- APM ---------------------
5519
uglobal
5520
apm_entry       dp      0
5521
apm_vf          dd      0
5522
endg
5523
 
5524
align 4
5525
sys_apm:
5526
        xor     eax, eax
5527
        cmp     word [apm_vf], ax       ; Check APM BIOS enable
5528
        jne     @f
5529
        inc     eax
5530
        or      dword [esp + 44], eax   ; error
5531
        add     eax, 7
5532
        mov     dword [esp + 32], eax   ; 32-bit protected-mode interface not supported
5533
        ret
5534
 
5535
@@:
5536
;       xchg    eax, ecx
5537
;       xchg    ebx, ecx
5538
 
5539
        cmp     dx, 3
5540
        ja      @f
5541
        and     [esp + 44], byte 0xfe    ; emulate func 0..3 as func 0
5542
        mov     eax, [apm_vf]
5543
        mov     [esp + 32], eax
5544
        shr     eax, 16
5545
        mov     [esp + 28], eax
5546
        ret
5547
 
5548
@@:
5549
 
5550
        mov     esi, [master_tab+(OS_BASE shr 20)]
5551
        xchg    [master_tab], esi
5552
        push    esi
5553
        mov     edi, cr3
5554
        mov     cr3, edi                ;flush TLB
5555
 
5556
        call    pword [apm_entry]       ;call APM BIOS
5557
 
5558
        xchg    eax, [esp]
5559
        mov     [master_tab], eax
5560
        mov     eax, cr3
5561
        mov     cr3, eax
5562
        pop     eax
5563
 
5564
        mov     [esp + 4 ], edi
5565
        mov     [esp + 8], esi
5566
        mov     [esp + 20], ebx
5567
        mov     [esp + 24], edx
5568
        mov     [esp + 28], ecx
5569
        mov     [esp + 32], eax
5570
        setc    al
5571
        and     [esp + 44], byte 0xfe
5572
        or      [esp + 44], al
5573
        ret
5574
; -----------------------------------------
5575
 
5576
align 4
5577
 
5578
undefined_syscall:                      ; Undefined system call
5579
        mov     [esp + 32], dword -1
5580
        ret
5581
 
5582
align 4
5583
system_shutdown:          ; shut down the system
5584
 
3732 Serge 5585
        cmp     byte [BOOT_VARS+0x9030], 1
2288 clevermous 5586
        jne     @F
5587
        ret
5588
@@:
5589
        call    stop_all_services
5590
 
5591
yes_shutdown_param:
5033 clevermous 5592
; Shutdown other CPUs, if initialized
5593
        cmp     [ap_initialized], 0
5594
        jz      .no_shutdown_cpus
5595
        mov     edi, [LAPIC_BASE]
5596
        add     edi, 300h
5597
        mov     esi, smpt+4
5598
        mov     ebx, [cpu_count]
5599
        dec     ebx
5600
.shutdown_cpus_loop:
5601
        lodsd
5049 clevermous 5602
        push    esi
5603
        xor     esi, esi
5604
        inc     esi
5033 clevermous 5605
        shl     eax, 24
5606
        mov     [edi+10h], eax
5607
; assert INIT IPI
5608
        mov     dword [edi], 0C500h
5049 clevermous 5609
        call    delay_ms
5033 clevermous 5610
@@:
5611
        test    dword [edi], 1000h
5612
        jnz     @b
5613
; deassert INIT IPI
5614
        mov     dword [edi], 8500h
5049 clevermous 5615
        call    delay_ms
5033 clevermous 5616
@@:
5617
        test    dword [edi], 1000h
5618
        jnz     @b
5619
; don't send STARTUP IPI: let other CPUs be in wait-for-startup state
5049 clevermous 5620
        pop     esi
5033 clevermous 5621
        dec     ebx
5622
        jnz     .shutdown_cpus_loop
5623
.no_shutdown_cpus:
5624
 
2288 clevermous 5625
        cli
5626
 
5627
if ~ defined extended_primary_loader
4273 clevermous 5628
; load kernel.mnt to 0x7000:0
5629
        mov     ebx, kernel_file_load
5630
        pushad
5631
        call    file_system_lfn
5632
        popad
2288 clevermous 5633
 
5634
        mov     esi, restart_kernel_4000+OS_BASE+0x10000 ; move kernel re-starter to 0x4000:0
5635
        mov     edi, OS_BASE+0x40000
5636
        mov     ecx, 1000
5637
        rep movsb
5638
end if
5639
 
3732 Serge 5640
;        mov     esi, BOOT_VAR    ; restore 0x0 - 0xffff
5641
;        mov     edi, OS_BASE
5642
;        mov     ecx, 0x10000/4
5643
;        cld
5644
;        rep movsd
2288 clevermous 5645
 
5646
        call    IRQ_mask_all
5647
 
5648
        cmp     byte [OS_BASE + 0x9030], 2
5649
        jnz     no_acpi_power_off
5650
 
5651
; scan for RSDP
5652
; 1) The first 1 Kb of the Extended BIOS Data Area (EBDA).
5653
        movzx   eax, word [OS_BASE + 0x40E]
5654
        shl     eax, 4
5655
        jz      @f
5656
        mov     ecx, 1024/16
5657
        call    scan_rsdp
5658
        jnc     .rsdp_found
5659
@@:
5660
; 2) The BIOS read-only memory space between 0E0000h and 0FFFFFh.
5661
        mov     eax, 0xE0000
5662
        mov     ecx, 0x2000
5663
        call    scan_rsdp
5664
        jc      no_acpi_power_off
5665
.rsdp_found:
5666
        mov     esi, [eax+16]   ; esi contains physical address of the RSDT
5667
        mov     ebp, [ipc_tmp]
5356 serge 5668
        stdcall map_page, ebp, esi, PG_READ
2288 clevermous 5669
        lea     eax, [esi+1000h]
5670
        lea     edx, [ebp+1000h]
5356 serge 5671
        stdcall map_page, edx, eax, PG_READ
2288 clevermous 5672
        and     esi, 0xFFF
5673
        add     esi, ebp
5674
        cmp     dword [esi], 'RSDT'
5675
        jnz     no_acpi_power_off
5676
        mov     ecx, [esi+4]
5677
        sub     ecx, 24h
5678
        jbe     no_acpi_power_off
5679
        shr     ecx, 2
5680
        add     esi, 24h
5681
.scan_fadt:
5682
        lodsd
5683
        mov     ebx, eax
5684
        lea     eax, [ebp+2000h]
5356 serge 5685
        stdcall map_page, eax, ebx, PG_READ
2288 clevermous 5686
        lea     eax, [ebp+3000h]
5687
        add     ebx, 0x1000
5356 serge 5688
        stdcall map_page, eax, ebx, PG_READ
2288 clevermous 5689
        and     ebx, 0xFFF
5690
        lea     ebx, [ebx+ebp+2000h]
5691
        cmp     dword [ebx], 'FACP'
5692
        jz      .fadt_found
5693
        loop    .scan_fadt
5694
        jmp     no_acpi_power_off
5695
.fadt_found:
5696
; ebx is linear address of FADT
5697
        mov     edi, [ebx+40] ; physical address of the DSDT
5698
        lea     eax, [ebp+4000h]
5356 serge 5699
        stdcall map_page, eax, edi, PG_READ
2288 clevermous 5700
        lea     eax, [ebp+5000h]
5701
        lea     esi, [edi+0x1000]
5356 serge 5702
        stdcall map_page, eax, esi, PG_READ
2288 clevermous 5703
        and     esi, 0xFFF
5704
        sub     edi, esi
5705
        cmp     dword [esi+ebp+4000h], 'DSDT'
5706
        jnz     no_acpi_power_off
5707
        mov     eax, [esi+ebp+4004h] ; DSDT length
5708
        sub     eax, 36+4
5709
        jbe     no_acpi_power_off
5710
        add     esi, 36
5711
.scan_dsdt:
5712
        cmp     dword [esi+ebp+4000h], '_S5_'
5713
        jnz     .scan_dsdt_cont
5714
        cmp     byte [esi+ebp+4000h+4], 12h ; DefPackage opcode
5715
        jnz     .scan_dsdt_cont
5716
        mov     dl, [esi+ebp+4000h+6]
5717
        cmp     dl, 4 ; _S5_ package must contain 4 bytes
5718
                      ; ...in theory; in practice, VirtualBox has 2 bytes
5719
        ja      .scan_dsdt_cont
5720
        cmp     dl, 1
5721
        jb      .scan_dsdt_cont
5722
        lea     esi, [esi+ebp+4000h+7]
5723
        xor     ecx, ecx
5724
        cmp     byte [esi], 0 ; 0 means zero byte, 0Ah xx means byte xx
5725
        jz      @f
5726
        cmp     byte [esi], 0xA
5727
        jnz     no_acpi_power_off
5728
        inc     esi
5729
        mov     cl, [esi]
5730
@@:
5731
        inc     esi
5732
        cmp     dl, 2
5733
        jb      @f
5734
        cmp     byte [esi], 0
5735
        jz      @f
5736
        cmp     byte [esi], 0xA
5737
        jnz     no_acpi_power_off
5738
        inc     esi
5739
        mov     ch, [esi]
5740
@@:
5741
        jmp     do_acpi_power_off
5742
.scan_dsdt_cont:
5743
        inc     esi
5744
        cmp     esi, 0x1000
5745
        jb      @f
5746
        sub     esi, 0x1000
5747
        add     edi, 0x1000
5748
        push    eax
5749
        lea     eax, [ebp+4000h]
5356 serge 5750
        stdcall map_page, eax, edi, PG_READ
5751
        push    PG_READ
2288 clevermous 5752
        lea     eax, [edi+1000h]
5753
        push    eax
5754
        lea     eax, [ebp+5000h]
5755
        push    eax
5756
        stdcall map_page
5757
        pop     eax
5758
@@:
5759
        dec     eax
5760
        jnz     .scan_dsdt
5761
        jmp     no_acpi_power_off
5762
do_acpi_power_off:
5763
        mov     edx, [ebx+48]
5764
        test    edx, edx
5765
        jz      .nosmi
5766
        mov     al, [ebx+52]
5767
        out     dx, al
5768
        mov     edx, [ebx+64]
5769
@@:
5770
        in      ax, dx
5771
        test    al, 1
5772
        jz      @b
5773
.nosmi:
5774
        and     cx, 0x0707
5775
        shl     cx, 2
5776
        or      cx, 0x2020
5777
        mov     edx, [ebx+64]
5778
        in      ax, dx
5779
        and     ax, 203h
5780
        or      ah, cl
5781
        out     dx, ax
5782
        mov     edx, [ebx+68]
5783
        test    edx, edx
5784
        jz      @f
5785
        in      ax, dx
5786
        and     ax, 203h
5787
        or      ah, ch
5788
        out     dx, ax
5789
@@:
5790
        jmp     $
5791
 
5792
 
5793
scan_rsdp:
5794
        add     eax, OS_BASE
5795
.s:
5796
        cmp     dword [eax], 'RSD '
5797
        jnz     .n
5798
        cmp     dword [eax+4], 'PTR '
5799
        jnz     .n
5800
        xor     edx, edx
5801
        xor     esi, esi
5802
@@:
5803
        add     dl, [eax+esi]
5804
        inc     esi
5805
        cmp     esi, 20
5806
        jnz     @b
5807
        test    dl, dl
5808
        jz      .ok
5809
.n:
5810
        add     eax, 10h
5811
        loop    .s
5812
        stc
5813
.ok:
5814
        ret
5815
 
5032 clevermous 5816
no_acpi_power_off:
5817
        call    create_trampoline_pgmap
5818
        mov     cr3, eax
5819
        jmp     become_real+0x10000
5820
iglobal
5821
align 4
5822
realmode_gdt:
5823
; selector 0 - not used
5824
        dw      23
5825
        dd      realmode_gdt-OS_BASE
5826
        dw      0
5827
; selector 8 - code from 1000:0000 to 1000:FFFF
5828
        dw      0FFFFh
5829
        dw      0
5830
        db      1
5831
        db      10011011b
5832
        db      00000000b
5833
        db      0
5834
; selector 10h - data from 1000:0000 to 1000:FFFF
5835
        dw      0FFFFh
5836
        dw      0
5837
        db      1
5838
        db      10010011b
5839
        db      00000000b
5840
        db      0
5841
endg
5842
 
3627 Serge 5843
if ~ lang eq sp
5844
diff16 "end of .text segment",0,$
5845
end if
5846
 
2288 clevermous 5847
include "data32.inc"
5848
 
5849
__REV__ = __REV
5850
 
3341 yogev_ezra 5851
if ~ lang eq sp
2288 clevermous 5852
diff16 "end of kernel code",0,$
3287 esevece 5853
end if