Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1 ha 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;
1507 art_zh 3
;; Copyright (C) KolibriOS team 2004-2010. 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 ()
1507 art_zh 22
;; Artem Jerdev (art_zh)
1 ha 23
;;
431 serge 24
;; Data in this file was originally part of MenuetOS project which is
25
;; distributed under the terms of GNU GPL. It is modified and redistributed as
26
;; part of KolibriOS project under the terms of GNU GPL.
1 ha 27
;;
431 serge 28
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa
29
;; PROGRAMMING:
1 ha 30
;;
431 serge 31
;; Ville Mikael Turjanmaa, villemt@itu.jyu.fi
32
;; - main os coding/design
33
;; Jan-Michael Brummer, BUZZ2@gmx.de
34
;; Felix Kaiser, info@felix-kaiser.de
35
;; Paolo Minazzi, paolo.minazzi@inwind.it
36
;; quickcode@mail.ru
37
;; Alexey, kgaz@crosswinds.net
38
;; Juan M. Caravaca, bitrider@wanadoo.es
39
;; kristol@nic.fi
40
;; Mike Hibbett, mikeh@oceanfree.net
41
;; Lasse Kuusijarvi, kuusijar@lut.fi
42
;; Jarek Pelczar, jarekp3@wp.pl
1 ha 43
;;
431 serge 44
;; KolibriOS is distributed in the hope that it will be useful, but WITHOUT ANY
45
;; WARRANTY. No author or distributor accepts responsibility to anyone for the
46
;; consequences of using it or for whether it serves any particular purpose or
47
;; works at all, unless he says so in writing. Refer to the GNU General Public
48
;; License (the "GPL") for full details.
49
;
50
;; Everyone is granted permission to copy, modify and redistribute KolibriOS,
51
;; but only under the conditions described in the GPL. A copy of this license
52
;; is supposed to have been given to you along with KolibriOS so you can know
53
;; your rights and responsibilities. It should be in a file named COPYING.
54
;; Among other things, the copyright notice and this notice must be preserved
55
;; on all copies.
56
;;
1 ha 57
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
426 mikedld 58
 
59
include 'macros.inc'
60
 
425 victor 61
$Revision: 1664 $
426 mikedld 62
 
593 mikedld 63
 
1055 Galkov 64
USE_COM_IRQ     equ 1      ; make irq 3 and irq 4 available for PCI devices
566 serge 65
 
1043 hidnplayr 66
; Enabling the next line will enable serial output console
67
;debug_com_base  equ 0x3f8  ; 0x3f8 is com1, 0x2f8 is com2, 0x3e8 is com3, 0x2e8 is com4, no irq's are used
68
 
164 serge 69
include "proc32.inc"
7 me_root 70
include "kglobals.inc"
1 ha 71
include "lang.inc"
72
 
164 serge 73
include "const.inc"
1055 Galkov 74
max_processes    equ   255
75
tss_step         equ   (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4
1 ha 76
 
164 serge 77
 
1055 Galkov 78
os_stack       equ  (os_data_l-gdts)    ; GDTs
465 serge 79
os_code        equ  (os_code_l-gdts)
80
graph_data     equ  (3+graph_data_l-gdts)
1055 Galkov 81
tss0           equ  (tss0_l-gdts)
465 serge 82
app_code       equ  (3+app_code_l-gdts)
83
app_data       equ  (3+app_data_l-gdts)
1220 serge 84
app_tls        equ  (3+tls_data_l-gdts)
586 serge 85
pci_code_sel   equ  (pci_code_32-gdts)
86
pci_data_sel   equ  (pci_data_32-gdts)
1 ha 87
 
88
 
89
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
90
;;
91
;;   Included files:
92
;;
93
;;   Kernel16.inc
94
;;    - Booteng.inc   English text for bootup
95
;;    - Bootcode.inc  Hardware setup
96
;;    - Pci16.inc     PCI functions
97
;;
98
;;   Kernel32.inc
99
;;    - Sys32.inc     Process management
100
;;    - Shutdown.inc  Shutdown and restart
101
;;    - Fat32.inc     Read / write hd
102
;;    - Vesa12.inc    Vesa 1.2 driver
103
;;    - Vesa20.inc    Vesa 2.0 driver
104
;;    - Vga.inc       VGA driver
105
;;    - Stack.inc     Network interface
106
;;    - Mouse.inc     Mouse pointer
107
;;    - Scincode.inc  Window skinning
108
;;    - Pci32.inc     PCI functions
109
;;
110
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
111
 
112
 
113
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
114
;;                                                                      ;;
115
;;                  16 BIT ENTRY FROM BOOTSECTOR                        ;;
116
;;                                                                      ;;
117
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
118
 
119
use16
1055 Galkov 120
                  org   0x0
121
                  jmp   start_of_code
1 ha 122
 
1324 Lrz 123
version db    'Kolibri OS  version 0.7.7.0+     ',13,10,13,10,0
1 ha 124
 
465 serge 125
include "boot/bootstr.inc"     ; language-independent boot messages
1 ha 126
include "boot/preboot.inc"
127
 
465 serge 128
if lang eq en
129
include "boot/booteng.inc"     ; english system boot messages
1508 art_zh 130
else
465 serge 131
include "boot/bootru.inc"      ; russian system boot messages
1055 Galkov 132
include "boot/ru.inc"          ; Russian font
465 serge 133
end if
1 ha 134
 
465 serge 135
include "boot/bootcode.inc"    ; 16 bit system boot code
136
include "bus/pci/pci16.inc"
709 diamond 137
include "detect/biosdisk.inc"
1 ha 138
 
139
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
140
;;                                                                      ;;
141
;;                  SWITCH TO 32 BIT PROTECTED MODE                     ;;
142
;;                                                                      ;;
143
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
144
 
145
 
146
; CR0 Flags - Protected mode and Paging
147
 
1055 Galkov 148
        mov ecx, CR0_PE
1 ha 149
 
150
; Enabling 32 bit protected mode
151
 
1055 Galkov 152
        sidt    [cs:old_ints_h]
1 ha 153
 
1055 Galkov 154
        cli                             ; disable all irqs
155
        cld
156
        mov     al,255                  ; mask all irqs
157
        out     0xa1,al
158
        out     0x21,al
159
   l.5: in      al, 0x64                ; Enable A20
160
        test    al, 2
161
        jnz     l.5
162
        mov     al, 0xD1
163
        out     0x64, al
164
   l.6: in      al, 0x64
165
        test    al, 2
166
        jnz     l.6
167
        mov     al, 0xDF
168
        out     0x60, al
169
   l.7: in      al, 0x64
170
        test    al, 2
171
        jnz     l.7
172
        mov     al, 0xFF
173
        out     0x64, al
465 serge 174
 
1055 Galkov 175
        lgdt    [cs:tmp_gdt]            ; Load GDT
176
        mov     eax, cr0                ; protected mode
177
        or      eax, ecx
178
        and     eax, 10011111b *65536*256 + 0xffffff ; caching enabled
179
        mov     cr0, eax
180
        jmp     pword os_code:B32       ; jmp to enable 32 bit mode
1 ha 181
 
465 serge 182
align 8
183
tmp_gdt:
1 ha 184
 
1055 Galkov 185
        dw     23
186
        dd     tmp_gdt+0x10000
187
        dw     0
183 diamond 188
 
1055 Galkov 189
        dw     0xffff
190
        dw     0x0000
191
        db     0x00
192
        dw     11011111b *256 +10011010b
193
        db     0x00
375 Ghost 194
 
1055 Galkov 195
        dw     0xffff
196
        dw     0x0000
197
        db     0x00
198
        dw     11011111b *256 +10010010b
199
        db     0x00
1 ha 200
 
465 serge 201
include "data16.inc"
1 ha 202
 
465 serge 203
use32
204
org $+0x10000
1 ha 205
 
465 serge 206
align 4
207
B32:
1055 Galkov 208
           mov   ax,os_stack       ; Selector for os
209
           mov   ds,ax
210
           mov   es,ax
211
           mov   fs,ax
212
           mov   gs,ax
213
           mov   ss,ax
214
           mov   esp,0x3ec00       ; Set stack
1 ha 215
 
465 serge 216
; CLEAR 0x280000 - HEAP_BASE
1 ha 217
 
1055 Galkov 218
           xor   eax,eax
219
           mov   edi,0x280000
220
           mov   ecx,(HEAP_BASE-OS_BASE-0x280000) / 4
221
           cld
222
           rep   stosd
1 ha 223
 
1055 Galkov 224
           mov   edi,0x40000
225
           mov   ecx,(0x90000-0x40000)/4
226
           rep   stosd
1 ha 227
 
465 serge 228
; CLEAR KERNEL UNDEFINED GLOBALS
1055 Galkov 229
           mov   edi, endofcode-OS_BASE
230
           mov   ecx, (uglobals_size/4)+4
231
           rep   stosd
1 ha 232
 
465 serge 233
; SAVE & CLEAR 0-0xffff
1 ha 234
 
1267 Lrz 235
           xor   esi, esi
1055 Galkov 236
           mov   edi,0x2F0000
237
           mov   ecx,0x10000 / 4
238
           rep   movsd
1172 diamond 239
           mov   edi,0x1000
240
           mov   ecx,0xf000 / 4
1055 Galkov 241
           rep   stosd
429 serge 242
 
1055 Galkov 243
           call test_cpu
244
           bts [cpu_caps-OS_BASE], CAPS_TSC     ;force use rdtsc
424 spraid 245
 
1055 Galkov 246
           call init_BIOS32
465 serge 247
; MEMORY MODEL
1055 Galkov 248
           call init_mem
249
           call init_page_map
1 ha 250
 
465 serge 251
; ENABLE PAGING
1 ha 252
 
1055 Galkov 253
           mov eax, sys_pgdir-OS_BASE
254
           mov cr3, eax
1 ha 255
 
1055 Galkov 256
           mov eax,cr0
257
           or eax,CR0_PG+CR0_WP
258
           mov cr0,eax
1 ha 259
 
1055 Galkov 260
           lgdt [gdts]
261
           jmp pword os_code:high_code
1 ha 262
 
513 serge 263
align 4
1055 Galkov 264
bios32_entry    dd ?
265
tmp_page_tabs   dd ?
586 serge 266
 
498 diamond 267
use16
268
org $-0x10000
269
include "boot/shutdown.inc" ; shutdown or restart
270
org $+0x10000
271
use32
272
 
465 serge 273
__DEBUG__ fix 1
274
__DEBUG_LEVEL__ fix 1
275
include 'init.inc'
380 serge 276
 
465 serge 277
org OS_BASE+$
1 ha 278
 
465 serge 279
align 4
280
high_code:
1220 serge 281
           mov ax, os_stack
282
           mov bx, app_data
283
           mov cx, app_tls
284
           mov ss, ax
285
           add esp, OS_BASE
1 ha 286
 
1220 serge 287
           mov ds, bx
288
           mov es, bx
289
           mov fs, cx
290
           mov gs, bx
1 ha 291
 
1055 Galkov 292
           bt [cpu_caps], CAPS_PGE
293
           jnc @F
1 ha 294
 
1055 Galkov 295
           or dword [sys_pgdir+(OS_BASE shr 20)], PG_GLOBAL
519 serge 296
 
1055 Galkov 297
           mov ebx, cr4
298
           or ebx, CR4_PGE
299
           mov cr4, ebx
519 serge 300
@@:
1055 Galkov 301
           xor eax, eax
302
           mov dword [sys_pgdir], eax
303
           mov dword [sys_pgdir+4], eax
519 serge 304
 
1055 Galkov 305
           mov eax, cr3
306
           mov cr3, eax           ; flush TLB
465 serge 307
 
1 ha 308
; SAVE REAL MODE VARIABLES
1055 Galkov 309
        mov     ax, [BOOT_VAR + 0x9031]
310
        mov     [IDEContrRegsBaseAddr], ax
76 mario79 311
; --------------- APM ---------------------
465 serge 312
 
313
; init selectors
1276 Lrz 314
    mov ebx,[BOOT_VAR+0x9040]			; offset of APM entry point
315
    movzx eax,word [BOOT_VAR+0x9050] 	; real-mode segment base address of
1551 art_zh 316
						; protected-mode 32-bit code segment
1276 Lrz 317
    movzx ecx,word [BOOT_VAR+0x9052] 	; real-mode segment base address of
1551 art_zh 318
						; protected-mode 16-bit code segment
1276 Lrz 319
    movzx edx,word [BOOT_VAR+0x9054] 	; real-mode segment base address of
1551 art_zh 320
						; protected-mode 16-bit data segment
465 serge 321
 
322
    shl    eax, 4
323
    mov    [dword apm_code_32 + 2], ax
324
    shr    eax, 16
325
    mov    [dword apm_code_32 + 4], al
326
 
327
    shl    ecx, 4
328
    mov    [dword apm_code_16 + 2], cx
329
    shr    ecx, 16
330
    mov    [dword apm_code_16 + 4], cl
331
 
332
    shl    edx, 4
333
    mov    [dword apm_data_16 + 2], dx
334
    shr    edx, 16
335
    mov    [dword apm_data_16 + 4], dl
336
 
337
    mov    dword[apm_entry], ebx
76 mario79 338
    mov    word [apm_entry + 4], apm_code_32 - gdts
339
 
465 serge 340
    mov    eax, [BOOT_VAR + 0x9044]    ; version & flags
76 mario79 341
    mov    [apm_vf], eax
342
; -----------------------------------------
1276 Lrz 343
;        movzx eax,byte [BOOT_VAR+0x9010]	; mouse port
1 ha 344
;        mov   [0xF604],byte 1  ;al
1276 Lrz 345
		mov	al, [BOOT_VAR+0x901F]   	; DMA access
346
        mov	[allow_dma_access], al
1300 serge 347
        movzx eax, byte [BOOT_VAR+0x9000]        ; bpp
1276 Lrz 348
        mov [ScreenBPP],al
753 serge 349
 
1300 serge 350
        mov [_display.bpp], eax
351
        mov [_display.vrefresh], 60
352
        mov [_display.disable_mouse],  __sys_disable_mouse
353
 
1055 Galkov 354
        movzx eax,word [BOOT_VAR+0x900A]  ; X max
1300 serge 355
        mov [_display.width], eax
1055 Galkov 356
        dec   eax
357
        mov   [Screen_Max_X],eax
358
        mov   [screen_workarea.right],eax
359
        movzx eax,word [BOOT_VAR+0x900C]  ; Y max
1300 serge 360
        mov [_display.height], eax
1055 Galkov 361
        dec   eax
362
        mov   [Screen_Max_Y],eax
363
        mov   [screen_workarea.bottom],eax
364
        movzx eax,word [BOOT_VAR+0x9008]  ; screen mode
365
        mov   [SCR_MODE],eax
366
        mov   eax,[BOOT_VAR+0x9014]       ; Vesa 1.2 bnk sw add
367
        mov   [BANK_SWITCH],eax
368
        mov   [BytesPerScanLine],word 640*4         ; Bytes PerScanLine
369
        cmp   [SCR_MODE],word 0x13          ; 320x200
370
        je    @f
371
        cmp   [SCR_MODE],word 0x12          ; VGA 640x480
372
        je    @f
1300 serge 373
        movzx eax, word[BOOT_VAR+0x9001]        ; for other modes
1055 Galkov 374
        mov   [BytesPerScanLine],ax
1300 serge 375
        mov [_display.pitch], eax
465 serge 376
@@:
1300 serge 377
        mov eax, [_display.width]
378
        mul [_display.height]
379
        mov [_WinMapSize], eax
380
 
1055 Galkov 381
        mov     esi, BOOT_VAR+0x9080
382
        movzx   ecx, byte [esi-1]
383
        mov     [NumBiosDisks], ecx
384
        mov     edi, BiosDisksData
385
        rep     movsd
1 ha 386
 
387
; GRAPHICS ADDRESSES
388
 
1276 Lrz 389
        and     byte [BOOT_VAR+0x901e],0x0
1055 Galkov 390
        mov     eax,[BOOT_VAR+0x9018]
391
        mov     [LFBAddress],eax
1 ha 392
 
1551 art_zh 393
;==
394
	cmp     [SCR_MODE],word 0100000000000000b
395
        jge     setvesa20
396
	mov	eax, 0xDEADBEEF
397
	hlt
398
;        ===  EGA, VGA & Vesa 1.2 modes not supported ===
1 ha 399
      setvesa20:
1551 art_zh 400
;        mov     [PUTPIXEL],dword Vesa20_putpixel24  ; Vesa 2.0 24bpp modes
1508 art_zh 401
;        mov     [GETPIXEL],dword Vesa20_getpixel24
402
;        cmp     [ScreenBPP],byte 24
403
;        jz      v20ga24
1 ha 404
      v20ga32:
1055 Galkov 405
        mov     [PUTPIXEL],dword Vesa20_putpixel32
406
        mov     [GETPIXEL],dword Vesa20_getpixel32
1 ha 407
 
375 Ghost 408
; -------- Fast System Call init ----------
378 serge 409
; Intel SYSENTER/SYSEXIT (AMD CPU support it too)
1551 art_zh 410
;           bt [cpu_caps], CAPS_SEP
411
;           jnc .SEnP   ; SysEnter not Present
412
;           xor edx, edx
413
;           mov ecx, MSR_SYSENTER_CS
414
;           mov eax, os_code
415
;           wrmsr
416
;           mov ecx, MSR_SYSENTER_ESP
417
;;           mov eax, sysenter_stack ; Check it
418
;           xor     eax, eax
419
;           wrmsr
420
;           mov ecx, MSR_SYSENTER_EIP
421
;           mov eax, sysenter_entry
422
;           wrmsr
375 Ghost 423
.SEnP:
378 serge 424
; AMD SYSCALL/SYSRET
1551 art_zh 425
;           cmp byte[cpu_vendor], 'A'
426
;          jne .noSYSCALL
427
;           mov eax, 0x80000001
428
;           cpuid
429
;           test edx, 0x800  ; bit_11 - SYSCALL/SYSRET support
430
;           jz .noSYSCALL
1055 Galkov 431
           mov ecx, MSR_AMD_EFER
432
           rdmsr
433
           or eax, 1   ; bit_0 - System Call Extension (SCE)
434
           wrmsr
164 serge 435
 
1055 Galkov 436
        ; Bits of EDX :
437
        ; Bit 31–16 During the SYSRET instruction, this field is copied into the CS register
438
        ;  and the contents of this field, plus 8, are copied into the SS register.
439
        ; Bit 15–0 During the SYSCALL instruction, this field is copied into the CS register
440
        ;  and the contents of this field, plus 8, are copied into the SS register.
375 Ghost 441
 
1551 art_zh 442
           mov edx, 0x1B000B	; RING3 task stack will be used for fast syscalls!
375 Ghost 443
 
1055 Galkov 444
           mov eax, syscall_entry
445
           mov ecx, MSR_AMD_STAR
446
           wrmsr
375 Ghost 447
.noSYSCALL:
448
; -----------------------------------------
1310 diamond 449
        stdcall alloc_page
1551 art_zh 450
        stdcall map_page, tss-0xF80, eax, PG_SW		; lower 0xF80 bytes might be used for something
1310 diamond 451
        stdcall alloc_page
452
        inc     eax
453
        mov     [SLOT_BASE+256+APPDATA.io_map], eax
454
        stdcall map_page, tss+0x80, eax, PG_SW
455
        stdcall alloc_page
456
        inc     eax
457
        mov     dword [SLOT_BASE+256+APPDATA.io_map+4], eax
458
        stdcall map_page, tss+0x1080, eax, PG_SW
375 Ghost 459
 
465 serge 460
; LOAD IDT
378 serge 461
 
1056 Galkov 462
           call build_interrupt_table ;lidt is executed
463
          ;lidt [idtreg]
378 serge 464
 
1055 Galkov 465
           call init_kernel_heap
466
           stdcall kernel_alloc, RING0_STACK_SIZE+512
467
           mov [os_stack_seg], eax
164 serge 468
 
1055 Galkov 469
           lea esp, [eax+RING0_STACK_SIZE]
164 serge 470
 
1055 Galkov 471
           mov [tss._ss0], os_stack
472
           mov [tss._esp0], esp
473
           mov [tss._esp], esp
474
           mov [tss._cs],os_code
475
           mov [tss._ss],os_stack
476
           mov [tss._ds],app_data
477
           mov [tss._es],app_data
478
           mov [tss._fs],app_data
479
           mov [tss._gs],app_data
480
           mov [tss._io],128
465 serge 481
;Add IO access table - bit array of permitted ports
1055 Galkov 482
           mov edi, tss._io_map_0
483
           xor eax, eax
1551 art_zh 484
	   mov ecx, 2047
485
	   rep stosd		     ; access to 65504 ports granted
486
	   not eax		     ; the last 32 ports blocked
487
	   stosd
164 serge 488
 
1055 Galkov 489
           mov  ax,tss0
490
           ltr  ax
378 serge 491
 
1055 Galkov 492
           mov [LFBSize], 0x800000
493
           call init_LFB
494
           call init_fpu
495
           call init_malloc
276 serge 496
 
1055 Galkov 497
           stdcall alloc_kernel_space, 0x51000
498
           mov [default_io_map], eax
465 serge 499
 
1055 Galkov 500
           add eax, 0x2000
501
           mov [ipc_tmp], eax
502
           mov ebx, 0x1000
164 serge 503
 
1055 Galkov 504
           add eax, 0x40000
505
           mov [proc_mem_map], eax
164 serge 506
 
1055 Galkov 507
           add eax, 0x8000
508
           mov [proc_mem_pdir], eax
164 serge 509
 
1055 Galkov 510
           add eax, ebx
511
           mov [proc_mem_tab], eax
164 serge 512
 
1055 Galkov 513
           add eax, ebx
514
           mov [tmp_task_pdir], eax
164 serge 515
 
1055 Galkov 516
           add eax, ebx
517
           mov [tmp_task_ptab], eax
164 serge 518
 
1055 Galkov 519
           add eax, ebx
520
           mov [ipc_pdir], eax
164 serge 521
 
1055 Galkov 522
           add eax, ebx
523
           mov [ipc_ptab], eax
164 serge 524
 
1055 Galkov 525
           stdcall kernel_alloc, (unpack.LZMA_BASE_SIZE+(unpack.LZMA_LIT_SIZE shl \
526
                                 (unpack.lc+unpack.lp)))*4
712 serge 527
 
1055 Galkov 528
           mov [unpack.p], eax
709 diamond 529
 
1055 Galkov 530
           call init_events
531
           mov eax, srv.fd-SRV_FD_OFFSET
532
           mov [srv.fd], eax
533
           mov [srv.bk], eax
278 serge 534
 
1055 Galkov 535
           mov edi, irq_tab
536
           xor eax, eax
537
           mov ecx, 16
538
           rep stosd
164 serge 539
 
41 mikedld 540
;Set base of graphic segment to linear address of LFB
1055 Galkov 541
        mov     eax,[LFBAddress]          ; set for gs
542
        mov     [graph_data_l+2],ax
543
        shr     eax,16
544
        mov     [graph_data_l+4],al
545
        mov     [graph_data_l+7],ah
1 ha 546
 
1300 serge 547
        stdcall kernel_alloc, [_WinMapSize]
548
        mov [_WinMapAddress], eax
549
 
1267 Lrz 550
        xor  eax,eax
551
        inc  eax
552
        mov [CURRENT_TASK],eax		;dword 1
553
        mov [TASK_COUNT],eax		;dword 1
1055 Galkov 554
        mov [TASK_BASE],dword TASK_DATA
555
        mov [current_slot], SLOT_BASE+256
429 serge 556
 
469 serge 557
; set background
1300 serge 558
 
1055 Galkov 559
        mov   [BgrDrawMode],eax
560
        mov   [BgrDataWidth],eax
561
        mov   [BgrDataHeight],eax
1107 diamond 562
        mov    [mem_BACKGROUND], 4
563
        mov [img_background], static_background_data
469 serge 564
 
1055 Galkov 565
        mov     [SLOT_BASE + 256 + APPDATA.dir_table], sys_pgdir - OS_BASE
469 serge 566
 
1154 clevermous 567
        stdcall kernel_alloc, 0x10000/8
568
        mov     edi, eax
569
        mov     [network_free_ports], eax
570
        or      eax, -1
571
        mov     ecx, 0x10000/32
572
        rep     stosd
573
 
709 diamond 574
; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f
575
 
1055 Galkov 576
        call  rerouteirqs
709 diamond 577
 
578
; Initialize system V86 machine
1055 Galkov 579
        call    init_sys_v86
709 diamond 580
 
725 diamond 581
; TIMER SET TO 1/100 S
582
 
1055 Galkov 583
        mov   al,0x34              ; set to 100Hz
584
        out   0x43,al
585
        mov   al,0x9b              ; lsb    1193180 / 1193
586
        out   0x40,al
587
        mov   al,0x2e              ; msb
588
        out   0x40,al
725 diamond 589
 
590
; Enable timer IRQ (IRQ0) and hard drives IRQs (IRQ14, IRQ15)
591
; they are used: when partitions are scanned, hd_read relies on timer
1025 diamond 592
; Also enable IRQ2, because in some configurations
593
; IRQs from slave controller are not delivered until IRQ2 on master is enabled
1055 Galkov 594
        mov     al, 0xFA
595
        out     0x21, al
596
        mov     al, 0x3F
597
        out     0xA1, al
725 diamond 598
 
256 diamond 599
;!!!!!!!!!!!!!!!!!!!!!!!!!!
600
include 'detect/disks.inc'
601
;!!!!!!!!!!!!!!!!!!!!!!!!!!
602
 
521 diamond 603
  call Parser_params
604
 
1 ha 605
; READ RAMDISK IMAGE FROM HD
606
 
607
;!!!!!!!!!!!!!!!!!!!!!!!
608
include 'boot/rdload.inc'
609
;!!!!!!!!!!!!!!!!!!!!!!!
610
;    mov    [dma_hdd],1
611
; CALCULATE FAT CHAIN FOR RAMDISK
612
 
1055 Galkov 613
        call  calculatefatchain
1 ha 614
 
615
; LOAD VMODE DRIVER
616
 
617
;!!!!!!!!!!!!!!!!!!!!!!!
618
include 'vmodeld.inc'
619
;!!!!!!!!!!!!!!!!!!!!!!!
620
 
1289 diamond 621
if 0
509 diamond 622
  mov ax,[OS_BASE+0x10000+bx_from_load]
1055 Galkov 623
  cmp ax,'r1'           ; if using not ram disk, then load librares and parameters {SPraid.simba}
488 spraid 624
  je  no_lib_load
625
; LOADING LIBRARES
1055 Galkov 626
   stdcall dll.Load,@IMPORT                 ; loading librares for kernel (.obj files)
627
   call load_file_parse_table               ; prepare file parse table
628
   call set_kernel_conf                     ; configure devices and gui
488 spraid 629
no_lib_load:
1289 diamond 630
end if
488 spraid 631
 
1 ha 632
; LOAD FONTS I and II
633
 
1055 Galkov 634
        stdcall read_file, char, FONT_I, 0, 2304
635
        stdcall read_file, char2, FONT_II, 0, 2560
490 serge 636
 
1055 Galkov 637
        mov   esi,boot_fonts
638
        call  boot_log
1 ha 639
 
640
; PRINT AMOUNT OF MEMORY
1055 Galkov 641
        mov     esi, boot_memdetect
642
        call    boot_log
1 ha 643
 
1055 Galkov 644
        movzx   ecx, word [boot_y]
645
        or      ecx, (10+29*6) shl 16 ; "Determining amount of memory"
646
        sub     ecx, 10
647
        mov     edx, 0xFFFFFF
648
        mov     ebx, [MEM_AMOUNT]
649
        shr     ebx, 20
1276 Lrz 650
        xor     edi,edi
1055 Galkov 651
        mov     eax, 0x00040000
1276 Lrz 652
		inc		edi
1055 Galkov 653
        call    display_number_force
41 mikedld 654
 
465 serge 655
; BUILD SCHEDULER
656
 
1055 Galkov 657
        call   build_scheduler ; sys32.inc
465 serge 658
 
1055 Galkov 659
        mov    esi,boot_devices
660
        call   boot_log
567 serge 661
 
1055 Galkov 662
        mov  [pci_access_enabled],1
567 serge 663
 
1 ha 664
 
665
; SET PRELIMINARY WINDOW STACK AND POSITIONS
666
 
1055 Galkov 667
        mov   esi,boot_windefs
668
        call  boot_log
1362 mikedld 669
        call  set_window_defaults
1 ha 670
 
671
; SET BACKGROUND DEFAULTS
672
 
1055 Galkov 673
        mov   esi,boot_bgr
674
        call  boot_log
675
        call  init_background
676
        call  calculatebackground
1 ha 677
 
678
; RESERVE SYSTEM IRQ'S JA PORT'S
679
 
1560 art_zh 680
;        mov   esi,boot_resirqports
681
;        call  boot_log
682
;        call  reserve_irqs_ports
1 ha 683
 
684
 
685
; SET UP OS TASK
686
 
1055 Galkov 687
        mov  esi,boot_setostask
688
        call boot_log
214 serge 689
 
1055 Galkov 690
        xor  eax, eax
691
        mov  dword [SLOT_BASE+APPDATA.fpu_state], fpu_data
1074 Galkov 692
        mov  dword [SLOT_BASE+APPDATA.exc_handler], eax
693
        mov  dword [SLOT_BASE+APPDATA.except_mask], eax
164 serge 694
 
1055 Galkov 695
        ; name for OS/IDLE process
281 serge 696
 
1055 Galkov 697
        mov dword [SLOT_BASE+256+APPDATA.app_name],   dword 'OS/I'
698
        mov dword [SLOT_BASE+256+APPDATA.app_name+4], dword 'DLE '
699
        mov edi, [os_stack_seg]
700
        mov dword [SLOT_BASE+256+APPDATA.pl0_stack], edi
701
        add edi, 0x2000-512
702
        mov dword [SLOT_BASE+256+APPDATA.fpu_state], edi
703
        mov dword [SLOT_BASE+256+APPDATA.saved_esp0], edi ; just for case
1310 diamond 704
	; [SLOT_BASE+256+APPDATA.io_map] was set earlier
357 serge 705
 
1055 Galkov 706
        mov esi, fpu_data
707
        mov ecx, 512/4
708
        cld
709
        rep movsd
357 serge 710
 
1074 Galkov 711
        mov dword [SLOT_BASE+256+APPDATA.exc_handler], eax
712
        mov dword [SLOT_BASE+256+APPDATA.except_mask], eax
214 serge 713
 
1055 Galkov 714
        mov ebx, SLOT_BASE+256+APP_OBJ_OFFSET
715
        mov  dword [SLOT_BASE+256+APPDATA.fd_obj], ebx
716
        mov  dword [SLOT_BASE+256+APPDATA.bk_obj], ebx
281 serge 717
 
1055 Galkov 718
        mov  dword [SLOT_BASE+256+APPDATA.cur_dir], sysdir_path
1220 serge 719
        mov dword [SLOT_BASE+256+APPDATA.tls_base], eax
521 diamond 720
 
1055 Galkov 721
        ; task list
1276 Lrz 722
        mov  dword [TASK_DATA+TASKDATA.mem_start],eax	; process base address
723
	inc  eax
724
        mov  dword [CURRENT_TASK],eax
725
        mov  dword [TASK_COUNT],eax
1055 Galkov 726
        mov  [current_slot], SLOT_BASE+256
727
        mov  [TASK_BASE],dword TASK_DATA
1276 Lrz 728
        mov  byte[TASK_DATA+TASKDATA.wnd_number],al	; on screen number
729
        mov  dword [TASK_DATA+TASKDATA.pid], eax        ; process id number
1 ha 730
 
1316 serge 731
        call init_display
1055 Galkov 732
        mov eax, [def_cursor]
733
        mov [SLOT_BASE+APPDATA.cursor],eax
734
        mov [SLOT_BASE+APPDATA.cursor+256],eax
281 serge 735
 
465 serge 736
  ; READ TSC / SECOND
281 serge 737
 
1055 Galkov 738
        mov   esi,boot_tsc
739
        call  boot_log
740
        cli
741
        rdtsc ;call  _rdtsc
742
        mov   ecx,eax
743
        mov   esi,250               ; wait 1/4 a second
744
        call  delay_ms
745
        rdtsc ;call  _rdtsc
746
        sti
747
        sub   eax,ecx
748
        shl   eax,2
749
        mov   [CPU_FREQ],eax          ; save tsc / sec
1043 hidnplayr 750
;       mov ebx, 1000000
751
;       div ebx
1038 diamond 752
; ¢®®¡é¥-â® ¯à®¨§¢®¤¨â¥«ì­®áâì ¢ ¤ ­­®¬ ª®­ªà¥â­®¬ ¬¥áâ¥
753
; ᮢ¥à襭­® ­¥ªà¨â¨ç­ , ­® çâ®¡ë § âª­ãâì «î¡¨â¥«¥©
754
; ®¯â¨¬¨§¨àãîé¨å ª®¬¯¨«ïâ®à®¢ Ÿ‚“...
1055 Galkov 755
        mov     edx, 2251799814
756
        mul     edx
757
        shr     edx, 19
758
        mov [stall_mcs], edx
1038 diamond 759
; PRINT CPU FREQUENCY
1055 Galkov 760
        mov     esi, boot_cpufreq
761
        call    boot_log
1 ha 762
 
1055 Galkov 763
        mov     ebx, edx
764
        movzx   ecx, word [boot_y]
765
        add     ecx, (10+17*6) shl 16 - 10 ; 'CPU frequency is '
766
        mov     edx, 0xFFFFFF
1276 Lrz 767
        xor     edi,edi
1055 Galkov 768
        mov     eax, 0x00040000
1276 Lrz 769
		inc		edi
1055 Galkov 770
        call    display_number_force
1038 diamond 771
 
1 ha 772
; SET VARIABLES
773
 
1055 Galkov 774
        call  set_variables
1 ha 775
 
774 Rus 776
; SET MOUSE
777
 
1055 Galkov 778
        ;call   detect_devices
779
        stdcall load_driver, szPS2MDriver
1106 diamond 780
;        stdcall load_driver, szCOM_MDriver
774 Rus 781
 
1055 Galkov 782
        mov   esi,boot_setmouse
783
        call  boot_log
784
        call  setmouse
774 Rus 785
 
786
 
1 ha 787
; STACK AND FDC
788
 
1055 Galkov 789
        call  stack_init
790
        call  fdc_init
1 ha 791
 
792
; PALETTE FOR 320x200 and 640x480 16 col
793
 
1508 art_zh 794
;        cmp   [SCR_MODE],word 0x12
795
;        jne   no_pal_vga
796
;        mov   esi,boot_pal_vga
797
;        call  boot_log
798
;        call  paletteVGA
799
;      no_pal_vga:
1 ha 800
 
1508 art_zh 801
;        cmp   [SCR_MODE],word 0x13
802
;        jne   no_pal_ega
803
;        mov   esi,boot_pal_ega
804
;        call  boot_log
805
;        call  palette320x200
806
;      no_pal_ega:
1 ha 807
 
808
; LOAD DEFAULT SKIN
809
 
1055 Galkov 810
        call    load_default_skin
1 ha 811
 
465 serge 812
;protect io permission map
813
 
1055 Galkov 814
           mov esi, [default_io_map]
1310 diamond 815
           stdcall map_page,esi,[SLOT_BASE+256+APPDATA.io_map], PG_MAP
1055 Galkov 816
           add esi, 0x1000
1310 diamond 817
           stdcall map_page,esi,[SLOT_BASE+256+APPDATA.io_map+4], PG_MAP
465 serge 818
 
1055 Galkov 819
           stdcall map_page,tss._io_map_0,\
1310 diamond 820
                   [SLOT_BASE+256+APPDATA.io_map], PG_MAP
1055 Galkov 821
           stdcall map_page,tss._io_map_1,\
1310 diamond 822
                   [SLOT_BASE+256+APPDATA.io_map+4], PG_MAP
465 serge 823
 
512 spraid 824
  mov ax,[OS_BASE+0x10000+bx_from_load]
1055 Galkov 825
  cmp ax,'r1'           ; if not rused ram disk - load network configuration from files {SPraid.simba}
512 spraid 826
  je  no_st_network
1055 Galkov 827
        call set_network_conf
512 spraid 828
  no_st_network:
829
 
1551 art_zh 830
        call init_userDMA	; <<<<<<<<< ============== core/memory.inc =================
1560 art_zh 831
        mov     esi, boot_uDMA_ok
832
        call    boot_log
1551 art_zh 833
;	call pci_ext_config	; <<<<<<<<< bus/pci/pcie.inc
834
;-------------------------------------------------------------------------------
835
        call rs7xx_pcie_init    ; <<<<<<<<< bus/ht.inc
1507 art_zh 836
 
1 ha 837
; LOAD FIRST APPLICATION
1055 Galkov 838
        cli
501 serge 839
 
1055 Galkov 840
        cmp   byte [BOOT_VAR+0x9030],1
841
        jne   no_load_vrr_m
237 serge 842
 
1055 Galkov 843
        mov     ebp, vrr_m
844
        call    fs_execute_from_sysdir
488 spraid 845
 
1260 Lrz 846
;        cmp   eax,2                  ; if vrr_m app found (PID=2)
847
	sub   eax,2
848
        jz    first_app_found
41 mikedld 849
 
237 serge 850
no_load_vrr_m:
488 spraid 851
 
1055 Galkov 852
        mov     ebp, firstapp
853
        call    fs_execute_from_sysdir
488 spraid 854
 
1260 Lrz 855
;        cmp   eax,2                  ; continue if a process has been loaded
856
	sub   eax,2
857
        jz    first_app_found
501 serge 858
 
1055 Galkov 859
        mov     esi, boot_failed
860
        call    boot_log
653 diamond 861
 
1055 Galkov 862
        mov   eax, 0xDEADBEEF        ; otherwise halt
863
        hlt
501 serge 864
 
237 serge 865
first_app_found:
501 serge 866
 
1055 Galkov 867
        cli
1 ha 868
 
1055 Galkov 869
        ;mov   [TASK_COUNT],dword 2
1276 Lrz 870
	push  1
871
        pop   dword [CURRENT_TASK]      ; set OS task fisrt
1 ha 872
 
21 poddubny 873
; SET KEYBOARD PARAMETERS
1055 Galkov 874
        mov   al, 0xf6         ; reset keyboard, scan enabled
875
        call  kb_write
1 ha 876
 
1055 Galkov 877
        ; wait until 8042 is ready
878
        xor ecx,ecx
265 diamond 879
      @@:
1055 Galkov 880
        in     al,64h
881
        and    al,00000010b
882
        loopnz @b
1 ha 883
 
884
       ; mov   al, 0xED       ; svetodiody - only for testing!
885
       ; call  kb_write
886
       ; call  kb_read
887
       ; mov   al, 111b
888
       ; call  kb_write
889
       ; call  kb_read
41 mikedld 890
 
1055 Galkov 891
        mov   al, 0xF3       ; set repeat rate & delay
892
        call  kb_write
265 diamond 893
;        call  kb_read
1055 Galkov 894
        mov   al, 0 ; 30 250 ;00100010b ; 24 500  ;00100100b  ; 20 500
895
        call  kb_write
265 diamond 896
;        call  kb_read
1 ha 897
     ;// mike.dld [
1055 Galkov 898
        call  set_lights
1 ha 899
     ;// mike.dld ]
900
 
1043 hidnplayr 901
 
902
; Setup serial output console (if enabled)
903
 
904
if defined debug_com_base
905
 
1055 Galkov 906
        ; enable Divisor latch
1043 hidnplayr 907
 
1055 Galkov 908
        mov     dx, debug_com_base+3
909
        mov     al, 1 shl 7
910
        out     dx, al
1043 hidnplayr 911
 
1055 Galkov 912
        ; Set speed to 115200 baud (max speed)
1043 hidnplayr 913
 
1055 Galkov 914
        mov     dx, debug_com_base
915
        mov     al, 0x01
916
        out     dx, al
1043 hidnplayr 917
 
1055 Galkov 918
        mov     dx, debug_com_base+1
919
        mov     al, 0x00
920
        out     dx, al
1043 hidnplayr 921
 
1055 Galkov 922
        ; No parity, 8bits words, one stop bit, dlab bit back to 0
1043 hidnplayr 923
 
1055 Galkov 924
        mov     dx, debug_com_base+3
925
        mov     al, 3
926
        out     dx, al
1043 hidnplayr 927
 
1055 Galkov 928
        ; disable interrupts
1043 hidnplayr 929
 
1055 Galkov 930
        mov     dx, debug_com_base+1
931
        mov     al, 0
932
        out     dx, al
1043 hidnplayr 933
 
1055 Galkov 934
        ; clear +  enable fifo (64 bits)
1043 hidnplayr 935
 
1055 Galkov 936
        mov     dx, debug_com_base+2
937
        mov     al, 0x7 + 1 shl 5
938
        out     dx, al
1043 hidnplayr 939
 
940
 
941
end if
942
 
21 poddubny 943
; START MULTITASKING
1 ha 944
 
767 diamond 945
if preboot_blogesc
1055 Galkov 946
        mov     esi, boot_tasking
947
        call    boot_log
948
.bll1:  in      al, 0x60        ; wait for ESC key press
949
        cmp     al, 129
950
        jne     .bll1
767 diamond 951
end if
952
 
465 serge 953
;       mov   [ENABLE_TASKSWITCH],byte 1        ; multitasking enabled
21 poddubny 954
 
1 ha 955
; UNMASK ALL IRQ'S
956
 
1380 diamond 957
;        mov   esi,boot_allirqs
958
;        call  boot_log
959
;
960
;        cli                          ;guarantee forbidance of interrupts.
961
;        mov   al,0                   ; unmask all irq's
962
;        out   0xA1,al
963
;        out   0x21,al
964
;
965
;        mov   ecx,32
966
;
967
;     ready_for_irqs:
968
;
969
;        mov   al,0x20                ; ready for irqs
970
;        out   0x20,al
971
;        out   0xa0,al
972
;
973
;        loop  ready_for_irqs         ; flush the queue
41 mikedld 974
 
1380 diamond 975
        stdcall attach_int_handler, 1, irq1, 0
1 ha 976
 
977
;        mov    [dma_hdd],1
1055 Galkov 978
        cmp     [IDEContrRegsBaseAddr], 0
979
        setnz   [dma_hdd]
980
        mov [timer_ticks_enable],1              ; for cd driver
1 ha 981
 
1055 Galkov 982
        sti
983
        call change_task
465 serge 984
 
1055 Galkov 985
        jmp osloop
465 serge 986
 
725 diamond 987
;        jmp   $                      ; wait here for timer to take control
1 ha 988
 
1055 Galkov 989
        ; Fly :)
