Subversion Repositories Kolibri OS

Rev

Rev 494 | Rev 498 | 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: 497 $
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
497 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
497 spraid 3444
 
3445
 
3446
    stdcall kernel_alloc, 0x100
3447
    push eax
3448
    mov ebx,eax
3449
    stdcall full_file_name,cpustring,eax
3450
    mov ebp, eax
3451
 
3452
    xor ebx, ebx
3453
    xor edx, edx
3454
    call fs_execute
3455
 
3456
    pop ebx
3457
    push eax
3458
    stdcall kernel_free, ebx
3459
    pop eax
3460
 
1 ha 3461
    mov   [ctrl_alt_del], 0
465 serge 3462
 
3463
nocpustart:
1 ha 3464
    cmp   [mouse_active], 1
3465
    jne   mouse_not_active
3466
    mov   [mouse_active], 0
3467
    xor   edi, edi
465 serge 3468
    mov   ecx,  [TASK_COUNT]
3469
set_mouse_event:
1 ha 3470
    add   edi, 256
465 serge 3471
    or    [edi+SLOT_BASE+APPDATA.event_mask], dword 100000b
1 ha 3472
    loop  set_mouse_event
3473
 
465 serge 3474
mouse_not_active:
429 serge 3475
    cmp   [REDRAW_BACKGROUND],byte 0               ; background update ?
3476
    jz    nobackgr
76 mario79 3477
    cmp    [background_defined], 0
429 serge 3478
    jz    nobackgr
473 diamond 3479
;    mov   [REDRAW_BACKGROUND],byte 2
3480
;    call  change_task
3481
    xor   edi, edi
3482
    mov   ecx,  [TASK_COUNT]
3483
set_bgr_event:
3484
    add   edi, 256
3485
    or    [edi+SLOT_BASE+APPDATA.event_mask], 16
3486
    loop  set_bgr_event
465 serge 3487
    mov   [draw_data+32 + RECT.left],dword 0
3488
    mov   [draw_data+32 + RECT.top],dword 0
381 serge 3489
    mov   eax,[ScreenWidth]
3490
    mov   ebx,[ScreenHeight]
465 serge 3491
    mov   [draw_data+32 + RECT.right],eax
3492
    mov   [draw_data+32 + RECT.bottom],ebx
1 ha 3493
    call  drawbackground
381 serge 3494
    mov   [REDRAW_BACKGROUND],byte 0
3495
    mov   [MOUSE_BACKGROUND],byte 0
1 ha 3496
 
465 serge 3497
nobackgr:
1 ha 3498
 
3499
    ; system shutdown request
3500
 
381 serge 3501
    cmp  [SYS_SHUTDOWN],byte 0
429 serge 3502
    je   noshutdown
1 ha 3503
 
3504
    mov  edx,[shutdown_processes]
3505
    sub  dl,2
3506
 
381 serge 3507
    cmp  [SYS_SHUTDOWN],dl
1 ha 3508
    jne  no_mark_system_shutdown
3509
 
465 serge 3510
    mov   edx,OS_BASE+0x3040
381 serge 3511
    movzx ecx,byte [SYS_SHUTDOWN]
1 ha 3512
    add   ecx,5
465 serge 3513
markz:
115 poddubny 3514
    mov   [edx+TASKDATA.state],byte 3
1 ha 3515
    add   edx,0x20
3516
    loop  markz
3517
 
3518
  no_mark_system_shutdown:
3519
 
3520
    call [disable_mouse]
3521
 
381 serge 3522
    dec  byte [SYS_SHUTDOWN]
1 ha 3523
 
381 serge 3524
    cmp  [SYS_SHUTDOWN],byte 0
429 serge 3525
    je   system_shutdown
1 ha 3526
 
465 serge 3527
noshutdown:
1 ha 3528
 
3529
 
429 serge 3530
    mov   eax,[TASK_COUNT]                  ; termination
379 serge 3531
    mov   ebx,TASK_DATA+TASKDATA.state
1 ha 3532
    mov   esi,1
3533
 
465 serge 3534
newct:
1 ha 3535
    mov   cl,[ebx]
3536
    cmp   cl,byte 3
429 serge 3537
    jz    terminate
1 ha 3538
    cmp   cl,byte 4
429 serge 3539
    jz    terminate
1 ha 3540
 
3541
    add   ebx,0x20
3542
    inc   esi
3543
    dec   eax
3544
    jnz   newct
3545
 
3546
    ret
3547
 
3548
 
3549
; redraw screen
3550
 
3551
redrawscreen:
3552
 
3553
; eax , if process window_data base is eax, do not set flag/limits
3554
 
429 serge 3555
         pushad
3556
         push  eax
1 ha 3557
 
3558
;;;         mov   eax,2
3559
;;;         call  delay_hs
3560
 
429 serge 3561
         ;mov   ecx,0               ; redraw flags for apps
3562
         xor   ecx,ecx
1 ha 3563
       newdw2:
3564
 
429 serge 3565
         inc   ecx
3566
         push  ecx
1 ha 3567
 
429 serge 3568
         mov   eax,ecx
3569
         shl   eax,5
3570
         add   eax,window_data
1 ha 3571
 
429 serge 3572
         cmp   eax,[esp+4]
3573
         je    not_this_task
3574
                                   ; check if window in redraw area
3575
         mov   edi,eax
1 ha 3576
 
429 serge 3577
         cmp   ecx,1               ; limit for background
3578
         jz    bgli
1 ha 3579
 
429 serge 3580
         mov   eax, [edi + WDATA.box.left]
3581
         mov   ebx, [edi + WDATA.box.top]
3582
         mov   ecx, [edi + WDATA.box.width]
3583
         mov   edx, [edi + WDATA.box.height]
3584
         add   ecx,eax
3585
         add   edx,ebx
1 ha 3586
 
429 serge 3587
         mov   ecx,[dlye]   ; ecx = area y end     ebx = window y start
3588
         cmp   ecx,ebx
3589
         jb    ricino
1 ha 3590
 
429 serge 3591
         mov   ecx,[dlxe]   ; ecx = area x end     eax = window x start
3592
         cmp   ecx,eax
3593
         jb    ricino
1 ha 3594
 
429 serge 3595
         mov   eax, [edi + WDATA.box.left]
3596
         mov   ebx, [edi + WDATA.box.top]
3597
         mov   ecx, [edi + WDATA.box.width]
3598
         mov   edx, [edi + WDATA.box.height]
3599
         add   ecx, eax
3600
         add   edx, ebx
164 serge 3601
 
429 serge 3602
         mov   eax,[dly]    ; eax = area y start     edx = window y end
3603
         cmp   edx,eax
3604
         jb    ricino
1 ha 3605
 
429 serge 3606
         mov   eax,[dlx]    ; eax = area x start     ecx = window x end
3607
         cmp   ecx,eax
3608
         jb    ricino
1 ha 3609
 
429 serge 3610
        bgli:
1 ha 3611
 
429 serge 3612
         cmp   edi,esi
3613
         jz    ricino
1 ha 3614
 
429 serge 3615
         mov   eax,edi
3616
         add   eax,draw_data-window_data
1 ha 3617
 
429 serge 3618
         mov   ebx,[dlx]          ; set limits
3619
         mov   [eax + RECT.left], ebx
3620
         mov   ebx,[dly]
3621
         mov   [eax + RECT.top], ebx
3622
         mov   ebx,[dlxe]
3623
         mov   [eax + RECT.right], ebx
3624
         mov   ebx,[dlye]
3625
         mov   [eax + RECT.bottom], ebx
1 ha 3626
 
429 serge 3627
         sub   eax,draw_data-window_data
1 ha 3628
 
429 serge 3629
         cmp   ecx,1
