void irobot_run_video(void) { UINT16 *combase16 = (UINT16 *)irobot_combase; int sx,sy,ex,ey,sx2,ey2; int color; unsigned int d1; int lpnt,spnt,spnt2; int shp; INT32 word1,word2; logerror("Starting Polygon Generator, Clear=%d\n",irvg_clear); if (irobot_bufsel) polybitmap = polybitmap2; else polybitmap = polybitmap1; lpnt=0; while (lpnt < 0x7FF) { d1 = combase16[lpnt++]; if (d1 == 0xFFFF) break; spnt = d1 & 0x07FF; shp = (d1 & 0xF000) >> 12; /* Pixel */ if (shp == 0x8) { while (spnt < 0x7FF) { sx = combase16[spnt]; if (sx == 0xFFFF) break; sy = combase16[spnt+1]; color = sy & 0x3F; sx = ROUND_TO_PIXEL(sx); sy = ROUND_TO_PIXEL(sy); if (sx >= ir_xmin && sx < ir_xmax && sy >= ir_ymin && sy < ir_ymax) draw_pixel(sx,sy,color); spnt+=2; }//while object }//if point /* Line */ if (shp == 0xC) { while (spnt < 0x7FF) { ey = combase16[spnt]; if (ey == 0xFFFF) break; ey = ROUND_TO_PIXEL(ey); sy = combase16[spnt+1]; color = sy & 0x3F; sy = ROUND_TO_PIXEL(sy); sx = combase16[spnt+3]; word1 = (INT16)combase16[spnt+2]; ex = sx + word1 * (ey - sy + 1); draw_line(ROUND_TO_PIXEL(sx),sy,ROUND_TO_PIXEL(ex),ey,color); spnt+=4; }//while object }//if line /* Polygon */ if (shp == 0x4) { spnt2 = combase16[spnt] & 0x7FF; sx = combase16[spnt+1]; sx2 = combase16[spnt+2]; sy = combase16[spnt+3]; color = sy & 0x3F; sy = ROUND_TO_PIXEL(sy); spnt+=4; word1 = (INT16)combase16[spnt]; ey = combase16[spnt+1]; if (word1 != -1 || ey != 0xFFFF) { ey = ROUND_TO_PIXEL(ey); spnt+=2; // sx += word1; word2 = (INT16)combase16[spnt2]; ey2 = ROUND_TO_PIXEL(combase16[spnt2+1]); spnt2+=2; // sx2 += word2; while(1) { if (sy >= ir_ymin && sy < ir_ymax) { int x1 = ROUND_TO_PIXEL(sx); int x2 = ROUND_TO_PIXEL(sx2); int temp; if (x1 > x2) temp = x1, x1 = x2, x2 = temp; if (x1 < ir_xmin) x1 = ir_xmin; if (x2 >= ir_xmax) x2 = ir_xmax - 1; if (x1 < x2) fill_hline(x1 + 1, x2, sy, color); } sy++; if (sy > ey) { word1 = (INT16)combase16[spnt]; ey = combase16[spnt+1]; if (word1 == -1 && ey == 0xFFFF) break; ey = ROUND_TO_PIXEL(ey); spnt+=2; } else sx += word1; if (sy > ey2) { word2 = (INT16)combase16[spnt2]; ey2 = ROUND_TO_PIXEL(combase16[spnt2+1]); spnt2+=2; } else sx2 += word2; } //while polygon }//if at least 2 sides } //if polygon } //while object }
void irobot_run_video(running_machine &machine) { irobot_state *state = machine.driver_data<irobot_state>(); UINT8 *polybitmap; UINT16 *combase16 = (UINT16 *)state->m_combase; int sx,sy,ex,ey,sx2,ey2; int color; UINT32 d1; int lpnt,spnt,spnt2; int shp; INT32 word1,word2; logerror("Starting Polygon Generator, Clear=%d\n",state->m_vg_clear); if (state->m_bufsel) polybitmap = state->m_polybitmap2; else polybitmap = state->m_polybitmap1; lpnt=0; while (lpnt < 0x7ff) { d1 = combase16[lpnt++]; if (d1 == 0xffff) break; spnt = d1 & 0x07ff; shp = (d1 & 0xf000) >> 12; /* pixel */ if (shp == 0x8) { while (spnt < 0x7ff) { sx = combase16[spnt]; if (sx == 0xffff) break; sy = combase16[spnt+1]; color = sy & 0x3f; sx = ROUND_TO_PIXEL(sx); sy = ROUND_TO_PIXEL(sy); if (sx >= state->m_ir_xmin && sx < state->m_ir_xmax && sy >= state->m_ir_ymin && sy < state->m_ir_ymax) draw_pixel(sx,sy,color); spnt+=2; }//while object }//if point /* line */ if (shp == 0xc) { while (spnt < 0x7ff) { ey = combase16[spnt]; if (ey == 0xffff) break; ey = ROUND_TO_PIXEL(ey); sy = combase16[spnt+1]; color = sy & 0x3f; sy = ROUND_TO_PIXEL(sy); sx = combase16[spnt+3]; word1 = (INT16)combase16[spnt+2]; ex = sx + word1 * (ey - sy + 1); draw_line(machine, polybitmap, ROUND_TO_PIXEL(sx),sy,ROUND_TO_PIXEL(ex),ey,color); spnt+=4; }//while object }//if line /* polygon */ if (shp == 0x4) { spnt2 = combase16[spnt] & 0x7ff; sx = combase16[spnt+1]; sx2 = combase16[spnt+2]; sy = combase16[spnt+3]; color = sy & 0x3f; sy = ROUND_TO_PIXEL(sy); spnt+=4; word1 = (INT16)combase16[spnt]; ey = combase16[spnt+1]; if (word1 != -1 || ey != 0xffff) { ey = ROUND_TO_PIXEL(ey); spnt+=2; // sx += word1; word2 = (INT16)combase16[spnt2]; ey2 = ROUND_TO_PIXEL(combase16[spnt2+1]); spnt2+=2; // sx2 += word2; while(1) { if (sy >= state->m_ir_ymin && sy < state->m_ir_ymax) { int x1 = ROUND_TO_PIXEL(sx); int x2 = ROUND_TO_PIXEL(sx2); int temp; if (x1 > x2) temp = x1, x1 = x2, x2 = temp; if (x1 < state->m_ir_xmin) x1 = state->m_ir_xmin; if (x2 >= state->m_ir_xmax) x2 = state->m_ir_xmax - 1; if (x1 < x2) fill_hline(x1 + 1, x2, sy, color); } sy++; if (sy > ey) { word1 = (INT16)combase16[spnt]; ey = combase16[spnt+1]; if (word1 == -1 && ey == 0xffff) break; ey = ROUND_TO_PIXEL(ey); spnt+=2; } else sx += word1; if (sy > ey2) { word2 = (INT16)combase16[spnt2]; ey2 = ROUND_TO_PIXEL(combase16[spnt2+1]); spnt2+=2; } else sx2 += word2; } //while polygon }//if at least 2 sides } //if polygon } //while object }