1 ha 990
 
465 serge 991
include 'unpacker.inc'
992
include 'fdo.inc'
993
 
994
align 4
995
boot_log:
1055 Galkov 996
         pushad
465 serge 997
 
1276 Lrz 998
        mov   ebx,10*65536
999
        mov   bx,word [boot_y]
1000
        add   [boot_y],dword 10
1001
        mov   ecx,0x80ffffff   ; ASCIIZ string with white color
1002
		xor	  edi,edi
1003
        mov   edx,esi
1004
		inc	  edi
1005
        call  dtext
465 serge 1006
 
1508 art_zh 1007
;        mov   [novesachecksum],1000
1008
;        call  checkVga_N13
465 serge 1009
 
1276 Lrz 1010
        popad
465 serge 1011
 
1276 Lrz 1012
        ret
465 serge 1013
 
1 ha 1014
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1015
;                                                                    ;
33 mario79 1016
;                    MAIN OS LOOP START                              ;
1 ha 1017
;                                                                    ;
1018
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1019
align 32
1020
osloop:
1055 Galkov 1021
        call   [draw_pointer]
1507 art_zh 1022
        call    window_check_events
1023
        call    mouse_check_events
1055 Galkov 1024
        call   checkmisc
1508 art_zh 1025
;        call   checkVga_N13
1055 Galkov 1026
        call   stack_handler
1027
        call   checkidle
1028
        call   check_fdd_motor_status
1664 art_zh 1029
;        call   check_ATAPI_device_event
1055 Galkov 1030
        jmp    osloop
33 mario79 1031
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1032
;                                                                    ;
1033
;                      MAIN OS LOOP END                              ;
1034
;                                                                    ;
1035
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1168 Lrz 1036
align 4
1 ha 1037
checkidle:
1055 Galkov 1038
        pushad
1067 Galkov 1039
        call    change_task
1040
        jmp     idle_loop_entry
1041
  idle_loop:
1042
        cmp     eax,[idlemem]     ; eax == [timer_ticks]
1043
        jne     idle_exit
1044
        rdtsc   ;call _rdtsc
1045
        mov     ecx,eax
1055 Galkov 1046
        hlt
1067 Galkov 1047
        rdtsc   ;call _rdtsc
1048
        sub     eax,ecx
1049
        add     [idleuse],eax
1050
  idle_loop_entry:
1051
        mov     eax,[timer_ticks] ; eax =  [timer_ticks]
1052
        cmp     [check_idle_semaphore],0
1053
        je      idle_loop
1054
        dec     [check_idle_semaphore]
1055
  idle_exit:
1056
        mov     [idlemem],eax     ; eax == [timer_ticks]
1055 Galkov 1057
        popad
1058
        ret
1 ha 1059
 
1060
uglobal
1067 Galkov 1061
  idlemem               dd   0x0
1055 Galkov 1062
  idleuse               dd   0x0
1063
  idleusesec            dd   0x0
1064
  check_idle_semaphore  dd   0x0
1 ha 1065
endg
1066
 
1067
 
1068
 
1069
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1070
;                                                                      ;
1071
;                   INCLUDED SYSTEM FILES                              ;
1072
;                                                                      ;
1073
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1074
 
1075
 
7 me_root 1076
include "kernel32.inc"
1 ha 1077
 
1078
 
1079
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1080
;                                                                      ;
1081
;                       KERNEL FUNCTIONS                               ;
1082
;                                                                      ;
1083
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1084
 
1085
reserve_irqs_ports:
1551 art_zh 1086
	; removed
1055 Galkov 1087
        ret
1 ha 1088
 
1089
setirqreadports:
1551 art_zh 1090
	; removed
1091
	ret
1 ha 1092
 
1093
iglobal
1094
  process_number dd 0x1
1095
endg
1096
 
1097
set_variables:
1098
 
1055 Galkov 1099
        mov   ecx,0x100                       ; flush port 0x60
1100
.fl60:  in    al,0x60
1101
        loop  .fl60
1267 Lrz 1102
        push  eax
1 ha 1103
 
1055 Galkov 1104
        mov   ax,[BOOT_VAR+0x900c]
1105
        shr   ax,1
1106
        shl   eax,16
1107
        mov   ax,[BOOT_VAR+0x900A]
1108
        shr   ax,1
1109
        mov   [MOUSE_X],eax
41 mikedld 1110
 
1267 Lrz 1111
        xor   eax,eax
1055 Galkov 1112
        mov   [BTN_ADDR],dword BUTTON_INFO    ; address of button list
1 ha 1113
 
1267 Lrz 1114
        mov   byte [MOUSE_BUFF_COUNT],al                 ; mouse buffer
1115
        mov   byte [KEY_COUNT],al                 ; keyboard buffer
1116
        mov   byte [BTN_COUNT],al                 ; button buffer
1117
;        mov   [MOUSE_X],dword 100*65536+100    ; mouse x/y
1118
 
1 ha 1119
     ;!! IP 04.02.2005:
1267 Lrz 1120
        mov   byte [DONT_SWITCH],al ; change task if possible
1121
        pop   eax
1055 Galkov 1122
        ret
1 ha 1123
 
1124
align 4
1304 Lrz 1125
;input  eax=43,bl-byte of output, ecx - number of port
1 ha 1126
sys_outport:
1551 art_zh 1127
     and   [esp+32],dword 1	; for backward compatibility: operation failed
1 ha 1128
    ret
1129
 
1130
display_number:
1369 Lrz 1131
;It is not optimization
1132
        mov     eax, ebx
1133
        mov     ebx, ecx
1134
        mov     ecx, edx
1135
        mov     edx, esi
1136
        mov     esi, edi
1 ha 1137
; eax = print type, al=0 -> ebx is number
1138
;                   al=1 -> ebx is pointer
1139
;                   ah=0 -> display decimal
1140
;                   ah=1 -> display hexadecimal
1141
;                   ah=2 -> display binary
1142
;                   eax bits 16-21 = number of digits to display (0-32)
1143
;                   eax bits 22-31 = reserved
1144
;
1145
; ebx = number or pointer
1146
; ecx = x shl 16 + y
1147
; edx = color
1276 Lrz 1148
    xor     edi, edi
211 serge 1149
display_number_force:
1276 Lrz 1150
    push  eax
1151
    and   eax,0x3fffffff
1152
    cmp   eax,0xffff            ; length > 0 ?
1153
    pop   eax
1154
    jge   cont_displ
1155
    ret
1 ha 1156
   cont_displ:
