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:
parent
a708a1344f
commit
748a64aa08
2 changed files with 35 additions and 22 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue