From 08f9a709729c973e104997040e69a33b412cabc3 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Wed, 5 Jun 2019 20:45:17 +0900 Subject: [PATCH] [VM][PC9801][UPD7220][DISPLAY][GDC] Fix wrond addressing.Fix wrond drawing "BATTLE" for PC-9801 (excepts with EGC). --- source/src/vm/pc9801/display.cpp | 30 ++-- source/src/vm/upd7220.cpp | 349 ++++++++------------------------------- source/src/vm/upd7220.h | 39 +++-- 3 files changed, 107 insertions(+), 311 deletions(-) diff --git a/source/src/vm/pc9801/display.cpp b/source/src/vm/pc9801/display.cpp index a7eb162ac..c6d4410d4 100644 --- a/source/src/vm/pc9801/display.cpp +++ b/source/src/vm/pc9801/display.cpp @@ -354,9 +354,9 @@ void DISPLAY::reset() #if defined(SUPPORT_EGC) enable_egc = false; -// if(modereg2[MODE2_EGC_WP] != 0) { - // enable_egc = ((is_use_egc) && (modereg2[MODE2_EGC] != 0)) ? true : false; -// } + //if(modereg2[MODE2_EGC_WP] != 0) { + //enable_egc = ((is_use_egc) && (modereg2[MODE2_EGC] != 0)) ? true : false; + // } #endif egc_access = 0xfff0; egc_fgbg = 0x00ff; @@ -577,14 +577,16 @@ void DISPLAY::write_io8(uint32_t addr, uint32_t data) grcg_plane_enabled[i] = ((grcg_mode & (1 << i)) == 0) ? true : false; } grcg_tile_ptr = 0; + //out_debug_log("GRCG MODEREG=%02x CG_MODE=%s RW_MODE=%s PLANE=%s%s%s%s\n", data, (grcg_cg_mode) ? "Yes" : "No", (grcg_rw_mode) ? "Yes" : "No", (grcg_plane_enabled[0]) ? "B" : " ", (grcg_plane_enabled[1]) ? "R" : " ", (grcg_plane_enabled[2]) ? "G" : " ", (grcg_plane_enabled[3]) ? "W" : " "); break; #if !defined(SUPPORT_HIRESO) case 0x007e: #else case 0x00a6: #endif + //out_debug_log("SET TILE #%d to %02X\n", grcg_tile_ptr, data); grcg_tile[grcg_tile_ptr] = data; - grcg_tile_word[grcg_tile_ptr] = grcg_tile[grcg_tile_ptr] | ((uint16_t)(grcg_tile[grcg_tile_ptr]) << 8); + grcg_tile_word[grcg_tile_ptr] = ((uint16_t)grcg_tile[grcg_tile_ptr]) | ((uint16_t)grcg_tile[grcg_tile_ptr] << 8); grcg_tile_ptr = (grcg_tile_ptr + 1) & 3; break; #endif @@ -607,6 +609,7 @@ void DISPLAY::write_io8(uint32_t addr, uint32_t data) #endif } vram_disp_sel = data; + //out_debug_log("SET DISPLAY PAGE=%d\n", (data & 1)); break; case 0x00a6: if(data & 1) { @@ -615,6 +618,7 @@ void DISPLAY::write_io8(uint32_t addr, uint32_t data) vram_draw = vram + 0x00000; } vram_draw_sel = data; + //out_debug_log("SET DRAW PAGE=%d\n", (data & 1)); break; #endif // palette @@ -629,6 +633,7 @@ void DISPLAY::write_io8(uint32_t addr, uint32_t data) palette_gfx8[7] = RGB_COLOR((data & 2) ? 0xff : 0, (data & 4) ? 0xff : 0, (data & 1) ? 0xff : 0); data >>= 4; palette_gfx8[3] = RGB_COLOR((data & 2) ? 0xff : 0, (data & 4) ? 0xff : 0, (data & 1) ? 0xff : 0); + //out_debug_log("SET DIGITAL PALETTE #3 %d %d\n", data & 7, (data >> 4) & 7); break; case 0xaa: #if defined(SUPPORT_16_COLORS) @@ -642,6 +647,7 @@ void DISPLAY::write_io8(uint32_t addr, uint32_t data) palette_gfx8[5] = RGB_COLOR((data & 2) ? 0xff : 0, (data & 4) ? 0xff : 0, (data & 1) ? 0xff : 0); data >>= 4; palette_gfx8[1] = RGB_COLOR((data & 2) ? 0xff : 0, (data & 4) ? 0xff : 0, (data & 1) ? 0xff : 0); + //out_debug_log("SET DIGITAL PALETTE #1 %d %d\n", data & 7, (data >> 4) & 7); break; case 0xac: #if defined(SUPPORT_16_COLORS) @@ -655,6 +661,7 @@ void DISPLAY::write_io8(uint32_t addr, uint32_t data) palette_gfx8[6] = RGB_COLOR((data & 2) ? 0xff : 0, (data & 4) ? 0xff : 0, (data & 1) ? 0xff : 0); data >>= 4; palette_gfx8[2] = RGB_COLOR((data & 2) ? 0xff : 0, (data & 4) ? 0xff : 0, (data & 1) ? 0xff : 0); + //out_debug_log("SET DIGITAL PALETTE #2 %d %d\n", data & 7, (data >> 4) & 7); break; case 0xae: #if defined(SUPPORT_16_COLORS) @@ -668,6 +675,7 @@ void DISPLAY::write_io8(uint32_t addr, uint32_t data) palette_gfx8[4] = RGB_COLOR((data & 2) ? 0xff : 0, (data & 4) ? 0xff : 0, (data & 1) ? 0xff : 0); data >>= 4; palette_gfx8[0] = RGB_COLOR((data & 2) ? 0xff : 0, (data & 4) ? 0xff : 0, (data & 1) ? 0xff : 0); + //out_debug_log("SET DIGITAL PALETTE #0 %d %d\n", data & 7, (data >> 4) & 7); break; // cg window case 0xa1: @@ -1157,7 +1165,7 @@ void DISPLAY::write_dma_io16(uint32_t addr, uint32_t data) vram_draw[0x1ffff] = d.b.l; vram_draw[0x00000] = d.b.h; } else { - *(uint16_t *)(&vram_draw[addr & 0x1ffff]) = data; + *(uint16_t *)(&vram_draw[addr & 0x1fffe]) = data; } } } @@ -1197,7 +1205,7 @@ uint32_t DISPLAY::read_dma_io16(uint32_t addr) d.b.h = vram_draw[0x00000]; return (uint32_t)(d.w); } - return *(uint16_t *)(&vram_draw[addr & 0x1ffff]); + return *(uint16_t *)(&vram_draw[addr & 0x1fffe]); } } @@ -1217,9 +1225,7 @@ void DISPLAY::grcg_writeb(uint32_t addr1, uint32_t data) __DECL_ALIGNED(4) uint8_t bit_data[4]; uint8_t* p = vram_draw; for(int i = 0; i < 4; i++) { - //if(grcg_plane_enabled[i]) { - plane_data[i] = p[plane_offset[i]]; - //} + plane_data[i] = p[plane_offset[i]]; } __DECL_VECTORIZED_LOOP @@ -1365,9 +1371,7 @@ uint32_t DISPLAY::grcg_readb(uint32_t addr1) __DECL_VECTORIZED_LOOP for(int i = 0; i < 4; i++) { data |= (grcg_plane_enabled[i]) ? dsum[i] : 0; - // if(grcg_plane_enabled[i]) { - // data |= dsum[i]; - // } + //data |= dsum[i]; } /* if(!(grcg_mode & GRCG_PLANE_0)) { @@ -3131,7 +3135,7 @@ bool DISPLAY::process_state(FILEIO* state_fio, bool loading) grcg_plane_enabled[i] = ((grcg_mode & (1 << i)) == 0) ? true : false;; } for(int i = 0; i < 4; i++) { - grcg_tile_word[i] = ((uint16_t)(grcg_tile[i]) << 8) | grcg_tile[i]; + grcg_tile_word[i] = ((uint16_t)grcg_tile[i]) | ((uint16_t)grcg_tile[i] << 8); } #endif #endif diff --git a/source/src/vm/upd7220.cpp b/source/src/vm/upd7220.cpp index 7f295c5c8..b745d5840 100644 --- a/source/src/vm/upd7220.cpp +++ b/source/src/vm/upd7220.cpp @@ -443,18 +443,8 @@ void UPD7220::process_cmd() void UPD7220::cmd_vecte() { - //dx = ((ead % pitch) << 4) | (dad & 0x0f); - //dy = ead / pitch; - if(_UPD7220_UGLY_PC98_HACK) { -// if(ead >= 0x20000) { // Negative -// ead = -(ead & 0x1ffff); -// } - dx = (((ead & 0x3fff)% pitch) << 4) | (dad & 0x0f); - dy = (ead & 0x3fff) / pitch; - } else { - dx = ((ead % pitch) << 4) | (dad & 0x0f); - dy = ead / pitch; - } + dx = ((ead % pitch) << 4) | (dad & 0x0f); + dy = ead / pitch; wrote_bytes = 1; // execute command @@ -483,17 +473,12 @@ void UPD7220::cmd_vecte() void UPD7220::cmd_texte() { if(_UPD7220_UGLY_PC98_HACK) { -// if(ead >= 0x20000) { // Negative -// ead = -(ead & 0x1ffff); -// } dx = (((ead & 0x3fff)% pitch) << 4) | (dad & 0x0f); dy = (ead & 0x3fff) / pitch; } else { dx = ((ead % pitch) << 4) | (dad & 0x0f); dy = ead / pitch; } -// dx = ((ead % pitch) << 4) | (dad & 0x0f); -// dy = ead / pitch; wrote_bytes = 1; // execute command @@ -1256,6 +1241,7 @@ void UPD7220::update_vect() d2 = (vect[5] | (vect[ 6] << 8)) & 0x3fff; d1 = (vect[7] | (vect[ 8] << 8)) & 0x3fff; dm = (vect[9] | (vect[10] << 8)) & 0x3fff; + dgd = ((vect[2] & 0x40) != 0) ? true : false; // if(dc & 0x2000) dc = -(dc & 0x1fff); // if(d & 0x2000) d = -(d & 0x1fff); // if(d2 & 0x2000) d2 = -(d2 & 0x1fff); @@ -1281,86 +1267,12 @@ void UPD7220::reset_vect() } -// draw -void UPD7220::draw_hline_diff(int xstart, int y, int xend) -{ - int nshift = 0; - int lwidth; - int nwidth = width << 3; - uint16_t dot; - int begin = 0; - int end = 0; - int dir = ((xstart == xend) ? 0 : ((xstart < xend) ? 1 : -1)); - - // Out of range, dummy shift. - bool req_outbound = false; - if(_UPD7220_UGLY_PC98_HACK) { - if(((xstart < 0) && (xend < 0)) || - ((xstart >= nwidth) && (xend >= nwidth)) || - ((y > 409) || ((y == 409) && ((xstart >= 384) && (xend >= 384)))) || - (y < 0)) { - req_outbound = true; - } - } else { - if((y >= height) || (y < 0) || - ((xstart < 0) && (xend < 0)) || - ((xstart >= nwidth) && (xend >= nwidth))) { - req_outbound = true; - } - } - if(req_outbound) { - int bits = xstart - xend; -// shift_pattern(bits); - return; - } - - // ToDo: WORD write - if(dir == 0) { - start_pset(); - draw_pset(xstart, y); - finish_pset(); - } else if(dir < 0) { - int xstart2 = xstart; - if((_UPD7220_UGLY_PC98_HACK) && ((y == 409) && (xstart >= 384))) xstart2 = 383; - int rshift = xstart2 - nwidth; -// shift_pattern(rshift); - if(xstart >= nwidth) { - xstart = nwidth - 1; - } - start_pset(); - for(int x = xstart2; x >= ((xend < 0) ? 0 : xend); x--) { - draw_pset(x, y); - } - finish_pset(); - if(xend < 0) { - int lshift = xend; -// shift_pattern(lshift); - } - } else { // dir > 0 - int xend2 = xend; - if((_UPD7220_UGLY_PC98_HACK) && ((y == 409) && (xend >= 384))) xend2 = 383; - if(xstart < 0) { - int rshift = 0 - xstart; -// shift_pattern(rshift); - xstart = 0; - } - start_pset(); - for(int x = xstart; x <= ((xend2 >= nwidth) ? (nwidth - 1) : xend2); x++) { - draw_pset(x, y); - } - finish_pset(); - if(xend >= nwidth) { - int lshift = xend2 - nwidth; -// shift_pattern(lshift); - } - } -} void UPD7220::draw_vectl() { pattern = ra[8] | (ra[9] << 8); -// out_debug_log(_T("DRAW VECTL: X=%d Y=%d to DC=%d DIR=%d PATTERN=%04x MODE=%d\n"), dx, dy, dc, dir, pattern, mod); + //out_debug_log(_T("DRAW VECTL: X=%d Y=%d to DC=%d D1=%d DIR=%d PATTERN=%04x MODE=%d\n"), dx, dy, dc, d1, dir, pattern, mod); dc = dc & 0x3fff; if(dc) { int x = dx; @@ -1370,127 +1282,72 @@ void UPD7220::draw_vectl() int stepy = 0; int stepn = 0; - //step = (((d1 << 14) / dc) + (1 << 14)) >> 1; + step = (((d1 << 12) / dc)) >> 1; //stepn = step & ((1 << 14) - 1); + start_pset(); switch(dir) { case 0: - start_pset(); for(int i = 0; i <= dc; i++) { - stepx = (int)((((d1 * i) / dc) + 1) >> 1); - //stepx += (step >> 14); - //stepn += stepn; - //if(stepn >= (1 << 14)) { - // stepn = stepn - (1 << 14); - // stepx++; - //} - draw_pset(x + stepx, y++); + //stepx = (int)((((d1 * i) / dc) + 1) >> 1); + stepx += step; + draw_pset_diff(x + (stepx >> 12), y++); } - finish_pset(); break; case 1: - start_pset(); for(int i = 0; i <= dc; i++) { - stepy = (int)((((d1 * i) / dc) + 1) >> 1); - //stepy += (step >> 14); - //stepn += stepn; - //if(stepn >= (1 << 14)) { - // stepn = stepn - (1 << 14); - // stepy++; - //} - draw_pset(x++, y + stepy); + //stepy = (int)((((d1 * i) / dc) + 1) >> 1); + stepy += step; + draw_pset_diff(x++, y + (stepy >> 12)); } - finish_pset(); break; case 2: - start_pset(); for(int i = 0; i <= dc; i++) { - stepy = (int)((((d1 * i) / dc) + 1) >> 1); - //stepy += (step >> 14); - //stepn += stepn; - //if(stepn >= (1 << 14)) { - // stepn = stepn - (1 << 14); - // stepy++; - //} - draw_pset(x++, y - stepy); - //draw_pset(x++, y - step); + //stepy = (int)((((d1 * i) / dc) + 1) >> 1); + stepy += step; + draw_pset_diff(x++, y - (stepy >> 12)); + //draw_pset_diff(x++, y - step); } - finish_pset(); break; case 3: - start_pset(); for(int i = 0; i <= dc; i++) { - stepx = (int)((((d1 * i) / dc) + 1) >> 1); - //stepx += (step >> 14); - //stepn += stepn; - //if(stepn >= (1 << 14)) { - // stepn = stepn - (1 << 14); - // stepx++; - //} - draw_pset(x + stepx, y--); + //stepx = (int)((((d1 * i) / dc) + 1) >> 1); + stepx += step; + draw_pset_diff(x + (stepx >> 12), y--); } - finish_pset(); break; case 4: - start_pset(); for(int i = 0; i <= dc; i++) { - stepx = (int)((((d1 * i) / dc) + 1) >> 1); - //stepx += (step >> 14); - //stepn += stepn; - //if(stepn >= (1 << 14)) { - // stepn = stepn - (1 << 14); - // stepx++; - //} - draw_pset(x - stepx, y--); + //stepx = (int)((((d1 * i) / dc) + 1) >> 1); + stepx += step; + draw_pset_diff(x - (stepx >> 12), y--); } - finish_pset(); break; case 5: - start_pset(); for(int i = 0; i <= dc; i++) { - stepy = (int)((((d1 * i) / dc) + 1) >> 1); - //stepy += (step >> 14); - //stepn += stepn; - //if(stepn >= (1 << 14)) { - // stepn = stepn - (1 << 14); - // stepy++; - //} - draw_pset(x--, y - stepy); +// stepy = (int)((((d1 * i) / dc) + 1) >> 1); + stepy += step; + draw_pset_diff(x--, y - (stepy >> 12)); } - finish_pset(); break; case 6: - start_pset(); for(int i = 0; i <= dc; i++) { - stepy = (int)((((d1 * i) / dc) + 1) >> 1); - //stepy += (step >> 14); - //stepn += stepn; - //if(stepn >= (1 << 14)) { - // stepn = stepn - (1 << 14); - // stepy++; - //} - draw_pset(x--, y + stepy); +// stepy = (int)((((d1 * i) / dc) + 1) >> 1); + stepy += step; + draw_pset_diff(x--, y + (stepy >> 12)); } - finish_pset(); break; case 7: - start_pset(); - //step = (int)((((d1 << 14) / dc) + (1 << 14)) >> 1); for(int i = 0; i <= dc; i++) { - stepx = (int)((((d1 * i) / dc) + 1) >> 1); - //stepx += (step >> 14); - //stepn += stepn; - //if(stepn >= (1 << 14)) { - // stepn = stepn - (1 << 14); - // stepx++; - //} - draw_pset(x - stepx, y++); + //stepx = (int)((((d1 * i) / dc) + 1) >> 1); + stepx += step; + draw_pset_diff(x - (stepx >> 12), y++); } - finish_pset(); break; } + finish_pset(); } else { start_pset(); - draw_pset(dx, dy); + draw_pset_diff(dx, dy); finish_pset(); wrote_bytes++; } @@ -1566,83 +1423,72 @@ void UPD7220::draw_vectc() int xbak = dx; int ybak = dy; if(m) { + start_pset(); switch(dir) { case 0: - start_pset(); for(int i = dm; i <= t; i++) { int s = (rt[(i << RT_TABLEBIT) / m] * d); s = (s + (1 << (RT_MULBIT - 1))) >> RT_MULBIT; - draw_pset((dx + s), (dy + i)); + draw_pset_diff((dx + s), (dy + i)); } - finish_pset(); break; case 1: - start_pset(); for(int i = dm; i <= t; i++) { int s = (rt[(i << RT_TABLEBIT) / m] * d); s = (s + (1 << (RT_MULBIT - 1))) >> RT_MULBIT; - draw_pset((dx + i), (dy + s)); + draw_pset_diff((dx + i), (dy + s)); } - finish_pset(); break; case 2: - start_pset(); for(int i = dm; i <= t; i++) { int s = (rt[(i << RT_TABLEBIT) / m] * d); s = (s + (1 << (RT_MULBIT - 1))) >> RT_MULBIT; - draw_pset((dx + i), (dy - s)); + draw_pset_diff((dx + i), (dy - s)); } - finish_pset(); break; case 3: - start_pset(); for(int i = dm; i <= t; i++) { int s = (rt[(i << RT_TABLEBIT) / m] * d); s = (s + (1 << (RT_MULBIT - 1))) >> RT_MULBIT; - draw_pset((dx + s), (dy - i)); + draw_pset_diff((dx + s), (dy - i)); } - finish_pset(); break; case 4: - start_pset(); for(int i = dm; i <= t; i++) { int s = (rt[(i << RT_TABLEBIT) / m] * d); s = (s + (1 << (RT_MULBIT - 1))) >> RT_MULBIT; - draw_pset((dx - s), (dy - i)); + draw_pset_diff((dx - s), (dy - i)); } - finish_pset(); break; case 5: - start_pset(); for(int i = dm; i <= t; i++) { int s = (rt[(i << RT_TABLEBIT) / m] * d); s = (s + (1 << (RT_MULBIT - 1))) >> RT_MULBIT; - draw_pset((dx - i), (dy - s)); + draw_pset_diff((dx - i), (dy - s)); } - finish_pset(); break; case 6: start_pset(); for(int i = dm; i <= t; i++) { int s = (rt[(i << RT_TABLEBIT) / m] * d); s = (s + (1 << (RT_MULBIT - 1))) >> RT_MULBIT; - draw_pset((dx - i), (dy + s)); + draw_pset_diff((dx - i), (dy + s)); } - finish_pset(); break; case 7: - start_pset(); for(int i = dm; i <= t; i++) { int s = (rt[(i << RT_TABLEBIT) / m] * d); s = (s + (1 << (RT_MULBIT - 1))) >> RT_MULBIT; - draw_pset((dx - s), (dy + i)); + draw_pset_diff((dx - s), (dy + i)); } - finish_pset(); break; } + finish_pset(); } else { - draw_pset(dx, dy); + start_pset(); + draw_pset_diff(dx, dy); + finish_pset(); //wrote_bytes++; } } @@ -1654,99 +1500,41 @@ void UPD7220::draw_vectr() int vx2 = vectdir[dir][2]; int vy2 = vectdir[dir][3]; int nwidth = width <<3; - int xbak = dx; int ybak = dy; pattern = ra[8] | (ra[9] << 8); - - +// out_debug_log(_T("DRAW VECTR: X=%d Y=%d to DC=%d DIR=%d PATTERN=%04x MODE=%d VX1=%d VY1=%d VX2=%d VY2=%d\n"), dx, dy, dc, dir, pattern, mod, vx1, vy1, vx2, vy2); start_pset(); - if(vy1 == 0) { - if(vx1 == 0) { - draw_pset(dx, dy); - } else { - draw_hline_diff(dx, dy, (vx1 < 0) ? (dx - d) : (dx + d)); - } - } else { - start_pset(); - for(int i = 0; i < d; i++) { - draw_pset(dx, dy); - dx += vx1; - dy += vy1; - } - finish_pset(); + for(int c = 0; c < d; c++) { + draw_pset_diff(dx, dy); + dx += vx1; + dy += vy1; } - xbak += (vx1 * d); - ybak += (vy1 * d); - finish_pset(); - dx = xbak; - dy = ybak; - start_pset(); - if(vy2 == 0) { - if(vx2 == 0) { - draw_pset(dx, dy); - } else { - draw_hline_diff(dx, dy, (vx2 < 0) ? (dx - d2) : (dx + d2)); - } - } else { - start_pset(); - for(int i = 0; i < d2; i++) { - draw_pset(dx, dy); - dx += vx2; - dy += vy2; - } - finish_pset(); + for(int c = 0; c < d2; c++) { + draw_pset_diff(dx, dy); + dx += vx2; + dy += vy2; } - xbak += (vx2 * d2); - ybak += (vy2 * d2); - finish_pset(); - dx = xbak; - dy = ybak; - start_pset(); - if(vy1 == 0) { - if(vx1 == 0) { - draw_pset(dx, dy); - } else { - draw_hline_diff(dx, dy, (vx1 < 0) ? (dx - d) : (dx + d)); - } - } else { - start_pset(); - for(int i = 0; i < d; i++) { - draw_pset(dx, dy); - dx -= vx1; - dy -= vy1; - } - finish_pset(); + for(int c = 0; c < d; c++) { + draw_pset_diff(dx, dy); + dx -= vx1; + dy -= vy1; } - xbak -= (vx1 * d); - ybak -= (vy1 * d); - finish_pset(); - dx = xbak; - dy = ybak; - - if(vy2 == 0) { - if(vx2 == 0) { - draw_pset(dx, dy); - } else { - draw_hline_diff(dx, dy, (vx2 < 0) ? (dx - d2) : (dx + d2)); - } - } else { - for(int i = 0; i < d2; i++) { - draw_pset(dx, dy); - dx -= vx2; - dy -= vy2; - } + for(int c = 0; c < d2; c++) { + draw_pset_diff(dx, dy); + dx -= vx2; + dy -= vy2; } - xbak -= (vx2 * d2); - ybak -= (vy2 * d2); + + finish_pset(); +// dx = xbak; +// dy = ybak; - dx = xbak; - dy = ybak; // ead = (dx >> 4) + dy * pitch; // dad = dx & 0x0f; } -#define STATE_VERSION 8 +#define STATE_VERSION 9 bool UPD7220::process_state(FILEIO* state_fio, bool loading) { @@ -1825,6 +1613,7 @@ bool UPD7220::process_state(FILEIO* state_fio, bool loading) state_fio->StateValue(d1); state_fio->StateValue(dm); state_fio->StateValue(pattern); + state_fio->StateValue(dgd); state_fio->StateValue(clock_freq); state_fio->StateValue(wrote_bytes); diff --git a/source/src/vm/upd7220.h b/source/src/vm/upd7220.h index 56114a9bd..2e339d461 100644 --- a/source/src/vm/upd7220.h +++ b/source/src/vm/upd7220.h @@ -107,6 +107,7 @@ protected: int rt[RT_TABLEMAX + 1]; int dx, dy; // from ead, dad int dir, dif, sl, dc, d, d2, d1, dm; + bool dgd; uint16_t pattern; const int vectdir[16][4] = { { 0, 1, 1, 0}, { 1, 1, 1,-1}, { 1, 0, 0,-1}, { 1,-1,-1,-1}, @@ -173,7 +174,6 @@ protected: inline void start_pset(); inline void finish_pset(); inline bool draw_pset_diff(int x, int y); - void draw_hline_diff(int xstart, int y, int xend); inline void shift_pattern(int shift); public: @@ -297,16 +297,18 @@ public: inline void UPD7220::draw_pset(int x, int y) { + uint32_t addr = y * width + (x >> 3); if(_UPD7220_UGLY_PC98_HACK) { - if((y == 409) && (x >= 384)) return; - if(y > 409) return; - if((x < 0) || (y < 0) || (x >= (width << 3))) return; +// if(addr >= 0x8000) return; +// if((y == 409) && (x >= 384)) return; +// if(y > 409) return; +// if((x < 0) || (y < 0) || (x >= (width << 3))) return; +// addr = addr & 0x7fff; } else { if((x < 0) || (y < 0) || (x >= (width << 3)) || (y >= height)) return; } uint16_t dot = pattern & 1; pattern = (pattern >> 1) | (dot << 15); - uint32_t addr = y * width + (x >> 3); uint8_t bit; if(_UPD7220_MSB_FIRST) { bit = 0x80 >> (x & 7); @@ -384,19 +386,20 @@ inline bool UPD7220::draw_pset_diff(int x, int y) uint32_t addr = y * width + (x >> 3); uint8_t bit; - if(_UPD7220_UGLY_PC98_HACK) { - if((y > 409) || ((y == 409) && x >= 384)){ - finish_pset(); - return false; - } - else if((x < 0) || (y < 0) || (x >= (width << 3))) { - finish_pset(); - return false; - } - } else if((x < 0) || (y < 0) || (x >= (width << 3)) || (y >= height)) { - finish_pset(); - return false; - } +// if(_UPD7220_UGLY_PC98_HACK) { +// if(addr >= 0x8000) { +// if((y > 409) || ((y == 409) && x >= 384)){ +// finish_pset(); +// return false; +// } +// else if((x < 0) || (y < 0) || (x >= (width << 3))) { +// finish_pset(); +// return false; +// } +// } else if((x < 0) || (y < 0) || (x >= (width << 3)) || (y >= height)) { +// finish_pset(); +// return false; +// } if((first_load) || (addr != before_addr)) { if(!(first_load)) { write_vram(before_addr, cache_val); -- 2.11.0