Subversion Repositories Kolibri OS

Rev

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