Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 213 → Rev 214

/kernel/trunk/const.inc
180,7 → 180,7
HD_CACHE_ENT equ OS_BASE+0x000FE10
LFBAddress equ OS_BASE+0x000FE80
MEM_AMOUNT equ OS_BASE+0x000FE8C
LFBSize equ OS_BASE+0x02f9050
;LFBSize equ OS_BASE+0x02f9050
 
SCR_X_SIZE equ OS_BASE+0x000FE00
SCR_Y_SIZE equ OS_BASE+0x000FE04
377,6 → 377,7
.magic dd ?
.size dd ?
.base dd ?
.entry dd ?
.srv_proc dd ?
}
 
/kernel/trunk/core/except.inc
File deleted
/kernel/trunk/core/dll.inc
1,18 → 1,7
;
; This file is part of the Infinity sound AC97 driver.
; (C) copyright Serge 2006
; email: infinity_sound@mail.ru
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
 
DRV_ENTRY equ 1
DRV_EXIT equ -1
 
align 4
proc attach_int_handler stdcall, irq:dword, handler:dword
 
713,6 → 702,7
endl
 
stdcall load_file, [file_name]
 
test eax, eax
jz .fail
 
809,7 → 799,7
stdcall kernel_free, [coff]
 
mov ebx, [start]
call ebx
stdcall ebx, DRV_ENTRY
test eax, eax
jnz .ok
 
819,6 → 809,8
.ok:
mov ebx, [img_base]
mov [eax+SRV.base], ebx
mov ecx, [start]
mov [eax+SRV.entry], ecx
ret
.fail:
xor eax, eax
930,12 → 922,35
ret
endp
 
align 4
proc stop_all_services
pushf
cli
mov eax, [srv_map]
not eax
mov [srv_map], eax
.next:
bsf eax, [srv_map]
jnz .find
popf
ret
.find:
btr [srv_map], eax
shl eax,0x02
lea eax,[srv_tab+eax+eax*8] ;srv_tab+eax*36
mov ebx, [eax+SRV.entry]
stdcall ebx, dword -1
jmp .next
endp
 
 
drv_sound db '/rd/1/drivers/unisound.obj', 0
drv_infinity db '/rd/1/drivers/infinity.obj', 0
drv_ati2d db '/rd/1/drivers/ati2d.obj', 0
 
szSound db 'SOUND',0
szInfinity db 'INFINITY',0
szHMouse db 'ATI2D',0
 
szSTART db 'START',0
szEXPORTS db 'EXPORTS',0
945,8 → 960,12
msg_module db 'in module ',0
msg_CR db 13,10,0
 
align 4
set_hw_cursor dd 0
 
align 16
services:
dd szSound, drv_sound
dd szInfinity, drv_infinity
dd szHMouse, drv_ati2d
dd 0
/kernel/trunk/core/exports.inc
20,6 → 20,10
dd szServiceHandler , srv_handler
dd szFpuSave , fpu_save
dd szFpuRestore , fpu_restore
dd szSetHwCursor , set_hw_cursor
dd szLoadFile , load_file
exp_lfb:
dd szLFBAddress , 0
dd 0
 
szKernel db 'KERNEL', 0
40,6 → 44,9
szServiceHandler db 'ServiceHandler',0
szFpuSave db 'FpuSave',0
szFpuRestore db 'FpuRestore',0
szSetHwCursor db 'SetHwCursor',0
szLFBAddress db 'LFBAddress',0
szLoadFile db 'LoadFile',0
 
endg
 
/kernel/trunk/core/fpu.inc
0,0 → 1,223
 
init_fpu:
clts
fninit
 
bt [cpu_caps], CAPS_FXSR
jnc .no_FXSR
 
stdcall kernel_alloc, 512*256
mov [fpu_data], eax
 
mov ebx, cr4
mov ecx, cr0
or ebx, CR4_OSFXSR+CR4_OSXMMEXPT
mov cr4, ebx
 
and ecx, not (CR0_MP+CR0_EM)
or ecx, CR0_NE
mov cr0, ecx
 
mov dword [esp-4], SSE_INIT
ldmxcsr [esp-4]
 
xorps xmm0, xmm0
xorps xmm1, xmm1
xorps xmm2, xmm2
xorps xmm3, xmm3
xorps xmm4, xmm4
xorps xmm5, xmm5
xorps xmm6, xmm6
xorps xmm7, xmm7
fxsave [eax]
ret
.no_FXSR:
stdcall kernel_alloc, 112*256
mov [fpu_data], eax
mov ecx, cr0
and ecx, not CR0_EM
or ecx, CR0_MP+CR0_NE
mov cr0, ecx
fnsave [eax]
ret
 
align 4
proc fpu_save
clts
mov ebx, [fpu_owner]
shl ebx, 8
mov eax, [ebx+PROC_BASE+0x10]
mov ebx, [CURRENT_TASK]
mov [fpu_owner], ebx
 
bt [cpu_caps], CAPS_FXSR
jnc .no_SSE
 
fxsave [eax]
fninit ;re-init fpu
ret
.no_SSE:
fnsave [eax]
ret
endp
 
align 4
proc fpu_restore
mov ebx, [CURRENT_TASK]
shl ebx, 8
mov eax, [ebx+PROC_BASE+0x10]
bt [cpu_caps], CAPS_FXSR
jnc .no_SSE
 
fxrstor [eax]
ret
.no_SSE:
fnclex ;fix possible problems
frstor [eax]
ret
endp
 
align 4
e7: ;#NM exception handler
save_ring3_context
clts
mov ax, os_data
mov ds, ax
mov es, ax
 
mov ebx, [fpu_owner]
cmp ebx, [CURRENT_TASK]
je .exit
 
