Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1 ha 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;
5565 serge 3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved.
431 serge 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
543 spraid 19
;; SPraid (simba)
1043 hidnplayr 20
;; Hidnplayr
1273 Lrz 21
;; Alexey Teplov ()
2010 serge 22
;; Rus
23
;; Nable
24
;; shurf
25
;; Alver
26
;; Maxis
27
;; Galkov
28
;; CleverMouse
29
;; tsdima
30
;; turbanoff
31
;; Asper
32
;; art_zh
1 ha 33
;;
431 serge 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.
1 ha 37
;;
431 serge 38
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa
39
;; PROGRAMMING:
1 ha 40
;;
431 serge 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
1 ha 53
;;
431 serge 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
;;
1 ha 67
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
426 mikedld 68
 
3500 Serge 69
format binary as "mnt"
70
 
426 mikedld 71
include 'macros.inc'
2434 Serge 72
include 'struct.inc'
426 mikedld 73
 
425 victor 74
$Revision: 5594 $
426 mikedld 75
 
593 mikedld 76
 
1055 Galkov 77
USE_COM_IRQ     equ 1      ; make irq 3 and irq 4 available for PCI devices
3626 Serge 78
VESA_1_2_VIDEO  equ 0      ; enable vesa 1.2 bank switch functions
566 serge 79
 
1043 hidnplayr 80
; Enabling the next line will enable serial output console
3589 Serge 81
;debug_com_base  equ 0x3f8  ; 0x3f8 is com1, 0x2f8 is com2, 0x3e8 is com3, 0x2e8 is com4, no irq's are used
1043 hidnplayr 82
 
164 serge 83
include "proc32.inc"
7 me_root 84
include "kglobals.inc"
1 ha 85
include "lang.inc"
3555 Serge 86
include "encoding.inc"
1 ha 87
 
164 serge 88
include "const.inc"
3908 Serge 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
 
