Subversion Repositories Kolibri OS

Rev

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

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