mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-27 16:59:41 +03:00
5620ba7561
git-svn-id: svn://kolibrios.org@871 a494cfbc-eb01-0410-851d-a64ba20cac60
375 lines
6.8 KiB
PHP
375 lines
6.8 KiB
PHP
;-----------------------------------------------------------------------------
|
|
;///// PART OF ATi RADEON 9000 DRIVER ////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
; Copyright (c) 2004, mike.dld
|
|
; Using BeOS driver - Copyright (c) 2002, Thomas Kurschel
|
|
;-----------------------------------------------------------------------------
|
|
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
; DEALINGS IN THE SOFTWARE.
|
|
;-----------------------------------------------------------------------------
|
|
|
|
macro __include_debug_strings dummy,[_id,_fmt,_len] {
|
|
common
|
|
local c1,a1,a2
|
|
forward
|
|
_id rb _len+1
|
|
db 0
|
|
a1 = 0
|
|
a2 = 0
|
|
if ~ _len eq
|
|
repeat _len-1
|
|
virtual at 0
|
|
db _fmt,13,10,0,0
|
|
load c1 word from %+a2-1
|
|
end virtual
|
|
if (c1='%s')|(c1='%x')|(c1='%d')
|
|
store byte 0 at _id+%+a1-1
|
|
a2 = a2 + 1
|
|
else if (c1='\n')
|
|
store word $0A0D at _id+%+a1-1
|
|
a1 = a1 + 1
|
|
a2 = a2 + 1
|
|
else
|
|
store word c1 at _id+%+a1-1
|
|
end if
|
|
end repeat
|
|
end if
|
|
common
|
|
}
|
|
|
|
macro include_debug_strings { __include_debug_strings __debug_strings }
|
|
|
|
SHINFO0 fix SHINFO
|
|
|
|
macro SHINFO _num,_format,[_arg] {
|
|
common
|
|
SHFLOW _format,_arg
|
|
}
|
|
|
|
macro SHFLOW _format,[_arg] {
|
|
common
|
|
if __DEBUG__ = 1
|
|
local ..f1,f2,a1,a2,c1,c2,..lbl
|
|
_debug_str_ fix __debug_str_ # a1
|
|
a1 = 0
|
|
c2 = 0
|
|
f2 = 0
|
|
repeat ..lbl-..f1-1
|
|
virtual at 0
|
|
db _format,13,10,0
|
|
load c1 word from %-1
|
|
end virtual
|
|
if c1 = '%s'
|
|
virtual at 0
|
|
db _format,13,10,0
|
|
store word 0 at %-1
|
|
load c1 from f2-c2
|
|
end virtual
|
|
if c1 <> 0
|
|
DEBUGS _debug_str_+f2-c2
|
|
end if
|
|
c2 = c2 + 1
|
|
f2 = %+1
|
|
a2 = 0
|
|
forward
|
|
if a2 = a1
|
|
DEBUGS _arg
|
|
end if
|
|
a2 = a2+1
|
|
common
|
|
a1 = a1+1
|
|
else if c1 = '%x'
|
|
virtual at 0
|
|
db _format,13,10,0
|
|
store word 0 at %-1
|
|
load c1 from f2-c2
|
|
end virtual
|
|
if c1 <> 0
|
|
DEBUGS _debug_str_+f2-c2
|
|
end if
|
|
c2 = c2 + 1
|
|
f2 = %+1
|
|
a2 = 0
|
|
forward
|
|
if a2 = a1
|
|
DEBUGH _arg
|
|
end if
|
|
a2 = a2+1
|
|
common
|
|
a1 = a1+1
|
|
else if c1 = '%d'
|
|
virtual at 0
|
|
db _format,13,10,0
|
|
store word 0 at %-1
|
|
load c1 from f2-c2
|
|
end virtual
|
|
if c1 <> 0
|
|
DEBUGS _debug_str_+f2-c2
|
|
end if
|
|
c2 = c2 + 1
|
|
f2 = %+1
|
|
a2 = 0
|
|
forward
|
|
if a2 = a1
|
|
DEBUGD _arg
|
|
end if
|
|
a2 = a2+1
|
|
common
|
|
a1 = a1+1
|
|
end if
|
|
end repeat
|
|
virtual at 0
|
|
db _format,13,10,0
|
|
load c1 from f2-c2
|
|
end virtual
|
|
if c1 <> 0
|
|
DEBUGS _debug_str_+f2-c2
|
|
end if
|
|
virtual at 0
|
|
..f1 db _format,13,10,0
|
|
..lbl:
|
|
__debug_strings fix __debug_strings,_debug_str_,_format,..lbl-..f1-1-c2
|
|
end virtual
|
|
end if
|
|
pushad
|
|
mov edi,sys_delay
|
|
mov eax,1
|
|
call sys_int
|
|
popad
|
|
}
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
macro jif _op1,_cond,_op2,_label,_op {
|
|
if _op eq
|
|
cmp _op1,_op2
|
|
else
|
|
if _op2 eq
|
|
_op _op1
|
|
else
|
|
_op _op1,_op2
|
|
end if
|
|
end if
|
|
j#_cond _label
|
|
}
|
|
|
|
macro m2m op1,op2 {
|
|
pushd op2
|
|
popd op1
|
|
}
|
|
|
|
macro BITFIELD _bfnum,_size,[_name,_nbits] {
|
|
common
|
|
local _shift,_mask
|
|
_shift = 0
|
|
.bit_field#_bfnum rb _size
|
|
if B_HOST eq HOST_BENDIAN
|
|
forward
|
|
_mask = 0
|
|
repeat _nbits
|
|
_mask = (_mask shl 1) or 1
|
|
end repeat
|
|
_name = _mask shl _shift
|
|
_name#_shift = _shift
|
|
_shift = _shift + _nbits
|
|
common
|
|
else
|
|
forward
|
|
_mask = 0
|
|
repeat _nbits
|
|
_mask = (_mask shl 1) or 1
|
|
end repeat
|
|
_name = _mask shl (_size-_shift-_nbits)
|
|
_name#_shift = _size-_shift-_nbits
|
|
_shift = _shift + _nbits
|
|
common
|
|
end if
|
|
}
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
sys_delay = 5*4
|
|
sys_pci = 62*4
|
|
sys_debug_board = 63*4
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
func sys_int
|
|
begin
|
|
pushad
|
|
push eax
|
|
add edi,[systlb]
|
|
call dword[edi]
|
|
pop eax
|
|
popad
|
|
ret
|
|
endf
|
|
|
|
func debug_outstr
|
|
begin
|
|
mov eax,1
|
|
.l1:
|
|
mov bl,[edx]
|
|
test bl,bl
|
|
jz .l2
|
|
mov edi,sys_debug_board
|
|
call sys_int
|
|
inc edx
|
|
jmp .l1
|
|
.l2:
|
|
ret
|
|
endf
|
|
|
|
macro DEBUGS [_str] {
|
|
common
|
|
pushf
|
|
pushad
|
|
local ..str,..label,..is_str
|
|
..is_str = 0
|
|
forward
|
|
if _str eqtype ''
|
|
..is_str = 1
|
|
end if
|
|
common
|
|
if ..is_str = 1
|
|
jmp ..label
|
|
..str db _str,0
|
|
..label:
|
|
mov edx,..str
|
|
call debug_outstr
|
|
else
|
|
mov edx,_str
|
|
call debug_outstr
|
|
end if
|
|
popad
|
|
popf
|
|
}
|
|
|
|
macro DEBUGF [_str] {
|
|
common
|
|
DEBUGS _str,13,10
|
|
}
|
|
|
|
func debug_outchar
|
|
begin
|
|
pushad
|
|
mov bl,al
|
|
mov eax,1
|
|
mov edi,sys_debug_board
|
|
call sys_int
|
|
popad
|
|
ret
|
|
endf
|
|
|
|
func debug_outdec
|
|
begin
|
|
mov ecx,10
|
|
push -'0'
|
|
.l1:
|
|
xor edx,edx
|
|
div ecx
|
|
push edx
|
|
test eax,eax
|
|
jnz .l1
|
|
.l2:
|
|
pop eax
|
|
add al,'0'
|
|
jz .l3
|
|
call debug_outchar
|
|
jmp .l2
|
|
.l3:
|
|
ret
|
|
endf
|
|
|
|
macro DEBUGD _dec {
|
|
pushf
|
|
pushad
|
|
if _dec eqtype eax
|
|
if _dec in <ebx,ecx,edx,esi,edi,ebp,esp>
|
|
mov eax,_dec
|
|
else if _dec in <ax,bx,cx,dx,si,di,bp,sp,al,ah,bl,bh,cl,ch,dl,dh>
|
|
movzx eax,_dec
|
|
end if
|
|
else
|
|
if (_dec eqtype word[])|(_dec eqtype byte[])
|
|
movzx eax,_dec
|
|
else
|
|
mov eax,_dec
|
|
end if
|
|
end if
|
|
call debug_outdec
|
|
popad
|
|
popf
|
|
}
|
|
|
|
func debug_outhex
|
|
__hexdigits db '0123456789ABCDEF'
|
|
begin
|
|
mov edx,8
|
|
.l1:
|
|
rol eax,4
|
|
push eax
|
|
and eax,0x0000000F
|
|
mov al,[__hexdigits+eax]
|
|
call debug_outchar
|
|
pop eax
|
|
dec edx
|
|
jnz .l1
|
|
ret
|
|
endf
|
|
|
|
macro DEBUGH _hex {
|
|
pushf
|
|
pushad
|
|
if ~_hex eq eax
|
|
mov eax,_hex
|
|
end if
|
|
call debug_outhex
|
|
popad
|
|
popf
|
|
}
|
|
|
|
macro diff16 title,l1,l2
|
|
{
|
|
local s,d
|
|
s = l2-l1
|
|
display title,': 0x'
|
|
repeat 8
|
|
d = '0' + s shr ((8-%) shl 2) and $0F
|
|
if d > '9'
|
|
d = d + 'A'-'9'-1
|
|
end if
|
|
display d
|
|
end repeat
|
|
display 13,10
|
|
}
|
|
|
|
macro diff10 title,l1,l2
|
|
{
|
|
local s,d,z,m
|
|
s = l2-l1
|
|
z = 0
|
|
m = 1000000000
|
|
display title,': '
|
|
repeat 10
|
|
d = '0' + s / m
|
|
s = s - (s/m)*m
|
|
m = m / 10
|
|
if d <> '0'
|
|
z = 1
|
|
end if
|
|
if z <> 0
|
|
display d
|
|
end if
|
|
end repeat
|
|
display 13,10
|
|
}
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;///// END ///////////////////////////////////////////////////////////////////
|
|
;----------------------------------------------------------------------------- |