working VBE implementation. Not exactly polished.

This commit is contained in:
xmm15 2020-02-19 17:24:43 -06:00
parent 9063280cc5
commit ba94931c1b
13 changed files with 319 additions and 510 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -6,8 +6,9 @@ the normal screen text output routine.
See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$(). See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$().
*/ */
I64 i,row,col; I64 i,row,col,x,y;
U8 *ptr,*ptr1,*ptr2; U32 *framebuffer;
U64 ch_bitmap;
if (!(text.raw_flags&RAWF_SHOW_DOLLAR)) { if (!(text.raw_flags&RAWF_SHOW_DOLLAR)) {
if (ch=='$$') { if (ch=='$$') {
@ -26,61 +27,56 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$().
if (text.raw_flags&RAWF_IN_DOLLAR) if (text.raw_flags&RAWF_IN_DOLLAR)
return; return;
} }
if (ch=='\t') { if (ch=='\t')
{
RawPutChar(CH_SPACE); RawPutChar(CH_SPACE);
while (text.raw_col & 7) while (text.raw_col & 7)
RawPutChar(CH_SPACE); RawPutChar(CH_SPACE);
} else if (ch==CH_BACKSPACE) { }
else if (ch==CH_BACKSPACE)
{
text.raw_col--; text.raw_col--;
RawPutChar(CH_SPACE); RawPutChar(CH_SPACE);
text.raw_col--; text.raw_col--;
} else if (ch=='\n') { }
else if (ch=='\n')
{
RawPutChar(CH_SPACE); RawPutChar(CH_SPACE);
while (text.raw_col % text.cols) while (text.raw_col % text.cols)
RawPutChar(CH_SPACE); RawPutChar(CH_SPACE);
}
else if (Bt(char_bmp_displayable,ch))
{
row = text.raw_col / text.cols % text.rows;
col = text.raw_col % text.cols;
} else if (Bt(char_bmp_displayable,ch)) { if (text.raw_flags&RAWF_SCROLL && text.raw_col && !row && !col)
row=text.raw_col/text.cols%text.rows; {//Scroll screen down
col=text.raw_col%text.cols; MemCopy(text.fb_alias,
if (!Bt(&sys_run_level,RLf_VESA)) { //if text mode text.fb_alias + sys_vbe_mode.width * FONT_HEIGHT,
if (text.raw_flags&RAWF_SCROLL && text.raw_col && !row && !col) { (text.screen_size - sys_vbe_mode.width * FONT_HEIGHT) * sizeof(U32));
MemCopy(text.vga_text_alias,text.vga_text_alias+text.cols*2, MemSetU32(text.fb_alias + text.screen_size - sys_vbe_mode.width * FONT_HEIGHT, BLACK32, sys_vbe_mode.width * FONT_HEIGHT);
text.cols*(text.rows-1)*2);
MemSet(text.vga_text_alias+text.cols*(text.rows-1)*2,0,text.cols*2);
text.raw_col-=text.cols; text.raw_col-=text.cols;
row=text.rows-1; row=text.rows-1;
} }
ptr=text.vga_text_alias+(row*text.cols+col)*2; x = col * FONT_WIDTH;
ptr[0]=ch; y = row * FONT_HEIGHT;
ptr[1]=BLACK<<4+WHITE; ch_bitmap = text.font[ch & 0xFF];
} else { framebuffer = text.fb_alias + sys_vbe_mode.width * y + x;
OutU8(VGAP_IDX,VGAR_MAP_MASK);
OutU8(VGAP_DATA,0x0F); //All planes -- WHITE
if (text.raw_flags&RAWF_SCROLL && text.raw_col && !row && !col) {
//Scroll cached image
MemCopy(text.raw_screen_image,
text.raw_screen_image+GR_WIDTH*FONT_HEIGHT>>3,
GR_WIDTH*(GR_HEIGHT-FONT_HEIGHT)>>3);
MemSet(text.raw_screen_image+GR_WIDTH*(GR_HEIGHT-FONT_HEIGHT)>>3,0,
GR_WIDTH*FONT_HEIGHT>>3);
MemCopy(text.vga_alias,text.raw_screen_image,GR_WIDTH*GR_HEIGHT>>3);
text.raw_col-=text.cols;
row=text.rows-1;
}
PUSHFD PUSHFD
CLI CLI
ptr=ptr1=col+row*GR_WIDTH*FONT_HEIGHT>>3; for (i = 0; i < FONT_WIDTH * FONT_HEIGHT; i++)
ptr+=text.vga_alias; {
ptr1+=text.raw_screen_image; //Write to cached image as well if (ch_bitmap & 1)
ptr2=&text.font[ch&255]; *framebuffer++ = WHITE32;
for (i=0;i<FONT_HEIGHT;i++) { else
*ptr=*ptr1=rev_bits_table[*ptr2++]; *framebuffer++ = BLACK32;
ptr+=GR_WIDTH>>3; if (i & (FONT_WIDTH-1) == FONT_WIDTH-1)
ptr1+=GR_WIDTH>>3; framebuffer += sys_vbe_mode.width - FONT_WIDTH;
ch_bitmap >>= 1;
} }
POPFD POPFD
}
text.raw_col++; text.raw_col++;
} }
} }

