forked from KolibriOS/kolibrios
5620ba7561
git-svn-id: svn://kolibrios.org@871 a494cfbc-eb01-0410-851d-a64ba20cac60
645 lines
16 KiB
NASM
645 lines
16 KiB
NASM
;-----------------------------------------------------------------------------
|
|
;///// 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.
|
|
;-----------------------------------------------------------------------------
|
|
|
|
DRIVER_CODE_START:
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
include '../const.inc' ; kernel defines
|
|
|
|
include 'normal.inc'
|
|
include 'clipping.asm'
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
struct graph_funcs
|
|
draw_line dd ?
|
|
disable_mouse dd ?
|
|
draw_pointer dd ?
|
|
draw_mouse_under dd ?
|
|
drawbar dd ?
|
|
putpixel dd ?
|
|
getpixel dd ?
|
|
sys_putimage dd ?
|
|
drawbackground dd ?
|
|
calculatescreen dd ?
|
|
setscreen dd ?
|
|
ends
|
|
|
|
SF graph_funcs
|
|
|
|
call_cnt dd 0
|
|
viewport RECT
|
|
|
|
set_bank dd set_bank1
|
|
setbnk dd set_bank0,set_bank1,set_s3_bank,set_bank3
|
|
|
|
virtual at esi
|
|
rr RECT
|
|
end virtual
|
|
|
|
virtual at 0x00010008
|
|
GF graph_funcs
|
|
end virtual
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
CLIP_RECTS = 0x00720000 ; 0x00780000
|
|
|
|
;label bg_BytesPerScanLine dword at 0x600000-16;0x460000-16
|
|
;label bg_type dword at 0x600000-12;0x460000-12
|
|
;label bg_width dword at 0x600000-8;0x460000-8
|
|
;label bg_height dword at 0x600000-4;0x460000-4
|
|
|
|
label bg_BytesPerScanLine dword at 0x460000-16
|
|
label bg_type dword at 0x460000-12
|
|
label bg_width dword at 0x460000-8
|
|
label bg_height dword at 0x460000-4
|
|
|
|
BGT_TILE = 1
|
|
BGT_STRETCH = 2
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
CRTC_INDX equ 3D4h
|
|
|
|
func vm_mike_init
|
|
begin
|
|
; jif dword[mdrvm],e,0,.exit
|
|
mov eax,[0x00010004]
|
|
jif eax,e,'ENUE',.exit
|
|
jif [call_cnt],a,0,.exit.2
|
|
add eax, 0x00010000
|
|
mov [systlb],eax
|
|
|
|
; SHFLOW 'System funcs table offset: 0x%x',eax
|
|
|
|
;--------------------------------------
|
|
|
|
mov esi,0x00010008
|
|
mov edi,SF
|
|
mov ecx,sizeof.graph_funcs/4
|
|
cld
|
|
rep movsd
|
|
|
|
; push dword[CURRENT_TASK]
|
|
; mov dword[CURRENT_TASK],1
|
|
; call [SF.disable_mouse]
|
|
; pop dword[CURRENT_TASK]
|
|
|
|
mov [viewport.left],0
|
|
mov [viewport.top],0
|
|
m2m [viewport.right],[ScreenWidth]
|
|
m2m [viewport.bottom],[ScreenHeight]
|
|
|
|
movzx eax,byte[GFX_CARD_VENDOR]
|
|
cmp byte[VESA_VER_MAJOR],'2'
|
|
jb @f
|
|
mov al,0
|
|
@@: mov eax,[setbnk+eax*4]
|
|
mov [set_bank],eax
|
|
|
|
mov al,[ScreenBPP]
|
|
cmp al,32
|
|
jne @f
|
|
|
|
; SHFLOW 'Driver initialized in 32-bit mode'
|
|
|
|
mov [GF.draw_line],vm_mike_draw_line.32
|
|
;; mov [GF.disable_mouse],vm_mike_disable_mouse.32
|
|
;; mov [GF.draw_pointer],vm_mike_draw_pointer.32
|
|
mov [GF.drawbar],vm_mike_draw_rect.32
|
|
mov [GF.putpixel],vm_mike_put_pixel.32
|
|
mov [GF.getpixel],vm_mike_get_pixel.32
|
|
mov [GF.sys_putimage],vm_mike_put_image.32
|
|
mov [GF.drawbackground],vm_mike_draw_bg.32
|
|
|
|
jmp .exit.2
|
|
|
|
@@: cmp al,24
|
|
jne @f
|
|
|
|
; SHFLOW 'Driver initialized in 24-bit mode'
|
|
|
|
mov [GF.draw_line],vm_mike_draw_line.24
|
|
; mov [GF.disable_mouse],vm_mike_disable_mouse.24
|
|
; mov [GF.draw_pointer],vm_mike_draw_pointer.24
|
|
mov [GF.drawbar],vm_mike_draw_rect.24
|
|
mov [GF.putpixel],vm_mike_put_pixel.24
|
|
mov [GF.getpixel],vm_mike_get_pixel.24
|
|
mov [GF.sys_putimage],vm_mike_put_image.24
|
|
mov [GF.drawbackground],vm_mike_draw_bg.24
|
|
|
|
jmp .exit.2
|
|
|
|
@@: cmp al,16
|
|
jne @f
|
|
|
|
; SHFLOW 'Driver initialized in 16-bit mode'
|
|
|
|
mov [GF.draw_line],vm_mike_draw_line.16
|
|
; mov [GF.disable_mouse],vm_mike_disable_mouse.16
|
|
; mov [GF.draw_pointer],vm_mike_draw_pointer.16
|
|
mov [GF.drawbar],vm_mike_draw_rect.16
|
|
mov [GF.putpixel],vm_mike_put_pixel.16
|
|
mov [GF.getpixel],vm_mike_get_pixel.16
|
|
mov [GF.sys_putimage],vm_mike_put_image.16
|
|
mov [GF.drawbackground],vm_mike_draw_bg.16
|
|
|
|
jmp .exit.2
|
|
|
|
@@: cmp al,15
|
|
jne @f
|
|
|
|
; SHFLOW 'Driver initialized in 15-bit mode'
|
|
|
|
mov [GF.draw_line],vm_mike_draw_line.15
|
|
; mov [GF.disable_mouse],vm_mike_disable_mouse.15
|
|
; mov [GF.draw_pointer],vm_mike_draw_pointer.15
|
|
mov [GF.drawbar],vm_mike_draw_rect.15
|
|
mov [GF.putpixel],vm_mike_put_pixel.15
|
|
mov [GF.getpixel],vm_mike_get_pixel.15
|
|
mov [GF.sys_putimage],vm_mike_put_image.15
|
|
mov [GF.drawbackground],vm_mike_draw_bg.15
|
|
|
|
jmp .exit.2
|
|
|
|
@@: cmp al,8
|
|
jne @f
|
|
|
|
; SHFLOW 'Driver initialized in 8-bit mode'
|
|
|
|
call setup_palette_8
|
|
|
|
mov [GF.draw_line],vm_mike_draw_line.08
|
|
; mov [GF.disable_mouse],vm_mike_disable_mouse.08
|
|
; mov [GF.draw_pointer],vm_mike_draw_pointer.08
|
|
mov [GF.drawbar],vm_mike_draw_rect.08
|
|
mov [GF.putpixel],vm_mike_put_pixel.08
|
|
mov [GF.getpixel],vm_mike_get_pixel.08
|
|
mov [GF.sys_putimage],vm_mike_put_image.08
|
|
mov [GF.drawbackground],vm_mike_draw_bg.08
|
|
|
|
jmp .exit.2
|
|
|
|
@@: cmp al,4
|
|
jne .exit
|
|
|
|
; SHFLOW 'Driver initialized in 4-bit mode'
|
|
|
|
mov [GF.draw_line],vm_mike_draw_line.04
|
|
; mov [GF.disable_mouse],vm_mike_disable_mouse.04
|
|
; mov [GF.draw_pointer],vm_mike_draw_pointer.04
|
|
mov [GF.drawbar],vm_mike_draw_rect.04
|
|
mov [GF.putpixel],vm_mike_put_pixel.04
|
|
mov [GF.getpixel],vm_mike_get_pixel.04
|
|
mov [GF.sys_putimage],vm_mike_put_image.04
|
|
mov [GF.drawbackground],vm_mike_draw_bg.04
|
|
|
|
;--------------------------------------
|
|
|
|
.exit.2:
|
|
|
|
mov [GF.calculatescreen],vm_mike_calculatescreen
|
|
mov [GF.setscreen],vm_mike_setscreen
|
|
|
|
;! mov [GF.disable_mouse],vm_dummy
|
|
;! mov [GF.draw_pointer],vm_dummy
|
|
|
|
inc [call_cnt]
|
|
xor eax,eax
|
|
.exit.3:
|
|
retn
|
|
.exit:
|
|
xor eax,eax
|
|
dec eax
|
|
retn
|
|
endf
|
|
|
|
func vm_dummy
|
|
begin
|
|
ret
|
|
endf
|
|
|
|
func vm_mike_calculatescreen
|
|
begin
|
|
; call [SF.calculatescreen]
|
|
.direct:
|
|
pushad
|
|
cli
|
|
movzx ecx,word[TASK_COUNT] ; number of processes
|
|
lea edi,[CLIP_RECTS+ecx*4+4]
|
|
push dword[CURRENT_TASK]
|
|
xor eax,eax
|
|
.next_window:
|
|
inc eax
|
|
push ecx ebx eax edi
|
|
mov [CURRENT_TASK],ax
|
|
call calc_clipping_rects
|
|
pop edi eax ebx
|
|
mov [CLIP_RECTS+eax*4],edi
|
|
mov [edi],ecx
|
|
add edi,4
|
|
shl ecx,2
|
|
rep movsd
|
|
pop ecx
|
|
loop .next_window
|
|
pop dword[CURRENT_TASK]
|
|
sti
|
|
popad
|
|
ret
|
|
endf
|
|
|
|
func vm_mike_setscreen
|
|
begin
|
|
; call [SF.setscreen]
|
|
call vm_mike_calculatescreen.direct
|
|
ret
|
|
endf
|
|
|
|
func vm_mike_uninit
|
|
begin
|
|
; jif dword[mdrvm],e,0,.exit
|
|
jif [call_cnt],nz,,.exit.2,dec
|
|
mov esi,SF
|
|
mov edi,GF
|
|
mov ecx,sizeof.graph_funcs/4
|
|
rep movsd
|
|
.exit.2:
|
|
xor eax,eax
|
|
retn
|
|
.exit:
|
|
xor eax,eax
|
|
dec eax
|
|
retn
|
|
endf
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
include 'norm_04.inc'
|
|
include 'norm_08.inc'
|
|
include 'norm_15.inc'
|
|
include 'norm_16.inc'
|
|
include 'norm_24.inc'
|
|
include 'norm_32.inc'
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
func is_intersect_rc
|
|
begin
|
|
jif ecx,l,[tr.left],.exit
|
|
jif edx,l,[tr.top],.exit
|
|
jif ebx,ge,[tr.bottom],.exit
|
|
jif eax,ge,[tr.right],.exit
|
|
clc
|
|
ret
|
|
.exit:
|
|
stc
|
|
ret
|
|
endf
|
|
|
|
func is_intersect_hln
|
|
begin
|
|
jif edx,l,[tr.left],.exit
|
|
jif eax,l,[tr.top],.exit
|
|
jif eax,ge,[tr.bottom],.exit
|
|
jif ebx,ge,[tr.right],.exit
|
|
clc
|
|
ret
|
|
.exit:
|
|
stc
|
|
ret
|
|
endf
|
|
|
|
func is_intersect_vln
|
|
begin
|
|
jif eax,l,[tr.left],.exit
|
|
jif edx,l,[tr.top],.exit
|
|
jif ebx,ge,[tr.bottom],.exit
|
|
jif eax,ge,[tr.right],.exit
|
|
clc
|
|
ret
|
|
.exit:
|
|
stc
|
|
ret
|
|
endf
|
|
|
|
func is_intersect_pt
|
|
begin
|
|
jif eax,l,[tr.left],.exit
|
|
jif ebx,l,[tr.top],.exit
|
|
jif ebx,ge,[tr.bottom],.exit
|
|
jif eax,ge,[tr.right],.exit
|
|
clc
|
|
ret
|
|
.exit:
|
|
stc
|
|
ret
|
|
endf
|
|
|
|
func get_cursor_rect
|
|
begin
|
|
push eax
|
|
movsx eax,word[MOUSE_X]
|
|
mov [tr.left],eax
|
|
add eax,31
|
|
mov [tr.right],eax
|
|
movsx eax,word[MOUSE_Y]
|
|
mov [tr.top],eax
|
|
add eax,31
|
|
mov [tr.bottom],eax
|
|
pop eax
|
|
ret
|
|
endf
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
gamma_4_0 = 0x00
|
|
gamma_4_1 = 0x1F
|
|
gamma_4_2 = 0x2F
|
|
gamma_4_3 = 0x3F
|
|
|
|
align 16
|
|
palette_8_64 rb 256*3
|
|
palette_8_256 rb 256*3
|
|
|
|
rept 4 red:0
|
|
{
|
|
\rept 4 green:0
|
|
\{
|
|
\\rept 4 blue:0
|
|
\\{
|
|
index = ((red shl 4) or (green shl 2) or blue)*3
|
|
store gamma_4_ #red at palette_8_64+index+0
|
|
store gamma_4_ \#green at palette_8_64+index+1
|
|
store gamma_4_\\#blue at palette_8_64+index+2
|
|
store gamma_4_ #red *4+red at palette_8_256+index+0
|
|
store gamma_4_ \#green*4+green at palette_8_256+index+1
|
|
store gamma_4_\\#blue *4+blue at palette_8_256+index+2
|
|
\\}
|
|
\}
|
|
}
|
|
|
|
;rept 64 clr1:0
|
|
;{
|
|
; index = clr1*3+64*3
|
|
; clr2 = clr*4+(clr shr 4)
|
|
; store clr1 at palette_8_64 +index
|
|
; store clr2 at palette_8_256+index
|
|
; index = index + 64*3 + 1
|
|
; store clr1 at palette_8_64 +index
|
|
; store clr2 at palette_8_256+index
|
|
; index = index + 64*3 + 1
|
|
; store clr1 at palette_8_64 +index
|
|
; store clr2 at palette_8_256+index
|
|
;}
|
|
|
|
func setup_palette_8
|
|
begin
|
|
mov edx,0x03C8
|
|
xor al,al
|
|
out dx,al
|
|
mov ecx,256*3
|
|
mov edx,0x03C9
|
|
mov esi,palette_8_64
|
|
cld
|
|
rep outsb
|
|
ret
|
|
endf
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
func set_bank0
|
|
begin
|
|
mov ebp,[esp+4*1]
|
|
ret
|
|
endf
|
|
|
|
|
|
; i810/i815
|
|
; by Protopopius
|
|
func set_bank1
|
|
begin
|
|
cli
|
|
push eax edx
|
|
mov eax,[esp+4*3]
|
|
mov ebp,eax
|
|
shr eax,16
|
|
sub al,0x0A
|
|
cmp al,[BANK_RW]
|
|
je .exit
|
|
mov [BANK_RW],al
|
|
|
|
mov dx,3CEh
|
|
mov ah,al ; Save value for later use
|
|
mov al,10h ; Index GR10 (Address Mapping)
|
|
out dx,al ; Select GR10
|
|
inc dl
|
|
mov al,3 ; Set bits 0 and 1 (Enable linear page mapping)
|
|
out dx,al ; Write value
|
|
dec dl
|
|
mov al,11h ; Index GR11 (Page Selector)
|
|
out dx,al ; Select GR11
|
|
inc dl
|
|
|
|
mov al,ah ; Write address
|
|
out dx,al ; Write the value
|
|
|
|
.exit:
|
|
and ebp,0x0000FFFF
|
|
add ebp,VGABasePtr
|
|
pop edx eax
|
|
sti
|
|
ret
|
|
endf
|
|
|
|
|
|
; S3
|
|
; by kmeaw
|
|
func set_bank2
|
|
begin
|
|
cli
|
|
push eax edx ecx
|
|
mov eax,[esp+4*4]
|
|
mov ebp,eax
|
|
shr eax,16
|
|
sub al,0x0A
|
|
cmp al,[BANK_RW]
|
|
je .exit
|
|
mov [BANK_RW],al
|
|
|
|
mov cl,al
|
|
mov dx,0x3D4
|
|
mov al,0x38
|
|
out dx,al
|
|
inc dx
|
|
mov al,0x48
|
|
out dx,al
|
|
dec dx
|
|
mov al,0x31
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
dec dx
|
|
mov ah,al
|
|
mov al,0x31
|
|
out dx,ax
|
|
mov al,ah
|
|
or al,9
|
|
inc dx
|
|
out dx,al
|
|
dec dx
|
|
mov al,0x35
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
dec dx
|
|
and al,0xF0
|
|
mov ch,cl
|
|
and ch,0x0F
|
|
or ch,al
|
|
mov al,0x35
|
|
out dx,al
|
|
inc dx
|
|
mov al,ch
|
|
out dx,ax
|
|
dec dx
|
|
mov al,0x51
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
dec dx
|
|
and al,0xF3
|
|
shr cl,2
|
|
and cl,0x0C
|
|
or cl,al
|
|
mov al,0x51
|
|
out dx,al
|
|
inc dx
|
|
mov al,cl
|
|
out dx,al
|
|
dec dx
|
|
mov al,0x38
|
|
out dx,al
|
|
inc dx
|
|
xor al,al
|
|
out dx,al
|
|
|
|
.exit:
|
|
and ebp,0x0000FFFF
|
|
add ebp,VGABasePtr
|
|
pop ecx edx eax
|
|
sti
|
|
ret
|
|
endf
|
|
|
|
|
|
; from http://my.execpc.com/CE/AC/geezer/os/slfb.asm
|
|
func set_s3_bank
|
|
begin
|
|
cli
|
|
push eax edx
|
|
mov eax,[esp+4*3]
|
|
mov ebp,eax
|
|
shr eax,16
|
|
sub al,0x0A
|
|
cmp al,[BANK_RW]
|
|
je .exit
|
|
mov [BANK_RW],al
|
|
|
|
mov ah,al
|
|
; grrrr...mode-set locked the S3 registers, so unlock them again
|
|
; xxx - do this after mode-set
|
|
mov dx,CRTC_INDX
|
|
mov al,38h
|
|
out dx,al
|
|
inc edx
|
|
mov al,48h
|
|
out dx,al
|
|
dec edx
|
|
mov al,39h
|
|
out dx,al
|
|
inc edx
|
|
mov al,0A5h
|
|
out dx,al
|
|
; now: do the bank-switch
|
|
mov dx,CRTC_INDX
|
|
mov al,35h
|
|
out dx,al
|
|
inc edx
|
|
in al,dx
|
|
and al,0F0h
|
|
or al,ah
|
|
out dx,al
|
|
|
|
.exit:
|
|
and ebp,0x0000FFFF
|
|
add ebp,VGABasePtr
|
|
pop edx eax
|
|
sti
|
|
ret
|
|
endf
|
|
|
|
|
|
func set_bank3
|
|
begin
|
|
cli
|
|
push eax edx
|
|
mov eax,[esp+4*3]
|
|
mov ebp,eax
|
|
shr eax,16
|
|
sub al,0x0A
|
|
cmp al,[BANK_RW]
|
|
je .exit
|
|
mov [BANK_RW],al
|
|
|
|
mov ah,al
|
|
mov dx,0x03D4
|
|
mov al,0x39
|
|
out dx,al
|
|
inc dl
|
|
mov al,0xA5
|
|
out dx,al
|
|
dec dl
|
|
mov al,6Ah
|
|
out dx,al
|
|
inc dl
|
|
mov al,ah
|
|
out dx,al
|
|
dec dl
|
|
mov al,0x39
|
|
out dx,al
|
|
inc dl
|
|
mov al,0x5A
|
|
out dx,al
|
|
dec dl
|
|
|
|
.exit:
|
|
and ebp,0x0000FFFF
|
|
add ebp,VGABasePtr
|
|
pop edx eax
|
|
sti
|
|
ret
|
|
endf
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
DRIVER_CODE_END:
|
|
|
|
diff10 'driver code size',DRIVER_CODE_START,DRIVER_CODE_END
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;///// END ///////////////////////////////////////////////////////////////////
|
|
;----------------------------------------------------------------------------- |