Subversion Repositories Kolibri OS

Rev

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

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