📄 dxrender.pas
字号:
mov eax,ByteCount
mov edx,offset @@ByteCount-1
sub edx,offset @@StartCode
mov byte ptr [ecx+edx],al
{ @@Pitch }
mov eax,Pitch
mov edx,offset @@Pitch-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
{ @@Bits }
mov eax,Bits
mov edx,offset @@Bits-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
procedure genInitZBuffer(var Code: Pointer);
var
_Axis: Pointer;
ByteCount, Pitch: DWORD;
Bits, _ZBuf: Pointer;
begin
if not ZBuffer.Enable then Exit;
_Axis := @Axis.Axis;
ByteCount := ZBuffer.Surface.BitCount div 8;
Pitch := ZBuffer.Surface.Pitch;
Bits := ZBuffer.Surface.Bits;
_ZBuf := @F_ZBuf;
asm
jmp @@EndCode
@@StartCode:
mov edx,dword ptr [offset _null]{}@@AxisX:
imul edx,$11{} @@ByteCount: // States.ZBuffer.BitCount div 8
mov eax,dword ptr [offset _null]{}@@AxisY:
imul eax,$11111111{} @@Pitch: // States.ZBuffer.pitch
add eax,$11111111{} @@Bits: // States.ZBuffer.Bits
add eax,edx
mov dword ptr [offset _null],eax{}@@_ZBuf:
@@EndCode:
{$I DXRender.inc}
{ @@AxisX }
mov eax,_Axis; add eax,TDXRMachine_Axis.X
mov edx,offset @@AxisX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
{ @@AxisY }
mov eax,_Axis; add eax,TDXRMachine_Axis.Y
mov edx,offset @@AxisY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
{ @@ByteCount }
mov eax,ByteCount
mov edx,offset @@ByteCount-1
sub edx,offset @@StartCode
mov byte ptr [ecx+edx],al
{ @@Pitch }
mov eax,Pitch
mov edx,offset @@Pitch-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
{ @@Bits }
mov eax,Bits
mov edx,offset @@Bits-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
{ @@_ZBuf }
mov eax,_ZBuf
mov edx,offset @@_ZBuf-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
procedure genZBufferTest(var Code: Pointer);
var
_ZBuf, _RHW: Pointer;
begin
if not ZBuffer.Enable then Exit;
_ZBuf := @F_ZBuf;
_RHW := @RHW.nRHW;
asm
jmp @@EndCode
@@StartCode:
mov edx,dword ptr [offset _null]{}@@_ZBuf:
mov ebx,dword ptr [offset _null]{}@@_RHW:
@@EndCode:
{$I DXRender.inc}
{ @@_ZBuf }
mov eax,_ZBuf
mov edx,offset @@_ZBuf-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
{ @@_RHW }
mov eax,_RHW; add eax,4
mov edx,offset @@_RHW-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
if ZBuffer.CmpFunc<>DXR_CMPFUNC_ALWAYS then
begin
case ZBuffer.Surface.BitCount of
8: begin
asm
jmp @@EndCode
@@StartCode:
movzx eax,byte ptr [edx]
@@EndCode:
{$I DXRender.inc}
end;
end;
16: begin
asm
jmp @@EndCode
@@StartCode:
movzx eax,word ptr [edx]
@@EndCode:
{$I DXRender.inc}
end;
end;
24: begin
asm
jmp @@EndCode
@@StartCode:
movzx ax,byte ptr [edx+2]
shl eax,16
mov ax,word ptr [edx]
@@EndCode:
{$I DXRender.inc}
end;
end;
32: begin
asm
jmp @@EndCode
@@StartCode:
mov eax,dword ptr [edx]
@@EndCode:
{$I DXRender.inc}
end;
end;
end;
asm
jmp @@EndCode
@@StartCode:
cmp eax,ebx
@@EndCode:
{$I DXRender.inc}
end;
genCmpFunc(Code, ZBuffer.CmpFunc, SkipAddress);
end;
if ZBuffer.WriteEnable then
begin
case ZBuffer.Surface.BitCount of
8: begin
asm
jmp @@EndCode
@@StartCode:
mov byte ptr [edx],bl
@@EndCode:
{$I DXRender.inc}
end;
end;
16: begin
asm
jmp @@EndCode
@@StartCode:
mov word ptr [edx],bx
@@EndCode:
{$I DXRender.inc}
end;
end;
24: begin
asm
jmp @@EndCode
@@StartCode:
mov word ptr [edx],bx
bswap ebx
mov byte ptr [edx+2],bh
@@EndCode:
{$I DXRender.inc}
end;
end;
32: begin
asm
jmp @@EndCode
@@StartCode:
mov dword ptr [edx],ebx
@@EndCode:
{$I DXRender.inc}
end;
end;
end;
end;
end;
procedure genUpdateZBufferAddress(var Code: Pointer);
var
ByteCount: DWORD;
_ZBuf: Pointer;
begin
if not ZBuffer.Enable then Exit;
ByteCount := ZBuffer.Surface.BitCount shr 3;
_ZBuf := @F_ZBuf;
asm
jmp @@EndCode
@@StartCode:
add dword ptr [offset _null],$11{}@@_ZBuf:
@@EndCode:
{$I DXRender.inc}
{ @@_ZBuf }
mov eax,ByteCount
mov edx,offset @@_ZBuf-1
sub edx,offset @@StartCode
mov byte ptr [ecx+edx],al
{ @@_ZBuf }
mov eax,_ZBuf
mov edx,offset @@_ZBuf-5
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
procedure genReadDestPixel(var Code: Pointer);
begin
case Dest.BitCount of
8: begin
asm
jmp @@EndCode
@@StartCode:
movzx eax,byte ptr [edi]
@@EndCode:
{$I DXRender.inc}
end;
end;
16: begin
asm
jmp @@EndCode
@@StartCode:
movzx eax,word ptr [edi]
@@EndCode:
{$I DXRender.inc}
end;
end;
24: begin
asm
jmp @@EndCode
@@StartCode:
movzx eax,byte ptr [edi+2]
shl eax,16
mov ax,word ptr [edi]
@@EndCode:
{$I DXRender.inc}
end;
end;
32: begin
asm
jmp @@EndCode
@@StartCode:
mov eax,dword ptr [edi]
@@EndCode:
{$I DXRender.inc}
end;
end;
end;
end;
procedure genWriteDestPixel(var Code: Pointer);
begin
case Dest.BitCount of
8: begin
asm
jmp @@EndCode
@@StartCode:
mov byte ptr [edi],al
@@EndCode:
{$I DXRender.inc}
end;
end;
16: begin
asm
jmp @@EndCode
@@StartCode:
mov word ptr [edi],ax
@@EndCode:
{$I DXRender.inc}
end;
end;
24: begin
asm
jmp @@EndCode
@@StartCode:
mov word ptr [edi],ax
bswap eax
mov byte ptr [edi+2],ah
@@EndCode:
{$I DXRender.inc}
end;
end;
32: begin
asm
jmp @@EndCode
@@StartCode:
mov dword ptr [edi],eax
@@EndCode:
{$I DXRender.inc}
end;
end;
end;
end;
procedure genUpdateDestAddress(var Code: Pointer);
var
ByteCount: DWORD;
begin
ByteCount := Dest.BitCount shr 3;
if ByteCount=1 then
begin
asm
jmp @@EndCode
@@StartCode:
inc edi
@@EndCode:
{$I DXRender.inc}
end;
end else
begin
asm
jmp @@EndCode
@@StartCode:
add edi,$11{}@@ByteCount: // Dest.BitCount div 8;
@@EndCode:
{$I DXRender.inc}
{ @@ByteCount }
mov eax,ByteCount
mov edx,offset @@ByteCount-1
sub edx,offset @@StartCode
mov byte ptr [ecx+edx],al
end;
end;
end;
procedure genReadSurfacePixel_Tile(var Code: Pointer; const Source: TDXR_Surface; Axis: PDXRMachine_Axis);
begin
case Source.BitCount of
1: begin
asm
jmp @@EndCode
@@StartCode:
mov esi,dword ptr [offset _null]{}//TexY
@@TexY:
shr esi,16
and esi,$11111111{} @@MaskY: // Source.HeightMask
imul esi,$11111111{}@@Pitch: // Source.pitch
mov edx,dword ptr [offset _null]{}//TexX
@@TexX:
shr edx,16
and edx,$11111111{} @@MaskX: // Source.WidthMask
mov ebx,edx
shr edx,3
and ebx,7
movzx eax,byte ptr [esi+edx+$11111111]
@@Bits: // Source.Bits
and eax,dword ptr [offset Mask1+ebx*4]
push ecx
mov ecx,dword ptr [offset Shift1+ebx*4]
shr eax,cl
pop ecx
@@EndCode:
{$I DXRender.inc}
{ @@TexX }
mov eax,Axis; add eax,TDXRMachine_Axis.X
mov edx,offset @@TexX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
{ @@TexY }
mov eax,Axis; add eax,TDXRMachine_Axis.Y
mov edx,offset @@TexY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
{ @@MaskY }
mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask]
mov edx,offset @@MaskY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
{ @@Pitch }
mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch]
mov edx,offset @@Pitch-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
{ @@MaskX }
mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask]
mov edx,offset @@MaskX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
{ @@Bits }
mov eax,Source; mov eax,[eax + TDXR_Surface.Bits]
mov edx,offset @@Bits-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -