Subversion Repositories Kolibri OS

Rev

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

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