652 mario79 1157
     push  eax
655 mario79 1158
     and   eax,0x3fffffff
1055 Galkov 1159
     cmp   eax,61*0x10000        ; length <= 60 ?
655 mario79 1160
     pop   eax
75 diamond 1161
     jb    cont_displ2
1 ha 1162
     ret
1163
   cont_displ2:
1164
 
1165
     pushad
1166
 
1055 Galkov 1167
     cmp   al,1                  ; ecx is a pointer ?
1 ha 1168
     jne   displnl1
655 mario79 1169
     mov   ebp,ebx
1170
     add   ebp,4
1171
     mov   ebp,[ebp+std_application_base_address]
139 diamond 1172
     mov   ebx,[ebx+std_application_base_address]
1276 Lrz 1173
 displnl1:
1 ha 1174
     sub   esp,64
1175
 
1276 Lrz 1176
    test   ah,ah                  ; DECIMAL
1177
    jnz   no_display_desnum
1178
    shr   eax,16
1179
    and   eax,0xC03f
652 mario79 1180
;     and   eax,0x3f
1276 Lrz 1181
    push  eax
1182
    and   eax,0x3f
1183
    mov   edi,esp
1184
    add   edi,4+64-1
1185
    mov   ecx,eax
1186
    mov   eax,ebx
1187
    mov   ebx,10
1188
 d_desnum:
1 ha 1189
     xor   edx,edx
655 mario79 1190
     call  division_64_bits
1 ha 1191
     div   ebx
1192
     add   dl,48
1193
     mov   [edi],dl
1194
     dec   edi
1195
     loop  d_desnum
1196
     pop   eax
652 mario79 1197
     call  normalize_number
1 ha 1198
     call  draw_num_text
1199
     add   esp,64
1200
     popad
1201
     ret
1202
   no_display_desnum:
1203
 
1055 Galkov 1204
     cmp   ah,0x01               ; HEXADECIMAL
1 ha 1205
     jne   no_display_hexnum
1206
     shr   eax,16
655 mario79 1207
     and   eax,0xC03f
652 mario79 1208
;     and   eax,0x3f
1209
     push  eax
75 diamond 1210
     and   eax,0x3f
1 ha 1211
     mov   edi,esp
194 diamond 1212
     add   edi,4+64-1
1 ha 1213
     mov   ecx,eax
1214
     mov   eax,ebx
1215
     mov   ebx,16
1216
   d_hexnum:
1217
     xor   edx,edx
655 mario79 1218
     call  division_64_bits
1 ha 1219
     div   ebx
1056 Galkov 1220
   hexletters = __fdo_hexdigits
1 ha 1221
     add   edx,hexletters
1222
     mov   dl,[edx]
1223
     mov   [edi],dl
1224
     dec   edi
1225
     loop  d_hexnum
1226
     pop   eax
652 mario79 1227
     call  normalize_number
1 ha 1228
     call  draw_num_text
1229
     add   esp,64
1230
     popad
1231
     ret
1232
   no_display_hexnum:
1233
 
1055 Galkov 1234
     cmp   ah,0x02               ; BINARY
1 ha 1235
     jne   no_display_binnum
1236
     shr   eax,16
655 mario79 1237
     and   eax,0xC03f
652 mario79 1238
;     and   eax,0x3f
1239
     push  eax
75 diamond 1240
     and   eax,0x3f
1 ha 1241
     mov   edi,esp
194 diamond 1242
     add   edi,4+64-1
1 ha 1243
     mov   ecx,eax
1244
     mov   eax,ebx
1245
     mov   ebx,2
1246
   d_binnum:
1247
     xor   edx,edx
655 mario79 1248
     call  division_64_bits
1 ha 1249
     div   ebx
1250
     add   dl,48
1251
     mov   [edi],dl
1252
     dec   edi
1253
     loop  d_binnum
1254
     pop   eax
652 mario79 1255
     call  normalize_number
1 ha 1256
     call  draw_num_text
1257
     add   esp,64
1258
     popad
1259
     ret
1260
   no_display_binnum:
1261
 
1262
     add   esp,64
1263
     popad
1264
     ret
1265
 
652 mario79 1266
normalize_number:
1267
     test  ah,0x80
1268
     jz   .continue
1269
     mov  ecx,48
1270
     and   eax,0x3f
1271
@@:
1272
     inc   edi
1273
     cmp   [edi],cl
1274
     jne   .continue
1275
     dec   eax
1276
     cmp   eax,1
665 diamond 1277
     ja    @r
1278
     mov   al,1
652 mario79 1279
.continue:
1280
     and   eax,0x3f
1281
     ret
1 ha 1282
 
655 mario79 1283
division_64_bits:
1284
     test  [esp+1+4],byte 0x40
1285
     jz   .continue
1286
     push  eax
1287
     mov   eax,ebp
1288
     div   ebx
1289
     mov   ebp,eax
1290
     pop   eax
1291
.continue:
1292
     ret
652 mario79 1293
 
1 ha 1294
draw_num_text:
684 diamond 1295
     mov   esi,eax
1296
     mov   edx,64+4
1297
     sub   edx,eax
1298
     add   edx,esp
1299
     mov   ebx,[esp+64+32-8+4]
1300
; add window start x & y
1301
     mov   ecx,[TASK_BASE]
465 serge 1302
 
1303
     mov   edi,[CURRENT_TASK]
1304
     shl   edi,8
1305
 
684 diamond 1306
     mov   eax,[ecx-twdw+WDATA.box.left]
1307
     add   eax,[edi+SLOT_BASE+APPDATA.wnd_clientbox.left]
1308
     shl   eax,16
1309
     add   eax,[ecx-twdw+WDATA.box.top]
1310
     add   eax,[edi+SLOT_BASE+APPDATA.wnd_clientbox.top]
1311
     add   ebx,eax
1312
     mov   ecx,[esp+64+32-12+4]
1055 Galkov 1313
        and     ecx, not 0x80000000     ; force counted string
1314
        mov     eax, [esp+64+8]         ; background color (if given)
1315
        mov     edi, [esp+64+4]
139 diamond 1316
     jmp   dtext
1 ha 1317
 
1318
align 4
1319
 
1320
sys_setup:
1321
 
1322
; 1=roland mpu midi base , base io address
1323
; 2=keyboard   1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus
1324
; 3=cd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
1325
; 5=system language, 1eng 2fi 3ger 4rus
1326
; 7=hd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
1327
; 8=fat32 partition in hd
1328
; 9
1329
; 10 = sound dma channel
1330
; 11 = enable lba read
1331
; 12 = enable pci access
1332
 
1333
 
1276 Lrz 1334
     	and  [esp+32],dword 0
1335
	dec	ebx				; MIDI
1336
	jnz  nsyse1
1337
	cmp  ecx,0x100
1 ha 1338
 
1276 Lrz 1339
	jb   nsyse1
1340
	mov	esi,65535
1341
	cmp	esi,ecx
1342
 
1343
	jb   nsyse1
1344
	mov  [midi_base],cx	;bx
1345
	mov  word [mididp],cx	;bx
1346
	inc  cx		    	;bx
1347
	mov  word [midisp],cx	;bx
1348
	ret
1349
 
283 diamond 1350
iglobal
1 ha 1351
midi_base dw 0
283 diamond 1352
endg
1 ha 1353
 
1354
   nsyse1:
1276 Lrz 1355
	dec	ebx				 ; KEYBOARD
1356
	jnz  nsyse2
1357
	mov  edi,[TASK_BASE]
1278 Lrz 1358
	mov  eax,[edi+TASKDATA.mem_start]
1359
	add  eax,edx
1 ha 1360
 
1276 Lrz 1361
	dec	ecx
1362
	jnz  kbnobase
1363
	mov  ebx,keymap
1364
	mov  ecx,128
1365
	call memmove
1366
	ret
1 ha 1367
   kbnobase:
1276 Lrz 1368
	dec  ecx
1369
	jnz  kbnoshift
1370
 
1371
	mov  ebx,keymap_shift
1372
	mov  ecx,128
1373
	call memmove
1374
	ret
1 ha 1375
   kbnoshift:
1276 Lrz 1376
	dec  ecx
1377
	jnz  kbnoalt
1378
	mov  ebx,keymap_alt
1379
	mov  ecx,128
1380
	call memmove
1381
	ret
1 ha 1382
   kbnoalt:
1276 Lrz 1383
	sub  ecx,6
1384
	jnz  kbnocountry
1385
	mov  word [keyboard],dx
1386
	ret
1 ha 1387
   kbnocountry:
1276 Lrz 1388
	mov  [esp+32],dword 1
1389
	ret
1 ha 1390
   nsyse2:
1276 Lrz 1391
	dec  ebx			    ; CD
1392
	jnz  nsyse4
1393
 
1394
	test ecx,ecx
1395
	jz   nosesl
1396
 
1397
	cmp  ecx, 4
1398
	ja   nosesl
1399
	mov  [cd_base],cl
1400
 
1401
	dec	ecx
1402
	jnz  noprma
1403
	mov  [cdbase],0x1f0
1404
	mov  [cdid],0xa0
1 ha 1405
   noprma:
1276 Lrz 1406
 
1407
	dec	ecx
1408
	jnz  noprsl
1409
	mov  [cdbase],0x1f0
1410
	mov  [cdid],0xb0
1 ha 1411
   noprsl:
1276 Lrz 1412
	dec	ecx
1413
     	jnz  nosema
1414
     	mov  [cdbase],0x170
1415
     	mov  [cdid],0xa0
1 ha 1416
   nosema:
1276 Lrz 1417
	dec	ecx
1418
     	jnz  nosesl
1419
     	mov  [cdbase],0x170
1420
     	mov  [cdid],0xb0
1 ha 1421
   nosesl:
1276 Lrz 1422
     	ret
1 ha 1423
 
1276 Lrz 1424
iglobal
1 ha 1425
cd_base db 0
1426
 
1276 Lrz 1427
endg
1 ha 1428
   nsyse4:
1276 Lrz 1429
 
1430
     	sub  ebx,2		 ; SYSTEM LANGUAGE
1431
     	jnz  nsyse5
1432
     	mov  [syslang],ecx
1433
     	ret
1 ha 1434
   nsyse5:
1276 Lrz 1435
 
1436
     	sub  ebx,2		; HD BASE
1437
     	jnz  nsyse7
1 ha 1438
 
1276 Lrz 1439
     	test ecx,ecx
1440
     	jz   nosethd
1441
 
1442
     	cmp  ecx,4
1443
     	ja   nosethd
1444
     	mov  [hd_base],cl
1445
 
1446
     	cmp  ecx,1
1447
     	jnz  noprmahd
1448
     	mov  [hdbase],0x1f0
1449
     	and  dword [hdid],0x0
1450
     	mov  dword [hdpos],ecx
1 ha 1451
;     call set_FAT32_variables
1452
   noprmahd:
1276 Lrz 1453
 
1454
     	cmp  ecx,2
1455
     	jnz  noprslhd
1456
     	mov  [hdbase],0x1f0
1457
     	mov  [hdid],0x10
1458
     	mov  dword [hdpos],ecx
1 ha 1459
;     call set_FAT32_variables
1460
   noprslhd:
1276 Lrz 1461
 
1462
     	cmp  ecx,3
1463
     	jnz  nosemahd
1464
     	mov  [hdbase],0x170
1465
     	and  dword [hdid],0x0
1466
     	mov  dword [hdpos],ecx
1 ha 1467
;     call set_FAT32_variables
1468
   nosemahd:
1276 Lrz 1469
 
1470
     	cmp  ecx,4
1471
     	jnz  noseslhd
1472
     	mov  [hdbase],0x170
1473
     	mov  [hdid],0x10
1474
     	mov  dword [hdpos],ecx
1 ha 1475
;     call set_FAT32_variables
1476
   noseslhd:
1276 Lrz 1477
    	call  reserve_hd1
1478
    	call  reserve_hd_channel
1479
    	call  free_hd_channel
1480
    	and   dword [hd1_status],0        ; free
75 diamond 1481
   nosethd:
1276 Lrz 1482
     	ret
1 ha 1483
 
283 diamond 1484
iglobal
1 ha 1485
hd_base db 0
283 diamond 1486
endg
1 ha 1487
 
802 serge 1488
nsyse7:
1 ha 1489
 
1260 Lrz 1490
;     cmp  eax,8                      ; HD PARTITION
1276 Lrz 1491
     	dec  ebx
1492
     	jnz  nsyse8
1493
     	mov  [fat32part],ecx
1 ha 1494
;     call set_FAT32_variables
1276 Lrz 1495
    	call  reserve_hd1
1496
    	call  reserve_hd_channel
1497
    	call  free_hd_channel
1498
;     	pusha
1499
     	call  choice_necessity_partition_1
1500
;     	popa
1501
    	and dword [hd1_status],0        ; free
1502
     	ret
1 ha 1503
 
802 serge 1504
nsyse8:
1260 Lrz 1505
;     cmp  eax,11                     ; ENABLE LBA READ
1276 Lrz 1506
    	and  ecx,1
1507
	sub  ebx,3
1508
    	jnz  no_set_lba_read
1509
    	mov  [lba_read_enabled],ecx
1510
    	ret
1 ha 1511
 
802 serge 1512
no_set_lba_read:
1260 Lrz 1513
;     cmp  eax,12                     ; ENABLE PCI ACCESS
1276 Lrz 1514
    	dec  ebx
1515
    	jnz  no_set_pci_access
1516
    	mov  [pci_access_enabled],ecx
1517
    	ret
1518
no_set_pci_access:
1 ha 1519
 
1520
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1521
include 'vmodeint.inc'
1522
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1523
 
75 diamond 1524
sys_setup_err:
1276 Lrz 1525
     	or  [esp+32],dword -1
1526
     	ret
1 ha 1527
 
1528
align 4
1529
 
1530
sys_getsetup:
1531
 
1532
; 1=roland mpu midi base , base io address
1533
; 2=keyboard   1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus
1534
; 3=cd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
1535
; 5=system language, 1eng 2fi 3ger 4rus
1536
; 7=hd base    1, pri.master 2, pri slave 3 sec master, 4 sec slave
1537
; 8=fat32 partition in hd
1538
; 9=get hs timer tic
1539
 
1276 Lrz 1540
;     cmp  eax,1
1541
	dec	ebx
1542
     	jnz  ngsyse1
1543
     	movzx eax,[midi_base]
1544
     	mov  [esp+32],eax
1545
     	ret
802 serge 1546
ngsyse1:
1276 Lrz 1547
;     cmp  eax,2
1548
	dec	ebx
1549
     	jnz  ngsyse2
1 ha 1550
 
1276 Lrz 1551
     	mov  edi,[TASK_BASE]
1278 Lrz 1552
     	mov  ebx,[edi+TASKDATA.mem_start]
1553
     	add  ebx,edx
1276 Lrz 1554
 
1555
;     cmp  ebx,1
1556
	dec	ecx
1557
     	jnz  kbnobaseret
1558
     	mov  eax,keymap
1559
     	mov  ecx,128
1560
     	call memmove
1561
     	ret
802 serge 1562
kbnobaseret:
1276 Lrz 1563
;     cmp  ebx,2
1564
	dec	ecx
1565
     	jnz  kbnoshiftret
1566
 
1567
     	mov  eax,keymap_shift
1568
     	mov  ecx,128
1569
     	call memmove
1570
     	ret
802 serge 1571
kbnoshiftret:
1276 Lrz 1572
;     cmp  ebx,3
1573
	dec	ecx
1574
     	jne  kbnoaltret
1575
 
1576
     	mov  eax,keymap_alt
1577
     	mov  ecx,128
1578
     	call memmove
1579
     	ret
802 serge 1580
kbnoaltret:
1276 Lrz 1581
;     cmp  ebx,9
1582
	sub	ecx,6
1583
     	jnz  ngsyse2
1584
     	movzx eax,word [keyboard]
1585
     	mov  [esp+32],eax
1586
     	ret
1587
 
1588
 
802 serge 1589
ngsyse2:
1276 Lrz 1590
;         cmp  eax,3
1591
	dec	ebx
1592
        jnz  ngsyse3
1593
        movzx eax,[cd_base]
1594
        mov  [esp+32],eax
1595
        ret
802 serge 1596
ngsyse3:
1276 Lrz 1597
;         cmp  eax,5
1598
	sub	ebx,2
1599
        jnz  ngsyse5
1600
        mov  eax,[syslang]
1601
        mov  [esp+32],eax
1602
        ret
802 serge 1603
ngsyse5:
1276 Lrz 1604
;     cmp  eax,7
1605
	sub	ebx,2
1606
     	jnz  ngsyse7
1607
     	movzx eax,[hd_base]
1608
     	mov  [esp+32],eax
1609
     	ret
802 serge 1610
ngsyse7:
1276 Lrz 1611
;     cmp  eax,8
1612
	dec	ebx
1613
     	jnz  ngsyse8
1614
     	mov eax,[fat32part]
1615
     	mov  [esp+32],eax
1616
     	ret
802 serge 1617
ngsyse8:
1276 Lrz 1618
;     cmp  eax,9
1619
	dec	ebx
1620
     	jnz  ngsyse9
1621
     	mov  eax,[timer_ticks] ;[0xfdf0]
1622
     	mov  [esp+32],eax
1623
     	ret
802 serge 1624
ngsyse9:
1276 Lrz 1625
;     cmp  eax,11
1626
	sub	ebx,2
1627
     	jnz  ngsyse11
1628
     	mov eax,[lba_read_enabled]
1629
     	mov  [esp+32],eax
1630
     	ret
802 serge 1631
ngsyse11:
1276 Lrz 1632
;     cmp  eax,12
1633
	dec	ebx
1634
     	jnz  ngsyse12
1635
     	mov eax,[pci_access_enabled]
1636
     	mov  [esp+32],eax
1637
     	ret
802 serge 1638
ngsyse12:
1276 Lrz 1639
     	mov  [esp+32],dword 1
1640
     	ret
1 ha 1641
 
1276 Lrz 1642
 
479 kastigar 1643
get_timer_ticks:
1276 Lrz 1644
    	mov eax,[timer_ticks]
1645
    	ret
479 kastigar 1646
 
283 diamond 1647
iglobal
1 ha 1648
align 4
221 serge 1649
mousefn dd msscreen, mswin, msbutton, msset
1055 Galkov 1650
        dd app_load_cursor
1651
        dd app_set_cursor
1652
        dd app_delete_cursor
1653
        dd msz
283 diamond 1654
endg
1 ha 1655
 
1656
readmousepos:
1657
 
1658
; eax=0 screen relative
1659
; eax=1 window relative
1660
; eax=2 buttons pressed
221 serge 1661
; eax=3 set mouse pos   ; reserved
1662
; eax=4 load cursor
1663
; eax=5 set cursor
1664
; eax=6 delete cursor   ; reserved
479 kastigar 1665
; eax=7 get mouse_z
1 ha 1666
 
1290 Lrz 1667
           cmp ebx, 7
1055 Galkov 1668
           ja msset
1290 Lrz 1669
           jmp [mousefn+ebx*4]
221 serge 1670
msscreen:
1055 Galkov 1671
           mov  eax,[MOUSE_X]
1672
           shl  eax,16
1673
           mov  ax,[MOUSE_Y]
1290 Lrz 1674
           mov  [esp+36-4],eax
1055 Galkov 1675
           ret
221 serge 1676
mswin:
1055 Galkov 1677
           mov  eax,[MOUSE_X]
1678
           shl  eax,16
1679
           mov  ax,[MOUSE_Y]
1680
           mov  esi,[TASK_BASE]
1681
           mov  bx, word [esi-twdw+WDATA.box.left]
1682
           shl  ebx,16
1683
           mov  bx, word [esi-twdw+WDATA.box.top]
1684
           sub  eax,ebx
1 ha 1685
 
1055 Galkov 1686
           mov  edi,[CURRENT_TASK]
1687
           shl  edi,8
1688
           sub  ax,word[edi+SLOT_BASE+APPDATA.wnd_clientbox.top]
1689
           rol  eax,16
1690
           sub  ax,word[edi+SLOT_BASE+APPDATA.wnd_clientbox.left]
1691
           rol  eax,16
1290 Lrz 1692
           mov  [esp+36-4],eax
1055 Galkov 1693
           ret
221 serge 1694
msbutton:
1055 Galkov 1695
           movzx eax,byte [BTN_DOWN]
1290 Lrz 1696
           mov  [esp+36-4],eax
1055 Galkov 1697
           ret
479 kastigar 1698
msz:
1055 Galkov 1699
           mov   edi, [TASK_COUNT]
1700
           movzx edi, word [WIN_POS + edi*2]
1701
           cmp   edi, [CURRENT_TASK]
1702
           jne   @f
1703
           mov   ax,[MOUSE_SCROLL_H]
1704
           shl   eax,16
1705
           mov   ax,[MOUSE_SCROLL_V]
1290 Lrz 1706
           mov   [esp+36-4],eax
1276 Lrz 1707
           and   [MOUSE_SCROLL_H],word 0
1708
           and   [MOUSE_SCROLL_V],word 0
1055 Galkov 1709
           ret
479 kastigar 1710
       @@:
1290 Lrz 1711
           and  [esp+36-4],dword 0
1276 Lrz 1712
;           ret
221 serge 1713
msset:
1055 Galkov 1714
           ret
164 serge 1715
 
221 serge 1716
app_load_cursor:
1290 Lrz 1717
           cmp ecx, OS_BASE
1055 Galkov 1718
           jae msset
1290 Lrz 1719
           stdcall load_cursor, ecx, edx
1720
           mov [esp+36-4], eax
1055 Galkov 1721
           ret
164 serge 1722
 
221 serge 1723
app_set_cursor:
1290 Lrz 1724
           stdcall set_cursor, ecx
1725
           mov [esp+36-4], eax
1055 Galkov 1726
           ret
1 ha 1727
 
233 serge 1728
app_delete_cursor:
1290 Lrz 1729
           stdcall delete_cursor, ecx
1730
           mov [esp+36-4], eax
1055 Galkov 1731
           ret
1 ha 1732
 
1733
is_input:
1734
 
1735
   push edx
1055 Galkov 1736
   mov  dx,word [midisp]
1737
   in   al,dx
1738
   and  al,0x80
1739
   pop  edx
1 ha 1740
   ret
1741
 
1742
is_output:
1743
 
1744
   push edx
1055 Galkov 1745
   mov  dx,word [midisp]
1746
   in   al,dx
1747
   and  al,0x40
1748
   pop  edx
1 ha 1749
   ret
1750
 
1751
 
1752
get_mpu_in:
1753
 
1754
   push edx
1055 Galkov 1755
   mov  dx,word [mididp]
1756
   in   al,dx
1757
   pop  edx
1 ha 1758
   ret
1759
 
1760
 
1761
put_mpu_out:
1762
 
1763
   push edx
1055 Galkov 1764
   mov  dx,word [mididp]
1765
   out  dx,al
1766
   pop  edx
1 ha 1767
   ret
1768
 
1769
 
1770
 
1771
align 4
1772
 
1773
sys_midi:
1276 Lrz 1774
	cmp  [mididp],0
1775
	jnz  sm0
1776
	mov  [esp+36],dword 1
1777
	ret
1778
sm0:
1779
	and  [esp+36],dword 0
1780
	dec  ebx
1781
	jnz  smn1
1782
 ;    call setuart
1783
su1:
1784
	call is_output
1785
	test al,al
1786
	jnz  su1
1787
	mov  dx,word [midisp]
1788
	mov  al,0xff
1789
	out  dx,al
1790
su2:
1791
	mov  dx,word [midisp]
1792
	mov  al,0xff
1793
	out  dx,al
1794
	call is_input
1795
	test al,al
1796
	jnz  su2
1797
	call get_mpu_in
1798
	cmp  al,0xfe
1799
	jnz  su2
1800
su3:
1801
	call is_output
1802
	test  al,al
1803
	jnz  su3
1804
	mov  dx,word [midisp]
1805
	mov  al,0x3f
1806
	out  dx,al
1807
	ret
1808
smn1:
1809
	dec  ebx
1810
	jnz  smn2
1811
sm10:
1812
	call get_mpu_in
1813
	call is_output
1814
	test al,al
1815
	jnz  sm10
1816
	mov  al,bl
1817
	call put_mpu_out
1818
	smn2:
1819
	ret
1 ha 1820
 
1821
detect_devices:
1822
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
769 Rus 1823
;include 'detect/commouse.inc'
479 kastigar 1824
;include 'detect/ps2mouse.inc'
1 ha 1825
;include 'detect/dev_fd.inc'
1826
;include 'detect/dev_hdcd.inc'
1827
;include 'detect/sear_par.inc'
1828
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1829
    ret
