Subversion Repositories Kolibri OS

Rev

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

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