Subversion Repositories Kolibri OS

Rev

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

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