1055 Galkov 97
max_processes    equ   255
98
tss_step         equ   (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4
1 ha 99
 
1055 Galkov 100
os_stack       equ  (os_data_l-gdts)    ; GDTs
465 serge 101
os_code        equ  (os_code_l-gdts)
102
graph_data     equ  (3+graph_data_l-gdts)
1055 Galkov 103
tss0           equ  (tss0_l-gdts)
465 serge 104
app_code       equ  (3+app_code_l-gdts)
105
app_data       equ  (3+app_data_l-gdts)
1220 serge 106
app_tls        equ  (3+tls_data_l-gdts)
586 serge 107
pci_code_sel   equ  (pci_code_32-gdts)
108
pci_data_sel   equ  (pci_data_32-gdts)
1 ha 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
1055 Galkov 142
                  org   0x0
2434 Serge 143
        jmp     start_of_code
1 ha 144
 
3500 Serge 145
if lang eq sp
146
include "kernelsp.inc"  ; spanish kernel messages
4265 Serge 147
else if lang eq et
148
version db    'Kolibri OS  versioon 0.7.7.0+    ',13,10,13,10,0
3500 Serge 149
else
1324 Lrz 150
version db    'Kolibri OS  version 0.7.7.0+     ',13,10,13,10,0
3500 Serge 151
end if
1 ha 152
 
465 serge 153
include "boot/bootstr.inc"     ; language-independent boot messages
1 ha 154
include "boot/preboot.inc"
155
 
3500 Serge 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
465 serge 160
else if lang eq ru
161
include "boot/bootru.inc"      ; russian system boot messages
1055 Galkov 162
include "boot/ru.inc"          ; Russian font
465 serge 163
else if lang eq et
164
include "boot/bootet.inc"      ; estonian system boot messages
1055 Galkov 165
include "boot/et.inc"          ; Estonian font
465 serge 166
else
3500 Serge 167
include "boot/booten.inc"      ; english system boot messages
465 serge 168
end if
1 ha 169
 
465 serge 170
include "boot/bootcode.inc"    ; 16 bit system boot code
171
include "bus/pci/pci16.inc"
709 diamond 172
include "detect/biosdisk.inc"
1 ha 173
 
174
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
175
;;                                                                      ;;
176
;;                  SWITCH TO 32 BIT PROTECTED MODE                     ;;
177
;;                                                                      ;;
178
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
179
 
180
 
181
; CR0 Flags - Protected mode and Paging
182
 
2434 Serge 183
        mov     ecx, CR0_PE
1 ha 184
 
185
; Enabling 32 bit protected mode
186
 
1055 Galkov 187
        sidt    [cs:old_ints_h]
1 ha 188
 
1055 Galkov 189
        cli                             ; disable all irqs
190
        cld
2434 Serge 191
        mov     al, 255                 ; mask all irqs
192
        out     0xa1, al
193
        out     0x21, al
194
   l.5:
195
        in      al, 0x64                ; Enable A20
1055 Galkov 196
        test    al, 2
197
        jnz     l.5
198
        mov     al, 0xD1
199
        out     0x64, al
2434 Serge 200
   l.6:
201
        in      al, 0x64
1055 Galkov 202
        test    al, 2
203
        jnz     l.6
204
        mov     al, 0xDF
205
        out     0x60, al
2434 Serge 206
   l.7:
207
        in      al, 0x64
1055 Galkov 208
        test    al, 2
209
        jnz     l.7
210
        mov     al, 0xFF
211
        out     0x64, al
465 serge 212
 
1055 Galkov 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
1 ha 219
 
465 serge 220
align 8
221
tmp_gdt:
1 ha 222
 
1055 Galkov 223
        dw     23
224
        dd     tmp_gdt+0x10000
225
        dw     0
183 diamond 226
 
1055 Galkov 227
        dw     0xffff
228
        dw     0x0000
229
        db     0x00
230
        dw     11011111b *256 +10011010b
231
        db     0x00
375 Ghost 232
 
1055 Galkov 233
        dw     0xffff
234
        dw     0x0000
235
        db     0x00
236
        dw     11011111b *256 +10010010b
237
        db     0x00
1 ha 238
 
3500 Serge 239
include "data16.inc"
1 ha 240
 
3626 Serge 241
if ~ lang eq sp
242
diff16 "end of bootcode",0,$+0x10000
243
end if
244
 
465 serge 245
use32
246
org $+0x10000
1 ha 247
 
465 serge 248
align 4
249
B32:
2434 Serge 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
1 ha 257
 
465 serge 258
; CLEAR 0x280000 - HEAP_BASE
1 ha 259
 
2434 Serge 260
        xor     eax, eax
261
        mov     edi, CLEAN_ZONE
262
        mov     ecx, (HEAP_BASE-OS_BASE-CLEAN_ZONE) / 4
263
        cld
264
        rep stosd
1 ha 265
 
465 serge 266
; CLEAR KERNEL UNDEFINED GLOBALS
2434 Serge 267
        mov     edi, endofcode-OS_BASE
268
        mov     ecx, 0x90000
269
        sub     ecx, edi
270
        shr     ecx, 2
271
        rep stosd
1 ha 272
 
465 serge 273
; SAVE & CLEAR 0-0xffff
1 ha 274
 
2434 Serge 275
        mov     edi, 0x1000
3908 Serge 276
        mov     ecx, 0x8000 / 4
2434 Serge 277
        rep stosd
3908 Serge 278
        mov     edi, 0xa000
279
        mov     ecx, 0x6000 / 4
280
        rep stosd
429 serge 281
 
2434 Serge 282
        call    test_cpu
283
        bts     [cpu_caps-OS_BASE], CAPS_TSC    ;force use rdtsc
424 spraid 284
 
2434 Serge 285
        call    check_acpi
286
        call    init_BIOS32
465 serge 287
; MEMORY MODEL
2434 Serge 288
        call    mem_test
289
        call    init_mem
290
        call    init_page_map
1 ha 291
 
465 serge 292
; ENABLE PAGING
1 ha 293
 
5201 serge 294
        mov     eax, sys_proc-OS_BASE+PROC.pdt_0
2434 Serge 295
        mov     cr3, eax
1 ha 296
 
2434 Serge 297
        mov     eax, cr0
298
        or      eax, CR0_PG+CR0_WP
299
        mov     cr0, eax
1 ha 300
 
2434 Serge 301
        lgdt    [gdts]
302
        jmp     pword os_code:high_code
1 ha 303
 
513 serge 304
align 4
1055 Galkov 305
bios32_entry    dd ?
306
tmp_page_tabs   dd ?
586 serge 307
 
3500 Serge 308
use16
309
org $-0x10000
310
include "boot/shutdown.inc" ; shutdown or restart
311
org $+0x10000
5201 serge 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
3500 Serge 331
use32
498 diamond 332
 
3908 Serge 333
__DEBUG__ fix 1
465 serge 334
__DEBUG_LEVEL__ fix 1
335
include 'init.inc'
380 serge 336
 
465 serge 337
org OS_BASE+$
1 ha 338
 
2465 Serge 339
include 'fdo.inc'
340
 
465 serge 341
align 4
342
high_code:
2434 Serge 343
        mov     ax, os_stack
344
        mov     bx, app_data
345
        mov     cx, app_tls
346
        mov     ss, ax
347
        add     esp, OS_BASE
1 ha 348
 
2434 Serge 349
        mov     ds, bx
350
        mov     es, bx
351
        mov     fs, cx
352
        mov     gs, bx
1 ha 353
 
5565 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
 
361
        mov     eax, PG_GLOBAL
2434 Serge 362
        bt      [cpu_caps], CAPS_PGE
363
        jnc     @F
1 ha 364
 
5565 serge 365
        or      [sys_proc+PROC.pdt_0+(OS_BASE shr 20)], eax
366
        or      ebx, eax
519 serge 367
 
5565 serge 368
        mov     eax, cr4
369
        or      eax, CR4_PGE
370
        mov     cr4, eax
519 serge 371
@@:
5565 serge 372
        mov     [pte_valid_mask], ebx
373
 
3500 Serge 374
        xor     eax, eax
5201 serge 375
        mov     dword [sys_proc+PROC.pdt_0], eax
376
        mov     dword [sys_proc+PROC.pdt_0+4], eax
519 serge 377
 
3500 Serge 378
        mov     eax, cr3
379
        mov     cr3, eax          ; flush TLB
465 serge 380
 
2434 Serge 381
        mov     ecx, pg_data.mutex
382
        call    mutex_init
2130 serge 383
 
2434 Serge 384
        mov     ecx, disk_list_mutex
385
        call    mutex_init
2130 serge 386
 
2987 Serge 387
        mov     ecx, keyboard_list_mutex
388
        call    mutex_init
389
 
390
        mov     ecx, unpack_mutex
391
        call    mutex_init
392
 
3555 Serge 393
        mov     ecx, application_table_mutex
394
        call    mutex_init
395
 
3908 Serge 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
5201 serge 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
3908 Serge 410
;-----------------------------------------------------------------------------
1 ha 411
; SAVE REAL MODE VARIABLES
3908 Serge 412
;-----------------------------------------------------------------------------
76 mario79 413
; --------------- APM ---------------------
465 serge 414
 
415
; init selectors
3908 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
418
                                                                                ; protected-mode 32-bit code segment
419
        movzx   ecx, word [BOOT_VARS+BOOT_APM_CODE_16]; real-mode segment base address of
420
                                                                                ; protected-mode 16-bit code segment
421
        movzx   edx, word [BOOT_VARS+BOOT_APM_DATA_16]; real-mode segment base address of
2434 Serge 422
                                                                                ; protected-mode 16-bit data segment
465 serge 423
 
2434 Serge 424
        shl     eax, 4
425
        mov     [dword apm_code_32 + 2], ax
426
        shr     eax, 16
427
        mov     [dword apm_code_32 + 4], al
465 serge 428
 
2434 Serge 429
        shl     ecx, 4
430
        mov     [dword apm_code_16 + 2], cx
431
        shr     ecx, 16
432
        mov     [dword apm_code_16 + 4], cl
465 serge 433
 
2434 Serge 434
        shl     edx, 4
435
        mov     [dword apm_data_16 + 2], dx
436
        shr     edx, 16
437
        mov     [dword apm_data_16 + 4], dl
465 serge 438
 
2434 Serge 439
        mov     dword[apm_entry], ebx
440
        mov     word [apm_entry + 4], apm_code_32 - gdts
76 mario79 441
 
3908 Serge 442
        mov     eax, [BOOT_VARS + BOOT_APM_VERSION] ; version & flags
2434 Serge 443
        mov     [apm_vf], eax
76 mario79 444
; -----------------------------------------
3908 Serge 445
        mov     al, [BOOT_VARS+BOOT_DMA]            ; DMA access
2434 Serge 446
        mov     [allow_dma_access], al
3908 Serge 447
        movzx   eax, byte [BOOT_VARS+BOOT_BPP]      ; bpp
5201 serge 448
        mov     [_display.bits_per_pixel], eax
2434 Serge 449
        mov     [_display.vrefresh], 60
3908 Serge 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
454
        movzx   eax, word [BOOT_VARS+BOOT_X_RES]; X max
2434 Serge 455
        mov     [_display.width], eax
2987 Serge 456
        mov     [display_width_standard], eax
2434 Serge 457
        dec     eax
458
        mov     [screen_workarea.right], eax
3908 Serge 459
        movzx   eax, word [BOOT_VARS+BOOT_Y_RES]; Y max
2434 Serge 460
        mov     [_display.height], eax
2987 Serge 461
        mov     [display_height_standard], eax
2434 Serge 462
        dec     eax
463
        mov     [screen_workarea.bottom], eax
3908 Serge 464
        movzx   eax, word [BOOT_VARS+BOOT_VESA_MODE] ; screen mode
3626 Serge 465
        mov     dword [SCR_MODE], eax
3908 Serge 466
;        mov     eax, [BOOT_VAR+0x9014]             ; Vesa 1.2 bnk sw add
3589 Serge 467
;        mov     [BANK_SWITCH], eax
3626 Serge 468
        mov     eax, 640 *4                         ; Bytes PerScanLine
3908 Serge 469
        cmp     [SCR_MODE], word 0x13               ; 320x200
2434 Serge 470
        je      @f
3908 Serge 471
        cmp     [SCR_MODE], word 0x12               ; VGA 640x480
2434 Serge 472
        je      @f
3908 Serge 473
        movzx   eax, word[BOOT_VARS+BOOT_PITCH]      ; for other modes
3626 Serge 474
@@:
5565 serge 475
        mov     [_display.lfb_pitch], eax
2434 Serge 476
        mov     eax, [_display.width]
477
        mul     [_display.height]
5565 serge 478
        mov     [_display.win_map_size], eax
1300 serge 479
 
2439 Serge 480
        call    calculate_fast_getting_offset_for_WinMapAddress
2987 Serge 481
; for Qemu or non standart video cards
3232 Serge 482
; Unfortunately [BytesPerScanLine] does not always
2987 Serge 483
;                             equal to [_display.width] * [ScreenBPP] / 8
484
        call    calculate_fast_getting_offset_for_LFB
2439 Serge 485
 
3908 Serge 486
        mov     esi, BOOT_VARS+0x9080
1055 Galkov 487
        movzx   ecx, byte [esi-1]
488
        mov     [NumBiosDisks], ecx
489
        mov     edi, BiosDisksData
2434 Serge 490
        rep movsd
1 ha 491
 
5201 serge 492
setvideomode:
1 ha 493
 
3908 Serge 494
        mov     eax, [BOOT_VARS+BOOT_LFB]
2434 Serge 495
        mov     [LFBAddress], eax
1 ha 496
 
5201 serge 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
2439 Serge 509
 
5201 serge 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
1 ha 515
 
5201 serge 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
2987 Serge 542
        mov     [_display.check_mouse], check_mouse_area_for_putpixel
543
        mov     [_display.check_m_pixel], check_mouse_area_for_getpixel
544
 
375 Ghost 545
; -------- Fast System Call init ----------
378 serge 546
; Intel SYSENTER/SYSEXIT (AMD CPU support it too)
2434 Serge 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
434 diamond 554
;           mov eax, sysenter_stack ; Check it
2434 Serge 555
        xor     eax, eax
556
        wrmsr
557
        mov     ecx, MSR_SYSENTER_EIP
558
        mov     eax, sysenter_entry
559
        wrmsr
375 Ghost 560
.SEnP:
378 serge 561
; AMD SYSCALL/SYSRET
2434 Serge 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
164 serge 572
 
1055 Galkov 573
        ; !!!! It`s dirty hack, fix it !!!
574
        ; Bits of EDX :
3555 Serge 575
        ; Bit 31–16 During the SYSRET instruction, this field is copied into the CS register
1055 Galkov 576
        ;  and the contents of this field, plus 8, are copied into the SS register.
3555 Serge 577
        ; Bit 15–0 During the SYSCALL instruction, this field is copied into the CS register
1055 Galkov 578
        ;  and the contents of this field, plus 8, are copied into the SS register.
375 Ghost 579
 
1055 Galkov 580
        ; mov   edx, (os_code + 16) * 65536 + os_code
2434 Serge 581
        mov     edx, 0x1B0008
375 Ghost 582
 
2434 Serge 583
        mov     eax, syscall_entry
584
        mov     ecx, MSR_AMD_STAR
585
        wrmsr
375 Ghost 586
.noSYSCALL:
587
; -----------------------------------------
1310 diamond 588
        stdcall alloc_page
5565 serge 589
        stdcall map_page, tss-0xF80, eax, PG_SWR
1310 diamond 590
        stdcall alloc_page
5565 serge 591
        stdcall map_page, tss+0x80, eax, PG_SWR
1310 diamond 592
        stdcall alloc_page
5565 serge 593
        stdcall map_page, tss+0x1080, eax, PG_SWR
375 Ghost 594
 
465 serge 595
; LOAD IDT
378 serge 596
 
2434 Serge 597
        call    build_interrupt_table ;lidt is executed
1056 Galkov 598
          ;lidt [idtreg]
378 serge 599
 
2434 Serge 600
        call    init_kernel_heap
3555 Serge 601
        stdcall kernel_alloc, (RING0_STACK_SIZE+512) * 2
2434 Serge 602
        mov     [os_stack_seg], eax
164 serge 603
 
2434 Serge 604
        lea     esp, [eax+RING0_STACK_SIZE]
164 serge 605
 
2434 Serge 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
465 serge 616
;Add IO access table - bit array of permitted ports
2434 Serge 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
164 serge 622
 
2434 Serge 623
        mov     ax, tss0
624
        ltr     ax
378 serge 625
 
2987 Serge 626
        mov     [LFBSize], 0xC00000
2434 Serge 627
        call    init_LFB
628
        call    init_fpu
629
        call    init_malloc
276 serge 630
 
5201 serge 631
        stdcall alloc_kernel_space, 0x50000         ; FIXME check size
2434 Serge 632
        mov     [default_io_map], eax
465 serge 633
 
2434 Serge 634
        add     eax, 0x2000
635
        mov     [ipc_tmp], eax
636
        mov     ebx, 0x1000
164 serge 637
 
2434 Serge 638
        add     eax, 0x40000
639
        mov     [proc_mem_map], eax
164 serge 640
 
2434 Serge 641
        add     eax, 0x8000
642
        mov     [proc_mem_pdir], eax
164 serge 643
 
2434 Serge 644
        add     eax, ebx
645
        mov     [proc_mem_tab], eax
164 serge 646
 
2434 Serge 647
        add     eax, ebx
648
        mov     [tmp_task_ptab], eax
164 serge 649
 
2434 Serge 650
        add     eax, ebx
651
        mov     [ipc_pdir], eax
164 serge 652
 
2434 Serge 653
        add     eax, ebx
654
        mov     [ipc_ptab], eax
164 serge 655
 
2434 Serge 656
        stdcall kernel_alloc, (unpack.LZMA_BASE_SIZE+(unpack.LZMA_LIT_SIZE shl \
657
                (unpack.lc+unpack.lp)))*4
712 serge 658
 
2434 Serge 659
        mov     [unpack.p], eax
709 diamond 660
 
2434 Serge 661
        call    init_events
662
        mov     eax, srv.fd-SRV.fd
663
        mov     [srv.fd], eax
664
        mov     [srv.bk], eax
278 serge 665
 
41 mikedld 666
;Set base of graphic segment to linear address of LFB
2434 Serge 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
1 ha 672
 
5565 serge 673
        stdcall kernel_alloc, [_display.win_map_size]
674
        mov     [_display.win_map], eax
1300 serge 675
 
2434 Serge 676
        xor     eax, eax
677
        inc     eax
429 serge 678
 
469 serge 679
; set background
1300 serge 680
 
2434 Serge 681
        mov     [BgrDrawMode], eax
682
        mov     [BgrDataWidth], eax
683
        mov     [BgrDataHeight], eax
684
        mov     [mem_BACKGROUND], 4
685
        mov     [img_background], static_background_data
469 serge 686
 
4265 Serge 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
 
3500 Serge 700
; SET UP OS TASK
701
 
702
        mov     esi, boot_setostask
703
        call    boot_log
704
 
5577 serge 705
        mov     eax, sys_proc
706
        lea     edi, [eax+PROC.heap_lock]
707
        mov     ecx, (PROC.ht_free-PROC.heap_lock)/4
5201 serge 708
 
5577 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
 
5201 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
3555 Serge 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
3500 Serge 753
 
3555 Serge 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
3500 Serge 760
 
3555 Serge 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
3500 Serge 765
 
5201 serge 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
5565 serge 787
        stdcall map_io_mem, [acpi_lapic_base], 0x1000, PG_GLOBAL+PG_NOCACHE+PG_SWR
5201 serge 788
        mov     [LAPIC_BASE], eax
789
        lea     edi, [eax+300h]
790
        mov     esi, smpt+4
791
        dec     ebx
792
.wake_cpus_loop:
793
        lodsd
794
        push    esi
795
        xor     esi, esi
796
        inc     esi
797
        shl     eax, 24
798
        mov     [edi+10h], eax
799
; assert INIT IPI
800
        mov     dword [edi], 0C500h
801
        call    delay_ms
802
@@:
803
        test    dword [edi], 1000h
804
        jnz     @b
805
; deassert INIT IPI
806
        mov     dword [edi], 8500h
807
        call    delay_ms
808
@@:
809
        test    dword [edi], 1000h
810
        jnz     @b
811
; send STARTUP IPI
812
        mov     dword [edi], 600h + (8000h shr 12)
813
        call    delay_ms
814
@@:
815
        test    dword [edi], 1000h
816
        jnz     @b
817
        pop     esi
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:
3500 Serge 828
 
709 diamond 829
; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f
2987 Serge 830
        mov     esi, boot_initirq
831
        call    boot_log
832
        call    init_irqs
709 diamond 833
 
2987 Serge 834
        mov     esi, boot_picinit
835
        call    boot_log
2434 Serge 836
        call    PIC_init
709 diamond 837
 
2987 Serge 838
        mov     esi, boot_v86machine
839
        call    boot_log
709 diamond 840
; Initialize system V86 machine
1055 Galkov 841
        call    init_sys_v86
709 diamond 842
 
2987 Serge 843
        mov     esi, boot_inittimer
844
        call    boot_log
1638 serge 845
; Initialize system timer (IRQ0)
2434 Serge 846
        call    PIT_init
725 diamond 847
 
4287 Serge 848
; Register ramdisk file system
5201 serge 849
        cmp     [boot_dev+OS_BASE+0x10000], 1
850
        je      @f
3626 Serge 851
 
5201 serge 852
        call    register_ramdisk
853
;--------------------------------------
854
@@:
2987 Serge 855
        mov     esi, boot_initapic
856
        call    boot_log
1638 serge 857
; Try to Initialize APIC
2434 Serge 858
        call    APIC_init
725 diamond 859
 
3500 Serge 860
        mov     esi, boot_enableirq
861
        call    boot_log
3908 Serge 862
; Enable timer IRQ (IRQ0) and co-processor IRQ (IRQ13)
725 diamond 863
; they are used: when partitions are scanned, hd_read relies on timer
2434 Serge 864
        call    unmask_timer
2141 serge 865
        stdcall enable_irq, 2               ; @#$%! PIC
866
        stdcall enable_irq, 13              ; co-processor
725 diamond 867
 
5201 serge 868
; Setup serial output console (if enabled)
869
if defined debug_com_base
3908 Serge 870
 
5201 serge 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
1523 diamond 880
        out     dx, al
5201 serge 881
 
882
        ; Set speed to 115200 baud (max speed)
883
        mov     dx, debug_com_base
884
        mov     al, 0x01
1523 diamond 885
        out     dx, al
5201 serge 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
 
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
3908 Serge 921
@@:
5201 serge 922
        DEBUGF  1, "K : %d CPU detected\n", eax
3908 Serge 923
;-----------------------------------------------------------------------------
5201 serge 924
; detect Floppy drives
925
;-----------------------------------------------------------------------------
2987 Serge 926
        mov     esi, boot_detectfloppy
927
        call    boot_log
928
include 'detect/dev_fd.inc'
5201 serge 929
;-----------------------------------------------------------------------------
930
; create pci-devices list
931
;-----------------------------------------------------------------------------
932
        mov     [pci_access_enabled], 1
933
        call    pci_enum
934
;-----------------------------------------------------------------------------
935
; initialisation IDE ATA code
936
;-----------------------------------------------------------------------------
937
include 'detect/init_ata.inc'
938
;-----------------------------------------------------------------------------
1289 diamond 939
if 0
2434 Serge 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
2987 Serge 943
 
944
        mov     esi, boot_loadlibs
945
        call    boot_log
488 spraid 946
; LOADING LIBRARES
2434 Serge 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
488 spraid 950
no_lib_load:
1289 diamond 951
end if
488 spraid 952
 
1638 serge 953
; Display APIC status
2434 Serge 954
        mov     esi, boot_APIC_found
2219 Serge 955
        cmp     [irq_mode], IRQ_APIC
2434 Serge 956
        je      @f
957
        mov     esi, boot_APIC_nfound
2219 Serge 958
@@:
2987 Serge 959
        call    boot_log
1638 serge 960
 
1 ha 961
; PRINT AMOUNT OF MEMORY
1055 Galkov 962
        mov     esi, boot_memdetect
963
        call    boot_log
1 ha 964
 
1055 Galkov 965
        movzx   ecx, word [boot_y]
2130 serge 966
        if lang eq ru
2434 Serge 967
        or      ecx, (10+30*6) shl 16
3500 Serge 968
        else if lang eq sp
969
        or      ecx, (10+33*6) shl 16
3908 Serge 970
        else
2434 Serge 971
        or      ecx, (10+29*6) shl 16
3908 Serge 972
        end if
1055 Galkov 973
        sub     ecx, 10
974
        mov     edx, 0xFFFFFF
975
        mov     ebx, [MEM_AMOUNT]
976
        shr     ebx, 20
2434 Serge 977
        xor     edi, edi
1055 Galkov 978
        mov     eax, 0x00040000
2434 Serge 979
        inc     edi
1055 Galkov 980
        call    display_number_force
41 mikedld 981
 
465 serge 982
; BUILD SCHEDULER
983
 
2987 Serge 984
;        call    build_scheduler; sys32.inc
465 serge 985
 
2987 Serge 986
;        mov     esi, boot_devices
987
;        call    boot_log
567 serge 988
 
5201 serge 989
        call    clear_pci_ide_interrupts
567 serge 990
 
5201 serge 991
include "detect/vortex86.inc"                     ; Vortex86 SoC detection code
3555 Serge 992
 
5201 serge 993
        stdcall load_pe_driver, szVidintel, 0
994
 
3555 Serge 995
        call    usb_init
996
 
1 ha 997
; SET PRELIMINARY WINDOW STACK AND POSITIONS
998
 
2434 Serge 999
        mov     esi, boot_windefs
1000
        call    boot_log
1001
        call    set_window_defaults
1 ha 1002
 
1003
; SET BACKGROUND DEFAULTS
1004
 
2434 Serge 1005
        mov     esi, boot_bgr
1006
        call    boot_log
1007
        call    init_background
1008
        call    calculatebackground
1 ha 1009
 
1010
; RESERVE SYSTEM IRQ'S JA PORT'S
1011
 
2434 Serge 1012
        mov     esi, boot_resirqports
1013
        call    boot_log
1014
        call    reserve_irqs_ports
1 ha 1015
 
2434 Serge 1016
        call    init_display
1017
        mov     eax, [def_cursor]
1018
        mov     [SLOT_BASE+APPDATA.cursor+256], eax
3555 Serge 1019
        mov     [SLOT_BASE+APPDATA.cursor+256*2], eax
281 serge 1020
 
3555 Serge 1021
; PRINT CPU FREQUENCY
281 serge 1022
 
3555 Serge 1023
        mov     esi, boot_cpufreq
2434 Serge 1024
        call    boot_log
3555 Serge 1025
 
1026
        cli                         ;FIXME check IF
1027
        rdtsc
2434 Serge 1028
        mov     ecx, eax
1029
        mov     esi, 250            ; wait 1/4 a second
1030
        call    delay_ms
3555 Serge 1031
        rdtsc
5201 serge 1032
        sti
3555 Serge 1033
 
2434 Serge 1034
        sub     eax, ecx
3500 Serge 1035
        xor     edx, edx
1036
        shld    edx, eax, 2
2434 Serge 1037
        shl     eax, 2
3500 Serge 1038
        mov     dword [cpu_freq], eax
1039
        mov     dword [cpu_freq+4], edx
3555 Serge 1040
        mov     ebx, 1000000
1041
        div     ebx
1042
        mov     ebx, eax
1 ha 1043
 
1055 Galkov 1044
        movzx   ecx, word [boot_y]
2130 serge 1045
        if lang eq ru
3555 Serge 1046
        add     ecx, (10+19*6) shl 16 - 10
3500 Serge 1047
        else if lang eq sp
3555 Serge 1048
        add     ecx, (10+25*6) shl 16 - 10
3908 Serge 1049
        else
3555 Serge 1050
        add     ecx, (10+17*6) shl 16 - 10
3908 Serge 1051
        end if
3555 Serge 1052
 
1055 Galkov 1053
        mov     edx, 0xFFFFFF
2434 Serge 1054
        xor     edi, edi
1055 Galkov 1055
        mov     eax, 0x00040000
2229 Serge 1056
        inc     edi
1055 Galkov 1057
        call    display_number_force
1038 diamond 1058
 
1 ha 1059
; SET VARIABLES
1060
 
2434 Serge 1061
        call    set_variables
1 ha 1062
 
1063
; STACK AND FDC
1064
 
2434 Serge 1065
        call    stack_init
1066
        call    fdc_init
1 ha 1067
 
1068
; PALETTE FOR 320x200 and 640x480 16 col
1069
 
2434 Serge 1070
        cmp     [SCR_MODE], word 0x12
1071
        jne     no_pal_vga
1072
        mov     esi, boot_pal_vga
1073
        call    boot_log
1074
        call    paletteVGA
1 ha 1075
      no_pal_vga:
1076
 
2434 Serge 1077
        cmp     [SCR_MODE], word 0x13
1078
        jne     no_pal_ega
1079
        mov     esi, boot_pal_ega
1080
        call    boot_log
1081
        call    palette320x200
1 ha 1082
      no_pal_ega:
1083
 
1084
; LOAD DEFAULT SKIN
1085
 
1055 Galkov 1086
        call    load_default_skin
1 ha 1087
 
465 serge 1088
;protect io permission map
1089
 
2434 Serge 1090
        mov     esi, [default_io_map]
5565 serge 1091
        stdcall map_page, esi, [SLOT_BASE+256+APPDATA.io_map], PG_READ
2434 Serge 1092
        add     esi, 0x1000
5565 serge 1093
        stdcall map_page, esi, [SLOT_BASE+256+APPDATA.io_map+4], PG_READ
465 serge 1094
 
2434 Serge 1095
        stdcall map_page, tss._io_map_0, \
5565 serge 1096
                [SLOT_BASE+256+APPDATA.io_map], PG_READ
2434 Serge 1097
        stdcall map_page, tss._io_map_1, \
5565 serge 1098
                [SLOT_BASE+256+APPDATA.io_map+4], PG_READ
465 serge 1099
 
2141 serge 1100
; SET KEYBOARD PARAMETERS
2434 Serge 1101
        mov     al, 0xf6       ; reset keyboard, scan enabled
5201 serge 1102
        call    kb_write_wait_ack
2987 Serge 1103
        test    ah, ah
1104
        jnz     .no_keyboard
2141 serge 1105
 
2987 Serge 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
2141 serge 1115
       ; mov   al, 0xED       ; Keyboard LEDs - only for testing!
5201 serge 1116
       ; call  kb_write_wait_ack
2141 serge 1117
       ; mov   al, 111b
5201 serge 1118
       ; call  kb_write_wait_ack
2141 serge 1119
 
2434 Serge 1120
        mov     al, 0xF3     ; set repeat rate & delay
5201 serge 1121
        call    kb_write_wait_ack
2434 Serge 1122
        mov     al, 0; 30 250 ;00100010b ; 24 500  ;00100100b  ; 20 500
5201 serge 1123
        call    kb_write_wait_ack
2141 serge 1124
     ;// mike.dld [
2434 Serge 1125
        call    set_lights
2141 serge 1126
     ;// mike.dld ]
1127
        stdcall attach_int_handler, 1, irq1, 0
5201 serge 1128
        DEBUGF  1, "K : IRQ1 return code %x\n", eax
2987 Serge 1129
.no_keyboard:
2141 serge 1130
 
5201 serge 1131
; Load PS/2 mouse driver
2141 serge 1132
 
5201 serge 1133
        stdcall load_pe_driver, szPS2MDriver, 0
2141 serge 1134
 
2434 Serge 1135
        mov     esi, boot_setmouse
1136
        call    boot_log
1137
        call    setmouse
2141 serge 1138
 
5201 serge 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
1043 hidnplayr 1142
 
5201 serge 1143
        cli
1144
        mov     ebp, firstapp
1145
        call    fs_execute_from_sysdir
1146
        test    eax, eax
1147
        jns     first_app_found
1043 hidnplayr 1148
 
5201 serge 1149
        mov     esi, boot_failed
1150
        call    boot_log
1043 hidnplayr 1151
 
5201 serge 1152
        mov     eax, 0xDEADBEEF      ; otherwise halt
1153
        hlt
1043 hidnplayr 1154
 
5201 serge 1155
first_app_found:
1043 hidnplayr 1156
 
2010 serge 1157
; START MULTITASKING
1 ha 1158
 
1638 serge 1159
; A 'All set - press ESC to start' messages if need
767 diamond 1160
if preboot_blogesc
1055 Galkov 1161
        mov     esi, boot_tasking
1162
        call    boot_log
2434 Serge 1163
.bll1:
1164
        in      al, 0x60        ; wait for ESC key press
1055 Galkov 1165
        cmp     al, 129
1166
        jne     .bll1
767 diamond 1167
end if
1168
 
5201 serge 1169
        mov     [timer_ticks_enable], 1         ; for cd driver
3908 Serge 1170
 
5201 serge 1171
        sti
3908 Serge 1172
 
5201 serge 1173
        call    mtrr_validate
3725 Serge 1174
 
5201 serge 1175
        jmp     osloop
3908 Serge 1176
 
1177
 
5201 serge 1178
        ; Fly :)
3908 Serge 1179
 
5201 serge 1180
uglobal
1181
align 4
1182
ap_initialized  dd      0
1183
endg
3908 Serge 1184
 
5201 serge 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
1195
        mov     eax, sys_proc-OS_BASE+PROC.pdt_0
1196
        mov     cr3, eax
1197
        lock inc [ap_initialized]
1198
        jmp     idle_loop
3908 Serge 1199
 
1200
 
465 serge 1201
include 'unpacker.inc'
1202
 
1203
align 4
1204
boot_log:
2217 Serge 1205
        pushad
465 serge 1206
 
2434 Serge 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
465 serge 1215
 
2434 Serge 1216
        mov     [novesachecksum], 1000
1217
        call    checkVga_N13
465 serge 1218
 
1276 Lrz 1219
        popad
465 serge 1220
 
1276 Lrz 1221
        ret
465 serge 1222
 
3555 Serge 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
 
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
 
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
 
5201 serge 1258
        mov     [edx + APPDATA.process], sys_proc
3555 Serge 1259
 
5201 serge 1260
        lea     ebx, [edx+APPDATA.list]
1261
        lea     ecx, [sys_proc+PROC.thr_list]
1262
        list_add_tail ebx, ecx
1263
 
3555 Serge 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
 
1 ha 1273
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1274
;                                                                    ;
33 mario79 1275
;                    MAIN OS LOOP START                              ;
1 ha 1276
;                                                                    ;
1277
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1278
align 32
1279
osloop:
3555 Serge 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
5201 serge 1287
 
2465 Serge 1288
        call    __sys_draw_pointer
2434 Serge 1289
        call    window_check_events
1290
        call    mouse_check_events
1291
        call    checkmisc
1292
        call    checkVga_N13
5201 serge 1293
;--------------------------------------
3555 Serge 1294
.no_periodic:
2434 Serge 1295
        call    stack_handler
1296
        call    check_fdd_motor_status
1297
        call    check_ATAPI_device_event
2987 Serge 1298
        call    check_lights_state
2434 Serge 1299
        call    check_timers
5201 serge 1300
 
2434 Serge 1301
        jmp     osloop
33 mario79 1302
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1303
;                                                                    ;
1304
;                      MAIN OS LOOP END                              ;
1305
;                                                                    ;
1306
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3555 Serge 1307
proc osloop_has_work?
1308
        cmp     [osloop_nonperiodic_work], 0
1309
        jnz     .yes
1310
        call    stack_handler_has_work?
1311
        jnz     .yes
4287 Serge 1312
        call    check_fdd_motor_status_has_work?
1313
        jnz     .yes
3555 Serge 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
1055 Galkov 1322
        ret
3555 Serge 1323
.yes:
1324
        xor     eax, eax
1325
        inc     eax
1326
        ret
1327
endp
1 ha 1328
 
3555 Serge 1329
proc wakeup_osloop
1330
        mov     [osloop_nonperiodic_work], 1
1331
        ret
1332
endp
1333
 
1 ha 1334
uglobal
3555 Serge 1335
align 4
1336
osloop_nonperiodic_work dd      ?
1 ha 1337
endg
1338
 
5201 serge 1339
uglobal
1340
align 64
1341
idle_addr       rb      64
1342
endg
1343
 
3555 Serge 1344
idle_thread:
1345
        sti
5201 serge 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.
3555 Serge 1351
idle_loop:
5201 serge 1352
        cmp     [use_mwait_for_idle], 0
1353
        jnz     idle_loop_mwait
1354
 
1355
idle_loop_hlt:
3555 Serge 1356
        hlt
5201 serge 1357
        jmp     idle_loop_hlt
1 ha 1358
 
5201 serge 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
1 ha 1368
 
3555 Serge 1369
 
1 ha 1370
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1371
;                                                                      ;
1372
;                   INCLUDED SYSTEM FILES                              ;
1373
;                                                                      ;
1374
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1375
 
1376
 
7 me_root 1377
include "kernel32.inc"
1 ha 1378
 
1379
 
1380
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1381
;                                                                      ;
1382
;                       KERNEL FUNCTIONS                               ;
1383
;                                                                      ;
1384
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1385
 
1386
reserve_irqs_ports:
1387
 
1273 Lrz 1388
 
1389
; RESERVE PORTS
2434 Serge 1390
        mov     eax, RESERVED_PORTS
1391
        mov     ecx, 1
1273 Lrz 1392
 
2434 Serge 1393
        mov     [eax], dword 4
269 serge 1394
 
2434 Serge 1395
        mov     [eax+16], ecx
1396
        mov     [eax+16+4], dword 0
3500 Serge 1397
        mov     [eax+16+8], dword 0x2D
269 serge 1398
 
2434 Serge 1399
        mov     [eax+32], ecx
1400
        mov     [eax+32+4], dword 0x30
1401
        mov     [eax+32+8], dword 0x4D
233 serge 1402
 
2434 Serge 1403
        mov     [eax+48], ecx
1404
        mov     [eax+48+4], dword 0x50
3500 Serge 1405
        mov     [eax+48+8], dword 0xDF
233 serge 1406
 
2434 Serge 1407
        mov     [eax+64], ecx
1408
        mov     [eax+64+4], dword 0xE5
1409
        mov     [eax+64+8], dword 0xFF
1273 Lrz 1410
 
1055 Galkov 1411
        ret
1 ha 1412
 
1413
 
1414
iglobal
3555 Serge 1415
  process_number dd 0x2
1 ha 1416
endg
1417
 
1418
set_variables:
1419
 
2434 Serge 1420
        mov     ecx, 0x16                    ; flush port 0x60
2141 serge 1421
.fl60:
2434 Serge 1422
        in      al, 0x60
1423
        loop    .fl60
1424
        push    eax
1 ha 1425
 
3908 Serge 1426
        mov     ax, [BOOT_VARS+BOOT_Y_RES]
2434 Serge 1427
        shr     ax, 1
1428
        shl     eax, 16
3908 Serge 1429
        mov     ax, [BOOT_VARS+BOOT_X_RES]
2434 Serge 1430
        shr     ax, 1
1431
        mov     [MOUSE_X], eax
3555 Serge 1432
        call    wakeup_osloop
41 mikedld 1433
 
2434 Serge 1434
        xor     eax, eax
1435
        mov     [BTN_ADDR], dword BUTTON_INFO ; address of button list
1 ha 1436
 
2434 Serge 1437
        mov     byte [KEY_COUNT], al              ; keyboard buffer
1438
        mov     byte [BTN_COUNT], al              ; button buffer
1267 Lrz 1439
;        mov   [MOUSE_X],dword 100*65536+100    ; mouse x/y
1440
 
2434 Serge 1441
        pop     eax
1055 Galkov 1442
        ret
1 ha 1443
 
1444
align 4
1304 Lrz 1445
;input  eax=43,bl-byte of output, ecx - number of port
1 ha 1446
sys_outport:
1447
 
2434 Serge 1448
        mov     edi, ecx   ; separate flag for read / write
1449
        and     ecx, 65535
1 ha 1450
 
2434 Serge 1451
        mov     eax, [RESERVED_PORTS]
1452
        test    eax, eax
1453
        jnz     .sopl8
1454
        inc     eax
1455
        mov     [esp+32], eax
1456
        ret
1 ha 1457
 
1304 Lrz 1458
  .sopl8:
2434 Serge 1459
        mov     edx, [TASK_BASE]
1460
        mov     edx, [edx+0x4]
1304 Lrz 1461
    ;and   ecx,65535
1462
    ;cld - set on interrupt 0x40
1463
  .sopl1:
1 ha 1464
 
2434 Serge 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
1304 Lrz 1474
.sopl3:
1 ha 1475
 
2434 Serge 1476
        test    edi, 0x80000000; read ?
1477
        jnz     .sopl4
1 ha 1478
 
2434 Serge 1479
        mov     eax, ebx
1480
        mov     dx, cx   ; write
1481
        out     dx, al
1482
        and     [esp+32], dword 0
1483
        ret
1 ha 1484
 
2434 Serge 1485
        .sopl2:
1 ha 1486
 
2434 Serge 1487
        dec     eax
1488
        jnz     .sopl1
1489
        inc     eax
1490
        mov     [esp+32], eax
1491
        ret
1 ha 1492
 
1638 serge 1493
 
1304 Lrz 1494
  .sopl4:
1 ha 1495
 
2434 Serge 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
1 ha 1502
 
1503
display_number:
1369 Lrz 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
1 ha 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
2434 Serge 1521
        xor     edi, edi
211 serge 1522
display_number_force:
2434 Serge 1523
        push    eax
1524
        and     eax, 0x3fffffff
1525
        cmp     eax, 0xffff     ; length > 0 ?
1526
        pop     eax
1527
        jge     cont_displ
1528
        ret
1 ha 1529
   cont_displ:
2434 Serge 1530
        push    eax
1531
        and     eax, 0x3fffffff
1532
        cmp     eax, 61*0x10000  ; length <= 60 ?
1533
        pop     eax
1534
        jb      cont_displ2
1535
        ret
1 ha 1536
   cont_displ2:
1537
 
2434 Serge 1538
        pushad
1 ha 1539
 
2434 Serge 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]
1276 Lrz 1546
 displnl1:
2434 Serge 1547
        sub     esp, 64
1 ha 1548
 
2434 Serge 1549
        test    ah, ah            ; DECIMAL
1550
        jnz     no_display_desnum
1551
        shr     eax, 16
1552
        and     eax, 0xC03f
652 mario79 1553
;     and   eax,0x3f
2434 Serge 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
1276 Lrz 1561
 d_desnum:
2434 Serge 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
1 ha 1575
   no_display_desnum:
1576
 
2434 Serge 1577
        cmp     ah, 0x01         ; HEXADECIMAL
1578
        jne     no_display_hexnum
1579
        shr     eax, 16
1580
        and     eax, 0xC03f
652 mario79 1581
;     and   eax,0x3f
2434 Serge 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
1 ha 1589
   d_hexnum:
2434 Serge 1590
        xor     edx, edx
1591
        call    division_64_bits
1592
        div     ebx
1056 Galkov 1593
   hexletters = __fdo_hexdigits
2434 Serge 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
1 ha 1605
   no_display_hexnum:
1606
 
2434 Serge 1607
        cmp     ah, 0x02         ; BINARY
1608
        jne     no_display_binnum
1609
        shr     eax, 16
1610
        and     eax, 0xC03f
652 mario79 1611
;     and   eax,0x3f
2434 Serge 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
1 ha 1619
   d_binnum:
2434 Serge 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
1 ha 1633
   no_display_binnum:
1634
 
2434 Serge 1635
        add     esp, 64
1636
        popad
1637
        ret
1 ha 1638
 
652 mario79 1639
normalize_number:
2434 Serge 1640
        test    ah, 0x80
1641
        jz      .continue
1642
        mov     ecx, 48
1643
        and     eax, 0x3f
652 mario79 1644
@@:
2434 Serge 1645
        inc     edi
1646
        cmp     [edi], cl
1647
        jne     .continue
1648
        dec     eax
1649
        cmp     eax, 1
1650
        ja      @r
1651
        mov     al, 1
652 mario79 1652
.continue:
2434 Serge 1653
        and     eax, 0x3f
1654
        ret
1 ha 1655
 
655 mario79 1656
division_64_bits:
2434 Serge 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
655 mario79 1664
.continue:
2434 Serge 1665
        ret
652 mario79 1666
 
1 ha 1667
draw_num_text:
2434 Serge 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]
684 diamond 1673
; add window start x & y
2434 Serge 1674
        mov     ecx, [TASK_BASE]
465 serge 1675
 
2434 Serge 1676
        mov     edi, [CURRENT_TASK]
1677
        shl     edi, 8
465 serge 1678
 
2434 Serge 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]
1055 Galkov 1686
        and     ecx, not 0x80000000     ; force counted string
1687
        mov     eax, [esp+64+8]         ; background color (if given)
1688
        mov     edi, [esp+64+4]
2434 Serge 1689
        jmp     dtext
5201 serge 1690
;-----------------------------------------------------------------------------
5594 serge 1691
uglobal
1692
midi_base dw ?
5201 serge 1693
endg
1694
;-----------------------------------------------------------------------------
1 ha 1695
align 4
1696
sys_setup:
5201 serge 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
1 ha 1707
; 11 = enable lba read
1708
; 12 = enable pci access
5201 serge 1709
;-----------------------------------------------------------------------------
1710
        and     [esp+32], dword 0
1711
; F.21.1 - set MPU MIDI base port
1712
        dec     ebx
1713
        jnz     @f
1 ha 1714
 
2434 Serge 1715
        cmp     ecx, 0x100
5201 serge 1716
        jb      @f
1 ha 1717
 
2434 Serge 1718
        mov     esi, 65535
1719
        cmp     esi, ecx
5201 serge 1720
        jb      @f
1276 Lrz 1721
 
5201 serge 1722
        mov     [midi_base], cx
1723
        mov     word [mididp], cx
1724
        inc     cx
1725
        mov     word [midisp], cx
2434 Serge 1726
        ret
5201 serge 1727
;--------------------------------------
1728
@@:
1729
; F.21.2 - set keyboard layout
1730
        dec     ebx
1731
        jnz     @f
1276 Lrz 1732
 
2434 Serge 1733
        mov     edi, [TASK_BASE]
1734
        mov     eax, [edi+TASKDATA.mem_start]
1735
        add     eax, edx
5201 serge 1736
; 1 = normal layout
1737
        dec     ecx
1738
        jnz     .shift
1 ha 1739
 
2434 Serge 1740
        mov     ebx, keymap
1741
        mov     ecx, 128
1742
        call    memmove
1743
        ret
5201 serge 1744
;--------------------------------------
1745
.shift:
1746
; 2 = layout at pressed Shift
2434 Serge 1747
        dec     ecx
5201 serge 1748
        jnz     .alt
1276 Lrz 1749
 
2434 Serge 1750
        mov     ebx, keymap_shift
1751
        mov     ecx, 128
1752
        call    memmove
1753
        ret
5201 serge 1754
;--------------------------------------
1755
.alt:
1756
; 3 = layout at pressed Alt
2434 Serge 1757
        dec     ecx
5201 serge 1758
        jnz     .country
1759
 
2434 Serge 1760
        mov     ebx, keymap_alt
1761
        mov     ecx, 128
1762
        call    memmove
1763
        ret
5201 serge 1764
;--------------------------------------
1765
.country:
1766
; country identifier
2434 Serge 1767
        sub     ecx, 6
5201 serge 1768
        jnz     .error
1769
 
2434 Serge 1770
        mov     word [keyboard], dx
1771
        ret
5201 serge 1772
;--------------------------------------
1773
@@:
1774
; F.21.5 - set system language
1775
        sub     ebx, 3
1776
        jnz     @f
1276 Lrz 1777
 
2434 Serge 1778
        mov     [syslang], ecx
1779
        ret
5201 serge 1780
;--------------------------------------
1781
@@:
1782
; F.21.11 - enable/disable low-level access to HD
1783
        and     ecx, 1
1784
        sub     ebx, 6
1785
        jnz     @f
1638 serge 1786
 
5201 serge 1787
        mov     [lba_read_enabled], ecx
2434 Serge 1788
        ret
5201 serge 1789
;--------------------------------------
1790
@@:
1791
; F.21.12 - enable/disable low-level access to PCI
2434 Serge 1792
        dec     ebx
5201 serge 1793
        jnz     .error
1 ha 1794
 
2434 Serge 1795
        mov     [pci_access_enabled], ecx
1796
        ret
5201 serge 1797
;--------------------------------------
1798
.error:
2434 Serge 1799
        or      [esp+32], dword -1
1800
        ret
5201 serge 1801
;-----------------------------------------------------------------------------
1 ha 1802
align 4
1803
sys_getsetup:
5201 serge 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
1 ha 1820
 
2434 Serge 1821
        movzx   eax, [midi_base]
1822
        mov     [esp+32], eax
1823
        ret
5201 serge 1824
;--------------------------------------
1825
@@:
1826
; F.26.2 - get keyboard layout
2434 Serge 1827
        dec     ebx
5201 serge 1828
        jnz     @f
1 ha 1829
 
2434 Serge 1830
        mov     edi, [TASK_BASE]
1831
        mov     ebx, [edi+TASKDATA.mem_start]
1832
        add     ebx, edx
5201 serge 1833
; 1 = normal layout
1834
        dec     ecx
1835
        jnz     .shift
1276 Lrz 1836
 
2434 Serge 1837
        mov     eax, keymap
1838
        mov     ecx, 128
1839
        call    memmove
1840
        ret
5201 serge 1841
;--------------------------------------
1842
.shift:
1843
; 2 = layout with pressed Shift
2434 Serge 1844
        dec     ecx
5201 serge 1845
        jnz     .alt
1276 Lrz 1846
 
2434 Serge 1847
        mov     eax, keymap_shift
1848
        mov     ecx, 128
1849
        call    memmove
1850
        ret
5201 serge 1851
;--------------------------------------
1852
.alt:
1853
; 3 = layout with pressed Alt
2434 Serge 1854
        dec     ecx
5201 serge 1855
        jne     .country
1276 Lrz 1856
 
2434 Serge 1857
        mov     eax, keymap_alt
1858
        mov     ecx, 128
1859
        call    memmove
1860
        ret
5201 serge 1861
;--------------------------------------
1862
.country:
1863
; 9 = country identifier
2434 Serge 1864
        sub     ecx, 6
5201 serge 1865
        jnz     .error
1866
 
2434 Serge 1867
        movzx   eax, word [keyboard]
1868
        mov     [esp+32], eax
1869
        ret
5201 serge 1870
;--------------------------------------
1871
@@:
1872
; F.26.5 - get system language
1873
        sub     ebx, 3
1874
        jnz     @f
1276 Lrz 1875
 
2434 Serge 1876
        mov     eax, [syslang]
1877
        mov     [esp+32], eax
1276 Lrz 1878
        ret
5201 serge 1879
;--------------------------------------
1880
@@:
1881
; F.26.9 - get the value of the time counter
1882
        sub     ebx, 4
1883
        jnz     @f
1884
 
1885
        mov     eax, [timer_ticks]
2434 Serge 1886
        mov     [esp+32], eax
1887
        ret
5201 serge 1888
;--------------------------------------
1889
@@:
1890
; F.26.11 - Find out whether low-level HD access is enabled
2434 Serge 1891
        sub     ebx, 2
5201 serge 1892
        jnz     @f
1893
 
2434 Serge 1894
        mov     eax, [lba_read_enabled]
1895
        mov     [esp+32], eax
1896
        ret
5201 serge 1897
;--------------------------------------
1898
@@:
1899
; F.26.12 - Find out whether low-level PCI access is enabled
2434 Serge 1900
        dec     ebx
5201 serge 1901
        jnz     .error
1902
 
2434 Serge 1903
        mov     eax, [pci_access_enabled]
1904
        mov     [esp+32], eax
1905
        ret
5201 serge 1906
;--------------------------------------
1907
.error:
1908
        or      [esp+32], dword -1
2434 Serge 1909
        ret
5201 serge 1910
;-----------------------------------------------------------------------------
479 kastigar 1911
get_timer_ticks:
2434 Serge 1912
        mov     eax, [timer_ticks]
1913
        ret
5201 serge 1914
;-----------------------------------------------------------------------------
283 diamond 1915
iglobal
1 ha 1916
align 4
221 serge 1917
mousefn dd msscreen, mswin, msbutton, msset
1055 Galkov 1918
        dd app_load_cursor
1919
        dd app_set_cursor
1920
        dd app_delete_cursor
1921
        dd msz
283 diamond 1922
endg
5201 serge 1923
;-----------------------------------------------------------------------------
1 ha 1924
readmousepos:
1925
 
1926
; eax=0 screen relative
1927
; eax=1 window relative
1928
; eax=2 buttons pressed
221 serge 1929
; eax=3 set mouse pos   ; reserved
1930
; eax=4 load cursor
1931
; eax=5 set cursor
1932
; eax=6 delete cursor   ; reserved
479 kastigar 1933
; eax=7 get mouse_z
1 ha 1934
 
2434 Serge 1935
        cmp     ebx, 7
1936
        ja      msset
1937
        jmp     [mousefn+ebx*4]
221 serge 1938
msscreen:
2434 Serge 1939
        mov     eax, [MOUSE_X]
1940
        shl     eax, 16
1941
        mov     ax, [MOUSE_Y]
1942
        mov     [esp+36-4], eax
1943
        ret
221 serge 1944
mswin:
2434 Serge 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
1 ha 1953
 
2434 Serge 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
221 serge 1962
msbutton:
2434 Serge 1963
        movzx   eax, byte [BTN_DOWN]
1964
        mov     [esp+36-4], eax
1965
        ret
479 kastigar 1966
msz:
2434 Serge 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
479 kastigar 1978
       @@:
2434 Serge 1979
        and     [esp+36-4], dword 0
1276 Lrz 1980
;           ret
221 serge 1981
msset:
2434 Serge 1982
        ret
164 serge 1983
 
221 serge 1984
app_load_cursor:
2434 Serge 1985
        cmp     ecx, OS_BASE
1986
        jae     msset
1987
        stdcall load_cursor, ecx, edx
1988
        mov     [esp+36-4], eax
1989
        ret
164 serge 1990
 
221 serge 1991
app_set_cursor:
2434 Serge 1992
        stdcall set_cursor, ecx
1993
        mov     [esp+36-4], eax
1994
        ret
1 ha 1995
 
233 serge 1996
app_delete_cursor:
2434 Serge 1997
        stdcall delete_cursor, ecx
1998
        mov     [esp+36-4], eax
1999
        ret
1 ha 2000
 
2001
is_input:
2002
 
2434 Serge 2003
        push    edx
2004
        mov     dx, word [midisp]
2005
        in      al, dx
2006
        and     al, 0x80
2007
        pop     edx
2008
        ret
1 ha 2009
 
2010
is_output:
2011
 
2434 Serge 2012
        push    edx
2013
        mov     dx, word [midisp]
2014
        in      al, dx
2015
        and     al, 0x40
2016
        pop     edx
2017
        ret
1 ha 2018
 
2019
 
2020
get_mpu_in:
2021
 
2434 Serge 2022
        push    edx
2023
        mov     dx, word [mididp]
2024
        in      al, dx
2025
        pop     edx
2026
        ret
1 ha 2027
 
2028
 
2029
put_mpu_out:
2030
 
2434 Serge 2031
        push    edx
2032
        mov     dx, word [mididp]
2033
        out     dx, al
2034
        pop     edx
2035
        ret
1 ha 2036
 
2037
 
2038
 
2039
align 4
2040
 
2041
sys_midi:
2434 Serge 2042
        cmp     [mididp], 0
2043
        jnz     sm0
2044
        mov     [esp+36], dword 1
2045
        ret
1276 Lrz 2046
sm0:
2434 Serge 2047
        and     [esp+36], dword 0
2048
        dec     ebx
2049
        jnz     smn1
1276 Lrz 2050
 ;    call setuart
2051
su1:
2434 Serge 2052
        call    is_output
2053
        test    al, al
2054
        jnz     su1
2055
        mov     dx, word [midisp]
2056
        mov     al, 0xff
2057
        out     dx, al
1276 Lrz 2058
su2:
2434 Serge 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
1276 Lrz 2068
su3:
2434 Serge 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
1276 Lrz 2076
smn1:
2434 Serge 2077
        dec     ebx
2078
        jnz     smn2
1276 Lrz 2079
sm10:
2434 Serge 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
1 ha 2088
 
2089
detect_devices:
2090
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
769 Rus 2091
;include 'detect/commouse.inc'
479 kastigar 2092
;include 'detect/ps2mouse.inc'
1 ha 2093
;include 'detect/dev_fd.inc'
2094
;include 'detect/dev_hdcd.inc'
2095
;include 'detect/sear_par.inc'
2096
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2434 Serge 2097
        ret
1 ha 2098
 
2099
sys_end:
2434 Serge 2100
;--------------------------------------
2101
        cmp     [_display.select_cursor], 0
2102
        je      @f
2103
; restore default cursor before killing
2104
        pusha
2105
        mov     ecx, [current_slot]
2439 Serge 2106
        call    restore_default_cursor_before_killing
2434 Serge 2107
        popa
2108
@@:
2109
;--------------------------------------
3555 Serge 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
;--------------------------------------
2434 Serge 2117
        mov     ecx, [current_slot]
2118
        mov     eax, [ecx+APPDATA.tls_base]
2119
        test    eax, eax
2120
        jz      @F
1220 serge 2121
 
2434 Serge 2122
        stdcall user_free, eax
1220 serge 2123
@@:
2124
 
2434 Serge 2125
        mov     eax, [TASK_BASE]
2126
        mov     [eax+TASKDATA.state], 3; terminate this program
3555 Serge 2127
        call    wakeup_osloop
41 mikedld 2128
 
3626 Serge 2129
.waitterm:            ; wait here for termination
2130
        call    change_task
2131
        jmp     .waitterm
2439 Serge 2132
;------------------------------------------------------------------------------
2465 Serge 2133
align 4
2439 Serge 2134
restore_default_cursor_before_killing:
2987 Serge 2135
        pushfd
2136
        cli
2439 Serge 2137
        mov     eax, [def_cursor]
2138
        mov     [ecx+APPDATA.cursor], eax
1 ha 2139
 
2439 Serge 2140
        movzx   eax, word [MOUSE_Y]
2141
        movzx   ebx, word [MOUSE_X]
2465 Serge 2142
        mov     eax, [d_width_calc_area + eax*4]
2143
 
5565 serge 2144
        add     eax, [_display.win_map]
2439 Serge 2145
        movzx   edx, byte [ebx+eax]
2146
        shl     edx, 8
2147
        mov     esi, [edx+SLOT_BASE+APPDATA.cursor]
2465 Serge 2148
 
2149
        cmp     esi, [current_cursor]
2150
        je      @f
2151
 
2439 Serge 2152
        push    esi
2153
        call    [_display.select_cursor]
2154
        mov     [current_cursor], esi
2465 Serge 2155
@@:
2156
        mov     [redrawmouse_unconditional], 1
3555 Serge 2157
        call    wakeup_osloop
2987 Serge 2158
        popfd
2439 Serge 2159
        ret
2160
;------------------------------------------------------------------------------
75 diamond 2161
iglobal
170 serge 2162
align 4
75 diamond 2163
sys_system_table:
2268 Serge 2164
        dd      sysfn_deactivate        ; 1 = deactivate window
1055 Galkov 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
2987 Serge 2187
        dd      sysfn_min_windows       ; 23 = minimize all windows
2188
        dd      sysfn_set_screen_sizes  ; 24 = set screen sizes for Vesa
75 diamond 2189
sysfn_num = ($ - sys_system_table)/4
2190
endg
2268 Serge 2191
;------------------------------------------------------------------------------
1 ha 2192
sys_system:
1055 Galkov 2193
        dec     ebx
2194
        cmp     ebx, sysfn_num
2195
        jae     @f
2196
        jmp     dword [sys_system_table + ebx*4]
75 diamond 2197
@@:
1055 Galkov 2198
        ret
2268 Serge 2199
;------------------------------------------------------------------------------
1055 Galkov 2200
sysfn_shutdown:          ; 18.9 = system shutdown
2434 Serge 2201
        cmp     ecx, 1
2202
        jl      exit_for_anyone
2203
        cmp     ecx, 4
2204
        jg      exit_for_anyone
3908 Serge 2205
        mov     [BOOT_VARS+0x9030], cl
748 heavyiron 2206
 
2434 Serge 2207
        mov     eax, [TASK_COUNT]
2208
        mov     [SYS_SHUTDOWN], al
2209
        mov     [shutdown_processes], eax
3555 Serge 2210
        call    wakeup_osloop
2434 Serge 2211
        and     dword [esp+32], 0
748 heavyiron 2212
 exit_for_anyone:
2434 Serge 2213
        ret
1 ha 2214
  uglobal
2434 Serge 2215
   shutdown_processes:
2216
                       dd 0x0
1 ha 2217
  endg
2268 Serge 2218
;------------------------------------------------------------------------------
1055 Galkov 2219
sysfn_terminate:        ; 18.2 = TERMINATE
2987 Serge 2220
        push    ecx
2434 Serge 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
3500 Serge 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
2434 Serge 2238
;--------------------------------------
3555 Serge 2239
; terminate all network sockets it used
2240
        pusha
2241
        mov     eax, edx
2242
        call    SOCKET_process_end
2243
        popa
2244
;--------------------------------------
2434 Serge 2245
        cmp     [_display.select_cursor], 0
2465 Serge 2246
        je      .restore_end
2434 Serge 2247
; restore default cursor before killing
2248
        pusha
2249
        mov     ecx, [esp+32]
2250
        shl     ecx, 8
2439 Serge 2251
        add     ecx, SLOT_BASE
2465 Serge 2252
        mov     eax, [def_cursor]
2253
        cmp     [ecx+APPDATA.cursor], eax
2254
        je      @f
2439 Serge 2255
        call    restore_default_cursor_before_killing
2465 Serge 2256
@@:
2434 Serge 2257
        popa
2465 Serge 2258
.restore_end:
2434 Serge 2259
;--------------------------------------
1 ha 2260
     ;call MEM_Heap_Lock      ;guarantee that process isn't working with heap
2434 Serge 2261
        mov     [ecx], byte 3; clear possible i40's
3555 Serge 2262
        call    wakeup_osloop
1 ha 2263
     ;call MEM_Heap_UnLock
2264
 
3555 Serge 2265
        cmp     edx, [application_table_owner]; clear app table stat
2434 Serge 2266
        jne     noatsc
3555 Serge 2267
        call    unlock_application_table
2987 Serge 2268
noatsc:
2269
noprocessterminate:
2270
        add     esp, 4
2434 Serge 2271
        ret
2268 Serge 2272
;------------------------------------------------------------------------------
85 halyavin 2273
sysfn_terminate2:
2274
;lock application_table_status mutex
164 serge 2275
.table_status:
3555 Serge 2276
        call    lock_application_table
2434 Serge 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
3555 Serge 2284
        call    unlock_application_table
2434 Serge 2285
        sti
2286
        and     dword [esp+32], 0
2287
        ret
85 halyavin 2288
.not_found:
3555 Serge 2289
        call    unlock_application_table
2434 Serge 2290
        or      dword [esp+32], -1
2291
        ret
2268 Serge 2292
;------------------------------------------------------------------------------
2293
sysfn_deactivate:         ; 18.1 = DEACTIVATE WINDOW
2434 Serge 2294
        cmp     ecx, 2
2295
        jb      .nowindowdeactivate
2296
        cmp     ecx, [TASK_COUNT]
2297
        ja      .nowindowdeactivate
85 halyavin 2298
 
2434 Serge 2299
        movzx   esi, word [WIN_STACK + ecx*2]
2300
        cmp     esi, 1
2301
        je      .nowindowdeactivate ; already deactive
2268 Serge 2302
 
2434 Serge 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
2268 Serge 2309
 
2434 Serge 2310
        call    syscall_display_settings._.calculate_whole_screen
2311
        call    syscall_display_settings._.redraw_whole_screen
2268 Serge 2312
.nowindowdeactivate:
2434 Serge 2313
        ret
3500 Serge 2314
;------------------------------------------------------------------------------
1055 Galkov 2315
sysfn_activate:         ; 18.3 = ACTIVATE WINDOW
2434 Serge 2316
        cmp     ecx, 2
2317
        jb      .nowindowactivate
2318
        cmp     ecx, [TASK_COUNT]
2319
        ja      .nowindowactivate
3500 Serge 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
;-------------------------------------
2434 Serge 2332
        mov     [window_minimize], 2; restore window if minimized
3555 Serge 2333
        call    wakeup_osloop
105 poddubny 2334
 
2434 Serge 2335
        movzx   esi, word [WIN_STACK + ecx*2]
2336
        cmp     esi, [TASK_COUNT]
2337
        je      .nowindowactivate; already active
105 poddubny 2338
 
2434 Serge 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
105 poddubny 2345
.nowindowactivate:
2434 Serge 2346
        ret
2268 Serge 2347
;------------------------------------------------------------------------------
1055 Galkov 2348
sysfn_getidletime:              ; 18.4 = GET IDLETIME
3555 Serge 2349
        mov     eax, [CURRENT_TASK+32+TASKDATA.cpu_usage]
2434 Serge 2350
        mov     [esp+32], eax
2351
        ret
2268 Serge 2352
;------------------------------------------------------------------------------
1055 Galkov 2353
sysfn_getcpuclock:              ; 18.5 = GET TSC/SEC
3500 Serge 2354
        mov     eax, dword [cpu_freq]
2434 Serge 2355
        mov     [esp+32], eax
2356
        ret
2268 Serge 2357
;------------------------------------------------------------------------------
3500 Serge 2358
get_cpu_freq:
2359
        mov     eax, dword [cpu_freq]
2360
        mov     edx, dword [cpu_freq+4]
2361
        ret
1 ha 2362
;  SAVE ramdisk to /hd/1/menuet.img
2363
;!!!!!!!!!!!!!!!!!!!!!!!!
2364
   include 'blkdev/rdsave.inc'
2365
;!!!!!!!!!!!!!!!!!!!!!!!!
2268 Serge 2366
;------------------------------------------------------------------------------
1232 Lrz 2367
align 4
1055 Galkov 2368
sysfn_getactive:        ; 18.7 = get active window
2434 Serge 2369
        mov     eax, [TASK_COUNT]
2370
        movzx   eax, word [WIN_POS + eax*2]
2371
        mov     [esp+32], eax
2372
        ret
2268 Serge 2373
;------------------------------------------------------------------------------
1055 Galkov 2374
sysfn_sound_flag:       ; 18.8 = get/set sound_flag
1232 Lrz 2375
;     cmp  ecx,1
2434 Serge 2376
        dec     ecx
2377
        jnz     nogetsoundflag
2378
        movzx   eax, byte [sound_flag]; get sound_flag
2379
        mov     [esp+32], eax
2380
        ret
1 ha 2381
 nogetsoundflag:
1232 Lrz 2382
;     cmp  ecx,2
2434 Serge 2383
        dec     ecx
2384
        jnz     nosoundflag
2385
        xor     byte [sound_flag], 1
75 diamond 2386
 nosoundflag:
2434 Serge 2387
        ret
2268 Serge 2388
;------------------------------------------------------------------------------
1055 Galkov 2389
sysfn_minimize:         ; 18.10 = minimize window
2434 Serge 2390
        mov     [window_minimize], 1
3555 Serge 2391
        call    wakeup_osloop
2434 Serge 2392
        ret
2268 Serge 2393
;------------------------------------------------------------------------------
1232 Lrz 2394
align 4
1055 Galkov 2395
sysfn_getdiskinfo:      ; 18.11 = get disk info table
2434 Serge 2396
        dec     ecx
5201 serge 2397
        jnz     .exit
2398
.small_table:
2434 Serge 2399
        mov     edi, edx
2400
        mov     esi, DRIVE_DATA
5201 serge 2401
        mov     ecx, DRIVE_DATA_SIZE ;10
2434 Serge 2402
        cld
5201 serge 2403
        rep movsb
2404
.exit:
2434 Serge 2405
        ret
2268 Serge 2406
;------------------------------------------------------------------------------
1055 Galkov 2407
sysfn_lastkey:          ; 18.12 = return 0 (backward compatibility)
2408
        and     dword [esp+32], 0
2409
        ret
2268 Serge 2410
;------------------------------------------------------------------------------
1055 Galkov 2411
sysfn_getversion:       ; 18.13 = get kernel ID and version
2434 Serge 2412
        mov     edi, ecx
2413
        mov     esi, version_inf
2414
        mov     ecx, version_end-version_inf
2415
        rep movsb
2416
        ret
2268 Serge 2417
;------------------------------------------------------------------------------
75 diamond 2418
sysfn_waitretrace:     ; 18.14 = sys wait retrace
41 mikedld 2419
     ;wait retrace functions
2420
 sys_wait_retrace:
2434 Serge 2421
        mov     edx, 0x3da
41 mikedld 2422
 WaitRetrace_loop:
2434 Serge 2423
        in      al, dx
2424
        test    al, 1000b
2425
        jz      WaitRetrace_loop
2426
        and     [esp+32], dword 0
2427
        ret
2268 Serge 2428
;------------------------------------------------------------------------------
1232 Lrz 2429
align 4
1055 Galkov 2430
sysfn_centermouse:      ; 18.15 = mouse centered
1232 Lrz 2431
; removed here by 
2432
;     call  mouse_centered
2433
;* mouse centered - start code- Mario79
2434
;mouse_centered:
2435
;        push  eax
5565 serge 2436
        mov     eax, [_display.width]
2434 Serge 2437
        shr     eax, 1
2438
        mov     [MOUSE_X], ax
5565 serge 2439
        mov     eax, [_display.height]
2434 Serge 2440
        shr     eax, 1
2441
        mov     [MOUSE_Y], ax
3555 Serge 2442
        call    wakeup_osloop
1232 Lrz 2443
;        ret
2444
;* mouse centered - end code- Mario79
2434 Serge 2445
        xor     eax, eax
2446
        and     [esp+32], eax
1232 Lrz 2447
;        pop   eax
2434 Serge 2448
        ret
2268 Serge 2449
;------------------------------------------------------------------------------
1232 Lrz 2450
align 4
120 mario79 2451
sysfn_mouse_acceleration: ; 18.19 = set/get mouse features
2434 Serge 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
120 mario79 2458
 .set_mouse_acceleration:
1232 Lrz 2459
;     cmp  ecx,1  ; set mouse speed factor
2434 Serge 2460
        dec     ecx
2461
        jnz     .get_mouse_delay
2462
        mov     [mouse_speed_factor], dx
2463
        ret
120 mario79 2464
 .get_mouse_delay:
1232 Lrz 2465
;     cmp  ecx,2  ; get mouse delay
2434 Serge 2466
        dec     ecx
2467
        jnz     .set_mouse_delay
2468
        mov     eax, [mouse_delay]
2469
        mov     [esp+32], eax
2470
        ret
120 mario79 2471
 .set_mouse_delay:
1232 Lrz 2472
;     cmp  ecx,3  ; set mouse delay
2434 Serge 2473
        dec     ecx
2474
        jnz     .set_pointer_position
2475
        mov     [mouse_delay], edx
2476
        ret
120 mario79 2477
 .set_pointer_position:
1232 Lrz 2478
;     cmp  ecx,4  ; set mouse pointer position
2434 Serge 2479
        dec     ecx
2480
        jnz     .set_mouse_button
5565 serge 2481
        cmp     dx, word[_display.height]
2482
        jae     .end
2434 Serge 2483
        rol     edx, 16
5565 serge 2484
        cmp     dx, word[_display.width]
2485
        jae     .end
2434 Serge 2486
        mov     [MOUSE_X], edx
5201 serge 2487
        mov     [mouse_active], 1
3555 Serge 2488
        call    wakeup_osloop
2434 Serge 2489
        ret
621 mario79 2490
 .set_mouse_button:
1232 Lrz 2491
;     cmp   ecx,5  ; set mouse button features
2434 Serge 2492
        dec     ecx
2493
        jnz     .end
2494
        mov     [BTN_DOWN], dl
2495
        mov     [mouse_active], 1
3555 Serge 2496
        call    wakeup_osloop
120 mario79 2497
 .end:
2434 Serge 2498
        ret
2268 Serge 2499
;------------------------------------------------------------------------------
75 diamond 2500
sysfn_getfreemem:
2434 Serge 2501
        mov     eax, [pg_data.pages_free]
2502
        shl     eax, 2
2503
        mov     [esp+32], eax
2504
        ret
2987 Serge 2505
;------------------------------------------------------------------------------
75 diamond 2506
sysfn_getallmem:
2434 Serge 2507
        mov     eax, [MEM_AMOUNT]
2508
        shr     eax, 10
2509
        mov     [esp+32], eax
2510
        ret
2987 Serge 2511
;------------------------------------------------------------------------------
608 alver 2512
sysfn_pid_to_slot:
2434 Serge 2513
        mov     eax, ecx
2514
        call    pid_to_slot
2515
        mov     [esp+32], eax
2516
        ret
2987 Serge 2517
;------------------------------------------------------------------------------
608 alver 2518
sysfn_min_rest_window:
2434 Serge 2519
        pushad
2520
        mov     eax, edx ; ebx - operating
2521
        shr     ecx, 1
2522
        jnc     @f
2523
        call    pid_to_slot
608 alver 2524
@@:
2434 Serge 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
608 alver 2532
 ; .minimize:
2434 Serge 2533
        call    minimize_window
2534
        jmp     .exit
608 alver 2535
.restore:
2434 Serge 2536
        call    restore_minimized_window
608 alver 2537
.exit:
2434 Serge 2538
        popad
2539
        xor     eax, eax
2540
        mov     [esp+32], eax
2541
        ret
608 alver 2542
.error:
2434 Serge 2543
        popad
2544
        xor     eax, eax
2545
        dec     eax
2546
        mov     [esp+32], eax
2547
        ret
2987 Serge 2548
;------------------------------------------------------------------------------
2549
sysfn_min_windows:
2550
        call    minimize_all_window
2551
        mov     [esp+32], eax
2552
        call    change_task
2553
        ret
2554
;------------------------------------------------------------------------------
2555
sysfn_set_screen_sizes:
2556
        cmp     [SCR_MODE], word 0x13
2557
        jbe     .exit
608 alver 2558
 
2987 Serge 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
5565 serge 2571
        mov     ecx, [_display.lfb_pitch]
2987 Serge 2572
        mov     [_display.width], eax
5201 serge 2573
        dec     eax
2987 Serge 2574
        mov     [_display.height], edx
5201 serge 2575
        dec     edx
2987 Serge 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
;------------------------------------------------------------------------------
41 mikedld 2586
uglobal
2587
screen_workarea RECT
2987 Serge 2588
display_width_standard dd 0
2589
display_height_standard dd 0
2590
do_not_touch_winmap db 0
1 ha 2591
window_minimize db 0
1055 Galkov 2592
sound_flag      db 0
2987 Serge 2593
 
41 mikedld 2594
endg
1 ha 2595
 
2130 serge 2596
UID_NONE=0
2597
UID_MENUETOS=1   ;official
2598
UID_KOLIBRI=2    ;russian
2599
 
41 mikedld 2600
iglobal
2601
version_inf:
3908 Serge 2602
        db 0,7,7,0  ; version 0.7.7.0
2603
        db 0
3500 Serge 2604
.rev    dd __REV__
41 mikedld 2605
version_end:
2606
endg
2987 Serge 2607
;------------------------------------------------------------------------------
2608
align 4
1 ha 2609
sys_cachetodiskette:
1055 Galkov 2610
        cmp     ebx, 1
4287 Serge 2611
        jb      .no_floppy_save
1055 Galkov 2612
        cmp     ebx, 2
4287 Serge 2613
        ja      .no_floppy_save
1055 Galkov 2614
        call    save_image
4287 Serge 2615
        mov     [esp + 32], eax
2616
        ret
2617
.no_floppy_save:
1055 Galkov 2618
        mov     [esp + 32], dword 1
2619
        ret
2987 Serge 2620
;------------------------------------------------------------------------------
1 ha 2621
uglobal
2622
;  bgrchanged  dd  0x0
1071 diamond 2623
align 4
2624
bgrlockpid dd 0
546 diamond 2625
bgrlock db 0
1 ha 2626
endg
2987 Serge 2627
;------------------------------------------------------------------------------
2628
align 4
1 ha 2629
sys_background:
2434 Serge 2630
        cmp     ebx, 1                     ; BACKGROUND SIZE
2631
        jnz     nosb1
2632
        test    ecx, ecx
2633
        jz      sbgrr
2987 Serge 2634
 
2434 Serge 2635
        test    edx, edx
2636
        jz      sbgrr
2987 Serge 2637
;--------------------------------------
2638
align 4
546 diamond 2639
@@:
1071 diamond 2640
;;Maxis use atomic bts for mutexes  4.4.2009
2641
        bts     dword [bgrlock], 0
2642
        jnc     @f
1055 Galkov 2643
        call    change_task
2644
        jmp     @b
2987 Serge 2645
;--------------------------------------
2646
align 4
546 diamond 2647
@@:
2434 Serge 2648
        mov     [BgrDataWidth], ecx
2649
        mov     [BgrDataHeight], edx
1 ha 2650
;    mov   [bgrchanged],1
469 serge 2651
 
2434 Serge 2652
        pushad
469 serge 2653
; return memory for old background
1107 diamond 2654
        mov     eax, [img_background]
2655
        cmp     eax, static_background_data
2656
        jz      @f
2657
        stdcall kernel_free, eax
2987 Serge 2658
;--------------------------------------
2659
align 4
1107 diamond 2660
@@:
469 serge 2661
; calculate RAW size
2434 Serge 2662
        xor     eax, eax
2663
        inc     eax
2664
        cmp     [BgrDataWidth], eax
2665
        jae     @f
2666
        mov     [BgrDataWidth], eax
2987 Serge 2667
;--------------------------------------
2668
align 4
469 serge 2669
@@:
2434 Serge 2670
        cmp     [BgrDataHeight], eax
2671
        jae     @f
2672
        mov     [BgrDataHeight], eax
2987 Serge 2673
;--------------------------------------
2674
align 4
469 serge 2675
@@:
2434 Serge 2676
        mov     eax, [BgrDataWidth]
2677
        imul    eax, [BgrDataHeight]
2678
        lea     eax, [eax*3]
2465 Serge 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
2434 Serge 2685
        mov     [mem_BACKGROUND], eax
469 serge 2686
; get memory for new background
2434 Serge 2687
        stdcall kernel_alloc, eax
2688
        test    eax, eax
2689
        jz      .memfailed
2690
        mov     [img_background], eax
2691
        jmp     .exit
2987 Serge 2692
;--------------------------------------
2693
align 4
1107 diamond 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
2987 Serge 2702
;--------------------------------------
2703
align 4
1107 diamond 2704
.exit:
2434 Serge 2705
        popad
1055 Galkov 2706
        mov     [bgrlock], 0
2987 Serge 2707
;--------------------------------------
2708
align 4
2709
sbgrr:
2434 Serge 2710
        ret
2987 Serge 2711
;------------------------------------------------------------------------------
2712
align 4
875 serge 2713
nosb1:
2434 Serge 2714
        cmp     ebx, 2                     ; SET PIXEL
2715
        jnz     nosb2
875 serge 2716
 
2434 Serge 2717
        mov     eax, [img_background]
2718
        test    ecx, ecx
2719
        jz      @f
2720
        cmp     eax, static_background_data
2721
        jz      .ret
2987 Serge 2722
;--------------------------------------
2723
align 4
1107 diamond 2724
@@:
2434 Serge 2725
        mov     ebx, [mem_BACKGROUND]
2726
        add     ebx, 4095
2727
        and     ebx, -4096
2728
        sub     ebx, 4
2729
        cmp     ecx, ebx
2730
        ja      .ret
875 serge 2731
 
2434 Serge 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
2987 Serge 2737
;--------------------------------------
2738
align 4
1107 diamond 2739
.ret:
2434 Serge 2740
        ret
2987 Serge 2741
;------------------------------------------------------------------------------
2742
align 4
875 serge 2743
nosb2:
2434 Serge 2744
        cmp     ebx, 3                     ; DRAW BACKGROUND
2745
        jnz     nosb3
2987 Serge 2746
;--------------------------------------
2747
align 4
1 ha 2748
draw_background_temp:
2434 Serge 2749
        mov     [background_defined], 1
2750
        call    force_redraw_background
2987 Serge 2751
;--------------------------------------
2752
align 4
2753
nosb31:
2434 Serge 2754
        ret
2987 Serge 2755
;------------------------------------------------------------------------------
2756
align 4
2757
nosb3:
2434 Serge 2758
        cmp     ebx, 4                     ; TILED / STRETCHED
2759
        jnz     nosb4
2760
        cmp     ecx, [BgrDrawMode]
2761
        je      nosb41
2762
        mov     [BgrDrawMode], ecx
2987 Serge 2763
;--------------------------------------
2764
align 4
2765
nosb41:
2434 Serge 2766
        ret
2987 Serge 2767
;------------------------------------------------------------------------------
2768
align 4
2769
nosb4:
2434 Serge 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
2987 Serge 2778
;--------------------------------------
2779
align 4
2780
@@:
1 ha 2781
  ; bughere
2434 Serge 2782
        mov     eax, ecx
2783
        mov     ebx, edx
2784
        add     ebx, [img_background];IMG_BACKGROUND
2785
        mov     ecx, esi
2786
        call    memmove
2987 Serge 2787
;--------------------------------------
2788
align 4
2789
.fin:
2434 Serge 2790
        ret
2987 Serge 2791
;------------------------------------------------------------------------------
2792
align 4
2793
nosb5:
1055 Galkov 2794
        cmp     ebx, 6
2795
        jnz     nosb6
2987 Serge 2796
;--------------------------------------
2797
align 4
1071 diamond 2798
;;Maxis use atomic bts for mutex 4.4.2009
546 diamond 2799
@@:
1073 heavyiron 2800
        bts     dword [bgrlock], 0
1071 diamond 2801
        jnc     @f
1055 Galkov 2802
        call    change_task
2803
        jmp     @b
2987 Serge 2804
;--------------------------------------
2805
align 4
546 diamond 2806
@@:
1055 Galkov 2807
        mov     eax, [CURRENT_TASK]
2808
        mov     [bgrlockpid], eax
1107 diamond 2809
        cmp     [img_background], static_background_data
2810
        jz      .nomem
1055 Galkov 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
2987 Serge 2823
;--------------------------------------
2824
align 4
546 diamond 2825
.z:
1055 Galkov 2826
        mov     eax, [page_tabs+ebx*4]
2827
        test    al, 1
2828
        jz      @f
2829
        call    free_page
2987 Serge 2830
;--------------------------------------
2831
align 4
546 diamond 2832
@@:
1055 Galkov 2833
        mov     eax, [page_tabs+esi*4]
5565 serge 2834
        or      al, PG_UWR
1055 Galkov 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
2987 Serge 2843
;--------------------------------------
2844
align 4
546 diamond 2845
.nomem:
1055 Galkov 2846
        and     [bgrlockpid], 0
2847
        mov     [bgrlock], 0
2987 Serge 2848
;------------------------------------------------------------------------------
2849
align 4
546 diamond 2850
nosb6:
1055 Galkov 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
1312 diamond 2867
        dec     ecx
2987 Serge 2868
;--------------------------------------
2869
align 4
546 diamond 2870
@@:
1055 Galkov 2871
        and     dword [page_tabs+eax*4], 0
2872
        mov     edx, eax
2873
        shl     edx, 12
2434 Serge 2874
        push    eax
1055 Galkov 2875
        invlpg  [edx]
2434 Serge 2876
        pop     eax
1055 Galkov 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
2987 Serge 2886
;--------------------------------------
2887
align 4
546 diamond 2888
.err:
1055 Galkov 2889
        and     dword [esp+32], 0
2890
        ret
2987 Serge 2891
;------------------------------------------------------------------------------
2892
align 4
2893
nosb7:
2894
        cmp     ebx, 8
2895
        jnz     nosb8
546 diamond 2896
 
3555 Serge 2897
        mov     ecx, [current_slot]
2898
        xor     eax, eax
2899
        xchg    eax, [ecx+APPDATA.draw_bgr_x]
2987 Serge 2900
        mov     [esp + 32], eax ; eax = [left]*65536 + [right]
3555 Serge 2901
        xor     eax, eax
2902
        xchg    eax, [ecx+APPDATA.draw_bgr_y]
2987 Serge 2903
        mov     [esp + 20], eax ; ebx = [top]*65536 + [bottom]
2434 Serge 2904
        ret
2987 Serge 2905
;------------------------------------------------------------------------------
2906
align 4
2907
nosb8:
2908
        cmp     ebx, 9
2909
        jnz     nosb9
2910
; ecx = [left]*65536 + [right]
2911
; edx = [top]*65536 + [bottom]
5565 serge 2912
        mov     eax, [_display.width]
2913
        mov     ebx, [_display.height]
2914
        dec     eax
2915
        dec     ebx
2987 Serge 2916
; check [right]
2917
        cmp     cx, ax
5201 serge 2918
        ja      .exit
2987 Serge 2919
; check [left]
2920
        ror     ecx, 16
2921
        cmp     cx, ax
5201 serge 2922
        ja      .exit
2987 Serge 2923
; check [bottom]
2924
        cmp     dx, bx
5201 serge 2925
        ja      .exit
2987 Serge 2926
; check [top]
2927
        ror     edx, 16
2928
        cmp     dx, bx
5201 serge 2929
        ja      .exit
1 ha 2930
 
2987 Serge 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]
3555 Serge 2946
        call    wakeup_osloop
2987 Serge 2947
;--------------------------------------
2948
align 4
2949
.exit:
2950
        ret
2951
;------------------------------------------------------------------------------
2952
align 4
2953
nosb9:
2954
        ret
2955
;------------------------------------------------------------------------------
2956
align 4
2957
uglobal
2958
  BG_Rect_X_left_right  dd   0x0
2959
  BG_Rect_Y_top_bottom  dd   0x0
2960
endg
2961
;------------------------------------------------------------------------------
2962
align 4
709 diamond 2963
force_redraw_background:
2434 Serge 2964
        and     [draw_data+32 + RECT.left], 0
2965
        and     [draw_data+32 + RECT.top], 0
2966
        push    eax ebx
5565 serge 2967
        mov     eax, [_display.width]
2968
        mov     ebx, [_display.height]
2969
        dec     eax
2970
        dec     ebx
2434 Serge 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]
3555 Serge 2975
        call    wakeup_osloop
2434 Serge 2976
        ret
2987 Serge 2977
;------------------------------------------------------------------------------
1 ha 2978
align 4
2979
sys_getbackground:
1304 Lrz 2980
;    cmp   eax,1                                  ; SIZE
2434 Serge 2981
        dec     ebx
2982
        jnz     nogb1
2983
        mov     eax, [BgrDataWidth]
2984
        shl     eax, 16
3555 Serge 2985
        mov     ax, word [BgrDataHeight]
2434 Serge 2986
        mov     [esp+32], eax
2987
        ret
2987 Serge 2988
;------------------------------------------------------------------------------
2989
align 4
875 serge 2990
nogb1:
1304 Lrz 2991
;    cmp   eax,2                                  ; PIXEL
2434 Serge 2992
        dec     ebx
2993
        jnz     nogb2
875 serge 2994
 
1107 diamond 2995
        mov     eax, [img_background]
1304 Lrz 2996
        test    ecx, ecx
1107 diamond 2997
        jz      @f
2998
        cmp     eax, static_background_data
2999
        jz      .ret
2987 Serge 3000
;--------------------------------------
3001
align 4
1107 diamond 3002
@@:
2434 Serge 3003
        mov     ebx, [mem_BACKGROUND]
3004
        add     ebx, 4095
3005
        and     ebx, -4096
3006
        sub     ebx, 4
3007
        cmp     ecx, ebx
3008
        ja      .ret
875 serge 3009
 
2434 Serge 3010
        mov     eax, [ecx+eax]
469 serge 3011
 
2434 Serge 3012
        and     eax, 0xFFFFFF
3013
        mov     [esp+32], eax
2987 Serge 3014
;--------------------------------------
3015
align 4
1107 diamond 3016
.ret:
2434 Serge 3017
        ret
2987 Serge 3018
;------------------------------------------------------------------------------
3019
align 4
3020
nogb2:
1 ha 3021
 
1304 Lrz 3022
;    cmp   eax,4                                  ; TILED / STRETCHED
2434 Serge 3023
        dec     ebx
3024
        dec     ebx
3025
        jnz     nogb4
3026
        mov     eax, [BgrDrawMode]
2987 Serge 3027
;--------------------------------------
3028
align 4
3029
nogb4:
2434 Serge 3030
        mov     [esp+32], eax
3031
        ret
2987 Serge 3032
;------------------------------------------------------------------------------
1 ha 3033
align 4
3034
sys_getkey:
2434 Serge 3035
        mov     [esp + 32], dword 1
1055 Galkov 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
5201 serge 3044
        movzx   ax, byte [KEY_BUFF + 120 + 2]
1055 Galkov 3045
        shl     eax, 8
5201 serge 3046
        mov     al, byte [KEY_BUFF]
3047
        shl     eax, 8
1055 Galkov 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
5201 serge 3056
        add     eax, 120 + 2
3057
        add     ebx, 120 + 2
3058
        call    memmove
1055 Galkov 3059
        pop     eax
2987 Serge 3060
;--------------------------------------
3061
align 4
92 diamond 3062
.ret_eax:
1055 Galkov 3063
        mov     [esp + 32], eax
3064
        ret
2987 Serge 3065
;--------------------------------------
3066
align 4
671 Ghost 3067
.finish:
92 diamond 3068
; test hotkeys buffer
1055 Galkov 3069
        mov     ecx, hotkey_buffer
2987 Serge 3070
;--------------------------------------
3071
align 4
92 diamond 3072
@@:
1055 Galkov 3073
        cmp     [ecx], ebx
3074
        jz      .found
3075
        add     ecx, 8
3076
        cmp     ecx, hotkey_buffer + 120 * 8
3077
        jb      @b
3078
        ret
2987 Serge 3079
;--------------------------------------
3080
align 4
92 diamond 3081
.found:
1055 Galkov 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
2987 Serge 3089
;------------------------------------------------------------------------------
1 ha 3090
align 4
3091
sys_getbutton:
1055 Galkov 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]
1391 mikedld 3102
        and     al, 0xFE                                    ; delete left button bit
1055 Galkov 3103
        mov     [BTN_COUNT], byte 0
3104
        mov     [esp + 32], eax
2987 Serge 3105
;--------------------------------------
3106
align 4
671 Ghost 3107
.exit:
1055 Galkov 3108
        ret
2987 Serge 3109
;------------------------------------------------------------------------------
1 ha 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
 
2434 Serge 3124
        cmp     ecx, -1 ; who am I ?
3125
        jne     .no_who_am_i
3126
        mov     ecx, [CURRENT_TASK]
684 diamond 3127
  .no_who_am_i:
1055 Galkov 3128
        cmp     ecx, max_processes
3129
        ja      .nofillbuf
1 ha 3130
 
684 diamond 3131
; +4: word: position of the window of thread in the window stack
1055 Galkov 3132
        mov     ax, [WIN_STACK + ecx * 2]
3133
        mov     [ebx+4], ax
684 diamond 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)
1055 Galkov 3136
        mov     ax, [WIN_POS + ecx * 2]
3137
        mov     [ebx+6], ax
1 ha 3138
 
1055 Galkov 3139
        shl     ecx, 5
1 ha 3140
 
684 diamond 3141
; +0: dword: memory usage
1055 Galkov 3142
        mov     eax, [ecx+CURRENT_TASK+TASKDATA.cpu_usage]
3143
        mov     [ebx], eax
684 diamond 3144
; +10: 11 bytes: name of the process
1055 Galkov 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
1 ha 3151
 
684 diamond 3152
; +22: address of the process in memory
3153
; +26: size of used memory - 1
1055 Galkov 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
5201 serge 3160
        mov     edx, [SLOT_BASE+ecx*8+APPDATA.process]
3161
        mov     edx, [edx+PROC.mem_used]
1055 Galkov 3162
        mov     eax, std_application_base_address
684 diamond 3163
.os_mem:
1055 Galkov 3164
        stosd
3165
        lea     eax, [edx-1]
3166
        stosd
1 ha 3167
 
684 diamond 3168
; +30: PID/TID
1055 Galkov 3169
        mov     eax, [ecx+CURRENT_TASK+TASKDATA.pid]
3170
        stosd
1 ha 3171
 
3172
    ; window position and size
1055 Galkov 3173
        push    esi
3174
        lea     esi, [ecx + window_data + WDATA.box]
3175
        movsd
3176
        movsd
3177
        movsd
3178
        movsd
1 ha 3179
 
3180
    ; Process state (+50)
1055 Galkov 3181
        mov     eax, dword [ecx+CURRENT_TASK+TASKDATA.state]
3182
        stosd
1 ha 3183
 
138 mikedld 3184
    ; Window client area box
1055 Galkov 3185
        lea     esi, [ecx*8 + SLOT_BASE + APPDATA.wnd_clientbox]
3186
        movsd
3187
        movsd
3188
        movsd
3189
        movsd
1 ha 3190
 
164 serge 3191
    ; Window state
1055 Galkov 3192
        mov     al, [ecx+window_data+WDATA.fl_wstate]
3193
        stosb
164 serge 3194
 
2010 serge 3195
    ; Event mask (+71)
3196
        mov     EAX, dword [ECX+CURRENT_TASK+TASKDATA.event_mask]
3197
        stosd
3198
 
4265 Serge 3199
    ; Keyboard mode (+75)
3200
        mov     al, byte [ecx*8 + SLOT_BASE + APPDATA.keyboard_mode]
4287 Serge 3201
        stosb
4265 Serge 3202
 
1055 Galkov 3203
        pop     esi
3204
        pop     edi
138 mikedld 3205
 
684 diamond 3206
.nofillbuf:
1 ha 3207
    ; return number of processes
3208
 
2434 Serge 3209
        mov     eax, [TASK_COUNT]
3210
        mov     [esp+32], eax
3211
        ret
1 ha 3212
 
3213
align 4
3214
sys_clock:
1055 Galkov 3215
        cli
1 ha 3216
  ; Mikhail Lisovin  xx Jan 2005
3217
  @@:
2434 Serge 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
  @@:
1 ha 3227
  ; end Lisovin's fix
3228
 
2434 Serge 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
1055 Galkov 3245
        sti
3246
        mov     [esp + 32], ecx
3247
        ret
1 ha 3248
 
3249
 
3250
align 4
3251
 
3252
sys_date:
3253
 
1055 Galkov 3254
        cli
75 diamond 3255
  @@:
2434 Serge 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
  @@:
75 diamond 3265
 
2434 Serge 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
1055 Galkov 3280
        sti
3281
        mov     [esp+32], ecx
3282
        ret
1 ha 3283
 
3284
 
3285
; redraw status
3286
 
3287
sys_redrawstat:
1055 Galkov 3288
        cmp     ebx, 1
3289
        jne     no_widgets_away
3290
        ; buttons away
2434 Serge 3291
        mov     ecx, [CURRENT_TASK]
1 ha 3292
  sys_newba2:
2434 Serge 3293
        mov     edi, [BTN_ADDR]
1055 Galkov 3294
        cmp     [edi], dword 0  ; empty button list ?
3295
        je      end_of_buttons_away
3296
        movzx   ebx, word [edi]
3297
        inc     ebx
2434 Serge 3298
        mov     eax, edi
1 ha 3299
  sys_newba:
1055 Galkov 3300
        dec     ebx
3301
        jz      end_of_buttons_away
1 ha 3302
 
1055 Galkov 3303
        add     eax, 0x10
3304
        cmp     cx, [eax]
3305
        jnz     sys_newba
1 ha 3306
 
1055 Galkov 3307
        push    eax ebx ecx
2434 Serge 3308
        mov     ecx, ebx
1055 Galkov 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
1 ha 3316
 
1055 Galkov 3317
        jmp     sys_newba2
1 ha 3318
 
3319
  end_of_buttons_away:
3320
 
1055 Galkov 3321
        ret
1 ha 3322
 
3323
  no_widgets_away:
3324
 
1055 Galkov 3325
        cmp     ebx, 2
3326
        jnz     srl1
1 ha 3327
 
1055 Galkov 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
5565 serge 3332
        mov     eax, [_display.width]
3333
        dec     eax
1055 Galkov 3334
        mov     [edx + RECT.right], eax
5565 serge 3335
        mov     eax, [_display.height]
3336
        dec     eax
1055 Galkov 3337
        mov     [edx + RECT.bottom], eax
1 ha 3338
 
3339
  srl1:
1055 Galkov 3340
        ret
1 ha 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
;---------------------------------------------------------------------------------------------
1344 Lrz 3359
iglobal
3360
align 4
3361
sheduler:
2434 Serge 3362
        dd      sys_sheduler.00
3363
        dd      change_task
3364
        dd      sys_sheduler.02
3365
        dd      sys_sheduler.03
3366
        dd      sys_sheduler.04
1344 Lrz 3367
endg
1638 serge 3368
sys_sheduler:
1344 Lrz 3369
;rewritten by   29.12.2009
2434 Serge 3370
        jmp     dword [sheduler+ebx*4]
1344 Lrz 3371
;.shed_counter:
3372
.00:
2434 Serge 3373
        mov     eax, [context_counter]
3374
        mov     [esp+32], eax
3375
        ret
1273 Lrz 3376
 
1344 Lrz 3377
.02:
3378
;.perf_control:
2434 Serge 3379
        inc     ebx                     ;before ebx=2, ebx=3
3380
        cmp     ebx, ecx                ;if ecx=3, ebx=3
3381
        jz      cache_disable
1365 Lrz 3382
 
2434 Serge 3383
        dec     ebx                     ;ebx=2
3384
        cmp     ebx, ecx                ;
3385
        jz      cache_enable            ;if ecx=2 and ebx=2
1365 Lrz 3386
 
2434 Serge 3387
        dec     ebx                     ;ebx=1
3388
        cmp     ebx, ecx
3389
        jz      is_cache_enabled        ;if ecx=1 and ebx=1
1365 Lrz 3390
 
2434 Serge 3391
        dec     ebx
3392
        test    ebx, ecx                ;ebx=0 and ecx=0
3393
        jz      modify_pce              ;if ecx=0
1365 Lrz 3394
 
2434 Serge 3395
        ret
1345 Lrz 3396
 
1638 serge 3397
.03:
1344 Lrz 3398
;.rdmsr_instr:
3399
;now counter in ecx
3400
;(edx:eax) esi:edi => edx:esi
2434 Serge 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
1344 Lrz 3407
 
3408
.04:
1273 Lrz 3409
;.wrmsr_instr:
3410
;now counter in ecx
3411
;(edx:eax) esi:edi => edx:esi
3412
        ; Fast Call MSR can't be destroy
3555 Serge 3413
        ; Но MSR_AMD_EFER можно изменять, т.к. в этом регистре лиш
3414
        ; включаются/выключаются расширенные возможности
2434 Serge 3415
        cmp     edx, MSR_SYSENTER_CS
1273 Lrz 3416
        je      @f
2434 Serge 3417
        cmp     edx, MSR_SYSENTER_ESP
1273 Lrz 3418
        je      @f
2434 Serge 3419
        cmp     edx, MSR_SYSENTER_EIP
1273 Lrz 3420
        je      @f
2434 Serge 3421
        cmp     edx, MSR_AMD_STAR
1273 Lrz 3422
        je      @f
3423
 
2434 Serge 3424
        mov     eax, esi
3425
        mov     ecx, edx
1273 Lrz 3426
        wrmsr
1344 Lrz 3427
        ; mov   [esp + 32], eax
3428
        ; mov   [esp + 20], edx ;ret in ebx?
1273 Lrz 3429
@@:
2434 Serge 3430
        ret
1273 Lrz 3431
 
1 ha 3432
cache_disable:
2434 Serge 3433
        mov     eax, cr0
3434
        or      eax, 01100000000000000000000000000000b
3435
        mov     cr0, eax
3436
        wbinvd  ;set MESI
3437
        ret
1 ha 3438
 
3439
cache_enable:
2434 Serge 3440
        mov     eax, cr0
3441
        and     eax, 10011111111111111111111111111111b
3442
        mov     cr0, eax
3443
        ret
1 ha 3444
 
3445
is_cache_enabled:
2434 Serge 3446
        mov     eax, cr0
3447
        mov     ebx, eax
3448
        and     eax, 01100000000000000000000000000000b
3449
        jz      cache_disabled
3450
        mov     [esp+32], ebx
1 ha 3451
cache_disabled:
2434 Serge 3452
        mov     dword [esp+32], eax;0
3453
        ret
1 ha 3454
 
3455
modify_pce:
2434 Serge 3456
        mov     eax, cr4
1 ha 3457
;       mov ebx,0
3458
;       or  bx,100000000b ;pce
3459
;       xor eax,ebx ;invert pce
2434 Serge 3460
        bts     eax, 8;pce=cr4[8]
3461
        mov     cr4, eax
3462
        mov     [esp+32], eax
3463
        ret
1 ha 3464
;---------------------------------------------------------------------------------------------
3465
 
3466
 
3467
iglobal
521 diamond 3468
  cpustring db 'CPU',0
1 ha 3469
endg
3470
 
67 diamond 3471
uglobal
1055 Galkov 3472
background_defined    db    0    ; diamond, 11.04.2006
67 diamond 3473
endg
2987 Serge 3474
;-----------------------------------------------------------------------------
1 ha 3475
align 4
3476
checkmisc:
2434 Serge 3477
        cmp     [ctrl_alt_del], 1
3478
        jne     nocpustart
501 serge 3479
 
1055 Galkov 3480
        mov     ebp, cpustring
3481
        call    fs_execute_from_sysdir
501 serge 3482
 
2434 Serge 3483
        mov     [ctrl_alt_del], 0
2987 Serge 3484
;--------------------------------------
3485
align 4
465 serge 3486
nocpustart:
2434 Serge 3487
        cmp     [mouse_active], 1
3488
        jne     mouse_not_active
3489
        mov     [mouse_active], 0
1 ha 3490
 
2434 Serge 3491
        xor     edi, edi
3492
        mov     ebx, CURRENT_TASK
3493
 
3494
        mov     ecx, [TASK_COUNT]
3495
        movzx   eax, word [WIN_POS + ecx*2]     ; active window
3496
        shl     eax, 8
3497
        push    eax
3498
 
3499
        movzx   eax, word [MOUSE_X]
3500
        movzx   edx, word [MOUSE_Y]
2987 Serge 3501
;--------------------------------------
2434 Serge 3502
align 4
3503
.set_mouse_event:
3504
        add     edi, 256
3505
        add     ebx, 32
3506
        test    [ebx+TASKDATA.event_mask], 0x80000000
3507
        jz      .pos_filter
3508
 
3509
        cmp     edi, [esp]                      ; skip if filtration active
3510
        jne     .skip
2987 Serge 3511
;--------------------------------------
3512
align 4
2434 Serge 3513
.pos_filter:
3514
        test    [ebx+TASKDATA.event_mask], 0x40000000
3515
        jz      .set
3516
 
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
2987 Serge 3530
;--------------------------------------
3531
align 4
2434 Serge 3532
.set:
2987 Serge 3533
        or      [edi+SLOT_BASE+APPDATA.event_mask], 100000b  ; set event 6
3534
;--------------------------------------
3535
align 4
2434 Serge 3536
.skip:
3537
        loop    .set_mouse_event
3538
 
3539
        pop     eax
2987 Serge 3540
;--------------------------------------
3541
align 4
465 serge 3542
mouse_not_active:
2434 Serge 3543
        cmp     byte[REDRAW_BACKGROUND], 0         ; background update ?
3544
        jz      nobackgr
2987 Serge 3545
 
2434 Serge 3546
        cmp     [background_defined], 0
3547
        jz      nobackgr
2987 Serge 3548
;--------------------------------------
3549
align 4
3555 Serge 3550
backgr:
2987 Serge 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
 
2434 Serge 3561
        call    drawbackground
2987 Serge 3562
;        DEBUGF  1, "K : drawbackground\n"
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]
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
3555 Serge 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:
3626 Serge 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
3555 Serge 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
@@:
3626 Serge 3587
        cmp     word [edi+SLOT_BASE+APPDATA.draw_bgr_y], dx
3555 Serge 3588
        jae     @f
3626 Serge 3589
        mov     word [edi+SLOT_BASE+APPDATA.draw_bgr_y], dx
3555 Serge 3590
@@:
3626 Serge 3591
        shr     edx, 16
3555 Serge 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:
2987 Serge 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 -----------
3605
        dec     byte[REDRAW_BACKGROUND]    ; got new update request?
3555 Serge 3606
        jnz     backgr
2987 Serge 3607
 
3555 Serge 3608
        xor     eax, eax
2434 Serge 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
2987 Serge 3613
;--------------------------------------
3614
align 4
465 serge 3615
nobackgr:
2987 Serge 3616
; system shutdown request
2434 Serge 3617
        cmp     [SYS_SHUTDOWN], byte 0
3618
        je      noshutdown
1 ha 3619
 
2434 Serge 3620
        mov     edx, [shutdown_processes]
1 ha 3621
 
2434 Serge 3622
        cmp     [SYS_SHUTDOWN], dl
3500 Serge 3623
        jne     noshutdown
1 ha 3624
 
2434 Serge 3625
        lea     ecx, [edx-1]
3626
        mov     edx, OS_BASE+0x3040
3500 Serge 3627
        jecxz   no_mark_system_shutdown
2987 Serge 3628
;--------------------------------------
3629
align 4
465 serge 3630
markz:
3500 Serge 3631
        push    ecx edx
3632
        cmp     [edx+TASKDATA.state], 9
3633
        jz      .nokill
3634
        lea     edx, [(edx-(CURRENT_TASK and 1FFFFFFFh))*8+SLOT_BASE]
5201 serge 3635
        cmp     [edx+APPDATA.process], sys_proc
3500 Serge 3636
        jz      .nokill
3637
        call    request_terminate
3638
        jmp     .common
3639
.nokill:
3640
        dec     byte [SYS_SHUTDOWN]
3641
        xor     eax, eax
3642
.common:
3643
        pop     edx ecx
3644
        test    eax, eax
3645
        jz      @f
2434 Serge 3646
        mov     [edx+TASKDATA.state], byte 3
3500 Serge 3647
@@:
2434 Serge 3648
        add     edx, 0x20
3649
        loop    markz
3555 Serge 3650
        call    wakeup_osloop
2987 Serge 3651
;--------------------------------------
3652
align 4
709 diamond 3653
@@:
2987 Serge 3654
no_mark_system_shutdown:
2434 Serge 3655
        dec     byte [SYS_SHUTDOWN]
3656
        je      system_shutdown
2987 Serge 3657
;--------------------------------------
3658
align 4
465 serge 3659
noshutdown:
2434 Serge 3660
        mov     eax, [TASK_COUNT]           ; termination
3661
        mov     ebx, TASK_DATA+TASKDATA.state
3662
        mov     esi, 1
2987 Serge 3663
;--------------------------------------
3664
align 4
465 serge 3665
newct:
2434 Serge 3666
        mov     cl, [ebx]
3667
        cmp     cl, byte 3
3500 Serge 3668
        jz      .terminate
2987 Serge 3669
 
2434 Serge 3670
        cmp     cl, byte 4
3500 Serge 3671
        jnz     .noterminate
3672
.terminate:
3673
        pushad
3674
        mov     ecx, eax
3675
        shl     ecx, 8
3676
        add     ecx, SLOT_BASE
3677
        call    restore_default_cursor_before_killing
3678
        popad
1 ha 3679
 
3500 Serge 3680
        pushad
3681
        call    terminate
3682
        popad
3683
        cmp     byte [SYS_SHUTDOWN], 0
3684
        jz      .noterminate
3685
        dec     byte [SYS_SHUTDOWN]
3686
        je      system_shutdown
3687
 
3688
.noterminate:
2434 Serge 3689
        add     ebx, 0x20
3690
        inc     esi
3691
        dec     eax
3692
        jnz     newct
3693
        ret
2987 Serge 3694
;-----------------------------------------------------------------------------
3695
align 4
1 ha 3696
redrawscreen:
3697
; eax , if process window_data base is eax, do not set flag/limits
3698
 
2434 Serge 3699
        pushad
3700
        push    eax
1 ha 3701
 
684 diamond 3702
;;;         mov   ebx,2
1 ha 3703
;;;         call  delay_hs
3704
 
1055 Galkov 3705
         ;mov   ecx,0               ; redraw flags for apps
2434 Serge 3706
        xor     ecx, ecx
2987 Serge 3707
;--------------------------------------
3708
align 4
3709
newdw2:
2434 Serge 3710
        inc     ecx
3711
        push    ecx
1 ha 3712
 
2434 Serge 3713
        mov     eax, ecx
3714
        shl     eax, 5
3715
        add     eax, window_data
1 ha 3716
 
2434 Serge 3717
        cmp     eax, [esp+4]
3718
        je      not_this_task
1055 Galkov 3719
                                   ; check if window in redraw area
2434 Serge 3720
        mov     edi, eax
1 ha 3721
 
2434 Serge 3722
        cmp     ecx, 1             ; limit for background
3723
        jz      bgli
1 ha 3724
 
2434 Serge 3725
        mov     eax, [edi + WDATA.box.left]
3726
        mov     ebx, [edi + WDATA.box.top]
1 ha 3727
 
2434 Serge 3728
        mov     ecx, [draw_limits.bottom] ; ecx = area y end     ebx = window y start
3729
        cmp     ecx, ebx
3730
        jb      ricino
1 ha 3731
 
2434 Serge 3732
        mov     ecx, [draw_limits.right] ; ecx = area x end     eax = window x start
3733
        cmp     ecx, eax
3734
        jb      ricino
1 ha 3735
 
2434 Serge 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
164 serge 3742
 
2434 Serge 3743
        mov     eax, [draw_limits.top]  ; eax = area y start     edx = window y end
3744
        cmp     edx, eax
3745
        jb      ricino
1 ha 3746
 
2434 Serge 3747
        mov     eax, [draw_limits.left]  ; eax = area x start     ecx = window x end
3748
        cmp     ecx, eax
3749
        jb      ricino
2987 Serge 3750
;--------------------------------------
3751
align 4
3752
bgli:
2434 Serge 3753
        cmp     dword[esp], 1
3754
        jnz     .az
2987 Serge 3755
 
2434 Serge 3756
        cmp     byte[REDRAW_BACKGROUND], 0
3757
        jz      .az
2987 Serge 3758
 
2434 Serge 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
2987 Serge 3764
 
2434 Serge 3765
        mov     [eax+RECT.left], ebx
3766
        mov     dl, 1
2987 Serge 3767
;--------------------------------------
3768
align 4
3769
@@:
2434 Serge 3770
        mov     ebx, [draw_limits.top]
3771
        cmp     ebx, [eax+RECT.top]
3772
        jae     @f
2987 Serge 3773
 
2434 Serge 3774
        mov     [eax+RECT.top], ebx
3775
        mov     dl, 1
2987 Serge 3776
;--------------------------------------
3777
align 4
3778
@@:
2434 Serge 3779
        mov     ebx, [draw_limits.right]
3780
        cmp     ebx, [eax+RECT.right]
3781
        jbe     @f
2987 Serge 3782
 
2434 Serge 3783
        mov     [eax+RECT.right], ebx
3784
        mov     dl, 1
2987 Serge 3785
;--------------------------------------
3786
align 4
3787
@@:
2434 Serge 3788
        mov     ebx, [draw_limits.bottom]
3789
        cmp     ebx, [eax+RECT.bottom]
3790
        jbe     @f
2987 Serge 3791
 
2434 Serge 3792
        mov     [eax+RECT.bottom], ebx
3793
        mov     dl, 1
2987 Serge 3794
;--------------------------------------
3795
align 4
3796
@@:
2434 Serge 3797
        add     byte[REDRAW_BACKGROUND], dl
3555 Serge 3798
        call    wakeup_osloop
2434 Serge 3799
        jmp     newdw8
2987 Serge 3800
;--------------------------------------
3801
align 4
3802
.az:
2434 Serge 3803
        mov     eax, edi
3804
        add     eax, draw_data-window_data
1 ha 3805
 
2434 Serge 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
1 ha 3814
 
2434 Serge 3815
        sub     eax, draw_data-window_data
1 ha 3816
 
2434 Serge 3817
        cmp     dword [esp], 1
3818
        jne     nobgrd
3819
        inc     byte[REDRAW_BACKGROUND]
3555 Serge 3820
        call    wakeup_osloop
2987 Serge 3821
;--------------------------------------
3822
align 4
3823
newdw8:
3824
nobgrd:
4265 Serge 3825
;--------------------------------------
3826
        push    eax  edi ebp
3827
        mov     edi, [esp+12]
3828
        cmp     edi, 1
3829
        je      .found
1 ha 3830
 
4265 Serge 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]
5565 serge 3855
        add     ebp, [_display.win_map]
4265 Serge 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
 
2434 Serge 3884
        mov     [eax + WDATA.fl_redraw], byte 1  ; mark as redraw
2987 Serge 3885
;--------------------------------------
3886
align 4
3887
ricino:
3888
not_this_task:
2434 Serge 3889
        pop     ecx
1 ha 3890
 
2434 Serge 3891
        cmp     ecx, [TASK_COUNT]
3892
        jle     newdw2
1 ha 3893
 
2434 Serge 3894
        pop     eax
3895
        popad
3896
        ret
2987 Serge 3897
;-----------------------------------------------------------------------------
3898
align 4
1 ha 3899
calculatebackground:   ; background
5565 serge 3900
        mov     edi, [_display.win_map]              ; set os to use all pixels
2434 Serge 3901
        mov     eax, 0x01010101
5565 serge 3902
        mov     ecx, [_display.win_map_size]
2434 Serge 3903
        shr     ecx, 2
3904
        rep stosd
1 ha 3905
 
2434 Serge 3906
        mov     byte[REDRAW_BACKGROUND], 0            ; do not draw background!
1055 Galkov 3907
        ret
2987 Serge 3908
;-----------------------------------------------------------------------------
1 ha 3909
uglobal
1055 Galkov 3910
  imax    dd 0x0
1 ha 3911
endg
2987 Serge 3912
;-----------------------------------------------------------------------------
3913
align 4
1 ha 3914
delay_ms:     ; delay in 1/1000 sec
2434 Serge 3915
        push    eax
3916
        push    ecx
1 ha 3917
 
2434 Serge 3918
        mov     ecx, esi
1055 Galkov 3919
        ; 
2434 Serge 3920
        imul    ecx, 33941
3921
        shr     ecx, 9
1055 Galkov 3922
        ; 
1 ha 3923
 
2434 Serge 3924
        in      al, 0x61
3925
        and     al, 0x10
3926
        mov     ah, al
1055 Galkov 3927
        cld
2987 Serge 3928
;--------------------------------------
3929
align 4
3930
cnt1:
2434 Serge 3931
        in      al, 0x61
3932
        and     al, 0x10
3933
        cmp     al, ah
3934
        jz      cnt1
1 ha 3935
 
2434 Serge 3936
        mov     ah, al
3937
        loop    cnt1
1 ha 3938
 
2434 Serge 3939
        pop     ecx
3940
        pop     eax
1055 Galkov 3941
        ret
2987 Serge 3942
;-----------------------------------------------------------------------------
2434 Serge 3943
align 4
1 ha 3944
set_app_param:
1055 Galkov 3945
        mov     edi, [TASK_BASE]
2434 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
1055 Galkov 3952
        ret
2987 Serge 3953
;-----------------------------------------------------------------------------
3500 Serge 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
 
3626 Serge 3963
if 1
2987 Serge 3964
align 4
1 ha 3965
delay_hs:     ; delay in 1/100 secs
684 diamond 3966
; ebx = delay time
3626 Serge 3967
 
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
3975
 
3976
        mov     ebx, edx
3977
        mov     ecx, [esp]
3978
        push    edx
3979
        push    eax
3980
        call    wait_event_timeout
3981
        pop     eax
3982
        pop     ebx
3983
        call    destroy_event
3984
.done:
3985
        add     esp, 4
3986
        popad
3987
        ret
3988
 
3989
else
3990
 
3991
align 4
3992
delay_hs:     ; delay in 1/100 secs
3993
; ebx = delay time
2434 Serge 3994
        push    ecx
3995
        push    edx
1 ha 3996
 
2434 Serge 3997
        mov     edx, [timer_ticks]
2987 Serge 3998
;--------------------------------------
3999
align 4
4000
newtic:
2434 Serge 4001
        mov     ecx, [timer_ticks]
4002
        sub     ecx, edx
4003
        cmp     ecx, ebx
4004
        jae     zerodelay
1 ha 4005
 
2434 Serge 4006
        call    change_task
1 ha 4007
 
2434 Serge 4008
        jmp     newtic
2987 Serge 4009
;--------------------------------------
4010
align 4
4011
zerodelay:
2434 Serge 4012
        pop     edx
4013
        pop     ecx
1055 Galkov 4014
        ret
3626 Serge 4015
end if
4016
 
2987 Serge 4017
;-----------------------------------------------------------------------------
2434 Serge 4018
align 16        ;very often call this subrutine
1 ha 4019
memmove:       ; memory move in bytes
4020
; eax = from
4021
; ebx = to
4022
; ecx = no of bytes
2434 Serge 4023
        test    ecx, ecx
4024
        jle     .ret
1 ha 4025
 
2434 Serge 4026
        push    esi edi ecx
1 ha 4027
 
2434 Serge 4028
        mov     edi, ebx
4029
        mov     esi, eax
1 ha 4030
 
2434 Serge 4031
        test    ecx, not 11b
4032
        jz      @f
1 ha 4033
 
2434 Serge 4034
        push    ecx
4035
        shr     ecx, 2
4036
        rep movsd
4037
        pop     ecx
4038
        and     ecx, 11b
4039
        jz      .finish
2987 Serge 4040
;--------------------------------------
4041
align 4
4042
@@:
2434 Serge 4043
        rep movsb
2987 Serge 4044
;--------------------------------------
4045
align 4
4046
.finish:
2434 Serge 4047
        pop     ecx edi esi
2987 Serge 4048
;--------------------------------------
4049
align 4
4050
.ret:
2434 Serge 4051
        ret
2987 Serge 4052
;-----------------------------------------------------------------------------
75 diamond 4053
;  Sysfunction 34, read_floppy_file, is obsolete. Use 58 or 70 function instead.
4054
;align 4
1 ha 4055
;
75 diamond 4056
;read_floppy_file:
1 ha 4057
;
75 diamond 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
1 ha 4076
;
379 serge 4077
;     mov   edi,[TASK_BASE]
75 diamond 4078
;     add   edi,0x10
4079
;     add   esi,[edi]
4080
;     add   eax,[edi]
1 ha 4081
;
75 diamond 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
1 ha 4098
 
4099
 
4100
 
4101
align 4
4102
set_io_access_rights:
2434 Serge 4103
        push    edi eax
4104
        mov     edi, tss._io_map_0
465 serge 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
2434 Serge 4111
        test    ebp, ebp
1232 Lrz 4112
;     cmp   ebp,0                ; enable access - ebp = 0
2434 Serge 4113
        jnz     .siar1
465 serge 4114
;     not   ebx
4115
;     and   [edi],byte bl
2434 Serge 4116
        btr     [edi], eax
4117
        pop     eax edi
4118
        ret
2106 serge 4119
.siar1:
2434 Serge 4120
        bts     [edi], eax
465 serge 4121
  ;  or    [edi],byte bl        ; disable access - ebp = 1
2434 Serge 4122
        pop     eax edi
4123
        ret
1306 Lrz 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:
1638 serge 4130
;  * eax = 0 - succesful
1306 Lrz 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
1 ha 4135
r_f_port_area:
4136
 
2434 Serge 4137
        test    ebx, ebx
4138
        jnz     free_port_area
1 ha 4139
;     je    r_port_area
4140
;     jmp   free_port_area
4141
 
4142
;   r_port_area:
4143
 
1306 Lrz 4144
;     pushad
1 ha 4145
 
2434 Serge 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
465 serge 4155
 rpal3:
2434 Serge 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
1 ha 4163
;     jb    rpal4
4164
;     jmp   rpal1
465 serge 4165
 rpal4:
2434 Serge 4166
        dec     eax
4167
        jnz     rpal3
4168
        jmp     rpal2
1 ha 4169
   rpal1:
1306 Lrz 4170
;     popad
4171
;     mov   eax,1
2434 Serge 4172
        xor     eax, eax
4173
        inc     eax
4174
        ret
1 ha 4175
   rpal2:
1306 Lrz 4176
;     popad
1 ha 4177
     ; enable port access at port IO map
2434 Serge 4178
        cli
4179
        pushad                        ; start enable io map
1 ha 4180
 
2434 Serge 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
1306 Lrz 4186
new_port_access:
4187
;     pushad
2434 Serge 4188
        call    set_io_access_rights
1306 Lrz 4189
;     popad
2434 Serge 4190
        inc     eax
4191
        cmp     eax, edx
4192
        jbe     new_port_access
4193
;       pop     ebp
1306 Lrz 4194
no_unmask_io:
2434 Serge 4195
        popad                         ; end enable io map
4196
        sti
1 ha 4197
 
2434 Serge 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
1 ha 4208
 
2434 Serge 4209
        xor     eax, eax
4210
        ret
1 ha 4211
 
4212
free_port_area:
4213
 
1306 Lrz 4214
;     pushad
2434 Serge 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]
1 ha 4220
   frpal3:
2434 Serge 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
1 ha 4231
   frpal4:
2434 Serge 4232
        dec     eax
4233
        jnz     frpal3
1 ha 4234
   frpal2:
1306 Lrz 4235
;     popad
2434 Serge 4236
        inc     eax
4237
        ret
1 ha 4238
   frpal1:
2434 Serge 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
1 ha 4247
 
2434 Serge 4248
        dec     dword [RESERVED_PORTS]
1306 Lrz 4249
;popad
4250
;disable port access at port IO map
1 ha 4251
 
1306 Lrz 4252
;     pushad                        ; start disable io map
2434 Serge 4253
        pop     eax     ;start port
4254
        cmp     edx, 65536;16384
4255
        jge     no_mask_io
1 ha 4256
 
1306 Lrz 4257
;     mov   eax,ecx
2434 Serge 4258
        xor     ebp, ebp
4259
        inc     ebp
1306 Lrz 4260
new_port_access_disable:
4261
;     pushad
4262
;     mov   ebp,1                  ; disable - eax = port
2434 Serge 4263
        call    set_io_access_rights
1306 Lrz 4264
;     popad
2434 Serge 4265
        inc     eax
4266
        cmp     eax, edx
4267
        jbe     new_port_access_disable
1306 Lrz 4268
no_mask_io:
4269
;     popad                         ; end disable io map
2434 Serge 4270
        xor     eax, eax
4271
        ret
4272
;-----------------------------------------------------------------------------
2106 serge 4273
align 4
1 ha 4274
drawbackground:
2434 Serge 4275
dbrv20:
4276
        cmp     [BgrDrawMode], dword 1
4277
        jne     bgrstr
4278
        call    vesa20_drawbackground_tiled
2465 Serge 4279
;        call    [draw_pointer]
4280
        call    __sys_draw_pointer
2434 Serge 4281
        ret
4282
;--------------------------------------
75 diamond 4283
align 4
2434 Serge 4284
bgrstr:
4285
        call    vesa20_drawbackground_stretch
2465 Serge 4286
;        call    [draw_pointer]
4287
        call    __sys_draw_pointer
2434 Serge 4288
        ret
4289
;-----------------------------------------------------------------------------
4290
align 4
1055 Galkov 4291
syscall_putimage:                       ; PutImage
1 ha 4292
sys_putimage:
2434 Serge 4293
        test    ecx, 0x80008000
4294
        jnz     .exit
4295
        test    ecx, 0x0000FFFF
4296
        jz      .exit
4297
        test    ecx, 0xFFFF0000
4298
        jnz     @f
4299
;--------------------------------------
4300
align 4
4301
.exit:
4302
        ret
4303
;--------------------------------------
4304
align 4
4305
@@:
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
4311
;--------------------------------------
4312
align 4
4313
.forced:
1055 Galkov 4314
        push    ebp esi 0
4315
        mov     ebp, putimage_get24bpp
4316
        mov     esi, putimage_init24bpp
2434 Serge 4317
;--------------------------------------
4318
align 4
283 diamond 4319
sys_putimage_bpp:
2434 Serge 4320
        call    vesa20_putimage
1055 Galkov 4321
        pop     ebp esi ebp
2434 Serge 4322
        ret
4323
;        jmp     [draw_pointer]
4324
;-----------------------------------------------------------------------------
1495 Lrz 4325
align 4
283 diamond 4326
sys_putimage_palette:
4327
; ebx = pointer to image
4328
; ecx = [xsize]*65536 + [ysize]
4329
; edx = [xstart]*65536 + [ystart]
314 diamond 4330
; esi = number of bits per pixel, must be 8, 24 or 32
283 diamond 4331
; edi = pointer to palette
314 diamond 4332
; ebp = row delta
1055 Galkov 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
2434 Serge 4339
;--------------------------------------
4340
align 4
283 diamond 4341
.forced:
1055 Galkov 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
2434 Serge 4355
;--------------------------------------
4356
align 4
911 diamond 4357
@@:
1055 Galkov 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
2434 Serge 4367
;--------------------------------------
4368
align 4
911 diamond 4369
@@:
1055 Galkov 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
2434 Serge 4379
;--------------------------------------
4380
align 4
314 diamond 4381
@@:
1055 Galkov 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
2434 Serge 4388
;--------------------------------------
4389
align 4
918 diamond 4390
@@:
2987 Serge 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
@@:
1055 Galkov 4399
        cmp     esi, 15
4400
        jnz     @f
4401
        mov     ebp, putimage_get15bpp
4402
        mov     esi, putimage_init15bpp
4403
        jmp     sys_putimage_bpp
2434 Serge 4404
;--------------------------------------
4405
align 4
906 diamond 4406
@@:
1055 Galkov 4407
        cmp     esi, 16
4408
        jnz     @f
4409
        mov     ebp, putimage_get16bpp
4410
        mov     esi, putimage_init16bpp
4411
        jmp     sys_putimage_bpp
2434 Serge 4412
;--------------------------------------
4413
align 4
842 diamond 4414
@@:
1055 Galkov 4415
        cmp     esi, 24
4416
        jnz     @f
4417
        mov     ebp, putimage_get24bpp
4418
        mov     esi, putimage_init24bpp
4419
        jmp     sys_putimage_bpp
2434 Serge 4420
;--------------------------------------
4421
align 4
314 diamond 4422
@@:
1055 Galkov 4423
        cmp     esi, 32
4424
        jnz     @f
4425
        mov     ebp, putimage_get32bpp
4426
        mov     esi, putimage_init32bpp
4427
        jmp     sys_putimage_bpp
2434 Serge 4428
;--------------------------------------
4429
align 4
314 diamond 4430
@@:
1055 Galkov 4431
        pop     ebp esi ebp
4432
        ret
2434 Serge 4433
;-----------------------------------------------------------------------------
4434
align 4
911 diamond 4435
put_mono_image:
1055 Galkov 4436
        push    ebp esi ebp
4437
        mov     ebp, putimage_get1bpp
4438
        mov     esi, putimage_init1bpp
4439
        jmp     sys_putimage_bpp
2434 Serge 4440
;-----------------------------------------------------------------------------
4441
align 4
918 diamond 4442
put_2bit_image:
1055 Galkov 4443
        push    ebp esi ebp
4444
        mov     ebp, putimage_get2bpp
4445
        mov     esi, putimage_init2bpp
4446
        jmp     sys_putimage_bpp
2434 Serge 4447
;-----------------------------------------------------------------------------
4448
align 4
911 diamond 4449
put_4bit_image:
1055 Galkov 4450
        push    ebp esi ebp
4451
        mov     ebp, putimage_get4bpp
4452
        mov     esi, putimage_init4bpp
4453
        jmp     sys_putimage_bpp
2434 Serge 4454
;-----------------------------------------------------------------------------
4455
align 4
283 diamond 4456
putimage_init24bpp:
1055 Galkov 4457
        lea     eax, [eax*3]
283 diamond 4458
putimage_init8bpp:
2987 Serge 4459
putimage_init9bpp:
1055 Galkov 4460
        ret
2434 Serge 4461
;-----------------------------------------------------------------------------
911 diamond 4462
align 16
283 diamond 4463
putimage_get24bpp:
1055 Galkov 4464
        movzx   eax, byte [esi+2]
4465
        shl     eax, 16
4466
        mov     ax, [esi]
4467
        add     esi, 3
4468
        ret     4
2434 Serge 4469
;-----------------------------------------------------------------------------
911 diamond 4470
align 16
283 diamond 4471
putimage_get8bpp:
1055 Galkov 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
2434 Serge 4479
;-----------------------------------------------------------------------------
2987 Serge 4480
align 16
4481
putimage_get9bpp:
4482
        lodsb
4483
        mov     ah, al
4484
        shl     eax, 8
4485
        mov     al, ah
4486
        ret     4
4487
;-----------------------------------------------------------------------------
2434 Serge 4488
align 4
911 diamond 4489
putimage_init1bpp:
1055 Galkov 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
2434 Serge 4499
;-----------------------------------------------------------------------------
911 diamond 4500
align 16
4501
putimage_get1bpp:
1055 Galkov 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
911 diamond 4509
@@:
1055 Galkov 4510
        mov     [edx], al
4511
        sbb     eax, eax
4512
        and     eax, [edx+8]
4513
        add     eax, [edx+4]
4514
        pop     edx
4515
        ret     4
2434 Serge 4516
;-----------------------------------------------------------------------------
4517
align 4
918 diamond 4518
putimage_init2bpp:
1055 Galkov 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
2434 Serge 4528
;-----------------------------------------------------------------------------
918 diamond 4529
align 16
4530
putimage_get2bpp:
1055 Galkov 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
918 diamond 4543
.nonewbyte:
1055 Galkov 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
2434 Serge 4550
;-----------------------------------------------------------------------------
4551
align 4
911 diamond 4552
putimage_init4bpp:
1055 Galkov 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
2434 Serge 4562
;-----------------------------------------------------------------------------
911 diamond 4563
align 16
4564
putimage_get4bpp:
1055 Galkov 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
911 diamond 4575
@@:
1055 Galkov 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
2434 Serge 4584
;-----------------------------------------------------------------------------
4585
align 4
314 diamond 4586
putimage_init32bpp:
1055 Galkov 4587
        shl     eax, 2
4588
        ret
2434 Serge 4589
;-----------------------------------------------------------------------------
911 diamond 4590
align 16
314 diamond 4591
putimage_get32bpp:
1055 Galkov 4592
        lodsd
4593
        ret     4
2434 Serge 4594
;-----------------------------------------------------------------------------
4595
align 4
906 diamond 4596
putimage_init15bpp:
911 diamond 4597
putimage_init16bpp:
1055 Galkov 4598
        add     eax, eax
4599
        ret
2434 Serge 4600
;-----------------------------------------------------------------------------
911 diamond 4601
align 16
906 diamond 4602
putimage_get15bpp:
842 diamond 4603
; 0RRRRRGGGGGBBBBB -> 00000000RRRRR000GGGGG000BBBBB000
1055 Galkov 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
2434 Serge 4619
;-----------------------------------------------------------------------------
911 diamond 4620
align 16
906 diamond 4621
putimage_get16bpp:
4622
; RRRRRGGGGGGBBBBB -> 00000000RRRRR000GGGGGG00BBBBB000
1055 Galkov 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
2434 Serge 4638
;-----------------------------------------------------------------------------
4639
;align 4
1 ha 4640
; eax x beginning
4641
; ebx y beginning
4642
; ecx x end
1055 Galkov 4643
        ; edx y end
1 ha 4644
; edi color
2434 Serge 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
4655
;        call    [draw_pointer]
4656
;        ret
4657
;-----------------------------------------------------------------------------
4658
align 4
5201 serge 4659
kb_write_wait_ack:
1 ha 4660
 
1055 Galkov 4661
        push    ecx edx
1 ha 4662
 
2434 Serge 4663
        mov     dl, al
4664
        mov     ecx, 0x1ffff; last 0xffff, new value in view of fast CPU's
5201 serge 4665
.wait_output_ready:
2434 Serge 4666
        in      al, 0x64
4667
        test    al, 2
5201 serge 4668
        jz      @f
4669
        loop    .wait_output_ready
2434 Serge 4670
        mov     ah, 1
5201 serge 4671
        jmp     .nothing
4672
@@:
2434 Serge 4673
        mov     al, dl
4674
        out     0x60, al
5201 serge 4675
        mov     ecx, 0xfffff; last 0xffff, new value in view of fast CPU's
4676
.wait_ack:
2434 Serge 4677
        in      al, 0x64
5201 serge 4678
        test    al, 1
4679
        jnz     @f
4680
        loop    .wait_ack
2434 Serge 4681
        mov     ah, 1
5201 serge 4682
        jmp     .nothing
4683
@@:
4684
        in      al, 0x60
2434 Serge 4685
        xor     ah, ah
1 ha 4686
 
5201 serge 4687
.nothing:
1055 Galkov 4688
        pop     edx ecx
1 ha 4689
 
1055 Galkov 4690
        ret
2434 Serge 4691
;-----------------------------------------------------------------------------
1 ha 4692
 
4693
setmouse:  ; set mousepicture -pointer
1055 Galkov 4694
           ; ps2 mouse enable
1 ha 4695
 
2434 Serge 4696
;        mov     [MOUSE_PICTURE], dword mousepointer
1 ha 4697
 
2434 Serge 4698
        cli
1 ha 4699
 
2434 Serge 4700
        ret
1 ha 4701
 
1055 Galkov 4702
if used _rdtsc
1 ha 4703
_rdtsc:
2434 Serge 4704
        bt      [cpu_caps], CAPS_TSC
4705
        jnc     ret_rdtsc
4706
        rdtsc
4707
        ret
1 ha 4708
   ret_rdtsc:
2434 Serge 4709
        mov     edx, 0xffffffff
4710
        mov     eax, 0xffffffff
4711
        ret
1055 Galkov 4712
end if
1 ha 4713
 
4714
sys_msg_board_str:
4715
 
2434 Serge 4716
        pushad
1 ha 4717
   @@:
2434 Serge 4718
        cmp     [esi], byte 0
4719
        je      @f
3626 Serge 4720
        mov     ebx, 1
4721
        movzx   ecx, byte [esi]
2434 Serge 4722
        call    sys_msg_board
4723
        inc     esi
4724
        jmp     @b
1 ha 4725
   @@:
2434 Serge 4726
        popad
4727
        ret
1 ha 4728
 
709 diamond 4729
sys_msg_board_byte:
4730
; in: al = byte to display
4731
; out: nothing
4732
; destroys: nothing
1055 Galkov 4733
        pushad
4734
        mov     ecx, 2
4735
        shl     eax, 24
4736
        jmp     @f
709 diamond 4737
 
4738
sys_msg_board_word:
4739
; in: ax = word to display
4740
; out: nothing
4741
; destroys: nothing
1055 Galkov 4742
        pushad
4743
        mov     ecx, 4
4744
        shl     eax, 16
4745
        jmp     @f
709 diamond 4746
 
4747
sys_msg_board_dword:
4748
; in: eax = dword to display
4749
; out: nothing
4750
; destroys: nothing
1055 Galkov 4751
        pushad
4752
        mov     ecx, 8
709 diamond 4753
@@:
1055 Galkov 4754
        push    ecx
4755
        rol     eax, 4
4756
        push    eax
4757
        and     al, 0xF
4758
        cmp     al, 10
4759
        sbb     al, 69h
4760
        das
3626 Serge 4761
        mov     cl, al
4762
        xor     ebx, ebx
4763
        inc     ebx
1055 Galkov 4764
        call    sys_msg_board
4765
        pop     eax
4766
        pop     ecx
4767
        loop    @b
4768
        popad
4769
        ret
709 diamond 4770
 
3500 Serge 4771
msg_board_data_size = 65536 ; Must be power of two
4772
 
1 ha 4773
uglobal
3500 Serge 4774
  msg_board_data  rb msg_board_data_size
1 ha 4775
  msg_board_count dd 0x0
4776
endg
4777
 
4778
sys_msg_board:
4779
 
3626 Serge 4780
; ebx=1 : write :  bl byte to write
4781
; ebx=2 :  read :  ebx=0 -> no data, ebx=1 -> data in al
1 ha 4782
 
3626 Serge 4783
        push    eax ebx                 ; Save eax and ebx, since we're restoring their order required.
4784
        mov     eax, ebx
4785
        mov     ebx, ecx
4786
 
1055 Galkov 4787
        mov     ecx, [msg_board_count]
4788
        cmp     eax, 1
4789
        jne     .smbl1
1 ha 4790
 
1043 hidnplayr 4791
if defined debug_com_base
1 ha 4792
 
1055 Galkov 4793
        push    dx ax
1043 hidnplayr 4794
 
1055 Galkov 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
1043 hidnplayr 4800
 
1055 Galkov 4801
        mov     dx, debug_com_base      ; Output the byte
4802
        mov     al, bl
4803
        out     dx, al
1043 hidnplayr 4804
 
1055 Galkov 4805
        pop     ax dx
1043 hidnplayr 4806
 
4807
end if
4808
 
2434 Serge 4809
        mov     [msg_board_data+ecx], bl
3908 Serge 4810
; // if debug_direct_print == 1
4811
        cmp     byte [debug_direct_print], 1
4812
        jnz     @f
3555 Serge 4813
        pusha
4814
iglobal
3908 Serge 4815
msg_board_pos   dd      (42*6)*65536+10 ; for printing debug output on the screen
3555 Serge 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
3908 Serge 4827
        mov     word [msg_board_pos+2], (42*6)
3555 Serge 4828
        add     word [msg_board_pos], 10
5565 serge 4829
        mov     ax, word [_display.width]
3555 Serge 4830
        cmp     word [msg_board_pos], ax
5565 serge 4831
        jb      @f
3555 Serge 4832
        mov     word [msg_board_pos], 10
4833
@@:
3908 Serge 4834
; // end if
4835
 
3555 Serge 4836
if 0
4837
        pusha
4838
        mov     al, bl
4839
        mov     edx, 402h
4840
        out     dx, al
4841
        popa
4842
end if
1055 Galkov 4843
        inc     ecx
3500 Serge 4844
        and     ecx, msg_board_data_size - 1
1055 Galkov 4845
        mov     [msg_board_count], ecx
3626 Serge 4846
 
4847
        pop     ebx eax
1055 Galkov 4848
        ret
671 Ghost 4849
.smbl1:
1055 Galkov 4850
        cmp     eax, 2
4851
        jne     .smbl2
4852
        test    ecx, ecx
4853
        jz      .smbl21
3626 Serge 4854
 
4855
        add     esp, 8                  ; Returning data in ebx and eax, so no need to restore them.
1055 Galkov 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]
3626 Serge 4861
        mov     [esp + 32], edx ;eax
4862
        mov     [esp + 20], dword 1
1055 Galkov 4863
        ret
671 Ghost 4864
.smbl21:
3626 Serge 4865
        mov     [esp+32], ecx
4866
        mov     [esp+20], ecx
671 Ghost 4867
.smbl2:
3626 Serge 4868
        pop     ebx eax
1055 Galkov 4869
        ret
1 ha 4870
 
1494 Lrz 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
2987 Serge 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
1494 Lrz 4886
endg
2987 Serge 4887
;-----------------------------------------------------------------------------
4888
align 4
1 ha 4889
sys_process_def:
2434 Serge 4890
        dec     ebx
2987 Serge 4891
        cmp     ebx, 7
4892
        jae     .not_support    ;if >=8 then or eax,-1
1494 Lrz 4893
 
1055 Galkov 4894
        mov     edi, [CURRENT_TASK]
2434 Serge 4895
        jmp     dword [f66call+ebx*4]
1 ha 4896
 
1494 Lrz 4897
.not_support:
2434 Serge 4898
        or      eax, -1
4899
        ret
2987 Serge 4900
;-----------------------------------------------------------------------------
4901
align 4
1494 Lrz 4902
.1:
2434 Serge 4903
        shl     edi, 8
4904
        mov     [edi+SLOT_BASE + APPDATA.keyboard_mode], cl
1 ha 4905
 
2434 Serge 4906
        ret
2987 Serge 4907
;-----------------------------------------------------------------------------
4908
align 4
2434 Serge 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
2987 Serge 4914
;-----------------------------------------------------------------------------
4915
align 4
2434 Serge 4916
.3:                             ;3 = get keyboard ctrl, alt, shift
4917
        mov     eax, [kb_state]
4918
        mov     [esp+32], eax
4919
        ret
2987 Serge 4920
;-----------------------------------------------------------------------------
4921
align 4
1494 Lrz 4922
.4:
1055 Galkov 4923
        mov     eax, hotkey_list
92 diamond 4924
@@:
1055 Galkov 4925
        cmp     dword [eax+8], 0
4926
        jz      .found_free
4927
        add     eax, 16
4928
        cmp     eax, hotkey_list+16*256
4929
        jb      @b
1494 Lrz 4930
        mov     dword [esp+32], 1
1055 Galkov 4931
        ret
92 diamond 4932
.found_free:
1055 Galkov 4933
        mov     [eax+8], edi
1494 Lrz 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
3500 Serge 4941
        test    edx, edx
4942
        jz      @f
1494 Lrz 4943
        mov     [edx+12], eax
92 diamond 4944
@@:
1494 Lrz 4945
        and     dword [esp+32], 0
1055 Galkov 4946
        ret
2987 Serge 4947
;-----------------------------------------------------------------------------
4948
align 4
1494 Lrz 4949
.5:
4950
        movzx   ebx, cl
1055 Galkov 4951
        lea     ebx, [hotkey_scancodes+ebx*4]
4952
        mov     eax, [ebx]
92 diamond 4953
.scan:
1055 Galkov 4954
        test    eax, eax
4955
        jz      .notfound
4956
        cmp     [eax+8], edi
4957
        jnz     .next
1494 Lrz 4958
        cmp     [eax+4], edx
1055 Galkov 4959
        jz      .found
92 diamond 4960
.next:
1055 Galkov 4961
        mov     eax, [eax]
4962
        jmp     .scan
92 diamond 4963
.notfound:
1494 Lrz 4964
        mov     dword [esp+32], 1
1055 Galkov 4965
        ret
92 diamond 4966
.found:
1055 Galkov 4967
        mov     ecx, [eax]
4968
        jecxz   @f
4969
        mov     edx, [eax+12]
4970
        mov     [ecx+12], edx
92 diamond 4971
@@:
1055 Galkov 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
1494 Lrz 4980
        mov     [esp+32], edx
1055 Galkov 4981
        ret
2987 Serge 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
92 diamond 5012
 
2987 Serge 5013
        xor     eax, eax
5014
        mov     [PID_lock_input], eax
5015
@@:
5016
        ret
5017
;-----------------------------------------------------------------------------
5018
uglobal
5019
  PID_lock_input dd 0x0
5020
endg
1497 Lrz 5021
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5022
;; 61 sys function.                                                ;;
5023
;; in eax=61,ebx in [1..3]                                         ;;
5024
;; out eax                                                         ;;
5025
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5026
iglobal
1 ha 5027
align 4
1497 Lrz 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
1 ha 5033
 
1497 Lrz 5034
 
5035
align 4
5036
 
1055 Galkov 5037
sys_gs:                         ; direct screen access
2434 Serge 5038
        dec     ebx
5039
        cmp     ebx, 2
5040
        ja      .not_support
5041
        jmp     dword [f61call+ebx*4]
1497 Lrz 5042
.not_support:
2434 Serge 5043
        or      [esp+32], dword -1
1497 Lrz 5044
        ret
1 ha 5045
 
1497 Lrz 5046
 
5047
.1:                             ; resolution
5565 serge 5048
        mov     eax, [_display.width]
2434 Serge 5049
        shl     eax, 16
5565 serge 5050
        mov     ax, word [_display.height]
2434 Serge 5051
        mov     [esp+32], eax
5052
        ret
5053
.2:                             ; bits per pixel
5201 serge 5054
        mov     eax, [_display.bits_per_pixel]
2434 Serge 5055
        mov     [esp+32], eax
5056
        ret
1497 Lrz 5057
.3:                             ; bytes per scanline
5565 serge 5058
        mov     eax, [_display.lfb_pitch]
2434 Serge 5059
        mov     [esp+32], eax
5060
        ret
1 ha 5061
 
5062
align 4  ;  system functions
5063
 
1055 Galkov 5064
syscall_setpixel:                       ; SetPixel
1 ha 5065
 
1055 Galkov 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
2434 Serge 5076
        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 save to mouseunder area
2465 Serge 5077
;        jmp     [putpixel]
5078
        jmp     __sys_putpixel
1 ha 5079
 
5080
align 4
5081
 
1055 Galkov 5082
syscall_writetext:                      ; WriteText
1 ha 5083
 
2434 Serge 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
3500 Serge 5093
        test    ecx, 0x08000000  ; redirect the output to the user area
5094
        jnz     @f
2434 Serge 5095
        add     ebx, ebp
3500 Serge 5096
align 4
5097
@@:
2434 Serge 5098
        mov     eax, edi
2987 Serge 5099
        test    ecx, 0x08000000  ; redirect the output to the user area
5100
        jnz     dtext
2434 Serge 5101
        xor     edi, edi
5102
        jmp     dtext
1 ha 5103
 
5104
align 4
5105
 
1055 Galkov 5106
syscall_drawrect:                       ; DrawRect
1 ha 5107
 
1055 Galkov 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
1 ha 5114
 
1055 Galkov 5115
        mov     eax, ebx ; bad idea
5116
        mov     ebx, ecx
1 ha 5117
 
1055 Galkov 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]
1 ha 5123
 
1055 Galkov 5124
        add     eax, [esi + APPDATA.wnd_clientbox.left]
5125
        add     ebx, [esi + APPDATA.wnd_clientbox.top]
5126
        add     ecx, eax
5127
        add     edx, ebx
2465 Serge 5128
;        jmp     [drawbar]
5129
        jmp     vesa20_drawbar
671 Ghost 5130
.drectr:
1055 Galkov 5131
        ret
1 ha 5132
 
5133
align 4
1055 Galkov 5134
syscall_getscreensize:                  ; GetScreenSize
5565 serge 5135
        mov     ax, word [_display.width]
5136
        dec     ax
1055 Galkov 5137
        shl     eax, 16
5565 serge 5138
        mov     ax, word [_display.height]
5139
        dec     ax
1055 Galkov 5140
        mov     [esp + 32], eax
5141
        ret
5201 serge 5142
;-----------------------------------------------------------------------------
671 Ghost 5143
align 4
5201 serge 5144
syscall_cdaudio:
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
671 Ghost 5151
 
5201 serge 5152
        mov     eax, ecx
5153
        shr     eax, 2
5154
        lea     eax, [eax*5]
5155
        mov     al, [eax+DRIVE_DATA+1]
1 ha 5156
 
5201 serge 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
 
1290 Lrz 5169
        cmp     ebx, 4
5201 serge 5170
        je      .eject
5171
 
1290 Lrz 5172
        cmp     ebx, 5
5201 serge 5173
        je      .load
5174
;--------------------------------------
5175
.exit:
5176
        ret
5177
;--------------------------------------
588 diamond 5178
.load:
1055 Galkov 5179
        call    .reserve
5180
        call    LoadMedium
2434 Serge 5181
        jmp     .free
5201 serge 5182
;--------------------------------------
588 diamond 5183
.eject:
1055 Galkov 5184
        call    .reserve
5185
        call    clear_CD_cache
5186
        call    allow_medium_removal
5187
        call    EjectMedium
2434 Serge 5188
        jmp     .free
5201 serge 5189
;--------------------------------------
588 diamond 5190
.reserve:
1055 Galkov 5191
        call    reserve_cd
5201 serge 5192
 
5193
        mov     ebx, ecx
5194
        inc     ebx
5195
        mov     [cdpos], ebx
5196
 
1290 Lrz 5197
        mov     eax, ecx
1055 Galkov 5198
        shr     eax, 1
5199
        and     eax, 1
5200
        inc     eax
5201
        mov     [ChannelNumber], ax
1290 Lrz 5202
        mov     eax, ecx
1055 Galkov 5203
        and     eax, 1
5204
        mov     [DiskNumber], al
5205
        call    reserve_cd_channel
5206
        ret
5201 serge 5207
;--------------------------------------
588 diamond 5208
.free:
1055 Galkov 5209
        call    free_cd_channel
5210
        and     [cd_status], 0
5211
        ret
2987 Serge 5212
;-----------------------------------------------------------------------------
1 ha 5213
align 4
2987 Serge 5214
syscall_getpixel_WinMap:                       ; GetPixel WinMap
5565 serge 5215
        cmp     ebx, [_display.width]
5216
        jb      @f
5217
        cmp     ecx, [_display.height]
5218
        jb      @f
2987 Serge 5219
        xor     eax, eax
5220
        jmp     .store
5221
;--------------------------------------
5222
align 4
5223
@@:
5224
        mov     eax, [d_width_calc_area + ecx*4]
5565 serge 5225
        add     eax, [_display.win_map]
2987 Serge 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
1055 Galkov 5234
syscall_getpixel:                       ; GetPixel
5565 serge 5235
        mov     ecx, [_display.width]
2434 Serge 5236
        xor     edx, edx
5237
        mov     eax, ebx
5238
        div     ecx
5239
        mov     ebx, edx
5240
        xchg    eax, ebx
5241
        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 use mouseunder area
5242
        call    dword [GETPIXEL]; eax - x, ebx - y
5243
        mov     [esp + 32], ecx
5244
        ret
2987 Serge 5245
;-----------------------------------------------------------------------------
921 mario79 5246
align 4
5247
syscall_getarea:
5248
;eax = 36
1055 Galkov 5249
;ebx = pointer to bufer for img BBGGRRBBGGRR...
5250
;ecx = [size x]*65536 + [size y]
5251
;edx = [start x]*65536 + [start y]
2434 Serge 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
921 mario79 5260
     ; eax - x, ebx - y
2434 Serge 5261
        mov     edx, ecx
1638 serge 5262
 
2434 Serge 5263
        shr     ecx, 16
5264
        and     edx, 0xffff
5265
        mov     esi, ecx
921 mario79 5266
     ; ecx - size x, edx - size y
1638 serge 5267
 
2434 Serge 5268
        mov     ebp, edx
5269
        dec     ebp
5270
        lea     ebp, [ebp*3]
1638 serge 5271
 
2434 Serge 5272
        imul    ebp, esi
1638 serge 5273
 
2434 Serge 5274
        mov     esi, ecx
5275
        dec     esi
5276
        lea     esi, [esi*3]
1638 serge 5277
 
2434 Serge 5278
        add     ebp, esi
5279
        add     ebp, edi
927 mario79 5280
 
2434 Serge 5281
        add     ebx, edx
2987 Serge 5282
;--------------------------------------
5283
align 4
921 mario79 5284
.start_y:
2434 Serge 5285
        push    ecx edx
2987 Serge 5286
;--------------------------------------
5287
align 4
921 mario79 5288
.start_x:
2434 Serge 5289
        push    eax ebx ecx
5290
        add     eax, ecx
927 mario79 5291
 
2434 Serge 5292
        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 use mouseunder area
5293
        call    dword [GETPIXEL]; eax - x, ebx - y
1638 serge 5294
 
2434 Serge 5295
        mov     [ebp], cx
5296
        shr     ecx, 16
5297
        mov     [ebp+2], cl
921 mario79 5298
 
2434 Serge 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
2987 Serge 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
921 mario79 5333
 
2987 Serge 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
;--------------------------------------
1 ha 5345
align 4
2987 Serge 5346
.start_y:
5347
        push    ecx edx
5348
;--------------------------------------
5349
align 4
5350
.start_x:
5351
        push    eax ecx
5352
        add     eax, ecx
1 ha 5353
 
2987 Serge 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]
5565 serge 5364
        add     edx, [_display.win_map]
2987 Serge 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
5378
 
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
1055 Galkov 5392
syscall_drawline:                       ; DrawLine
1 ha 5393
 
1055 Galkov 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]
2434 Serge 5400
        add     ebp, ebx
1055 Galkov 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
2465 Serge 5412
;        jmp     [draw_line]
5413
        jmp     __sys_draw_line
1 ha 5414
 
5415
 
5416
align 4
1055 Galkov 5417
syscall_reserveportarea:                ; ReservePortArea and FreePortArea
1 ha 5418
 
2434 Serge 5419
        call    r_f_port_area
5420
        mov     [esp+32], eax
5421
        ret
1 ha 5422
 
5423
align 4
1055 Galkov 5424
syscall_threads:                        ; CreateThreads
1369 Lrz 5425
;
4265 Serge 5426
;   ecx=thread entry point
5427
;   edx=thread stack pointer
1369 Lrz 5428
;
5429
; on return : eax = pid
1 ha 5430
 
4265 Serge 5431
        xor     ebx, ebx
2434 Serge 5432
        call    new_sys_threads
1369 Lrz 5433
 
2434 Serge 5434
        mov     [esp+32], eax
5435
        ret
1 ha 5436
 
5437
align 4
5438
 
375 Ghost 5439
paleholder:
1055 Galkov 5440
        ret
2439 Serge 5441
;------------------------------------------------------------------------------
757 serge 5442
align 4
2439 Serge 5443
calculate_fast_getting_offset_for_WinMapAddress:
5444
; calculate data area for fast getting offset to _WinMapAddress
2465 Serge 5445
        xor     eax, eax
2439 Serge 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
2987 Serge 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
5565 serge 5465
        add     eax, [_display.lfb_pitch]
2987 Serge 5466
        dec     ecx
5467
        jnz     @r
5468
        ret
5469
;------------------------------------------------------------------------------
5470
align 4
757 serge 5471
set_screen:
2987 Serge 5472
; in:
5473
; eax - new Screen_Max_X
5474
; ecx - new BytesPerScanLine
5475
; edx - new Screen_Max_Y
709 diamond 5476
 
1055 Galkov 5477
        pushfd
5478
        cli
757 serge 5479
 
5565 serge 5480
        mov     [_display.lfb_pitch], ecx
757 serge 5481
 
2434 Serge 5482
        mov     [screen_workarea.right], eax
5483
        mov     [screen_workarea.bottom], edx
1300 serge 5484
 
2434 Serge 5485
        push    ebx
5486
        push    esi
5487
        push    edi
1300 serge 5488
 
5489
        pushad
5490
 
2987 Serge 5491
        cmp     [do_not_touch_winmap], 1
5492
        je      @f
5493
 
5565 serge 5494
        stdcall kernel_free, [_display.win_map]
1300 serge 5495
 
2434 Serge 5496
        mov     eax, [_display.width]
5497
        mul     [_display.height]
5565 serge 5498
        mov     [_display.win_map_size], eax
1300 serge 5499
 
5500
        stdcall kernel_alloc, eax
5565 serge 5501
        mov     [_display.win_map], eax
2434 Serge 5502
        test    eax, eax
5503
        jz      .epic_fail
2987 Serge 5504
; store for f.18.24
5505
        mov     eax, [_display.width]
5506
        mov     [display_width_standard], eax
1300 serge 5507
 
2987 Serge 5508
        mov     eax, [_display.height]
5509
        mov     [display_height_standard], eax
5510
@@:
2439 Serge 5511
        call    calculate_fast_getting_offset_for_WinMapAddress
2987 Serge 5512
; for Qemu or non standart video cards
5513
; Unfortunately [BytesPerScanLine] does not always
5514
;                             equal to [_display.width] * [ScreenBPP] / 8
5515
        call    calculate_fast_getting_offset_for_LFB
1300 serge 5516
        popad
5517
 
1055 Galkov 5518
        call    repos_windows
2434 Serge 5519
        xor     eax, eax
5520
        xor     ebx, ebx
5565 serge 5521
        mov     ecx, [_display.width]
5522
        mov     edx, [_display.height]
5523
        dec     ecx
5524
        dec     edx
1055 Galkov 5525
        call    calculatescreen
2434 Serge 5526
        pop     edi
5527
        pop     esi
5528
        pop     ebx
757 serge 5529
 
1055 Galkov 5530
        popfd
5531
        ret
757 serge 5532
 
1300 serge 5533
.epic_fail:
5534
        hlt                     ; Houston, we've had a problem
5535
 
76 mario79 5536
; --------------- APM ---------------------
1330 Lrz 5537
uglobal
2434 Serge 5538
apm_entry       dp      0
5539
apm_vf          dd      0
1330 Lrz 5540
endg
5541
 
1 ha 5542
align 4
76 mario79 5543
sys_apm:
2434 Serge 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
164 serge 5552
 
465 serge 5553
@@:
2434 Serge 5554
;       xchg    eax, ecx
5555
;       xchg    ebx, ecx
164 serge 5556
 
2434 Serge 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
78 diamond 5565
 
465 serge 5566
@@:
5567
 
2434 Serge 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
465 serge 5573
 
2434 Serge 5574
        call    pword [apm_entry]       ;call APM BIOS
465 serge 5575
 
2434 Serge 5576
        xchg    eax, [esp]
5577
        mov     [master_tab], eax
5578
        mov     eax, cr3
5579
        mov     cr3, eax
5580
        pop     eax
465 serge 5581
 
2434 Serge 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
76 mario79 5592
; -----------------------------------------
1 ha 5593
 
76 mario79 5594
align 4
5595
 
1055 Galkov 5596
undefined_syscall:                      ; Undefined system call
2434 Serge 5597
        mov     [esp + 32], dword -1
5598
        ret
1 ha 5599
 
465 serge 5600
align 4
1055 Galkov 5601
system_shutdown:          ; shut down the system
1 ha 5602
 
3908 Serge 5603
        cmp     byte [BOOT_VARS+0x9030], 1
2434 Serge 5604
        jne     @F
5605
        ret
465 serge 5606
@@:
2434 Serge 5607
        call    stop_all_services
1 ha 5608
 
465 serge 5609
yes_shutdown_param:
5201 serge 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
5620
        push    esi
5621
        xor     esi, esi
5622
        inc     esi
5623
        shl     eax, 24
5624
        mov     [edi+10h], eax
5625
; assert INIT IPI
5626
        mov     dword [edi], 0C500h
5627
        call    delay_ms
5628
@@:
5629
        test    dword [edi], 1000h
5630
        jnz     @b
5631
; deassert INIT IPI
5632
        mov     dword [edi], 8500h
5633
        call    delay_ms
5634
@@:
5635
        test    dword [edi], 1000h
5636
        jnz     @b
5637
; don't send STARTUP IPI: let other CPUs be in wait-for-startup state
5638
        pop     esi
5639
        dec     ebx
5640
        jnz     .shutdown_cpus_loop
5641
.no_shutdown_cpus:
5642
 
2434 Serge 5643
        cli
1 ha 5644
 
2010 serge 5645
if ~ defined extended_primary_loader
4287 Serge 5646
; load kernel.mnt to 0x7000:0
5647
        mov     ebx, kernel_file_load
5648
        pushad
5649
        call    file_system_lfn
5650
        popad
1 ha 5651
 
2434 Serge 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
2010 serge 5656
end if
1 ha 5657
 
3908 Serge 5658
;        mov     esi, BOOT_VAR    ; restore 0x0 - 0xffff
5659
;        mov     edi, OS_BASE
5660
;        mov     ecx, 0x10000/4
5661
;        cld
5662
;        rep movsd
1 ha 5663
 
2434 Serge 5664
        call    IRQ_mask_all
1 ha 5665
 
1055 Galkov 5666
        cmp     byte [OS_BASE + 0x9030], 2
5667
        jnz     no_acpi_power_off
1 ha 5668
 
709 diamond 5669
; scan for RSDP
5670
; 1) The first 1 Kb of the Extended BIOS Data Area (EBDA).
1055 Galkov 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
709 diamond 5677
@@:
5678
; 2) The BIOS read-only memory space between 0E0000h and 0FFFFFh.
1055 Galkov 5679
        mov     eax, 0xE0000
5680
        mov     ecx, 0x2000
5681
        call    scan_rsdp
5682
        jc      no_acpi_power_off
709 diamond 5683
.rsdp_found:
1055 Galkov 5684
        mov     esi, [eax+16]   ; esi contains physical address of the RSDT
5685
        mov     ebp, [ipc_tmp]
5565 serge 5686
        stdcall map_page, ebp, esi, PG_READ
1055 Galkov 5687
        lea     eax, [esi+1000h]
5688
        lea     edx, [ebp+1000h]
5565 serge 5689
        stdcall map_page, edx, eax, PG_READ
1055 Galkov 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
709 diamond 5699
.scan_fadt:
1055 Galkov 5700
        lodsd
5701
        mov     ebx, eax
5702
        lea     eax, [ebp+2000h]
5565 serge 5703
        stdcall map_page, eax, ebx, PG_READ
1055 Galkov 5704
        lea     eax, [ebp+3000h]
5705
        add     ebx, 0x1000
5565 serge 5706
        stdcall map_page, eax, ebx, PG_READ
1055 Galkov 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
709 diamond 5713
.fadt_found:
5714
; ebx is linear address of FADT
1085 diamond 5715
        mov     edi, [ebx+40] ; physical address of the DSDT
5716
        lea     eax, [ebp+4000h]
5565 serge 5717
        stdcall map_page, eax, edi, PG_READ
1085 diamond 5718
        lea     eax, [ebp+5000h]
5719
        lea     esi, [edi+0x1000]
5565 serge 5720
        stdcall map_page, eax, esi, PG_READ
1085 diamond 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]
5565 serge 5768
        stdcall map_page, eax, edi, PG_READ
5769
        push    PG_READ
1085 diamond 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:
1055 Galkov 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]
709 diamond 5787
@@:
1055 Galkov 5788
        in      ax, dx
5789
        test    al, 1
5790
        jz      @b
709 diamond 5791
.nosmi:
1085 diamond 5792
        and     cx, 0x0707
5793
        shl     cx, 2
5794
        or      cx, 0x2020
1055 Galkov 5795
        mov     edx, [ebx+64]
5796
        in      ax, dx
5797
        and     ax, 203h
1085 diamond 5798
        or      ah, cl
1055 Galkov 5799
        out     dx, ax
5800
        mov     edx, [ebx+68]
5801
        test    edx, edx
5802
        jz      @f
5803
        in      ax, dx
5804
        and     ax, 203h
1085 diamond 5805
        or      ah, ch
1055 Galkov 5806
        out     dx, ax
709 diamond 5807
@@:
1055 Galkov 5808
        jmp     $
709 diamond 5809
 
5810
 
5811
scan_rsdp:
1055 Galkov 5812
        add     eax, OS_BASE
709 diamond 5813
.s:
1055 Galkov 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
709 diamond 5820
@@:
1055 Galkov 5821
        add     dl, [eax+esi]
5822
        inc     esi
5823
        cmp     esi, 20
5824
        jnz     @b
5825
        test    dl, dl
5826
        jz      .ok
709 diamond 5827
.n:
1055 Galkov 5828
        add     eax, 10h
5829
        loop    .s
5830
        stc
709 diamond 5831
.ok:
1055 Galkov 5832
        ret
709 diamond 5833
 
5201 serge 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
 
3626 Serge 5861
if ~ lang eq sp
5862
diff16 "end of .text segment",0,$
5863
end if
5864
 
465 serge 5865
include "data32.inc"
1 ha 5866
 
465 serge 5867
__REV__ = __REV
1 ha 5868
 
3500 Serge 5869
if ~ lang eq sp
41 mikedld 5870
diff16 "end of kernel code",0,$
3500 Serge 5871
end if