mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2024-12-26 23:36:32 +00:00
410 lines
6.1 KiB
HolyC
Executable file
410 lines
6.1 KiB
HolyC
Executable file
#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);
|