Merge pull request #5392 from akmed772/da2dev
Fix bugs related to PS/55 emulation
This commit is contained in:
@@ -11,7 +11,6 @@
|
||||
* Notes: There are some known issues that should be corrected.
|
||||
* - Incorrect foreground text color appears on an active window in OS/2 J1.3.
|
||||
* - Glitches some part of graphics on the Control Panel in OS/2 J2.1 beta.
|
||||
* - The screen resolution and blanking interval time maybe not correct.
|
||||
*
|
||||
* The code should be tested with following cases.
|
||||
* - Execute MODE 0, 1, 3 and 4 commands in DOS K3.3 to test various video modes.
|
||||
@@ -30,7 +29,6 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
#include <stdatomic.h>
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
@@ -41,7 +39,6 @@
|
||||
#include <86box/mca.h>
|
||||
#include <86box/rom.h>
|
||||
#include <86box/plat.h>
|
||||
#include <86box/thread.h>
|
||||
#include <86box/video.h>
|
||||
#include <86box/vid_ps55da2.h>
|
||||
#include <86box/vid_svga.h>
|
||||
@@ -257,8 +254,9 @@
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_DA2_LOG
|
||||
// # define ENABLE_DA2_DEBUGIO 1
|
||||
// # define ENABLE_DA2_DEBUGBLT 1
|
||||
# define ENABLE_DA2_DEBUGVRAM 1
|
||||
// # define ENABLE_DA2_DEBUGVRAM 1
|
||||
// # define ENABLE_DA2_DEBUGFULLSCREEN 1
|
||||
// # define ENABLE_DA2_DEBUGMONWAIT 1
|
||||
int da2_do_log = ENABLE_DA2_LOG;
|
||||
@@ -277,6 +275,11 @@ da2_log(const char *fmt, ...)
|
||||
#else
|
||||
# define da2_log(fmt, ...)
|
||||
#endif
|
||||
#ifdef ENABLE_DA2_DEBUGIO
|
||||
# define da2_iolog da2_log
|
||||
#else
|
||||
# define da2_iolog(fmt, ...)
|
||||
#endif
|
||||
#ifdef ENABLE_DA2_DEBUGBLT
|
||||
# define da2_bltlog da2_log
|
||||
#else
|
||||
@@ -284,10 +287,8 @@ da2_log(const char *fmt, ...)
|
||||
#endif
|
||||
|
||||
typedef struct da2_t {
|
||||
// mem_mapping_t vmapping;
|
||||
mem_mapping_t cmapping;
|
||||
|
||||
// uint8_t crtcreg;
|
||||
uint8_t ioctl[16];
|
||||
uint8_t fctl[32];
|
||||
uint16_t crtc[128];
|
||||
@@ -297,7 +298,6 @@ typedef struct da2_t {
|
||||
uint8_t attrc[0x40];
|
||||
int attraddr, attrff;
|
||||
int attr_palette_enable;
|
||||
// uint8_t seqregs[64];
|
||||
int outflipflop;
|
||||
int inflipflop;
|
||||
int iolatch;
|
||||
@@ -306,13 +306,9 @@ typedef struct da2_t {
|
||||
int fctladdr;
|
||||
int crtcaddr;
|
||||
|
||||
uint32_t decode_mask;
|
||||
uint32_t vram_max;
|
||||
|
||||
uint32_t gdcla[8];
|
||||
uint32_t gdcinput[8];
|
||||
uint32_t gdcsrc[8];
|
||||
uint32_t debug_vramold[8];
|
||||
|
||||
uint8_t dac_mask, dac_status;
|
||||
int dac_read, dac_write, dac_pos;
|
||||
@@ -322,20 +318,15 @@ typedef struct da2_t {
|
||||
|
||||
uint8_t plane_mask;
|
||||
|
||||
int fb_only;
|
||||
|
||||
int fast;
|
||||
uint8_t colourcompare, colournocare;
|
||||
int readmode, writemode, readplane;
|
||||
int writemode, readplane;
|
||||
uint8_t planemask;
|
||||
uint32_t charseta, charsetb;
|
||||
|
||||
uint8_t egapal[16];
|
||||
uint32_t pallook[512];
|
||||
PALETTE vgapal;
|
||||
|
||||
int vtotal, dispend, vsyncstart, split, vblankstart;
|
||||
int hdisp, hdisp_old, htotal, hdisp_time, rowoffset;
|
||||
int hdisp, htotal, hdisp_time, rowoffset;
|
||||
int lowres, interlace;
|
||||
int rowcount;
|
||||
double clock;
|
||||
@@ -362,13 +353,9 @@ typedef struct da2_t {
|
||||
|
||||
/* Attribute Buffer E0000-E0FFFh (4 KB) */
|
||||
uint8_t *cram;
|
||||
/* (cram size - 1) >> 3 = 0xFFF */
|
||||
// uint32_t cram_display_mask;
|
||||
/* APA Buffer A0000-BFFFFh (128 KB) */
|
||||
uint8_t *vram;
|
||||
/* xxh */
|
||||
uint8_t *changedvram;
|
||||
/* (vram size - 1) >> 3 = 0x1FFFF */
|
||||
uint32_t vram_display_mask;
|
||||
|
||||
int fullchange;
|
||||
@@ -379,7 +366,6 @@ typedef struct da2_t {
|
||||
card should not attempt to display anything */
|
||||
int override;
|
||||
|
||||
/* end VGA compatible regs*/
|
||||
struct
|
||||
{
|
||||
int enable;
|
||||
@@ -436,13 +422,13 @@ typedef struct da2_t {
|
||||
int old_pos2;
|
||||
} da2_t;
|
||||
|
||||
void da2_recalctimings(da2_t *da2);
|
||||
static void da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p);
|
||||
void da2_bitblt_exec(void *p);
|
||||
void da2_updatevidselector(da2_t *da2);
|
||||
void da2_reset_ioctl(da2_t *da2);
|
||||
static void da2_reset(void *priv);
|
||||
uint16_t rightRotate(uint16_t data, uint8_t count);
|
||||
static void da2_recalctimings(da2_t *da2);
|
||||
static void da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p);
|
||||
static void da2_bitblt_exec(void *p);
|
||||
static void da2_updatevidselector(da2_t *da2);
|
||||
static void da2_reset_ioctl(da2_t *da2);
|
||||
static void da2_reset(void *priv);
|
||||
static uint16_t rightRotate(uint16_t data, uint8_t count);
|
||||
|
||||
typedef union {
|
||||
uint32_t d;
|
||||
@@ -454,7 +440,7 @@ typedef struct {
|
||||
} pixel32;
|
||||
|
||||
/* safety read for internal functions */
|
||||
uint32_t
|
||||
static uint32_t
|
||||
DA2_vram_r(uint32_t addr, da2_t *da2)
|
||||
{
|
||||
if (addr & ~DA2_MASK_VRAM)
|
||||
@@ -462,7 +448,7 @@ DA2_vram_r(uint32_t addr, da2_t *da2)
|
||||
return da2->vram[addr];
|
||||
}
|
||||
/* safety write for internal functions */
|
||||
void
|
||||
static void
|
||||
DA2_vram_w(uint32_t addr, uint8_t val, da2_t *da2)
|
||||
{
|
||||
if (addr & ~DA2_MASK_VRAM)
|
||||
@@ -471,7 +457,7 @@ DA2_vram_w(uint32_t addr, uint8_t val, da2_t *da2)
|
||||
return;
|
||||
}
|
||||
/* write pixel data with rop (Note: bitmask must be in big endian) */
|
||||
void
|
||||
static void
|
||||
DA2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *srcpx, da2_t *da2)
|
||||
{
|
||||
uint32_t writepx[8];
|
||||
@@ -521,7 +507,7 @@ DA2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *s
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
DA2_DrawColorWithBitmask(uint32_t destaddr, uint8_t color, uint16_t mask, da2_t *da2)
|
||||
{
|
||||
pixel32 srcpx;
|
||||
@@ -559,7 +545,7 @@ Param Desc
|
||||
33 Size W
|
||||
35 Size H
|
||||
*/
|
||||
void
|
||||
static void
|
||||
DA2_CopyPlaneDataWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask, da2_t *da2)
|
||||
{
|
||||
pixel32 srcpx;
|
||||
@@ -573,7 +559,7 @@ DA2_CopyPlaneDataWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask,
|
||||
|
||||
DA2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2);
|
||||
}
|
||||
void
|
||||
static void
|
||||
DA2_PutcharWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask, da2_t *da2)
|
||||
{
|
||||
pixel32 srcpx;
|
||||
@@ -660,7 +646,7 @@ IBMJtoSJIS(uint16_t knj)
|
||||
return knj;
|
||||
}
|
||||
#endif
|
||||
void
|
||||
static void
|
||||
da2_bitblt_load(da2_t *da2)
|
||||
{
|
||||
uint32_t value32;
|
||||
@@ -897,7 +883,7 @@ da2_bitblt_load(da2_t *da2)
|
||||
}
|
||||
}
|
||||
}
|
||||
void
|
||||
static void
|
||||
da2_bitblt_exec(void *p)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
@@ -1104,7 +1090,7 @@ da2_bitblt_exec(void *p)
|
||||
break;
|
||||
}
|
||||
}
|
||||
void
|
||||
static void
|
||||
da2_bitblt_dopayload(void *priv)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) priv;
|
||||
@@ -1121,7 +1107,7 @@ da2_bitblt_dopayload(void *priv)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_out(uint16_t addr, uint16_t val, void *p)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
@@ -1147,7 +1133,7 @@ da2_out(uint16_t addr, uint16_t val, void *p)
|
||||
da2->dac_pos = 0;
|
||||
break;
|
||||
case 0x3C9: /* Data */
|
||||
// da2_log("DA2 Out addr %03X idx %d:%d val %02X %04X:%04X esdi %04X:%04X\n", addr, da2->dac_write, da2->dac_pos, val, cs >> 4, cpu_state.pc, ES, DI);
|
||||
// da2_iolog("DA2 Out addr %03X idx %d:%d val %02X %04X:%04X esdi %04X:%04X\n", addr, da2->dac_write, da2->dac_pos, val, cs >> 4, cpu_state.pc, ES, DI);
|
||||
da2->dac_status = 0;
|
||||
da2->fullchange = changeframecount;
|
||||
switch (da2->dac_pos) {
|
||||
@@ -1176,11 +1162,11 @@ da2_out(uint16_t addr, uint16_t val, void *p)
|
||||
da2->ioctladdr = val;
|
||||
break;
|
||||
case LS_DATA:
|
||||
// da2_log("DA2 Out addr %03X idx %02X val %02X %04X:%04X\n", addr, da2->ioctladdr, val, cs >> 4, cpu_state.pc);
|
||||
// da2_iolog("DA2 Out addr %03X idx %02X val %02X %04X:%04X\n", addr, da2->ioctladdr, val, cs >> 4, cpu_state.pc);
|
||||
if (da2->ioctladdr > 0xf)
|
||||
return;
|
||||
if (da2->ioctl[da2->ioctladdr & 15] != val)
|
||||
da2_log("ioctl changed %x: %x -> %x %04X:%04X\n", da2->ioctladdr & 15, da2->ioctl[da2->ioctladdr & 15], val, cs >> 4, cpu_state.pc);
|
||||
da2_iolog("ioctl changed %x: %x -> %x %04X:%04X\n", da2->ioctladdr & 15, da2->ioctl[da2->ioctladdr & 15], val, cs >> 4, cpu_state.pc);
|
||||
oldval = da2->ioctl[da2->ioctladdr];
|
||||
da2->ioctl[da2->ioctladdr] = val;
|
||||
if (oldval != val) {
|
||||
@@ -1197,15 +1183,15 @@ da2_out(uint16_t addr, uint16_t val, void *p)
|
||||
da2->fctladdr = val;
|
||||
break;
|
||||
case LF_DATA:
|
||||
// da2_log("DA2 Out addr %03X idx %02X val %02X %04X:%04X\n", addr, da2->fctladdr, val, cs >> 4, cpu_state.pc);
|
||||
// da2_iolog("DA2 Out addr %03X idx %02X val %02X %04X:%04X\n", addr, da2->fctladdr, val, cs >> 4, cpu_state.pc);
|
||||
if (da2->fctladdr > 0x1f)
|
||||
return;
|
||||
if (da2->fctl[da2->fctladdr & 0x1f] != val)
|
||||
da2_log("fctl changed %x: %x -> %x %04X:%04X\n", da2->fctladdr & 0x1f, da2->fctl[da2->fctladdr & 0x1f], val, cs >> 4, cpu_state.pc);
|
||||
da2_iolog("fctl changed %x: %x -> %x %04X:%04X\n", da2->fctladdr & 0x1f, da2->fctl[da2->fctladdr & 0x1f], val, cs >> 4, cpu_state.pc);
|
||||
oldval = da2->fctl[da2->fctladdr];
|
||||
da2->fctl[da2->fctladdr] = val;
|
||||
if (da2->fctladdr == 0 && oldval != val) {
|
||||
da2_log("DA2 Out FCTL addr %03X idx %02X val %02X %04X:%04X\n", addr, da2->fctladdr, val, cs >> 4, cpu_state.pc);
|
||||
da2_iolog("DA2 Out FCTL addr %03X idx %02X val %02X %04X:%04X\n", addr, da2->fctladdr, val, cs >> 4, cpu_state.pc);
|
||||
}
|
||||
break;
|
||||
case LC_INDEX:
|
||||
@@ -1215,7 +1201,7 @@ da2_out(uint16_t addr, uint16_t val, void *p)
|
||||
if (da2->crtcaddr > 0x1f)
|
||||
return;
|
||||
if (!(da2->crtcaddr == LC_CURSOR_LOC_HIGH || da2->crtcaddr == LC_CURSOR_LOC_LOWJ))
|
||||
da2_log("DA2 Out addr %03X idx %02X val %02X %04X:%04X\n", addr, da2->crtcaddr, val, cs >> 4, cpu_state.pc);
|
||||
da2_iolog("DA2 Out addr %03X idx %02X val %02X %04X:%04X\n", addr, da2->crtcaddr, val, cs >> 4, cpu_state.pc);
|
||||
if (!(da2->crtc[da2->crtcaddr] ^ val))
|
||||
return;
|
||||
switch (da2->crtcaddr) {
|
||||
@@ -1256,7 +1242,8 @@ da2_out(uint16_t addr, uint16_t val, void *p)
|
||||
case LC_VERTICAL_SYNC_START:
|
||||
case LC_V_DISPLAY_ENABLE_END:
|
||||
case LC_START_VERTICAL_BLANK:
|
||||
case LC_END_VERTICAL_BLANK:
|
||||
case LC_START_H_DISPLAY_ENAB:
|
||||
case LC_START_V_DISPLAY_ENAB:
|
||||
case LC_VIEWPORT_PRIORITY:
|
||||
da2->fullchange = changeframecount;
|
||||
da2_recalctimings(da2);
|
||||
@@ -1266,7 +1253,7 @@ da2_out(uint16_t addr, uint16_t val, void *p)
|
||||
}
|
||||
break;
|
||||
case LV_PORT:
|
||||
// da2_log("DA2 Out addr %03X val %02X ff %d %04X:%04X\n", addr, val, da2->attrff,cs >> 4, cpu_state.pc);
|
||||
// da2_iolog("DA2 Out addr %03X val %02X ff %d %04X:%04X\n", addr, val, da2->attrff,cs >> 4, cpu_state.pc);
|
||||
if (!da2->attrff) {
|
||||
// da2->attraddr = val & 31;
|
||||
da2->attraddr = val & 0x3f;
|
||||
@@ -1275,14 +1262,14 @@ da2_out(uint16_t addr, uint16_t val, void *p)
|
||||
da2->attr_palette_enable = val & 0x20;
|
||||
da2_recalctimings(da2);
|
||||
}
|
||||
// da2_log("set attraddr: %X\n", da2->attraddr);
|
||||
// da2_iolog("set attraddr: %X\n", da2->attraddr);
|
||||
} else {
|
||||
if ((da2->attraddr == LV_PANNING) && (da2->attrc[LV_PANNING] != val))
|
||||
da2->fullchange = changeframecount;
|
||||
if (da2->attrc[da2->attraddr & 0x3f] != val)
|
||||
da2_log("attr changed %x: %x -> %x\n", da2->attraddr & 0x3f, da2->attrc[da2->attraddr & 0x3f], val);
|
||||
da2_iolog("attr changed %x: %x -> %x\n", da2->attraddr & 0x3f, da2->attrc[da2->attraddr & 0x3f], val);
|
||||
da2->attrc[da2->attraddr & 0x3f] = val;
|
||||
// da2_log("set attrc %x: %x\n", da2->attraddr & 31, val);
|
||||
// da2_iolog("set attrc %x: %x\n", da2->attraddr & 31, val);
|
||||
if (da2->attraddr < 16)
|
||||
da2->fullchange = changeframecount;
|
||||
if (da2->attraddr == LV_MODE_CONTROL || da2->attraddr < 0x10) {
|
||||
@@ -1330,12 +1317,12 @@ da2_out(uint16_t addr, uint16_t val, void *p)
|
||||
da2->attrc[da2->attraddr & 0x3f] = val;
|
||||
break;
|
||||
case LG_INDEX:
|
||||
da2_log("DA2 Out addr %03X val %02X\n", addr, val);
|
||||
da2_iolog("DA2 Out addr %03X val %02X\n", addr, val);
|
||||
da2->gdcaddr = val;
|
||||
break;
|
||||
case LG_DATA:
|
||||
// if(da2->gdcaddr != 8 && da2->gdcaddr != 9) da2_log("DA2 GCOut idx %X val %02X %04X:%04X esdi %04X:%04X\n", da2->gdcaddr, val, cs >> 4, cpu_state.pc, ES, DI);
|
||||
da2_log("DA2 Out addr %03X idx %02X val %02X\n", addr, da2->gdcaddr, val);
|
||||
// if(da2->gdcaddr != 8 && da2->gdcaddr != 9) da2_iolog("DA2 GCOut idx %X val %02X %04X:%04X esdi %04X:%04X\n", da2->gdcaddr, val, cs >> 4, cpu_state.pc, ES, DI);
|
||||
da2_iolog("DA2 Out addr %03X idx %02X val %02X\n", addr, da2->gdcaddr, val);
|
||||
da2->gdcreg[da2->gdcaddr & 0x0f] = val & 0xff;
|
||||
switch (da2->gdcaddr & 0x1f) {
|
||||
case LG_READ_MAP_SELECT:
|
||||
@@ -1355,7 +1342,7 @@ da2_out(uint16_t addr, uint16_t val, void *p)
|
||||
case LG_COMMAND:
|
||||
break;
|
||||
case LG_SET_RESET_2:
|
||||
da2_log("!!!DA2 GC Out addr %03X idx 10 val %02X\n", addr, val);
|
||||
da2_iolog("!!!DA2 GC Out addr %03X idx 10 val %02X\n", addr, val);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
@@ -1363,12 +1350,12 @@ da2_out(uint16_t addr, uint16_t val, void *p)
|
||||
// da2->gdcreg[5] = val & 0xff;
|
||||
// break;
|
||||
default:
|
||||
da2_log("DA2? Out addr %03X val %02X\n", addr, val);
|
||||
da2_iolog("DA2? Out addr %03X val %02X\n", addr, val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t
|
||||
static uint16_t
|
||||
da2_in(uint16_t addr, void *p)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
@@ -1436,17 +1423,17 @@ da2_in(uint16_t addr, void *p)
|
||||
// if (da2->bitblt.indata) /* for OS/2 J1.3 command prompt scrolling */
|
||||
// da2_bitblt_dopayload(da2);
|
||||
if (da2->bitblt.exec != DA2_BLT_CIDLE) {
|
||||
// da2_log("exec:%x\n", da2->bitblt.exec);
|
||||
// da2_iolog("exec:%x\n", da2->bitblt.exec);
|
||||
temp |= 0x01; /* wait (bit 3 + bit 0) ? need verify */
|
||||
// if (!da2->bitblt.timer.enabled)
|
||||
//{
|
||||
// da2_log("bitblt timer restarted!! %04X:%04X\n", cs >> 4, cpu_state.pc);
|
||||
// da2_iolog("bitblt timer restarted!! %04X:%04X\n", cs >> 4, cpu_state.pc);
|
||||
// timer_advance_u64(&da2->bitblt.timer, da2->bitblt.timerspeed);
|
||||
// }
|
||||
}
|
||||
if (da2->bitblt.indata) temp |= 0x08;
|
||||
#ifdef ENABLE_DA2_DEBUGMONWAIT
|
||||
da2_log("DA2 In %04X(%02X) %04X %04X:%04X\n", addr, da2->ioctladdr, temp, cs >> 4, cpu_state.pc);
|
||||
da2_iolog("DA2 In %04X(%02X) %04X %04X:%04X\n", addr, da2->ioctladdr, temp, cs >> 4, cpu_state.pc);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
@@ -1479,7 +1466,7 @@ da2_in(uint16_t addr, void *p)
|
||||
temp = da2->cgastat;
|
||||
} else
|
||||
temp = da2->attrc[da2->attraddr];
|
||||
// da2_log("DA2 In %04X(%02X) %04X %04X:%04X\n", addr, da2->attraddr, temp, cs >> 4, cpu_state.pc);
|
||||
// da2_iolog("DA2 In %04X(%02X) %04X %04X:%04X\n", addr, da2->attraddr, temp, cs >> 4, cpu_state.pc);
|
||||
da2->attrff = 0; /* reset flipflop (VGA does not reset flipflop) */
|
||||
break;
|
||||
case LG_INDEX:
|
||||
@@ -1487,10 +1474,10 @@ da2_in(uint16_t addr, void *p)
|
||||
break;
|
||||
case LG_DATA:
|
||||
temp = da2->gdcreg[da2->gdcaddr & 0x1f];
|
||||
// da2_log("DA2 In %04X(%02X) %04X %04X:%04X\n", addr, da2->gdcaddr, temp, cs >> 4, cpu_state.pc);
|
||||
// da2_iolog("DA2 In %04X(%02X) %04X %04X:%04X\n", addr, da2->gdcaddr, temp, cs >> 4, cpu_state.pc);
|
||||
break;
|
||||
}
|
||||
// da2_log("DA2 In %04X %04X %04X:%04X\n", addr, temp, cs >> 4, cpu_state.pc);
|
||||
// da2_iolog("DA2 In %04X %04X %04X:%04X\n", addr, temp, cs >> 4, cpu_state.pc);
|
||||
return temp;
|
||||
}
|
||||
/*
|
||||
@@ -1504,11 +1491,11 @@ da2_in(uint16_t addr, void *p)
|
||||
* out b(idx), in b, in b(data)
|
||||
* out b(idx), in w(data)
|
||||
*/
|
||||
void
|
||||
static void
|
||||
da2_outb(uint16_t addr, uint8_t val, void *p)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
// da2_log("DA2 Outb addr %03X val %02X %04X:%04X es:di=%x:%x ds:si=%x:%x\n", addr, val, cs >> 4, cpu_state.pc, ES, DI, DS, SI);
|
||||
// da2_iolog("DA2 Outb addr %03X val %02X %04X:%04X es:di=%x:%x ds:si=%x:%x\n", addr, val, cs >> 4, cpu_state.pc, ES, DI, DS, SI);
|
||||
da2->inflipflop = 0;
|
||||
switch (addr) {
|
||||
case LS_DATA:
|
||||
@@ -1538,7 +1525,7 @@ da2_outb(uint16_t addr, uint8_t val, void *p)
|
||||
void
|
||||
da2_outw(uint16_t addr, uint16_t val, void *p)
|
||||
{
|
||||
da2_log("DA2 Outw addr %03X val %04X\n", addr, val);
|
||||
da2_iolog("DA2 Outw addr %03X val %04X\n", addr, val);
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
da2->inflipflop = 0;
|
||||
switch (addr) {
|
||||
@@ -1558,8 +1545,8 @@ da2_outw(uint16_t addr, uint16_t val, void *p)
|
||||
da2->outflipflop = 0;
|
||||
break;
|
||||
case 0x3EC:
|
||||
// da2_log("DA2 Outw addr %03X val %04X %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc);
|
||||
da2_log(" ");
|
||||
// da2_iolog("DA2 Outw addr %03X val %04X %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc);
|
||||
da2_iolog(" ");
|
||||
// val = rightRotate(val, 8);
|
||||
// da2_out(LG_DATA, val, da2);
|
||||
da2_out(LG_DATA, val >> 8, da2);
|
||||
@@ -1585,12 +1572,12 @@ da2_outw(uint16_t addr, uint16_t val, void *p)
|
||||
break;
|
||||
case AC_REG:
|
||||
/* no register is revealed */
|
||||
da2_log("DA2 Outw addr %03X val %04X %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc);
|
||||
da2_iolog("DA2 Outw addr %03X val %04X %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc);
|
||||
da2->reg3ee[val & 0x0f] = val >> 8;
|
||||
break;
|
||||
}
|
||||
}
|
||||
uint8_t
|
||||
static uint8_t
|
||||
da2_inb(uint16_t addr, void *p)
|
||||
{
|
||||
uint8_t temp;
|
||||
@@ -1620,10 +1607,10 @@ da2_inb(uint16_t addr, void *p)
|
||||
da2->inflipflop = 0;
|
||||
break;
|
||||
}
|
||||
// da2_log("DA2 Inb %04X %02X %04X:%04X\n", addr, temp, cs >> 4, cpu_state.pc);
|
||||
// da2_iolog("DA2 Inb %04X %02X %04X:%04X\n", addr, temp, cs >> 4, cpu_state.pc);
|
||||
return temp;
|
||||
}
|
||||
uint16_t
|
||||
static uint16_t
|
||||
da2_inw(uint16_t addr, void *p)
|
||||
{
|
||||
uint16_t temp;
|
||||
@@ -1631,11 +1618,11 @@ da2_inw(uint16_t addr, void *p)
|
||||
da2->inflipflop = 0;
|
||||
da2->outflipflop = 0;
|
||||
temp = da2_in(addr, da2);
|
||||
da2_log("DA2 Inw addr %03X val %04X\n", addr, temp);
|
||||
da2_iolog("DA2 Inw addr %03X val %04X\n", addr, temp);
|
||||
return temp;
|
||||
}
|
||||
/* IO 03DAh : Input Status Register 2 for DOSSHELL used by DOS J4.0 */
|
||||
uint8_t
|
||||
static uint8_t
|
||||
da2_in_ISR(uint16_t addr, void *p)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
@@ -1647,15 +1634,15 @@ da2_in_ISR(uint16_t addr, void *p)
|
||||
da2->cgastat ^= 0x30;
|
||||
temp = da2->cgastat;
|
||||
}
|
||||
// da2_log("DA2D In %04X %04X %04X:%04X\n", addr, temp, cs >> 4, cpu_state.pc);
|
||||
// da2_iolog("DA2D In %04X %04X %04X:%04X\n", addr, temp, cs >> 4, cpu_state.pc);
|
||||
return temp;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_out_ISR(uint16_t addr, uint8_t val, void *p)
|
||||
{
|
||||
// da2_t* da2 = (da2_t*)p;
|
||||
da2_log("DA2D Out %04X %04X %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc);
|
||||
da2_iolog("DA2D Out %04X %04X %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1759,7 +1746,7 @@ The Font ROM can be accessed via 128 KB memory window located at A0000-BFFFFh.
|
||||
*/
|
||||
|
||||
/* Get character line pattern from jfont rom or gaiji volatile memory */
|
||||
uint32_t
|
||||
static uint32_t
|
||||
getfont_ps55dbcs(int32_t code, int32_t line, void *p)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
@@ -1797,14 +1784,14 @@ getfont_ps55dbcs(int32_t code, int32_t line, void *p)
|
||||
}
|
||||
|
||||
/* Reverse the bit order of attribute code IRGB to BGRI(used in Mode 3 and Cursor Color) */
|
||||
uint8_t
|
||||
static int8_t
|
||||
IRGBtoBGRI(uint8_t attr)
|
||||
{
|
||||
attr = ((attr & 0x01) << 7) | ((attr & 0x02) << 5) | ((attr & 0x04) << 3) | ((attr & 0x08) << 1);
|
||||
return attr >>= 4;
|
||||
}
|
||||
/* Get the foreground color from the attribute byte */
|
||||
uint8_t
|
||||
static uint8_t
|
||||
getPS55ForeColor(uint8_t attr, da2_t *da2)
|
||||
{
|
||||
uint8_t foreground = ~attr & 0x08; /* 0000 1000 */
|
||||
@@ -1816,7 +1803,7 @@ getPS55ForeColor(uint8_t attr, da2_t *da2)
|
||||
return foreground;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_render_blank(da2_t *da2)
|
||||
{
|
||||
int x, xx;
|
||||
@@ -1850,12 +1837,13 @@ da2_render_text(da2_t *da2)
|
||||
int fg, bg;
|
||||
uint32_t chr_dbcs;
|
||||
int chr_wide = 0;
|
||||
int colormode = ((da2->attrc[LV_PAS_STATUS_CNTRL] & 0x80) == 0x80);
|
||||
// da2_log("\nda2ma: %x, da2sc: %x\n", da2->ma, da2->sc);
|
||||
for (x = 0; x < da2->hdisp; x += 13) {
|
||||
chr = da2->cram[(da2->ma) & DA2_MASK_CRAM];
|
||||
attr = da2->cram[(da2->ma + 1) & DA2_MASK_CRAM];
|
||||
// if(chr!=0x20) da2_log("chr: %x, attr: %x ", chr, attr);
|
||||
if (da2->attrc[LV_PAS_STATUS_CNTRL] & 0x80) /* IO 3E8h, Index 1Dh */
|
||||
if (colormode) /* IO 3E8h, Index 1Dh */
|
||||
{ /* --Parse attribute byte in color mode-- */
|
||||
bg = 0; /* bg color is always black (the only way to change background color is programming PAL) */
|
||||
fg = getPS55ForeColor(attr, da2);
|
||||
@@ -1932,24 +1920,24 @@ da2_render_text(da2_t *da2)
|
||||
chr_wide = 0;
|
||||
}
|
||||
/* Line 28 (Underscore) Note: Draw this first to display blink + vertical + underline correctly. */
|
||||
if (da2->sc == 27 && attr & 0x40 && ~da2->attrc[LV_PAS_STATUS_CNTRL] & 0x80) { /* Underscore only in monochrome mode */
|
||||
if (da2->sc == da2->crtc[LC_UNDERLINE_LOCATION] && attr & 0x40 && !colormode) { /* Underscore only in monochrome mode */
|
||||
for (uint32_t n = 0; n < 13; n++)
|
||||
p[n] = da2->pallook[da2->egapal[fg]]; /* under line (white) */
|
||||
}
|
||||
/* Column 1 (Vertical Line) */
|
||||
if (attr & 0x10) {
|
||||
p[0] = da2->pallook[da2->egapal[(da2->attrc[LV_PAS_STATUS_CNTRL] & 0x80) ? IRGBtoBGRI(da2->attrc[LV_GRID_COLOR_0]) : 2]]; /* vertical line (white) */
|
||||
p[0] = da2->pallook[da2->egapal[(colormode) ? IRGBtoBGRI(da2->attrc[LV_GRID_COLOR_0]) : 2]]; /* vertical line (white) */
|
||||
}
|
||||
if (da2->sc == 0 && attr & 0x20 && ~da2->attrc[LV_PAS_STATUS_CNTRL]) { /* HGrid */
|
||||
for (uint32_t n = 0; n < 13; n++)
|
||||
p[n] = da2->pallook[da2->egapal[(da2->attrc[LV_PAS_STATUS_CNTRL] & 0x80) ? IRGBtoBGRI(da2->attrc[LV_GRID_COLOR_0]) : 2]]; /* horizontal line (white) */
|
||||
p[n] = da2->pallook[da2->egapal[(colormode) ? IRGBtoBGRI(da2->attrc[LV_GRID_COLOR_0]) : 2]]; /* horizontal line (white) */
|
||||
}
|
||||
/* Drawing text cursor */
|
||||
drawcursor = ((da2->ma == da2->ca) && da2->con && da2->cursoron);
|
||||
if (drawcursor && da2->sc >= da2->crtc[LC_CURSOR_ROW_START] && da2->sc <= da2->crtc[LC_CURSOR_ROW_END]) {
|
||||
int cursorwidth = (da2->crtc[LC_COMPATIBILITY] & 0x20 ? 26 : 13);
|
||||
int cursorcolor = (da2->attrc[LV_PAS_STATUS_CNTRL] & 0x80) ? IRGBtoBGRI(da2->attrc[LV_CURSOR_COLOR]) : 2; /* Choose color 2 if mode 8 */
|
||||
fg = (da2->attrc[LV_PAS_STATUS_CNTRL] & 0x80) ? getPS55ForeColor(attr, da2) : ((attr & 0x08) ? 3 : 2);
|
||||
int cursorcolor = (colormode) ? IRGBtoBGRI(da2->attrc[LV_CURSOR_COLOR]) : 2; /* Choose color 2 if mode 8 */
|
||||
fg = (colormode) ? getPS55ForeColor(attr, da2) : ((attr & 0x08) ? 3 : 2);
|
||||
bg = 0;
|
||||
if (attr & 0x04) { /* Color 0 if reverse */
|
||||
bg = fg;
|
||||
@@ -2048,8 +2036,8 @@ da2_render_textm3(da2_t *da2)
|
||||
drawcursor = ((da2->ma == da2->ca) && da2->con && da2->cursoron);
|
||||
if (drawcursor && da2->sc >= da2->crtc[LC_CURSOR_ROW_START] && da2->sc <= da2->crtc[LC_CURSOR_ROW_END]) {
|
||||
// int cursorwidth = (da2->crtc[0x1f] & 0x20 ? 26 : 13);
|
||||
// int cursorcolor = (da2->attrc[LV_PAS_STATUS_CNTRL] & 0x80) ? IRGBtoBGRI(da2->attrc[0x1a]) : 2;/* Choose color 2 if mode 8 */
|
||||
// fg = (da2->attrc[LV_PAS_STATUS_CNTRL] & 0x80) ? getPS55ForeColor(attr, da2) : (attr & 0x08) ? 3 : 2;
|
||||
// int cursorcolor = (colormode) ? IRGBtoBGRI(da2->attrc[0x1a]) : 2;/* Choose color 2 if mode 8 */
|
||||
// fg = (colormode) ? getPS55ForeColor(attr, da2) : (attr & 0x08) ? 3 : 2;
|
||||
// bg = 0;
|
||||
// if (attr & 0x04) {/* Color 0 if reverse */
|
||||
// bg = fg;
|
||||
@@ -2066,7 +2054,7 @@ da2_render_textm3(da2_t *da2)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_render_color_4bpp(da2_t *da2)
|
||||
{
|
||||
int changed_offset = da2->ma >> 9;
|
||||
@@ -2115,7 +2103,7 @@ da2_render_color_4bpp(da2_t *da2)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_render_color_8bpp(da2_t *da2)
|
||||
{
|
||||
int changed_offset = da2->ma >> 9;
|
||||
@@ -2164,23 +2152,25 @@ da2_render_color_8bpp(da2_t *da2)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_updatevidselector_tick(void *priv)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) priv;
|
||||
if (da2->ioctl[LS_MODE] & 0x02) {
|
||||
/* VGA passthrough mode */
|
||||
da2->override = 1;
|
||||
timer_disable(&da2->timer);
|
||||
svga_set_override(da2->mb_vga, 0);
|
||||
da2_log("DA2 selector: VGA\n");
|
||||
} else {
|
||||
svga_set_override(da2->mb_vga, 1);
|
||||
timer_enable(&da2->timer);
|
||||
da2->override = 0;
|
||||
da2_log("DA2 selector: DA2\n");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_updatevidselector(da2_t *da2)
|
||||
{
|
||||
timer_set_delay_u64(&da2->timer_vidupd, 100000ull * TIMER_USEC);
|
||||
@@ -2189,15 +2179,16 @@ da2_updatevidselector(da2_t *da2)
|
||||
/*
|
||||
INT 10h video modes supported in DOS J4.0 (The DA-2 doesn't have a video BIOS on its card.)
|
||||
Mode Type Colors Text Base Address PELs Render
|
||||
3 A/N/K 16 80 x 25 B0000h/B8000h 1040 x 725 textm3
|
||||
3 A/N/K 16 80 x 25 B0000h/B8000h 1040 x 754 textm3
|
||||
8 A/N/K 2 80 x 25 E0000h 1040 x 725 text
|
||||
Ah APA 1 78 x 25 A0000h 1024 x 768 color_4bpp
|
||||
Dh APA 16 78 x 25 A0000h 1024 x 768 color_4bpp
|
||||
Eh A/N/K 16 80 x 25 E0000h 1040 x 725 text
|
||||
Fh APA 256 NA A0000h 1024 x 768 color_8bpp
|
||||
45h(undoc) APA 16 NA A0000h 1040 x 768 color_4bpp
|
||||
46h(undoc) APA 16 ? A0000h 1040 x 768 color_4bpp
|
||||
*/
|
||||
void
|
||||
static void
|
||||
da2_recalctimings(da2_t *da2)
|
||||
{
|
||||
double crtcconst;
|
||||
@@ -2217,10 +2208,10 @@ da2_recalctimings(da2_t *da2)
|
||||
da2->vblankstart = da2->crtc[LC_START_VERTICAL_BLANK] & 0xfff;
|
||||
da2->hdisp = da2->crtc[LC_H_DISPLAY_ENABLE_END];
|
||||
|
||||
if (da2->crtc[LC_START_H_DISPLAY_ENAB] & 1) {
|
||||
da2->hdisp--;
|
||||
da2->dispend -= 29;
|
||||
}
|
||||
/* In the video mode 3, you'll see a blank below the screen. It's NOT a bug. */
|
||||
da2->hdisp -= da2->crtc[LC_START_H_DISPLAY_ENAB];
|
||||
da2->dispend -= da2->crtc[LC_START_V_DISPLAY_ENAB];
|
||||
da2->dispend += 1;
|
||||
|
||||
da2->htotal = da2->crtc[LC_HORIZONTAL_TOTAL];
|
||||
da2->htotal += 1;
|
||||
@@ -2246,15 +2237,14 @@ da2_recalctimings(da2_t *da2)
|
||||
if (!(da2->ioctl[LS_MODE] & 0x01)) {
|
||||
da2->hdisp *= 16;
|
||||
da2->char_width = 13;
|
||||
da2->hdisp_old = da2->hdisp;
|
||||
if (da2->crtc[LC_VIEWPORT_PRIORITY] & 0x80) {
|
||||
da2_log("Set videomode to PS/55 8 bpp graphics.\n");
|
||||
da2->render = da2_render_color_8bpp;
|
||||
da2->vram_display_mask = DA2_MASK_A000;
|
||||
} else { /* PS/55 8-color */
|
||||
da2_log("Set videomode to PS/55 4 bpp graphics.\n");
|
||||
da2->vram_display_mask = DA2_MASK_A000;
|
||||
da2->render = da2_render_color_4bpp;
|
||||
da2->vram_display_mask = DA2_MASK_A000;
|
||||
}
|
||||
} else {
|
||||
/* text mode */
|
||||
@@ -2268,7 +2258,6 @@ da2_recalctimings(da2_t *da2)
|
||||
da2->vram_display_mask = DA2_MASK_CRAM;
|
||||
}
|
||||
da2->hdisp *= 13;
|
||||
da2->hdisp_old = da2->hdisp;
|
||||
da2->char_width = 13;
|
||||
}
|
||||
// if (!da2->scrblank && da2->attr_palette_enable)
|
||||
@@ -2303,8 +2292,7 @@ da2_recalctimings(da2_t *da2)
|
||||
da2->dispofftime = TIMER_USEC;
|
||||
da2_log("da2 horiz total %i display end %i vidclock %f\n", da2->crtc[0], da2->crtc[1], da2->clock);
|
||||
da2_log("da2 vert total %i display end %i max row %i vsync %i\n",da2->vtotal,da2->dispend,(da2->crtc[9]&31)+1,da2->vsyncstart);
|
||||
da2_log("total %f on %i cycles off %i cycles frame %i sec %i\n",disptime*crtcconst,da2->dispontime,da2->dispofftime,(da2->dispontime+da2->dispofftime)*da2->vtotal,(da2->dispontime+da2->dispofftime)*da2->vtotal*70);
|
||||
|
||||
da2_log("da2 dispon %lu dispoff %lu on(us) %f off(us) %f\n",da2->dispontime, da2->dispofftime, (double)da2->dispontime / (double)cpuclock / (double) (1ULL << 32) * 1000000.0, (double)da2->dispofftime / (double)cpuclock / (double) (1ULL << 32) * 1000000.0);
|
||||
// da2_log("da2->render %08X\n", da2->render);
|
||||
}
|
||||
|
||||
@@ -2325,12 +2313,10 @@ da2_mapping_update(da2_t *da2)
|
||||
io_sethandler(0x03d0, 0x000b, da2_in_ISR, NULL, NULL, da2_out_ISR, NULL, NULL, da2);
|
||||
mem_mapping_enable(&da2->cmapping);
|
||||
mem_mapping_enable(&da2->mmio.mapping);
|
||||
timer_enable(&da2->timer);
|
||||
timer_enable(&da2->bitblt.timer);
|
||||
} else {
|
||||
da2_log("DA2 disable registers\n");
|
||||
timer_disable(&da2->bitblt.timer);
|
||||
timer_disable(&da2->timer);
|
||||
mem_mapping_disable(&da2->cmapping);
|
||||
mem_mapping_disable(&da2->mmio.mapping);
|
||||
io_removehandler(0x03c0, 0x000a, da2_inb, da2_inw, NULL, da2_outb, da2_outw, NULL, da2);
|
||||
@@ -2339,14 +2325,14 @@ da2_mapping_update(da2_t *da2)
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t
|
||||
static uint8_t
|
||||
da2_mca_read(int port, void *p)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
return da2->pos_regs[port & 7];
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_mca_write(int port, uint8_t val, void *p)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
@@ -2642,9 +2628,7 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
|
||||
da2->mmdbg_vidaddr = addr;
|
||||
//}
|
||||
#endif
|
||||
|
||||
cycles -= video_timing_write_b;
|
||||
|
||||
da2->changedvram[addr >> 9] = changeframecount;/* 0x1FFFF -> 0x1F */
|
||||
addr <<= 3;
|
||||
|
||||
@@ -2685,27 +2669,13 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
|
||||
da2->gdcinput[i] = (da2->gdcreg[LG_SET_RESETJ] & (1 << i)) ? 0xff : 0;
|
||||
else
|
||||
da2->gdcinput[i] = val;
|
||||
|
||||
// for (int i = 0; i < 8; i++)
|
||||
// da2->debug_vramold[i] = da2->vram[addr | i]; /* use latch */
|
||||
da2_gdcropB(addr, bitmask, da2);
|
||||
// for (int i = 0; i < 8; i++)
|
||||
// da2_log("\tsrc %02x in %02x bitm %02x mod %x rop %x: %02x -> %02x\n", da2->gdcsrc[i], da2->gdcinput[i], bitmask, da2->gdcreg[5],da2->gdcreg[LG_COMMAND], da2->debug_vramold[i], da2->vram[addr | i]);//use latch
|
||||
////da2_log("- %02X %02X %02X %02X %08X\n",vram[addr],vram[addr|0x1],vram[addr|0x2],vram[addr|0x3],addr);
|
||||
}
|
||||
break;
|
||||
case 1:/* equiv to vga write mode 2 */
|
||||
// if (!(da2->gdcreg[LG_COMMAND] & 0x03) && (!da2->gdcreg[LG_ENABLE_SRJ])) {
|
||||
// for (int i = 0; i < 8; i++)
|
||||
// if (da2->planemask & (1 << i))
|
||||
// DA2_vram_w(addr | i, (((val & (1 << i)) ? 0xff : 0) & bitmask) | (da2->gdcsrc[i] & ~bitmask), da2);
|
||||
// //fprintf(da2->mmdbg_fp, "m1-1");
|
||||
// } else {
|
||||
for (int i = 0; i < 8; i++)
|
||||
da2->gdcinput[i] = ((val & (1 << i)) ? 0xff : 0);
|
||||
da2_gdcropB(addr, bitmask, da2);
|
||||
//fprintf(da2->mmdbg_fp, "m1-2");
|
||||
// }
|
||||
break;
|
||||
case 3:/* equiv to vga write mode 3 */
|
||||
if (da2->gdcreg[LG_DATA_ROTATION] & 7)
|
||||
@@ -2717,14 +2687,13 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
|
||||
da2_gdcropB(addr, bitmask, da2);
|
||||
break;
|
||||
}
|
||||
// da2_log("%02x%02x%02x%02x\n", da2->vram[addr + 0], da2->vram[addr + 1], da2->vram[addr + 2], da2->vram[addr + 3]);
|
||||
} else { /* mode 3h text */
|
||||
cycles -= video_timing_write_b;
|
||||
DA2_vram_w(addr, val, da2);
|
||||
da2->fullchange = 2;
|
||||
}
|
||||
}
|
||||
uint16_t
|
||||
static uint16_t
|
||||
rightRotate(uint16_t data, uint8_t count)
|
||||
{
|
||||
return (data >> count) | (data << (sizeof(data) * 8 - count));
|
||||
@@ -2741,8 +2710,7 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
|
||||
#ifdef ENABLE_DA2_DEBUGVRAM
|
||||
da2_log("da2_wW %x %d %d %02x\n", addr,
|
||||
addr % (da2->rowoffset * 2) * 8, addr / (da2->rowoffset * 2), val);
|
||||
// if (!(da2->gdcreg[LG_COMMAND] & 0x08))
|
||||
//{
|
||||
|
||||
if (((int) addr - (int) da2->mmdbg_vidaddr) > 2 || (((int) da2->mmdbg_vidaddr - (int) addr) > 2) || da2->mmdbg_vidaddr == addr) {
|
||||
fprintf(da2->mmdbg_fp, "\nW %x %x ", addr, val);
|
||||
for (int i = 0; i <= 0xb; i++)
|
||||
@@ -2755,7 +2723,6 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
|
||||
fprintf(da2->mmdbg_fp, "%X", pixeldata);
|
||||
}
|
||||
da2->mmdbg_vidaddr = addr;
|
||||
//}
|
||||
#endif
|
||||
cycles -= video_timing_write_w;
|
||||
|
||||
@@ -2763,7 +2730,6 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
|
||||
// da2_log("da2_gcW %05X %02X %04X:%04X esdi %04X:%04X dssi %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc, ES, DI, DS, SI);
|
||||
|
||||
da2->changedvram[addr >> 9] = changeframecount;
|
||||
// da2->changedvram[(addr + 1) >> 12] = changeframecount;
|
||||
addr <<= 3;
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
@@ -2900,7 +2866,7 @@ da2_code_readw(uint32_t addr, void *p)
|
||||
return da2_code_read(addr, da2) | (da2_code_read(addr + 1, da2) << 8);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_doblit(int y1, int y2, int wx, int wy, da2_t *da2)
|
||||
{
|
||||
if (wx != xsize || wy != ysize) {
|
||||
@@ -2919,7 +2885,7 @@ da2_doblit(int y1, int y2, int wx, int wy, da2_t *da2)
|
||||
video_bpp = 8;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_poll(void *priv)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) priv;
|
||||
@@ -3024,9 +2990,6 @@ da2_poll(void *priv)
|
||||
da2->cgastat |= 8;
|
||||
x = da2->hdisp;
|
||||
|
||||
// if (da2->interlace && !da2->oddeven) da2->lastline++;
|
||||
// if (da2->interlace && da2->oddeven) da2->firstline--;
|
||||
|
||||
wx = x;
|
||||
wy = da2->lastline - da2->firstline;
|
||||
|
||||
@@ -3043,17 +3006,9 @@ da2_poll(void *priv)
|
||||
changeframecount = da2->interlace ? 3 : 2;
|
||||
da2->vslines = 0;
|
||||
|
||||
// if (da2->interlace && da2->oddeven) da2->ma = da2->maback = da2->ma_latch + (da2->rowoffset << 1) + ((da2->crtc[5] & 0x60) >> 5);
|
||||
// else da2->ma = da2->maback = da2->ma_latch + ((da2->crtc[5] & 0x60) >> 5);
|
||||
// da2->ca = ((da2->crtc[0xe] << 8) | da2->crtc[0xf]) + ((da2->crtc[0xb] & 0x60) >> 5) + da2->ca_adj;
|
||||
/* if (da2->interlace && da2->oddeven) da2->ma = da2->maback = da2->ma_latch;
|
||||
else*/
|
||||
da2->ma
|
||||
= da2->maback = da2->ma_latch;
|
||||
da2->ca = ((da2->crtc[LC_CURSOR_LOC_HIGH] << 8) | da2->crtc[LC_CURSOR_LOC_LOWJ]) + da2->ca_adj;
|
||||
|
||||
// da2->ma <<= 1;
|
||||
// da2->maback <<= 1;
|
||||
da2->ca <<= 1;
|
||||
|
||||
// da2_log("Addr %08X vson %03X vsoff %01X\n",da2->ma,da2->vsyncstart,da2->crtc[0x11]&0xF);
|
||||
@@ -3070,9 +3025,6 @@ da2_poll(void *priv)
|
||||
if (da2->sc == (da2->crtc[LC_CURSOR_ROW_START] & 31))
|
||||
da2->con = 1;
|
||||
}
|
||||
// printf("2 %i\n",da2_vsyncstart);
|
||||
// da2_log("da2_poll %i %i %i %i %i %i %i\n", ins, da2->dispofftime, da2->dispontime, da2->vidtime, cyc_total, da2->linepos, da2->vc);
|
||||
// da2_log("r");
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -3129,7 +3081,7 @@ static uint8_t ps55_palette_color[64][3] = {
|
||||
{ 0x3F, 0x15, 0x15 }, { 0x3F, 0x15, 0x3F }, { 0x3F, 0x3F, 0x15 }, { 0x3F, 0x3F, 0x3F }
|
||||
};
|
||||
|
||||
void
|
||||
static void
|
||||
da2_reset_ioctl(da2_t *da2)
|
||||
{
|
||||
da2->ioctl[LS_RESET] = 0x00; /* Bit 0: Reset sequencer */
|
||||
@@ -3243,7 +3195,7 @@ da2_available(void)
|
||||
return (rom_present(DA2_FONTROM_PATH_HANT) || rom_present(DA2_FONTROM_PATH_JPAN));
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_close(void *p)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
@@ -3331,7 +3283,7 @@ da2_close(void *p)
|
||||
free(da2);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_speed_changed(void *p)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
@@ -3339,7 +3291,7 @@ da2_speed_changed(void *p)
|
||||
da2_recalctimings(da2);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
da2_force_redraw(void *p)
|
||||
{
|
||||
da2_t *da2 = (da2_t *) p;
|
||||
|
||||
Reference in New Issue
Block a user