Subversion Repositories Kolibri OS

Rev

Rev 5565 | Rev 5594 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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