Subversion Repositories Kolibri OS

Rev

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

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