shl ebx, 8
mov eax, [ebx+PROC_BASE+APPDATA.fpu_state]
bt [cpu_caps], CAPS_FXSR
jnc .no_SSE
 
fxsave [eax]
mov ebx, [CURRENT_TASK]
mov [fpu_owner], ebx
shl ebx, 8
mov eax, [ebx+PROC_BASE+APPDATA.fpu_state]
fxrstor [eax]
.exit:
restore_ring3_context
iret
 
.no_SSE:
fnsave [eax]
mov ebx, [CURRENT_TASK]
mov [fpu_owner], ebx
shl ebx, 8
mov eax, [ebx+PROC_BASE+APPDATA.fpu_state]
frstor [eax]
restore_ring3_context
iret
 
iglobal
fpu_owner dd 1
endg
 
 
 
reg_eip equ ebp+4
reg_cs equ ebp+8
reg_eflags equ ebp+12
reg_esp equ ebp+16
reg_ss equ ebp+20
 
align 4
except_16: ;fpu native exceptions handler
push ebp
mov ebp, esp
 
push eax
push ebx
push ecx
push edx
 
mov ebx, [ss:CURRENT_TASK]
shl ebx, 8
 
mov eax, [ss:ebx+PROC_BASE+APPDATA.fpu_handler]
test eax, eax
jz .default
 
mov ecx, [reg_eip]
mov edx, [reg_esp]
sub edx, 4
mov [ss:edx+new_app_base], ecx
mov [reg_esp], edx
mov dword [reg_eip], eax
 
pop edx
pop ecx
pop ebx
pop eax
 
leave
iretd
 
.default:
pop edx
pop ecx
pop ebx
pop eax
leave
 
save_ring3_context ;debugger support
 
mov bl, 16
jmp exc_c
 
align 4
except_19: ;sse exceptions handler
push ebp
mov ebp, esp
 
push eax
push ebx
push ecx
push edx
 
mov ebx, [ss:CURRENT_TASK]
shl ebx, 8
 
mov eax, [ss:ebx+PROC_BASE+APPDATA.sse_handler]
test eax, eax
jz .default
 
mov ecx, [reg_eip]
mov edx, [reg_esp]
sub edx, 4
mov [ss:edx+new_app_base], ecx
mov [reg_esp], edx
mov dword [reg_eip], eax
 
pop edx
pop ecx
pop ebx
pop eax
 
leave
iretd
 
.default:
pop edx
pop ecx
pop ebx
pop eax
leave
 
save_ring3_context ;debugger support
 
mov bl, 19
jmp exc_c
 
restore reg_eip
restore reg_cs
restore reg_eflags
restore reg_esp
restore reg_ss
 
 
/kernel/trunk/core/heap.inc
680,7 → 680,6
and eax, 0xFFFFF000
cmp eax, ecx ;alloc_size
jb m_next
jz @f
 
mov edx, esi
add edx, ecx
688,7 → 687,7
or eax, FREE_BLOCK
shr edx, 12
mov [pages_tab+edx*4], eax
@@:
 
or ecx, USED_BLOCK
mov [pages_tab+ebx*4], ecx
shr ecx, 12
754,8 → 753,6
shl ebx, 8
mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base
mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top
add esi, new_app_base
add edi, new_app_base
shr esi, 12
shr edi, 12
@@:
826,10 → 823,10
popf
xor eax, eax
ret
 
.find: btr [srv_map], eax
.find:
btr [srv_map], eax
popf
shl eax,5
add eax, srv_tab
shl eax,0x02
lea eax,[srv_tab+eax+eax*8] ;srv_tab+eax*36
ret
endp
/kernel/trunk/core/memory.inc
3,6 → 3,7
 
align 4
proc mem_test
 
mov eax, cr0
and eax, not (CR0_CD+CR0_NW)
or eax, CR0_CD ;disable caching
21,6 → 22,7
and eax, not (CR0_CD+CR0_NW) ;enable caching
mov cr0, eax
mov eax, edi
mov [LFBSize], 0x00800000
ret
endp
 
49,8 → 51,6
mov dword [sys_pgdir+4], eax
add eax, 0x00400000
mov dword [sys_pgdir+8], eax
; add eax, 0x00400000
; mov dword [sys_pgdir+12], eax
 
mov dword [sys_pgdir+0x600], sys_pgdir+PG_SW
 
306,6 → 306,8
 
mov edi, [LFBSize]
mov esi, [LFBAddress]
mov dword [exp_lfb+4], esi
 
shr edi, 12
mov [pg_count], edi
shr edi, 10
1028,42 → 1030,6
endp
 
align 4
proc fpu_save
clts
mov ebx, [fpu_owner]
shl ebx, 8
mov eax, [ebx+PROC_BASE+0x10]
mov ebx, [CURRENT_TASK]
mov [fpu_owner], ebx
 
bt [cpu_caps], CAPS_FXSR
jnc .no_SSE
 
fxsave [eax]
fninit ;re-init fpu
ret
.no_SSE:
fnsave [eax]
ret
endp
 
align 4
proc fpu_restore
mov ebx, [CURRENT_TASK]
shl ebx, 8
mov eax, [ebx+PROC_BASE+0x10]
bt [cpu_caps], CAPS_FXSR
jnc .no_SSE
 
fxrstor [eax]
ret
.no_SSE:
fnclex ;fix possible problems
frstor [eax]
ret
endp
 
align 4
proc test_cpu
locals
cpu_type dd ?
1286,10 → 1252,9
tmp_task_ptab rd 1
tmp_task_data rd 1
 
; current_pdir rd 1
 
fpu_data rd 1
fdd_buff rd 1
LFBSize rd 1
 
