Subversion Repositories Kolibri OS

Rev

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