Subversion Repositories Kolibri OS

Rev

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

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