stall_mcs rd 1
;;CPUID information
1303,7 → 1268,7
uglobal
align 16
dll_tab rb 32*32
srv_tab rb 32*32
srv_tab rb 36*32
dll_map rd 1
srv_map rd 1
 
/kernel/trunk/core/sys32.inc
192,63 → 192,6
restore_ring3_context
iretd
 
;;;;;;;;;;;;;;;;;;;;;;;
;; FPU ERROR HANDLER ;;
;;;;;;;;;;;;;;;;;;;;;;;
 
align 4
e7:
save_ring3_context
clts
mov ax, os_data
mov ds, ax
mov es, ax
 
mov ebx, [fpu_owner]
cmp ebx, [CURRENT_TASK]
je .exit
 
shl ebx, 8
mov eax, [ebx+PROC_BASE+APPDATA.fpu_state]
bt [cpu_caps], CAPS_FXSR
jnc .no_SSE
 
fxsave [eax]
mov ebx, [CURRENT_TASK]
mov [fpu_owner], ebx
shl ebx, 8
cmp dword [ebx+PROC_BASE+APPDATA.fpu_init], 0
je .init
mov eax, [ebx+PROC_BASE+APPDATA.fpu_state]
fxrstor [eax]
restore_ring3_context
iret
 
.no_SSE:
fnsave [eax]
mov ebx, [CURRENT_TASK]
mov [fpu_owner], ebx
shl ebx, 8
cmp dword [ebx+PROC_BASE+APPDATA.fpu_init], 0
je .ready
 
mov eax, [ebx+PROC_BASE+APPDATA.fpu_state]
frstor [eax]
restore_ring3_context
iret
.init:
fninit ;­ ¬ ­¥ ­ã¦­ë ­¥¬ áª¨à®¢ ­­ë¥ ¨áª«î祭¨ï
.ready:
mov dword [ebx+PROC_BASE+APPDATA.fpu_init], 1
.exit:
restore_ring3_context
iret
 
iglobal
fpu_owner dd 1
endg
 
 
writehex:
pusha
 
/kernel/trunk/core/taskman.inc
1,4 → 1,4
GREEDY_KERNEL equ 0; 1
GREEDY_KERNEL equ 0
 
 
struc APP_HEADER_00
604,29 → 604,34
proc add_app_parameters stdcall,slot:dword,img_base:dword,\
cmd_line:dword, app_path:dword, flags:dword
 
mov eax,[slot]
mov edi, [slot]
mov esi, [fpu_data]
bt [cpu_caps], CAPS_FXSR
jnc .no_SSE
 
shl edi, 8
mov eax, edi
lea edi, [esi+edi*2]
mov [eax+PROC_BASE+APPDATA.fpu_state], edi
mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
mov [eax+PROC_BASE+APPDATA.sse_handler], 0
mov ecx, 512/4
jmp @F
.no_SSE:
mov eax, edi
shl eax, 8
mov ebx, eax
add eax, eax
add eax, [fpu_data]
mov [ebx+PROC_BASE+APPDATA.fpu_state], eax
mov [ebx+PROC_BASE+APPDATA.fpu_handler], 0
mov [ebx+PROC_BASE+APPDATA.sse_handler], 0
jmp .m1
.no_SSE:
mov ecx, eax
mov ebx, eax
shl eax, 7
mov ebx, edi
shl edi, 7
shl ebx, 4
sub eax, ebx ;eax*=112
add eax, [fpu_data]
shl ecx, 8
mov [ecx+PROC_BASE+APPDATA.fpu_state], eax
mov [ecx+PROC_BASE+APPDATA.fpu_handler], 0
mov [ecx+PROC_BASE+APPDATA.sse_handler], 0
.m1:
sub edi, ebx ;edi*=112
add edi, esi
mov [eax+PROC_BASE+APPDATA.fpu_state], edi
mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
mov [eax+PROC_BASE+APPDATA.sse_handler], 0
mov ecx, 112/4
@@:
rep movsd
 
mov ebx,[slot]
cmp ebx,[TASK_COUNT]
jle .noinc
/kernel/trunk/drivers/ati2d.asm
0,0 → 1,668
 
;alpha version
 
format MS COFF
 
 
include 'proc32.inc'
 
DEBUG equ 0
 
VID_ATI equ 0x1002
 
R8500 equ 0x514C ;R200
R9000 equ 0x4966 ;RV250
R9200 equ 0x5961 ;RV280
R9500 equ 0x4144 ;R300
R9500P equ 0x4E45 ;R300
R9550 equ 0x4153 ;RV350
R9600 equ 0x4150 ;RV350
R9600XT equ 0x4152 ;RV360
R9700P equ 0x4E44 ;R300
R9800 equ 0x4E49 ;R350
R9800P equ 0x4E48 ;R350
R9800XT equ 0x4E4A ;R360
 
OS_BASE equ 0; 0x80400000
new_app_base equ 0x60400000; 0x01000000
PROC_BASE equ OS_BASE+0x0080000
 
PG_SW equ 0x003
PG_NOCACHE equ 0x018
 
struc IOCTL
{ .handle dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
}
 
virtual at 0
IOCTL IOCTL
end virtual
 
;MMIO equ 0F9000000h
RD_RB3D_CNTL equ 1c3ch
 
RD_MEM_CNTL equ 0140h
RD_CRTC_GEN_CNTL equ 0050h
RD_CRTC_CUR_EN equ 10000h
RD_DISPLAY_BASE_ADDR equ 023ch
RD_DEFAULT_OFFSET equ 16e0h
CUR_HORZ_VERT_OFF equ 0268h
CUR_HORZ_VERT_POSN equ 0264h
CUR_OFFSET equ 0260h
RD_RB3D_CNTL equ 1c3ch
RD_RBBM_STATUS equ 0e40h
RD_RBBM_FIFOCNT_MASK equ 007fh
RD_RBBM_ACTIVE equ 80000000h
RD_TIMEOUT equ 2000000
 