3630
         jne   nobgrd
3631
         cmp   esi,1
3632
         je    newdw8
3633
         call  drawbackground
1 ha 3634
 
3635
       newdw8:
3636
       nobgrd:
3637
 
429 serge 3638
         mov   [eax + WDATA.fl_redraw],byte 1    ; mark as redraw
1 ha 3639
 
3640
       ricino:
3641
 
3642
       not_this_task:
3643
 
429 serge 3644
         pop   ecx
1 ha 3645
 
429 serge 3646
         cmp   ecx,[TASK_COUNT]
3647
         jle   newdw2
1 ha 3648
 
429 serge 3649
         pop  eax
3650
         popad
1 ha 3651
 
429 serge 3652
         ret
1 ha 3653
 
3654
calculatebackground:   ; background
3655
 
429 serge 3656
        ; all black
1 ha 3657
 
469 serge 3658
        mov   edi, [img_background]  ;IMG_BACKGROUND                 ; set background to black
429 serge 3659
        xor   eax, eax
469 serge 3660
        mov   ecx, 1023    ;0x0fff00 / 4
429 serge 3661
        cld
3662
        rep   stosd
1 ha 3663
 
429 serge 3664
        mov   edi,display_data              ; set os to use all pixels
3665
        mov   eax,0x01010101
472 serge 3666
        mov   ecx,1280*1024 / 4
429 serge 3667
        rep   stosd
1 ha 3668
 
429 serge 3669
        mov   byte [REDRAW_BACKGROUND], 0              ; do not draw background!
1 ha 3670
 
429 serge 3671
        ret
1 ha 3672
 
3673
uglobal
429 serge 3674
  imax    dd 0x0
1 ha 3675
endg
3676
 
3677
 
3678
 
3679
delay_ms:     ; delay in 1/1000 sec
3680
 
3681
 
429 serge 3682
        push  eax
3683
        push  ecx
1 ha 3684
 
429 serge 3685
        mov   ecx,esi
3686
        ; 
3687
        imul  ecx, 33941
3688
        shr   ecx, 9
3689
        ; 
1 ha 3690
 
429 serge 3691
        in    al,0x61
3692
        and   al,0x10
3693
        mov   ah,al
3694
        cld
1 ha 3695
 
429 serge 3696
 cnt1:  in    al,0x61
3697
        and   al,0x10
3698
        cmp   al,ah
3699
        jz    cnt1
1 ha 3700
 
429 serge 3701
        mov   ah,al
3702
        loop  cnt1
1 ha 3703
 
429 serge 3704
        pop   ecx
3705
        pop   eax
1 ha 3706
 
429 serge 3707
        ret
1 ha 3708
 
3709
 
3710
set_app_param:
429 serge 3711
        push edi
1 ha 3712
 
429 serge 3713
        mov  edi,[TASK_BASE]
3714
        mov  [edi+TASKDATA.event_mask],eax
1 ha 3715
 
429 serge 3716
        pop  edi
3717
        ret
1 ha 3718
 
3719
 
3720
 
3721
delay_hs:     ; delay in 1/100 secs
429 serge 3722
        push  eax
3723
        push  ecx
3724
        push  edx
1 ha 3725
 
429 serge 3726
        mov   edx,[timer_ticks]
3727
        add   edx,eax
1 ha 3728
 
3729
      newtic:
429 serge 3730
        mov   ecx,[timer_ticks]
3731
        cmp   edx,ecx
3732
        jbe   zerodelay
1 ha 3733
 
429 serge 3734
        call  change_task
1 ha 3735
 
429 serge 3736
        jmp   newtic
1 ha 3737
 
3738
      zerodelay:
429 serge 3739
        pop   edx
3740
        pop   ecx
3741
        pop   eax
1 ha 3742
 
429 serge 3743
        ret
1 ha 3744
 
3745
 
3746
memmove:       ; memory move in bytes
3747
 
3748
; eax = from
3749
; ebx = to
3750
; ecx = no of bytes
3751
    test ecx, ecx
3752
    jle  .ret
3753
 
3754
 
3755
    push esi edi ecx
3756
 
3757
    mov  edi, ebx
3758
    mov  esi, eax
3759
 
3760
    test ecx, not 11b
429 serge 3761
    jz   @f
1 ha 3762
 
3763
    push ecx
3764
    shr  ecx, 2
3765
    rep  movsd
3766
    pop  ecx
3767
    and  ecx, 11b
429 serge 3768
    jz   .finish
1 ha 3769
  @@:
3770
    rep  movsb
3771
 
3772
  .finish:
3773
    pop  ecx edi esi
3774
  .ret:
3775
    ret
3776
 
3777
 
75 diamond 3778
;  Sysfunction 34, read_floppy_file, is obsolete. Use 58 or 70 function instead.
3779
;align 4
1 ha 3780
;
75 diamond 3781
;read_floppy_file:
1 ha 3782
;
75 diamond 3783
;; as input
3784
;;
3785
;; eax pointer to file
3786
;; ebx file lenght
3787
;; ecx start 512 byte block number
3788
;; edx number of blocks to read
3789
;; esi pointer to return/work area (atleast 20 000 bytes)
3790
;;
3791
;;
3792
;; on return
3793
;;
3794
;; eax = 0 command succesful
3795
;;       1 no fd base and/or partition defined
3796
;;       2 yet unsupported FS
3797
;;       3 unknown FS
3798
;;       4 partition not defined at hd
3799
;;       5 file not found
3800
;; ebx = size of file
1 ha 3801
;
379 serge 3802
;     mov   edi,[TASK_BASE]
75 diamond 3803
;     add   edi,0x10
3804
;     add   esi,[edi]
3805
;     add   eax,[edi]
1 ha 3806
;
75 diamond 3807
;     pushad
3808
;     mov  edi,esi
3809
;     add  edi,1024
3810
;     mov  esi,0x100000+19*512
3811
;     sub  ecx,1
3812
;     shl  ecx,9
3813
;     add  esi,ecx
3814
;     shl  edx,9
3815
;     mov  ecx,edx
3816
;     cld
3817
;     rep  movsb
3818
;     popad
3819
;
3820
;     mov   [esp+36],eax
3821
;     mov   [esp+24],ebx
3822
;     ret
1 ha 3823
 
3824
 
3825
 
3826
align 4
3827
 
3828
sys_programirq:
3829
 
379 serge 3830
    mov   edi,[TASK_BASE]
115 poddubny 3831
    add   eax,[edi+TASKDATA.mem_start]
1 ha 3832
 
75 diamond 3833
    cmp   ebx,16
3834
    jae   .not_owner
379 serge 3835
    mov   edi,[TASK_BASE]
115 poddubny 3836
    mov   edi,[edi+TASKDATA.pid]
75 diamond 3837
    cmp   edi,[irq_owner+ebx*4]
429 serge 3838
    je    spril1
75 diamond 3839
.not_owner:
1 ha 3840
    mov   [esp+36],dword 1
3841
    ret
3842
  spril1:
3843
 
3844
    mov   esi,eax
3845
    shl   ebx,6
3846
    add   ebx,irq00read
3847
    mov   edi,ebx
3848
    mov   ecx,16
3849
    cld
3850
    rep   movsd
3851
    mov   [esp+36],dword 0
3852
    ret
3853
 
3854
 
3855
align 4
3856
 
3857
get_irq_data:
75 diamond 3858
     cmp   eax,16
3859
     jae   .not_owner
429 serge 3860
     mov   edx,eax           ; check for correct owner
1 ha 3861
     shl   edx,2
3862
     add   edx,irq_owner
3863
     mov   edx,[edx]
379 serge 3864
     mov   edi,[TASK_BASE]
115 poddubny 3865
     mov   edi,[edi+TASKDATA.pid]
