Subversion Repositories Kolibri OS

Rev

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

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