PCem
changeset 135:abd5259486c3
Mach64 changes :
No longer implements CRTC registers beyond 0x18 - NT no longer detects ET4000.
RGBA8888 mode supported - fixes NT 32-bit colour mode.
Bit order controls supported for CPU 1-bit data - fixes NT 24-bit colour mode.
| author | TomW |
|---|---|
| date | Thu Jul 24 21:30:17 2014 +0100 |
| parents | ffe477b4639f |
| children | cba58d4def81 |
| files | src/vid_ati68860_ramdac.c src/vid_ati68860_ramdac.h src/vid_ati_mach64.c src/vid_svga_render.c src/vid_svga_render.h |
| diffstat | 5 files changed, 93 insertions(+), 12 deletions(-) [+] |
line diff
1.1 --- a/src/vid_ati68860_ramdac.c Wed Jul 23 08:15:35 2014 +0100 1.2 +++ b/src/vid_ati68860_ramdac.c Thu Jul 24 21:30:17 2014 +0100 1.3 @@ -23,6 +23,7 @@ 1.4 #include "video.h" 1.5 #include "vid_svga.h" 1.6 #include "vid_ati68860_ramdac.h" 1.7 +#include "vid_svga_render.h" 1.8 1.9 void ati68860_ramdac_out(uint16_t addr, uint8_t val, ati68860_ramdac_t *ramdac, svga_t *svga) 1.10 { 1.11 @@ -43,6 +44,38 @@ 1.12 break; 1.13 default: 1.14 ramdac->regs[addr & 0xf] = val; 1.15 + switch (addr & 0xf) 1.16 + { 1.17 + case 0xb: 1.18 + switch (val) 1.19 + { 1.20 + case 0x82: 1.21 + ramdac->render = svga_render_4bpp_highres; 1.22 + break; 1.23 + case 0x83: 1.24 + ramdac->render = svga_render_8bpp_highres; 1.25 + break; 1.26 + case 0xa0: 1.27 + ramdac->render = svga_render_15bpp_highres; 1.28 + break; 1.29 + case 0xa1: case 0xb1: 1.30 + ramdac->render = svga_render_16bpp_highres; 1.31 + break; 1.32 + case 0xc0: case 0xd0: 1.33 + ramdac->render = svga_render_24bpp_highres; 1.34 + break; 1.35 + case 0xe2: 1.36 + ramdac->render = svga_render_32bpp_highres; 1.37 + break; 1.38 + case 0xf2: 1.39 + ramdac->render = svga_render_RGBA8888_highres; 1.40 + break; 1.41 + default: 1.42 + ramdac->render = svga_render_8bpp_highres; 1.43 + break; 1.44 + } 1.45 + break; 1.46 + } 1.47 break; 1.48 } 1.49 } 1.50 @@ -81,3 +114,8 @@ 1.51 // pclog("ati68860_in : addr %04X ret %02X %04X:%04X\n", addr, ret, CS,pc); 1.52 return ret; 1.53 } 1.54 + 1.55 +void ati68860_ramdac_init(ati68860_ramdac_t *ramdac) 1.56 +{ 1.57 + ramdac->render = svga_render_8bpp_highres; 1.58 +}
2.1 --- a/src/vid_ati68860_ramdac.h Wed Jul 23 08:15:35 2014 +0100 2.2 +++ b/src/vid_ati68860_ramdac.h Thu Jul 24 21:30:17 2014 +0100 2.3 @@ -1,7 +1,9 @@ 2.4 typedef struct ati68860_ramdac_t 2.5 { 2.6 uint8_t regs[16]; 2.7 + void (*render)(struct svga_t *svga); 2.8 } ati68860_ramdac_t; 2.9 2.10 void ati68860_ramdac_out(uint16_t addr, uint8_t val, ati68860_ramdac_t *ramdac, svga_t *svga); 2.11 uint8_t ati68860_ramdac_in(uint16_t addr, ati68860_ramdac_t *ramdac, svga_t *svga); 2.12 +void ati68860_ramdac_init(ati68860_ramdac_t *ramdac);
3.1 --- a/src/vid_ati_mach64.c Wed Jul 23 08:15:35 2014 +0100 3.2 +++ b/src/vid_ati_mach64.c Thu Jul 24 21:30:17 2014 +0100 3.3 @@ -11,7 +11,6 @@ 3.4 #include "vid_ati68860_ramdac.h" 3.5 #include "vid_ati_eeprom.h" 3.6 #include "vid_ics2595.h" 3.7 -#include "vid_svga_render.h" 3.8 3.9 //#define MACH64_DEBUG 3.10 3.11 @@ -182,6 +181,11 @@ 3.12 SRC_LINEAR_EN = 4 3.13 }; 3.14 3.15 +enum 3.16 +{ 3.17 + DP_BYTE_PIX_ORDER = (1 << 24) 3.18 +}; 3.19 + 3.20 static int mach64_width[8] = {0, 0, 0, 1, 1, 2, 2, 0}; 3.21 3.22 enum 3.23 @@ -238,10 +242,12 @@ 3.24 break; 3.25 3.26 case 0x3D4: 3.27 - svga->crtcreg = val & 0x3f; 3.28 + svga->crtcreg = val & 0x1f; 3.29 return; 3.30 case 0x3D5: 3.31 if (svga->crtcreg <= 7 && svga->crtc[0x11] & 0x80) return; 3.32 + if (svga->crtcreg > 0x18) 3.33 + return; 3.34 old = svga->crtc[svga->crtcreg]; 3.35 svga->crtc[svga->crtcreg] = val; 3.36 3.37 @@ -281,6 +287,8 @@ 3.38 case 0x3D4: 3.39 return svga->crtcreg; 3.40 case 0x3D5: 3.41 + if (svga->crtcreg > 0x18) 3.42 + return 0xff; 3.43 return svga->crtc[svga->crtcreg]; 3.44 } 3.45 return svga_in(addr, svga); 3.46 @@ -305,35 +313,36 @@ 3.47 svga->vblankstart = svga->dispend; 3.48 // svga_htotal <<= 1; 3.49 // svga_hdisp <<= 1; 3.50 - svga->rowoffset <<= 1; 3.51 + svga->rowoffset <<= 1; 3.52 + svga->render = mach64->ramdac.render; 3.53 switch ((mach64->crtc_gen_cntl >> 8) & 7) 3.54 { 3.55 case 1: 3.56 - svga->render = svga_render_4bpp_highres; 3.57 +// svga->render = svga_render_4bpp_highres; 3.58 svga->hdisp *= 8; 3.59 break; 3.60 case 2: 3.61 - svga->render = svga_render_8bpp_highres; 3.62 +// svga->render = svga_render_8bpp_highres; 3.63 svga->hdisp *= 8; 3.64 svga->rowoffset /= 2; 3.65 break; 3.66 case 3: 3.67 - svga->render = svga_render_15bpp_highres; 3.68 +// svga->render = svga_render_15bpp_highres; 3.69 svga->hdisp *= 8; 3.70 //svga_rowoffset *= 2; 3.71 break; 3.72 case 4: 3.73 - svga->render = svga_render_16bpp_highres; 3.74 +// svga->render = svga_render_16bpp_highres; 3.75 svga->hdisp *= 8; 3.76 //svga_rowoffset *= 2; 3.77 break; 3.78 case 5: 3.79 - svga->render = svga_render_24bpp_highres; 3.80 +// svga->render = svga_render_24bpp_highres; 3.81 svga->hdisp *= 8; 3.82 svga->rowoffset = (svga->rowoffset * 3) / 2; 3.83 break; 3.84 case 6: 3.85 - svga->render = svga_render_32bpp_highres; 3.86 +// svga->render = svga_render_32bpp_highres; 3.87 svga->hdisp *= 8; 3.88 svga->rowoffset *= 2; 3.89 break; 3.90 @@ -706,8 +715,16 @@ 3.91 switch (mach64->accel.source_mix) 3.92 { 3.93 case MONO_SRC_HOST: 3.94 - mix = cpu_dat >> 31; 3.95 - cpu_dat <<= 1; 3.96 + if (mach64->dp_pix_width & DP_BYTE_PIX_ORDER) 3.97 + { 3.98 + mix = cpu_dat & 1; 3.99 + cpu_dat >>= 1; 3.100 + } 3.101 + else 3.102 + { 3.103 + mix = cpu_dat >> 31; 3.104 + cpu_dat <<= 1; 3.105 + } 3.106 break; 3.107 case MONO_SRC_PAT: 3.108 mix = mach64->accel.pattern[dst_y & 7][dst_x & 7]; 3.109 @@ -1722,7 +1739,7 @@ 3.110 case 0x210: case 0x214: case 0x218: case 0x21c: 3.111 case 0x220: case 0x224: case 0x228: case 0x22c: 3.112 case 0x230: case 0x234: case 0x238: case 0x23c: 3.113 - if (mach64->accel.source_host) 3.114 + if (mach64->accel.source_host || (mach64->dp_pix_width & DP_BYTE_PIX_ORDER)) 3.115 mach64_blit(val, 32, mach64); 3.116 else 3.117 mach64_blit(((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24), 32, mach64); 3.118 @@ -2243,6 +2260,8 @@ 3.119 3.120 ati_eeprom_load(&mach64->eeprom, "mach64.nvr", 1); 3.121 3.122 + ati68860_ramdac_init(&mach64->ramdac); 3.123 + 3.124 mach64->dac_cntl = 5 << 16; /*ATI 68860 RAMDAC*/ 3.125 3.126 mach64->dst_cntl = 3;
4.1 --- a/src/vid_svga_render.c Wed Jul 23 08:15:35 2014 +0100 4.2 +++ b/src/vid_svga_render.c Thu Jul 24 21:30:17 2014 +0100 4.3 @@ -638,3 +638,24 @@ 4.4 } 4.5 } 4.6 4.7 +void svga_render_RGBA8888_highres(svga_t *svga) 4.8 +{ 4.9 + if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->changedvram[(svga->ma >> 12) + 2] || svga->fullchange) 4.10 + { 4.11 + int x; 4.12 + int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24; 4.13 + uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; 4.14 + 4.15 + if (svga->firstline_draw == 2000) 4.16 + svga->firstline_draw = svga->displine; 4.17 + svga->lastline_draw = svga->displine; 4.18 + 4.19 + for (x = 0; x <= svga->hdisp; x++) 4.20 + { 4.21 + uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 2)) & svga->vrammask]); 4.22 + p[x] = dat >> 8; 4.23 + } 4.24 + svga->ma += 4; 4.25 + svga->ma &= svga->vrammask; 4.26 + } 4.27 +}
5.1 --- a/src/vid_svga_render.h Wed Jul 23 08:15:35 2014 +0100 5.2 +++ b/src/vid_svga_render.h Thu Jul 24 21:30:17 2014 +0100 5.3 @@ -27,5 +27,6 @@ 5.4 void svga_render_24bpp_highres(svga_t *svga); 5.5 void svga_render_32bpp_lowres(svga_t *svga); 5.6 void svga_render_32bpp_highres(svga_t *svga); 5.7 +void svga_render_RGBA8888_highres(svga_t *svga); 5.8 5.9 extern void (*svga_render)(svga_t *svga);
