Subversion Repositories Kolibri OS

Rev

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

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