Subversion Repositories Kolibri OS

Rev

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