1830
 
1831
sys_end:
1832
 
1220 serge 1833
     mov ecx, [current_slot]
1834
     mov eax, [ecx+APPDATA.tls_base]
1835
     test eax, eax
1836
     jz @F
1837
 
1838
     stdcall user_free, eax
1839
@@:
1840
 
379 serge 1841
     mov   eax,[TASK_BASE]
115 poddubny 1842
     mov   [eax+TASKDATA.state], 3  ; terminate this program
41 mikedld 1843
 
1055 Galkov 1844
    waitterm:            ; wait here for termination
684 diamond 1845
     mov   ebx,100
1 ha 1846
     call  delay_hs
1847
     jmp   waitterm
1848
 
75 diamond 1849
iglobal
170 serge 1850
align 4
75 diamond 1851
sys_system_table:
1055 Galkov 1852
        dd      exit_for_anyone         ; 1 = obsolete
1853
        dd      sysfn_terminate         ; 2 = terminate thread
1854
        dd      sysfn_activate          ; 3 = activate window
1855
        dd      sysfn_getidletime       ; 4 = get idle time
1856
        dd      sysfn_getcpuclock       ; 5 = get cpu clock
1857
        dd      sysfn_saveramdisk       ; 6 = save ramdisk
1858
        dd      sysfn_getactive         ; 7 = get active window
1859
        dd      sysfn_sound_flag        ; 8 = get/set sound_flag
1860
        dd      sysfn_shutdown          ; 9 = shutdown with parameter
1861
        dd      sysfn_minimize          ; 10 = minimize window
1862
        dd      sysfn_getdiskinfo       ; 11 = get disk subsystem info
1863
        dd      sysfn_lastkey           ; 12 = get last pressed key
1864
        dd      sysfn_getversion        ; 13 = get kernel version
1865
        dd      sysfn_waitretrace       ; 14 = wait retrace
1866
        dd      sysfn_centermouse       ; 15 = center mouse cursor
1867
        dd      sysfn_getfreemem        ; 16 = get free memory size
1868
        dd      sysfn_getallmem         ; 17 = get total memory size
1869
        dd      sysfn_terminate2        ; 18 = terminate thread using PID
1870
                                        ;                 instead of slot
1871
        dd      sysfn_mouse_acceleration; 19 = set/get mouse acceleration
1872
        dd      sysfn_meminfo           ; 20 = get extended memory info
1873
        dd      sysfn_pid_to_slot       ; 21 = get slot number for pid
1874
        dd      sysfn_min_rest_window   ; 22 = minimize and restore any window
75 diamond 1875
sysfn_num = ($ - sys_system_table)/4
1876
endg
1877
 
1 ha 1878
sys_system:
1055 Galkov 1879
        dec     ebx
1880
        cmp     ebx, sysfn_num
1881
        jae     @f
1882
        jmp     dword [sys_system_table + ebx*4]
75 diamond 1883
@@:
1055 Galkov 1884
        ret
1 ha 1885
 
214 serge 1886
 
1055 Galkov 1887
sysfn_shutdown:          ; 18.9 = system shutdown
748 heavyiron 1888
     cmp  ecx,1
1889
     jl   exit_for_anyone
1890
     cmp  ecx,4
1891
     jg   exit_for_anyone
1892
     mov  [BOOT_VAR+0x9030],cl
1893
 
379 serge 1894
     mov  eax,[TASK_COUNT]
709 diamond 1895
     mov  [SYS_SHUTDOWN],al
1 ha 1896
     mov  [shutdown_processes],eax
684 diamond 1897
     and  dword [esp+32], 0
748 heavyiron 1898
 exit_for_anyone:
1 ha 1899
     ret
1900
  uglobal
1901
   shutdown_processes: dd 0x0
1902
  endg
1903
 
1055 Galkov 1904
sysfn_terminate:        ; 18.2 = TERMINATE
684 diamond 1905
     cmp  ecx,2
1 ha 1906
     jb   noprocessterminate
379 serge 1907
     mov  edx,[TASK_COUNT]
684 diamond 1908
     cmp  ecx,edx
75 diamond 1909
     ja   noprocessterminate
379 serge 1910
     mov  eax,[TASK_COUNT]
684 diamond 1911
     shl  ecx,5
1912
     mov  edx,[ecx+CURRENT_TASK+TASKDATA.pid]
1913
     add  ecx,CURRENT_TASK+TASKDATA.state
1914
     cmp  byte [ecx], 9
75 diamond 1915
     jz   noprocessterminate
41 mikedld 1916
 
1 ha 1917
     ;call MEM_Heap_Lock      ;guarantee that process isn't working with heap
1055 Galkov 1918
     mov  [ecx],byte 3       ; clear possible i40's
1 ha 1919
     ;call MEM_Heap_UnLock
1920
 
1921
     cmp  edx,[application_table_status]    ; clear app table stat
1922
     jne  noatsc
1329 Lrz 1923
     and  [application_table_status],0
1 ha 1924
   noatsc:
75 diamond 1925
   noprocessterminate:
1 ha 1926
     ret
1927
 
85 halyavin 1928
sysfn_terminate2:
1929
;lock application_table_status mutex
164 serge 1930
.table_status:
85 halyavin 1931
    cli
1932
    cmp    [application_table_status],0
1055 Galkov 1933
    je     .stf
85 halyavin 1934
    sti
1935
    call   change_task
1936
    jmp    .table_status
1937
.stf:
1938
    call   set_application_table_status
684 diamond 1939
    mov    eax,ecx
85 halyavin 1940
    call   pid_to_slot
1941
    test   eax,eax
1055 Galkov 1942
    jz     .not_found
684 diamond 1943
    mov    ecx,eax
85 halyavin 1944
    cli
1945
    call   sysfn_terminate
1329 Lrz 1946
    and    [application_table_status],0
85 halyavin 1947
    sti
684 diamond 1948
    and    dword [esp+32],0
85 halyavin 1949
    ret
1950
.not_found:
1951
    mov    [application_table_status],0
1055 Galkov 1952
    or     dword [esp+32],-1
85 halyavin 1953
    ret
1954
 
1055 Galkov 1955
sysfn_activate:         ; 18.3 = ACTIVATE WINDOW
684 diamond 1956
     cmp  ecx,2
105 poddubny 1957
     jb   .nowindowactivate
684 diamond 1958
     cmp  ecx,[TASK_COUNT]
105 poddubny 1959
     ja   .nowindowactivate
1960
 
1961
     mov   [window_minimize], 2   ; restore window if minimized
1962
 
684 diamond 1963
     movzx esi, word [WIN_STACK + ecx*2]
379 serge 1964
     cmp   esi, [TASK_COUNT]
105 poddubny 1965
     je    .nowindowactivate ; already active
1966
 
684 diamond 1967
     mov   edi, ecx
105 poddubny 1968
     shl   edi, 5
1969
     add   edi, window_data
684 diamond 1970
     movzx esi, word [WIN_STACK + ecx * 2]
380 serge 1971
     lea   esi, [WIN_POS + esi * 2]
105 poddubny 1972
     call  waredraw
1973
.nowindowactivate:
1 ha 1974
     ret
41 mikedld 1975
 
1055 Galkov 1976
sysfn_getidletime:              ; 18.4 = GET IDLETIME
1 ha 1977
     mov  eax,[idleusesec]
684 diamond 1978
     mov  [esp+32], eax
1 ha 1979
     ret
1980
 
1055 Galkov 1981
sysfn_getcpuclock:              ; 18.5 = GET TSC/SEC
381 serge 1982
     mov  eax,[CPU_FREQ]
684 diamond 1983
     mov  [esp+32], eax
1 ha 1984
     ret
1985
 
1986
;  SAVE ramdisk to /hd/1/menuet.img
1987
;!!!!!!!!!!!!!!!!!!!!!!!!
1988
   include 'blkdev/rdsave.inc'
1989
;!!!!!!!!!!!!!!!!!!!!!!!!
1232 Lrz 1990
align 4
1055 Galkov 1991
sysfn_getactive:        ; 18.7 = get active window
379 serge 1992
     mov  eax, [TASK_COUNT]
380 serge 1993
   movzx  eax, word [WIN_POS + eax*2]
684 diamond 1994
     mov  [esp+32],eax
1 ha 1995
     ret
75 diamond 1996
 
1055 Galkov 1997
sysfn_sound_flag:       ; 18.8 = get/set sound_flag
1232 Lrz 1998
;     cmp  ecx,1
1999
     dec  ecx
2000
     jnz  nogetsoundflag
1 ha 2001
     movzx  eax,byte [sound_flag] ; get sound_flag
684 diamond 2002
     mov  [esp+32],eax
1 ha 2003
     ret
2004
 nogetsoundflag:
1232 Lrz 2005
;     cmp  ecx,2
2006
     dec  ecx
1 ha 2007
     jnz  nosoundflag
75 diamond 2008
     xor  byte [sound_flag], 1
2009
 nosoundflag:
41 mikedld 2010
     ret
75 diamond 2011
 
1055 Galkov 2012
sysfn_minimize:         ; 18.10 = minimize window
1 ha 2013
     mov   [window_minimize],1
2014
     ret
1232 Lrz 2015
align 4
1055 Galkov 2016
sysfn_getdiskinfo:      ; 18.11 = get disk info table
1232 Lrz 2017
;     cmp  ecx,1
2018
     dec  ecx
1 ha 2019
     jnz  full_table
2020
  small_table:
2021
     call for_all_tables
75 diamond 2022
     mov ecx,10
1 ha 2023
     cld
2024
     rep movsb
2025
     ret
2026
   for_all_tables:
684 diamond 2027
     mov edi,edx
381 serge 2028
     mov esi,DRIVE_DATA
1 ha 2029
     ret
2030
  full_table:
1232 Lrz 2031
;     cmp  ecx,2
2032
     dec  ecx
1 ha 2033
     jnz  exit_for_anyone
2034
     call for_all_tables
75 diamond 2035
     mov ecx,16384
1 ha 2036
     cld
2037
     rep movsd
2038
     ret
75 diamond 2039
 
1055 Galkov 2040
sysfn_lastkey:          ; 18.12 = return 0 (backward compatibility)
2041
        and     dword [esp+32], 0
2042
        ret
75 diamond 2043
 
1055 Galkov 2044
sysfn_getversion:       ; 18.13 = get kernel ID and version
1447 diamond 2045
     mov edi,ecx
1 ha 2046
     mov esi,version_inf
2047
     mov ecx,version_end-version_inf
2048
     rep movsb
2049
     ret
75 diamond 2050
 
2051
sysfn_waitretrace:     ; 18.14 = sys wait retrace
41 mikedld 2052
     ;wait retrace functions
2053
 sys_wait_retrace:
2054
     mov edx,0x3da
2055
 WaitRetrace_loop:
2056
     in al,dx
2057
     test al,1000b
2058
     jz WaitRetrace_loop
684 diamond 2059
     and [esp+32],dword 0
1 ha 2060
     ret
75 diamond 2061
 
1232 Lrz 2062
align 4
1055 Galkov 2063
sysfn_centermouse:      ; 18.15 = mouse centered
1232 Lrz 2064
; removed here by 
2065
;     call  mouse_centered
2066
;* mouse centered - start code- Mario79
2067
;mouse_centered:
2068
;        push  eax
2069
        mov   eax,[Screen_Max_X]
2070
        shr   eax,1
2071
        mov   [MOUSE_X],ax
2072
        mov   eax,[Screen_Max_Y]
2073
        shr   eax,1
2074
        mov   [MOUSE_Y],ax
2075
;        ret
2076
;* mouse centered - end code- Mario79
2077
	xor   eax,eax
2078
        and   [esp+32],eax
2079
;        pop   eax
2080
 
1 ha 2081
     ret
1232 Lrz 2082
align 4
120 mario79 2083
sysfn_mouse_acceleration: ; 18.19 = set/get mouse features
1232 Lrz 2084
     test ecx,ecx  ; get mouse speed factor
120 mario79 2085
     jnz  .set_mouse_acceleration
164 serge 2086
     xor  eax,eax
120 mario79 2087
     mov  ax,[mouse_speed_factor]
684 diamond 2088
     mov  [esp+32],eax
120 mario79 2089
     ret
2090
 .set_mouse_acceleration:
1232 Lrz 2091
;     cmp  ecx,1  ; set mouse speed factor
2092
     dec  ecx
120 mario79 2093
     jnz  .get_mouse_delay
684 diamond 2094
     mov  [mouse_speed_factor],dx
120 mario79 2095
     ret
2096
 .get_mouse_delay:
1232 Lrz 2097
;     cmp  ecx,2  ; get mouse delay
2098
     dec  ecx
120 mario79 2099
     jnz  .set_mouse_delay
2100
     mov  eax,[mouse_delay]
684 diamond 2101
     mov  [esp+32],eax
120 mario79 2102
     ret
2103
 .set_mouse_delay:
1232 Lrz 2104
;     cmp  ecx,3  ; set mouse delay
2105
     dec  ecx
120 mario79 2106
     jnz  .set_pointer_position
684 diamond 2107
     mov  [mouse_delay],edx
120 mario79 2108
     ret
2109
 .set_pointer_position:
1232 Lrz 2110
;     cmp  ecx,4  ; set mouse pointer position
2111
     dec   ecx
621 mario79 2112
     jnz  .set_mouse_button
684 diamond 2113
     mov   [MOUSE_Y],dx    ;y
2114
     ror   edx,16
2115
     mov   [MOUSE_X],dx    ;x
2116
     rol   edx,16
621 mario79 2117
     ret
2118
 .set_mouse_button:
1232 Lrz 2119
;     cmp   ecx,5  ; set mouse button features
2120
     dec   ecx
621 mario79 2121
     jnz  .end
684 diamond 2122
     mov   [BTN_DOWN],dl
621 mario79 2123
     mov   [mouse_active],1
120 mario79 2124
 .end:
2125
     ret
2126
 
75 diamond 2127
sysfn_getfreemem:
170 serge 2128
     mov eax, [pg_data.pages_free]
2129
     shl eax, 2
684 diamond 2130
     mov [esp+32],eax
1 ha 2131
     ret
75 diamond 2132
 
2133
sysfn_getallmem:
170 serge 2134
     mov  eax,[MEM_AMOUNT]
2135
     shr eax, 10
684 diamond 2136
     mov  [esp+32],eax
32 halyavin 2137
     ret
2138
 
608 alver 2139
; // Alver, 2007-22-08 // {
2140
sysfn_pid_to_slot:
684 diamond 2141
     mov   eax, ecx
608 alver 2142
     call  pid_to_slot
684 diamond 2143
     mov   [esp+32], eax
608 alver 2144
     ret
2145
 
2146
sysfn_min_rest_window:
2147
     pushad
1055 Galkov 2148
     mov   eax, edx      ; ebx - operating
684 diamond 2149
     shr   ecx, 1
608 alver 2150
     jnc    @f
2151
     call  pid_to_slot
2152
@@:
1055 Galkov 2153
     or    eax, eax      ; eax - number of slot
608 alver 2154
     jz    .error
1055 Galkov 2155
     cmp   eax, 255         ; varify maximal slot number
608 alver 2156
     ja    .error
684 diamond 2157
     movzx eax, word [WIN_STACK + eax*2]
2158
     shr   ecx, 1
608 alver 2159
     jc    .restore
2160
 ; .minimize:
2161
     call  minimize_window
2162
     jmp   .exit
2163
.restore:
2164
     call  restore_minimized_window
2165
.exit:
2166
     popad
2167
     xor   eax, eax
684 diamond 2168
     mov   [esp+32], eax
608 alver 2169
     ret
2170
.error:
2171
     popad
2172
     xor   eax, eax
2173
     dec   eax
684 diamond 2174
     mov   [esp+32], eax
608 alver 2175
     ret
2176
; } \\ Alver, 2007-22-08 \\
2177
 
41 mikedld 2178
uglobal
2179
;// mike.dld, 2006-29-01 [
2180
screen_workarea RECT
2181
;// mike.dld, 2006-29-01 ]
1 ha 2182
window_minimize db 0
1055 Galkov 2183
sound_flag      db 0
41 mikedld 2184
endg
1 ha 2185
 
41 mikedld 2186
iglobal
2187
version_inf:
1319 diamond 2188
  db 0,7,7,0  ; version 0.7.7.0
41 mikedld 2189
  db UID_KOLIBRI
540 victor 2190
  dd __REV__
41 mikedld 2191
version_end:
2192
endg
1 ha 2193
 
41 mikedld 2194
UID_NONE=0
1055 Galkov 2195
UID_MENUETOS=1   ;official
2196
UID_KOLIBRI=2    ;russian
1 ha 2197
 
2198
sys_cachetodiskette:
1055 Galkov 2199
        cmp     ebx, 1
2200
        jne     .no_floppy_a_save
2201
        mov     [flp_number], 1
2202
        jmp     .save_image_on_floppy
671 Ghost 2203
.no_floppy_a_save:
1055 Galkov 2204
        cmp     ebx, 2
2205
        jne     .no_floppy_b_save
2206
        mov     [flp_number], 2
671 Ghost 2207
.save_image_on_floppy:
1055 Galkov 2208
        call    save_image
2209
        mov     [esp + 32], dword 0
2210
        cmp     [FDC_Status], 0
2211
        je      .yes_floppy_save
671 Ghost 2212
.no_floppy_b_save:
1055 Galkov 2213
        mov     [esp + 32], dword 1
671 Ghost 2214
.yes_floppy_save:
1055 Galkov 2215
        ret
1 ha 2216
 
2217
uglobal
2218
;  bgrchanged  dd  0x0
1071 diamond 2219
align 4
2220
bgrlockpid dd 0
546 diamond 2221
bgrlock db 0
1 ha 2222
endg
2223
 
2224
sys_background:
2225
 
1055 Galkov 2226
    cmp   ebx,1                            ; BACKGROUND SIZE
1 ha 2227
    jnz   nosb1
1232 Lrz 2228
    test  ecx,ecx
2229
;    cmp   ecx,0
2230
    jz    sbgrr
2231
    test  edx,edx
2232
;    cmp   edx,0
2233
    jz    sbgrr
546 diamond 2234
@@:
1071 diamond 2235
;;Maxis use atomic bts for mutexes  4.4.2009
2236
        bts     dword [bgrlock], 0
2237
        jnc     @f
1055 Galkov 2238
        call    change_task
2239
        jmp     @b
546 diamond 2240
@@:
684 diamond 2241
    mov   [BgrDataWidth],ecx
2242
    mov   [BgrDataHeight],edx
1 ha 2243
;    mov   [bgrchanged],1
469 serge 2244
 
2245
    pushad
2246
; return memory for old background
1107 diamond 2247
        mov     eax, [img_background]
2248
        cmp     eax, static_background_data
2249
        jz      @f
2250
        stdcall kernel_free, eax
2251
@@:
469 serge 2252
; calculate RAW size
2253
    xor  eax,eax
2254
    inc  eax
527 diamond 2255
    cmp  [BgrDataWidth],eax
469 serge 2256
    jae   @f
527 diamond 2257
    mov [BgrDataWidth],eax
469 serge 2258
@@:
527 diamond 2259
    cmp  [BgrDataHeight],eax
469 serge 2260
    jae   @f
527 diamond 2261
    mov [BgrDataHeight],eax
469 serge 2262
@@:
527 diamond 2263
    mov  eax,[BgrDataWidth]
2264
    imul eax,[BgrDataHeight]
2265
    lea  eax,[eax*3]
469 serge 2266
    mov  [mem_BACKGROUND],eax
2267
; get memory for new background
546 diamond 2268
    stdcall kernel_alloc, eax
469 serge 2269
    test eax, eax
1107 diamond 2270
    jz .memfailed
469 serge 2271
    mov [img_background], eax
1107 diamond 2272
    jmp .exit
2273
.memfailed:
2274
; revert to static monotone data
2275
        mov     [img_background], static_background_data
2276
        xor     eax, eax
2277
        inc     eax
2278
        mov     [BgrDataWidth], eax
2279
        mov     [BgrDataHeight], eax
2280
        mov     [mem_BACKGROUND], 4
2281
.exit:
469 serge 2282
    popad
1055 Galkov 2283
        mov     [bgrlock], 0
469 serge 2284
 
1 ha 2285
  sbgrr:
2286
    ret
469 serge 2287
 
875 serge 2288
nosb1:
1 ha 2289
 
1055 Galkov 2290
    cmp   ebx,2                            ; SET PIXEL
1 ha 2291
    jnz   nosb2
875 serge 2292
 
1107 diamond 2293
    mov   eax, [img_background]
2294
    test  ecx, ecx
2295
    jz    @f
2296
    cmp   eax, static_background_data
2297
    jz    .ret
2298
@@:
875 serge 2299
    mov ebx, [mem_BACKGROUND]
2300
    add ebx, 4095
2301
    and ebx, -4096
2302
    sub ebx, 4
2303
    cmp   ecx, ebx
1107 diamond 2304
    ja   .ret
875 serge 2305
 
684 diamond 2306
    mov   ebx,[eax+ecx]
2307
    and   ebx,0xFF000000 ;255*256*256*256
2308
    and   edx,0x00FFFFFF ;255*256*256+255*256+255
2309
    add   edx,ebx
2310
    mov   [eax+ecx],edx
1107 diamond 2311
.ret:
1 ha 2312
    ret
875 serge 2313
nosb2:
1 ha 2314
 
1055 Galkov 2315
    cmp   ebx,3                            ; DRAW BACKGROUND
1 ha 2316
    jnz   nosb3
2317
draw_background_temp:
2318
;    cmp   [bgrchanged],1 ;0
2319
;    je    nosb31
2320
;draw_background_temp:
2321
;    mov   [bgrchanged],1 ;0
76 mario79 2322
    mov    [background_defined], 1
1392 diamond 2323
    mov    byte[BACKGROUND_CHANGED], 1
709 diamond 2324
    call  force_redraw_background
1 ha 2325
   nosb31:
2326
    ret
2327
  nosb3:
2328
 
1055 Galkov 2329
    cmp   ebx,4                            ; TILED / STRETCHED
1 ha 2330
    jnz   nosb4
684 diamond 2331
    cmp   ecx,[BgrDrawMode]
1055 Galkov 2332
    je    nosb41
684 diamond 2333
    mov   [BgrDrawMode],ecx
1 ha 2334
;    mov   [bgrchanged],1
2335
   nosb41:
2336
    ret
2337
  nosb4:
2338
 
1055 Galkov 2339
    cmp   ebx,5                            ; BLOCK MOVE TO BGR
1 ha 2340
    jnz   nosb5
1107 diamond 2341
    cmp   [img_background], static_background_data
2342
    jnz   @f
2343
    test  edx, edx
2344
    jnz   .fin
2345
    cmp   esi, 4
2346
    ja    .fin
2347
  @@:
1 ha 2348
  ; bughere
684 diamond 2349
    mov   eax, ecx
2350
    mov   ebx, edx
469 serge 2351
    add   ebx, [img_background]   ;IMG_BACKGROUND
684 diamond 2352
    mov   ecx, esi
1 ha 2353
    call  memmove
2354
  .fin:
2355
    ret
2356
  nosb5:
479 kastigar 2357
 
1055 Galkov 2358
        cmp     ebx, 6
2359
        jnz     nosb6
1071 diamond 2360
;;Maxis use atomic bts for mutex 4.4.2009
546 diamond 2361
@@:
1073 heavyiron 2362
        bts     dword [bgrlock], 0
1071 diamond 2363
        jnc     @f
1055 Galkov 2364
        call    change_task
2365
        jmp     @b
546 diamond 2366
@@:
1055 Galkov 2367
        mov     eax, [CURRENT_TASK]
2368
        mov     [bgrlockpid], eax
1107 diamond 2369
        cmp     [img_background], static_background_data
2370
        jz      .nomem
1055 Galkov 2371
        stdcall user_alloc, [mem_BACKGROUND]
2372
        mov     [esp+32], eax
2373
        test    eax, eax
2374
        jz      .nomem
2375
        mov     ebx, eax
2376
        shr     ebx, 12
2377
        or      dword [page_tabs+(ebx-1)*4], DONT_FREE_BLOCK
2378
        mov     esi, [img_background]
2379
        shr     esi, 12
2380
        mov     ecx, [mem_BACKGROUND]
2381
        add     ecx, 0xFFF
2382
        shr     ecx, 12
546 diamond 2383
.z:
1055 Galkov 2384
        mov     eax, [page_tabs+ebx*4]
2385
        test    al, 1
2386
        jz      @f
2387
        call    free_page
546 diamond 2388
@@:
1055 Galkov 2389
        mov     eax, [page_tabs+esi*4]
