kolibrios-fun/kernel/branches/gfx_kernel/vmode/normal.asm
Mihail Semenyako (mike.dld) 8a1c0404e2 Updated gfx_kernel to revision #383
git-svn-id: svn://kolibrios.org@384 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-03-03 17:43:42 +00:00

645 lines
16 KiB
NASM
Executable File

;-----------------------------------------------------------------------------
;///// 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 ///////////////////////////////////////////////////////////////////
;-----------------------------------------------------------------------------