Subversion Repositories Kolibri OS

Rev

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