Subversion Repositories Kolibri OS

Rev

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