#help_index "Graphics/Misc" asm { //************************************ _GR_UPDATE_LINE64:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RAX,U64 SF_ARG2[RBP] MOV RSI,U64 [RAX] //rsi=src MOV RBX,U64 [&rev_bits_table] MOV RCX,U64 SF_ARG3[RBP] //rcx=d MOV RAX,U64 SF_ARG4[RBP] MOV RDI,U64 [RAX] //rdi=image MOV RAX,U64 SF_ARG1[RBP] MOV R8,U64 [RAX] //rbp=vga dst @@05: LODSQ CMP U64 [RDI],RAX JE @@10 MOV U64 [RDI],RAX XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 MOV U64 [R8],RAX @@10: ADD RDI,8 ADD R8,8 DEC RCX JNZ @@05 MOV RAX,U64 SF_ARG1[RBP] MOV U64 [RAX],R8 MOV RAX,U64 SF_ARG4[RBP] MOV U64 [RAX],RDI MOV RAX,U64 SF_ARG2[RBP] MOV U64 [RAX],RSI POP RDI POP RSI POP RBP RET1 32 //************************************ _GR_UPDATE_LINE64_FLUSH_CACHE:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RAX,U64 SF_ARG2[RBP] MOV RSI,U64 [RAX] //rsi=src MOV RBX,U64 [&rev_bits_table] MOV RCX,U64 SF_ARG3[RBP] //rcx=d MOV RAX,U64 SF_ARG4[RBP] MOV RDI,U64 [RAX] //rdi=image MOV RAX,U64 SF_ARG1[RBP] MOV R8,U64 [RAX] //rbp=vga dst @@05: LODSQ MOV U64 [RDI],RAX XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 XLATB ROR RAX,8 MOV U64 [R8],RAX ADD RDI,8 ADD R8,8 DEC RCX JNZ @@05 MOV RAX,U64 SF_ARG1[RBP] MOV U64 [RAX],R8 MOV RAX,U64 SF_ARG4[RBP] MOV U64 [RAX],RDI MOV RAX,U64 SF_ARG2[RBP] MOV U64 [RAX],RSI POP RDI POP RSI POP RBP RET1 32 //************************************ _DC_BLOT_COLOR4:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI PUSH R10 MOV RDI,U64 SF_ARG1[RBP] MOV RSI,U64 SF_ARG2[RBP] MOV RBX,U64 SF_ARG3[RBP] MOV RCX,U64 SF_ARG4[RBP] MOV R8,RDI ADD R8,RCX MOV R9,R8 ADD R9,RCX MOV R10,R9 ADD R10,RCX @@5: LODSQ MOV RDX,U64 [RBX] CMP RAX,RDX JE I32 @@10 MOV U64 [RBX],RAX XOR RDX,RDX BT RAX,7*8+0 ADC RDX,0 SHL1 RDX BT RAX,6*8+0 ADC RDX,0 SHL1 RDX BT RAX,5*8+0 ADC RDX,0 SHL1 RDX BT RAX,4*8+0 ADC RDX,0 SHL1 RDX BT RAX,3*8+0 ADC RDX,0 SHL1 RDX BT RAX,2*8+0 ADC RDX,0 SHL1 RDX BT RAX,1*8+0 ADC RDX,0 SHL1 RDX BT RAX,0*8+0 ADC RDX,0 MOV U8 [RDI],DL XOR RDX,RDX BT RAX,7*8+1 ADC RDX,0 SHL1 RDX BT RAX,6*8+1 ADC RDX,0 SHL1 RDX BT RAX,5*8+1 ADC RDX,0 SHL1 RDX BT RAX,4*8+1 ADC RDX,0 SHL1 RDX BT RAX,3*8+1 ADC RDX,0 SHL1 RDX BT RAX,2*8+1 ADC RDX,0 SHL1 RDX BT RAX,1*8+1 ADC RDX,0 SHL1 RDX BT RAX,0*8+1 ADC RDX,0 MOV U8 [R8],DL XOR RDX,RDX BT RAX,7*8+2 ADC RDX,0 SHL1 RDX BT RAX,6*8+2 ADC RDX,0 SHL1 RDX BT RAX,5*8+2 ADC RDX,0 SHL1 RDX BT RAX,4*8+2 ADC RDX,0 SHL1 RDX BT RAX,3*8+2 ADC RDX,0 SHL1 RDX BT RAX,2*8+2 ADC RDX,0 SHL1 RDX BT RAX,1*8+2 ADC RDX,0 SHL1 RDX BT RAX,0*8+2 ADC RDX,0 MOV U8 [R9],DL XOR RDX,RDX BT RAX,7*8+3 ADC RDX,0 SHL1 RDX BT RAX,6*8+3 ADC RDX,0 SHL1 RDX BT RAX,5*8+3 ADC RDX,0 SHL1 RDX BT RAX,4*8+3 ADC RDX,0 SHL1 RDX BT RAX,3*8+3 ADC RDX,0 SHL1 RDX BT RAX,2*8+3 ADC RDX,0 SHL1 RDX BT RAX,1*8+3 ADC RDX,0 SHL1 RDX BT RAX,0*8+3 ADC RDX,0 MOV U8 [R10],DL @@10: ADD RBX,8 INC RDI INC R8 INC R9 INC R10 DEC RCX JNZ I32 @@5 POP R10 POP RDI POP RSI POP RBP RET1 32 //************************************ _IS_PIX_COVERED0:: PUSH RBP MOV RBP,RSP #assert FONT_WIDTH==FONT_HEIGHT==8 MOV RCX,U64 SF_ARG3[RBP] SAR RCX,3 MOV RAX,U64 SF_ARG2[RBP] SAR RAX,3 MOV RDX,U64 SF_ARG1[RBP] IMUL2 RCX,TEXT_COLS MOV RBX,U64 [&gr.win_z_buf] MOV DX,U16 CTask.win_z_num[RDX] ADD RCX,RAX XOR RAX,RAX CMP DX,U16 [RBX+RCX*2] JAE @@05 //Jump not covered INC RAX @@05: POP RBP RET1 24 //************************************ _GR_ROP_EQU_U8_NO_CLIPPING:: //Puts foreground char shape onto gr.dc2. //ch.u8[1] is color as a whole byte //ch ATTRf_UNDERLINE attr flag is used. PUSH RBP MOV RBP,RSP MOVZX RAX,U8 SF_ARG1[RBP] MOV RDX,U64 [&text.font] MOV RAX,U64 [RDX+RAX*8] //RAX is 8x8 char font data, 64-bits BT U64 SF_ARG1[RBP],ATTRf_UNDERLINE JNC @@05 MOV RBX,0xFF00000000000000 OR RAX,RBX @@05: TEST RAX,RAX JZ I32 @@10 PUSH RSI PUSH RDI MOVZX RBX,U8 SF_ARG1+1[RBP] //Warning color is 8-bit MOV RDX,U64 [&gr.to_8_colors] MOV R8,U64 [RDX+RBX*8] //R8 is color repeated 8 times. MOV R9,U64 SF_ARG3[RBP] //R9 is width_internal MOV RDI,U64 SF_ARG2[RBP] MOV RSI,U64 [&gr.to_8_bits] //RSI is gr.to_8_bits // m=my_1_to_8_bits[ch&255];ch>>=8; // *dst=*dst&~m|c&m; // dst(U8 *)+=w1; MOVZX RBX,AL MOV RDX,U64 [RSI+RBX*8] SHR RAX,8 MOV RBX,U64 [RDI] MOV RCX,RDX NOT RCX AND RDX,R8 AND RCX,RBX OR RCX,RDX MOV U64 [RDI],RCX ADD RDI,R9 MOVZX RBX,AL MOV RDX,U64 [RSI+RBX*8] SHR RAX,8 MOV RBX,U64 [RDI] MOV RCX,RDX NOT RCX AND RDX,R8 AND RCX,RBX OR RCX,RDX MOV U64 [RDI],RCX ADD RDI,R9 MOVZX RBX,AL MOV RDX,U64 [RSI+RBX*8] SHR RAX,8 MOV RBX,U64 [RDI] MOV RCX,RDX NOT RCX AND RDX,R8 AND RCX,RBX OR RCX,RDX MOV U64 [RDI],RCX ADD RDI,R9 MOVZX RBX,AL MOV RDX,U64 [RSI+RBX*8] SHR RAX,8 MOV RBX,U64 [RDI] MOV RCX,RDX NOT RCX AND RDX,R8 AND RCX,RBX OR RCX,RDX MOV U64 [RDI],RCX ADD RDI,R9 MOVZX RBX,AL MOV RDX,U64 [RSI+RBX*8] SHR RAX,8 MOV RBX,U64 [RDI] MOV RCX,RDX NOT RCX AND RDX,R8 AND RCX,RBX OR RCX,RDX MOV U64 [RDI],RCX ADD RDI,R9 MOVZX RBX,AL MOV RDX,U64 [RSI+RBX*8] SHR RAX,8 MOV RBX,U64 [RDI] MOV RCX,RDX NOT RCX AND RDX,R8 AND RCX,RBX OR RCX,RDX MOV U64 [RDI],RCX ADD RDI,R9 MOVZX RBX,AL MOV RDX,U64 [RSI+RBX*8] SHR RAX,8 MOV RBX,U64 [RDI] MOV RCX,RDX NOT RCX AND RDX,R8 AND RCX,RBX OR RCX,RDX MOV U64 [RDI],RCX ADD RDI,R9 MOV RDX,U64 [RSI+RAX*8] MOV RBX,U64 [RDI] MOV RCX,RDX NOT RCX AND RDX,R8 AND RCX,RBX OR RCX,RDX MOV U64 [RDI],RCX POP RDI POP RSI @@10: POP RBP RET1 24 } _extern _GR_ROP_EQU_U8_NO_CLIPPING U0 GrRopEquU8NoClipping(I64 ch, U8 *dst,I64 width_internal); public _extern _IS_PIX_COVERED0 Bool IsPixCovered0( CTask *task,I64 x,I64 y);//No clipping _extern _GR_UPDATE_LINE64 U0 GrUpdateLine64( U64 **_vga,U64 **_src,I64 d,U8 **_dst); _extern _GR_UPDATE_LINE64_FLUSH_CACHE U0 GrUpdateLine64FlushCache( U64 **_vga,U64 **_src,I64 d,U8 **_dst); _extern _DC_BLOT_COLOR4 U0 DCBlotColor4( U8 *dst,I64 *img,I64 *img_cache,I64 cnt);