1 ha 3866
     cmp   edx,edi
3867
     je    gidril1
75 diamond 3868
.not_owner:
429 serge 3869
     mov   [esp+32],dword 2     ; ecx=2
1 ha 3870
     ret
3871
 
3872
  gidril1:
3873
 
3874
     mov   ebx,eax
3875
     shl   ebx,12
381 serge 3876
     add   ebx,IRQ_SAVE
1 ha 3877
     mov   eax,[ebx]
3878
     mov   ecx,1
3879
     test  eax,eax
3880
     jz    gid1
3881
 
3882
     dec   eax
3883
     mov   esi,ebx
3884
     mov   [ebx],eax
3885
     movzx ebx,byte [ebx+0x10]
3886
     add   esi,0x10
3887
     mov   edi,esi
3888
     inc   esi
3889
     mov   ecx,4000 / 4
3890
     cld
3891
     rep   movsd
75 diamond 3892
;     xor   ecx,ecx     ; as result of 'rep' ecx=0
1 ha 3893
   gid1:
3894
     mov   [esp+36],eax
3895
     mov   [esp+32],ecx
3896
     mov   [esp+24],ebx
3897
     ret
3898
 
3899
 
3900
set_io_access_rights:
3901
 
3902
     pushad
3903
 
465 serge 3904
     mov edi, tss._io_map_0
1 ha 3905
 
465 serge 3906
;     mov   ecx,eax
3907
;     and   ecx,7    ; offset in byte
1 ha 3908
 
465 serge 3909
;     shr   eax,3    ; number of byte
3910
;     add   edi,eax
1 ha 3911
 
465 serge 3912
;     mov   ebx,1
3913
;     shl   ebx,cl
1 ha 3914
 
429 serge 3915
     cmp   ebp,0                ; enable access - ebp = 0
1 ha 3916
     jne   siar1
3917
 
465 serge 3918
;     not   ebx
3919
;     and   [edi],byte bl
3920
     btr [edi], eax
1 ha 3921
 
3922
     popad
3923
 
3924
     ret
3925
 
465 serge 3926
siar1:
1 ha 3927
 
465 serge 3928
     bts [edi], eax
3929
  ;  or    [edi],byte bl        ; disable access - ebp = 1
1 ha 3930
 
3931
     popad
3932
 
3933
     ret
3934
 
3935
r_f_port_area:
3936
 
3937
     test  eax, eax
3938
     jnz   free_port_area
3939
;     je    r_port_area
3940
;     jmp   free_port_area
3941
 
3942
;   r_port_area:
3943
 
3944
     pushad
3945
 
429 serge 3946
     cmp   ebx,ecx            ; beginning > end ?
75 diamond 3947
     ja    rpal1
3948
     cmp   ecx,65536
3949
     jae   rpal1
381 serge 3950
     mov   esi,[RESERVED_PORTS]
429 serge 3951
     test  esi,esi            ; no reserved areas ?
1 ha 3952
     je    rpal2
429 serge 3953
     cmp   esi,255            ; max reserved
75 diamond 3954
     jae   rpal1
465 serge 3955
 rpal3:
1 ha 3956
     mov   edi,esi
3957
     shl   edi,4
381 serge 3958
     add   edi,RESERVED_PORTS
1 ha 3959
     cmp   ebx,[edi+8]
75 diamond 3960
     ja    rpal4
1 ha 3961
     cmp   ecx,[edi+4]
3962
     jae   rpal1
3963
;     jb    rpal4
3964
;     jmp   rpal1
465 serge 3965
 rpal4:
1 ha 3966
 
3967
     dec   esi
3968
     jnz   rpal3
3969
     jmp   rpal2
3970
   rpal1:
3971
     popad
3972
     mov   eax,1
3973
     ret
3974
 
3975
   rpal2:
3976
     popad
3977
 
3978
 
3979
     ; enable port access at port IO map
3980
     cli
429 serge 3981
     pushad                        ; start enable io map
1 ha 3982
 
3983
     cmp   ecx,65536 ;16384
3984
     jae   no_unmask_io ; jge
3985
 
3986
     mov   eax,ebx
3987
 
3988
   new_port_access:
3989
 
3990
     pushad
3991
 
429 serge 3992
     xor   ebp,ebp                ; enable - eax = port
1 ha 3993
     call  set_io_access_rights
3994
 
3995
     popad
3996
 
3997
     inc   eax
3998
     cmp   eax,ecx
3999
     jbe   new_port_access
4000
 
4001
   no_unmask_io:
4002
 
429 serge 4003
     popad                         ; end enable io map
1 ha 4004
     sti
4005
 
381 serge 4006
     mov   edi,[RESERVED_PORTS]
1 ha 4007
     add   edi,1
381 serge 4008
     mov   [RESERVED_PORTS],edi
1 ha 4009
     shl   edi,4
381 serge 4010
     add   edi,RESERVED_PORTS
379 serge 4011
     mov   esi,[TASK_BASE]
115 poddubny 4012
     mov   esi,[esi+TASKDATA.pid]
1 ha 4013
     mov   [edi],esi
4014
     mov   [edi+4],ebx
4015
     mov   [edi+8],ecx
4016
 
4017
     xor   eax, eax
4018
     ret
4019
 
4020
free_port_area:
4021
 
4022
     pushad
4023
 
381 serge 4024
     mov   esi,[RESERVED_PORTS]     ; no reserved areas ?
75 diamond 4025
     test  esi,esi
1 ha 4026
     je    frpal2
379 serge 4027
     mov   edx,[TASK_BASE]
115 poddubny 4028
     mov   edx,[edx+TASKDATA.pid]
1 ha 4029
   frpal3:
4030
     mov   edi,esi
4031
     shl   edi,4
381 serge 4032
     add   edi,RESERVED_PORTS
1 ha 4033
     cmp   edx,[edi]
4034
     jne   frpal4
4035
     cmp   ebx,[edi+4]
4036
     jne   frpal4
4037
     cmp   ecx,[edi+8]
4038
     jne   frpal4
4039
     jmp   frpal1
4040
   frpal4:
4041
     dec   esi
4042
     jnz   frpal3
4043
   frpal2:
4044
     popad
4045
     mov   eax,1
4046
     ret
4047
   frpal1:
4048
     mov   ecx,256
4049
     sub   ecx,esi
4050
     shl   ecx,4
4051
     mov   esi,edi
4052
     add   esi,16
4053
     cld
4054
     rep   movsb
4055
 
381 serge 4056
     dec   dword [RESERVED_PORTS]
1 ha 4057
 
4058
     popad
4059
 
4060
 
4061
     ; disable port access at port IO map
4062
 
429 serge 4063
     pushad                        ; start disable io map
1 ha 4064
 
4065
     cmp   ecx,65536 ;16384
4066
     jge   no_mask_io
4067
 
4068
     mov   eax,ebx
4069
 
4070
   new_port_access_disable:
4071
 
4072
     pushad
4073
 
429 serge 4074
     mov   ebp,1                  ; disable - eax = port
1 ha 4075
     call  set_io_access_rights
4076
 
4077
     popad
4078
 
4079
     inc   eax
4080
     cmp   eax,ecx
4081
     jbe   new_port_access_disable
4082
 
4083
   no_mask_io:
4084
 
429 serge 4085
     popad                         ; end disable io map
1 ha 4086
 
4087
     xor   eax, eax
4088
     ret
4089
 
4090
 
4091
reserve_free_irq:
4092
 
75 diamond 4093
     mov   ecx, 1
4094
     cmp   ebx, 16
4095
     jae   fril1
4096
     test  eax,eax
1 ha 4097
     jz    reserve_irq
4098
 
75 diamond 4099
     lea   edi,[irq_owner+ebx*4]
