Subversion Repositories Kolibri OS

Rev

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

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