Subversion Repositories Kolibri OS

Rev

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