RD_DP_GUI_MASTER_CNTL equ 0146ch
RD_DP_BRUSH_BKGD_CLR equ 01478h
RD_DP_BRUSH_FRGD_CLR equ 0147ch
RD_DP_SRC_BKGD_CLR equ 015dch
RD_DP_SRC_FRGD_CLR equ 015d8h
RD_DP_CNTL equ 016c0h
RD_DP_DATATYPE equ 016c4h
RD_DP_WRITE_MASK equ 016cch
RD_DP_SRC_SOURCE_MEMORY equ (2 shl 24)
RD_DP_SRC_SOURCE_HOST_DATA equ (3 shl 24)
RD_DEFAULT_SC_BOTTOM_RIGHT equ 16e8h
RD_GMC_BRUSH_SOLID_COLOR equ (13 shl 4)
RD_DEFAULT_SC_RIGHT_MAX equ 1fffh
RD_DEFAULT_SC_BOTTOM_MAX equ 1fff0000h
RD_GMC_DST_DATATYPE_SHIFT equ 8
 
RD_ROP3_S equ 00cc0000h
RD_ROP3_P equ 00f00000h
 
RD_RB2D_DSTCACHE_MODE equ 03428h
RD_RB2D_DSTCACHE_CTLSTAT equ 0342ch
RD_RB2D_DC_FLUSH_ALL equ 000fh
RD_RB2D_DC_BUSY equ 80000000h
 
RD_GMC_BRUSH_SOLID_COLOR equ 000000D0h
RD_GMC_SRC_DATATYPE_COLOR equ (3 shl 12)
RD_GMC_CLR_CMP_CNTL_DIS equ (1 shl 28)
RD_GMC_WR_MSK_DIS equ (1 shl 30)
 
cmdSolidFill equ 73f036d0h
 
RD_DST_PITCH_OFFSET equ 142ch
RD_SRC_PITCH_OFFSET equ 1428h
 
RD_DST_X_LEFT_TO_RIGHT equ 1
RD_DST_Y_TOP_TO_BOTTOM equ 2
RD_DST_Y_X equ 1438h
RD_DST_WIDTH_HEIGHT equ 1598h
RD_DST_LINE_START equ 1600h
RD_DST_LINE_END equ 1604h
R300_MEM_NUM_CHANNELS_MASK equ 0003h
 
macro rdr op1, op2
{
mov edi, [ati_io]
mov op1, [edi+op2]
}
 
macro wrr dest, src
{
mov edi, [ati_io]
mov dword [edi+dest], src
}
 
 
public START
public service_proc
 
extrn SysMsgBoardStr
extrn PciApi
extrn PciRead32
extrn AllocKernelSpace
extrn MapPage
extrn RegService
extrn SetHwCursor
extrn LFBAddress
extrn LoadFile
 
CURSOR_IMAGE_OFFSET equ 0x00500000
 
DRV_ENTRY equ 1
DRV_EXIT equ -1
 
section '.flat' code readable align 16
 
proc START stdcall, state:dword
 
mov eax, [state]
cmp eax, 1
je .entry
jmp .exit
.entry:
if DEBUG
mov esi, msgInit
call SysMsgBoardStr
end if
 
call detect_ati
test eax, eax
jz .fail
 
stdcall LoadFile, user_file
test eax, eax
jz @F
mov [user_arrow], eax
@@:
stdcall ati_init_cursor, [user_arrow]
 
call init_ati
test eax, eax
jz .fail
 
stdcall RegService, sz_ati_srv, service_proc
test eax, eax
jz .fail
mov ebx, SetHwCursor
mov dword [ebx], drvCursorPos ;enable hardware cursor
ret
.fail:
if DEBUG
mov esi, msgFail
call SysMsgBoardStr
end if
 
.exit:
xor eax, eax
mov ebx, SetHwCursor
mov dword [ebx], eax ;force disable hardware cursor
ret
endp
 
handle equ IOCTL.handle
io_code equ IOCTL.io_code
input equ IOCTL.input
inp_size equ IOCTL.inp_size
output equ IOCTL.output
out_size equ IOCTL.out_size
 
align 4
proc service_proc stdcall, ioctl:dword
 
; mov edi, [ioctl]
; mov eax, [edi+io_code]
 
xor eax, eax
ret
endp
 
restore handle
restore io_code
restore input
restore inp_size
restore output
restore out_size
 
align 4
proc detect_ati
locals
last_bus dd ?
endl
 
xor eax, eax
mov [bus], eax
inc eax
call PciApi
cmp eax, -1
je .err
 
mov [last_bus], eax
 
.next_bus:
and [devfn], 0
.next_dev:
stdcall PciRead32, [bus], [devfn], dword 0
test eax, eax
jz .next
cmp eax, -1
je .next
 
mov edi, devices
@@:
mov ebx, [edi]
test ebx, ebx
jz .next
 
cmp eax, ebx
je .found
add edi, 4
jmp @B
 
.next: inc [devfn]
cmp [devfn], 256
jb .next_dev
mov eax, [bus]
inc eax
mov [bus], eax
cmp eax, [last_bus]
jna .next_bus
xor eax, eax
ret
.found:
xor eax, eax
inc eax
ret
.err:
xor eax, eax
ret
endp
 
align 4
proc init_ati
 
stdcall AllocKernelSpace, dword 0x10000
test eax, eax
jz .fail
 
mov [ati_io], eax
 
stdcall PciRead32, [bus], [devfn], dword 0x18
and eax, 0xFFFF0000
mov esi, eax
 
mov edi, [ati_io]
mov edx, 16
@@:
stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
add edi, 0x1000
add esi, 0x1000
dec edx
jnz @B
 