2390
        or      al, PG_UW
2391
        mov     [page_tabs+ebx*4], eax
2392
        mov     eax, ebx
2393
        shl     eax, 12
2394
        invlpg  [eax]
2395
        inc     ebx
2396
        inc     esi
2397
        loop    .z
2398
        ret
546 diamond 2399
.nomem:
1055 Galkov 2400
        and     [bgrlockpid], 0
2401
        mov     [bgrlock], 0
546 diamond 2402
nosb6:
1055 Galkov 2403
        cmp     ebx, 7
2404
        jnz     nosb7
2405
        cmp     [bgrlock], 0
2406
        jz      .err
2407
        mov     eax, [CURRENT_TASK]
2408
        cmp     [bgrlockpid], eax
2409
        jnz     .err
2410
        mov     eax, ecx
2411
        mov     ebx, ecx
2412
        shr     eax, 12
2413
        mov     ecx, [page_tabs+(eax-1)*4]
2414
        test    cl, USED_BLOCK+DONT_FREE_BLOCK
2415
        jz      .err
2416
        jnp     .err
2417
        push    eax
2418
        shr     ecx, 12
1312 diamond 2419
        dec     ecx
546 diamond 2420
@@:
1055 Galkov 2421
        and     dword [page_tabs+eax*4], 0
2422
        mov     edx, eax
2423
        shl     edx, 12
2424
        push eax
2425
        invlpg  [edx]
2426
        pop eax
2427
        inc     eax
2428
        loop    @b
2429
        pop     eax
2430
        and     dword [page_tabs+(eax-1)*4], not DONT_FREE_BLOCK
2431
        stdcall user_free, ebx
2432
        mov     [esp+32], eax
2433
        and     [bgrlockpid], 0
2434
        mov     [bgrlock], 0
2435
        ret
546 diamond 2436
.err:
1055 Galkov 2437
        and     dword [esp+32], 0
2438
        ret
546 diamond 2439
 
2440
nosb7:
1 ha 2441
    ret
2442
 
709 diamond 2443
force_redraw_background:
1392 diamond 2444
    and   [draw_data+32 + RECT.left], 0
2445
    and   [draw_data+32 + RECT.top], 0
709 diamond 2446
    push  eax ebx
753 serge 2447
    mov   eax,[Screen_Max_X]
2448
    mov   ebx,[Screen_Max_Y]
709 diamond 2449
    mov   [draw_data+32 + RECT.right],eax
2450
    mov   [draw_data+32 + RECT.bottom],ebx
2451
    pop   ebx eax
1392 diamond 2452
    inc   byte[REDRAW_BACKGROUND]
709 diamond 2453
    ret
479 kastigar 2454
 
1 ha 2455
align 4
2456
 
2457
sys_getbackground:
1304 Lrz 2458
;    cmp   eax,1                                  ; SIZE
2459
    dec	  ebx
1 ha 2460
    jnz   nogb1
527 diamond 2461
    mov   eax,[BgrDataWidth]
1 ha 2462
    shl   eax,16
531 diamond 2463
    mov   ax,[BgrDataHeight]
1304 Lrz 2464
    mov   [esp+32],eax
1 ha 2465
    ret
2466
 
875 serge 2467
nogb1:
1304 Lrz 2468
;    cmp   eax,2                                  ; PIXEL
2469
    dec	  ebx
1 ha 2470
    jnz   nogb2
875 serge 2471
 
1107 diamond 2472
        mov     eax, [img_background]
1304 Lrz 2473
        test    ecx, ecx
1107 diamond 2474
        jz      @f
2475
        cmp     eax, static_background_data
2476
        jz      .ret
2477
@@:
1304 Lrz 2478
    mov ebx, [mem_BACKGROUND]
2479
    add ebx, 4095
2480
    and ebx, -4096
2481
    sub ebx, 4
2482
    cmp ecx, ebx
1107 diamond 2483
    ja  .ret
875 serge 2484
 
1304 Lrz 2485
    mov   eax,[ecx+eax]
469 serge 2486
 
1 ha 2487
    and   eax, 0xFFFFFF
1304 Lrz 2488
    mov   [esp+32],eax
1107 diamond 2489
.ret:
1 ha 2490
    ret
2491
  nogb2:
2492
 
1304 Lrz 2493
;    cmp   eax,4                                  ; TILED / STRETCHED
2494
    dec   ebx
1314 diamond 2495
    dec   ebx
1 ha 2496
    jnz   nogb4
527 diamond 2497
    mov   eax,[BgrDrawMode]
1 ha 2498
  nogb4:
1304 Lrz 2499
    mov   [esp+32],eax
1 ha 2500
    ret
2501
 
2502
align 4
2503
 
2504
sys_getkey:
1055 Galkov 2505
        mov     [esp + 32],dword 1
2506
        ; test main buffer
2507
        mov     ebx, [CURRENT_TASK]                          ; TOP OF WINDOW STACK
2508
        movzx   ecx, word [WIN_STACK + ebx * 2]
2509
        mov     edx, [TASK_COUNT]
2510
        cmp     ecx, edx
2511
        jne     .finish
2512
        cmp     [KEY_COUNT], byte 0
2513
        je      .finish
2514
        movzx   eax, byte [KEY_BUFF]
2515
        shl     eax, 8
2516
        push    eax
2517
        dec     byte [KEY_COUNT]
2518
        and     byte [KEY_COUNT], 127
2519
        movzx   ecx, byte [KEY_COUNT]
2520
        add     ecx, 2
2521
        mov     eax, KEY_BUFF + 1
2522
        mov     ebx, KEY_BUFF
2523
        call    memmove
2524
        pop     eax
92 diamond 2525
.ret_eax:
1055 Galkov 2526
        mov     [esp + 32], eax
2527
        ret
671 Ghost 2528
.finish:
92 diamond 2529
; test hotkeys buffer
1055 Galkov 2530
        mov     ecx, hotkey_buffer
92 diamond 2531
@@:
1055 Galkov 2532
        cmp     [ecx], ebx
2533
        jz      .found
2534
        add     ecx, 8
2535
        cmp     ecx, hotkey_buffer + 120 * 8
2536
        jb      @b
2537
        ret
92 diamond 2538
.found:
1055 Galkov 2539
        mov     ax, [ecx + 6]
2540
        shl     eax, 16
2541
        mov     ah, [ecx + 4]
2542
        mov     al, 2
2543
        and     dword [ecx + 4], 0
2544
        and     dword [ecx], 0
2545
        jmp     .ret_eax
1 ha 2546
 
2547
align 4
2548
 
2549
sys_getbutton:
2550
 
1055 Galkov 2551
        mov     ebx, [CURRENT_TASK]                         ; TOP OF WINDOW STACK
2552
        mov     [esp + 32], dword 1
2553
        movzx   ecx, word [WIN_STACK + ebx * 2]
2554
        mov     edx, [TASK_COUNT] ; less than 256 processes
2555
        cmp     ecx, edx
2556
        jne     .exit
2557
        movzx   eax, byte [BTN_COUNT]
2558
        test    eax, eax
2559
        jz      .exit
2560
        mov     eax, [BTN_BUFF]
1391 mikedld 2561
        and     al, 0xFE                                    ; delete left button bit
1055 Galkov 2562
        mov     [BTN_COUNT], byte 0
2563
        mov     [esp + 32], eax
671 Ghost 2564
.exit:
1055 Galkov 2565
        ret
1 ha 2566
 
2567
 
2568
align 4
2569
 
2570
sys_cpuusage:
2571
 
2572
;  RETURN:
2573
;
2574
;  +00 dword     process cpu usage
2575
;  +04  word     position in windowing stack
2576
;  +06  word     windowing stack value at current position (cpu nro)
2577
;  +10 12 bytes  name
2578
;  +22 dword     start in mem
2579
;  +26 dword     used mem
2580
;  +30 dword     PID , process idenfification number
2581
;
2582
 
1055 Galkov 2583
    cmp  ecx,-1         ; who am I ?
684 diamond 2584
    jne  .no_who_am_i
2585
    mov  ecx,[CURRENT_TASK]
2586
  .no_who_am_i:
1055 Galkov 2587
        cmp     ecx, max_processes
2588
        ja      .nofillbuf
1 ha 2589
 
684 diamond 2590
; +4: word: position of the window of thread in the window stack
1055 Galkov 2591
        mov     ax, [WIN_STACK + ecx * 2]
2592
        mov     [ebx+4], ax
684 diamond 2593
; +6: word: number of the thread slot, which window has in the window stack
2594
;           position ecx (has no relation to the specific thread)
1055 Galkov 2595
        mov     ax, [WIN_POS + ecx * 2]
2596
        mov     [ebx+6], ax
1 ha 2597
 
1055 Galkov 2598
        shl     ecx, 5
1 ha 2599
 
684 diamond 2600
; +0: dword: memory usage
1055 Galkov 2601
        mov     eax, [ecx+CURRENT_TASK+TASKDATA.cpu_usage]
2602
        mov     [ebx], eax
684 diamond 2603
; +10: 11 bytes: name of the process
1055 Galkov 2604
        push    ecx
2605
        lea     eax, [ecx*8+SLOT_BASE+APPDATA.app_name]
2606
        add     ebx, 10
2607
        mov     ecx, 11
2608
        call    memmove
2609
        pop     ecx
1 ha 2610
 
684 diamond 2611
; +22: address of the process in memory
2612
; +26: size of used memory - 1
1055 Galkov 2613
        push    edi
2614
        lea     edi, [ebx+12]
2615
        xor     eax, eax
2616
        mov     edx, 0x100000*16
2617
        cmp     ecx, 1 shl 5
2618
        je      .os_mem
2619
        mov     edx, [SLOT_BASE+ecx*8+APPDATA.mem_size]
2620
        mov     eax, std_application_base_address
684 diamond 2621
.os_mem:
1055 Galkov 2622
        stosd
2623
        lea     eax, [edx-1]
2624
        stosd
1 ha 2625
 
684 diamond 2626
; +30: PID/TID
1055 Galkov 2627
        mov     eax, [ecx+CURRENT_TASK+TASKDATA.pid]
2628
        stosd
1 ha 2629
 
2630
    ; window position and size
1055 Galkov 2631
        push    esi
2632
        lea     esi, [ecx + window_data + WDATA.box]
2633
        movsd
2634
        movsd
2635
        movsd
2636
        movsd
1 ha 2637
 
2638
    ; Process state (+50)
1055 Galkov 2639
        mov     eax, dword [ecx+CURRENT_TASK+TASKDATA.state]
2640
        stosd
1 ha 2641
 
138 mikedld 2642
    ; Window client area box
1055 Galkov 2643
        lea     esi, [ecx*8 + SLOT_BASE + APPDATA.wnd_clientbox]
2644
        movsd
2645
        movsd
2646
        movsd
2647
        movsd
1 ha 2648
 
164 serge 2649
    ; Window state
1055 Galkov 2650
        mov     al, [ecx+window_data+WDATA.fl_wstate]
2651
        stosb
164 serge 2652
 
1055 Galkov 2653
        pop     esi
2654
        pop     edi
138 mikedld 2655
 
684 diamond 2656
.nofillbuf:
1 ha 2657
    ; return number of processes
2658
 
379 serge 2659
    mov    eax,[TASK_COUNT]
684 diamond 2660
    mov    [esp+32],eax
1 ha 2661
    ret
2662
 
2663
align 4
2664
sys_clock:
1055 Galkov 2665
        cli
1 ha 2666
  ; Mikhail Lisovin  xx Jan 2005
1055 Galkov 2667
  @@:   mov   al, 10
2668
        out   0x70, al
2669
        in    al, 0x71
2670
        test  al, al
2671
        jns   @f
2672
        mov   esi, 1
2673
        call  delay_ms
2674
        jmp   @b
1 ha 2675
  @@:
2676
  ; end Lisovin's fix
2677
 
1055 Galkov 2678
        xor   al,al           ; seconds
2679
        out   0x70,al
2680
        in    al,0x71
2681
        movzx ecx,al
2682
        mov   al,02           ; minutes
2683
        shl   ecx,16
2684
        out   0x70,al
2685
        in    al,0x71
2686
        movzx edx,al
2687
        mov   al,04           ; hours
2688
        shl   edx,8
2689
        out   0x70,al
2690
        in    al,0x71
2691
        add   ecx,edx
2692
        movzx edx,al
2693
        add   ecx,edx
2694
        sti
2695
        mov     [esp + 32], ecx
2696
        ret
1 ha 2697
 
2698
 
2699
align 4
2700
 
2701
sys_date:
2702
 
1055 Galkov 2703
        cli
2704
  @@:   mov   al, 10
2705
        out   0x70, al
2706
        in    al, 0x71
2707
        test  al, al
2708
        jns   @f
2709
        mov   esi, 1
2710
        call  delay_ms
2711
        jmp   @b
75 diamond 2712
  @@:
2713
 
1055 Galkov 2714
        mov     ch,0
2715
        mov     al,7            ; date
2716
        out     0x70,al
2717
        in      al,0x71
2718
        mov     cl,al
2719
        mov     al,8            ; month
2720
        shl     ecx,16
2721
        out     0x70,al
2722
        in      al,0x71
2723
        mov     ch,al
2724
        mov     al,9            ; year
2725
        out     0x70,al
2726
        in      al,0x71
2727
        mov     cl,al
2728
        sti
2729
        mov     [esp+32], ecx
2730
        ret
1 ha 2731
 
2732
 
2733
; redraw status
2734
 
2735
sys_redrawstat:
1055 Galkov 2736
        cmp     ebx, 1
2737
        jne     no_widgets_away
2738
        ; buttons away
2739
        mov     ecx,[CURRENT_TASK]
1 ha 2740
  sys_newba2:
1055 Galkov 2741
        mov     edi,[BTN_ADDR]
2742
        cmp     [edi], dword 0  ; empty button list ?
2743
        je      end_of_buttons_away
2744
        movzx   ebx, word [edi]
2745
        inc     ebx
2746
        mov     eax,edi
1 ha 2747
  sys_newba:
1055 Galkov 2748
        dec     ebx
2749
        jz      end_of_buttons_away
1 ha 2750
 
1055 Galkov 2751
        add     eax, 0x10
2752
        cmp     cx, [eax]
2753
        jnz     sys_newba
1 ha 2754
 
1055 Galkov 2755
        push    eax ebx ecx
2756
        mov     ecx,ebx
2757
        inc     ecx
2758
        shl     ecx, 4
2759
        mov     ebx, eax
2760
        add     eax, 0x10
2761
        call    memmove
2762
        dec     dword [edi]
2763
        pop     ecx ebx eax
1 ha 2764
 
1055 Galkov 2765
        jmp     sys_newba2
1 ha 2766
 
2767
  end_of_buttons_away:
2768
 
1055 Galkov 2769
        ret
1 ha 2770
 
2771
  no_widgets_away:
2772
 
1055 Galkov 2773
        cmp     ebx, 2
2774
        jnz     srl1
1 ha 2775
 
1055 Galkov 2776
        mov     edx, [TASK_BASE]      ; return whole screen draw area for this app
2777
        add     edx, draw_data - CURRENT_TASK
2778
        mov     [edx + RECT.left], 0
2779
        mov     [edx + RECT.top], 0
2780
        mov     eax, [Screen_Max_X]
2781
        mov     [edx + RECT.right], eax
2782
        mov     eax, [Screen_Max_Y]
2783
        mov     [edx + RECT.bottom], eax
1 ha 2784
 
1055 Galkov 2785
        mov     edi, [TASK_BASE]
2786
        or      [edi - twdw + WDATA.fl_wdrawn], 1   ; no new position & buttons from app
2787
        call    sys_window_mouse
2788
        ret
1 ha 2789
 
2790
  srl1:
1055 Galkov 2791
        ret
1 ha 2792
 
2793
;ok - 100% work
2794
;nt - not tested
2795
;---------------------------------------------------------------------------------------------
2796
;eax
2797
;0 - task switch counter. Ret switch counter in eax. Block. ok.
2798
;1 - change task. Ret nothing. Block. ok.
2799
;2 - performance control
2800
; ebx
2801
; 0 - enable or disable (inversion) PCE flag on CR4 for rdmpc in user mode.
2802
; returned new cr4 in eax. Ret cr4 in eax. Block. ok.
2803
; 1 - is cache enabled. Ret cr0 in eax if enabled else zero in eax. Block. ok.
2804
; 2 - enable cache. Ret 1 in eax. Ret nothing. Block. ok.
2805
; 3 - disable cache. Ret 0 in eax. Ret nothing. Block. ok.
2806
;eax
2807
;3 - rdmsr. Counter in edx. (edx:eax) [esi:edi, edx] => [edx:esi, ecx]. Ret in ebx:eax. Block. ok.
2808
;4 - wrmsr. Counter in edx. (edx:eax) [esi:edi, edx] => [edx:esi, ecx]. Ret in ebx:eax. Block. ok.
2809
;---------------------------------------------------------------------------------------------
1344 Lrz 2810
iglobal
2811
align 4
2812
sheduler:
2813
	dd	sys_sheduler.00
2814
	dd	change_task
2815
	dd	sys_sheduler.02
2816
	dd	sys_sheduler.03
2817
	dd	sys_sheduler.04
2818
endg
1273 Lrz 2819
sys_sheduler:
1344 Lrz 2820
;rewritten by   29.12.2009
1345 Lrz 2821
	jmp	dword [sheduler+ebx*4]
1344 Lrz 2822
;.shed_counter:
2823
.00:
2824
	mov eax,[context_counter]
1345 Lrz 2825
	mov [esp+32],eax
1344 Lrz 2826
	ret
1273 Lrz 2827
 
1344 Lrz 2828
.02:
2829
;.perf_control:
1365 Lrz 2830
	inc	ebx			;before ebx=2, ebx=3
2831
        cmp	ebx,ecx			;if ecx=3, ebx=3
2832
        jz 	cache_disable
2833
 
2834
	dec	ebx                     ;ebx=2
2835
	cmp	ebx,ecx                 ;
2836
	jz	cache_enable		;if ecx=2 and ebx=2
2837
 
2838
	dec	ebx                     ;ebx=1
2839
	cmp	ebx,ecx
2840
	jz      is_cache_enabled	;if ecx=1 and ebx=1
2841
 
2842
	dec	ebx
2843
	test	ebx,ecx                 ;ebx=0 and ecx=0
1344 Lrz 2844
	jz 	modify_pce		;if ecx=0
1365 Lrz 2845
 
1344 Lrz 2846
	ret
1345 Lrz 2847
 
1344 Lrz 2848
.03:
2849
;.rdmsr_instr:
2850
;now counter in ecx
2851
;(edx:eax) esi:edi => edx:esi
2852
	mov 	eax,esi
1345 Lrz 2853
	mov	ecx,edx
1344 Lrz 2854
	rdmsr
1345 Lrz 2855
	mov 	[esp+32],eax
2856
	mov 	[esp+20],edx 		;ret in ebx?
1344 Lrz 2857
	ret
2858
 
2859
.04:
1273 Lrz 2860
;.wrmsr_instr:
2861
;now counter in ecx
2862
;(edx:eax) esi:edi => edx:esi
2863
        ; Fast Call MSR can't be destroy
2864
        ; ® MSR_AMD_EFER ¬®¦­® ¨§¬¥­ïâì, â.ª. ¢ í⮬ ॣ¨áâॠ«¨è
2865
        ; ¢ª«îç îâáï/¢ëª«îç îâáï à áè¨à¥­­ë¥ ¢®§¬®¦­®áâ¨
1345 Lrz 2866
        cmp     edx,MSR_SYSENTER_CS
1273 Lrz 2867
        je      @f
1345 Lrz 2868
        cmp     edx,MSR_SYSENTER_ESP
1273 Lrz 2869
        je      @f
1345 Lrz 2870
        cmp     edx,MSR_SYSENTER_EIP
1273 Lrz 2871
        je      @f
1345 Lrz 2872
        cmp     edx,MSR_AMD_STAR
1273 Lrz 2873
        je      @f
2874
 
1344 Lrz 2875
        mov     eax,esi
1345 Lrz 2876
	mov	ecx,edx
1273 Lrz 2877
        wrmsr
1344 Lrz 2878
        ; mov   [esp + 32], eax
2879
        ; mov   [esp + 20], edx ;ret in ebx?
1273 Lrz 2880
@@:
1344 Lrz 2881
	ret
1273 Lrz 2882
 
1 ha 2883
cache_disable:
2884
       mov eax,cr0
2885
       or  eax,01100000000000000000000000000000b
2886
       mov cr0,eax
2887
       wbinvd ;set MESI
2888
ret
2889
 
2890
cache_enable:
2891
       mov eax,cr0
2892
       and eax,10011111111111111111111111111111b
2893
       mov cr0,eax
2894
ret
2895
 
2896
is_cache_enabled:
2897
       mov eax,cr0
2898
       mov ebx,eax
2899
       and eax,01100000000000000000000000000000b
2900
       jz cache_disabled
1345 Lrz 2901
       mov [esp+32],ebx
1 ha 2902
cache_disabled:
1345 Lrz 2903
       mov dword [esp+32],eax ;0
1 ha 2904
ret
2905
 
2906
modify_pce:
2907
       mov eax,cr4
2908
;       mov ebx,0
2909
;       or  bx,100000000b ;pce
2910
;       xor eax,ebx ;invert pce
17 me_root 2911
       bts eax,8 ;pce=cr4[8]
1 ha 2912
       mov cr4,eax
1345 Lrz 2913
       mov [esp+32],eax
1 ha 2914
ret
2915
;---------------------------------------------------------------------------------------------
2916
 
2917
 
2918
; check if pixel is allowed to be drawn
2919
 
2920
checkpixel:
1055 Galkov 2921
        push eax edx
1 ha 2922
 
1055 Galkov 2923
        mov  edx,[Screen_Max_X]     ; screen x size
2924
        inc  edx
2925
        imul edx, ebx
1300 serge 2926
        add  eax, [_WinMapAddress]
2927
        mov  dl, [eax+edx] ; lea eax, [...]
1 ha 2928
 
1055 Galkov 2929
        xor  ecx, ecx
2930
        mov  eax, [CURRENT_TASK]
2931
        cmp  al, dl
2932
        setne cl
1 ha 2933
 
1055 Galkov 2934
        pop  edx eax
2935
        ret
1 ha 2936
 
2937
iglobal
521 diamond 2938
  cpustring db 'CPU',0
1 ha 2939
endg
2940
 
67 diamond 2941
uglobal
1055 Galkov 2942
background_defined    db    0    ; diamond, 11.04.2006
67 diamond 2943
endg
1 ha 2944
 
2945
align 4
2946
; check misc
2947
 
2948
checkmisc:
2949
 
2950
    cmp   [ctrl_alt_del], 1
2951
    jne   nocpustart
501 serge 2952
 
1055 Galkov 2953
        mov     ebp, cpustring
2954
        call    fs_execute_from_sysdir
501 serge 2955
 
1 ha 2956
    mov   [ctrl_alt_del], 0
465 serge 2957
 
2958
nocpustart:
1 ha 2959
    cmp   [mouse_active], 1
2960
    jne   mouse_not_active
2961
    mov   [mouse_active], 0
2962
    xor   edi, edi
1055 Galkov 2963
    mov   ecx,  [TASK_COUNT]
465 serge 2964
set_mouse_event:
1 ha 2965
    add   edi, 256
1055 Galkov 2966
    or    [edi+SLOT_BASE+APPDATA.event_mask], dword 100000b
1 ha 2967
    loop  set_mouse_event
2968
 
465 serge 2969
mouse_not_active:
1392 diamond 2970
    cmp   byte[BACKGROUND_CHANGED], 0
2971
    jz    no_set_bgr_event
473 diamond 2972
    xor   edi, edi
1392 diamond 2973
    mov   ecx, [TASK_COUNT]
473 diamond 2974
set_bgr_event:
2975
    add   edi, 256
1055 Galkov 2976
    or    [edi+SLOT_BASE+APPDATA.event_mask], 16
473 diamond 2977
    loop  set_bgr_event
1392 diamond 2978
    mov   byte[BACKGROUND_CHANGED], 0
709 diamond 2979
no_set_bgr_event:
1392 diamond 2980
    cmp   byte[REDRAW_BACKGROUND], 0               ; background update ?
2981
    jz    nobackgr
2982
    cmp    [background_defined], 0
2983
    jz    nobackgr
709 diamond 2984
;    mov   [draw_data+32 + RECT.left],dword 0
2985
;    mov   [draw_data+32 + RECT.top],dword 0
753 serge 2986
;    mov   eax,[Screen_Max_X]
2987
;    mov   ebx,[Screen_Max_Y]
709 diamond 2988
;    mov   [draw_data+32 + RECT.right],eax
2989
;    mov   [draw_data+32 + RECT.bottom],ebx
1392 diamond 2990
@@:
1 ha 2991
    call  drawbackground