1 ha 4100
     mov   edx,[edi]
379 serge 4101
     mov   eax,[TASK_BASE]
115 poddubny 4102
     cmp   edx,[eax+TASKDATA.pid]
1 ha 4103
     jne   fril1
75 diamond 4104
     dec   ecx
4105
     mov   [edi],ecx
1 ha 4106
   fril1:
4107
     mov   [esp+36],ecx ; return in eax
4108
     ret
4109
 
4110
  reserve_irq:
4111
 
75 diamond 4112
     lea   edi,[irq_owner+ebx*4]
4113
     cmp   dword [edi], 0
4114
     jnz   ril1
1 ha 4115
 
379 serge 4116
     mov   edx,[TASK_BASE]
115 poddubny 4117
     mov   edx,[edx+TASKDATA.pid]
1 ha 4118
     mov   [edi],edx
75 diamond 4119
     dec   ecx
1 ha 4120
   ril1:
4121
     mov   [esp+36],ecx ; return in eax
4122
     ret
4123
 
4124
drawbackground:
33 mario79 4125
       inc   [mouse_pause]
381 serge 4126
       cmp   [SCR_MODE],word 0x12
117 mario79 4127
       je   dbrv20
1 ha 4128
     dbrv12:
381 serge 4129
       cmp  [SCR_MODE],word 0100000000000000b
1 ha 4130
       jge  dbrv20
381 serge 4131
       cmp  [SCR_MODE],word 0x13
1 ha 4132
       je   dbrv20
4133
       call  vesa12_drawbackground
33 mario79 4134
       dec   [mouse_pause]
36 mario79 4135
       call   [draw_pointer]
1 ha 4136
       ret
4137
     dbrv20:
4138
       cmp   [display_data-12],dword 1
4139
       jne   bgrstr
4140
       call  vesa20_drawbackground_tiled
33 mario79 4141
       dec   [mouse_pause]
36 mario79 4142
       call   [draw_pointer]
1 ha 4143
       ret
4144
     bgrstr:
4145
       call  vesa20_drawbackground_stretch
33 mario79 4146
       dec   [mouse_pause]
36 mario79 4147
       call   [draw_pointer]
1 ha 4148
       ret
4149
 
75 diamond 4150
align 4
1 ha 4151
 
429 serge 4152
syscall_putimage:                       ; PutImage
33 mario79 4153
 
75 diamond 4154
     mov   edx,ecx
4155
     mov   ecx,ebx
465 serge 4156
     mov   ebx, eax
75 diamond 4157
 
1 ha 4158
sys_putimage:
53 mikedld 4159
     test  ecx,0x80008000
4160
     jnz   .exit
4161
     test  ecx,0x0000FFFF
4162
     jz    .exit
4163
     test  ecx,0xFFFF0000
4164
     jnz   @f
4165
  .exit:
4166
     ret
4167
 @@:
465 serge 4168
        mov     edi,[current_slot]
4169
        add     dx,word[edi+APPDATA.wnd_clientbox.top]
429 serge 4170
        rol     edx,16
465 serge 4171
        add     dx,word[edi+APPDATA.wnd_clientbox.left]
429 serge 4172
        rol     edx,16
114 mikedld 4173
  .forced:
429 serge 4174
        push    ebp esi 0
4175
        mov     ebp, putimage_get24bpp
4176
        mov     esi, putimage_init24bpp
283 diamond 4177
sys_putimage_bpp:
4178
;        call    [disable_mouse] ; this will be done in xxx_putimage
117 mario79 4179
;        mov     eax, vga_putimage
429 serge 4180
        cmp     [SCR_MODE], word 0x12
4181
        jz      @f   ;.doit
4182
        mov     eax, vesa12_putimage
4183
        cmp     [SCR_MODE], word 0100000000000000b
4184
        jae     @f
4185
        cmp     [SCR_MODE], word 0x13
4186
        jnz     .doit
75 diamond 4187
@@:
429 serge 4188
        mov     eax, vesa20_putimage
75 diamond 4189
.doit:
429 serge 4190
        inc     [mouse_pause]
4191
        call    eax
4192
        dec     [mouse_pause]
4193
        pop     ebp esi ebp
4194
        jmp     [draw_pointer]
1 ha 4195
 
283 diamond 4196
syscall_putimage_palette:
465 serge 4197
        mov     edi, esi
429 serge 4198
        mov     esi, edx
4199
        mov     edx, ecx
4200
        mov     ecx, ebx
465 serge 4201
        mov     ebx, eax
283 diamond 4202
sys_putimage_palette:
4203
; ebx = pointer to image
4204
; ecx = [xsize]*65536 + [ysize]
4205
; edx = [xstart]*65536 + [ystart]
314 diamond 4206
; esi = number of bits per pixel, must be 8, 24 or 32
283 diamond 4207
; edi = pointer to palette
314 diamond 4208
; ebp = row delta
429 serge 4209
        mov     eax, [CURRENT_TASK]
4210
        shl     eax, 8
4211
        add     dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.top]
4212
        rol     edx, 16
4213
        add     dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.left]
4214
        rol     edx, 16
283 diamond 4215
.forced:
429 serge 4216
        push    ebp esi ebp
4217
        cmp     esi, 8
4218
        jnz     @f
4219
        mov     ebp, putimage_get8bpp
4220
        mov     esi, putimage_init8bpp
4221
        jmp     sys_putimage_bpp
314 diamond 4222
@@:
429 serge 4223
        cmp     esi, 24
4224
        jnz     @f
4225
        mov     ebp, putimage_get24bpp
4226
        mov     esi, putimage_init24bpp
4227
        jmp     sys_putimage_bpp
314 diamond 4228
@@:
429 serge 4229
        cmp     esi, 32
4230
        jnz     @f
4231
        mov     ebp, putimage_get32bpp
4232
        mov     esi, putimage_init32bpp
4233
        jmp     sys_putimage_bpp
314 diamond 4234
@@:
429 serge 4235
        pop     ebp esi
4236
        ret
283 diamond 4237
 
4238
putimage_init24bpp:
429 serge 4239
        lea     eax, [eax*3]
283 diamond 4240
putimage_init8bpp:
429 serge 4241
        ret
283 diamond 4242
 
4243
putimage_get24bpp:
429 serge 4244
        mov     eax, [esi]
4245
        add     esi, 3
4246
        ret     4
283 diamond 4247
putimage_get8bpp:
429 serge 4248
        movzx   eax, byte [esi]
4249
        push    edx
4250
        mov     edx, [esp+8]
4251
        mov     eax, [edx+eax*4]
4252
        pop     edx
4253
        inc     esi
4254
        ret     4
283 diamond 4255
 
314 diamond 4256
putimage_init32bpp:
429 serge 4257
        shl     eax, 2
4258
        ret
314 diamond 4259
putimage_get32bpp:
429 serge 4260
        lodsd
4261
        ret     4
314 diamond 4262
 
1 ha 4263
; eax x beginning
4264
; ebx y beginning
4265
; ecx x end
283 diamond 4266
	; edx y end
1 ha 4267
; edi color
4268
 
4269
__sys_drawbar:
465 serge 4270
        mov     esi,[current_slot]
4271
        add     eax,[esi+APPDATA.wnd_clientbox.left]
4272
        add     ecx,[esi+APPDATA.wnd_clientbox.left]
4273
        add     ebx,[esi+APPDATA.wnd_clientbox.top]
4274
        add     edx,[esi+APPDATA.wnd_clientbox.top]
114 mikedld 4275
  .forced:
33 mario79 4276
    inc   [mouse_pause]
283 diamond 4277
;        call    [disable_mouse]
381 serge 4278
    cmp   [SCR_MODE],word 0x12
429 serge 4279
    je   dbv20
