UINT32 offtwall_state::screen_update_offtwall(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { atarimo_rect_list rectlist; bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { UINT16 *mo = &mobitmap->pix16(y); UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { /* not yet verified */ pf[x] = mo[x]; /* erase behind ourselves */ mo[x] = 0; } } return 0; }
UINT32 klax_state::screen_update_klax(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { atarimo_rect_list rectlist; bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { UINT16 *mo = &mobitmap->pix16(y); UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { /* verified from schematics: PFPRI if (PFS7-4 == 0 || LBPIX3-0 == 0) */ if ((pf[x] & 0xf0) != 0xf0) pf[x] = mo[x]; /* erase behind ourselves */ mo[x] = 0; } } return 0; }
UINT32 rampart_state::screen_update_rampart(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { atarimo_rect_list rectlist; bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ rampart_bitmap_render(bitmap, cliprect); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { UINT16 *mo = &mobitmap->pix16(y); UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { /* the PCB supports more complex priorities, but the PAL is not stuffed, so we get the default */ pf[x] = mo[x]; /* erase behind ourselves */ mo[x] = 0; } } return 0; }
void atarisys2_vh_screenrefresh(struct osd_bitmap *bitmap, int full_refresh) { /* recalc the palette if necessary */ if (palette_recalc()) ataripf_invalidate(0); /* draw the layers */ ataripf_render(0, bitmap); atarimo_render(0, bitmap, overrender_callback, NULL); atarian_render(0, bitmap); }
UINT32 shuuz_state::screen_update_shuuz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { atarimo_rect_list rectlist; bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { UINT16 *mo = &mobitmap->pix16(y); UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { /* verified from the GALs on the real PCB; equations follow * * --- O13 is 1 if (PFS7-4 == 0xf) * O13=PFS6*PFS7*(PFS5&PFS4) * * --- PF/M is 1 if MOs have priority, or 0 if playfield has priority * MO/PF=!PFS7*!(LBD7&LBD6)*!M1*!O13 * +!PFS7*!(LBD7&LBD6)*!M2*!O13 * +!PFS7*!(LBD7&LBD6)*!M3*!O13 * +PFS7*(LBD7&LBD6)*!M1*!O13 * +PFS7*(LBD7&LBD6)*!M2*!O13 * +PFS7*(LBD7&LBD6)*!M3*!O13 * */ int o13 = ((pf[x] & 0xf0) == 0xf0); int mopf = 0; /* compute the MO/PF signal */ if ((!(pf[x] & 0x80) && ((mo[x] & 0xc0) != 0xc0) && ((mo[x] & 0x0e) != 0x00) && !o13) || ((pf[x] & 0x80) && ((mo[x] & 0xc0) == 0xc0) && ((mo[x] & 0x0e) != 0x00) && !o13)) mopf = 1; /* if MO/PF is 1, we draw the MO */ if (mopf) pf[x] = mo[x]; /* erase behind ourselves */ mo[x] = 0; } } return 0; }
UINT32 toobin_state::screen_update_toobin(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap_ind8 &priority_bitmap = machine().priority_bitmap; const rgb_t *palette = palette_entry_list_adjusted(machine().palette); atarimo_rect_list rectlist; bitmap_ind16 *mobitmap; int x, y; /* draw the playfield */ priority_bitmap.fill(0, cliprect); m_playfield_tilemap->draw(m_pfbitmap, cliprect, 0, 0); m_playfield_tilemap->draw(m_pfbitmap, cliprect, 1, 1); m_playfield_tilemap->draw(m_pfbitmap, cliprect, 2, 2); m_playfield_tilemap->draw(m_pfbitmap, cliprect, 3, 3); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT32 *dest = &bitmap.pix32(y); UINT16 *mo = &mobitmap->pix16(y); UINT16 *pf = &m_pfbitmap.pix16(y); UINT8 *pri = &priority_bitmap.pix8(y); for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 pix = pf[x]; if (mo[x]) { /* not verified: logic is all controlled in a PAL factors: LBPRI1-0, LBPIX3, ANPIX1-0, PFPIX3, PFPRI1-0, (~LBPIX3 & ~LBPIX2 & ~LBPIX1 & ~LBPIX0) */ /* only draw if not high priority PF */ if (!pri[x] || !(pix & 8)) pix = mo[x]; /* erase behind ourselves */ mo[x] = 0; } dest[x] = palette[pix]; } } /* add the alpha on top */ m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; }
void shuuz_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh) { /* mark the used colors */ palette_init_used_colors(); ataripf_mark_palette(0); atarimo_mark_palette(0); /* update the palette, and mark things dirty if we need to */ if (palette_recalc()) ataripf_invalidate(0); /* draw the layers */ ataripf_render(0, bitmap); atarimo_render(0, bitmap, overrender_callback, NULL); }
UINT32 vindictr_state::screen_update_vindictr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { atarimo_rect_list rectlist; bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { UINT16 *mo = &mobitmap->pix16(y); UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { /* partially verified via schematics (there are a lot of PALs involved!): SHADE = PAL(MPR1-0, LB7-0, PFX6-5, PFX3-2, PF/M) if (SHADE) CRA |= 0x100 MOG3-1 = ~MAT3-1 if MAT6==1 and MSD3==1 */ int mopriority = mo[x] >> ATARIMO_PRIORITY_SHIFT; /* upper bit of MO priority signals special rendering and doesn't draw anything */ if (mopriority & 4) continue; /* MO pen 1 doesn't draw, but it sets the SHADE flag and bumps the palette offset */ if ((mo[x] & 0x0f) == 1) { if ((mo[x] & 0xf0) != 0) pf[x] |= 0x100; } else pf[x] = mo[x] & ATARIMO_DATA_MASK; /* don't erase yet -- we need to make another pass later */ } } /* add the alpha on top */ m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); /* now go back and process the upper bit of MO priority */ rectlist.rect -= rectlist.numrects; for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { UINT16 *mo = &mobitmap->pix16(y); UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { int mopriority = mo[x] >> ATARIMO_PRIORITY_SHIFT; /* upper bit of MO priority might mean palette kludges */ if (mopriority & 4) { /* if bit 2 is set, start setting high palette bits */ if (mo[x] & 2) atarimo_mark_high_palette(bitmap, pf, mo, x, y); /* if the upper bit of pen data is set, we adjust the final intensity */ if (mo[x] & 8) pf[x] |= (~mo[x] & 0xe0) << 6; } /* erase behind ourselves */ mo[x] = 0; } } return 0; }
UINT32 thunderj_state::screen_update_thunderj(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { bitmap_ind8 &priority_bitmap = machine().priority_bitmap; atarimo_rect_list rectlist; bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ priority_bitmap.fill(0, cliprect); m_playfield_tilemap->draw(bitmap, cliprect, 0, 0x00); m_playfield_tilemap->draw(bitmap, cliprect, 1, 0x01); m_playfield_tilemap->draw(bitmap, cliprect, 2, 0x02); m_playfield_tilemap->draw(bitmap, cliprect, 3, 0x03); m_playfield2_tilemap->draw(bitmap, cliprect, 0, 0x80); m_playfield2_tilemap->draw(bitmap, cliprect, 1, 0x84); m_playfield2_tilemap->draw(bitmap, cliprect, 2, 0x88); m_playfield2_tilemap->draw(bitmap, cliprect, 3, 0x8c); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { UINT16 *mo = &mobitmap->pix16(y); UINT16 *pf = &bitmap.pix16(y); UINT8 *pri = &priority_bitmap.pix8(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { /* verified from the GALs on the real PCB; equations follow * * --- PF/M is 1 if playfield has priority, or 0 if MOs have priority * PF/M=MPX0*!MPX1*!MPX2*!MPX3*!MPX4*!MPX5*!MPX6*!MPX7 * +PFX3*PFX8*PFX9*!MPR0 * +PFX3*PFX8*!MPR0*!MPR1 * +PFX3*PFX9*!MPR1 * * --- CS1 is 1 if the playfield should be displayed * CS1=PF/M*!ALBG*!APIX0*!APIX1 * +!MPX0*!MPX1*!MPX2*!MPX3*!ALBG*!APIX0*!APIX1 * * --- CS0 is 1 if the MOs should be displayed * CS0=!PF/M*MPX0*!ALBG*!APIX0*!APIX1 * +!PF/M*MPX1*!ALBG*!APIX0*!APIX1 * +!PF/M*MPX2*!ALBG*!APIX0*!APIX1 * +!PF/M*MPX3*!ALBG*!APIX0*!APIX1 * * --- CRA10 is the 0x200 bit of the color RAM index; set if pf is displayed * CRA10:=CS1 * * --- CRA9 is the 0x100 bit of the color RAM index; set if mo is displayed * or if the playfield selected is playfield #2 * CRA9:=PFXS*CS1 * +!CS1*CS0 * * --- CRA8-1 are the low 8 bits of the color RAM index; set as expected * CRA8:=CS1*PFX7 * +!CS1*MPX7*CS0 * +!CS1*!CS0*ALC4 * * CRA7:=CS1*PFX6 * +!CS1*MPX6*CS0 * * CRA6:=CS1*PFX5 * +MPX5*!CS1*CS0 * +!CS1*!CS0*ALC3 * * CRA5:=CS1*PFX4 * +MPX4*!CS1*CS0 * +!CS1*ALC2*!CS0 * * CRA4:=CS1*PFX3 * +!CS1*MPX3*CS0 * +!CS1*!CS0*ALC1 * * CRA3:=CS1*PFX2 * +MPX2*!CS1*CS0 * +!CS1*!CS0*ALC0 * * CRA2:=CS1*PFX1 * +MPX1*!CS1*CS0 * +!CS1*!CS0*APIX1 * * CRA1:=CS1*PFX0 * +MPX0*!CS1*CS0 * +!CS1*!CS0*APIX0 */ int mopriority = mo[x] >> ATARIMO_PRIORITY_SHIFT; int pfm = 0; /* upper bit of MO priority signals special rendering and doesn't draw anything */ if (mopriority & 4) continue; /* determine pf/m signal */ if ((mo[x] & 0xff) == 1) pfm = 1; else if (pf[x] & 8) { int pfpriority = (pri[x] & 0x80) ? ((pri[x] >> 2) & 3) : (pri[x] & 3); if (((pfpriority == 3) && !(mopriority & 1)) || ((pfpriority & 1) && (mopriority == 0)) || ((pfpriority & 2) && !(mopriority & 2))) pfm = 1; } /* if pfm is low, we display the mo */ if (!pfm) pf[x] = mo[x] & ATARIMO_DATA_MASK; /* don't erase yet -- we need to make another pass later */ } }