1
0
Fork 0

add memory wrapping to 16 colour tandy modes (vertical scrollers, Scuba Venture);

double pixels in mode8 (160x200) to fit screen better


Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2410
This commit is contained in:
Sebastian Strohhäcker 2005-12-11 15:09:50 +00:00
parent a708a1344f
commit 748a64aa08
2 changed files with 35 additions and 22 deletions

View file

@ -60,7 +60,7 @@ static Bit8u * VGA_Draw_2BPP_Line(Bitu vidstart,Bitu panning,Bitu line) {
static Bit8u * VGA_Draw_2BPPHiRes_Line(Bitu vidstart,Bitu panning,Bitu line) {
line*=8*1024;Bit32u * draw=(Bit32u *)TempLine;
for (Bitu x=0;x<(vga.draw.blocks>>1);x++) {
for (Bitu x=0;x<vga.draw.blocks;x++) {
Bitu val1=vga.gfxmem_start[vidstart+line];
Bitu val2=vga.gfxmem_start[vidstart+1+line];
vidstart+=2;
@ -114,10 +114,16 @@ static Bit8u * VGA_Draw_CGA16_Line(Bitu vidstart,Bitu panning,Bitu line) {
}
static Bit8u * VGA_Draw_4BPP_Line(Bitu vidstart,Bitu panning,Bitu line) {
Bit8u * reader=&vga.gfxmem_start[vidstart + (line * 8 * 1024)];
Bit32u * draw=(Bit32u *)TempLine;
line*=8*1024;Bit32u * draw=(Bit32u *)TempLine;
for (Bitu x=0;x<vga.draw.blocks;x++) {
Bitu val1=*reader++;Bitu val2=*reader++;
if((vga.crtc.mode_control & 0x01) == 0) // CGA compatible addressing
vidstart &= 0x19fff;
Bitu val1=vga.gfxmem_start[vidstart+line];
vidstart++;
if((vga.crtc.mode_control & 0x01) == 0) // CGA compatible addressing
vidstart &= 0x19fff;
Bitu val2=vga.gfxmem_start[vidstart+line];
vidstart++;
*draw++=(val1 & 0x0f) << 8 |
(val1 & 0xf0) >> 4 |
(val2 & 0x0f) << 24 |
@ -127,14 +133,16 @@ static Bit8u * VGA_Draw_4BPP_Line(Bitu vidstart,Bitu panning,Bitu line) {
}
static Bit8u * VGA_Draw_4BPP_Line_Double(Bitu vidstart,Bitu panning,Bitu line) {
Bit8u * reader=&vga.gfxmem_start[vidstart + (line * 8 * 1024)];
Bit32u * draw=(Bit32u *)TempLine;
line*=8*1024;Bit32u * draw=(Bit32u *)TempLine;
for (Bitu x=0;x<vga.draw.blocks;x++) {
Bitu val1=*reader++;Bitu val2=*reader++;
*draw++=(val1 & 0x0f) << 8 |
(val1 & 0xf0) >> 4 |
(val2 & 0x0f) << 24 |
(val2 & 0xf0) << 12;
if((vga.crtc.mode_control & 0x01) == 0) // CGA compatible addressing
vidstart &= 0x1dfff;
Bitu val=vga.gfxmem_start[vidstart+line];
vidstart++;
*draw++=(val & 0xf0) >> 4 |
(val & 0xf0) << 4 |
(val & 0x0f) << 16 |
(val & 0x0f) << 24;
}
return TempLine;
}
@ -352,7 +360,7 @@ void VGA_CheckScanLength(void) {
vga.draw.address_add=vga.draw.blocks/4;
break;
case M_TANDY4:
vga.draw.address_add=vga.draw.blocks/2;
vga.draw.address_add=vga.draw.blocks;
break;
case M_TANDY16:
vga.draw.address_add=vga.draw.blocks;
@ -527,9 +535,8 @@ void VGA_SetupDrawing(Bitu val) {
doubleheight=true;
if (machine==MCH_TANDY) doublewidth=(vga.tandy.mode_control & 0x10)==0;
else doublewidth=(vga.tandy.gfx_control & 0x8)==0x00;
// vga.draw.blocks=width * (doublewidth ? 4:8);
vga.draw.blocks=width * 4;
width=vga.draw.blocks*2;
vga.draw.blocks=width * 2;
width=vga.draw.blocks*4;
if ((machine==MCH_TANDY && (vga.tandy.gfx_control & 0x8)) ||
(machine==MCH_PCJR && (vga.tandy.mode_control==0x0b))) VGA_DrawLine=VGA_Draw_2BPPHiRes_Line;
else VGA_DrawLine=VGA_Draw_2BPP_Line;
@ -537,11 +544,15 @@ void VGA_SetupDrawing(Bitu val) {
case M_TANDY16:
aspect_ratio=1.2;
doubleheight=true;
if (machine==MCH_TANDY) doublewidth=(vga.tandy.mode_control & 0x10)==0;
else doublewidth=(vga.tandy.gfx_control & 0x8)==0x00;
vga.draw.blocks=width * (doublewidth ? 2:4);
width=vga.draw.blocks*2;
VGA_DrawLine=VGA_Draw_4BPP_Line;
doublewidth=true;
vga.draw.blocks=width*2;
if (vga.tandy.mode_control & 0x1) {
width=vga.draw.blocks*2;
VGA_DrawLine=VGA_Draw_4BPP_Line;
} else {
width=vga.draw.blocks*4;
VGA_DrawLine=VGA_Draw_4BPP_Line_Double;
}
break;
case M_TANDY_TEXT:
doublewidth=(vga.tandy.mode_control & 0x1)==0;

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: vga_other.cpp,v 1.14 2005-12-05 12:18:12 qbix79 Exp $ */
/* $Id: vga_other.cpp,v 1.15 2005-12-11 15:09:50 c2woody Exp $ */
#include <string.h>
#include <math.h>
@ -349,6 +349,7 @@ static void write_tandy(Bitu port,Bitu val,Bitu iolen) {
write_tandy_reg(val);
break;
case 0x3df:
vga.tandy.is_32k_mode=(val & 0x80)==0x80;
vga.tandy.disp_bank=val & ((val & 0x80) ? 0x6 : 0x7);
vga.tandy.mem_bank=(val >> 3) & ((val & 0x80) ? 0x6 : 0x7);
VGA_SetupHandlers();
@ -369,7 +370,7 @@ static void write_pcjr(Bitu port,Bitu val,Bitu iolen) {
case 0x3df:
vga.tandy.is_32k_mode=(val & 0x80)==0x80;
vga.tandy.disp_bank=val & (vga.tandy.is_32k_mode ? 0x6 : 0x7);
vga.tandy.mem_bank=(val >> 3) & (vga.tandy.is_32k_mode ? 0x6 : 0x7);
vga.tandy.mem_bank=(val >> 3) & 0x7;
VGA_SetupHandlers();
break;
}
@ -429,6 +430,7 @@ void VGA_SetupOther(void) {
IO_RegisterWriteHandler(0x3bf,write_hercules,IO_MB);
}
if (machine==MCH_TANDY) {
vga.tandy.is_32k_mode=false;
IO_RegisterWriteHandler(0x3d8,write_tandy,IO_MB);
IO_RegisterWriteHandler(0x3d9,write_tandy,IO_MB);
IO_RegisterWriteHandler(0x3de,write_tandy,IO_MB);