OSDN Git Service

[VM][PC9801][UPD7220][DISPLAY][GDC] Fix wrond addressing.Fix wrond drawing "BATTLE...
authorK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 5 Jun 2019 11:45:17 +0000 (20:45 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 5 Jun 2019 11:45:17 +0000 (20:45 +0900)
source/src/vm/pc9801/display.cpp
source/src/vm/upd7220.cpp
source/src/vm/upd7220.h

index a7eb162..c6d4410 100644 (file)
@@ -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
index 7f295c5..b745d58 100644 (file)
@@ -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);
index 56114a9..2e339d4 100644 (file)
@@ -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);