Subversion Repositories Kolibri OS

Rev

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

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