1 ha 4280
   sdbv20:
381 serge 4281
    cmp  [SCR_MODE],word 0100000000000000b
1 ha 4282
    jge  dbv20
381 serge 4283
    cmp  [SCR_MODE],word 0x13
429 serge 4284
    je   dbv20
1 ha 4285
    call vesa12_drawbar
33 mario79 4286
    dec   [mouse_pause]
36 mario79 4287
    call   [draw_pointer]
1 ha 4288
    ret
4289
  dbv20:
4290
    call vesa20_drawbar
33 mario79 4291
    dec   [mouse_pause]
36 mario79 4292
    call   [draw_pointer]
1 ha 4293
    ret
4294
 
4295
 
4296
 
4297
kb_read:
4298
 
429 serge 4299
        push    ecx edx
1 ha 4300
 
429 serge 4301
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 4302
      kr_loop:
429 serge 4303
        in      al,0x64
4304
        test    al,1
4305
        jnz     kr_ready
4306
        loop    kr_loop
4307
        mov     ah,1
4308
        jmp     kr_exit
1 ha 4309
      kr_ready:
429 serge 4310
        push    ecx
4311
        mov     ecx,32
1 ha 4312
      kr_delay:
429 serge 4313
        loop    kr_delay
4314
        pop     ecx
4315
        in      al,0x60
4316
        xor     ah,ah
1 ha 4317
      kr_exit:
4318
 
429 serge 4319
        pop     edx ecx
1 ha 4320
 
429 serge 4321
        ret
1 ha 4322
 
4323
 
4324
kb_write:
4325
 
429 serge 4326
        push    ecx edx
1 ha 4327
 
429 serge 4328
        mov     dl,al
265 diamond 4329
;        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
4330
;      kw_loop1:
4331
;        in      al,0x64
4332
;        test    al,0x20
4333
;        jz      kw_ok1
4334
;        loop    kw_loop1
4335
;        mov     ah,1
4336
;        jmp     kw_exit
4337
;      kw_ok1:
429 serge 4338
        in      al,0x60
4339
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 4340
      kw_loop:
429 serge 4341
        in      al,0x64
4342
        test    al,2
4343
        jz      kw_ok
4344
        loop    kw_loop
4345
        mov     ah,1
4346
        jmp     kw_exit
1 ha 4347
      kw_ok:
429 serge 4348
        mov     al,dl
4349
        out     0x60,al
4350
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 4351
      kw_loop3:
429 serge 4352
        in      al,0x64
4353
        test    al,2
4354
        jz      kw_ok3
4355
        loop    kw_loop3
4356
        mov     ah,1
4357
        jmp     kw_exit
1 ha 4358
      kw_ok3:
429 serge 4359
        mov     ah,8
1 ha 4360
      kw_loop4:
429 serge 4361
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 4362
      kw_loop5:
429 serge 4363
        in      al,0x64
4364
        test    al,1
4365
        jnz     kw_ok4
4366
        loop    kw_loop5
4367
        dec     ah
4368
        jnz     kw_loop4
1 ha 4369
      kw_ok4:
429 serge 4370
        xor     ah,ah
1 ha 4371
      kw_exit:
4372
 
429 serge 4373
        pop     edx ecx
1 ha 4374
 
429 serge 4375
        ret
1 ha 4376
 
4377
 
4378
kb_cmd:
4379
 
429 serge 4380
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 4381
      c_wait:
429 serge 4382
        in      al,0x64
4383
        test    al,2
4384
        jz      c_send
4385
        loop    c_wait
4386
        jmp     c_error
1 ha 4387
      c_send:
429 serge 4388
        mov     al,bl
4389
        out     0x64,al
4390
        mov     ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
1 ha 4391
      c_accept:
429 serge 4392
        in      al,0x64
4393
        test    al,2
4394
        jz      c_ok
4395
        loop    c_accept
1 ha 4396
      c_error:
429 serge 4397
        mov     ah,1
4398
        jmp     c_exit
1 ha 4399
      c_ok:
429 serge 4400
        xor     ah,ah
1 ha 4401
      c_exit:
429 serge 4402
        ret
1 ha 4403
 
4404
 
4405
setmouse:  ; set mousepicture -pointer
429 serge 4406
           ; ps2 mouse enable
1 ha 4407
 
381 serge 4408
     mov     [MOUSE_PICTURE],dword mousepointer
1 ha 4409
 
4410
     cli
33 mario79 4411
;     mov     bl,0xa8                 ; enable mouse cmd
4412
;     call    kb_cmd
4413
;     call    kb_read                 ; read status
4414
;     mov     bl,0x20                 ; get command byte
4415
;     call    kb_cmd
4416
;     call    kb_read
4417
;     or      al,3                    ; enable interrupt
4418
;     mov     bl,0x60                 ; write command
4419
;     push    eax
4420
;     call    kb_cmd
4421
;     pop     eax
4422
;     call    kb_write
4423
;     mov     bl,0xd4                 ; for mouse
4424
;     call    kb_cmd
4425
;     mov     al,0xf4                 ; enable mouse device
4426
;     call    kb_write
4427
;     call    kb_read           ; read status return
1 ha 4428
 
4429
     ; com1 mouse enable
4430
 
4431
     mov   bx,0x3f8 ; combase
4432
 
4433
     mov   dx,bx
4434
     add   dx,3
4435
     mov   al,0x80
4436
     out   dx,al
4437
 
4438
     mov   dx,bx
4439
     add   dx,1
4440
     mov   al,0
4441
     out   dx,al
4442
 
4443
     mov   dx,bx
4444
     add   dx,0
429 serge 4445
     mov   al,0x30*2    ; 0x30 / 4
1 ha 4446
     out   dx,al
4447
 
4448
     mov   dx,bx
4449
     add   dx,3
429 serge 4450
     mov   al,2         ; 3
1 ha 4451
     out   dx,al
4452
 
4453
     mov   dx,bx
4454
     add   dx,4
4455
     mov   al,0xb
4456
     out   dx,al
4457
 
4458
     mov   dx,bx
4459
     add   dx,1
4460
     mov   al,1
4461
     out   dx,al
4462
 
4463
 
4464
     ; com2 mouse enable
4465
 
4466
     mov   bx,0x2f8 ; combase
4467
 
4468
     mov   dx,bx
4469
     add   dx,3
4470
     mov   al,0x80
4471
     out   dx,al
4472
 
4473
     mov   dx,bx
4474
     add   dx,1
4475
     mov   al,0
4476
     out   dx,al
4477
 
4478
     mov   dx,bx
4479
     add   dx,0
4480
     mov   al,0x30*2
4481
     out   dx,al
4482
 
4483
     mov   dx,bx
4484
     add   dx,3
4485
     mov   al,2
4486
     out   dx,al
4487
 
4488
     mov   dx,bx
4489
     add   dx,4
4490
     mov   al,0xb
4491
     out   dx,al
4492
 
4493
     mov   dx,bx
4494
     add   dx,1
4495
     mov   al,1
4496
     out   dx,al
4497
 
4498
     ret
4499
 
4500
 
4501
_rdtsc:
164 serge 4502
     bt [cpu_caps], CAPS_TSC
4503
     jnc ret_rdtsc
1 ha 4504
     rdtsc
4505
     ret
4506
   ret_rdtsc:
4507
     mov   edx,0xffffffff
4508
     mov   eax,0xffffffff
4509
     ret
4510
 
4511
rerouteirqs:
4512
 
429 serge 4513
        cli
1 ha 4514
 
429 serge 4515
        mov     al,0x11         ;  icw4, edge triggered
4516
        out     0x20,al
4517
        call    pic_delay
4518
        out     0xA0,al
4519
        call    pic_delay
1 ha 4520
 