View File

@ -97,42 +97,8 @@ U0 SysGrInit()
MemSetU32(text.fb_alias, BLACK32, text.screen_size); MemSetU32(text.fb_alias, BLACK32, text.screen_size);
text.vga_alias = CAlloc(text.rows * text.cols * 8); text.vga_alias = CAlloc(text.rows * text.cols * 8);
text.vga_text_alias = CAlloc(text.rows * text.cols * 2);
} }
/*U0 SysGrInit()
{
I64 i, j;
text.font = MAlloc(256 * 8); //256 U64s
MemCopy(text.font, *SYS_FONT_PTR(U32), 256 * 8);
for (i = 0; i < 256; i++)
for (j = 0; j < 8; j++)
text.font[i].u8[j] = rev_bits_table[text.font[i].u8[j]];
text.aux_font=sys_font_std;
text.font['' - 1] = text.aux_font['' - 1]; //Shift-space
text.font[10] = text.aux_font[10]; //"Return" symbol
text.font[255] = text.aux_font[255]; //auxillary block character
text.border_chars[2] (I64)='ÄͳºÚÉ¿»';
text.border_chars[10](U32)='ÀÈÙ¼';
text.vga_alias =dev.uncached_alias+VGAM_GRAPHICS;
text.vga_text_alias =dev.uncached_alias+VGAM_TEXT;
if (!Bt(&sys_run_level,RLf_VESA)) { //if text mode
text.cols=80;
text.rows=25;
MemSet(text.vga_text_alias,0,text.rows*text.cols<<1);
} else { //if 640x480 16 color
text.cols=GR_WIDTH/FONT_WIDTH;
text.rows=GR_HEIGHT/FONT_HEIGHT;
OutU8(VGAP_IDX,VGAR_MAP_MASK);
OutU8(VGAP_DATA,0x0F);
MemSet(text.vga_alias,0,GR_WIDTH*GR_HEIGHT>>3);
text.raw_screen_image=CAlloc(GR_WIDTH*GR_HEIGHT/8);
}
}*/
U0 TimerInit() U0 TimerInit()
{//See $LK,"::/Doc/PIT.DD",A="FI:::/Doc/PIT.DD"$. {//See $LK,"::/Doc/PIT.DD",A="FI:::/Doc/PIT.DD"$.
OutU8(PIT_CMD, PIT_CMDF_CHANNEL0 | PIT_CMDF_OPMODE_RATE_GEN | PIT_CMDF_ACCESS_WORD); OutU8(PIT_CMD, PIT_CMDF_CHANNEL0 | PIT_CMDF_OPMODE_RATE_GEN | PIT_CMDF_ACCESS_WORD);

File diff suppressed because one or more lines are too long

View File

@ -3721,10 +3721,10 @@ public class CTextGlobals
{ {
I64 raw_col,raw_flags; I64 raw_col,raw_flags;
U8 *raw_screen_image; U8 *raw_screen_image;
U32 *raw_screen, *fb_alias; U32 *raw_screen, *fb_alias;
I64 rows,cols; //Use TEXT_ROWS,TEXT_COLS I64 rows,cols; //Use TEXT_ROWS,TEXT_COLS
U64 *font,*aux_font,screen_size, buffer_size; U64 *font,*aux_font,screen_size, buffer_size;
U8 *vga_alias,*vga_text_alias; U8 *vga_alias;
U8 border_chars[16]; U8 border_chars[16];
}; };
@ -3732,9 +3732,6 @@ public class CTextGlobals
#define FONT_HEIGHT 8 #define FONT_HEIGHT 8
#help_index "Graphics" #help_index "Graphics"
#define GR_WIDTH 640
#define GR_HEIGHT 480
//z-vals less than zero are in front of screen and not drawn. //z-vals less than zero are in front of screen and not drawn.
//we want to shift all Z-vals into a drawable range. //we want to shift all Z-vals into a drawable range.
//GR_Z_ALL is set to half of the Z-range which is an I32. //GR_Z_ALL is set to half of the Z-range which is an I32.

View File

@ -21,8 +21,8 @@ U0 MouseUpdate(I64 x,I64 y,I64 z,Bool l,Bool r)
mouse.pos.z=mouse.presnap.z; mouse.pos.z=mouse.presnap.z;
} }
mouse.pos.x=ClampI64(mouse.pos.x,0,GR_WIDTH-1); mouse.pos.x=ClampI64(mouse.pos.x,0,sys_vbe_mode.width-1);
mouse.pos.y=ClampI64(mouse.pos.y,0,GR_HEIGHT-1); mouse.pos.y=ClampI64(mouse.pos.y,0,sys_vbe_mode.height-1);
mouse.pos_text.x=mouse.pos.x/FONT_WIDTH; mouse.pos_text.x=mouse.pos.x/FONT_WIDTH;
if (mouse.pos_text.x>=text.cols) { if (mouse.pos_text.x>=text.cols) {
mouse.pos_text.x=text.cols-1; mouse.pos_text.x=text.cols-1;
@ -41,9 +41,9 @@ U0 MouseUpdate(I64 x,I64 y,I64 z,Bool l,Bool r)
U0 MouseSet(I64 x=I64_MAX,I64 y=I64_MAX,I64 z=I64_MAX,I64 l=I64_MAX,I64 r=I64_MAX) U0 MouseSet(I64 x=I64_MAX,I64 y=I64_MAX,I64 z=I64_MAX,I64 l=I64_MAX,I64 r=I64_MAX)
{//Note: Generates a message. See $LK,"MouseSet",A="FF:::/Demo/Games/Zing.CC,MouseSet"$(). {//Note: Generates a message. See $LK,"MouseSet",A="FF:::/Demo/Games/Zing.CC,MouseSet"$().
if (!(0<=x<GR_WIDTH)) if (!(0<=x<sys_vbe_mode.width))
x=mouse.pos.x; x=mouse.pos.x;
if (!(0<=y<GR_HEIGHT)) if (!(0<=y<sys_vbe_mode.height))
y=mouse.pos.y; y=mouse.pos.y;
if (z==I64_MAX) if (z==I64_MAX)
z=mouse.pos.z; z=mouse.pos.z;
@ -211,14 +211,14 @@ U0 MouseHardSetPost()
//TODO mouse_grid.x_offset? //TODO mouse_grid.x_offset?
if (i<0) if (i<0)
mouse.offset.x-=i; mouse.offset.x-=i;
else if (i>=GR_WIDTH) else if (i>=sys_vbe_mode.width)
mouse.offset.x+=GR_WIDTH-1-i; mouse.offset.x+=sys_vbe_mode.width-1-i;
i=Trunc(mouse.scale.y*mouse_hard.pos.y/mouse_grid.y)*mouse_grid.y+mouse.offset.y; i=Trunc(mouse.scale.y*mouse_hard.pos.y/mouse_grid.y)*mouse_grid.y+mouse.offset.y;
if (i<0) if (i<0)
mouse.offset.y-=i; mouse.offset.y-=i;
else if (i>=GR_HEIGHT) else if (i>=sys_vbe_mode.height)
mouse.offset.y+=GR_HEIGHT-1-i; mouse.offset.y+=sys_vbe_mode.height-1-i;
if (mouse_hard.pos.x!=mouse_hard_last.pos.x || mouse_hard.pos.y!=mouse_hard_last.pos.y || if (mouse_hard.pos.x!=mouse_hard_last.pos.x || mouse_hard.pos.y!=mouse_hard_last.pos.y ||
mouse_hard.pos.z!=mouse_hard_last.pos.z) { mouse_hard.pos.z!=mouse_hard_last.pos.z) {
@ -301,7 +301,7 @@ Bool MouseEnable(Bool val=TRUE)
} }
else else
{ {
 KbdCmdSend(KBD_CTRL, KBDC_DISABLE_MS); KbdCmdSend(KBD_CTRL, KBDC_DISABLE_MS);
mouse_hard.enabled = FALSE; mouse_hard.enabled = FALSE;
} }
return old_val; return old_val;
@ -375,10 +375,10 @@ U0 KbdMouseInit()
mouse_hard.scale.x=0.5; mouse_hard.scale.x=0.5;
mouse_hard.scale.y=0.5; mouse_hard.scale.y=0.5;
mouse_hard.scale.z=1.0; mouse_hard.scale.z=1.0;
mouse_hard.prescale.x=GR_WIDTH/mouse_hard.scale.x/2.0; mouse_hard.prescale.x=sys_vbe_mode.width/mouse_hard.scale.x/2.0;
mouse_hard.prescale.y=GR_HEIGHT/mouse_hard.scale.y/2.0; mouse_hard.prescale.y=sys_vbe_mode.height/mouse_hard.scale.y/2.0;
mouse_hard.prescale.z=0/mouse_hard.scale.z; mouse_hard.prescale.z=0/mouse_hard.scale.z;
mouse_hard.pos.x=GR_WIDTH>>1; mouse_hard.pos.x=sys_vbe_mode.width>>1;
mouse_hard.pos.y=GR_HEIGHT>>1; mouse_hard.pos.y=sys_vbe_mode.height>>1;
MemCopy(&mouse_hard_last,&mouse_hard,sizeof(CMouseHardStateGlobals)); MemCopy(&mouse_hard_last,&mouse_hard,sizeof(CMouseHardStateGlobals));
} }

Binary file not shown.

View File

@ -67,16 +67,7 @@ U0 GrSetUpTables()
if (((x-1)^(y-1))&1 && SqrI64(y*2-k)+SqrI64(x*2-k)<rr) if (((x-1)^(y-1))&1 && SqrI64(y*2-k)+SqrI64(x*2-k)<rr)
GrPlot0(dc,x-1,y-1); GrPlot0(dc,x-1,y-1);
} }
if (!Bt(&sys_run_level,RLf_VESA)) { //if text mode
MemSet(text.vga_text_alias,0,TEXT_ROWS*TEXT_COLS*sizeof(U16));
MemSet(gr.vga_text_cache,0,TEXT_ROWS*TEXT_COLS*sizeof(U16));
} else {
OutU8(VGAP_IDX,VGAR_MAP_MASK);
OutU8(VGAP_DATA,0x0F);
//Virtual Box crashes on the following for some reason.
// MemSet(text.vga_alias,0,GR_HEIGHT*GR_WIDTH>>3);
MemSet(gr.screen_image->body,0,GR_WIDTH*GR_HEIGHT>>1);
}
for (i=1;i<=GR_SCREEN_ZOOM_MAX;i++) { for (i=1;i<=GR_SCREEN_ZOOM_MAX;i++) {
dst=gr.screen_zoom_tables[i]=MAlloc(256*i); dst=gr.screen_zoom_tables[i]=MAlloc(256*i);
for (j=0;j<256;j++) { for (j=0;j<256;j++) {
@ -177,15 +168,13 @@ U0 GrInit2()
HashDefineListAdd("ST_SPRITE_ELEM_CODES",SPHT_ELEM_CODE,gr.sprite_hash); HashDefineListAdd("ST_SPRITE_ELEM_CODES",SPHT_ELEM_CODE,gr.sprite_hash);
gr.screen_zoom=1; gr.screen_zoom=1;
PaletteSetStd; PaletteSetPastel;
fp_set_std_palette=&PaletteSetStd;
GrPaletteIndicesSet;
gr.to_8_bits =MAlloc(256*sizeof(I64)); gr.to_8_bits =MAlloc(256*sizeof(I64));
gr.to_8_colors=MAlloc(256*sizeof(I64)); gr.to_8_colors=MAlloc(256*sizeof(I64));
gr.screen_cache = MAlloc(sys_vbe_mode.width * sys_vbe_mode.height); gr.screen_cache = MAlloc(sys_vbe_mode.width * sys_vbe_mode.height);

gr.text_base=CAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U32)); gr.text_base=CAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U32));
gr.vga_text_cache=MAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U16)); gr.vga_text_cache=MAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U16));
gr.win_uncovered_bitmap=CAlloc(65536/8); gr.win_uncovered_bitmap=CAlloc(65536/8);