mov edi, [ati_io]
mov dword [edi+RD_RB3D_CNTL], 0
call engRestore
 
mov edi, [ati_io]
mov eax, [edi+0x50]
mov ebx,3
shl ebx,20
not ebx
and eax,ebx
mov ebx, 2
shl ebx,20
or eax, ebx
mov [edi+0x50], eax
 
pushd 0
pushd 0
call drvCursorPos
call drvShowCursor
xor eax, eax
inc eax
.fail:
ret
endp
 
align 4
drvShowCursor:
mov edi, [ati_io]
 
mov eax, [edi+RD_CRTC_GEN_CNTL]
bts eax,16
mov [edi+RD_CRTC_GEN_CNTL], eax
ret
 
align 4
drvCursorPos:
push ebp
mov ebp, esp
mov eax, 80000000h
wrr CUR_HORZ_VERT_OFF, eax
 
mov eax, [ebp+8]
shl eax, 16
or eax, [ebp+12]
or eax, 80000000h
wrr CUR_HORZ_VERT_POSN, eax
 
mov eax, CURSOR_IMAGE_OFFSET
wrr CUR_OFFSET, eax
leave
ret 8
 
align 4
proc ati_init_cursor stdcall, arrow:dword
locals
rBase dd ?
pQuad dd ?
pBits dd ?
pAnd dd ?
width dd ?
height dd ?
counter dd ?
endl
 
cld
 
mov esi, [arrow]
add esi,[esi+18d]
 
mov eax,esi
add eax, [esi]
mov [pQuad],eax
add eax,64
mov [pBits],eax
add eax, 0x200
mov [pAnd],eax
mov eax,[esi+4]
mov [width],eax
mov ebx,[esi+8]
shr ebx,1
mov [height],ebx
 
mov edi, pCursor
add edi, 32*31*4
mov [rBase],edi
 
mov esi,[pAnd]
mov ebx, [pBits]
.l1:
mov eax, [esi]
bswap eax
mov [counter], 16
@@:
xor edx, edx
shl eax,1
setc dl
dec edx
 
mov ecx, [ebx]
and ecx, 0xF0
shr ecx, 2
add ecx, [pQuad]
mov ecx, [ecx]
and ecx, edx
and edx, 0xFF000000
or edx, ecx
mov [edi], edx
 
xor edx, edx
shl eax,1
setc dl
dec edx
 
mov ecx, [ebx]
and ecx, 0x0F
shl ecx, 2
add ecx, [pQuad]
mov ecx, [ecx]
and ecx, edx
and edx, 0xFF000000
or edx, ecx
mov [edi+4], edx
 
inc ebx
add edi, 8
dec [counter]
jnz @B
 
add esi, 4
mov edi,[rBase]
sub edi,128
mov [rBase],edi
sub [height],1
jnz .l1
 
mov edi, LFBAddress
add edi, CURSOR_IMAGE_OFFSET
mov ecx, 64*64
xor eax,eax
rep stosd
 
mov esi, pCursor
mov edi, LFBAddress
add edi, CURSOR_IMAGE_OFFSET
mov ebx, 32
lc:
mov ecx, 32
lb:
mov eax, [esi]
mov [edi], eax
add esi, 4
add edi, 4
sub ecx, 1
jnz lb
 
add edi, 128
sub ebx, 1
jnz lc
 
ret
endp
 
align 4
proc engFlush
 
mov edi, [ati_io]
 
mov eax, [edi+RD_RB2D_DSTCACHE_CTLSTAT]
or eax,RD_RB2D_DC_FLUSH_ALL
mov [edi+RD_RB2D_DSTCACHE_CTLSTAT],eax
 
mov ecx, RD_TIMEOUT
@@:
mov eax,[edi+RD_RB2D_DSTCACHE_CTLSTAT]
and eax, RD_RB2D_DC_BUSY
jz .exit
 
sub ecx,1
jnz @B
.exit:
ret
endp
 
align 4
engWaitForFifo:
cnt equ bp+8
push ebp
mov ebp, esp
 
mov edi, [ati_io]
 
mov ecx, RD_TIMEOUT
@@:
mov eax, [edi+RD_RBBM_STATUS]
and eax, RD_RBBM_FIFOCNT_MASK
cmp eax, [ebp+8]
jae .exit
 
sub ecx,1
jmp @B
 
.exit:
leave
ret 4
 
align 4
proc engWaitForIdle
 
push dword 64
call engWaitForFifo
 
mov edi, [ati_io]
mov ecx ,RD_TIMEOUT
@@:
mov eax, [edi+RD_RBBM_STATUS]
and eax,RD_RBBM_ACTIVE
jz .exit
 
sub ecx,1
jnz @B
.exit:
call engFlush
ret
endp
 
align 4
proc engRestore
 
; push dword 1
; call engWaitForFifo
 
; mov dword [MMIO+RD_RB2D_DSTCACHE_MODE], 0
 
push dword 3
call engWaitForFifo
 
mov edi, [ati_io]
 
mov eax, [edi+RD_DISPLAY_BASE_ADDR]
shr eax, 10d
or eax,(64d shl 22d)
mov [edi+RD_DEFAULT_OFFSET],eax
mov [edi+RD_SRC_PITCH_OFFSET],eax
mov [edi+RD_DST_PITCH_OFFSET],eax
 
push dword 1
call engWaitForFifo
 
mov edi, [ati_io]
mov eax, [edi+RD_DP_DATATYPE]
btr eax, 29d
mov [edi+RD_DP_DATATYPE],eax
 
push dword 1
call engWaitForFifo
 
