false, 0, voodoo_settings
},
#endif
-#if 0
{
_T("s3virge"), _T("Virge"), _T("S3"),
NULL, NULL, NULL, NULL, ROMTYPE_S3VIRGE | ROMTYPE_NONE, 0, 0, BOARD_IGNORE, false,
NULL, 0,
false, EXPANSIONTYPE_RTG
},
-#endif
{
_T("x86vga"), _T("x86 VGA"), NULL,
NULL, NULL, NULL, NULL, ROMTYPE_x86_VGA | ROMTYPE_NONE, 0, 0, BOARD_IGNORE, true,
0, NULL, &voodoo_5_5500_device, 0, true
},
#endif
-#if 0
{
GFXBOARD_ID_S3VIRGE_PCI,
_T("Virge [PCI]"), _T("S3"), _T("S3VIRGE_PCI"),
0x00000000, 0x00400000, 0x00400000, 0x10000000, 0, 0, -1, false,
0, 0, NULL, &s3_virge_device, 0, true
},
-#endif
{
GFXBOARD_ID_VGA,
_T("x86 bridgeboard VGA [ISA]"), _T("x86"), _T("VGA"),
struct gfxboard_func *func;
device_t *pcemdev;
- void *pcemobject, *pcemobject2;
+ void *pcemobject; // device_t
+ void *pcemobject2; // svga_t
int pcem_mmio_offset;
int pcem_mmio_mask;
bool pcem_pci_configured;
uae_u8 *bios;
uae_u32 bios_mask;
int lfbbyteswapmode;
+ int mmiobyteswapmode;
struct pci_board_state *pcibs;
bool pcem_direct;
}
extern uae_u8 *getpcembuffer32(int, int, int);
-extern int svga_get_vtotal(void);
+extern int svga_get_vtotal(void *p);
extern int svga_poll(void *p);
extern void voodoo_callback(void *p);
if (gb->func && gb->userdata) {
gb->func->hsync(gb->userdata);
}
- if (gb->pcemdev && gb->pcemobject && !gb->pcem_vblank) {
+ if (gb->pcemdev && gb->pcemobject2 && !gb->pcem_vblank) {
static int pollcnt;
- int total = svga_get_vtotal();
+ int total = svga_get_vtotal(gb->pcemobject2);
if (total <= 0)
total = p96syncrate;
int pollsize = (total << 8) / p96syncrate;
if (gb->pcemdev) {
static int fcount;
- if (!gb->pcem_vblank && gb->pcemobject) {
- int max = svga_get_vtotal();
+ if (!gb->pcem_vblank && gb->pcemobject2) {
+ int max = svga_get_vtotal(gb->pcemobject2);
while (max-- > 0) {
if (gfxboard_pcem_poll(gb))
break;
}
}
if (gb->board->pci && gb->vram) {
- bool svga_on(void* p);
- set_monswitch(gb, svga_on(gb->pcemobject));
+ bool svga_on(void *p);
+ set_monswitch(gb, svga_on(gb->pcemobject2));
}
}
}
}
}
+void gfxboard_s3virge_lfb_endianswap2(int m)
+{
+ for (int i = 0; i < MAX_RTG_BOARDS; i++) {
+ struct rtggfxboard *gb = &rtggfxboards[i];
+ if (gb->active && gb->board->pci) {
+ gb->mmiobyteswapmode = m;
+ }
+ }
+}
static int s3virgeaddr(struct pci_board_state *pcibs, uaecptr *addrp)
{
} else if (addr >= pcibs->bar[0] + 0x03000000 && addr < pcibs->bar[0] + 0x04000000) {
// MMIO BE
addr = ((addr - pcibs->bar[0]) & 0xffff) + pcibs->bar[0] + 0x01000000;
- swap = 1;
+ swap = addr & 0x8000 ? 1 : 2;
} else if (addr >= pcibs->bar[0] + 0x00000000 && addr < pcibs->bar[0] + 0x01000000) {
// LFB LE
addr = ((addr - pcibs->bar[0]) & 0x3fffff) + pcibs->bar[0];
{
int swap = s3virgeaddr(pcibs, &addr);
if (swap > 0) {
- b = do_byteswap_32(b);
+ if (swap == 1)
+ b = do_byteswap_32(b);
} else if (swap < 0) {
struct rtggfxboard *gb = getgfxboard(addr);
int m = gb->lfbbyteswapmode;
{
int swap = s3virgeaddr(pcibs, &addr);
if (swap > 0) {
- b = do_byteswap_16(b);
+ if (swap == 1)
+ b = do_byteswap_16(b);
} else if (swap < 0) {
struct rtggfxboard *gb = getgfxboard(addr);
int m = gb->lfbbyteswapmode;
int swap = s3virgeaddr(pcibs, &addr);
uae_u32 v = get_mem_pcem(addr, 2);
if (swap > 0) {
- v = do_byteswap_32(v);
+ if (swap == 1)
+ v = do_byteswap_32(v);
} else if (swap < 0) {
struct rtggfxboard *gb = getgfxboard(addr);
int m = gb->lfbbyteswapmode;
int swap = s3virgeaddr(pcibs, &addr);
uae_u32 v = get_mem_pcem(addr, 1);
if (swap > 0) {
- v = do_byteswap_16(v);
+ if (swap == 1)
+ v = do_byteswap_16(v);
} else if (swap < 0) {
struct rtggfxboard *gb = getgfxboard(addr);
int m = gb->lfbbyteswapmode;
break;
case 0x54:
+ extern void gfxboard_s3virge_lfb_endianswap2(int);
+ gfxboard_s3virge_lfb_endianswap2((val >> 0) & 3);
break;
case 0x61:
break;
bool svga_on(void *p)
{
- svga_t* svga = (svga_t*)p;
- return svga->scrblank == 0;
+ svga_t *svga = (svga_t*)p;
+ return svga->scrblank == 0 && svga->hdisp >= 128;
}
-int svga_get_vtotal(void)
+int svga_get_vtotal(void *p)
{
- int v = svga_pri->vtotal;
- if (svga_pri->crtc[0x17] & 4)
+ svga_t *svga = (svga_t*)p;
+ int v = svga->vtotal;
+ if (svga->crtc[0x17] & 4)
v *= 2;
return v;
}
{
double crtcconst;
double _dispontime, _dispofftime, disptime;
+ int text = 0;
svga->vtotal = svga->crtc[6];
svga->dispend = svga->crtc[0x12];
svga->hdisp *= (svga->seqregs[1] & 1) ? 8 : 9;
}
svga->hdisp_old = svga->hdisp;
+ text = 1;
}
else
{
if (svga->vblankstart < svga->dispend)
svga->dispend = svga->vblankstart;
- if (svga->horizontal_linedbl) {
- if (svga->render == svga_render_8bpp_highres)
- svga->render = svga_render_8bpp_lowres;
- if (svga->render == svga_render_15bpp_highres)
- svga->render = svga_render_15bpp_lowres;
- if (svga->render == svga_render_16bpp_highres)
- svga->render = svga_render_16bpp_lowres;
- if (svga->render == svga_render_24bpp_highres)
- svga->render = svga_render_24bpp_lowres;
- if (svga->render == svga_render_32bpp_highres)
- svga->render = svga_render_32bpp_lowres;
+ if (!text) {
+ if (!svga->lowres) {
+ if (svga->render == svga_render_8bpp_lowres)
+ svga->render = svga_render_8bpp_highres;
+ if (svga->render == svga_render_15bpp_lowres)
+ svga->render = svga_render_15bpp_highres;
+ if (svga->render == svga_render_16bpp_lowres)
+ svga->render = svga_render_16bpp_highres;
+ if (svga->render == svga_render_24bpp_lowres)
+ svga->render = svga_render_24bpp_highres;
+ if (svga->render == svga_render_32bpp_lowres)
+ svga->render = svga_render_32bpp_highres;
+ }
+
+ if (svga->horizontal_linedbl) {
+ if (svga->render == svga_render_8bpp_highres)
+ svga->render = svga_render_8bpp_lowres;
+ if (svga->render == svga_render_15bpp_highres)
+ svga->render = svga_render_15bpp_lowres;
+ if (svga->render == svga_render_16bpp_highres)
+ svga->render = svga_render_16bpp_lowres;
+ if (svga->render == svga_render_24bpp_highres)
+ svga->render = svga_render_24bpp_lowres;
+ if (svga->render == svga_render_32bpp_highres)
+ svga->render = svga_render_32bpp_lowres;
+ }
}
crtcconst = svga->clock * svga->char_width;
#define VGAINIT0_EXTENDED_SHIFT_OUT (1 << 12)
+#define VIDPROCCFG_VIDPROCON (1 << 0)
#define VIDPROCCFG_CURSOR_MODE (1 << 1)
#define VIDPROCCFG_INTERLACE (1 << 3)
#define VIDPROCCFG_HALF_MODE (1 << 4)
// pclog("svga->hdisp=%i\n", svga->hdisp);
svga->interlace = 0;
- if (banshee->vgaInit0 & VGAINIT0_EXTENDED_SHIFT_OUT)
+// if (banshee->vgaInit0 & VGAINIT0_EXTENDED_SHIFT_OUT)
+ if (banshee->vidProcCfg & VIDPROCCFG_VIDPROCON)
{
+ // this is some VGA-only feature? G-REX driver sets it and still expects normal 640x480 display.
+ svga->lowres = 0;
+
switch (VIDPROCCFG_DESKTOP_PIX_FORMAT)
{
case PIX_FORMAT_8:
case Init_lfbMemoryConfig:
banshee->lfbMemoryConfig = val;
- pclog("lfbMemoryConfig=%08x\n", val);
+// pclog("lfbMemoryConfig=%08x\n", val);
voodoo->tile_base = (val & 0x1fff) << 12;
voodoo->tile_stride = 1024 << ((val >> 13) & 7);
voodoo->tile_stride_shift = 10 + ((val >> 13) & 7);