1392 diamond 2992
    xor   eax, eax
2993
    xchg  al, [REDRAW_BACKGROUND]
2994
    test  al, al                                   ; got new update request?
2995
    jnz   @b
2996
    mov   [draw_data+32 + RECT.left], eax
2997
    mov   [draw_data+32 + RECT.top], eax
2998
    mov   [draw_data+32 + RECT.right], eax
2999
    mov   [draw_data+32 + RECT.bottom], eax
381 serge 3000
    mov   [MOUSE_BACKGROUND],byte 0
1 ha 3001
 
465 serge 3002
nobackgr:
1 ha 3003
 
3004
    ; system shutdown request
3005
 
381 serge 3006
    cmp  [SYS_SHUTDOWN],byte 0
1055 Galkov 3007
    je   noshutdown
1 ha 3008
 
3009
    mov  edx,[shutdown_processes]
3010
 
381 serge 3011
    cmp  [SYS_SHUTDOWN],dl
1 ha 3012
    jne  no_mark_system_shutdown
3013
 
709 diamond 3014
    lea   ecx,[edx-1]
465 serge 3015
    mov   edx,OS_BASE+0x3040
709 diamond 3016
    jecxz @f
465 serge 3017
markz:
115 poddubny 3018
    mov   [edx+TASKDATA.state],byte 3
1 ha 3019
    add   edx,0x20
3020
    loop  markz
709 diamond 3021
@@:
1 ha 3022
 
3023
  no_mark_system_shutdown:
3024
 
1300 serge 3025
    call [_display.disable_mouse]
1 ha 3026
 
381 serge 3027
    dec  byte [SYS_SHUTDOWN]
1055 Galkov 3028
    je   system_shutdown
1 ha 3029
 
465 serge 3030
noshutdown:
1 ha 3031
 
3032
 
1055 Galkov 3033
    mov   eax,[TASK_COUNT]                  ; termination
379 serge 3034
    mov   ebx,TASK_DATA+TASKDATA.state
1 ha 3035
    mov   esi,1
3036
 
465 serge 3037
newct:
1 ha 3038
    mov   cl,[ebx]
3039
    cmp   cl,byte 3
1055 Galkov 3040
    jz    terminate
1 ha 3041
    cmp   cl,byte 4
1055 Galkov 3042
    jz    terminate
1 ha 3043
 
3044
    add   ebx,0x20
3045
    inc   esi
3046
    dec   eax
3047
    jnz   newct
3048
    ret
3049
 
3050
; redraw screen
3051
 
3052
redrawscreen:
3053
 
3054
; eax , if process window_data base is eax, do not set flag/limits
3055
 
1055 Galkov 3056
         pushad
3057
         push  eax
1 ha 3058
 
684 diamond 3059
;;;         mov   ebx,2
1 ha 3060
;;;         call  delay_hs
3061
 
1055 Galkov 3062
         ;mov   ecx,0               ; redraw flags for apps
3063
         xor   ecx,ecx
1 ha 3064
       newdw2:
3065
 
1055 Galkov 3066
         inc   ecx
3067
         push  ecx
1 ha 3068
 
1055 Galkov 3069
         mov   eax,ecx
3070
         shl   eax,5
3071
         add   eax,window_data
1 ha 3072
 
1055 Galkov 3073
         cmp   eax,[esp+4]
3074
         je    not_this_task
3075
                                   ; check if window in redraw area
3076
         mov   edi,eax
1 ha 3077
 
1055 Galkov 3078
         cmp   ecx,1               ; limit for background
3079
         jz    bgli
1 ha 3080
 
1055 Galkov 3081
         mov   eax, [edi + WDATA.box.left]
3082
         mov   ebx, [edi + WDATA.box.top]
3083
         mov   ecx, [edi + WDATA.box.width]
3084
         mov   edx, [edi + WDATA.box.height]
3085
         add   ecx,eax
3086
         add   edx,ebx
1 ha 3087
 
1362 mikedld 3088
         mov   ecx,[draw_limits.bottom]   ; ecx = area y end     ebx = window y start
1055 Galkov 3089
         cmp   ecx,ebx
3090
         jb    ricino
1 ha 3091
 
1362 mikedld 3092
         mov   ecx,[draw_limits.right]   ; ecx = area x end     eax = window x start
1055 Galkov 3093
         cmp   ecx,eax
3094
         jb    ricino
1 ha 3095
 
1055 Galkov 3096
         mov   eax, [edi + WDATA.box.left]
3097
         mov   ebx, [edi + WDATA.box.top]
3098
         mov   ecx, [edi + WDATA.box.width]
3099
         mov   edx, [edi + WDATA.box.height]
3100
         add   ecx, eax
3101
         add   edx, ebx
164 serge 3102
 
1362 mikedld 3103
         mov   eax,[draw_limits.top]    ; eax = area y start     edx = window y end
1055 Galkov 3104
         cmp   edx,eax
3105
         jb    ricino
1 ha 3106
 
1362 mikedld 3107
         mov   eax,[draw_limits.left]    ; eax = area x start     ecx = window x end
1055 Galkov 3108
         cmp   ecx,eax
3109
         jb    ricino
1 ha 3110
 
1055 Galkov 3111
        bgli:
1 ha 3112
 
1474 diamond 3113
         cmp   dword[esp], 1
1055 Galkov 3114
         jnz   .az
1392 diamond 3115
;         cmp   byte[BACKGROUND_CHANGED], 0
3116
;         jnz   newdw8
3117
         cmp   byte[REDRAW_BACKGROUND], 0
1055 Galkov 3118
         jz    .az
1392 diamond 3119
         mov   dl, 0
1055 Galkov 3120
         lea   eax,[edi+draw_data-window_data]
1362 mikedld 3121
         mov   ebx,[draw_limits.left]
1055 Galkov 3122
         cmp   ebx,[eax+RECT.left]
3123
         jae   @f
3124
         mov   [eax+RECT.left],ebx
1392 diamond 3125
         mov   dl, 1
1055 Galkov 3126
        @@:
1362 mikedld 3127
         mov   ebx,[draw_limits.top]
1055 Galkov 3128
         cmp   ebx,[eax+RECT.top]
3129
         jae   @f
3130
         mov   [eax+RECT.top],ebx
1392 diamond 3131
         mov   dl, 1
1055 Galkov 3132
        @@:
1362 mikedld 3133
         mov   ebx,[draw_limits.right]
1055 Galkov 3134
         cmp   ebx,[eax+RECT.right]
3135
         jbe   @f
3136
         mov   [eax+RECT.right],ebx
1392 diamond 3137
         mov   dl, 1
1055 Galkov 3138
        @@:
1362 mikedld 3139
         mov   ebx,[draw_limits.bottom]
1055 Galkov 3140
         cmp   ebx,[eax+RECT.bottom]
3141
         jbe   @f
3142
         mov   [eax+RECT.bottom],ebx
1392 diamond 3143
         mov   dl, 1
1055 Galkov 3144
        @@:
1392 diamond 3145
         add   byte[REDRAW_BACKGROUND], dl
1055 Galkov 3146
         jmp   newdw8
3147
        .az:
1 ha 3148
 
1055 Galkov 3149
         mov   eax,edi
3150
         add   eax,draw_data-window_data
1 ha 3151
 
1362 mikedld 3152
         mov   ebx,[draw_limits.left]          ; set limits
1055 Galkov 3153
         mov   [eax + RECT.left], ebx
1362 mikedld 3154
         mov   ebx,[draw_limits.top]
1055 Galkov 3155
         mov   [eax + RECT.top], ebx
1362 mikedld 3156
         mov   ebx,[draw_limits.right]
1055 Galkov 3157
         mov   [eax + RECT.right], ebx
1362 mikedld 3158
         mov   ebx,[draw_limits.bottom]
1055 Galkov 3159
         mov   [eax + RECT.bottom], ebx
1 ha 3160
 
1055 Galkov 3161
         sub   eax,draw_data-window_data
1 ha 3162
 
1055 Galkov 3163
         cmp   dword [esp],1
3164
         jne   nobgrd
1392 diamond 3165
         inc   byte[REDRAW_BACKGROUND]
1 ha 3166
 
3167
       newdw8:
3168
       nobgrd:
3169
 
1055 Galkov 3170
         mov   [eax + WDATA.fl_redraw],byte 1    ; mark as redraw
1 ha 3171
 
3172
       ricino:
3173
 
3174
       not_this_task:
3175
 
1055 Galkov 3176
         pop   ecx
1 ha 3177
 
1055 Galkov 3178
         cmp   ecx,[TASK_COUNT]
3179
         jle   newdw2
1 ha 3180
 
1055 Galkov 3181
         pop  eax
3182
         popad
1 ha 3183
 
1055 Galkov 3184
         ret
1 ha 3185
 
3186
calculatebackground:   ; background
3187
 
1300 serge 3188
        mov   edi, [_WinMapAddress]                ; set os to use all pixels
1055 Galkov 3189
        mov   eax,0x01010101
1300 serge 3190
        mov   ecx, [_WinMapSize]
3191
        shr   ecx, 2
1055 Galkov 3192
        rep   stosd
1 ha 3193
 
1392 diamond 3194
        mov   byte[REDRAW_BACKGROUND], 0              ; do not draw background!
3195
        mov   byte[BACKGROUND_CHANGED], 0
1 ha 3196
 
1055 Galkov 3197
        ret
1 ha 3198
 
3199
uglobal
1055 Galkov 3200
  imax    dd 0x0
1 ha 3201
endg
3202
 
3203
 
3204
 
3205
delay_ms:     ; delay in 1/1000 sec
3206
 
3207
 
1055 Galkov 3208
        push  eax
3209
        push  ecx
1 ha 3210
 
1055 Galkov 3211
        mov   ecx,esi
3212
        ; 
3213
        imul  ecx, 33941
3214
        shr   ecx, 9
3215
        ; 
1 ha 3216
 
1055 Galkov 3217
        in    al,0x61
3218
        and   al,0x10
3219
        mov   ah,al
3220
        cld
1 ha 3221
 
1055 Galkov 3222
 cnt1:  in    al,0x61
3223
        and   al,0x10
3224
        cmp   al,ah
3225
        jz    cnt1
1 ha 3226
 
1055 Galkov 3227
        mov   ah,al
3228
        loop  cnt1
1 ha 3229
 
1055 Galkov 3230
        pop   ecx
3231
        pop   eax
1 ha 3232
 
1055 Galkov 3233
        ret
1 ha 3234
 
3235
 
3236
set_app_param:
1055 Galkov 3237
        mov     edi, [TASK_BASE]
1153 clevermous 3238
        mov     eax, [edi + TASKDATA.event_mask]
1055 Galkov 3239
        mov     [edi + TASKDATA.event_mask], ebx
1153 clevermous 3240
        mov     [esp+32], eax
1055 Galkov 3241
        ret
1 ha 3242
 
3243
 
3244
 
3245
delay_hs:     ; delay in 1/100 secs
684 diamond 3246
; ebx = delay time
1055 Galkov 3247
        push  ecx
3248
        push  edx
1 ha 3249
 
1055 Galkov 3250
        mov   edx,[timer_ticks]
1 ha 3251
 
3252
      newtic:
1055 Galkov 3253
        mov   ecx,[timer_ticks]
3254
        sub   ecx,edx
3255
        cmp   ecx,ebx
3256
        jae   zerodelay
1 ha 3257
 
1055 Galkov 3258
        call  change_task
1 ha 3259
 
1055 Galkov 3260
        jmp   newtic
1 ha 3261
 
3262
      zerodelay:
1055 Galkov 3263
        pop   edx
3264
        pop   ecx
1 ha 3265
 
1055 Galkov 3266
        ret
1 ha 3267
 
1276 Lrz 3268
align 16	;very often call this subrutine
1 ha 3269
memmove:       ; memory move in bytes
3270
 
3271
; eax = from
3272
; ebx = to
3273
; ecx = no of bytes
3274
    test ecx, ecx
3275
    jle  .ret
3276
 
3277
    push esi edi ecx
3278
 
3279
    mov  edi, ebx
3280
    mov  esi, eax
3281
 
3282
    test ecx, not 11b
1055 Galkov 3283
    jz   @f
1 ha 3284
 
3285
    push ecx
3286
    shr  ecx, 2
3287
    rep  movsd
3288
    pop  ecx
3289
    and  ecx, 11b
1055 Galkov 3290
    jz   .finish
1 ha 3291
  @@:
3292
    rep  movsb
3293
 
3294
  .finish:
3295
    pop  ecx edi esi
3296
  .ret:
3297
    ret
3298
 
3299
 
75 diamond 3300
;  Sysfunction 34, read_floppy_file, is obsolete. Use 58 or 70 function instead.
3301
;align 4
1 ha 3302
;
75 diamond 3303
;read_floppy_file:
1 ha 3304
;
75 diamond 3305
;; as input
3306
;;
3307
;; eax pointer to file
3308
;; ebx file lenght
3309
;; ecx start 512 byte block number
3310
;; edx number of blocks to read
3311
;; esi pointer to return/work area (atleast 20 000 bytes)
3312
;;
3313
;;
3314
;; on return
3315
;;
3316
;; eax = 0 command succesful
3317
;;       1 no fd base and/or partition defined
3318
;;       2 yet unsupported FS
3319
;;       3 unknown FS
3320
;;       4 partition not defined at hd
3321
;;       5 file not found
3322
;; ebx = size of file
1 ha 3323
;
379 serge 3324
;     mov   edi,[TASK_BASE]
75 diamond 3325
;     add   edi,0x10
3326
;     add   esi,[edi]
3327
;     add   eax,[edi]
1 ha 3328
;
75 diamond 3329
;     pushad
3330
;     mov  edi,esi
3331
;     add  edi,1024
3332
;     mov  esi,0x100000+19*512
3333
;     sub  ecx,1
3334
;     shl  ecx,9
3335
;     add  esi,ecx
3336
;     shl  edx,9
3337
;     mov  ecx,edx
3338
;     cld
3339
;     rep  movsb
3340
;     popad
3341
;
3342
;     mov   [esp+36],eax
3343
;     mov   [esp+24],ebx
3344
;     ret
1 ha 3345
 
3346
 
3347
 
3348
align 4
3349
 
3350
sys_programirq:
1551 art_zh 3351
	; removed
3352
    mov   dword [esp+32], 1	; operation failed
1 ha 3353
    ret
3354
 
3355
 
3356
align 4
3357
 
3358
get_irq_data:
1551 art_zh 3359
	; removed
3360
     mov   dword [esp+32], -1
1 ha 3361
     ret
3362
 
3363
 
3364
set_io_access_rights:
1551 art_zh 3365
	;removed
1 ha 3366
     ret
1551 art_zh 3367
 
1 ha 3368
r_f_port_area:
1551 art_zh 3369
	; removed; always returns 0
1 ha 3370
     xor   eax, eax
3371
     ret
3372
 
3373
 
3374
reserve_free_irq:
3375
 
765 Rus 3376
     xor   esi, esi
3377
     inc   esi
3378
     cmp   ecx, 16
3379
     jae   ril1
1 ha 3380
 
769 Rus 3381
     push  ecx
765 Rus 3382
     lea   ecx, [irq_owner + 4 * ecx]
3383
     mov   edx, [ecx]
3384
     mov   eax, [TASK_BASE]
3385
     mov   edi, [eax + TASKDATA.pid]
769 Rus 3386
     pop   eax
765 Rus 3387
     dec   ebx
3388
     jnz   reserve_irq
1 ha 3389
 
765 Rus 3390
     cmp   edx, edi
3391
     jne   ril1
3392
     dec   esi
3393
     mov   [ecx], esi
3394
 
3395
     jmp   ril1
3396
 
1 ha 3397
  reserve_irq:
3398
 
765 Rus 3399
     cmp   dword [ecx], 0
3400
     jne   ril1
1 ha 3401
 
769 Rus 3402
     mov   ebx, [f_irqs + 4 * eax]
3403
 
774 Rus 3404
     stdcall attach_int_handler, eax, ebx, dword 0
769 Rus 3405
 
765 Rus 3406
     mov   [ecx], edi
769 Rus 3407
 
765 Rus 3408
     dec   esi
1 ha 3409
   ril1:
765 Rus 3410
     mov   [esp+32], esi ; return in eax
1 ha 3411
     ret
3412
 
769 Rus 3413
iglobal
3414
f_irqs:
3415
     dd 0x0
3416
     dd 0x0
3417
     dd p_irq2
3418
     dd p_irq3
3419
     dd p_irq4
3420
     dd p_irq5
3421
     dd p_irq6
3422
     dd p_irq7
3423
     dd p_irq8
3424
     dd p_irq9
3425
     dd p_irq10
3426
     dd p_irq11
3427
     dd 0x0
3428
     dd 0x0
3429
     dd p_irq14
3430
     dd p_irq15
3431
 
3432
endg
3433
 
1 ha 3434
drawbackground:
33 mario79 3435
       inc   [mouse_pause]
381 serge 3436
       cmp   [SCR_MODE],word 0x12
117 mario79 3437
       je   dbrv20
1 ha 3438
     dbrv12:
381 serge 3439
       cmp  [SCR_MODE],word 0100000000000000b
1 ha 3440
       jge  dbrv20
1508 art_zh 3441
;       cmp  [SCR_MODE],word 0x13
3442
;       je   dbrv20
3443
;       call  vesa12_drawbackground
33 mario79 3444
       dec   [mouse_pause]
36 mario79 3445
       call   [draw_pointer]
1 ha 3446
       ret
3447
     dbrv20:
527 diamond 3448
       cmp   [BgrDrawMode],dword 1
1 ha 3449
       jne   bgrstr
3450
       call  vesa20_drawbackground_tiled
33 mario79 3451
       dec   [mouse_pause]
36 mario79 3452
       call   [draw_pointer]
1 ha 3453
       ret
3454
     bgrstr:
3455
       call  vesa20_drawbackground_stretch
33 mario79 3456
       dec   [mouse_pause]
36 mario79 3457
       call   [draw_pointer]
1 ha 3458
       ret
3459
 
75 diamond 3460
align 4
1 ha 3461
 
1055 Galkov 3462
syscall_putimage:                       ; PutImage
1 ha 3463
sys_putimage:
53 mikedld 3464
     test  ecx,0x80008000
3465
     jnz   .exit
3466
     test  ecx,0x0000FFFF
3467
     jz    .exit
3468
     test  ecx,0xFFFF0000
3469
     jnz   @f
3470
  .exit:
3471
     ret
3472
 @@:
1055 Galkov 3473
        mov     edi,[current_slot]
3474
        add     dx,word[edi+APPDATA.wnd_clientbox.top]
3475
        rol     edx,16
3476
        add     dx,word[edi+APPDATA.wnd_clientbox.left]
3477
        rol     edx,16
114 mikedld 3478
  .forced:
1055 Galkov 3479
        push    ebp esi 0
3480
        mov     ebp, putimage_get24bpp
3481
        mov     esi, putimage_init24bpp
283 diamond 3482
sys_putimage_bpp:
1508 art_zh 3483
;        cmp     [SCR_MODE], word 0x12
3484
;        jz      @f   ;.doit
3485
;        mov     eax, vesa12_putimage
3486
;        cmp     [SCR_MODE], word 0100000000000000b
3487
;        jae     @f
3488
;        cmp     [SCR_MODE], word 0x13
3489
;        jnz     .doit
3490
;@@:
1055 Galkov 3491
        mov     eax, vesa20_putimage
75 diamond 3492
.doit:
1055 Galkov 3493
        inc     [mouse_pause]
3494
        call    eax
3495
        dec     [mouse_pause]
3496
        pop     ebp esi ebp
3497
        jmp     [draw_pointer]
1495 Lrz 3498
align 4
283 diamond 3499
sys_putimage_palette:
3500
; ebx = pointer to image
3501
; ecx = [xsize]*65536 + [ysize]
3502
; edx = [xstart]*65536 + [ystart]
314 diamond 3503
; esi = number of bits per pixel, must be 8, 24 or 32
283 diamond 3504
; edi = pointer to palette
314 diamond 3505
; ebp = row delta
1055 Galkov 3506
        mov     eax, [CURRENT_TASK]
3507
        shl     eax, 8
3508
        add     dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.top]
3509
        rol     edx, 16
3510
        add     dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.left]
3511
        rol     edx, 16
283 diamond 3512
.forced:
1055 Galkov 3513
        cmp     esi, 1
3514
        jnz     @f
3515
        push    edi
3516
        mov     eax, [edi+4]
3517
        sub     eax, [edi]
3518
        push    eax
3519
        push    dword [edi]
3520
        push    0ffffff80h
3521
        mov     edi, esp
3522
        call    put_mono_image
3523
        add     esp, 12
3524
        pop     edi
3525
        ret
911 diamond 3526
@@:
1055 Galkov 3527
        cmp     esi, 2
3528
        jnz     @f
3529
        push    edi
3530
        push    0ffffff80h
3531
        mov     edi, esp
3532
        call    put_2bit_image
3533
        pop     eax
3534
        pop     edi
3535
        ret
911 diamond 3536
@@:
1055 Galkov 3537
        cmp     esi, 4
3538
        jnz     @f
3539
        push    edi
3540
        push    0ffffff80h
3541
        mov     edi, esp
3542
        call    put_4bit_image
3543
        pop     eax
3544
        pop     edi
3545
        ret
314 diamond 3546
@@:
1055 Galkov 3547
        push    ebp esi ebp
3548
        cmp     esi, 8
3549
        jnz     @f
3550
        mov     ebp, putimage_get8bpp
3551
        mov     esi, putimage_init8bpp
3552
        jmp     sys_putimage_bpp
918 diamond 3553
@@:
1055 Galkov 3554
        cmp     esi, 15
3555
        jnz     @f
3556
        mov     ebp, putimage_get15bpp
3557
        mov     esi, putimage_init15bpp
3558
        jmp     sys_putimage_bpp
906 diamond 3559
@@:
1055 Galkov 3560
        cmp     esi, 16
3561
        jnz     @f
3562
        mov     ebp, putimage_get16bpp
3563
        mov     esi, putimage_init16bpp
3564
        jmp     sys_putimage_bpp
842 diamond 3565
@@:
1055 Galkov 3566
        cmp     esi, 24
3567
        jnz     @f
3568
        mov     ebp, putimage_get24bpp
3569
        mov     esi, putimage_init24bpp
3570
        jmp     sys_putimage_bpp
314 diamond 3571
@@:
1055 Galkov 3572
        cmp     esi, 32
3573
        jnz     @f
3574
        mov     ebp, putimage_get32bpp
3575
        mov     esi, putimage_init32bpp
3576
        jmp     sys_putimage_bpp
314 diamond 3577
@@:
1055 Galkov 3578
        pop     ebp esi ebp
3579
        ret
283 diamond 3580
 
911 diamond 3581
put_mono_image:
1055 Galkov 3582
        push    ebp esi ebp
3583
        mov     ebp, putimage_get1bpp
3584
        mov     esi, putimage_init1bpp
3585
        jmp     sys_putimage_bpp
918 diamond 3586
put_2bit_image:
1055 Galkov 3587
        push    ebp esi ebp
3588
        mov     ebp, putimage_get2bpp
3589
        mov     esi, putimage_init2bpp
3590
        jmp     sys_putimage_bpp
911 diamond 3591
put_4bit_image:
1055 Galkov 3592
        push    ebp esi ebp
3593
        mov     ebp, putimage_get4bpp
3594
        mov     esi, putimage_init4bpp
3595
        jmp     sys_putimage_bpp
911 diamond 3596
 
283 diamond 3597
putimage_init24bpp:
1055 Galkov 3598
        lea     eax, [eax*3]
283 diamond 3599
putimage_init8bpp:
1055 Galkov 3600
        ret
283 diamond 3601
 
911 diamond 3602
align 16
283 diamond 3603
putimage_get24bpp:
1055 Galkov 3604
        movzx   eax, byte [esi+2]
3605
        shl     eax, 16
3606
        mov     ax, [esi]
3607
        add     esi, 3
3608
        ret     4
911 diamond 3609
align 16
283 diamond 3610
putimage_get8bpp:
1055 Galkov 3611
        movzx   eax, byte [esi]
3612
        push    edx
3613
        mov     edx, [esp+8]
3614
        mov     eax, [edx+eax*4]
3615
        pop     edx
3616
        inc     esi
3617
        ret     4
283 diamond 3618
 
911 diamond 3619
putimage_init1bpp:
1055 Galkov 3620
        add     eax, ecx
