⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dxrender.pas

📁 传奇源代码的delphi版本
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      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 + -