Subversion Repositories Kolibri OS

Rev

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

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