Subversion Repositories Kolibri OS

Rev

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

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