mov edi, [ati_io]
mov dword [edi+RD_DEFAULT_SC_BOTTOM_RIGHT],\
(RD_DEFAULT_SC_RIGHT_MAX or RD_DEFAULT_SC_BOTTOM_MAX)
 
push dword 1
call engWaitForFifo
 
mov edi, [ati_io]
mov dword [edi+RD_DP_GUI_MASTER_CNTL],\
(RD_GMC_BRUSH_SOLID_COLOR or \
RD_GMC_SRC_DATATYPE_COLOR or \
(6 shl RD_GMC_DST_DATATYPE_SHIFT) or \
RD_GMC_CLR_CMP_CNTL_DIS or \
RD_ROP3_P or \
RD_GMC_WR_MSK_DIS)
 
 
push dword 7
call engWaitForFifo
 
mov edi, [ati_io]
 
mov dword [edi+RD_DST_LINE_START],0
mov dword [edi+RD_DST_LINE_END], 0
mov dword [edi+RD_DP_BRUSH_FRGD_CLR], 808000ffh
mov dword [edi+RD_DP_BRUSH_BKGD_CLR], 002020ffh
mov dword [edi+RD_DP_SRC_FRGD_CLR], 808000ffh
mov dword [edi+RD_DP_SRC_BKGD_CLR], 004000ffh
mov dword [edi+RD_DP_WRITE_MASK],0ffffffffh
 
call engWaitForIdle
 
ret
endp
 
 
align 4
engSetupSolidFill:
push ebp
mov ebp, esp
 
push dword 3
call engWaitForFifo
 
wrr RD_DP_GUI_MASTER_CNTL, cmdSolidFill
 
mov eax, [ebp+8]
wrr RD_DP_BRUSH_FRGD_CLR,eax
 
mov edi, [ati_io]
mov dword [edi+RD_DP_CNTL],(RD_DST_X_LEFT_TO_RIGHT or RD_DST_Y_TOP_TO_BOTTOM)
leave
ret 4
 
 
align 4
drvSolidFill:
;x:word,y:word,w:word,h:word,color:dword
push ebp
mov ebp, esp
x equ ebp+8
y equ ebp+12
w equ ebp+16
h equ ebp+20
color equ ebp+24
 
push dword [ebp+24]
call engSetupSolidFill
 
push dword 2
call engWaitForFifo
 
mov edi, [ati_io]
 
mov eax, [y]
mov ebx, [x]
shl eax,16
or eax, ebx
 
mov ecx, [w]
mov edx, [h]
shl ecx,16
or ecx, edx
mov [edi+RD_DST_Y_X], eax
mov [edi+RD_DST_WIDTH_HEIGHT], ecx
call engFlush
leave
ret 20
 
align 4
devices dd (R8500 shl 16)+VID_ATI
dd (R9000 shl 16)+VID_ATI
dd (R9200 shl 16)+VID_ATI
dd (R9500 shl 16)+VID_ATI
dd (R9500P shl 16)+VID_ATI
dd (R9550 shl 16)+VID_ATI
dd (R9600 shl 16)+VID_ATI
dd (R9600XT shl 16)+VID_ATI
dd (R9700P shl 16)+VID_ATI
dd (R9800 shl 16)+VID_ATI
dd (R9800P shl 16)+VID_ATI
dd (R9800XT shl 16)+VID_ATI
dd 0 ;terminator
 
;szKernel db 'KERNEL', 0
sz_ati_srv db 'ATI2D',0
user_file db '/rd/1/user.cur',0
 
 
msgInit db 'detect hardware...',13,10,0
msgPCI db 'PCI accsess not supported',13,10,0
msgFail db 'device not found',13,10,0
 
user_arrow dd pArrow
 
align 16
pArrow:
file 'arrow.cur'
 
section '.data' data readable writable align 16
 
pCursor db 4096 dup(?)
 
bus dd ?
devfn dd ?
ati_io dd ?
 
 
 
/kernel/trunk/drivers/infinity.asm
27,7 → 27,6
PROC_BASE equ OS_BASE+0x0080000
 
public START
public STOP
public service_proc
 
extrn AttachIntHandler
73,7 → 72,13
 
section '.flat' code readable align 16
 
START:
proc START stdcall, state:dword
 
mov eax, [state]
cmp eax, 1
je .entry
jmp .exit
.entry:
stdcall GetService, szSound
test eax, eax
jz .fail
103,6 → 108,7
mov esi, msgFail
call SysMsgBoardStr
end if
.exit:
xor eax, eax
ret
 
112,8 → 118,8
call SysMsgBoardStr
end if
xor eax, eax
STOP:
ret
endp
 
handle equ IOCTL.handle
io_code equ IOCTL.io_code
406,7 → 412,6
 
endp
 
 
align 4
proc stop_buffer stdcall, str:dword
 
583,7 → 588,6
loop .l1
.exit:
ret
 
.fail:
stdcall DestroyBuffer, esi
jmp .restart
739,7 → 743,7
szSound db 'SOUND',0
 
if DEBUG
msgFail db 'Sound service not found',13,10,0
msgFail db 'Sound service not loaded',13,10,0
msgPlay db 'Play buffer',13,10,0
msgStop db 'Stop',13,10,0
msgUser db 'User callback',13,10,0
/kernel/trunk/drivers/sceletone.asm
0,0 → 1,173
 
;driver sceletone
 
format MS COFF
 
include 'proc32.inc'
 
 
OS_BASE equ 0;
new_app_base equ 0x60400000
PROC_BASE equ OS_BASE+0x0080000
 
struc IOCTL
{ .handle dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
}
 
virtual at 0
IOCTL IOCTL
end virtual
 
public START
public service_proc
 