View File

@ -1,65 +1,7 @@
#help_index "Graphics/Color" #help_index "Graphics/Color"
public U8 gr_rainbow_10[10]={ public U8 gr_rainbow_10[10] = {BLACK,BROWN,RED,LTRED,YELLOW,GREEN,BLUE,PURPLE,LTGRAY,WHITE};
BLACK,BROWN,RED,LTRED,YELLOW,GREEN,BLUE,PURPLE,LTGRAY,WHITE};
DefineListLoad("ST_RAINBOW_10", DefineListLoad("ST_RAINBOW_10","BLACK\0BROWN\0RED\0LTRED\0YELLOW\0GREEN\0BLUE\0PURPLE\0LTGRAY\0WHITE\0");
"BLACK\0BROWN\0RED\0LTRED\0YELLOW\0GREEN\0BLUE\0PURPLE\0LTGRAY\0WHITE\0");
U0 GrPaletteIndicesSet()
{//There is a level of indirection that we identity map.
// Set 16-colors to use first 16 DAC BGR entries, so we
// never need to worry about indexes, just DAC palette settings.
I64 i;
if (!Bt(&sys_run_level,RLf_VESA)) return;
PUSHFD
CLI
while (LBts(&sys_semas[SEMA_VGA],0))
Yield;
InU8(VGAP_INPUT_STAT); //Resets attr index/data
for (i=0;i<COLORS_NUM;i++) {
OutU8(VGAP_ATTR_INDEX,i);
OutU8(VGAP_ATTR_DATA_WRITE,i);
}
OutU8(VGAP_ATTR_INDEX,0x20);
OutU8(VGAP_ATTR_DATA_WRITE,0); //Dummy write
InU8(VGAP_INPUT_STAT); //Resets attr index/data
LBtr(&sys_semas[SEMA_VGA],0);
POPFD
}
public U0 GrPaletteColorSet(I64 color_num,CBGR48 bgr48)
{//VGA has 6-bits for blue, for green, and for red.
if (!Bt(&sys_run_level,RLf_VESA)) return;
PUSHFD
CLI
while (LBts(&sys_semas[SEMA_VGA],0))
Yield;
OutU8(VGAP_PALETTE_MASK,0xFF);
OutU8(VGAP_REG_WRITE,color_num);
OutU8(VGAP_PALETTE_DATA,bgr48.r>>10);
OutU8(VGAP_PALETTE_DATA,bgr48.g>>10);
OutU8(VGAP_PALETTE_DATA,bgr48.b>>10);
LBtr(&sys_semas[SEMA_VGA],0);
POPFD
}
public CBGR48 GrPaletteColorGet(I64 color_num)
{//VGA has 6-bits for blue, for green, and for red.
CBGR48 res=0;
if (!Bt(&sys_run_level,RLf_VESA)) return 0;
PUSHFD
CLI
while (LBts(&sys_semas[SEMA_VGA],0))
Yield;
OutU8(VGAP_PALETTE_MASK,0xFF);
OutU8(VGAP_REG_READ,color_num);
res.r=0xFFFF<<10*InU8(VGAP_PALETTE_DATA)/0xFC00;
res.g=0xFFFF<<10*InU8(VGAP_PALETTE_DATA)/0xFC00;
res.b=0xFFFF<<10*InU8(VGAP_PALETTE_DATA)/0xFC00;
LBtr(&sys_semas[SEMA_VGA],0);
POPFD
return res;
}
public CBGR48 gr_palette_std[COLORS_NUM]={ public CBGR48 gr_palette_std[COLORS_NUM]={
0x000000000000,0x00000000AAAA,0x0000AAAA0000,0x0000AAAAAAAA, 0x000000000000,0x00000000AAAA,0x0000AAAA0000,0x0000AAAAAAAA,
@ -67,43 +9,39 @@ public CBGR48 gr_palette_std[COLORS_NUM]={
0x555555555555,0x55555555FFFF,0x5555FFFF5555,0x5555FFFFFFFF, 0x555555555555,0x55555555FFFF,0x5555FFFF5555,0x5555FFFFFFFF,
0xFFFF55555555,0xFFFF5555FFFF,0xFFFFFFFF5555,0xFFFFFFFFFFFF}; 0xFFFF55555555,0xFFFF5555FFFF,0xFFFFFFFF5555,0xFFFFFFFFFFFF};
public CBGR48 gr_palette_pastel[COLORS_NUM]={ public CBGR24 gr_palette_pastel[COLORS_NUM]={
0xE8E8E8E8D3D3,0x81819797BFBF,0x1919CBCB0000,0x666687879999, 0xE8E8D3, 0x8197BF, 0x19CB00, 0x668799, 0xCF6A4C, 0x8787AF, 0xFAD07A, 0x525252,
0xCFCF6A6A4C4C,0x87878787AFAF,0xFAFAD0D07A7A,0x525252525252, 0x888888, 0xACCAFF, 0x23FD00, 0x80BFAF, 0xFF9D80, 0xC4C4FF, 0xFFEFBF, 0x151515
0x888888888888,0xACACCACAFFFF,0x2323FDFD0000,0x8080BFBFAFAF, };
0xFFFF9D9D8080,0xC4C4C4C4FFFF,0xFFFFEFEFBFBF,0x151515151515};
public CBGR48 gr_palette_gray[COLORS_NUM]={ public CBGR24 gr_palette_gray[COLORS_NUM] = {
0x000000000000,0x111111111111,0x222222222222,0x333333333333,
0x444444444444,0x555555555555,0x666666666666,0x777777777777,
0x888888888888,0x999999999999,0xAAAAAAAAAAAA,0xBBBBBBBBBBBB,
0xCCCCCCCCCCCC,0xDDDDDDDDDDDD,0xEEEEEEEEEEEE,0xFFFFFFFFFFFF};
public CBGR24 gr32_palette_gray[COLORS_NUM] = {
0x000000, 0x111111, 0x222222, 0x333333, 0x444444, 0x555555, 0x666666, 0x777777, 0x000000, 0x111111, 0x222222, 0x333333, 0x444444, 0x555555, 0x666666, 0x777777,
0x888888, 0x999999, 0xAAAAAA, 0xBBBBBB, 0xCCCCCC, 0xDDDDDD, 0xEEEEEE, 0xFFFFFF 0x888888, 0x999999, 0xAAAAAA, 0xBBBBBB, 0xCCCCCC, 0xDDDDDD, 0xEEEEEE, 0xFFFFFF
}; };
public U0 GrPaletteGet(CBGR48 *bgr48) public U0 GrPaletteGet(CBGR24 *bgr24)
{//16 colors {//16 colors
I64 i; MemCopy(bgr24, &gr_palette, sizeof(CBGR24) * 16);
for (i=0;i<COLORS_NUM;i++)
 bgr48[i]=GrPaletteColorGet(i);
} }
public U0 GrPaletteSet(CBGR48 *bgr48) public U0 GrPaletteSet(CBGR48 *bgr24)
{//16 colors {//16 colors
I64 i; MemCopy(&gr_palette, bgr24, sizeof(CBGR24) * 16);
for (i=0;i<COLORS_NUM;i++)
GrPaletteColorSet(i,bgr48[i]);
} }
public U0 PaletteSetStd() public U0 PaletteSetGray(Bool persistent=TRUE)
{//Activate std palette. {//Activate gray palette.
GrPaletteSet(gr_palette_std); GrPaletteSet(gr_palette_gray);
VGAFlush;
if (persistent)
fp_set_std_palette = &PaletteSetGray;
} }
public U0 PaletteSetPastel() public U0 PaletteSetPastel(Bool persistent=TRUE)
{//Activate std palette. {//Activate std palette.
GrPaletteSet(gr_palette_pastel); GrPaletteSet(gr_palette_pastel);
fp_set_std_palette=&PaletteSetPastel; VGAFlush;
if (persistent)
fp_set_std_palette = &PaletteSetPastel;
} }


