From d1f015410768ffb325f3a6ed424cd45c7feafb8d Mon Sep 17 00:00:00 2001 From: Sjoerd van der Berg Date: Fri, 30 Jan 2004 09:18:18 +0000 Subject: [PATCH] Added a nice blinking cursor again Added support for cga register to toggle textmode blinking Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1625 --- include/vga.h | 3 ++ src/hardware/vga_attr.cpp | 5 +-- src/hardware/vga_draw.cpp | 83 ++++++++++++++------------------------- src/hardware/vga_misc.cpp | 29 ++++++++++---- 4 files changed, 54 insertions(+), 66 deletions(-) diff --git a/include/vga.h b/include/vga.h index c320ac44..f55b3ff3 100644 --- a/include/vga.h +++ b/include/vga.h @@ -124,6 +124,7 @@ typedef struct { Bit8u font[64*1024]; Bitu font1_start; Bitu font2_start; + Bitu blinking; struct { Bit8u sline,eline; Bit8u count,delay; @@ -161,6 +162,7 @@ typedef struct { } VGA_HERC; typedef struct { + Bit8u mode_control; Bit8u color_select; } VGA_CGA; @@ -311,6 +313,7 @@ void VGA_SetClock(Bitu which,Bitu target); void VGA_DACSetEntirePalette(void); void VGA_StartRetrace(void); void VGA_StartUpdateLFB(void); +void VGA_SetBlinking(Bitu enabled); extern VGA_Type vga; diff --git a/src/hardware/vga_attr.cpp b/src/hardware/vga_attr.cpp index 1be6d23f..a486344e 100644 --- a/src/hardware/vga_attr.cpp +++ b/src/hardware/vga_attr.cpp @@ -22,7 +22,6 @@ #define attr(blah) vga.attr.blah - void VGA_ATTR_SetPalette(Bit8u index,Bit8u val) { vga.attr.palette[index]=val; if (vga.attr.mode_control & 0x80) val=(val&0xf) | (vga.attr.color_select << 4); @@ -63,9 +62,7 @@ void write_p3c0(Bit32u port,Bit8u val) { } } if ((attr(mode_control) ^ val) & 0x08) { - /* Fill up background text mode color lookup table */ - Bit32u b=(val & 8) ^ 0x8; - for (Bitu i=0;i<8;i++) TXT_BG_Table[i+8]=(b+i) | ((b+i) << 8)| ((b+i) <<16) | ((b+i) << 24); + VGA_SetBlinking(val & 0x8); } /* Special hacks for games programming registers themselves, diff --git a/src/hardware/vga_draw.cpp b/src/hardware/vga_draw.cpp index 442147ba..e771a504 100644 --- a/src/hardware/vga_draw.cpp +++ b/src/hardware/vga_draw.cpp @@ -101,7 +101,7 @@ static Bit8u * VGA_VGA_Draw_Line(Bitu vidstart,Bitu panning,Bitu line) { static Bit32u FontMask[2]={0xffffffff,0x0}; static Bit8u * VGA_TEXT_Draw_Line(Bitu vidstart,Bitu panning,Bitu line) { - Bit8u * draw=VGA_DrawBuffer; + Bit32u * draw=(Bit32u *)&VGA_DrawBuffer[0]; Bit8u * vidmem=&vga.mem.linear[vidstart]; for (Bitu cx=0;cx>4]; mask1&=FontMask[col >> 7];mask2&=FontMask[col >> 7]; - *(Bit32u*)draw=fg&mask1 | bg&~mask1; - draw+=4; - *(Bit32u*)draw=fg&mask2 | bg&~mask2; - draw+=4; + *draw++=fg&mask1 | bg&~mask1; + *draw++=fg&mask2 | bg&~mask2; } + if (!vga.draw.cursor.enabled || !(vga.draw.cursor.count&0x8)) goto skip_cursor; + Bits font_addr=(vga.config.cursor_start*2-vidstart)/2; + if (font_addr>=0 && font_addrvga.draw.cursor.eline) goto skip_cursor; + draw=(Bit32u *)&VGA_DrawBuffer[font_addr*8]; + Bit32u att=TXT_FG_Table[vga.mem.linear[vga.config.cursor_start*2+1]&0xf]; + *draw++=att;*draw++=att; + } +skip_cursor: return VGA_DrawBuffer; } -void VGA_TEXT_Draw(Bit8u * bitdata,Bitu start,Bitu panning,Bitu lines) { -#if 0 - Bit8u * reader=&vga.mem.linear[start*2];Bitu rows=lines/vga.draw.font_height; - for (Bitu cy=rows;cy>0;cy--) { - for (Bitu y=0;y>4]; - Bit32u mask2=TXT_Font_Table[font&0xf]; - Bit8u col=reader[cx*2+1]; - Bit32u fg=TXT_FG_Table[col&0xf]; - Bit32u bg=TXT_BG_Table[col>>4]; - *(Bit32u*)draw=fg&mask1 | bg&~mask1; - draw+=4; - *(Bit32u*)draw=fg&mask2 | bg&~mask2; - draw+=4; - } - } - reader+=(vga.config.scan_len*4); - } -/* Cursor handling */ - if(vga.draw.cursor.enabled && (vga.draw.cursor.count>8)) { /* Draw a cursor if enabled */ - Bits cur_start=vga.config.cursor_start-start; - if (cur_start<0) return; - - Bitu row=cur_start / (vga.config.scan_len*2); - Bitu col=cur_start % (vga.config.scan_len*2); - Bit32u att=vga.mem.linear[vga.config.cursor_start*2+1]&0xf; - att=TXT_BG_Table[att]; - - if ((col*8)>=vga.draw.width) return; - if ((row*vga.draw.font_height)>=vga.draw.height) return; - if (vga.draw.cursor.sline>=vga.draw.font_height) return; - if (vga.draw.cursor.sline>vga.draw.cursor.eline) return; - Bit8u * cursor_draw=bitdata+(row*vga.draw.font_height+vga.draw.cursor.sline)*vga.draw.width+col*8; - - for (Bits loop=vga.draw.cursor.eline-vga.draw.cursor.sline;loop>=0;loop--) { - *((Bit32u *)cursor_draw)=att; - *((Bit32u *)(cursor_draw+4))=att; - cursor_draw+=vga.draw.width; - } - } -#endif -} - static void VGA_VerticalDisplayEnd(void) { vga.config.retrace=true; vga.config.real_start=vga.config.display_start; @@ -199,6 +159,21 @@ static void VGA_DrawPart(void) { // if (vga.draw.parts_left) PIC_AddEvent(VGA_DrawPart,vga.draw.micro.parts); } +void VGA_SetBlinking(Bitu enabled) { + Bitu b; + LOG_MSG("Blinking %d",enabled); + if (enabled) { + b=0;vga.draw.blinking=-1; + vga.attr.mode_control|=0x08; + vga.cga.mode_control&=~0x20; + } else { + b=8;vga.draw.blinking=0; + vga.attr.mode_control&=~0x08; + vga.cga.mode_control|=0x20; + } + for (Bitu i=0;i<8;i++) TXT_BG_Table[i+8]=(b+i) | ((b+i) << 8)| ((b+i) <<16) | ((b+i) << 24); +} + static void VGA_VerticalTimer(void) { vga.config.retrace=false; PIC_AddEvent(VGA_VerticalTimer,vga.draw.micro.vtotal); @@ -364,10 +339,10 @@ void VGA_SetupDrawing(void) { case M_TEXT2: case M_TEXT16: aspect_ratio=1.0; - vga.draw.address_line_total=vga.draw.font_height; if (vga.draw.font_height<4 && (machine