3621
        push    ecx
3622
        add     eax, 7
3623
        add     ecx, 7
3624
        shr     eax, 3
3625
        shr     ecx, 3
3626
        sub     eax, ecx
3627
        pop     ecx
3628
        ret
911 diamond 3629
align 16
3630
putimage_get1bpp:
1055 Galkov 3631
        push    edx
3632
        mov     edx, [esp+8]
3633
        mov     al, [edx]
3634
        add     al, al
3635
        jnz     @f
3636
        lodsb
3637
        adc     al, al
911 diamond 3638
@@:
1055 Galkov 3639
        mov     [edx], al
3640
        sbb     eax, eax
3641
        and     eax, [edx+8]
3642
        add     eax, [edx+4]
3643
        pop     edx
3644
        ret     4
911 diamond 3645
 
918 diamond 3646
putimage_init2bpp:
1055 Galkov 3647
        add     eax, ecx
3648
        push    ecx
3649
        add     ecx, 3
3650
        add     eax, 3
3651
        shr     ecx, 2
3652
        shr     eax, 2
3653
        sub     eax, ecx
3654
        pop     ecx
3655
        ret
918 diamond 3656
align 16
3657
putimage_get2bpp:
1055 Galkov 3658
        push    edx
3659
        mov     edx, [esp+8]
3660
        mov     al, [edx]
3661
        mov     ah, al
3662
        shr     al, 6
3663
        shl     ah, 2
3664
        jnz     .nonewbyte
3665
        lodsb
3666
        mov     ah, al
3667
        shr     al, 6
3668
        shl     ah, 2
3669
        add     ah, 1
918 diamond 3670
.nonewbyte:
1055 Galkov 3671
        mov     [edx], ah
3672
        mov     edx, [edx+4]
3673
        movzx   eax, al
3674
        mov     eax, [edx+eax*4]
3675
        pop     edx
3676
        ret     4
918 diamond 3677
 
911 diamond 3678
putimage_init4bpp:
1055 Galkov 3679
        add     eax, ecx
3680
        push    ecx
3681
        add     ecx, 1
3682
        add     eax, 1
3683
        shr     ecx, 1
3684
        shr     eax, 1
3685
        sub     eax, ecx
3686
        pop     ecx
3687
        ret
911 diamond 3688
align 16
3689
putimage_get4bpp:
1055 Galkov 3690
        push    edx
3691
        mov     edx, [esp+8]
3692
        add     byte [edx], 80h
3693
        jc      @f
3694
        movzx   eax, byte [edx+1]
3695
        mov     edx, [edx+4]
3696
        and     eax, 0x0F
3697
        mov     eax, [edx+eax*4]
3698
        pop     edx
3699
        ret     4
911 diamond 3700
@@:
1055 Galkov 3701
        movzx   eax, byte [esi]
3702
        add     esi, 1
3703
        mov     [edx+1], al
3704
        shr     eax, 4
3705
        mov     edx, [edx+4]
3706
        mov     eax, [edx+eax*4]
3707
        pop     edx
3708
        ret     4
911 diamond 3709
 
314 diamond 3710
putimage_init32bpp:
1055 Galkov 3711
        shl     eax, 2
3712
        ret
911 diamond 3713
align 16
314 diamond 3714
putimage_get32bpp:
1055 Galkov 3715
        lodsd
3716
        ret     4
314 diamond 3717
 
906 diamond 3718
putimage_init15bpp:
911 diamond 3719
putimage_init16bpp:
1055 Galkov 3720
        add     eax, eax
3721
        ret
911 diamond 3722
align 16
906 diamond 3723
putimage_get15bpp:
842 diamond 3724
; 0RRRRRGGGGGBBBBB -> 00000000RRRRR000GGGGG000BBBBB000
1055 Galkov 3725
        push    ecx edx
3726
        movzx   eax, word [esi]
3727
        add     esi, 2
3728
        mov     ecx, eax
3729
        mov     edx, eax
3730
        and     eax, 0x1F
3731
        and     ecx, 0x1F shl 5
3732
        and     edx, 0x1F shl 10
3733
        shl     eax, 3
3734
        shl     ecx, 6
3735
        shl     edx, 9
3736
        or      eax, ecx
3737
        or      eax, edx
3738
        pop     edx ecx
3739
        ret     4
906 diamond 3740
 
911 diamond 3741
align 16
906 diamond 3742
putimage_get16bpp:
3743
; RRRRRGGGGGGBBBBB -> 00000000RRRRR000GGGGGG00BBBBB000
1055 Galkov 3744
        push    ecx edx
3745
        movzx   eax, word [esi]
3746
        add     esi, 2
3747
        mov     ecx, eax
3748
        mov     edx, eax
3749
        and     eax, 0x1F
3750
        and     ecx, 0x3F shl 5
3751
        and     edx, 0x1F shl 11
3752
        shl     eax, 3
3753
        shl     ecx, 5
3754
        shl     edx, 8
3755
        or      eax, ecx
3756
        or      eax, edx
3757
        pop     edx ecx
3758
        ret     4
842 diamond 3759
 
1 ha 3760
; eax x beginning
3761
; ebx y beginning
3762
; ecx x end
1055 Galkov 3763
        ; edx y end
1 ha 3764
; edi color
3765
 
3766
__sys_drawbar:
1055 Galkov 3767
        mov     esi,[current_slot]
3768
        add     eax,[esi+APPDATA.wnd_clientbox.left]
3769
        add     ecx,[esi+APPDATA.wnd_clientbox.left]
3770
        add     ebx,[esi+APPDATA.wnd_clientbox.top]
3771
        add     edx,[esi+APPDATA.wnd_clientbox.top]
114 mikedld 3772
  .forced:
33 mario79 3773
    inc   [mouse_pause]
283 diamond 3774
;        call    [disable_mouse]
381 serge 3775
    cmp   [SCR_MODE],word 0x12
1055 Galkov 3776
    je   dbv20
1 ha 3777
   sdbv20:
1508 art_zh 3778
;    cmp  [SCR_MODE],word 0100000000000000b
3779
;    jge  dbv20
3780
;    cmp  [SCR_MODE],word 0x13
3781
;    je   dbv20
3782
;    call vesa12_drawbar
3783
;    dec   [mouse_pause]
3784
;    call   [draw_pointer]
3785
;    ret
1 ha 3786
  dbv20:
3787
    call vesa20_drawbar
33 mario79 3788
    dec   [mouse_pause]
36 mario79 3789
    call   [draw_pointer]
1 ha 3790
    ret
3791
 
3792
 
3793
 
3794
kb_read:
3795
 
1055 Galkov 3796
        push    ecx edx
1 ha 3797
 
1055 Galkov 3798
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 3799
      kr_loop:
1055 Galkov 3800
        in      al,0x64
3801
        test    al,1
3802
        jnz     kr_ready
3803
        loop    kr_loop
3804
        mov     ah,1
3805
        jmp     kr_exit
1 ha 3806
      kr_ready:
1055 Galkov 3807
        push    ecx
3808
        mov     ecx,32
1 ha 3809
      kr_delay:
1055 Galkov 3810
        loop    kr_delay
3811
        pop     ecx
3812
        in      al,0x60
3813
        xor     ah,ah
1 ha 3814
      kr_exit:
3815
 
1055 Galkov 3816
        pop     edx ecx
1 ha 3817
 
1055 Galkov 3818
        ret
1 ha 3819
 
3820
 
3821
kb_write:
3822
 
1055 Galkov 3823
        push    ecx edx
1 ha 3824
 
1055 Galkov 3825
        mov     dl,al
265 diamond 3826
;        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
3827
;      kw_loop1:
3828
;        in      al,0x64
3829
;        test    al,0x20
3830
;        jz      kw_ok1
3831
;        loop    kw_loop1
3832
;        mov     ah,1
3833
;        jmp     kw_exit
3834
;      kw_ok1:
1055 Galkov 3835
        in      al,0x60
3836
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 3837
      kw_loop:
1055 Galkov 3838
        in      al,0x64
3839
        test    al,2
3840
        jz      kw_ok
3841
        loop    kw_loop
3842
        mov     ah,1
3843
        jmp     kw_exit
1 ha 3844
      kw_ok:
1055 Galkov 3845
        mov     al,dl
3846
        out     0x60,al
3847
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 3848
      kw_loop3:
1055 Galkov 3849
        in      al,0x64
3850
        test    al,2
3851
        jz      kw_ok3
3852
        loop    kw_loop3
3853
        mov     ah,1
3854
        jmp     kw_exit
1 ha 3855
      kw_ok3:
1055 Galkov 3856
        mov     ah,8
1 ha 3857
      kw_loop4:
1055 Galkov 3858
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 3859
      kw_loop5:
1055 Galkov 3860
        in      al,0x64
3861
        test    al,1
3862
        jnz     kw_ok4
3863
        loop    kw_loop5
3864
        dec     ah
3865
        jnz     kw_loop4
1 ha 3866
      kw_ok4:
1055 Galkov 3867
        xor     ah,ah
1 ha 3868
      kw_exit:
3869
 
1055 Galkov 3870
        pop     edx ecx
1 ha 3871
 
1055 Galkov 3872
        ret
1 ha 3873
 
3874
 
3875
kb_cmd:
3876
 
1055 Galkov 3877
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 3878
      c_wait:
1055 Galkov 3879
        in      al,0x64
3880
        test    al,2
3881
        jz      c_send
3882
        loop    c_wait
3883
        jmp     c_error
1 ha 3884
      c_send:
1055 Galkov 3885
        mov     al,bl
3886
        out     0x64,al
3887
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 3888
      c_accept:
1055 Galkov 3889
        in      al,0x64
3890
        test    al,2
3891
        jz      c_ok
3892
        loop    c_accept
1 ha 3893
      c_error:
1055 Galkov 3894
        mov     ah,1
3895
        jmp     c_exit
1 ha 3896
      c_ok:
1055 Galkov 3897
        xor     ah,ah
1 ha 3898
      c_exit:
1055 Galkov 3899
        ret
1 ha 3900
 
3901
 
3902
setmouse:  ; set mousepicture -pointer
1055 Galkov 3903
           ; ps2 mouse enable
1 ha 3904
 
381 serge 3905
     mov     [MOUSE_PICTURE],dword mousepointer
1 ha 3906
 
3907
     cli
3908
 
3909
     ret
3910
 
1055 Galkov 3911
if used _rdtsc
1 ha 3912
_rdtsc:
164 serge 3913
     bt [cpu_caps], CAPS_TSC
3914
     jnc ret_rdtsc
1 ha 3915
     rdtsc
3916
     ret
3917
   ret_rdtsc:
3918
     mov   edx,0xffffffff
3919
     mov   eax,0xffffffff
3920
     ret
1055 Galkov 3921
end if
1 ha 3922
 
3923
rerouteirqs:
3924
 
1055 Galkov 3925
        cli
1 ha 3926
 
1055 Galkov 3927
        mov     al,0x11         ;  icw4, edge triggered
3928
        out     0x20,al
3929
        call    pic_delay
3930
        out     0xA0,al
3931
        call    pic_delay
1 ha 3932
 
1055 Galkov 3933
        mov     al,0x20         ;  generate 0x20 +
3934
        out     0x21,al
3935
        call    pic_delay
3936
        mov     al,0x28         ;  generate 0x28 +
3937
        out     0xA1,al
3938
        call    pic_delay
1 ha 3939
 
1055 Galkov 3940
        mov     al,0x04         ;  slave at irq2
3941
        out     0x21,al
3942
        call    pic_delay
3943
        mov     al,0x02         ;  at irq9
3944
        out     0xA1,al
3945
        call    pic_delay
1 ha 3946
 
1055 Galkov 3947
        mov     al,0x01         ;  8086 mode
3948
        out     0x21,al
3949
        call    pic_delay
3950
        out     0xA1,al
3951
        call    pic_delay
1 ha 3952
 
1055 Galkov 3953
        mov     al,255          ; mask all irq's
3954
        out     0xA1,al
3955
        call    pic_delay
3956
        out     0x21,al
3957
        call    pic_delay
1 ha 3958
 
1055 Galkov 3959
        mov     ecx,0x1000
3960
        cld
3961
picl1:  call    pic_delay
3962
        loop    picl1
1 ha 3963
 
1055 Galkov 3964
        mov     al,255          ; mask all irq's
3965
        out     0xA1,al
3966
        call    pic_delay
3967
        out     0x21,al
3968
        call    pic_delay
1 ha 3969
 
1055 Galkov 3970
        cli
1 ha 3971
 
1055 Galkov 3972
        ret
1 ha 3973
 
3974
 
3975
pic_delay:
3976
 
1055 Galkov 3977
        jmp     pdl1
3978
pdl1:   ret
1 ha 3979
 
3980
 
3981
sys_msg_board_str:
3982
 
3983
     pushad
3984
   @@:
3985
     cmp    [esi],byte 0
3986
     je     @f
3987
     mov    eax,1
3988
     movzx  ebx,byte [esi]
3989
     call   sys_msg_board
3990
     inc    esi
3991
     jmp    @b
3992
   @@:
3993
     popad
3994
     ret
3995
 
709 diamond 3996
sys_msg_board_byte:
3997
; in: al = byte to display
3998
; out: nothing
3999
; destroys: nothing
1055 Galkov 4000
        pushad
4001
        mov     ecx, 2
4002
        shl     eax, 24
4003
        jmp     @f
709 diamond 4004
 
4005
sys_msg_board_word:
4006
; in: ax = word to display
4007
; out: nothing
4008
; destroys: nothing
1055 Galkov 4009
        pushad
4010
        mov     ecx, 4
4011
        shl     eax, 16
4012
        jmp     @f
709 diamond 4013
 
4014
sys_msg_board_dword:
4015
; in: eax = dword to display
4016
; out: nothing
4017
; destroys: nothing
1055 Galkov 4018
        pushad
4019
        mov     ecx, 8
709 diamond 4020
@@:
1055 Galkov 4021
        push    ecx
4022
        rol     eax, 4
4023
        push    eax
4024
        and     al, 0xF
4025
        cmp     al, 10
4026
        sbb     al, 69h
4027
        das
4028
        mov     bl, al
4029
        xor     eax, eax
4030
        inc     eax
4031
        call    sys_msg_board
4032
        pop     eax
4033
        pop     ecx
4034
        loop    @b
4035
        popad
4036
        ret
709 diamond 4037
 
1 ha 4038
uglobal
373 mikedld 4039
  msg_board_data: times 4096 db 0
1 ha 4040
  msg_board_count dd 0x0
4041
endg
4042
 
4043
sys_msg_board:
4044
 
4045
; eax=1 : write :  bl byte to write
4046
; eax=2 :  read :  ebx=0 -> no data, ebx=1 -> data in al
4047
 
1055 Galkov 4048
        mov     ecx, [msg_board_count]
4049
        cmp     eax, 1
4050
        jne     .smbl1
1 ha 4051
 
1043 hidnplayr 4052
if defined debug_com_base
1 ha 4053
 
1055 Galkov 4054
        push    dx ax
1043 hidnplayr 4055
 
1055 Galkov 4056
       @@:                              ; Wait for empty transmit register  (yes, this slows down system..)
4057
        mov     dx, debug_com_base+5
4058
        in      al, dx
4059
        test    al, 1 shl 5
4060
        jz      @r
1043 hidnplayr 4061
 
1055 Galkov 4062
        mov     dx, debug_com_base      ; Output the byte
4063
        mov     al, bl
4064
        out     dx, al
1043 hidnplayr 4065
 
1055 Galkov 4066
        pop     ax dx
1043 hidnplayr 4067
 
4068
end if
4069
 
1055 Galkov 4070
        mov     [msg_board_data+ecx],bl
4071
        inc     ecx
4072
        and     ecx, 4095
4073
        mov     [msg_board_count], ecx
4074
        mov     [check_idle_semaphore], 5
4075
        ret
671 Ghost 4076
.smbl1:
1055 Galkov 4077
        cmp     eax, 2
4078
        jne     .smbl2
4079
        test    ecx, ecx
4080
        jz      .smbl21
4081
        mov     eax, msg_board_data+1
4082
        mov     ebx, msg_board_data
4083
        movzx   edx, byte [ebx]
4084
        call    memmove
4085
        dec     [msg_board_count]
4086
        mov     [esp + 36], edx ;eax
4087
        mov     [esp + 24], dword 1
4088
        ret
671 Ghost 4089
.smbl21:
1055 Galkov 4090
        mov     [esp+36], ecx
4091
        mov     [esp+24], ecx
671 Ghost 4092
.smbl2:
1055 Galkov 4093
        ret
1 ha 4094
 
1494 Lrz 4095
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4096
;; 66 sys function.                                                ;;
4097
;; in eax=66,ebx in [0..5],ecx,edx                                 ;;
4098
;; out eax                                                         ;;
4099
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4100
iglobal
4101
align 4
4102
f66call:
4103
           dd sys_process_def.1   ; 1 = set keyboard mode
4104
           dd sys_process_def.2   ; 2 = get keyboard mode
4105
           dd sys_process_def.3   ; 3 = get keyboard ctrl, alt, shift
4106
           dd sys_process_def.4
4107
           dd sys_process_def.5
4108
endg
1 ha 4109
 
4110
 
1494 Lrz 4111
 
4112
 
1 ha 4113
sys_process_def:
1494 Lrz 4114
	dec	ebx
4115
	cmp	ebx,5
4116
	jae	.not_support	;if >=6 then or eax,-1
4117
 
1055 Galkov 4118
        mov     edi, [CURRENT_TASK]
1494 Lrz 4119
	jmp	dword [f66call+ebx*4]
1 ha 4120
 
1494 Lrz 4121
.not_support:
4122
	or	eax,-1
4123
	ret
1 ha 4124
 
1494 Lrz 4125
.1:
1 ha 4126
     shl   edi,8
1494 Lrz 4127
     mov   [edi+SLOT_BASE + APPDATA.keyboard_mode],cl
1 ha 4128
 
4129
     ret
4130
 
1494 Lrz 4131
.2:				; 2 = get keyboard mode
1 ha 4132
     shl   edi,8
380 serge 4133
     movzx eax, byte [SLOT_BASE+edi + APPDATA.keyboard_mode]
1494 Lrz 4134
     mov   [esp+32],eax
1 ha 4135
     ret
4136
;     xor   eax,eax
4137
;     movzx eax,byte [shift]
4138
;     movzx ebx,byte [ctrl]
4139
;     shl   ebx,2
4140
;     add   eax,ebx
4141
;     movzx ebx,byte [alt]
4142
;     shl   ebx,3
4143
;     add   eax,ebx
1494 Lrz 4144
.3:				;3 = get keyboard ctrl, alt, shift
1 ha 4145
 ;// mike.dld [
4146
     mov   eax, [kb_state]
4147
 ;// mike.dld ]
1494 Lrz 4148
     mov   [esp+32],eax
1 ha 4149
     ret
4150
 
1494 Lrz 4151
.4:
1055 Galkov 4152
        mov     eax, hotkey_list
92 diamond 4153
@@:
1055 Galkov 4154
        cmp     dword [eax+8], 0
4155
        jz      .found_free
4156
        add     eax, 16
4157
        cmp     eax, hotkey_list+16*256
4158
        jb      @b
1494 Lrz 4159
        mov     dword [esp+32], 1
1055 Galkov 4160
        ret
92 diamond 4161
.found_free:
1055 Galkov 4162
        mov     [eax+8], edi
1494 Lrz 4163
        mov     [eax+4], edx
4164
        movzx   ecx, cl
4165
        lea     ecx, [hotkey_scancodes+ecx*4]
4166
        mov     edx, [ecx]
4167
        mov     [eax], edx
4168
        mov     [ecx], eax
4169
        mov     [eax+12], ecx
1055 Galkov 4170
        jecxz   @f
1494 Lrz 4171
        mov     [edx+12], eax
92 diamond 4172
@@:
1494 Lrz 4173
        and     dword [esp+32], 0
1055 Galkov 4174
        ret
92 diamond 4175
 
1494 Lrz 4176
.5:
4177
        movzx   ebx, cl
1055 Galkov 4178
        lea     ebx, [hotkey_scancodes+ebx*4]
4179
        mov     eax, [ebx]
92 diamond 4180
.scan:
1055 Galkov 4181
        test    eax, eax
4182
        jz      .notfound
4183
        cmp     [eax+8], edi
4184
        jnz     .next
1494 Lrz 4185
        cmp     [eax+4], edx
1055 Galkov 4186
        jz      .found
92 diamond 4187
.next:
1055 Galkov 4188
        mov     eax, [eax]
4189
        jmp     .scan
92 diamond 4190
.notfound:
1494 Lrz 4191
        mov     dword [esp+32], 1
1055 Galkov 4192
        ret
92 diamond 4193
.found:
1055 Galkov 4194
        mov     ecx, [eax]
4195
        jecxz   @f
4196
        mov     edx, [eax+12]
4197
        mov     [ecx+12], edx
92 diamond 4198
@@:
1055 Galkov 4199
        mov     ecx, [eax+12]
4200
        mov     edx, [eax]
4201
        mov     [ecx], edx
4202
        xor     edx, edx
4203
        mov     [eax+4], edx
4204
        mov     [eax+8], edx
4205
        mov     [eax+12], edx
4206
        mov     [eax], edx
1494 Lrz 4207
        mov     [esp+32], edx
1055 Galkov 4208
        ret
92 diamond 4209
 
1497 Lrz 4210
 
4211
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4212
;; 61 sys function.                                                ;;
4213
;; in eax=61,ebx in [1..3]                                         ;;
4214
;; out eax                                                         ;;
4215
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4216
iglobal
1 ha 4217
align 4
1497 Lrz 4218
f61call:
4219
           dd sys_gs.1   ; resolution
4220
           dd sys_gs.2   ; bits per pixel
4221
           dd sys_gs.3   ; bytes per scanline
4222
endg
1 ha 4223
 
1497 Lrz 4224
 
4225
align 4
4226
 
1055 Galkov 4227
sys_gs:                         ; direct screen access
1497 Lrz 4228
	dec	ebx
4229
	cmp	ebx,2
4230
	ja	.not_support
4231
	jmp	dword [f61call+ebx*4]
4232
.not_support:
4233
	or  [esp+32],dword -1
4234
        ret
1 ha 4235
 
1497 Lrz 4236
 
4237
.1:                             ; resolution
753 serge 4238
     mov  eax,[Screen_Max_X]
1 ha 4239
     shl  eax,16
753 serge 4240
     mov  ax,[Screen_Max_Y]
1 ha 4241
     add  eax,0x00010001
1497 Lrz 4242
     mov  [esp+32],eax
1 ha 4243
     ret
1497 Lrz 4244
.2:				; bits per pixel
381 serge 4245
     movzx eax,byte [ScreenBPP]
1497 Lrz 4246
     mov   [esp+32],eax
1 ha 4247
     ret
1497 Lrz 4248
.3:                             ; bytes per scanline
381 serge 4249
     mov   eax,[BytesPerScanLine]
1497 Lrz 4250
     mov   [esp+32],eax
1 ha 4251
     ret
4252
 
4253
 
1587 Lrz 4254
;align 4 ; PCI functions
4255
;
1599 art_zh 4256
sys_pci:
1 ha 4257
 
1599 art_zh 4258
     call  pci_api
4259
     mov   [esp+36],eax
4260
     ret
1 ha 4261
 
1599 art_zh 4262
 
1 ha 4263
align 4  ;  system functions
4264
 
1055 Galkov 4265
syscall_setpixel:                       ; SetPixel
1 ha 4266
 
1055 Galkov 4267
        mov     eax, ebx
4268
        mov     ebx, ecx
4269
        mov     ecx, edx
4270
        mov     edx, [TASK_BASE]
4271
        add     eax, [edx-twdw+WDATA.box.left]
4272
        add     ebx, [edx-twdw+WDATA.box.top]
4273
        mov     edi, [current_slot]
4274
        add     eax, [edi+APPDATA.wnd_clientbox.left]
4275
        add     ebx, [edi+APPDATA.wnd_clientbox.top]
4276
        xor     edi, edi ; no force
684 diamond 4277
;       mov     edi, 1
1300 serge 4278
        call    [_display.disable_mouse]
1055 Galkov 4279
        jmp     [putpixel]
1 ha 4280
 
4281
align 4
4282
 
1055 Galkov 4283
syscall_writetext:                      ; WriteText
1 ha 4284
 
1055 Galkov 4285
        mov   eax,[TASK_BASE]
4286
        mov   ebp,[eax-twdw+WDATA.box.left]
4287
        push  esi
4288
        mov   esi,[current_slot]