View File

@ -245,7 +245,7 @@ U0 GrUpdateTextBG()
MOV U64 [RSI],R13 MOV U64 [RSI],R13
ADD RSI,R12 ADD RSI,R12
MOV U64 [RSI],R13 MOV U64 [RSI],R13
dst(U8 *)+=w2;  dst(U8 *)+=w2;
} }
src+=w4; src+=w4;
dst(U8 *)+=w3; dst(U8 *)+=w3;
@ -324,77 +324,6 @@ U0 DCBlotColor8(CDC *dc,CDC *img)
} }
} }
U0 GrUpdateTextModeText()
{
U32 *src=gr.text_base;
I64 cur_ch,i=TEXT_COLS*TEXT_ROWS;
U16 *dst=text.vga_text_alias,*dst2=gr.vga_text_cache;
Bool blink_flag=Blink;
if (LBtr(&sys_semas[SEMA_FLUSH_VGA_IMAGE],0)) {
while (i--) {
cur_ch=*src++;
if (cur_ch & ATTRF_SEL)
cur_ch.u8[1]=cur_ch.u8[1]^0xFF;
if (cur_ch & ATTRF_INVERT)
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
if (cur_ch & ATTRF_BLINK)
if (blink_flag)
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
*dst++=*dst2++=cur_ch&0x7FFF;
}
} else {
while (i--) {
cur_ch=*src++;
if (cur_ch & ATTRF_SEL)
cur_ch.u8[1]=cur_ch.u8[1]^0xFF;
if (cur_ch & ATTRF_INVERT)
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
if (cur_ch & ATTRF_BLINK)
if (blink_flag)
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
cur_ch&=0x7FFF;
if (*dst2!=cur_ch)
*dst++=*dst2++=cur_ch;
else {
dst++;
dst2++;
}
}
}
}
U0 GrUpdateVGAGraphics()
{//Update Graphic Card
I64 row,plane,d=gr.zoomed_dc->width_internal>>6;
U32 *src,*vga,*dst;
if (gr.screen_zoom==1)
src=gr.dc1->body;
else {
GrZoomInScreen;
src=gr.zoomed_dc->body;
}
dst=gr.screen_image->body;
if (LBtr(&sys_semas[SEMA_FLUSH_VGA_IMAGE],0)) {
for (plane=1;plane<0x10;plane<<=1) {
OutU8(VGAP_IDX,VGAR_MAP_MASK);
OutU8(VGAP_DATA,plane);
vga=text.vga_alias;
row=gr.zoomed_dc->height;
while (row--)
GrUpdateLine64FlushCache(&vga,&src,d,&dst);
}
} else {
for (plane=1;plane<0x10;plane<<=1) {
OutU8(VGAP_IDX,VGAR_MAP_MASK);
OutU8(VGAP_DATA,plane);
vga=text.vga_alias;
row=gr.zoomed_dc->height;
while (row--)
GrUpdateLine64(&vga,&src,d,&dst);
}
}
}
U0 GrCalcScreenUpdates() U0 GrCalcScreenUpdates()
{ {
U16 *screen = gr.dc2->body, *last_screen = gr.screen_cache; U16 *screen = gr.dc2->body, *last_screen = gr.screen_cache;
@ -423,7 +352,7 @@ U0 GrUpdateScreen32()
//} //}
dst = text.raw_screen; dst = text.raw_screen;
while (src < size) //draw 2 pixels at a time while (src < size) //draw 2 pixels at a time
*dst++ = gr32_palette_gray[*src++ & 0xFF] | gr32_palette_gray[*src++ & 0xFF] << 32; *dst++ = gr_palette[*src++ & 0xFF] | gr_palette[*src++ & 0xFF] << 32;
GrCalcScreenUpdates; GrCalcScreenUpdates;
@ -434,14 +363,10 @@ U0 GrUpdateScreen32()
U0 GrUpdateScreen() U0 GrUpdateScreen()
{//Called by the Window Manager $LK,"HERE",A="FF:::/Zenith/WinMgr.CC,GrUpdateScreen"$, 30 times a second. {//Called by the Window Manager $LK,"HERE",A="FF:::/Zenith/WinMgr.CC,GrUpdateScreen"$, 30 times a second.
CDC *dc; CDC *dc;
if (!Bt(&sys_run_level,RLf_VESA)) //if text mode
GrUpdateTasks;
else {
GrUpdateTextBG; GrUpdateTextBG;
GrUpdateTextFG; GrUpdateTextFG;
GrUpdateTasks; GrUpdateTasks;
DCBlotColor8(gr.dc2,gr.dc); DCBlotColor8(gr.dc2,gr.dc);
}
dc=DCAlias(gr.dc2,Fs); dc=DCAlias(gr.dc2,Fs);
dc->flags|=DCF_ON_TOP; dc->flags|=DCF_ON_TOP;
@ -449,12 +374,6 @@ U0 GrUpdateScreen()
(*gr.fp_final_screen_update)(dc); (*gr.fp_final_screen_update)(dc);
DCDel(dc); DCDel(dc);
if (!Bt(&sys_run_level,RLf_VESA)) //if text mode DCBlotColor4(gr.dc1->body,gr.dc2->body,gr.dc_cache->body, gr.dc2->height*gr.dc2->width_internal>>3);
GrUpdateTextModeText; GrUpdateScreen32;
else {
DCBlotColor4(gr.dc1->body,gr.dc2->body,gr.dc_cache->body,
gr.dc2->height*gr.dc2->width_internal>>3);
GrUpdateVGAGraphics;
GrUpdateScreen32;
}
} }

View File

@ -179,24 +179,21 @@ U0 DrawMouse(CDC *dc)
x=mouse.pos.x; x=mouse.pos.x;
y=mouse.pos.y; y=mouse.pos.y;
POPFD POPFD
if (mouse.show && mouse_hard.installed) { if (mouse.show && mouse_hard.installed)
if (!Bt(&sys_run_level,RLf_VESA)) //if text mode {
gr.text_base[mouse.pos_text.x+mouse.pos_text.y*TEXT_COLS]^=0x7F00;
else {
if (gr.fp_draw_mouse) { if (gr.fp_draw_mouse) {
if (mouse.lb) if (mouse.lb)
dc->color=ROP_XOR+LTPURPLE^TRANSPARENT; dc->color=LTGREEN;
else if (mouse.rb) else if (mouse.rb)
dc->color=ROP_XOR+LTCYAN^TRANSPARENT; dc->color=LTRED;
else else
dc->color=ROP_XOR+BLACK^TRANSPARENT; dc->color=BLACK;
if (winmgr.grab_scroll && gr.fp_draw_grab_mouse) if (winmgr.grab_scroll && gr.fp_draw_grab_mouse)
(*gr.fp_draw_grab_mouse)(dc,x,y,winmgr.grab_scroll_closed); (*gr.fp_draw_grab_mouse)(dc,x,y,winmgr.grab_scroll_closed);
else else
(*gr.fp_draw_mouse)(dc,x,y); (*gr.fp_draw_mouse)(dc,x,y);
} }
} }
}
} }
U0 WinFinalUpdate(CDC *dc) U0 WinFinalUpdate(CDC *dc)