forked from KolibriOS/kolibrios
ATI R500: clip output
git-svn-id: svn://kolibrios.org@734 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
cf23a1ccc7
commit
86aea3e746
@ -1311,6 +1311,11 @@ ati_io dd ?
|
|||||||
|
|
||||||
if R500_HW2D
|
if R500_HW2D
|
||||||
|
|
||||||
|
__xmin rd 1
|
||||||
|
__xmax rd 1
|
||||||
|
__ymin rd 1
|
||||||
|
__ymax rd 1
|
||||||
|
|
||||||
rhd RHD
|
rhd RHD
|
||||||
|
|
||||||
end if
|
end if
|
||||||
|
@ -67,6 +67,9 @@ if 0
|
|||||||
end if
|
end if
|
||||||
|
|
||||||
D1GRPH_PITCH equ 0x6120
|
D1GRPH_PITCH equ 0x6120
|
||||||
|
D1GRPH_X_END equ 0x6134
|
||||||
|
D1GRPH_Y_END equ 0x6138
|
||||||
|
|
||||||
|
|
||||||
R5XX_DATATYPE_ARGB8888 equ 6
|
R5XX_DATATYPE_ARGB8888 equ 6
|
||||||
|
|
||||||
@ -364,64 +367,46 @@ proc R5xx2DReset
|
|||||||
R5XX_SOFT_RESET_E2 or R5XX_SOFT_RESET_RB
|
R5XX_SOFT_RESET_E2 or R5XX_SOFT_RESET_RB
|
||||||
mov [tmp], eax
|
mov [tmp], eax
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, tmp);
|
|
||||||
wrr R5XX_RBBM_SOFT_RESET, eax
|
wrr R5XX_RBBM_SOFT_RESET, eax
|
||||||
|
|
||||||
; RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET);
|
|
||||||
rdr ebx, R5XX_RBBM_SOFT_RESET
|
rdr ebx, R5XX_RBBM_SOFT_RESET
|
||||||
and eax, not (R5XX_SOFT_RESET_CP or R5XX_SOFT_RESET_HI or \
|
and eax, not (R5XX_SOFT_RESET_CP or R5XX_SOFT_RESET_HI or \
|
||||||
R5XX_SOFT_RESET_SE or R5XX_SOFT_RESET_RE or \
|
R5XX_SOFT_RESET_SE or R5XX_SOFT_RESET_RE or \
|
||||||
R5XX_SOFT_RESET_PP or R5XX_SOFT_RESET_E2 or \
|
R5XX_SOFT_RESET_PP or R5XX_SOFT_RESET_E2 or \
|
||||||
R5XX_SOFT_RESET_RB)
|
R5XX_SOFT_RESET_RB)
|
||||||
; RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, tmp);
|
|
||||||
wrr R5XX_RBBM_SOFT_RESET, eax
|
wrr R5XX_RBBM_SOFT_RESET, eax
|
||||||
; RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET);
|
|
||||||
rdr ebx, R5XX_RBBM_SOFT_RESET
|
rdr ebx, R5XX_RBBM_SOFT_RESET
|
||||||
; RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, save);
|
|
||||||
mov eax, [save]
|
mov eax, [save]
|
||||||
wrr R5XX_RBBM_SOFT_RESET, eax
|
wrr R5XX_RBBM_SOFT_RESET, eax
|
||||||
; RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET);
|
|
||||||
rdr ebx, R5XX_RBBM_SOFT_RESET
|
rdr ebx, R5XX_RBBM_SOFT_RESET
|
||||||
; R5xx2DFlush(rhdPtr->scrnIndex);
|
|
||||||
call R5xx2DFlush
|
call R5xx2DFlush
|
||||||
|
|
||||||
; Soft resetting HDP thru RBBM_SOFT_RESET register can cause some
|
; Soft resetting HDP thru RBBM_SOFT_RESET register can cause some
|
||||||
; unexpected behaviour on some machines. Here we use
|
; unexpected behaviour on some machines. Here we use
|
||||||
; R5XX_HOST_PATH_CNTL to reset it.
|
; R5XX_HOST_PATH_CNTL to reset it.
|
||||||
|
|
||||||
; save = RHDRegRead(rhdPtr, R5XX_HOST_PATH_CNTL);
|
|
||||||
rdr edx, R5XX_HOST_PATH_CNTL
|
rdr edx, R5XX_HOST_PATH_CNTL
|
||||||
|
|
||||||
; tmp = RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET);
|
|
||||||
rdr ebx, R5XX_RBBM_SOFT_RESET
|
rdr ebx, R5XX_RBBM_SOFT_RESET
|
||||||
|
|
||||||
; tmp |= R5XX_SOFT_RESET_CP | R5XX_SOFT_RESET_HI | R5XX_SOFT_RESET_E2;
|
|
||||||
or ebx, R5XX_SOFT_RESET_CP or R5XX_SOFT_RESET_HI or R5XX_SOFT_RESET_E2
|
or ebx, R5XX_SOFT_RESET_CP or R5XX_SOFT_RESET_HI or R5XX_SOFT_RESET_E2
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, tmp);
|
|
||||||
wrr R5XX_RBBM_SOFT_RESET, ebx
|
wrr R5XX_RBBM_SOFT_RESET, ebx
|
||||||
|
|
||||||
; RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET);
|
|
||||||
rdr eax, R5XX_RBBM_SOFT_RESET
|
rdr eax, R5XX_RBBM_SOFT_RESET
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, 0);
|
|
||||||
wrr R5XX_RBBM_SOFT_RESET, 0
|
wrr R5XX_RBBM_SOFT_RESET, 0
|
||||||
|
|
||||||
; tmp = RHDRegRead(rhdPtr, R5XX_RB3D_DSTCACHE_MODE);
|
|
||||||
rdr ebx, R5XX_RB3D_DSTCACHE_MODE
|
rdr ebx, R5XX_RB3D_DSTCACHE_MODE
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_RB3D_DSTCACHE_MODE, tmp | (1 << 17)); /* FIXME */
|
|
||||||
or ebx, (1 shl 17)
|
or ebx, (1 shl 17)
|
||||||
wrr R5XX_RB3D_DSTCACHE_MODE, ebx
|
wrr R5XX_RB3D_DSTCACHE_MODE, ebx
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_HOST_PATH_CNTL, save | R5XX_HDP_SOFT_RESET);
|
|
||||||
lea eax, [edx+R5XX_HDP_SOFT_RESET]
|
lea eax, [edx+R5XX_HDP_SOFT_RESET]
|
||||||
wrr R5XX_HOST_PATH_CNTL, eax
|
wrr R5XX_HOST_PATH_CNTL, eax
|
||||||
|
|
||||||
; RHDRegRead(rhdPtr, R5XX_HOST_PATH_CNTL);
|
|
||||||
rdr ebx, R5XX_HOST_PATH_CNTL
|
rdr ebx, R5XX_HOST_PATH_CNTL
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_HOST_PATH_CNTL, save);
|
|
||||||
wrr R5XX_HOST_PATH_CNTL, edx
|
wrr R5XX_HOST_PATH_CNTL, edx
|
||||||
|
|
||||||
ret
|
ret
|
||||||
@ -435,73 +420,55 @@ R5xx2DSetup:
|
|||||||
; random bogus DMA in case we inadvertently trigger the engine
|
; random bogus DMA in case we inadvertently trigger the engine
|
||||||
; in the wrong place (happened).
|
; in the wrong place (happened).
|
||||||
|
|
||||||
; R5xxFIFOWaitLocal(rhdPtr->scrnIndex, 2);
|
|
||||||
mov eax, 2
|
mov eax, 2
|
||||||
call R5xxFIFOWaitLocal
|
call R5xxFIFOWaitLocal
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_DST_PITCH_OFFSET, TwoDInfo->dst_pitch_offset);
|
|
||||||
mov eax, [rhd.dst_pitch_offset]
|
mov eax, [rhd.dst_pitch_offset]
|
||||||
wrr R5XX_DST_PITCH_OFFSET, eax
|
wrr R5XX_DST_PITCH_OFFSET, eax
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_SRC_PITCH_OFFSET, TwoDInfo->dst_pitch_offset);
|
|
||||||
wrr R5XX_SRC_PITCH_OFFSET, eax
|
wrr R5XX_SRC_PITCH_OFFSET, eax
|
||||||
|
|
||||||
; R5xxFIFOWaitLocal(rhdPtr->scrnIndex, 1);
|
|
||||||
mov eax, 1
|
mov eax, 1
|
||||||
call R5xxFIFOWaitLocal
|
call R5xxFIFOWaitLocal
|
||||||
|
|
||||||
; RHDRegMask(rhdPtr, R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN);
|
|
||||||
rmask R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN
|
rmask R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_SURFACE_CNTL, TwoDInfo->surface_cntl);
|
|
||||||
mov eax, [rhd.surface_cntl]
|
mov eax, [rhd.surface_cntl]
|
||||||
wrr R5XX_SURFACE_CNTL, eax
|
wrr R5XX_SURFACE_CNTL, eax
|
||||||
|
|
||||||
; R5xxFIFOWaitLocal(rhdPtr->scrnIndex, 1);
|
|
||||||
mov eax, 1
|
mov eax, 1
|
||||||
call R5xxFIFOWaitLocal
|
call R5xxFIFOWaitLocal
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_DEFAULT_SC_BOTTOM_RIGHT,
|
|
||||||
; R5XX_DEFAULT_SC_RIGHT_MAX | R5XX_DEFAULT_SC_BOTTOM_MAX);
|
|
||||||
wrr R5XX_DEFAULT_SC_BOTTOM_RIGHT,\
|
wrr R5XX_DEFAULT_SC_BOTTOM_RIGHT,\
|
||||||
(R5XX_DEFAULT_SC_RIGHT_MAX or R5XX_DEFAULT_SC_BOTTOM_MAX)
|
(R5XX_DEFAULT_SC_RIGHT_MAX or R5XX_DEFAULT_SC_BOTTOM_MAX)
|
||||||
|
|
||||||
; R5xxFIFOWaitLocal(rhdPtr->scrnIndex, 1);
|
|
||||||
mov eax, 1
|
mov eax, 1
|
||||||
call R5xxFIFOWaitLocal
|
call R5xxFIFOWaitLocal
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_DP_GUI_MASTER_CNTL, TwoDInfo->control |
|
|
||||||
; R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR);
|
|
||||||
mov eax, [rhd.control]
|
mov eax, [rhd.control]
|
||||||
or eax, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
|
or eax, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
|
||||||
wrr R5XX_DP_GUI_MASTER_CNTL, eax
|
wrr R5XX_DP_GUI_MASTER_CNTL, eax
|
||||||
|
|
||||||
; R5xxFIFOWaitLocal(rhdPtr->scrnIndex, 5);
|
|
||||||
mov eax, 5
|
mov eax, 5
|
||||||
call R5xxFIFOWaitLocal
|
call R5xxFIFOWaitLocal
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF);
|
|
||||||
wrr R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF
|
wrr R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_DP_BRUSH_BKGD_CLR, 0x00000000);
|
|
||||||
wrr R5XX_DP_BRUSH_BKGD_CLR, 0x00000000
|
wrr R5XX_DP_BRUSH_BKGD_CLR, 0x00000000
|
||||||
|
|
||||||
; RHDRegWrite(rhdPtr, R5XX_DP_SRC_FRGD_CLR, 0xFFFFFFFF);
|
|
||||||
wrr R5XX_DP_SRC_FRGD_CLR, 0xFFFFFFFF
|
wrr R5XX_DP_SRC_FRGD_CLR, 0xFFFFFFFF
|
||||||
; RHDRegWrite(rhdPtr, R5XX_DP_SRC_BKGD_CLR, 0x00000000);
|
|
||||||
wrr R5XX_DP_SRC_BKGD_CLR, 0x00000000
|
wrr R5XX_DP_SRC_BKGD_CLR, 0x00000000
|
||||||
; RHDRegWrite(rhdPtr, R5XX_DP_WRITE_MASK, 0xFFFFFFFF);
|
|
||||||
wrr R5XX_DP_WRITE_MASK, 0xFFFFFFFF
|
wrr R5XX_DP_WRITE_MASK, 0xFFFFFFFF
|
||||||
|
|
||||||
; R5xx2DIdleLocal(rhdPtr->scrnIndex);
|
|
||||||
call R5xx2DIdleLocal
|
call R5xx2DIdleLocal
|
||||||
ret
|
ret
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
R5xx2DPreInit:
|
R5xx2DPreInit:
|
||||||
|
|
||||||
mov [rhd.control], (R5XX_DATATYPE_ARGB8888 shl R5XX_GMC_DST_DATATYPE_SHIFT) or\
|
mov [rhd.control],\
|
||||||
R5XX_GMC_CLR_CMP_CNTL_DIS or R5XX_GMC_DST_PITCH_OFFSET_CNTL
|
(R5XX_DATATYPE_ARGB8888 shl R5XX_GMC_DST_DATATYPE_SHIFT) or\
|
||||||
|
R5XX_GMC_CLR_CMP_CNTL_DIS or R5XX_GMC_DST_PITCH_OFFSET_CNTL
|
||||||
|
|
||||||
mov [rhd.datatype], R5XX_DATATYPE_ARGB8888
|
mov [rhd.datatype], R5XX_DATATYPE_ARGB8888
|
||||||
mov [rhd.surface_cntl],0
|
mov [rhd.surface_cntl],0
|
||||||
@ -513,7 +480,6 @@ R5xx2DPreInit:
|
|||||||
shr ebx, 10
|
shr ebx, 10
|
||||||
or eax, ebx
|
or eax, ebx
|
||||||
|
|
||||||
; or eax, ((1024*4)/64) shl 22
|
|
||||||
mov [rhd.dst_pitch_offset], eax
|
mov [rhd.dst_pitch_offset], eax
|
||||||
|
|
||||||
ret
|
ret
|
||||||
@ -525,6 +491,17 @@ R5xx2DInit:
|
|||||||
wrr R5XX_RB3D_CNTL, 0
|
wrr R5XX_RB3D_CNTL, 0
|
||||||
call R5xx2DReset
|
call R5xx2DReset
|
||||||
call R5xx2DSetup
|
call R5xx2DSetup
|
||||||
|
|
||||||
|
rdr eax, D1GRPH_X_END
|
||||||
|
rdr ebx, D1GRPH_Y_END
|
||||||
|
dec eax
|
||||||
|
dec ebx
|
||||||
|
|
||||||
|
mov [__xmin], 0 ;set clip
|
||||||
|
mov [__ymin], 0
|
||||||
|
mov [__xmax], eax
|
||||||
|
mov [__ymax], ebx
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
proc R5xxSetupForSolidFill stdcall,color:dword, rop:dword, planemask:dword
|
proc R5xxSetupForSolidFill stdcall,color:dword, rop:dword, planemask:dword
|
||||||
@ -540,19 +517,14 @@ proc R5xxSetupForSolidFill stdcall,color:dword, rop:dword, planemask:dword
|
|||||||
mov eax, 4
|
mov eax, 4
|
||||||
call R5xxFIFOWait
|
call R5xxFIFOWait
|
||||||
|
|
||||||
; RHDRegWrite(pScrn, R5XX_DP_GUI_MASTER_CNTL, control);
|
|
||||||
wrr R5XX_DP_GUI_MASTER_CNTL, edx
|
wrr R5XX_DP_GUI_MASTER_CNTL, edx
|
||||||
|
|
||||||
; RHDRegWrite(pScrn, R5XX_DP_BRUSH_FRGD_CLR, color);
|
|
||||||
mov eax, [color]
|
mov eax, [color]
|
||||||
wrr R5XX_DP_BRUSH_FRGD_CLR, eax
|
wrr R5XX_DP_BRUSH_FRGD_CLR, eax
|
||||||
|
|
||||||
; RHDRegWrite(pScrn, R5XX_DP_WRITE_MASK, planemask);
|
|
||||||
mov ebx, [planemask]
|
mov ebx, [planemask]
|
||||||
wrr R5XX_DP_WRITE_MASK, ebx
|
wrr R5XX_DP_WRITE_MASK, ebx
|
||||||
|
|
||||||
; RHDRegWrite(pScrn, R5XX_DP_CNTL,
|
|
||||||
; R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
|
|
||||||
wrr R5XX_DP_CNTL, (R5XX_DST_X_LEFT_TO_RIGHT or R5XX_DST_Y_TOP_TO_BOTTOM)
|
wrr R5XX_DP_CNTL, (R5XX_DST_X_LEFT_TO_RIGHT or R5XX_DST_Y_TOP_TO_BOTTOM)
|
||||||
|
|
||||||
ret
|
ret
|
||||||
@ -686,6 +658,33 @@ GXcopy equ 3
|
|||||||
align 4
|
align 4
|
||||||
solid_fill:
|
solid_fill:
|
||||||
|
|
||||||
|
mov ebx, [esi+FILL.x]
|
||||||
|
mov ecx, [esi+FILL.y]
|
||||||
|
mov eax, [esi+FILL.w]
|
||||||
|
mov edx, [esi+FILL.h]
|
||||||
|
|
||||||
|
lea eax, [eax+ebx-1] ;x2
|
||||||
|
lea edx, [edx+ecx-1] ;y2
|
||||||
|
|
||||||
|
push edx ;y2
|
||||||
|
push eax ;x2
|
||||||
|
|
||||||
|
mov eax, esp ;&x2
|
||||||
|
lea ebx, [esp+4] ;&y2
|
||||||
|
|
||||||
|
lea ecx, [esi+FILL.x]
|
||||||
|
lea edx, [esi+FILL.y]
|
||||||
|
|
||||||
|
push ebx ;&y2
|
||||||
|
push eax ;&x2
|
||||||
|
push edx ;&y1
|
||||||
|
push ecx ;&x1
|
||||||
|
|
||||||
|
call _BlockClip
|
||||||
|
add esp, 16
|
||||||
|
test eax, eax
|
||||||
|
jnz .exit
|
||||||
|
|
||||||
mov edx, [R5xxRops+4+GXcopy*8]
|
mov edx, [R5xxRops+4+GXcopy*8]
|
||||||
or edx, [rhd.control]
|
or edx, [rhd.control]
|
||||||
or edx, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
|
or edx, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
|
||||||
@ -710,16 +709,41 @@ solid_fill:
|
|||||||
mov bx, word [esi+FILL.x]
|
mov bx, word [esi+FILL.x]
|
||||||
wrr R5XX_DST_Y_X, ebx
|
wrr R5XX_DST_Y_X, ebx
|
||||||
|
|
||||||
mov ecx, [esi+FILL.w]
|
mov ecx, [esp] ;x2
|
||||||
shl ecx, 16
|
sub ecx, [esi+FILL.x]
|
||||||
mov cx, word [esi+FILL.h]
|
inc ecx ;w
|
||||||
wrr R5XX_DST_WIDTH_HEIGHT, ecx
|
|
||||||
|
|
||||||
|
mov eax, [esp+4] ;y2
|
||||||
|
sub eax, [esi+FILL.y]
|
||||||
|
inc eax ;h
|
||||||
|
|
||||||
|
; mov ecx, [esi+FILL.w]
|
||||||
|
shl ecx, 16
|
||||||
|
; mov cx, word [esi+FILL.h]
|
||||||
|
mov cx, ax ;w|h
|
||||||
|
wrr R5XX_DST_WIDTH_HEIGHT, ecx
|
||||||
|
.exit:
|
||||||
|
add esp, 8
|
||||||
ret
|
ret
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
solid_line:
|
solid_line:
|
||||||
|
|
||||||
|
lea eax, [esi+LINE2P.y2]
|
||||||
|
lea ebx, [esi+LINE2P.x2]
|
||||||
|
lea ecx, [esi+LINE2P.y1]
|
||||||
|
lea edx, [esi+LINE2P.x1]
|
||||||
|
|
||||||
|
push eax
|
||||||
|
push ebx
|
||||||
|
push ecx
|
||||||
|
push edx
|
||||||
|
|
||||||
|
call _LineClip
|
||||||
|
add esp, 16
|
||||||
|
test eax, eax
|
||||||
|
jnz .exit
|
||||||
|
|
||||||
mov eax, 7
|
mov eax, 7
|
||||||
call R5xxFIFOWait
|
call R5xxFIFOWait
|
||||||
|
|
||||||
@ -747,5 +771,285 @@ solid_line:
|
|||||||
shl ecx, 16
|
shl ecx, 16
|
||||||
mov cx, word [esi+LINE2P.x2]
|
mov cx, word [esi+LINE2P.x2]
|
||||||
wrr R5XX_DST_LINE_END, ecx
|
wrr R5XX_DST_LINE_END, ecx
|
||||||
|
.exit:
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
__L1OutCode:
|
||||||
|
cmp eax, [__xmin]
|
||||||
|
mov ecx, edx
|
||||||
|
setl dl
|
||||||
|
sal edx, 3
|
||||||
|
cmp eax, [__xmax]
|
||||||
|
jle L9
|
||||||
|
or edx, 4
|
||||||
|
L9:
|
||||||
|
cmp ecx, [__ymin]
|
||||||
|
jge L11
|
||||||
|
or edx, 1
|
||||||
|
L11:
|
||||||
|
cmp ecx, [__ymax]
|
||||||
|
jle L13
|
||||||
|
or edx, 2
|
||||||
|
L13:
|
||||||
|
movzx eax, dl
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
_line_inter:
|
||||||
|
push ebp
|
||||||
|
mov ebp, edx
|
||||||
|
push edi
|
||||||
|
push esi
|
||||||
|
push ebx
|
||||||
|
sub esp, 4
|
||||||
|
mov ebx, [eax]
|
||||||
|
mov [esp], eax
|
||||||
|
mov edx, [esp+24]
|
||||||
|
mov edi, [ebp]
|
||||||
|
sub ecx, ebx
|
||||||
|
mov eax, ecx
|
||||||
|
sar eax, 31
|
||||||
|
sub edx, edi
|
||||||
|
mov esi, eax
|
||||||
|
xor esi, ecx
|
||||||
|
sub esi, eax
|
||||||
|
mov eax, [esp+28]
|
||||||
|
lea ecx, [edx+edx]
|
||||||
|
sub eax, ebx
|
||||||
|
cdq
|
||||||
|
xor eax, edx
|
||||||
|
sub eax, edx
|
||||||
|
imul ecx, eax
|
||||||
|
test ecx, ecx
|
||||||
|
jle L17
|
||||||
|
add ecx, esi
|
||||||
|
jmp L19
|
||||||
|
L17:
|
||||||
|
sub ecx, esi
|
||||||
|
L19:
|
||||||
|
lea edx, [esi+esi]
|
||||||
|
mov eax, ecx
|
||||||
|
mov ebx, edx
|
||||||
|
cdq
|
||||||
|
idiv ebx
|
||||||
|
lea eax, [eax+edi]
|
||||||
|
mov [ebp], eax
|
||||||
|
mov eax, [esp]
|
||||||
|
mov edx, [esp+28]
|
||||||
|
mov [eax], edx
|
||||||
|
pop eax
|
||||||
|
pop ebx
|
||||||
|
pop esi
|
||||||
|
pop edi
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
|
||||||
|
_LineClip:
|
||||||
|
push ebp
|
||||||
|
push edi
|
||||||
|
push esi
|
||||||
|
push ebx
|
||||||
|
mov eax, [esp+24]
|
||||||
|
mov ecx, [esp+20]
|
||||||
|
mov ebp, [esp+28]
|
||||||
|
mov edi, [esp+32]
|
||||||
|
mov edx, [eax]
|
||||||
|
mov eax, [ecx]
|
||||||
|
call __L1OutCode
|
||||||
|
mov edx, [edi]
|
||||||
|
mov bl, al
|
||||||
|
mov eax, [ebp]
|
||||||
|
call __L1OutCode
|
||||||
|
L48:
|
||||||
|
mov esi, eax
|
||||||
|
L47:
|
||||||
|
mov eax, esi
|
||||||
|
and al, bl
|
||||||
|
jne L23
|
||||||
|
mov edx, esi
|
||||||
|
cmp bl, dl
|
||||||
|
je L23
|
||||||
|
test bl, bl
|
||||||
|
jne L26
|
||||||
|
movsx eax, dl
|
||||||
|
test al, 1
|
||||||
|
je L28
|
||||||
|
push [__ymin]
|
||||||
|
mov ecx, [esp+24]
|
||||||
|
push dword [ecx]
|
||||||
|
jmp L51
|
||||||
|
L28:
|
||||||
|
test al, 2
|
||||||
|
je L31
|
||||||
|
push [__ymax]
|
||||||
|
mov edx, [esp+24]
|
||||||
|
push dword [edx]
|
||||||
|
L51:
|
||||||
|
mov eax, [esp+32]
|
||||||
|
mov edx, ebp
|
||||||
|
mov ecx, [eax]
|
||||||
|
mov eax, edi
|
||||||
|
jmp L49
|
||||||
|
L31:
|
||||||
|
test al, 4
|
||||||
|
je L33
|
||||||
|
push [__xmax]
|
||||||
|
jmp L52
|
||||||
|
L33:
|
||||||
|
test al, 8
|
||||||
|
je L30
|
||||||
|
push [__xmin]
|
||||||
|
L52:
|
||||||
|
mov edx, [esp+28]
|
||||||
|
push dword [edx]
|
||||||
|
mov edx, edi
|
||||||
|
mov eax, [esp+28]
|
||||||
|
mov ecx, [eax]
|
||||||
|
mov eax, ebp
|
||||||
|
L49:
|
||||||
|
call _line_inter
|
||||||
|
pop esi
|
||||||
|
pop eax
|
||||||
|
L30:
|
||||||
|
mov edx, [edi]
|
||||||
|
mov eax, [ebp]
|
||||||
|
call __L1OutCode
|
||||||
|
jmp L48
|
||||||
|
L26:
|
||||||
|
movsx eax, bl
|
||||||
|
test al, 1
|
||||||
|
je L36
|
||||||
|
push [__ymin]
|
||||||
|
jmp L53
|
||||||
|
L36:
|
||||||
|
test al, 2
|
||||||
|
je L39
|
||||||
|
push [__ymax]
|
||||||
|
L53:
|
||||||
|
push dword [ebp]
|
||||||
|
mov ecx, [edi]
|
||||||
|
mov edx, [esp+28]
|
||||||
|
mov eax, [esp+32]
|
||||||
|
jmp L50
|
||||||
|
L39:
|
||||||
|
test al, 4
|
||||||
|
je L41
|
||||||
|
push [__xmax]
|
||||||
|
jmp L54
|
||||||
|
L41:
|
||||||
|
test al, 8
|
||||||
|
je L38
|
||||||
|
push [__xmin]
|
||||||
|
L54:
|
||||||
|
push dword [edi]
|
||||||
|
mov ecx, [ebp]
|
||||||
|
mov edx, [esp+32]
|
||||||
|
mov eax, [esp+28]
|
||||||
|
L50:
|
||||||
|
call _line_inter
|
||||||
|
pop edx
|
||||||
|
pop ecx
|
||||||
|
L38:
|
||||||
|
mov ecx, [esp+24]
|
||||||
|
mov edx, [ecx]
|
||||||
|
mov ecx, [esp+20]
|
||||||
|
mov eax, [ecx]
|
||||||
|
call __L1OutCode
|
||||||
|
mov bl, al
|
||||||
|
jmp L47
|
||||||
|
L23:
|
||||||
|
pop ebx
|
||||||
|
movsx eax, al
|
||||||
|
pop esi
|
||||||
|
pop edi
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
_block_inter:
|
||||||
|
test cl, 1
|
||||||
|
push ebx
|
||||||
|
mov ebx, eax
|
||||||
|
je L57
|
||||||
|
mov eax, [__ymin]
|
||||||
|
jmp L66
|
||||||
|
L57:
|
||||||
|
test cl, 2
|
||||||
|
je L60
|
||||||
|
mov eax, [__ymax]
|
||||||
|
L66:
|
||||||
|
mov [edx], eax
|
||||||
|
jmp L65
|
||||||
|
L60:
|
||||||
|
test cl, 4
|
||||||
|
je L62
|
||||||
|
mov eax, [__xmax]
|
||||||
|
jmp L67
|
||||||
|
L62:
|
||||||
|
and cl, 8
|
||||||
|
je L65
|
||||||
|
mov eax, [__xmin]
|
||||||
|
L67:
|
||||||
|
mov [ebx], eax
|
||||||
|
L65:
|
||||||
|
pop ebx
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
_BlockClip:
|
||||||
|
push ebp
|
||||||
|
push edi
|
||||||
|
push esi
|
||||||
|
push ebx
|
||||||
|
mov eax, [esp+24]
|
||||||
|
mov ecx, [esp+20]
|
||||||
|
mov ebp, [esp+28]
|
||||||
|
mov edi, [esp+32]
|
||||||
|
mov edx, [eax]
|
||||||
|
mov eax, [ecx]
|
||||||
|
call __L1OutCode
|
||||||
|
mov edx, [edi]
|
||||||
|
mov ebx, eax
|
||||||
|
mov eax, [ebp]
|
||||||
|
call __L1OutCode
|
||||||
|
L80:
|
||||||
|
mov esi, eax
|
||||||
|
L79:
|
||||||
|
test esi, ebx
|
||||||
|
jne L70
|
||||||
|
cmp ebx, esi
|
||||||
|
je L72
|
||||||
|
test ebx, ebx
|
||||||
|
jne L74
|
||||||
|
mov edx, edi
|
||||||
|
mov eax, ebp
|
||||||
|
mov ecx, esi
|
||||||
|
call _block_inter
|
||||||
|
mov edx, [edi]
|
||||||
|
mov eax, [ebp]
|
||||||
|
call __L1OutCode
|
||||||
|
jmp L80
|
||||||
|
L74:
|
||||||
|
mov edx, [esp+24]
|
||||||
|
mov ecx, ebx
|
||||||
|
mov eax, [esp+20]
|
||||||
|
call _block_inter
|
||||||
|
mov eax, [esp+24]
|
||||||
|
mov ecx, [esp+20]
|
||||||
|
mov edx, [eax]
|
||||||
|
mov eax, [ecx]
|
||||||
|
call __L1OutCode
|
||||||
|
mov ebx, eax
|
||||||
|
jmp L79
|
||||||
|
L72:
|
||||||
|
mov esi, ebx
|
||||||
|
L70:
|
||||||
|
mov eax, esi
|
||||||
|
and eax, ebx
|
||||||
|
pop ebx
|
||||||
|
cwde
|
||||||
|
pop esi
|
||||||
|
pop edi
|
||||||
|
pop ebp
|
||||||
ret
|
ret
|
||||||
|
Loading…
Reference in New Issue
Block a user