1
0
Fork 0

changes for improved timing event system

Fix the cursor in cga,tandy,hercules modes
Fix the 160x200 16 color cga mode


Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1970
This commit is contained in:
Sjoerd van der Berg 2004-09-10 22:16:30 +00:00
parent 85079912c9
commit 386461754e

View file

@ -57,6 +57,21 @@ static Bit8u convert16[16]={
0x6,0xa,0x8,0xb,0xd,0xe,0xc,0xf
};
static Bit8u * VGA_Draw_CGA16_Line(Bitu vidstart,Bitu panning,Bitu line) {
Bit8u * reader=&vga.mem.linear[vidstart + (line * 8 * 1024)];
Bit32u * draw=(Bit32u *)TempLine;
for (Bitu x=0;x<vga.draw.blocks;x++) {
Bitu val1=*reader++;
Bitu val2=convert16[val1&0xf];
val1=convert16[val1 >> 4];
*draw++=(val1 << 0) |
(val1 << 8) |
(val2 << 16) |
(val2 << 24);
}
return TempLine;
}
static Bit8u * VGA_Draw_4BPP_Line(Bitu vidstart,Bitu panning,Bitu line) {
Bit8u * reader=&vga.mem.linear[vidstart + (line * 8 * 1024)];
Bit32u * draw=(Bit32u *)TempLine;
@ -147,13 +162,13 @@ static Bit8u * VGA_TEXT_Draw_Line(Bitu vidstart,Bitu panning,Bitu line) {
*draw++=fg&mask1 | bg&~mask1;
*draw++=fg&mask2 | bg&~mask2;
}
Bits font_addr=(vga.config.cursor_start*2-vidstart)/2;
Bits font_addr=(vga.draw.cursor.address-vidstart)/2;
if (!vga.draw.cursor.enabled || !(vga.draw.cursor.count&0x8)) goto skip_cursor;
if (font_addr>=0 && font_addr<vga.draw.blocks) {
if (line<vga.draw.cursor.sline) goto skip_cursor;
if (line>vga.draw.cursor.eline) goto skip_cursor;
draw=(Bit32u *)&TempLine[font_addr*8];
Bit32u att=TXT_FG_Table[vga.mem.linear[vga.config.cursor_start*2+1]&0xf];
Bit32u att=TXT_FG_Table[vga.mem.linear[vga.draw.cursor.address+1]&0xf];
*draw++=att;*draw++=att;
}
skip_cursor:
@ -185,7 +200,7 @@ static void VGA_DrawPart(Bitu lines) {
}
}
if (--vga.draw.parts_left) {
PIC_AddEvent(VGA_DrawPart,vga.draw.micro.parts,
PIC_AddEvent(VGA_DrawPart,vga.draw.delay.parts,
(vga.draw.parts_left!=1) ? vga.draw.parts_lines : (vga.draw.lines_total - vga.draw.lines_done));
} else {
RENDER_EndUpdate();
@ -209,8 +224,8 @@ void VGA_SetBlinking(Bitu enabled) {
static void VGA_VerticalTimer(Bitu val) {
vga.config.retrace=false;
PIC_AddEvent(VGA_VerticalTimer,vga.draw.micro.vtotal);
PIC_AddEvent(VGA_VerticalDisplayEnd,vga.draw.micro.vend);
PIC_AddEvent(VGA_VerticalTimer,vga.draw.delay.vtotal);
PIC_AddEvent(VGA_VerticalDisplayEnd,vga.draw.delay.vend);
if (RENDER_StartUpdate()) {
vga.draw.parts_left=vga.draw.parts_total;
vga.draw.lines_done=0;
@ -218,12 +233,14 @@ static void VGA_VerticalTimer(Bitu val) {
vga.draw.address_line=vga.config.hlines_skip;
vga.draw.split_line=(vga.config.line_compare/vga.draw.lines_scaled);
vga.draw.panning=vga.config.pel_panning;
PIC_AddEvent(VGA_DrawPart,vga.draw.micro.parts,vga.draw.parts_lines);
PIC_AddEvent(VGA_DrawPart,vga.draw.delay.parts,vga.draw.parts_lines);
}
switch (vga.mode) {
case M_TEXT:
vga.draw.address=(vga.draw.address*2);
case M_TANDY_TEXT:
case M_HERC_TEXT:
vga.draw.cursor.address=vga.config.cursor_start*2;
vga.draw.cursor.count++;
/* check for blinking and blinking change delay */
FontMask[1]=(vga.draw.blinking & (vga.draw.cursor.count >> 4)) ?
@ -234,7 +251,10 @@ static void VGA_VerticalTimer(Bitu val) {
vga.draw.address=(vga.draw.address*2)&0x1fff;
break;
}
if (machine==MCH_TANDY) vga.draw.address+=vga.tandy.disp_bank << 14;
if (machine==MCH_TANDY) {
vga.draw.address+=vga.tandy.disp_bank << 14;
vga.draw.cursor.address+=vga.tandy.disp_bank << 14;
}
}
void VGA_CheckScanLength(void) {
@ -249,6 +269,7 @@ void VGA_CheckScanLength(void) {
break;
case M_CGA2:
case M_CGA4:
case M_CGA16:
vga.draw.address_add=80;
return;
case M_TANDY2:
@ -257,9 +278,6 @@ void VGA_CheckScanLength(void) {
case M_TANDY4:
vga.draw.address_add=vga.draw.blocks/2;
break;
case M_CGA16:
vga.draw.address_add=vga.draw.blocks/2;
return;
case M_TANDY16:
vga.draw.address_add=vga.draw.blocks;
break;
@ -282,7 +300,7 @@ void VGA_SetupDrawing(Bitu val) {
return;
}
/* Calculate the FPS for this screen */
double fps;Bitu clock;
float fps;Bitu clock;
Bitu htotal,hdispend,hbstart,hrstart;
Bitu vtotal,vdispend,vbstart,vrstart;
if (machine==MCH_VGA) {
@ -338,16 +356,15 @@ void VGA_SetupDrawing(Bitu val) {
LOG(LOG_VGA,LOG_NORMAL)("H D End %d, V D End %d",hdispend,vdispend);
if (!htotal) return;
if (!vtotal) return;
fps=clock/(vtotal*htotal);
double linemicro=(1000000/fps);
fps=(float)clock/(vtotal*htotal);
float linetime=1000.0f/fps;
vga.draw.parts_total=VGA_PARTS;
vga.draw.micro.vtotal=(Bitu)(linemicro);
linemicro/=vtotal; //Really make it the line_micro
vga.draw.micro.vend=(Bitu)(linemicro*vrstart);
vga.draw.micro.parts=(Bitu)((linemicro*vdispend)/vga.draw.parts_total);
vga.draw.micro.htotal=(Bitu)(linemicro);
vga.draw.micro.hend=(Bitu)((linemicro/htotal)*hrstart);
vga.draw.delay.vtotal=linetime;
linetime/=vtotal; //Really make it the line_delay
vga.draw.delay.vend=linetime*vrstart;
vga.draw.delay.parts=(linetime*vdispend)/vga.draw.parts_total;
vga.draw.delay.htotal=linetime;
vga.draw.delay.hend=(linetime/htotal)*hrstart;
double correct_ratio=(100.0/525.0);
double aspect_ratio=((double)htotal/((double)vtotal)/correct_ratio);
@ -377,6 +394,13 @@ void VGA_SetupDrawing(Bitu val) {
width<<=3;
VGA_DrawLine=VGA_Draw_EGA_Line;
break;
case M_CGA16:
doublewidth=true;
doubleheight=true;
vga.draw.blocks=width*2;
width<<=3;
VGA_DrawLine=VGA_Draw_CGA16_Line;
break;
case M_CGA4:
doublewidth=true;
vga.draw.blocks=width*2;
@ -436,7 +460,7 @@ void VGA_SetupDrawing(Bitu val) {
VGA_DrawLine=VGA_TEXT_Draw_Line;
break;
default:
LOG(LOG_VGA,LOG_ERROR)("Unhandled VGA type %d while checking for resolution");
LOG(LOG_VGA,LOG_ERROR)("Unhandled VGA mode %d while checking for resolution",vga.mode);
};
VGA_CheckScanLength();
if (vga.draw.double_scan) {
@ -467,6 +491,6 @@ void VGA_SetupDrawing(Bitu val) {
doublewidth ? "double":"normal",doubleheight ? "double":"normal",aspect_ratio);
#endif
RENDER_SetSize(width,height,8,aspect_ratio,doublewidth,doubleheight);
PIC_AddEvent(VGA_VerticalTimer,vga.draw.micro.vtotal);
PIC_AddEvent(VGA_VerticalTimer,vga.draw.delay.vtotal);
}
};