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;colnext_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