Subversion Repositories Kolibri OS

Rev

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

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