Subversion Repositories Kolibri OS

Rev

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

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