429 serge 4521
        mov     al,0x20         ;  generate 0x20 +
4522
        out     0x21,al
4523
        call    pic_delay
4524
        mov     al,0x28         ;  generate 0x28 +
4525
        out     0xA1,al
4526
        call    pic_delay
1 ha 4527
 
429 serge 4528
        mov     al,0x04         ;  slave at irq2
4529
        out     0x21,al
4530
        call    pic_delay
4531
        mov     al,0x02         ;  at irq9
4532
        out     0xA1,al
4533
        call    pic_delay
1 ha 4534
 
429 serge 4535
        mov     al,0x01         ;  8086 mode
4536
        out     0x21,al
4537
        call    pic_delay
4538
        out     0xA1,al
4539
        call    pic_delay
1 ha 4540
 
429 serge 4541
        mov     al,255          ; mask all irq's
4542
        out     0xA1,al
4543
        call    pic_delay
4544
        out     0x21,al
4545
        call    pic_delay
1 ha 4546
 
429 serge 4547
        mov     ecx,0x1000
4548
        cld
4549
picl1:  call    pic_delay
4550
        loop    picl1
1 ha 4551
 
429 serge 4552
        mov     al,255          ; mask all irq's
4553
        out     0xA1,al
4554
        call    pic_delay
4555
        out     0x21,al
4556
        call    pic_delay
1 ha 4557
 
429 serge 4558
        cli
1 ha 4559
 
429 serge 4560
        ret
1 ha 4561
 
4562
 
4563
pic_delay:
4564
 
429 serge 4565
        jmp     pdl1
4566
pdl1:   ret
1 ha 4567
 
4568
 
4569
sys_msg_board_str:
4570
 
4571
     pushad
4572
   @@:
4573
     cmp    [esi],byte 0
4574
     je     @f
4575
     mov    eax,1
4576
     movzx  ebx,byte [esi]
4577
     call   sys_msg_board
4578
     inc    esi
4579
     jmp    @b
4580
   @@:
4581
     popad
4582
     ret
4583
 
4584
uglobal
373 mikedld 4585
  msg_board_data: times 4096 db 0
1 ha 4586
  msg_board_count dd 0x0
4587
endg
4588
 
4589
sys_msg_board:
4590
 
4591
; eax=1 : write :  bl byte to write
4592
; eax=2 :  read :  ebx=0 -> no data, ebx=1 -> data in al
4593
 
4594
     mov  ecx,[msg_board_count]
4595
     cmp  eax, 1
4596
     jne  smbl1
4597
 
4598
 
4599
     mov  [msg_board_data+ecx],bl
4600
     inc  ecx
373 mikedld 4601
     and  ecx, 4095
1 ha 4602
     mov  [msg_board_count], ecx
4603
     mov  [check_idle_semaphore], 5
4604
     ret
4605
   smbl1:
4606
 
4607
     cmp   eax, 2
4608
     jne   smbl2
4609
     test  ecx, ecx
4610
     jz    smbl21
4611
;     mov   edi, msg_board_data
4612
;     mov   esi, msg_board_data+1
4613
;     movzx eax, byte [edi]
4614
     mov   eax, msg_board_data+1
4615
     mov   ebx, msg_board_data
4616
     movzx edx, byte [ebx]
4617
     call  memmove
4618
;     push  ecx
4619
;     shr   ecx, 2
4620
;     cld
4621
;     rep   movsd
4622
;     pop   ecx
4623
;     and   ecx, 3
4624
;     rep   movsb
4625
     dec   [msg_board_count]
4626
     mov   [esp+36], edx ;eax
4627
     mov   [esp+24], dword 1
4628
     ret
4629
   smbl21:
4630
     mov   [esp+36], ecx
4631
     mov   [esp+24], ecx
4632
 
4633
   smbl2:
4634
     ret
4635
 
4636
 
4637
 
4638
sys_process_def:
429 serge 4639
        mov     edi, [CURRENT_TASK]
1 ha 4640
 
429 serge 4641
        dec     eax             ; 1 = set keyboard mode
1 ha 4642
     jne   no_set_keyboard_setup
4643
 
4644
     shl   edi,8
380 serge 4645
     mov   [edi+SLOT_BASE + APPDATA.keyboard_mode],bl
1 ha 4646
 
4647
     ret
4648
 
4649
   no_set_keyboard_setup:
4650
 
429 serge 4651
        dec     eax             ; 2 = get keyboard mode
1 ha 4652
     jne   no_get_keyboard_setup
4653
 
4654
     shl   edi,8
380 serge 4655
     movzx eax, byte [SLOT_BASE+edi + APPDATA.keyboard_mode]
1 ha 4656
 
4657
     mov   [esp+36],eax
4658
 
4659
     ret
4660
 
4661
   no_get_keyboard_setup:
4662
 
429 serge 4663
        dec     eax             ; 3 = get keyboard ctrl, alt, shift
1 ha 4664
     jne   no_get_keyboard_cas
4665
 
4666
;     xor   eax,eax
4667
;     movzx eax,byte [shift]
4668
;     movzx ebx,byte [ctrl]
4669
;     shl   ebx,2
4670
;     add   eax,ebx
4671
;     movzx ebx,byte [alt]
4672
;     shl   ebx,3
4673
;     add   eax,ebx
4674
 
4675
 ;// mike.dld [
4676
     mov   eax, [kb_state]
4677
 ;// mike.dld ]
4678
 
4679
     mov   [esp+36],eax
4680
 
4681
     ret
4682
 
4683
   no_get_keyboard_cas:
4684
 
429 serge 4685
        dec     eax
4686
        jnz     no_add_keyboard_hotkey
1 ha 4687
 
429 serge 4688
        mov     eax, hotkey_list
92 diamond 4689
@@:
429 serge 4690
        cmp     dword [eax+8], 0
4691
        jz      .found_free
4692
        add     eax, 16
4693
        cmp     eax, hotkey_list+16*256
4694
        jb      @b
4695
        mov     dword [esp+36], 1
4696
        ret
92 diamond 4697
.found_free:
429 serge 4698
        mov     [eax+8], edi
4699
        mov     [eax+4], ecx
4700
        movzx   ebx, bl
4701
        lea     ebx, [hotkey_scancodes+ebx*4]
4702
        mov     ecx, [ebx]
4703
        mov     [eax], ecx
4704
        mov     [ebx], eax
4705
        mov     [eax+12], ebx
4706
        jecxz   @f
4707
        mov     [ecx+12], eax
92 diamond 4708
@@:
429 serge 4709
        and     dword [esp+36], 0
4710
        ret
92 diamond 4711
 
4712
no_add_keyboard_hotkey:
4713
 
429 serge 4714
        dec     eax
4715
        jnz     no_del_keyboard_hotkey
92 diamond 4716
 
429 serge 4717
        movzx   ebx, bl
4718
        lea     ebx, [hotkey_scancodes+ebx*4]
4719
        mov     eax, [ebx]
92 diamond 4720
.scan:
429 serge 4721
        test    eax, eax
4722
        jz      .notfound
4723
        cmp     [eax+8], edi
4724
        jnz     .next
4725
        cmp     [eax+4], ecx
4726
        jz      .found
92 diamond 4727
.next:
429 serge 4728
        mov     eax, [eax]
4729
        jmp     .scan
92 diamond 4730
.notfound:
429 serge 4731
        mov     dword [esp+36], 1
4732
        ret
92 diamond 4733
.found:
429 serge 4734
        mov     ecx, [eax]
4735
        jecxz   @f
4736
        mov     edx, [eax+12]
4737
        mov     [ecx+12], edx
92 diamond 4738
@@:
429 serge 4739
        mov     ecx, [eax+12]
4740
        mov     edx, [eax]