extrn AttachIntHandler
extrn SysMsgBoardStr
extrn PciApi
extrn PciRead32
extrn PciRead8
extrn PciWrite8
extrn AllocKernelSpace
extrn KernelAlloc
extrn MapPage
extrn GetPgAddr
extrn RegService
extrn ServiceHandler
extrn SetHwCursor
extrn LFBAddress
extrn LoadFile
extrn FpuSave
extrn FpuRestore
 
DEBUG equ 1
 
DRV_ENTRY equ 1
DRV_EXIT equ -1
STRIDE equ 4 ;size of row in devices table
 
section '.flat' code readable align 16
 
proc START stdcall, state:dword
 
mov eax, [state]
cmp eax, 1
je .entry
jmp .exit
.entry:
if DEBUG
mov esi, msgInit
call SysMsgBoardStr
end if
 
stdcall RegService, my_service, service_proc
ret
.fail:
.exit:
xor eax, eax
ret
endp
 
handle equ IOCTL.handle
io_code equ IOCTL.io_code
input equ IOCTL.input
inp_size equ IOCTL.inp_size
output equ IOCTL.output
out_size equ IOCTL.out_size
 
align 4
proc service_proc stdcall, ioctl:dword
 
; mov edi, [ioctl]
; mov eax, [edi+io_code]
 
xor eax, eax
ret
endp
 
restore handle
restore io_code
restore input
restore inp_size
restore output
restore out_size
 
align 4
proc detect
locals
last_bus dd ?
endl
 
xor eax, eax
mov [bus], eax
inc eax
call PciApi
cmp eax, -1
je .err
 
mov [last_bus], eax
 
.next_bus:
and [devfn], 0
.next_dev:
stdcall PciRead32, [bus], [devfn], dword 0
test eax, eax
jz .next
cmp eax, -1
je .next
 
mov edi, devices
@@:
mov ebx, [edi]
test ebx, ebx
jz .next
 
cmp eax, ebx
je .found
add edi, STRIDE
jmp @B
 
.next: inc [devfn]
cmp [devfn], 256
jb .next_dev
mov eax, [bus]
inc eax
mov [bus], eax
cmp eax, [last_bus]
jna .next_bus
xor eax, eax
ret
.found:
xor eax, eax
inc eax
ret
.err:
xor eax, eax
ret
endp
 
 
;DEVICE_ID equ ; pci device id
;VENDOR_ID equ ; device vendor id
 
 
;all initialized data place here
 
align 4
devices dd (DEVICE_ID shl 16)+VENDOR_ID
dd 0 ;terminator
 
my_service db 'MY_SERVICE',0 ;max 16 chars include zero
 
msgInit db 'detect hardware...',13,10,0
msgPCI db 'PCI accsess not supported',13,10,0
msgFail db 'device not found',13,10,0
 
section '.data' data readable writable align 16
 
;all uninitialized data place here
 
/kernel/trunk/drivers/sis.asm
248,7 → 248,6
PROC_BASE equ OS_BASE+0x0080000
 
public START
public STOP
public service_proc
 
extrn AttachIntHandler
266,7 → 265,13
 
section '.flat' code readable align 16
 
START:
proc START stdcall, state:dword
 
mov eax, [state]
cmp eax, 1
je .entry
jmp .stop
.entry:
if DEBUG
mov esi, msgInit
call SysMsgBoardStr
320,15 → 325,18
call SysMsgBoardStr
 
ret
 
.fail:
if DEBUG
mov esi, msgFail
call SysMsgBoardStr
end if
STOP:
xor eax, eax
ret
.stop:
call stop
mov [ctrl.user_callback], 0
ret
endp
 
handle equ IOCTL.handle
io_code equ IOCTL.io_code
/kernel/trunk/drivers/unisound.asm
274,7 → 274,6
PROC_BASE equ OS_BASE+0x0080000
 
public START
public STOP
public service_proc
 
extrn AttachIntHandler
292,7 → 291,14
 
section '.flat' code readable align 16
 
START:
proc START stdcall, state:dword
 
mov eax, [state]
cmp eax, 1
je .entry
jmp .stop
.entry:
 
if DEBUG
mov esi, msgInit
call SysMsgBoardStr
368,8 → 374,12
call SysMsgBoardStr
end if
xor eax, eax
STOP:
ret
.stop:
call stop
mov [ctrl.user_callback], 0
ret
endp
 
handle equ IOCTL.handle
io_code equ IOCTL.io_code
/kernel/trunk/hid/mousedrv.inc
39,6 → 39,11
 
draw_mouse_under:
; return old picture
 
cmp [set_hw_cursor], 0
jz @F
ret
@@:
pushad
xor ecx,ecx
xor edx,edx
75,6 → 80,18
ret
 
save_draw_mouse:
 
cmp [set_hw_cursor], 0
jz @F
mov [0xfb4a],ax
mov [0xfb4c],bx
movzx ebx,word [0xfb0c]
movzx eax,word [0xfb0a]
push ebx
push eax
call [set_hw_cursor]
ret
@@:
pushad
; save & draw
mov [0xfb4a],ax
/kernel/trunk/kernel.asm
394,12 → 394,12
; btr [cpu_caps], CAPS_PSE ;test: don't use large pages
; btr [cpu_caps], CAPS_PGE ;test: don't use global pages
; btr [cpu_caps], CAPS_MTRR ;test: don't use MTRR
; btr [cpu_caps], CAPS_TSC ;test: don't use TSC
; bts [cpu_caps], CAPS_TSC ;test: don't use TSC
 
call init_memEx
call init_page_map
 
mov eax, sys_pgdir ;+PG_NOCACHE
mov eax, sys_pgdir
mov cr3, eax
 
mov eax,cr0
409,6 → 409,7
call init_kernel_heap
call init_LFB
call init_mtrr
call init_fpu
 
