594 lines
10 KiB
Plaintext
594 lines
10 KiB
Plaintext
IMPORT sys_update_screen_tss;
|
|
|
|
ALIGN 8,OC_NOP
|
|
NORMAL_KEY_SCAN_DECODE_TABLE::
|
|
DU1 0,CH_ESC,"1234567890-=",8,9;
|
|
DU1 "qwertyuiop[]",CH_CR,0,"as";
|
|
DU1 "dfghjkl;'\`",0,"\\zxcv";
|
|
DU1 "bnm,./",0,'*',0,CH_SPACE,0,0,0,0,0,0;
|
|
DU1 0,0,0,0,0,0,0,0,0,0,'-',0,0,0,'+',0;
|
|
SHIFT_KEY_SCAN_DECODE_TABLE::
|
|
DU1 0,CH_ESC,"!@#$$%^&*()_+",8,9;
|
|
DU1 "QWERTYUIOP{}",CH_CR,0,"AS";
|
|
DU1 "DFGHJKL:\"~",0,"|ZXCV";
|
|
DU1 "BNM<>?",0,'*',0,CH_SHIFT_SPACE,0,0,0,0,0,0;
|
|
DU1 0,0,0,0,0,0,0,0,0,0,'-',0,0,0,'+',0;
|
|
CTRL_KEY_SCAN_DECODE_TABLE::
|
|
DU1 0,CH_ESC,"1234567890-=",8,9;
|
|
DU1 17,23,5,18,20,25,21,9,15,16,"[]",CH_CR,0,1,19;
|
|
DU1 4,6,7,8,CH_LINE_FEED,11,12,";'\`",0,"\\",26,24,3,22;
|
|
DU1 2,14,13,",./",0,'*',0,CH_SPACE,0,0,0,0,0,0;
|
|
DU1 0,0,0,0,0,0,0,0,0,0,'-',0,0,0,'+',0;
|
|
|
|
ALIGN 8,OC_NOP
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_PLOT_SCREEN_I1::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RBX,U8 SF_PARAM2[RBP]
|
|
MOV RAX,U8 SF_PARAM3[RBP]
|
|
OR RBX,RBX
|
|
JS @@100
|
|
OR RAX,RAX
|
|
JS @@100
|
|
CMP RBX,TEXT_COLS
|
|
JGE @@100
|
|
CMP RAX,TEXT_ROWS
|
|
JGE @@100
|
|
IMUL2 RAX,TEXT_COLS
|
|
ADD RBX,RAX
|
|
SHL RBX,2
|
|
ADD RBX,U8 [SYS_TEXTBASE]
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
MOV U4 [RBX],EAX
|
|
|
|
POP RBP
|
|
MOV RAX,1
|
|
RET
|
|
@@100: POP RBP
|
|
XOR EAX,EAX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_PLOT_WIN_I1::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RBX,U8 SF_PARAM3[RBP]
|
|
MOV RAX,U8 SF_PARAM4[RBP]
|
|
MOV RCX,U8 SF_PARAM1[RBP]
|
|
|
|
OR RBX,RBX
|
|
JS @@100
|
|
ADD RBX,U8 TSS_WIN_LEFT[RCX]
|
|
CMP RBX,U8 TSS_WIN_RIGHT[RCX]
|
|
JG @@100
|
|
OR RBX,RBX
|
|
JS @@100
|
|
CMP RBX,TEXT_COLS
|
|
JGE @@100
|
|
|
|
OR RAX,RAX
|
|
JS @@100
|
|
ADD RAX,U8 TSS_WIN_TOP[RCX]
|
|
CMP RAX,U8 TSS_WIN_BOTTOM[RCX]
|
|
JG @@100
|
|
OR RAX,RAX
|
|
JS @@100
|
|
CMP RAX,TEXT_ROWS
|
|
JGE @@100
|
|
|
|
IMUL2 RAX,TEXT_COLS
|
|
ADD RBX,RAX
|
|
SHL RBX,2
|
|
ADD RBX,U8 [SYS_TEXTBASE]
|
|
MOV RAX,U8 SF_PARAM2[RBP]
|
|
MOV U4 [RBX],EAX
|
|
|
|
POP RBP
|
|
MOV RAX,1
|
|
RET
|
|
@@100: POP RBP
|
|
XOR EAX,EAX
|
|
RET
|
|
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
/*
|
|
BoolU4 PlotWinStr2(TssStruct *tss,I1 *s,I8 len,
|
|
U8 attr,I8 x,I8 y)
|
|
*/
|
|
ALIGN 8,OC_NOP
|
|
CP_PLOT_WIN_STR2::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV R10,U8 [SYS_TEXTBASE]
|
|
PUSH RSI
|
|
PUSH RDI
|
|
MOV RBX,U8 SF_PARAM1[RBP]
|
|
MOV RSI,U8 SF_PARAM2[RBP]
|
|
MOV RDI,U8 SF_PARAM5[RBP]
|
|
MOV RCX,U8 SF_PARAM3[RBP]
|
|
|
|
OR RDI,RDI
|
|
JNS @@10
|
|
ADD RCX,RDI
|
|
SUB RSI,RDI
|
|
XOR EDI,EDI
|
|
@@10: ADD RDI,U8 TSS_WIN_LEFT[RBX]
|
|
MOV RDX,RCX
|
|
ADD RDX,RDI
|
|
DEC RDX
|
|
CMP RDX,U8 TSS_WIN_RIGHT[RBX]
|
|
JLE @@11
|
|
MOV RAX,RDX
|
|
SUB RAX,U8 TSS_WIN_RIGHT[RBX]
|
|
SUB RDX,RAX
|
|
SUB RCX,RAX
|
|
@@11: OR RDI,RDI
|
|
JNS @@12
|
|
ADD RCX,RDI
|
|
SUB RSI,RDI
|
|
XOR EDI,EDI
|
|
@@12: INC RDX
|
|
SUB RDX,TEXT_COLS
|
|
JLE @@13
|
|
SUB RCX,RDX
|
|
@@13: CMP RCX,1
|
|
JL @@100
|
|
|
|
MOV RAX,U8 SF_PARAM6[RBP]
|
|
OR RAX,RAX
|
|
JS @@100
|
|
ADD RAX,U8 TSS_WIN_TOP[RBX]
|
|
CMP RAX,U8 TSS_WIN_BOTTOM[RBX]
|
|
JG @@100
|
|
OR RAX,RAX
|
|
JS @@100
|
|
CMP RAX,TEXT_ROWS
|
|
JGE @@100
|
|
|
|
IMUL2 RAX,TEXT_COLS
|
|
ADD RDI,RAX
|
|
SHL RDI,2
|
|
ADD RDI,R10
|
|
MOV RAX,U8 SF_PARAM4[RBP]
|
|
@@20: LODSB
|
|
STOSD
|
|
LOOP @@20
|
|
|
|
POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
MOV RAX,TRUE
|
|
RET
|
|
|
|
@@100: POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
XOR EAX,EAX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
/*
|
|
BoolU4 PlotAttr(TssStruct *tss,I8 len,
|
|
U8 attr,I8 x,I8 y)
|
|
*/
|
|
ALIGN 8,OC_NOP
|
|
CP_PLOT_ATTR::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV R10,U8 [SYS_TEXTBASE]
|
|
PUSH RSI
|
|
PUSH RDI
|
|
MOV RBX,U8 SF_PARAM1[RBP]
|
|
MOV RDI,U8 SF_PARAM4[RBP]
|
|
MOV RCX,U8 SF_PARAM2[RBP]
|
|
|
|
OR RDI,RDI
|
|
JNS @@10
|
|
ADD RCX,RDI
|
|
XOR EDI,EDI
|
|
@@10: ADD RDI,U8 TSS_WIN_LEFT[RBX]
|
|
MOV RDX,RCX
|
|
ADD RDX,RDI
|
|
DEC RDX
|
|
CMP RDX,U8 TSS_WIN_RIGHT[RBX]
|
|
JLE @@11
|
|
MOV RAX,RDX
|
|
SUB RAX,U8 TSS_WIN_RIGHT[RBX]
|
|
SUB RDX,RAX
|
|
SUB RCX,RAX
|
|
@@11: OR RDI,RDI
|
|
JNS @@12
|
|
ADD RCX,RDI
|
|
XOR EDI,EDI
|
|
@@12: INC RDX
|
|
SUB RDX,TEXT_COLS
|
|
JLE @@13
|
|
SUB RCX,RDX
|
|
@@13: CMP RCX,1
|
|
JL @@100
|
|
|
|
MOV RAX,U8 SF_PARAM5[RBP]
|
|
OR RAX,RAX
|
|
JS @@100
|
|
ADD RAX,U8 TSS_WIN_TOP[RBX]
|
|
CMP RAX,U8 TSS_WIN_BOTTOM[RBX]
|
|
JG @@100
|
|
OR RAX,RAX
|
|
JS @@100
|
|
CMP RAX,TEXT_ROWS
|
|
JGE @@100
|
|
|
|
IMUL2 RAX,TEXT_COLS
|
|
ADD RDI,RAX
|
|
SHL RDI,2
|
|
ADD RDI,R10
|
|
MOV RBX,U8 SF_PARAM3[RBP]
|
|
MOV RSI,RDI
|
|
@@20: LODSD
|
|
OR AL,AL
|
|
JNZ @@21
|
|
MOV RAX,RBX
|
|
STOSD
|
|
LOOP @@20
|
|
|
|
@@21: POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
MOV RAX,TRUE
|
|
RET
|
|
|
|
@@100: POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
XOR EAX,EAX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_PLOT_BORDER_I1::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV R10,U8 [SYS_TEXTBASE]
|
|
MOV RBX,U8 SF_PARAM3[RBP]
|
|
MOV RAX,U8 SF_PARAM4[RBP]
|
|
MOV RCX,U8 SF_PARAM1[RBP]
|
|
|
|
MOV RDX,-1
|
|
CMP RBX,RDX
|
|
JL @@100
|
|
ADD RBX,U8 TSS_WIN_LEFT[RCX]
|
|
MOV RDX,U8 TSS_WIN_RIGHT[RCX]
|
|
INC RDX
|
|
CMP RBX,RDX
|
|
JG @@100
|
|
OR RBX,RBX
|
|
JS @@100
|
|
CMP RBX,TEXT_COLS
|
|
JGE @@100
|
|
|
|
MOV RDX,-1
|
|
CMP RAX,RDX
|
|
JL @@100
|
|
ADD RAX,U8 TSS_WIN_TOP[RCX]
|
|
MOV RDX,U8 TSS_WIN_BOTTOM[RCX]
|
|
INC RDX
|
|
CMP RAX,RDX
|
|
JG @@100
|
|
OR RAX,RAX
|
|
JS @@100
|
|
CMP RAX,TEXT_ROWS
|
|
JGE @@100
|
|
|
|
IMUL2 RAX,TEXT_COLS
|
|
ADD RBX,RAX
|
|
SHL RBX,2
|
|
ADD RBX,R10
|
|
MOV RAX,U8 SF_PARAM2[RBP]
|
|
MOV U4 [RBX],EAX
|
|
|
|
POP RBP
|
|
MOV RAX,TRUE
|
|
RET
|
|
@@100: POP RBP
|
|
XOR EAX,EAX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
/*
|
|
GrXorLineU8(&dst3,&src,&src2,d5b,vga_image,reverse_table);
|
|
for (col=0;col<d5a;col++) {
|
|
*dst3=*src^*src2;
|
|
dst3+=8;
|
|
src+=8;
|
|
src2+=8;
|
|
}
|
|
*/
|
|
GR_XOR_LINE_U8::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
PUSH RDI
|
|
|
|
MOV RAX,U8 SF_PARAM2[RBP]
|
|
MOV RDX,U8 [RAX]
|
|
MOV RAX,U8 SF_PARAM3[RBP]
|
|
MOV RSI,U8 [RAX] //rsi=src2
|
|
MOV RBX,U8 SF_PARAM6[RBP] //rbx=reverse table
|
|
MOV RCX,U8 SF_PARAM4[RBP] //rcx=d5
|
|
MOV RAX,U8 SF_PARAM5[RBP]
|
|
MOV RDI,U8 [RAX] //rdi=vga image
|
|
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
MOV R8,U8 [RAX] //rbp=vga dst
|
|
|
|
@@5: MOV RAX,U8 [RDX]
|
|
XOR RAX,U8 [RSI]
|
|
CMP U8 [RDI],RAX
|
|
JE @@7
|
|
MOV U8 [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 U8 [R8],RAX
|
|
@@7: ADD RDI,8
|
|
ADD R8,8
|
|
ADD RSI,8
|
|
ADD RDX,8
|
|
LOOP @@5
|
|
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
MOV U8 [RAX],R8
|
|
MOV RAX,U8 SF_PARAM5[RBP]
|
|
MOV U8 [RAX],RDI
|
|
MOV RAX,U8 SF_PARAM3[RBP]
|
|
MOV U8 [RAX],RSI
|
|
MOV RAX,U8 SF_PARAM2[RBP]
|
|
MOV U8 [RAX],RDX
|
|
POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
|
|
////**************************PROCEDURE*************************
|
|
GR_XOR_BITMAP_U8::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
PUSH RDI
|
|
|
|
MOV RSI,SF_PARAM2[RBP]
|
|
MOV RDI,SF_PARAM1[RBP]
|
|
MOV RCX,SF_PARAM3[RBP]
|
|
@@1: LODSQ
|
|
XOR RAX,U8 [RDI]
|
|
STOSQ
|
|
LOOP @@1
|
|
|
|
POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
/*
|
|
GrPlotChar(font_ptr,cur_ch.u1[1],&dst2,d1,d2);
|
|
|
|
for (plane=0x01;plane!=0x10;plane<<=1) {
|
|
font_ptr2=font_ptr;
|
|
if (cur_ch.u1[1] & plane) {
|
|
for (ch_line=0;ch_line<FONT_HEIGHT;ch_line++) {
|
|
*dst2|=*font_ptr2++;
|
|
dst2+=d1;
|
|
}
|
|
} else {
|
|
for (ch_line=0;ch_line<FONT_HEIGHT;ch_line++) {
|
|
*dst2&=~*font_ptr2++;
|
|
dst2+=d1;
|
|
}
|
|
}
|
|
dst2+=d2;
|
|
}
|
|
*/
|
|
GR_PLOT_CHAR::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
PUSH RDI
|
|
MOV RDX,1 //EDX=plane
|
|
MOV RBX,U8 SF_PARAM4[RBP] //RBX=d1
|
|
MOV RAX,U8 SF_PARAM3[RBP]
|
|
MOV RDI,U8 [RAX] //RDI=dst2
|
|
@@10: MOV RSI,U8 SF_PARAM1[RBP] //RSI=font_ptr2
|
|
TEST U8 SF_PARAM2[RBP],RDX
|
|
JZ @@30
|
|
|
|
@@20: LODSQ
|
|
OR U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
OR U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
OR U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
OR U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
OR U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
OR U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
OR U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
OR U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
JMP @@40
|
|
|
|
@@30: LODSQ
|
|
NOT RAX
|
|
AND U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
AND U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
AND U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
AND U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
AND U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
AND U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
AND U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
ROR RAX,8
|
|
AND U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
|
|
@@40: ADD RDI,U8 SF_PARAM5[RBP]
|
|
SHL1 RDX
|
|
CMP RDX,0x10
|
|
JNE U4 @@10
|
|
|
|
MOV RAX,U8 SF_PARAM3[RBP]
|
|
MOV U8 [RAX],RDI
|
|
POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
/*
|
|
GrPlotBackground(cur_ch.u1[1],&dst,d1,d2);
|
|
|
|
for (plane=0x10;plane!=0x100;plane=plane<<1) {
|
|
d=(cur_ch.u1[1] & plane) ? 0xFF:0x00;
|
|
for (ch_line=0;ch_line<FONT_HEIGHT;ch_line++) {
|
|
*dst=d;
|
|
dst+=d1;
|
|
}
|
|
dst+=d2;
|
|
}
|
|
*/
|
|
GR_PLOT_BACKGROUND::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RDI
|
|
MOV RDX,0x10 //EDX=plane
|
|
MOV RBX,U8 SF_PARAM3[RBP] //RBX=d1
|
|
MOV RAX,U8 SF_PARAM2[RBP] //RDI=dst
|
|
MOV RDI,U8 [RAX] //RDI=dst
|
|
|
|
@@10: XOR EAX,EAX
|
|
TEST U8 SF_PARAM1[RBP],RDX
|
|
JZ @@20
|
|
DEC RAX
|
|
|
|
@@20: MOV U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
MOV U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
MOV U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
MOV U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
MOV U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
MOV U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
MOV U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
MOV U1 [RDI],AL
|
|
ADD RDI,RBX
|
|
|
|
ADD RDI,U8 SF_PARAM4[RBP]
|
|
SHL1 RDX
|
|
CMP RDX,0x100
|
|
JNE @@10
|
|
|
|
MOV RAX,U8 SF_PARAM2[RBP]
|
|
MOV U8 [RAX],RDI
|
|
POP RDI
|
|
POP RBP
|
|
RET
|
|
|
|
/*****
|
|
BoolU4 IsPixelCovered(TssStruct *tss,I8 x,I8 y)
|
|
{
|
|
if (tss==sys_update_screen_tss) return FALSE;
|
|
tss=tss->next_tss;
|
|
while (tss!=sys_update_screen_tss) {
|
|
if (Bt(&tss->crt_flags,CRTf_SHOW)) { //no short circuit logic
|
|
if (x>=tss->win_border_pixel_left) {
|
|
if (x<=tss->win_border_pixel_right) {
|
|
if (y>=tss->win_border_pixel_top) {
|
|
if (y<=tss->win_border_pixel_bottom) {
|
|
return TRUE;
|
|
}}}}}
|
|
tss=tss->next_tss;
|
|
}
|
|
return FALSE;
|
|
}
|
|
*********/
|
|
CP_IS_PIXEL_COVERED::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
MOV RBX,U8 SF_PARAM2[RBP]
|
|
MOV RCX,U8 SF_PARAM3[RBP]
|
|
MOV RDX,U8 [sys_update_screen_tss]
|
|
BT U4 TSS_CRT_FLAGS[RAX],CRTf_ON_TOP
|
|
JC @@100
|
|
PUSHFD
|
|
CLI
|
|
MOV RAX,U8 TSS_NEXT_TSS[RAX]
|
|
JMP @@30
|
|
|
|
@@1: BT U4 TSS_CRT_FLAGS[RAX],CRTf_SHOW
|
|
JNC @@20
|
|
CMP RBX,U8 TSS_WIN_BORDER_PIXEL_LEFT[RAX]
|
|
JL @@20
|
|
CMP RCX,U8 TSS_WIN_BORDER_PIXEL_TOP[RAX]
|
|
JL @@20
|
|
CMP RBX,U8 TSS_WIN_BORDER_PIXEL_RIGHT[RAX]
|
|
JG @@20
|
|
CMP RCX,U8 TSS_WIN_BORDER_PIXEL_BOTTOM[RAX]
|
|
JG @@20
|
|
POPFD
|
|
MOV RAX,TRUE
|
|
POP RBP
|
|
RET
|
|
|
|
@@20: MOV RAX,U8 TSS_NEXT_TSS[RAX]
|
|
@@30: CMP RAX,RDX
|
|
JNE @@1
|
|
POPFD
|
|
|
|
@@100: XOR EAX,EAX
|
|
POP RBP
|
|
RET
|