4741
        mov     [ecx], edx
4742
        xor     edx, edx
4743
        mov     [eax+4], edx
4744
        mov     [eax+8], edx
4745
        mov     [eax+12], edx
4746
        mov     [eax], edx
4747
        mov     [esp+36], edx
4748
        ret
92 diamond 4749
 
4750
no_del_keyboard_hotkey:
1 ha 4751
     ret
4752
 
4753
 
4754
align 4
4755
 
429 serge 4756
sys_gs:                         ; direct screen access
1 ha 4757
 
429 serge 4758
     cmp  eax,1                 ; resolution
1 ha 4759
     jne  no_gs1
381 serge 4760
     mov  eax,[ScreenWidth]
1 ha 4761
     shl  eax,16
381 serge 4762
     mov  ax,[ScreenHeight]
1 ha 4763
     add  eax,0x00010001
4764
     mov  [esp+36],eax
4765
     ret
4766
   no_gs1:
4767
 
429 serge 4768
     cmp   eax,2                ; bits per pixel
1 ha 4769
     jne   no_gs2
381 serge 4770
     movzx eax,byte [ScreenBPP]
1 ha 4771
     mov   [esp+36],eax
4772
     ret
4773
   no_gs2:
4774
 
429 serge 4775
     cmp   eax,3                ; bytes per scanline
1 ha 4776
     jne   no_gs3
381 serge 4777
     mov   eax,[BytesPerScanLine]
1 ha 4778
     mov   [esp+36],eax
4779
     ret
4780
   no_gs3:
4781
 
4782
     mov  [esp+36],dword -1
4783
     ret
4784
 
4785
 
4786
align 4 ; PCI functions
4787
 
4788
sys_pci:
4789
 
4790
     call  pci_api
4791
     mov   [esp+36],eax
4792
     ret
4793
 
4794
 
4795
align 4  ;  system functions
4796
 
429 serge 4797
syscall_setpixel:                       ; SetPixel
1 ha 4798
 
4799
 
379 serge 4800
     mov   edx,[TASK_BASE]
115 poddubny 4801
     add   eax,[edx-twdw+WDATA.box.left]
4802
     add   ebx,[edx-twdw+WDATA.box.top]
465 serge 4803
        mov     edi,[current_slot]
4804
        add     eax,[edi+APPDATA.wnd_clientbox.left]
4805
        add     ebx,[edi+APPDATA.wnd_clientbox.top]
112 poddubny 4806
     xor   edi,edi ; no force
114 mikedld 4807
;     mov   edi,1
112 poddubny 4808
     call  [disable_mouse]
1 ha 4809
     jmp   [putpixel]
4810
 
4811
align 4
4812
 
429 serge 4813
syscall_writetext:                      ; WriteText
1 ha 4814
 
465 serge 4815
        mov   edi,[TASK_BASE]
4816
        mov   ebp,[edi-twdw+WDATA.box.left]
4817
        push  esi
4818
        mov   esi,[current_slot]
4819
        add   ebp,[esi+APPDATA.wnd_clientbox.left]
4820
        shl   ebp,16
4821
        add   ebp,[edi-twdw+WDATA.box.top]
4822
        add   bp,word[esi+APPDATA.wnd_clientbox.top]
4823
        pop   esi
4824
        add   ecx,[edi+TASKDATA.mem_start]
4825
        add   eax,ebp
4826
        xor   edi,edi
4827
        jmp   dtext
1 ha 4828
 
4829
align 4
4830
 
429 serge 4831
syscall_openramdiskfile:                ; OpenRamdiskFile
1 ha 4832
 
4833
 
379 serge 4834
     mov   edi,[TASK_BASE]
164 serge 4835
     add   edi,TASKDATA.mem_start
1 ha 4836
     add   eax,[edi]
4837
     add   edx,[edi]
4838
     mov   esi,12
4839
     call  fileread
4840
     mov   [esp+36],ebx
4841
     ret
4842
 
4843
align 4
4844
 
429 serge 4845
syscall_drawrect:                       ; DrawRect
1 ha 4846
 
4847
     mov   edi,ecx
52 mikedld 4848
     and   edi,0x80FFFFFF
1 ha 4849
     test  ax,ax
4850
     je    drectr
4851
     test  bx,bx
4852
     je    drectr
4853
     movzx ecx,ax
4854
     shr   eax,16
4855
     movzx edx,bx
4856
     shr   ebx,16
465 serge 4857
        mov     esi,[current_slot]
4858
        add     eax,[esi+APPDATA.wnd_clientbox.left]
4859
        add     ebx,[esi+APPDATA.wnd_clientbox.top]
1 ha 4860
     add   ecx,eax
4861
     add   edx,ebx
4862
     jmp   [drawbar]
4863
    drectr:
4864
     ret
4865
 
4866
align 4
4867
 
429 serge 4868
syscall_getscreensize:                  ; GetScreenSize
1 ha 4869
 
381 serge 4870
     movzx eax,word[ScreenWidth]
1 ha 4871
     shl   eax,16
381 serge 4872
     mov   ax,[ScreenHeight]
1 ha 4873
     mov   [esp+36],eax
4874
     ret
4875
 
4876
align 4
4877
 
429 serge 4878
syscall_cdaudio:                        ; CD
1 ha 4879
 
4880
     call  sys_cd_audio
4881
     mov   [esp+36],eax
4882
     ret
4883
 
4884
align 4
4885
 
429 serge 4886
syscall_delramdiskfile:                 ; DelRamdiskFile
1 ha 4887
 
379 serge 4888
     mov   edi,[TASK_BASE]
164 serge 4889
     add   edi,TASKDATA.mem_start
1 ha 4890
     add   eax,[edi]
4891
     call  filedelete
4892
     mov   [esp+36],eax
4893
     ret
4894
 
4895
align 4
4896
 
429 serge 4897
syscall_writeramdiskfile:               ; WriteRamdiskFile
1 ha 4898
 
379 serge 4899
     mov   edi,[TASK_BASE]
164 serge 4900
     add   edi,TASKDATA.mem_start
1 ha 4901
     add   eax,[edi]
4902
     add   ebx,[edi]
4903
     call  filesave
4904
     mov   [esp+36],eax
4905
     ret
4906
 
4907
align 4
4908
 
429 serge 4909
syscall_getpixel:                       ; GetPixel
381 serge 4910
     mov   ecx,[ScreenWidth]
1 ha 4911
     inc   ecx
4912
     xor   edx,edx
4913
     div   ecx
4914
     mov   ebx,edx
4915
     xchg  eax,ebx
465 serge 4916
     call  dword [GETPIXEL]
1 ha 4917
     mov   [esp+36],ecx
4918
     ret
4919
 
4920
align 4
4921
 
429 serge 4922
syscall_readstring:                     ; ReadString
1 ha 4923
 
379 serge 4924
     mov   edi,[TASK_BASE]
164 serge 4925
     add   edi,TASKDATA.mem_start
1 ha 4926
     add   eax,[edi]
4927
     call  read_string
4928
     mov   [esp+36],eax
4929
     ret
4930
 
4931
align 4
4932
 
429 serge 4933
syscall_drawline:                       ; DrawLine
1 ha 4934
 
379 serge 4935
     mov   edi,[TASK_BASE]
115 poddubny 4936
     movzx edx,word[edi-twdw+WDATA.box.left]
1 ha 4937
     mov   ebp,edx
465 serge 4938
        mov     esi,[current_slot]
4939
        add     ebp,[esi+APPDATA.wnd_clientbox.left]
4940
        add     dx,word[esi+APPDATA.wnd_clientbox.left]
1 ha 4941
     shl   edx,16
4942
     add   ebp,edx
115 poddubny 4943
     movzx edx,word[edi-twdw+WDATA.box.top]