stdcall alloc_kernel_space, 0x4F000
mov [ipc_tmp], eax
447,48 → 448,6
mov ecx, 16
rep movsb
 
clts
fninit
 
bt [cpu_caps], CAPS_FXSR
jnc .no_FXSR
 
stdcall kernel_alloc, 512*256
mov [fpu_data], eax
 
mov ebx, cr4
mov ecx, cr0
or ebx, CR4_OSFXSR+CR4_OSXMMEXPT
mov cr4, ebx
 
and ecx, not (CR0_MP+CR0_EM)
or ecx, CR0_NE
mov cr0, ecx
 
mov dword [esp-4], SSE_INIT
ldmxcsr [esp-4]
 
xorps xmm0, xmm0
xorps xmm1, xmm1
xorps xmm2, xmm2
xorps xmm3, xmm3
xorps xmm4, xmm4
xorps xmm5, xmm5
xorps xmm6, xmm6
xorps xmm7, xmm7
 
jmp .set_cr
.no_FXSR:
stdcall kernel_alloc, 112*256
mov [fpu_data], eax
mov ebx, cr4
mov ecx, cr0
and ebx, not (CR4_OSFXSR+CR4_OSXMMEXPT)
and ecx, not CR0_EM
or ecx, CR0_MP+CR0_NE
mov cr0, ecx
mov cr4, ebx
.set_cr:
mov edi, irq_tab
xor eax, eax
mov ecx, 16
567,15 → 526,8
 
; LOAD IDT
lidt [cs:idtreg]
cli
 
;The CPU to this moment should be already in PM,
;and bit MP of the register cr0 should be installed in 1.
;finit ;reset of the FPU (finit, instead of fninit)
;fsetpm ;enable PM of the FPU
;finit ;reset the registers, contents which are still equal RM
;Now FPU too in PM
; DETECT DEVICES
 
mov esi,boot_devices
call boot_log
call detect_devices
597,6 → 549,9
call boot_log
call setmouse
 
mov [pci_access_enabled],1
stdcall get_service, szHMouse
 
; SET PRELIMINARY WINDOW STACK AND POSITIONS
 
mov esi,boot_windefs
625,22 → 580,34
 
mov esi,boot_setostask
call boot_log
; name for OS/IDLE process
mov dword [0x80000+256+APPDATA.app_name], dword 'OS/I'
mov dword [0x80000+256+APPDATA.app_name+4], dword 'DLE '
 
mov eax, [fpu_data]
mov dword [0x80000+APPDATA.fpu_state], eax
mov dword [0x80000+APPDATA.fpu_handler], 0
mov dword [0x80000+APPDATA.sse_handler], 0
 
add eax, 112
; name for OS/IDLE process
mov dword [0x80000+256+APPDATA.app_name], dword 'OS/I'
mov dword [0x80000+256+APPDATA.app_name+4], dword 'DLE '
mov dword [0x80000+256+APPDATA.fpu_handler], 0
mov dword [0x80000+256+APPDATA.sse_handler], 0
 
;set fpu save area
mov esi, eax
bt [cpu_caps], CAPS_FXSR
jnc .no_sse
add eax, 512-112
 
lea edi, [eax+512]
mov dword [0x80000+256+APPDATA.fpu_state], edi
mov ecx, 512/4
jmp @F
.no_sse:
mov dword [0x80000+256+APPDATA.fpu_state], eax
mov dword [0x80000+256+APPDATA.fpu_handler], 0
mov dword [0x80000+256+APPDATA.sse_handler], 0
lea edi, [eax+112]
mov dword [0x80000+256+APPDATA.fpu_state], edi
mov ecx, 112/4
@@:
rep movsd
 
; task list
mov [0x3020+TASKDATA.wnd_number], 1 ; on screen number
mov [0x3020+TASKDATA.pid], 1 ; process id number
1950,6 → 1917,9
sysfn_shutdown: ; 18.1 = BOOT
mov [0x2f0000+0x9030],byte 0
for_shutdown_parameter:
 
call stop_all_services
 
mov eax,[0x3004]
add eax,2
mov [shutdown_processes],eax
3786,10 → 3756,6
 
ret
 
 
 
 
 
r_f_port_area:
 
test eax, eax
3875,9 → 3841,6
xor eax, eax
ret
 
 
 
 
free_port_area:
 
pushad
3982,8 → 3945,6
mov [esp+36],ecx ; return in eax
ret
 
 
 
drawbackground:
inc [mouse_pause]
cmp [0xfe0c],word 0x12
4299,8 → 4260,6
mov eax,0xffffffff
ret
 
 
 
rerouteirqs:
 
cli
5034,9 → 4993,9
windowtypechanged dd 0x0
 
align 4
cpu_caps dd 4 dup(0)
pg_data PG_DATA
heap_test dd ?
cpu_caps dd 4 dup(0)
endg
 
iglobal
/kernel/trunk/kernel32.inc
217,14 → 217,13
include "core/sys32.inc" ; process management
include "core/sched.inc" ; process scheduling
include "core/syscall.inc" ; system call
include "core/fpu.inc" ; all fpu/sse support
include "core/memory.inc"
include "core/heap.inc"
include "core/heap.inc" ; kernel and app heap
include "core/taskman.inc"
include "core/dll.inc"
include "core/exports.inc"
include "core/except.inc"
 
 
; GUI stuff
include "gui/window.inc"
include "gui/event.inc"
/kernel/trunk/memmap.inc
201,7 → 201,7
; 770000 -> 777fff tcp memory ( 32 kb)
;
; 778000 -> 77ffff window skinning ( 32 kb)
; 780000 -> 7fffff free (512 Kb)
; 780000 -> 7fffff reserved to physical memory manager
;
; 800000 -> 801FFF draw_data - 256 entries
;