4289
        add   ebp,[esi+APPDATA.wnd_clientbox.left]
4290
        shl   ebp,16
4291
        add   ebp,[eax-twdw+WDATA.box.top]
4292
        add   bp,word[esi+APPDATA.wnd_clientbox.top]
4293
        pop   esi
4294
        add   ebx,ebp
4295
        mov   eax,edi
4296
        xor   edi,edi
4297
        jmp   dtext
1 ha 4298
 
4299
align 4
4300
 
1055 Galkov 4301
syscall_openramdiskfile:                ; OpenRamdiskFile
1 ha 4302
 
1055 Galkov 4303
        mov     eax, ebx
4304
        mov     ebx, ecx
4305
        mov     ecx, edx
4306
        mov     edx, esi
4307
        mov     esi, 12
4308
        call    fileread
4309
        mov     [esp+32], eax
4310
        ret
1 ha 4311
 
4312
align 4
4313
 
1055 Galkov 4314
syscall_drawrect:                       ; DrawRect
1 ha 4315
 
1055 Galkov 4316
        mov     edi, edx ; color + gradient
4317
        and     edi, 0x80FFFFFF
4318
        test    bx, bx  ; x.size
4319
        je      .drectr
4320
        test    cx, cx ; y.size
4321
        je      .drectr
1 ha 4322
 
1055 Galkov 4323
        mov     eax, ebx ; bad idea
4324
        mov     ebx, ecx
1 ha 4325
 
1055 Galkov 4326
        movzx   ecx, ax ; ecx - x.size
4327
        shr     eax, 16 ; eax - x.coord
4328
        movzx   edx, bx ; edx - y.size
4329
        shr     ebx, 16 ; ebx - y.coord
4330
        mov     esi, [current_slot]
1 ha 4331
 
1055 Galkov 4332
        add     eax, [esi + APPDATA.wnd_clientbox.left]
4333
        add     ebx, [esi + APPDATA.wnd_clientbox.top]
4334
        add     ecx, eax
4335
        add     edx, ebx
4336
        jmp     [drawbar]
671 Ghost 4337
.drectr:
1055 Galkov 4338
        ret
1 ha 4339
 
4340
align 4
1055 Galkov 4341
syscall_getscreensize:                  ; GetScreenSize
4342
        mov     ax, [Screen_Max_X]
4343
        shl     eax, 16
4344
        mov     ax, [Screen_Max_Y]
4345
        mov     [esp + 32], eax
4346
        ret
1 ha 4347
 
671 Ghost 4348
align 4
4349
 
1 ha 4350
 
4351
align 4
4352
 
1055 Galkov 4353
syscall_getpixel:                       ; GetPixel
753 serge 4354
     mov   ecx, [Screen_Max_X]
1 ha 4355
     inc   ecx
671 Ghost 4356
     xor   edx, edx
4357
     mov   eax, ebx
1 ha 4358
     div   ecx
671 Ghost 4359
     mov   ebx, edx
4360
     xchg  eax, ebx
4361
     call  dword [GETPIXEL] ; eax - x, ebx - y
4362
     mov   [esp + 32], ecx
1 ha 4363
     ret
4364
 
921 mario79 4365
align 4
1 ha 4366
 
921 mario79 4367
syscall_getarea:
4368
;eax = 36
1055 Galkov 4369
;ebx = pointer to bufer for img BBGGRRBBGGRR...
4370
;ecx = [size x]*65536 + [size y]
4371
;edx = [start x]*65536 + [start y]
921 mario79 4372
     pushad
1055 Galkov 4373
         inc   [mouse_pause]
927 mario79 4374
; Check of use of the hardware cursor.
1300 serge 4375
      cmp  [_display.disable_mouse],__sys_disable_mouse
1055 Galkov 4376
          jne  @f
927 mario79 4377
; Since the test for the coordinates of the mouse should not be used,
4378
; then use the call [disable_mouse] is not possible!
4379
      cmp  dword [MOUSE_VISIBLE],dword 0
4380
      jne  @f
4381
      pushf
4382
      cli
4383
      call draw_mouse_under
4384
      popf
4385
      mov  [MOUSE_VISIBLE],dword 1
4386
@@:
921 mario79 4387
     mov   edi,ebx
4388
     mov   eax,edx
4389
     shr   eax,16
4390
     mov   ebx,edx
4391
     and   ebx,0xffff
939 mario79 4392
     dec   eax
1055 Galkov 4393
           dec   ebx
921 mario79 4394
     ; eax - x, ebx - y
4395
     mov   edx,ecx
4396
 
4397
     shr   ecx,16
4398
     and   edx,0xffff
4399
     mov   esi,ecx
4400
     ; ecx - size x, edx - size y
1055 Galkov 4401
 
4402
         mov   ebp,edx
4403
         dec   ebp
927 mario79 4404
     lea   ebp,[ebp*3]
1055 Galkov 4405
 
4406
         imul  ebp,esi
4407
 
4408
         mov   esi,ecx
4409
         dec   esi
4410
         lea   esi,[esi*3]
4411
 
927 mario79 4412
     add   ebp,esi
4413
     add   ebp,edi
4414
 
4415
     add   ebx,edx
1055 Galkov 4416
 
921 mario79 4417
.start_y:
927 mario79 4418
     push  ecx edx
921 mario79 4419
.start_x:
927 mario79 4420
     push  eax ebx ecx
921 mario79 4421
     add   eax,ecx
927 mario79 4422
 
921 mario79 4423
     call  dword [GETPIXEL] ; eax - x, ebx - y
4424
 
927 mario79 4425
     mov   [ebp],cx
4426
     shr   ecx,16
4427
     mov   [ebp+2],cl
921 mario79 4428
 
1055 Galkov 4429
     pop   ecx ebx eax
927 mario79 4430
     sub   ebp,3
921 mario79 4431
     dec   ecx
4432
     jnz   .start_x
1055 Galkov 4433
         pop   edx ecx
4434
         dec   ebx
921 mario79 4435
     dec   edx
4436
     jnz   .start_y
1055 Galkov 4437
     dec        [mouse_pause]
927 mario79 4438
; Check of use of the hardware cursor.
1300 serge 4439
      cmp  [_display.disable_mouse],__sys_disable_mouse
1055 Galkov 4440
          jne  @f
4441
         call  [draw_pointer]
927 mario79 4442
@@:
921 mario79 4443
     popad
4444
     ret
4445
 
1 ha 4446
align 4
4447
 
1055 Galkov 4448
syscall_drawline:                       ; DrawLine
1 ha 4449
 
1055 Galkov 4450
        mov     edi, [TASK_BASE]
4451
        movzx   eax, word[edi-twdw+WDATA.box.left]
4452
        mov     ebp, eax
4453
        mov     esi, [current_slot]
4454
        add     ebp, [esi+APPDATA.wnd_clientbox.left]
4455
        add     ax, word[esi+APPDATA.wnd_clientbox.left]
4456
        add     ebp,ebx
4457
        shl     eax, 16
4458
        movzx   ebx, word[edi-twdw+WDATA.box.top]
4459
        add     eax, ebp
4460
        mov     ebp, ebx
4461
        add     ebp, [esi+APPDATA.wnd_clientbox.top]
4462
        add     bx, word[esi+APPDATA.wnd_clientbox.top]
4463
        add     ebp, ecx
4464
        shl     ebx, 16
4465
        xor     edi, edi
4466
        add     ebx, ebp
4467
        mov     ecx, edx
4468
        jmp     [draw_line]
1 ha 4469
 
4470
align 4
4471
 
1055 Galkov 4472
syscall_getirqowner:                    ; GetIrqOwner
742 Rus 4473
 
4474
     cmp   ebx,16
75 diamond 4475
     jae   .err
742 Rus 4476
 
774 Rus 4477
     cmp   [irq_rights + 4 * ebx], dword 2
4478
     je    .err
4479
 
742 Rus 4480
     mov   eax,[4 * ebx + irq_owner]
4481
     mov   [esp+32],eax
4482
 
1 ha 4483
     ret
75 diamond 4484
.err:
742 Rus 4485
     or    dword [esp+32], -1
75 diamond 4486
     ret
1 ha 4487
 
4488
align 4
4489
 
1055 Galkov 4490
syscall_reserveportarea:                ; ReservePortArea and FreePortArea
1 ha 4491
 
4492
     call  r_f_port_area
1306 Lrz 4493
     mov   [esp+32],eax
1 ha 4494
     ret
4495
 
4496
align 4
4497
 
1055 Galkov 4498
syscall_threads:                        ; CreateThreads
1369 Lrz 4499
; eax=1 create thread
4500
;
4501
;   ebx=thread start
4502
;   ecx=thread stack value
4503
;
4504
; on return : eax = pid
1 ha 4505
 
1369 Lrz 4506
     call  new_sys_threads
4507
 
4508
     mov   [esp+32],eax
1 ha 4509
     ret
4510
 
4511
align 4
4512
 
4513
stack_driver_stat:
4514
 
1055 Galkov 4515
     call  app_stack_handler            ; Stack status
1 ha 4516
 
4517
;     mov   [check_idle_semaphore],5    ; enable these for zero delay
4518
;     call  change_task                 ; between sent packet
4519
 
1369 Lrz 4520
     mov   [esp+32],eax
1 ha 4521
     ret
4522
 
4523
align 4
4524
 
1055 Galkov 4525
socket:                                 ; Socket interface
1 ha 4526
     call  app_socket_handler
4527
 
4528
;     mov   [check_idle_semaphore],5    ; enable these for zero delay
4529
;     call  change_task                 ; between sent packet
4530
 
4531
     mov   [esp+36],eax
4532
     mov   [esp+24],ebx
4533
     ret
4534
 
4535
align 4
4536
 
1055 Galkov 4537
read_from_hd:                           ; Read from hd - fn not in use
1 ha 4538
 
379 serge 4539
     mov   edi,[TASK_BASE]
115 poddubny 4540
     add   edi,TASKDATA.mem_start
1 ha 4541
     add   eax,[edi]
4542
     add   ecx,[edi]
4543
     add   edx,[edi]
4544
     call  file_read
4545
 
4546
     mov   [esp+36],eax
4547
     mov   [esp+24],ebx
4548
 
4549
     ret
4550
 
375 Ghost 4551
paleholder:
1055 Galkov 4552
        ret
378 serge 4553
 
757 serge 4554
align 4
4555
set_screen:
1055 Galkov 4556
        cmp eax, [Screen_Max_X]
4557
        jne .set
709 diamond 4558
 
1055 Galkov 4559
        cmp edx, [Screen_Max_Y]
4560
        jne .set
4561
        ret
757 serge 4562
.set:
1055 Galkov 4563
        pushfd
4564
        cli
757 serge 4565
 
1055 Galkov 4566
        mov [Screen_Max_X], eax
4567
        mov [Screen_Max_Y], edx
1300 serge 4568
        mov [BytesPerScanLine], ecx
757 serge 4569
 
1055 Galkov 4570
        mov [screen_workarea.right],eax
4571
        mov [screen_workarea.bottom], edx
1300 serge 4572
 
1055 Galkov 4573
        push ebx
4574
        push esi
4575
        push edi
1300 serge 4576
 
4577
        pushad
4578
 
4579
        stdcall kernel_free, [_WinMapAddress]
4580
 
4581
        mov eax, [_display.width]
4582
        mul [_display.height]
4583
        mov [_WinMapSize], eax
4584
 
4585
        stdcall kernel_alloc, eax
4586
        mov [_WinMapAddress], eax
4587
        test eax, eax
4588
        jz .epic_fail
4589
 
4590
        popad
4591
 
1055 Galkov 4592
        call    repos_windows
1300 serge 4593
        xor eax, eax
4594
        xor ebx, ebx
1055 Galkov 4595
        mov     ecx, [Screen_Max_X]
4596
        mov     edx, [Screen_Max_Y]
4597
        call    calculatescreen
4598
        pop edi
4599
        pop esi
4600
        pop ebx
757 serge 4601
 
1055 Galkov 4602
        popfd
4603
        ret
757 serge 4604
 
1300 serge 4605
.epic_fail:
4606
        hlt                     ; Houston, we've had a problem
4607
 
76 mario79 4608
; --------------- APM ---------------------
1330 Lrz 4609
uglobal
4610
apm_entry	dp	0
4611
apm_vf		dd	0
4612
endg
4613
 
1 ha 4614
align 4
76 mario79 4615
sys_apm:
1330 Lrz 4616
	xor	eax,eax
4617
	cmp	word [apm_vf], ax	; Check APM BIOS enable
4618
	jne	@f
4619
	inc	eax
4620
	or	dword [esp + 44], eax	; error
4621
	add	eax,7
4622
	mov	dword [esp + 32], eax   ; 32-bit protected-mode interface not supported
4623
	ret
164 serge 4624
 
465 serge 4625
@@:
1330 Lrz 4626
;	xchg    eax, ecx
4627
;	xchg    ebx, ecx
164 serge 4628
 
1330 Lrz 4629
	cmp	dx, 3
4630
	ja	@f
4631
	and	[esp + 44], byte 0xfe    ; emulate func 0..3 as func 0
4632
	mov	eax,[apm_vf]
4633
	mov	[esp + 32], eax
4634
	shr	eax, 16
4635
	mov	[esp + 28], eax
4636
	ret
78 diamond 4637
 
465 serge 4638
@@:
4639
 
1330 Lrz 4640
	mov	esi,[master_tab+(OS_BASE shr 20)]
4641
	xchg	[master_tab], esi
4642
	push	esi
4643
	mov 	edi, cr3
4644
	mov 	cr3, edi		;flush TLB
465 serge 4645
 
1330 Lrz 4646
	call    pword [apm_entry]	;call APM BIOS
465 serge 4647
 
1330 Lrz 4648
	xchg 	eax, [esp]
4649
	mov 	[master_tab], eax
4650
	mov 	eax, cr3
4651
	mov 	cr3, eax
4652
	pop eax
465 serge 4653
 
1330 Lrz 4654
	mov	[esp + 4 ], edi
4655
	mov	[esp + 8], esi
4656
	mov	[esp + 20], ebx
4657
	mov	[esp + 24], edx
4658
	mov	[esp + 28], ecx
4659
	mov	[esp + 32], eax
4660
	setc	al
4661
	and	[esp + 44], byte 0xfe
4662
	or	[esp + 44], al
4663
	ret
76 mario79 4664
; -----------------------------------------
1 ha 4665
 
76 mario79 4666
align 4
4667
 
1055 Galkov 4668
undefined_syscall:                      ; Undefined system call
671 Ghost 4669
     mov   [esp + 32], dword -1
1 ha 4670
     ret
4671
 
465 serge 4672
align 4
1055 Galkov 4673
system_shutdown:          ; shut down the system
1 ha 4674
 
1055 Galkov 4675
           cmp byte [BOOT_VAR+0x9030], 1
4676
           jne @F
4677
           ret
465 serge 4678
@@:
1055 Galkov 4679
           call stop_all_services
1 ha 4680
 
465 serge 4681
yes_shutdown_param:
1055 Galkov 4682
           cli
1 ha 4683
 
1055 Galkov 4684
           mov  eax, kernel_file ; load kernel.mnt to 0x7000:0
4685
           push 12
4686
           pop  esi
4687
           xor  ebx,ebx
4688
           or   ecx,-1
4689
           mov  edx, OS_BASE+0x70000
4690
           call fileread
1 ha 4691
 
1055 Galkov 4692
           mov  esi, restart_kernel_4000+OS_BASE+0x10000 ; move kernel re-starter to 0x4000:0
4693
           mov  edi,OS_BASE+0x40000
4694
           mov  ecx,1000
4695
           rep  movsb
1 ha 4696
 
1055 Galkov 4697
           mov  esi,OS_BASE+0x2F0000    ; restore 0x0 - 0xffff
4698
           mov  edi, OS_BASE
4699
           mov  ecx,0x10000/4
4700
           cld
4701
           rep movsd
1 ha 4702
 
1055 Galkov 4703
           call restorefatchain
1 ha 4704
 
1055 Galkov 4705
           mov al, 0xFF
4706
           out 0x21, al
4707
           out 0xA1, al
1 ha 4708
 
1085 diamond 4709
if 0
1055 Galkov 4710
           mov  word [OS_BASE+0x467+0],pr_mode_exit
4711
           mov  word [OS_BASE+0x467+2],0x1000
1 ha 4712
 
1055 Galkov 4713
           mov  al,0x0F
4714
           out  0x70,al
4715
           mov  al,0x05
4716
           out  0x71,al
1 ha 4717
 
1055 Galkov 4718
           mov  al,0xFE
4719
           out  0x64,al
709 diamond 4720
 
1055 Galkov 4721
           hlt
1085 diamond 4722
           jmp $-1
1 ha 4723
 
709 diamond 4724
else
1055 Galkov 4725
        cmp     byte [OS_BASE + 0x9030], 2
4726
        jnz     no_acpi_power_off
1 ha 4727
 
709 diamond 4728
; scan for RSDP
4729
; 1) The first 1 Kb of the Extended BIOS Data Area (EBDA).
1055 Galkov 4730
        movzx   eax, word [OS_BASE + 0x40E]
4731
        shl     eax, 4
4732
        jz      @f
4733
        mov     ecx, 1024/16
4734
        call    scan_rsdp
4735
        jnc     .rsdp_found
709 diamond 4736
@@:
4737
; 2) The BIOS read-only memory space between 0E0000h and 0FFFFFh.
1055 Galkov 4738
        mov     eax, 0xE0000
4739
        mov     ecx, 0x2000
4740
        call    scan_rsdp
4741
        jc      no_acpi_power_off
709 diamond 4742
.rsdp_found:
1055 Galkov 4743
        mov     esi, [eax+16]   ; esi contains physical address of the RSDT
4744
        mov     ebp, [ipc_tmp]
4745
        stdcall map_page, ebp, esi, PG_MAP
4746
        lea     eax, [esi+1000h]
4747
        lea     edx, [ebp+1000h]
4748
        stdcall map_page, edx, eax, PG_MAP
4749
        and     esi, 0xFFF
4750
        add     esi, ebp
4751
        cmp     dword [esi], 'RSDT'
4752
        jnz     no_acpi_power_off
4753
        mov     ecx, [esi+4]
4754
        sub     ecx, 24h
4755
        jbe     no_acpi_power_off
4756
        shr     ecx, 2
4757
        add     esi, 24h
709 diamond 4758
.scan_fadt:
1055 Galkov 4759
        lodsd
4760
        mov     ebx, eax
4761
        lea     eax, [ebp+2000h]
4762
        stdcall map_page, eax, ebx, PG_MAP
4763
        lea     eax, [ebp+3000h]
4764
        add     ebx, 0x1000
4765
        stdcall map_page, eax, ebx, PG_MAP
4766
        and     ebx, 0xFFF
4767
        lea     ebx, [ebx+ebp+2000h]
4768
        cmp     dword [ebx], 'FACP'
4769
        jz      .fadt_found
4770
        loop    .scan_fadt
4771
        jmp     no_acpi_power_off
709 diamond 4772
.fadt_found:
4773
; ebx is linear address of FADT
1085 diamond 4774
        mov     edi, [ebx+40] ; physical address of the DSDT
4775
        lea     eax, [ebp+4000h]
4776
        stdcall map_page, eax, edi, PG_MAP
4777
        lea     eax, [ebp+5000h]
4778
        lea     esi, [edi+0x1000]
4779
        stdcall map_page, eax, esi, PG_MAP
4780
        and     esi, 0xFFF
4781
        sub     edi, esi
4782
        cmp     dword [esi+ebp+4000h], 'DSDT'
4783
        jnz     no_acpi_power_off
4784
        mov     eax, [esi+ebp+4004h] ; DSDT length
4785
        sub     eax, 36+4
4786
        jbe     no_acpi_power_off
4787
        add     esi, 36
4788
.scan_dsdt:
4789
        cmp     dword [esi+ebp+4000h], '_S5_'
4790
        jnz     .scan_dsdt_cont
4791
        cmp     byte [esi+ebp+4000h+4], 12h ; DefPackage opcode
4792
        jnz     .scan_dsdt_cont
4793
        mov     dl, [esi+ebp+4000h+6]
4794
        cmp     dl, 4 ; _S5_ package must contain 4 bytes
4795
                      ; ...in theory; in practice, VirtualBox has 2 bytes
4796
        ja      .scan_dsdt_cont
4797
        cmp     dl, 1
4798
        jb      .scan_dsdt_cont
4799
        lea     esi, [esi+ebp+4000h+7]
4800
        xor     ecx, ecx
4801
        cmp     byte [esi], 0 ; 0 means zero byte, 0Ah xx means byte xx
4802
        jz      @f
4803
        cmp     byte [esi], 0xA
4804
        jnz     no_acpi_power_off
4805
        inc     esi
4806
        mov     cl, [esi]
4807
@@:
4808
        inc     esi
4809
        cmp     dl, 2
4810
        jb      @f
4811
        cmp     byte [esi], 0
4812
        jz      @f
4813
        cmp     byte [esi], 0xA
4814
        jnz     no_acpi_power_off
4815
        inc     esi
4816
        mov     ch, [esi]
4817
@@:
4818
        jmp     do_acpi_power_off
4819
.scan_dsdt_cont:
4820
        inc     esi
4821
        cmp     esi, 0x1000
4822
        jb      @f
4823
        sub     esi, 0x1000
4824
        add     edi, 0x1000
4825
        push    eax
4826
        lea     eax, [ebp+4000h]
4827
        stdcall map_page, eax, edi, PG_MAP
4828
        push    PG_MAP
4829
        lea     eax, [edi+1000h]
4830
        push    eax
4831
        lea     eax, [ebp+5000h]
4832
        push    eax
4833
        stdcall map_page
4834
        pop     eax
4835
@@:
4836
        dec     eax
4837
        jnz     .scan_dsdt
4838
        jmp     no_acpi_power_off
4839
do_acpi_power_off:
1055 Galkov 4840
        mov     edx, [ebx+48]
4841
        test    edx, edx
4842
        jz      .nosmi
4843
        mov     al, [ebx+52]
4844
        out     dx, al
4845
        mov     edx, [ebx+64]
709 diamond 4846
@@:
1055 Galkov 4847
        in      ax, dx
4848
        test    al, 1
4849
        jz      @b
709 diamond 4850
.nosmi:
1085 diamond 4851
        and     cx, 0x0707
4852
        shl     cx, 2
4853
        or      cx, 0x2020
1055 Galkov 4854
        mov     edx, [ebx+64]
4855
        in      ax, dx
4856
        and     ax, 203h
1085 diamond 4857
        or      ah, cl
1055 Galkov 4858
        out     dx, ax
4859
        mov     edx, [ebx+68]
4860
        test    edx, edx
4861
        jz      @f
4862
        in      ax, dx
4863
        and     ax, 203h
1085 diamond 4864
        or      ah, ch
1055 Galkov 4865
        out     dx, ax
709 diamond 4866
@@:
1055 Galkov 4867
        jmp     $
709 diamond 4868
 
4869
 
4870
no_acpi_power_off:
1055 Galkov 4871
           mov  word [OS_BASE+0x467+0],pr_mode_exit
4872
           mov  word [OS_BASE+0x467+2],0x1000
709 diamond 4873
 
1055 Galkov 4874
           mov  al,0x0F
4875
           out  0x70,al
4876
           mov  al,0x05
4877
           out  0x71,al
709 diamond 4878
 
1055 Galkov 4879
           mov  al,0xFE
4880
           out  0x64,al
709 diamond 4881
 
1055 Galkov 4882
           hlt
1085 diamond 4883
           jmp $-1
709 diamond 4884
 
4885
scan_rsdp:
1055 Galkov 4886
        add     eax, OS_BASE
709 diamond 4887
.s:
1055 Galkov 4888
        cmp     dword [eax], 'RSD '
4889
        jnz     .n
4890
        cmp     dword [eax+4], 'PTR '
4891
        jnz     .n
4892
        xor     edx, edx
4893
        xor     esi, esi
709 diamond 4894
@@:
1055 Galkov 4895
        add     dl, [eax+esi]
4896
        inc     esi
4897
        cmp     esi, 20
4898
        jnz     @b
4899
        test    dl, dl
4900
        jz      .ok
709 diamond 4901
.n:
1055 Galkov 4902
        add     eax, 10h
4903
        loop    .s
4904
        stc
709 diamond 4905
.ok:
1055 Galkov 4906
        ret
709 diamond 4907
end if
4908
 
465 serge 4909
include "data32.inc"
1 ha 4910
 
465 serge 4911
__REV__ = __REV
1 ha 4912
 
4913
uglobals_size = $ - endofcode
41 mikedld 4914
diff16 "end of kernel code",0,$