1 ha 4944
     add   eax,ebp
4945
     mov   ebp,edx
465 serge 4946
        add     ebp,[esi+APPDATA.wnd_clientbox.top]
4947
        add     dx,word[esi+APPDATA.wnd_clientbox.top]
1 ha 4948
     shl   edx,16
4949
     xor   edi,edi
4950
     add   edx,ebp
4951
     add   ebx,edx
4952
     jmp   [draw_line]
4953
 
4954
align 4
4955
 
429 serge 4956
syscall_getirqowner:                    ; GetIrqOwner
75 diamond 4957
     cmp   eax,16
4958
     jae   .err
1 ha 4959
     shl   eax,2
4960
     add   eax,irq_owner
4961
     mov   eax,[eax]
4962
     mov   [esp+36],eax
4963
     ret
75 diamond 4964
.err:
4965
     or    dword [esp+36], -1
4966
     ret
1 ha 4967
 
4968
align 4
4969
 
429 serge 4970
syscall_reserveportarea:                ; ReservePortArea and FreePortArea
1 ha 4971
 
4972
     call  r_f_port_area
4973
     mov   [esp+36],eax
4974
     ret
4975
 
4976
align 4
4977
 
429 serge 4978
syscall_threads:                        ; CreateThreads
1 ha 4979
 
4980
     call  sys_threads
4981
     mov   [esp+36],eax
4982
     ret
4983
 
4984
align 4
4985
 
4986
stack_driver_stat:
4987
 
429 serge 4988
     call  app_stack_handler            ; Stack status
1 ha 4989
 
4990
;     mov   [check_idle_semaphore],5    ; enable these for zero delay
4991
;     call  change_task                 ; between sent packet
4992
 
4993
     mov   [esp+36],eax
4994
     ret
4995
 
4996
align 4
4997
 
429 serge 4998
socket:                                 ; Socket interface
1 ha 4999
     call  app_socket_handler
5000
 
5001
;     mov   [check_idle_semaphore],5    ; enable these for zero delay
5002
;     call  change_task                 ; between sent packet
5003
 
5004
     mov   [esp+36],eax
5005
     mov   [esp+24],ebx
5006
     ret
5007
 
5008
align 4
5009
 
429 serge 5010
user_events:                            ; User event times
1 ha 5011
 
5012
     mov   eax,0x12345678
5013
     mov   [esp+36],eax
5014
 
5015
     ret
5016
 
5017
align 4
5018
 
429 serge 5019
read_from_hd:                           ; Read from hd - fn not in use
1 ha 5020
 
379 serge 5021
     mov   edi,[TASK_BASE]
115 poddubny 5022
     add   edi,TASKDATA.mem_start
1 ha 5023
     add   eax,[edi]
5024
     add   ecx,[edi]
5025
     add   edx,[edi]
5026
     call  file_read
5027
 
5028
     mov   [esp+36],eax
5029
     mov   [esp+24],ebx
5030
 
5031
     ret
5032
 
375 Ghost 5033
align 4
5034
paleholder:
5035
	ret
378 serge 5036
 
76 mario79 5037
; --------------- APM ---------------------
5038
apm_entry    dp    0
429 serge 5039
apm_vf        dd    0
1 ha 5040
align 4
76 mario79 5041
sys_apm:
5042
    cmp    word [apm_vf], 0    ; Check APM BIOS enable
5043
    jne    @f
429 serge 5044
    or    [esp + 56], byte 1    ; error
5045
    mov    [esp + 36], dword 8    ; 32-bit protected-mode interface not supported
76 mario79 5046
    ret
164 serge 5047
 
465 serge 5048
@@:
5049
    xchg    eax, ecx
76 mario79 5050
    xchg    ebx, ecx
164 serge 5051
 
76 mario79 5052
    cmp    al, 3
429 serge 5053
    ja    @f
78 diamond 5054
    and    [esp + 56], byte 0xfe    ; emulate func 0..3 as func 0
76 mario79 5055
    mov    eax, [apm_vf]
5056
    mov    [esp + 36], eax
5057
    shr    eax, 16
5058
    mov    [esp + 32], eax
5059
    ret
78 diamond 5060
 
465 serge 5061
@@:
5062
 
5063
    mov esi, [master_tab+(OS_BASE shr 20)]
5064
    xchg [master_tab], esi
5065
    push esi
5066
    mov edi, cr3
5067
    mov cr3, edi                 ;flush TLB
5068
 
5069
    call    pword [apm_entry]    ; call APM BIOS
5070
 
5071
    xchg eax, [esp]
5072
    mov [master_tab], eax
5073
    mov eax, cr3
5074
    mov cr3, eax
5075
    pop eax
5076
 
76 mario79 5077
    mov    [esp + 8 ], edi
5078
    mov    [esp + 12], esi
5079
    mov    [esp + 24], ebx
5080
    mov    [esp + 28], edx
5081
    mov    [esp + 32], ecx
5082
    mov    [esp + 36], eax
5083
    setc    al
78 diamond 5084
    and    [esp + 56], byte 0xfe
429 serge 5085
    or    [esp + 56], al
465 serge 5086
 
5087
 
76 mario79 5088
    ret
5089
; -----------------------------------------
1 ha 5090
 
76 mario79 5091
align 4
5092
 
429 serge 5093
undefined_syscall:                      ; Undefined system call
1 ha 5094
 
5095
     mov   [esp+36],dword -1
5096
     ret
5097
 
465 serge 5098
align 4
5099
system_shutdown:          ; shut down the system
1 ha 5100
 
465 serge 5101
           cmp byte [BOOT_VAR+0x9030], 1
5102
           jne @F
5103
           ret
5104
@@:
5105
           call stop_all_services
5106
           push 3                ; stop playing cd
5107
           pop  eax
5108
           call sys_cd_audio
1 ha 5109
 
465 serge 5110
yes_shutdown_param:
5111
           cli
1 ha 5112
 
465 serge 5113
           mov  eax, kernel_file ; load kernel.mnt to 0x8000:0
5114
           push 12
5115
           pop  esi
5116
           xor  ebx,ebx
5117
           or   ecx,-1
5118
           mov  edx, OS_BASE+0x80000
5119
           call fileread
1 ha 5120
 
465 serge 5121
           mov  esi, restart_kernel_4000+OS_BASE+0x10000 ; move kernel re-starter to 0x4000:0
5122
           mov  edi,OS_BASE+0x40000
5123
           mov  ecx,1000
5124
           rep  movsb
1 ha 5125
 
465 serge 5126
           mov  esi,OS_BASE+0x2F0000    ; restore 0x0 - 0xffff
5127
           mov  edi, OS_BASE
5128
           mov  ecx,0x10000/4
5129
           cld
5130
           rep movsd
1 ha 5131
 
465 serge 5132
           call restorefatchain
1 ha 5133
 
465 serge 5134
           mov al, 0xFF
5135
           out 0x21, al
5136
           out 0xA1, al
1 ha 5137
 
465 serge 5138
           mov  word [OS_BASE+0x467+0],pr_mode_exit
5139
           mov  word [OS_BASE+0x467+2],0x1000
1 ha 5140
 
465 serge 5141
           mov  al,0x0F
5142
           out  0x70,al
5143
           mov  al,0x05
5144
           out  0x71,al
1 ha 5145
 
465 serge 5146
           mov  al,0xFE
5147
           out  0x64,al
5148
           hlt
1 ha 5149
 
5150
 
465 serge 5151
include "data32.inc"
1 ha 5152
 
465 serge 5153
__REV__ = __REV
1 ha 5154
 
5155
uglobals_size = $ - endofcode
41 mikedld 5156
diff16 "end of kernel code",0,$
426 mikedld 5157