UINT32 sealy_state::screen_update_sealy(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(m_palette->black_pen(), cliprect); return 0; }
UINT32 malzak_state::screen_update_malzak(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { const rgb_t *palette = m_palette->palette()->entry_list_raw(); int sx, sy; int x,y; bitmap.fill(rgb_t::black); m_trom->screen_update(screen, bitmap, cliprect); // playfield - not sure exactly how this works... for (x = 0; x < 16; x++) for (y = 0; y < 16; y++) { sx = ((x * 16 - 48) - m_malzak_x) * 2; sy = ((y * 16) - m_malzak_y) * 2; if (sx < -271*2) sx += 512*2; if (sx < -15*2) sx += 256*2; m_gfxdecode->m_gfx[0]->zoom_transpen(bitmap,cliprect, m_playfield_code[x * 16 + y], 2, 0, 0, sx, sy, 0x20000, 0x20000, 0); } /* update the S2636 chips */ bitmap_ind16 &s2636_0_bitmap = m_s2636_0->update(cliprect); bitmap_ind16 &s2636_1_bitmap = m_s2636_1->update(cliprect); /* copy the S2636 images into the main bitmap */ { int y; for (y = cliprect.min_y; y <= cliprect.max_y / 2; y++) { int x; for (x = cliprect.min_x; x <= cliprect.max_x / 2; x++) { int pixel0 = s2636_0_bitmap.pix16(y, x); int pixel1 = s2636_1_bitmap.pix16(y, x); if (S2636_IS_PIXEL_DRAWN(pixel0)) { bitmap.pix32(y*2, x*2) = palette[S2636_PIXEL_COLOR(pixel0)]; bitmap.pix32(y*2+1, x*2) = palette[S2636_PIXEL_COLOR(pixel0)]; bitmap.pix32(y*2, x*2+1) = palette[S2636_PIXEL_COLOR(pixel0)]; bitmap.pix32(y*2+1, x*2+1) = palette[S2636_PIXEL_COLOR(pixel0)]; } if (S2636_IS_PIXEL_DRAWN(pixel1)) { bitmap.pix32(y*2, x*2) = palette[S2636_PIXEL_COLOR(pixel1)]; bitmap.pix32(y*2+1, x*2) = palette[S2636_PIXEL_COLOR(pixel1)]; bitmap.pix32(y*2, x*2+1) = palette[S2636_PIXEL_COLOR(pixel1)]; bitmap.pix32(y*2+1, x*2+1) = palette[S2636_PIXEL_COLOR(pixel1)]; } } } } return 0; }
// AM_RANGE(0x80, 0x80) AM_WRITE(bl2out_w) // AM_RANGE(0x90, 0x90) AM_WRITE(gr2out_w) // AM_RANGE(0xa0, 0xa0) AM_WRITE(rd2out_w) // AM_RANGE(0xb0, 0xb0) AM_WRITE(clrg2_w) // AM_RANGE(0xc0, 0xc0) AM_WRITE(bluout_w) // AM_RANGE(0xd0, 0xd0) AM_WRITE(grnout_w) // AM_RANGE(0xe0, 0xe0) AM_WRITE(redout_w) // AM_RANGE(0xf0, 0xf0) AM_WRITE(clrg1_w) ADDRESS_MAP_END /* //------------------------------------------------- // ADDRESS_MAP( grip5_mem ) //------------------------------------------------- static ADDRESS_MAP_START( grip5_mem, AS_PROGRAM, 8, grip5_state ) AM_RANGE(0x0000, 0x3fff) AM_ROMBANK("eprom") AM_RANGE(0x4000, 0x5fff) AM_RAM AM_RANGE(0x8000, 0xffff) AM_RAMBANK("videoram") ADDRESS_MAP_END //------------------------------------------------- // ADDRESS_MAP( grip5_io ) //------------------------------------------------- static ADDRESS_MAP_START( grip5_io, AS_IO, 8, grip5_device ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READWRITE(cxstb_r, cxstb_w) AM_RANGE(0x10, 0x10) AM_WRITE(eprom_w) AM_RANGE(0x11, 0x11) AM_WRITE(vol0_w) // AM_RANGE(0x12, 0x12) AM_WRITE(rts_w) AM_RANGE(0x13, 0x13) AM_WRITE(page_w) // AM_RANGE(0x14, 0x14) AM_WRITE(str_w) // AM_RANGE(0x15, 0x15) AM_WRITE(intl_w) AM_RANGE(0x16, 0x16) AM_WRITE(dpage_w) AM_RANGE(0x17, 0x17) AM_WRITE(vol1_w) AM_RANGE(0x20, 0x2f) AM_DEVREADWRITE_LEGACY(Z80STI_TAG, z80sti_r, z80sti_w) AM_RANGE(0x30, 0x30) AM_READWRITE(lrs_r, lrs_w) AM_RANGE(0x40, 0x40) AM_READ(stat_r) AM_RANGE(0x50, 0x50) AM_DEVWRITE(HD6345_TAG, hd6345_device, address_w) AM_RANGE(0x52, 0x52) AM_DEVWRITE(HD6345_TAG, hd6345_device, register_w) AM_RANGE(0x53, 0x53) AM_DEVREAD(HD6345_TAG, hd6345_device, register_r) AM_RANGE(0x60, 0x60) AM_DEVWRITE_LEGACY(CENTRONICS_TAG, centronics_data_w) AM_RANGE(0x70, 0x73) AM_DEVREADWRITE(I8255A_TAG, i8255_device, read, write) // AM_RANGE(0x80, 0x80) AM_WRITE(xrflgs_w) // AM_RANGE(0xc0, 0xc0) AM_WRITE(xrclrg_w) // AM_RANGE(0xe0, 0xe0) AM_WRITE(xrclu0_w) // AM_RANGE(0xe1, 0xe1) AM_WRITE(xrclu1_w) // AM_RANGE(0xe2, 0xe2) AM_WRITE(xrclu2_w) // AM_RANGE(0x80, 0x80) AM_WRITE(bl2out_w) // AM_RANGE(0x90, 0x90) AM_WRITE(gr2out_w) // AM_RANGE(0xa0, 0xa0) AM_WRITE(rd2out_w) // AM_RANGE(0xb0, 0xb0) AM_WRITE(clrg2_w) // AM_RANGE(0xc0, 0xc0) AM_WRITE(bluout_w) // AM_RANGE(0xd0, 0xd0) AM_WRITE(grnout_w) // AM_RANGE(0xe0, 0xe0) AM_WRITE(redout_w) // AM_RANGE(0xf0, 0xf0) AM_WRITE(clrg1_w) ADDRESS_MAP_END */ //************************************************************************** // DEVICE CONFIGURATION //************************************************************************** //------------------------------------------------- // mc6845_interface crtc_intf //------------------------------------------------- void grip_device::crtc_update_row(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param) { int column, bit; for (column = 0; column < x_count; column++) { UINT16 address = (m_page << 12) | (((ma + column) & 0xfff) << 3) | (ra & 0x07); UINT8 data = m_video_ram[address]; for (bit = 0; bit < 8; bit++) { int x = (column * 8) + bit; int color = m_flash ? 0 : BIT(data, bit); bitmap.pix32(y, x) = RGB_MONOCHROME_WHITE[color]; } } }
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(rgb_t::black(), cliprect); return 0; }
UINT32 nubus_xceedmc30_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { UINT32 *scanline; int x, y; UINT8 pixels, *vram; // first time? kick off the VBL timer if (!m_screen) { m_screen = &screen; m_timer->adjust(m_screen->time_until_pos(479, 0), 0); } vram = m_vram + (4*1024); switch (m_mode) { case 0: // 1 bpp? for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/8; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels>>7)&1]; *scanline++ = m_palette[(pixels>>6)&1]; *scanline++ = m_palette[(pixels>>5)&1]; *scanline++ = m_palette[(pixels>>4)&1]; *scanline++ = m_palette[(pixels>>3)&1]; *scanline++ = m_palette[(pixels>>2)&1]; *scanline++ = m_palette[(pixels>>1)&1]; *scanline++ = m_palette[pixels&1]; } } break; case 1: // 2 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/4; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[((pixels>>6)&3)]; *scanline++ = m_palette[((pixels>>4)&3)]; *scanline++ = m_palette[((pixels>>2)&3)]; *scanline++ = m_palette[(pixels&3)]; } } break; case 2: // 4 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/2; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels>>4)]; *scanline++ = m_palette[(pixels&0xf)]; } } break; case 3: // 8 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[pixels]; } } break; case 4: // 24 bpp { UINT32 *vram32 = (UINT32 *)vram; UINT32 *base; for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); base = &vram32[y * 1024]; for (x = 0; x < 640; x++) { *scanline++ = *base++; } } } break; default: fatalerror("xceedmc30: unknown video mode %d\n", m_mode); break; } return 0; }
UINT32 nubus_cb264_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { UINT32 *scanline, *base; int x, y; UINT8 pixels; if (!m_cb264_vbl_disable) { raise_slot_irq(); } switch (m_cb264_mode) { case 0: // 1 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/8; x++) { pixels = m_vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[pixels&0x80]; *scanline++ = m_palette[(pixels<<1)&0x80]; *scanline++ = m_palette[(pixels<<2)&0x80]; *scanline++ = m_palette[(pixels<<3)&0x80]; *scanline++ = m_palette[(pixels<<4)&0x80]; *scanline++ = m_palette[(pixels<<5)&0x80]; *scanline++ = m_palette[(pixels<<6)&0x80]; *scanline++ = m_palette[(pixels<<7)&0x80]; } } break; case 1: // 2 bpp (3f/7f/bf/ff) for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/4; x++) { pixels = m_vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[pixels&0xc0]; *scanline++ = m_palette[(pixels<<2)&0xc0]; *scanline++ = m_palette[(pixels<<4)&0xc0]; *scanline++ = m_palette[(pixels<<6)&0xc0]; } } break; case 2: // 4 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/2; x++) { pixels = m_vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[pixels&0xf0]; *scanline++ = m_palette[(pixels<<4)&0xf0]; } } break; case 3: // 8 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640; x++) { pixels = m_vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[pixels]; } } break; case 4: // 24 bpp case 7: // ??? { UINT32 *vram32 = (UINT32 *)&m_vram[0]; for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); base = &vram32[y * 1024]; for (x = 0; x < 640; x++) { *scanline++ = *base++; } } } break; default: fatalerror("cb264: unknown video mode %d\n", m_cb264_mode); } return 0; }
UINT32 archimedes_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int xstart,ystart,xend,yend; int res_x,res_y; int xsize,ysize; int calc_dxs = 0,calc_dxe = 0; const UINT8 x_step[4] = { 5, 7, 11, 19 }; /* border color */ bitmap.fill(machine().pens[0x10], cliprect); /* define X display area through BPP mode register */ calc_dxs = (m_vidc_regs[VIDC_HDSR]*2)+x_step[m_vidc_bpp_mode & 3]; calc_dxe = (m_vidc_regs[VIDC_HDER]*2)+x_step[m_vidc_bpp_mode & 3]; /* now calculate display clip rectangle start/end areas */ xstart = (calc_dxs)-m_vidc_regs[VIDC_HBSR]; ystart = (m_vidc_regs[VIDC_VDSR])-m_vidc_regs[VIDC_VBSR]; xend = (calc_dxe)+xstart; yend = m_vidc_regs[VIDC_VDER]+ystart; /* disable the screen if display params are invalid */ if(xstart > xend || ystart > yend) return 0; xsize = calc_dxe-calc_dxs; ysize = m_vidc_regs[VIDC_VDER]-m_vidc_regs[VIDC_VDSR]; { int count; int x,y,xi; UINT8 pen; static UINT8 *vram = machine().root_device().memregion("vram")->base(); count = (0); switch(m_vidc_bpp_mode) { case 0: //1 bpp { for(y=0;y<ysize;y++) { for(x=0;x<xsize;x+=8) { pen = vram[count]; for(xi=0;xi<8;xi++) { res_x = x+xi+xstart; res_y = (y+ystart)*(m_vidc_interlace+1); if(m_vidc_interlace) { if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend) bitmap.pix32(res_y, res_x) = machine().pens[(pen>>(xi))&0x1]; if (cliprect.contains(res_x, res_y+1) && (res_x) <= xend && (res_y+1) <= yend) bitmap.pix32(res_y+1, res_x) = machine().pens[(pen>>(xi))&0x1]; } else { if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend) bitmap.pix32(res_y, res_x) = machine().pens[(pen>>(xi))&0x1]; } } count++; } } } break; case 3: //8 bpp { for(y=0;y<ysize;y++) { for(x=0;x<xsize;x++) { pen = vram[count]; res_x = x+xstart; res_y = (y+ystart)*(m_vidc_interlace+1); if(m_vidc_interlace) { if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend) bitmap.pix32(res_y, res_x) = machine().pens[(pen&0xff)+0x100]; if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y+1) <= yend) bitmap.pix32(res_y+1, res_x) = machine().pens[(pen&0xff)+0x100]; } else { if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend) bitmap.pix32(res_y, res_x) = machine().pens[(pen&0xff)+0x100]; } count++; } } } break; } }
/* Mix the 2 sprite planes with the already rendered tilemaps.. note, if we implement tilemap blending etc. too we'll probably have to mix those in here as well.. this is just a reimplementation of the old priority system used before conversion but to work with the bitmaps. It could probably be simplified / improved greatly, along with the long-standing bugs fixed, with manual mixing you have full control. apparently priority is based on a PROM, that should be used if possible. */ void boogwing_state::mix_boogwing(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int y, x; const pen_t *paldata = &m_palette->pen(0); bitmap_ind16 *sprite_bitmap1, *sprite_bitmap2; bitmap_ind8* priority_bitmap; address_space &space = machine().dummy_space(); uint16_t priority = m_decocomn->priority_r(space, 0, 0xffff); sprite_bitmap1 = &m_sprgen1->get_sprite_temp_bitmap(); sprite_bitmap2 = &m_sprgen2->get_sprite_temp_bitmap(); priority_bitmap = &screen.priority(); uint32_t* dstline; uint16_t *srcline1, *srcline2; uint8_t *srcpriline; for (y=cliprect.min_y;y<=cliprect.max_y;y++) { srcline1=&sprite_bitmap1->pix16(y,0); srcline2=&sprite_bitmap2->pix16(y,0); srcpriline=&priority_bitmap->pix8(y,0); dstline=&bitmap.pix32(y,0); for (x=cliprect.min_x;x<=cliprect.max_x;x++) { uint16_t pix1 = srcline1[x]; uint16_t pix2 = srcline2[x]; /* Here we have pix1 - raw pixel / colour / priority data from first 1sdt chip pix2 - raw pixel / colour / priority data from first 2nd chip */ int pri1, pri2; int spri1, spri2, alpha2; alpha2 = 0xff; // pix1 sprite vs pix2 sprite if (pix1 & 0x400) // todo - check only in pri mode 2?? spri1 = 8; else spri1 = 32; // pix1 sprite vs playfield switch (priority) { case 0x01: { if ((pix1 & 0x600)) pri1 = 16; else pri1 = 64; } break; default: { if ((pix1 & 0x600) == 0x600) pri1 = 4; else if ((pix1 & 0x600) == 0x400) pri1 = 16; else pri1 = 64; } break; } // pix2 sprite vs pix1 sprite if ((pix2 & 0x600) == 0x600) spri2 = 4; else if ((pix2 & 0x600)) spri2 = 16; else spri2 = 64; // Transparency if (pix2 & 0x100) alpha2 = 0x80; // pix2 sprite vs playfield switch (priority) { case 0x02: { // Additional sprite alpha in this mode if (pix2 & 0x400) alpha2 = 0x80; // Sprite vs playfield if ((pix2 & 0x600) == 0x600) pri2 = 4; else if ((pix2 & 0x600) == 0x400) pri2 = 16; else pri2 = 64; } break; default: { if ((pix2 & 0x400) == 0x400) pri2 = 16; else pri2 = 64; } break; } uint8_t bgpri = srcpriline[x]; /* once we get here we have pri1 - 4/16/64 (sprite chip 1 pixel priority relative to bg) pri2 - 4/16/64 (sprite chip 2 pixel priority relative to bg) spri1 - 8/32 (priority of sprite chip 1 relative to other sprite chip) spri2 - 4/16/64 (priority of sprite chip 2 relative to other sprite chip) alpha2 - 0x80/0xff alpha level of sprite chip 2 pixels (0x80 if enabled, 0xff if not) bgpri - 0 / 8 / 32 (from drawing tilemaps earlier, to compare above pri1/pri2 priorities against) pix1 - same as before (ready to extract just colour data from) pix2 - same as before ^^ */ int drawnpixe1 = 0; if (pix1 & 0xf) { if (pri1 > bgpri) { dstline[x] = paldata[(pix1&0x1ff)+0x500]; drawnpixe1 = 1; } } if (pix2 & 0xf) { if (pri2 > bgpri) { if ((!drawnpixe1) || (spri2 > spri1)) { if (alpha2==0xff) { dstline[x] = paldata[(pix2&0xff)+0x700]; } else { uint32_t base = dstline[x]; dstline[x] = alpha_blend_r32(base, paldata[(pix2&0xff)+0x700], alpha2); } } } } } } }
UINT32 zeus2_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { // Wait until configuration is completed before transfering anything if (m_zeusbase[0x30] == 0) return 0; int x, y; poly->wait(); if (machine().input().code_pressed(KEYCODE_DOWN)) { zbase += machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x10 : 1; popmessage("Zbase = %f", (double)zbase); } if (machine().input().code_pressed(KEYCODE_UP)) { zbase -= machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x10 : 1; popmessage("Zbase = %f", (double)zbase); } /* normal update case */ if (!machine().input().code_pressed(KEYCODE_W)) { int xoffs = screen.visible_area().min_x; for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT32 *colorptr = &m_frameColor[frame_addr_from_xy(0, y, false)]; UINT32 *dest = &bitmap.pix32(y); for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT32 bufX = x - xoffs; //dest[x] = WAVERAM_READPIX(base, y, x - xoffs); dest[x] = colorptr[bufX]; } } } /* waveram drawing case */ else { const void *base; if (machine().input().code_pressed(KEYCODE_DOWN)) yoffs += machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x1000 : 40; if (machine().input().code_pressed(KEYCODE_UP)) yoffs -= machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x1000 : 40; if (machine().input().code_pressed(KEYCODE_LEFT) && texel_width > 4) { texel_width >>= 1; while (machine().input().code_pressed(KEYCODE_LEFT)) ; } if (machine().input().code_pressed(KEYCODE_RIGHT) && texel_width < 512) { texel_width <<= 1; while (machine().input().code_pressed(KEYCODE_RIGHT)) ; } if (yoffs < 0) yoffs = 0; if (1) { //base = waveram0_ptr_from_expanded_addr(yoffs << 8); //base = waveram0_ptr_from_expanded_addr(yoffs); base = WAVERAM_BLOCK0(yoffs); } else base = (void *)&m_frameColor[yoffs << 6]; int xoffs = screen.visible_area().min_x; for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT32 *dest = &bitmap.pix32(y); for (x = cliprect.min_x; x <= cliprect.max_x; x++) { if (1) { UINT8 tex = get_texel_8bit((UINT64 *)base, y, x, texel_width); dest[x] = (tex << 16) | (tex << 8) | tex; } else { dest[x] = ((UINT32 *)(base))[((y * WAVERAM1_WIDTH)) + x - xoffs]; } } } popmessage("offs = %06X base = %08X", yoffs, base); }
/*************************************************************************** VIDEO HARDWARE ***************************************************************************/ UINT32 generic_terminal_device::update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect) { UINT8 options = m_io_term_conf->read(); UINT16 cursor = m_y_pos * TERMINAL_WIDTH + m_x_pos; UINT8 y,ra,chr,gfx; UINT16 sy=0,ma=0,x; UINT32 font_color; switch (options & 0x30) { case 0x10: font_color = 0x00ff7e00; break; case 0x20: font_color = 0x00ffffff; break; default: font_color = 0x0000ff00; break; } m_framecnt++; for (y = 0; y < TERMINAL_HEIGHT; y++) { for (ra = 0; ra < 10; ra++) { UINT32 *p = &bitmap.pix32(sy++); for (x = ma; x < ma + TERMINAL_WIDTH; x++) { chr = m_buffer[x]; gfx = terminal_font[(chr<<4) | ra ]; if ((x == cursor) && (options & 1)) // at cursor position and want a cursor { if ((options & 2) || (ra == 9)) // block, or underline & at bottom line { if ((options & 4) && (m_framecnt & 8)) // want blink & time to blink { } else { if (options & 8) gfx ^= 0xff; // invert else gfx |= 0xff; // overwrite } } } /* Display a scanline of a character */ *p++ = (BIT( gfx, 7 ))?font_color:0; *p++ = (BIT( gfx, 6 ))?font_color:0; *p++ = (BIT( gfx, 5 ))?font_color:0; *p++ = (BIT( gfx, 4 ))?font_color:0; *p++ = (BIT( gfx, 3 ))?font_color:0; *p++ = (BIT( gfx, 2 ))?font_color:0; *p++ = (BIT( gfx, 1 ))?font_color:0; *p++ = (BIT( gfx, 0 ))?font_color:0; } } ma+=TERMINAL_WIDTH; } return 0; }
void k053247_device::zdrawgfxzoom32GP( bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int alpha, int drawmode, int zcode, int pri, UINT8* gx_objzbuf, UINT8* gx_shdzbuf) { #define FP 19 #define FPONE (1<<FP) #define FPHALF (1<<(FP-1)) #define FPENT 0 // inner loop const UINT8 *src_ptr; int src_x; int eax, ecx; int src_fx, src_fdx; int shdpen; UINT8 z8 = 0, p8 = 0; UINT8 *ozbuf_ptr; UINT8 *szbuf_ptr; const pen_t *pal_base; const pen_t *shd_base; UINT32 *dst_ptr; // outter loop int src_fby, src_fdy, src_fbx; const UINT8 *src_base; int dst_w, dst_h; // one-time int nozoom, granularity; int src_fw, src_fh; int dst_minx, dst_maxx, dst_miny, dst_maxy; int dst_skipx, dst_skipy, dst_x, dst_y, dst_lastx, dst_lasty; int src_pitch, dst_pitch; // cull illegal and transparent objects if (!scalex || !scaley) return; // find shadow pens and cull invisible shadows granularity = shdpen = m_gfx->granularity(); shdpen--; if (zcode >= 0) { if (drawmode == 5) { drawmode = 4; shdpen = 1; } } else if (drawmode >= 4) return; // alpha blend necessary? if (drawmode & 2) { if (alpha <= 0) return; if (alpha >= 255) drawmode &= ~2; } // fill internal data structure with default values ozbuf_ptr = gx_objzbuf; szbuf_ptr = gx_shdzbuf; src_pitch = 16; src_fw = 16; src_fh = 16; src_base = m_gfx->get_data(code % m_gfx->elements()); pal_base = palette().pens() + m_gfx->colorbase() + (color % m_gfx->colors()) * granularity; shd_base = palette().shadow_table(); dst_ptr = &bitmap.pix32(0); dst_pitch = bitmap.rowpixels(); dst_minx = cliprect.min_x; dst_maxx = cliprect.max_x; dst_miny = cliprect.min_y; dst_maxy = cliprect.max_y; dst_x = sx; dst_y = sy; // cull off-screen objects if (dst_x > dst_maxx || dst_y > dst_maxy) return; nozoom = (scalex == 0x10000 && scaley == 0x10000); if (nozoom) { dst_h = dst_w = 16; src_fdy = src_fdx = 1; } else { dst_w = ((scalex<<4)+0x8000)>>16; dst_h = ((scaley<<4)+0x8000)>>16; if (!dst_w || !dst_h) return; src_fw <<= FP; src_fh <<= FP; src_fdx = src_fw / dst_w; src_fdy = src_fh / dst_h; } dst_lastx = dst_x + dst_w - 1; if (dst_lastx < dst_minx) return; dst_lasty = dst_y + dst_h - 1; if (dst_lasty < dst_miny) return; // clip destination dst_skipx = 0; eax = dst_minx; if ((eax -= dst_x) > 0) { dst_skipx = eax; dst_w -= eax; dst_x = dst_minx; } eax = dst_lastx; if ((eax -= dst_maxx) > 0) dst_w -= eax; dst_skipy = 0; eax = dst_miny; if ((eax -= dst_y) > 0) { dst_skipy = eax; dst_h -= eax; dst_y = dst_miny; } eax = dst_lasty; if ((eax -= dst_maxy) > 0) dst_h -= eax; // calculate zoom factors and clip source if (nozoom) { if (!flipx) src_fbx = 0; else { src_fbx = src_fw - 1; src_fdx = -src_fdx; } if (!flipy) src_fby = 0; else { src_fby = src_fh - 1; src_fdy = -src_fdy; src_pitch = -src_pitch; } } else { if (!flipx) src_fbx = FPENT; else { src_fbx = src_fw - FPENT - 1; src_fdx = -src_fdx; } if (!flipy) src_fby = FPENT; else { src_fby = src_fh - FPENT - 1; src_fdy = -src_fdy; } } src_fbx += dst_skipx * src_fdx; src_fby += dst_skipy * src_fdy; // adjust insertion points and pre-entry constants eax = (dst_y - dst_miny) * GX_ZBUFW + (dst_x - dst_minx) + dst_w; z8 = (UINT8)zcode; p8 = (UINT8)pri; ozbuf_ptr += eax; szbuf_ptr += eax << 1; dst_ptr += dst_y * dst_pitch + dst_x + dst_w; dst_w = -dst_w; if (!nozoom) { ecx = src_fby; src_fby += src_fdy; ecx >>= FP; src_fx = src_fbx; src_x = src_fbx; src_fx += src_fdx; ecx <<= 4; src_ptr = src_base; src_x >>= FP; src_ptr += ecx; ecx = dst_w; if (zcode < 0) // no shadow and z-buffering { do { do { eax = src_ptr[src_x]; src_x = src_fx; src_fx += src_fdx; src_x >>= FP; if (!eax || eax >= shdpen) continue; dst_ptr [ecx] = pal_base[eax]; } while (++ecx); ecx = src_fby; src_fby += src_fdy; dst_ptr += dst_pitch; ecx >>= FP; src_fx = src_fbx; src_x = src_fbx; src_fx += src_fdx; ecx <<= 4; src_ptr = src_base; src_x >>= FP; src_ptr += ecx; ecx = dst_w; } while (--dst_h); } else { switch (drawmode)
void rohga_state::mixnitroballlayer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int y, x; const pen_t *paldata = &m_palette->pen(0); bitmap_ind16 *sprite_bitmap1, *sprite_bitmap2; bitmap_ind8* priority_bitmap; uint16_t priority = m_decocomn->priority_r(); sprite_bitmap1 = &m_sprgen[0]->get_sprite_temp_bitmap(); sprite_bitmap2 = &m_sprgen[1]->get_sprite_temp_bitmap(); priority_bitmap = &screen.priority(); uint32_t* dstline; uint16_t *srcline1, *srcline2; uint8_t *srcpriline; for (y=cliprect.top();y<=cliprect.bottom();y++) { srcline1=&sprite_bitmap1->pix16(y,0); srcline2=&sprite_bitmap2->pix16(y,0); srcpriline=&priority_bitmap->pix8(y,0); dstline=&bitmap.pix32(y,0); for (x=cliprect.left();x<=cliprect.right();x++) { uint16_t pix1 = srcline1[x]; uint16_t pix2 = srcline2[x]; /* Here we have pix1 - raw pixel / colour / priority data from first 1st chip pix2 - raw pixel / colour / priority data from first 2nd chip */ int pri1, pri2; // pix1 sprite vs playfield switch (priority) // TODO : Verify this from real pcb { case 0x00: default: { switch (pix1 & 0xe00) { case 0x000: default: pri1 = 0x200; break; case 0x200: pri1 = 0x020; break; case 0x400: pri1 = 0x008; break; case 0x600: pri1 = 0x002; break; case 0x800: pri1 = 0x100; break; case 0xa00: pri1 = 0x040; break; case 0xc00: pri1 = 0x004; break; case 0xe00: pri1 = 0x001; break; } } break; case 0x20: { switch (pix1 & 0xe00) { case 0x000: default: pri1 = 0x080; break; case 0x200: pri1 = 0x004; break; case 0x400: pri1 = 0x002; break; case 0x600: pri1 = 0x001; break; case 0x800: pri1 = 0x100; break; case 0xa00: pri1 = 0x020; break; case 0xc00: pri1 = 0x008; break; case 0xe00: pri1 = 0x200; break; } } break; } // pix2 sprite vs pix1 sprite pri2 = 0x080; switch (priority) { case 0x00: default: pri2 = 0x080; break; case 0x20: pri2 = 0x010; break; } uint8_t bgpri = srcpriline[x]; /* once we get here we have pri1 - 0x001/0x002/0x004/0x008/0x010/0x020/0x040/0x080/0x100/0x200 (sprite chip 1 pixel priority relative to bg) pri2 - 0x080/0x010 (sprite chip 2 pixel priority relative to bg) bgpri - 0x008/0x040 (from drawing tilemaps earlier, to compare above pri1/pri2 priorities against) pix1 - same as before (ready to extract just colour data from) pix2 - same as before ^^ */ int drawnpixe1 = 0; if (pix1 & 0xf) { if (pri1 > bgpri) { dstline[x] = paldata[(pix1&0x1ff)+0x400]; drawnpixe1 = 1; } } if (pix2 & 0xf) { if (pri2 > bgpri) { if ((!drawnpixe1) || (pri2 > pri1)) { if (pix2 & 0x100) { uint32_t base = dstline[x]; dstline[x] = alpha_blend_r32(base, paldata[(pix2&0xff)+0x600], 0x80); } else { dstline[x] = paldata[(pix2&0xff)+0x600]; } } } } } } }
ADDRESS_MAP_END UINT32 oric_state::screen_update_oric(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bool blink_state = m_blink_counter & 0x20; m_blink_counter = (m_blink_counter + 1) & 0x3f; UINT8 pattr = m_pattr; for(int y=0; y<224; y++) { // Line attributes and current colors UINT8 lattr = 0; UINT32 fgcol = m_palette->pen_color(7); UINT32 bgcol = m_palette->pen_color(0); UINT32 *p = &bitmap.pix32(y); for(int x=0; x<40; x++) { // Lookup the byte and, if needed, the pattern data UINT8 ch, pat; if((pattr & PATTR_HIRES) && y < 200) ch = pat = m_ram[0xa000 + y*40 + x]; else { ch = m_ram[0xbb80 + (y>>3)*40 + x]; int off = (lattr & LATTR_DSIZE ? y >> 1 : y ) & 7; const UINT8 *base; if(pattr & PATTR_HIRES) if(lattr & LATTR_ALT) base = m_ram + 0x9c00; else base = m_ram + 0x9800; else if(lattr & LATTR_ALT) base = m_ram + 0xb800; else base = m_ram + 0xb400; pat = base[((ch & 0x7f) << 3) | off]; } // Handle state-chaging attributes if(!(ch & 0x60)) { pat = 0x00; switch(ch & 0x18) { case 0x00: fgcol = m_palette->pen_color(ch & 7); break; case 0x08: lattr = ch & 7; break; case 0x10: bgcol = m_palette->pen_color(ch & 7); break; case 0x18: pattr = ch & 7; break; } } // Pick up the colors for the pattern UINT32 c_fgcol = fgcol; UINT32 c_bgcol = bgcol; // inverse video if(ch & 0x80) { c_bgcol = c_bgcol ^ 0xffffff; c_fgcol = c_fgcol ^ 0xffffff; } // blink if((lattr & LATTR_BLINK) && blink_state) c_fgcol = c_bgcol; // Draw the pattern *p++ = pat & 0x20 ? c_fgcol : c_bgcol; *p++ = pat & 0x10 ? c_fgcol : c_bgcol; *p++ = pat & 0x08 ? c_fgcol : c_bgcol; *p++ = pat & 0x04 ? c_fgcol : c_bgcol; *p++ = pat & 0x02 ? c_fgcol : c_bgcol; *p++ = pat & 0x01 ? c_fgcol : c_bgcol; } } m_pattr = pattr; return 0; }
UINT32 galpani3_state::screen_update_galpani3(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int x,y; UINT16* src1; UINT32* dst; UINT16 pixdata1; const pen_t *paldata = machine().pens; bitmap.fill(0x0000, cliprect); // popmessage("%02x %02x", m_grap2_0->m_framebuffer_bright2, m_grap2_1->m_framebuffer_bright2); { int drawy, drawx; for (drawy=0;drawy<512;drawy++) { UINT16* srcline1 = m_grap2_0->m_framebuffer + ((drawy+m_grap2_0->m_framebuffer_scrolly+11)&0x1ff) * 0x200; UINT16* srcline2 = m_grap2_1->m_framebuffer + ((drawy+m_grap2_1->m_framebuffer_scrolly+11)&0x1ff) * 0x200; UINT16* srcline3 = m_grap2_2->m_framebuffer + ((drawy+m_grap2_2->m_framebuffer_scrolly+11)&0x1ff) * 0x200; UINT16* priline = m_priority_buffer + ((drawy+m_priority_buffer_scrolly+11)&0x1ff) * 0x200; for (drawx=0;drawx<512;drawx++) { int srcoffs1 = (drawx+m_grap2_0->m_framebuffer_scrollx+67)&0x1ff; int srcoffs2 = (drawx+m_grap2_1->m_framebuffer_scrollx+67)&0x1ff; int srcoffs3 = (drawx+m_grap2_2->m_framebuffer_scrollx+67)&0x1ff; int prioffs = (drawx+m_priority_buffer_scrollx+66)&0x1ff; UINT8 dat1 = srcline1[srcoffs1]; UINT8 dat2 = srcline2[srcoffs2]; UINT8 dat3 = srcline3[srcoffs3]; UINT8 pridat = priline[prioffs]; UINT32* dst = &bitmap.pix32(drawy, drawx); // this is all wrong if (pridat==0x0f) // relates to the area you've drawn over { if (dat1 && m_grap2_0->m_framebuffer_enable) { dst[0] = paldata[dat1+0x4000]; } if (dat2 && m_grap2_1->m_framebuffer_enable) { dst[0] = paldata[dat2+0x4100]; } } else if (pridat==0xcf) // the girl { dst[0] = paldata[0x4300]; } else { /* this isn't right, but the registers have something to do with alpha / mixing, and bit 0x8000 of the palette is DEFINITELY alpha enable -- see fading in intro */ if (dat1 && m_grap2_0->m_framebuffer_enable) { UINT16 pen = dat1+0x4000; UINT32 pal = paldata[pen]; if (gp3_is_alpha_pen(pen)) { int r,g,b; r = (pal & 0x00ff0000)>>16; g = (pal & 0x0000ff00)>>8; b = (pal & 0x000000ff)>>0; r = (r * m_grap2_0->m_framebuffer_bright2) / 0xff; g = (g * m_grap2_0->m_framebuffer_bright2) / 0xff; b = (b * m_grap2_0->m_framebuffer_bright2) / 0xff; pal = (r & 0x000000ff)<<16; pal |=(g & 0x000000ff)<<8; pal |=(b & 0x000000ff)<<0; dst[0] = pal; } else { dst[0] = pal; } } if (dat2 && m_grap2_1->m_framebuffer_enable) { UINT16 pen = dat2+0x4100; UINT32 pal = paldata[pen]; if (gp3_is_alpha_pen(pen)) { int r,g,b; r = (pal & 0x00ff0000)>>16; g = (pal & 0x0000ff00)>>8; b = (pal & 0x000000ff)>>0; r = (r * m_grap2_1->m_framebuffer_bright2) / 0xff; g = (g * m_grap2_1->m_framebuffer_bright2) / 0xff; b = (b * m_grap2_1->m_framebuffer_bright2) / 0xff; pal = (r & 0x000000ff)<<16; pal |=(g & 0x000000ff)<<8; pal |=(b & 0x000000ff)<<0; dst[0] |= pal; } else { dst[0] = pal; } } if (dat3 && m_grap2_2->m_framebuffer_enable) { dst[0] = paldata[dat3+0x4200]; } }
UINT32 nubus_m2video_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { UINT32 *scanline; int x, y; UINT8 pixels, *vram; vram = m_vram + 0x20; switch (m_mode) { case 0: // 1 bpp? for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/8; x++) { pixels = vram[(y * 128) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels&0x80)]; *scanline++ = m_palette[((pixels<<1)&0x80)]; *scanline++ = m_palette[((pixels<<2)&0x80)]; *scanline++ = m_palette[((pixels<<3)&0x80)]; *scanline++ = m_palette[((pixels<<4)&0x80)]; *scanline++ = m_palette[((pixels<<5)&0x80)]; *scanline++ = m_palette[((pixels<<6)&0x80)]; *scanline++ = m_palette[((pixels<<7)&0x80)]; } } break; case 1: // 2 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/4; x++) { pixels = vram[(y * 256) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels&0xc0)]; *scanline++ = m_palette[((pixels<<2)&0xc0)]; *scanline++ = m_palette[((pixels<<4)&0xc0)]; *scanline++ = m_palette[((pixels<<6)&0xc0)]; } } break; case 2: // 4 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/2; x++) { pixels = vram[(y * 512) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels&0xf0)]; *scanline++ = m_palette[((pixels&0x0f)<<4)]; } } break; case 3: // 8 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[pixels]; } } break; default: fatalerror("m2video: unknown video mode %d\n", m_mode); } return 0; }
void bt459_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u8 *pixel_data) { // initialise the blink timer if (m_blink_start > screen.frame_number()) m_blink_start = screen.frame_number(); // compute the blink state according to the programmed duty cycle const bool blink_state = ((screen.frame_number() - m_blink_start) & ( (m_command_0 & CR0302) == CR0302_1616 ? 0x10 : (m_command_0 & CR0302) == CR0302_3232 ? 0x20 : (m_command_0 & CR0302) == CR0302_6464 ? 0x40 : 0x30)) == 0; // compute the pixel mask from the pixel read mask and blink mask/state const u8 pixel_mask = m_pixel_read_mask & (blink_state ? 0xffU : ~m_pixel_blink_mask); // draw visible pixel data switch (m_command_0 & CR0100) { case CR0100_1BPP: for (int y = screen.visible_area().min_y; y <= screen.visible_area().max_y; y++) for (int x = screen.visible_area().min_x; x <= screen.visible_area().max_x; x += 8) { u8 data = *pixel_data++; bitmap.pix(y, x + 7) = get_rgb(data & 0x1, pixel_mask); data >>= 1; bitmap.pix(y, x + 6) = get_rgb(data & 0x1, pixel_mask); data >>= 1; bitmap.pix(y, x + 5) = get_rgb(data & 0x1, pixel_mask); data >>= 1; bitmap.pix(y, x + 4) = get_rgb(data & 0x1, pixel_mask); data >>= 1; bitmap.pix(y, x + 3) = get_rgb(data & 0x1, pixel_mask); data >>= 1; bitmap.pix(y, x + 2) = get_rgb(data & 0x1, pixel_mask); data >>= 1; bitmap.pix(y, x + 1) = get_rgb(data & 0x1, pixel_mask); data >>= 1; bitmap.pix(y, x + 0) = get_rgb(data & 0x1, pixel_mask); } break; case CR0100_2BPP: for (int y = screen.visible_area().min_y; y <= screen.visible_area().max_y; y++) for (int x = screen.visible_area().min_x; x <= screen.visible_area().max_x; x += 4) { u8 data = *pixel_data++; bitmap.pix(y, x + 3) = get_rgb(data & 0x3, pixel_mask); data >>= 2; bitmap.pix(y, x + 2) = get_rgb(data & 0x3, pixel_mask); data >>= 2; bitmap.pix(y, x + 1) = get_rgb(data & 0x3, pixel_mask); data >>= 2; bitmap.pix(y, x + 0) = get_rgb(data & 0x3, pixel_mask); } break; case CR0100_4BPP: for (int y = screen.visible_area().min_y; y <= screen.visible_area().max_y; y++) for (int x = screen.visible_area().min_x; x <= screen.visible_area().max_x; x += 2) { u8 data = *pixel_data++; bitmap.pix(y, x + 1) = get_rgb(data & 0x7, pixel_mask); data >>= 4; bitmap.pix(y, x + 0) = get_rgb(data & 0x7, pixel_mask); } break; case CR0100_8BPP: for (int y = screen.visible_area().min_y; y <= screen.visible_area().max_y; y++) for (int x = screen.visible_area().min_x; x <= screen.visible_area().max_x; x++) bitmap.pix(y, x) = get_rgb(*pixel_data++, pixel_mask); break; } // draw cursors when visible and not blinked off if ((m_cursor_command & (CR47 | CR46 | CR45 | CR44)) && ((m_cursor_command & CR40) == 0 || blink_state)) { // get 64x64 bitmap and cross hair cursor plane enable const u8 bm_cursor_enable = (m_cursor_command & (CR47 | CR46)) >> 6; const u8 ch_cursor_enable = (m_cursor_command & (CR45 | CR44)) >> 4; // get cross hair cursor half thickness const int ch_thickness = (m_cursor_command & CR4241) >> 1; /* * The cursor (x) value to be written is calculated as follows: * * Cx = desired display screen (x) position + H - P * * where * * P = 37 if 1:1 input multiplexing, 52 if 4:1 input multiplexing, * 57 if 5:1 input multiplexing * H = number of pixels between the first rising edge of LD* * following the falling edge of HSYNC* to active video * * The cursor (y) value to be written is calculated as follows: * * Cy = desired display screen (y) position + V - 32 * * where * * V = number of scan lines from the second sync pulse during * vertical blanking to active video * * Values from $0FC0 (-64) to $0FBF (+4031) may be loaded into the * cursor (y) register. The negative values ($0FC0 to $0FFF) are used * in situations where V < 32, and the cursor must be moved off the * top of the screen. */ const int cursor_x = m_cursor_x + ( (m_command_0 & CR0706) == CR0706_11MPX ? 37 : (m_command_0 & CR0706) == CR0706_41MPX ? 52 : (m_command_0 & CR0706) == CR0706_51MPX ? 57 : 0); const int cursor_y = (m_cursor_y < 0xfc0 ? m_cursor_y : m_cursor_y - 0x1000) + 32; // 64x64 bitmap cursor if (bm_cursor_enable) { // compute target 64x64 rectangle rectangle cursor(cursor_x - 31, cursor_x + 32, cursor_y - 31, cursor_y + 32); // intersect with screen bitmap cursor &= bitmap.cliprect(); // draw if any portion is visible if (!cursor.empty()) { for (int y = 0; y < 64; y++) { // get screen y pixel coordinate const int ypos = cursor_y - 31 + y; for (int x = 0; x < 64; x++) { // get screen x pixel coordinate const int xpos = cursor_x - 31 + x; // check if pixel is visible if (cursor.contains(xpos, ypos)) { // retrieve 2 bits of 64x64 bitmap cursor data u8 data = (m_cursor_ram[y * 16 + (x >> 2)] >> ((3 - (x & 3)) << 1)) & bm_cursor_enable; // check for dual-cursor mode and combine with cross-hair data if (ch_cursor_enable) if (((x >= 31 - ch_thickness) && (x <= 31 + ch_thickness)) || ((y >= 31 - ch_thickness) && (y <= 31 + ch_thickness))) data = (m_cursor_command & CR43) ? data | ch_cursor_enable : data ^ ch_cursor_enable; // write cursor data to screen (normal or X Window mode) if (data && !((m_command_2 & CR21) && data == 1)) bitmap.pix(ypos, xpos) = m_cursor_color[data - 1]; } } } } } // cross hair cursor if (ch_cursor_enable) { // get the cross hair cursor color const rgb_t ch_color = m_cursor_color[ch_cursor_enable - 1]; /* * The window (x) value to be written is calculated as follows: * * Wx = desired display screen (x) position + H - P * * where * * P = 5 if 1:1 input multiplexing, 20 if 4:1 input multiplexing, * 25 if 5:1 input multiplexing * H = number of pixels between the first rising edge of LD* * following the falling edge of HSYNC* to active video * * The window (y) value to be written is calculated as follows: * * Wy = desired display screen (y) position + V * * where * * V = number of scan lines from the second sync pulse during * vertical blanking to active video * * Values from $0000 to $0FFF may be written to the window (x) and * (y) registers. A full-screen cross hair is implemented by * loading the window (x,y) registers with $0000, and the window * width and height registers with $0FFF. */ const bool full_screen = (m_window_x == 0 && m_window_y == 0 && m_window_w == 0x0fff && m_window_h == 0x0fff); const int window_x = full_screen ? screen.visible_area().min_x : m_window_x + ( (m_command_0 & CR0706) == CR0706_11MPX ? 5 : (m_command_0 & CR0706) == CR0706_41MPX ? 20 : (m_command_0 & CR0706) == CR0706_51MPX ? 25 : 0); const int window_y = full_screen ? screen.visible_area().min_y : m_window_y; /* * The actual window width is 2, 8 or 10 pixels more than the * value specified by the window width register, depending on * whether 1:1, 4:1 or 5:1 input multiplexing is specified. The * actual window height is 2 pixels more than the value specified * by the window height register. Therefore, the minimum window * width is 2, 8 or 10 pixels for 1:1, 4:1 and 5:1 multiplexing, * respectively. The minimum window height is 2 pixels. * * Values from $0000 to $0FFF may be written to the window width * and height registers. * * Note: testing indicates the cross-hair cursor should be drawn * strictly inside the window, although this is not 100% clear from * the documentation. */ const int window_w = full_screen ? screen.visible_area().width() : m_window_w + ( (m_command_0 & CR0706) == CR0706_11MPX ? 2 : (m_command_0 & CR0706) == CR0706_41MPX ? 8 : (m_command_0 & CR0706) == CR0706_51MPX ? 10 : 0); const int window_h = full_screen ? screen.visible_area().height() : m_window_h + 2; // check for dual-cursor mode if (bm_cursor_enable) { // draw the cross hair cursor as vertical and horizontal filled rectangles broken by the 64x64 cursor area rectangle v1(cursor_x - ch_thickness, cursor_x + ch_thickness, window_y + 1, cursor_y - 32); rectangle v2(cursor_x - ch_thickness, cursor_x + ch_thickness, cursor_y + 33, window_y + window_h); rectangle h1(window_x + 1, cursor_x - 32, cursor_y - ch_thickness, cursor_y + ch_thickness); rectangle h2(cursor_x + 33, window_x + window_w, cursor_y - ch_thickness, cursor_y + ch_thickness); v1 &= bitmap.cliprect(); v2 &= bitmap.cliprect(); h1 &= bitmap.cliprect(); h2 &= bitmap.cliprect(); if (!v1.empty()) bitmap.fill(ch_color, v1); if (!v2.empty()) bitmap.fill(ch_color, v2); if (!h1.empty()) bitmap.fill(ch_color, h1); if (!h2.empty()) bitmap.fill(ch_color, h2); } else { // draw the cross hair cursor as unbroken vertical and horizontal filled rectangles rectangle v(cursor_x - ch_thickness, cursor_x + ch_thickness, window_y + 1, window_y + window_h); rectangle h(window_x + 1, window_x + window_w, cursor_y - ch_thickness, cursor_y + ch_thickness); v &= bitmap.cliprect(); h &= bitmap.cliprect(); if (!v.empty()) bitmap.fill(ch_color, v); if (!h.empty()) bitmap.fill(ch_color, h); } } }
UINT32 aristmk6_state::screen_update_aristmk6(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int x,y,count; const UINT8 *blit_ram = memregion("maincpu")->base(); if(machine().input().code_pressed(KEYCODE_Z)) m_test_x++; if(machine().input().code_pressed(KEYCODE_X)) m_test_x--; if(machine().input().code_pressed(KEYCODE_A)) m_test_y++; if(machine().input().code_pressed(KEYCODE_S)) m_test_y--; if(machine().input().code_pressed(KEYCODE_Q)) m_start_offs+=0x2000; if(machine().input().code_pressed(KEYCODE_W)) m_start_offs-=0x2000; if(machine().input().code_pressed(KEYCODE_E)) m_start_offs++; if(machine().input().code_pressed(KEYCODE_R)) m_start_offs--; if(machine().input().code_pressed_once(KEYCODE_L)) m_type^=1; popmessage("%d %d %04x %d",m_test_x,m_test_y,m_start_offs,m_type); bitmap.fill(get_black_pen(machine()), cliprect); count = (m_start_offs); for(y=0;y<m_test_y;y++) { for(x=0;x<m_test_x;x++) { if(m_type) { UINT16 vram; int r,g,b; vram = blit_ram[count+0] | blit_ram[count+1]<<8; r = (vram & 0x001f)>>0; g = (vram & 0x07e0)>>5; b = (vram & 0xf800)>>11; r = (r << 3) | (r & 0x7); g = (g << 2) | (g & 3); b = (b << 3) | (b & 0x7); if(cliprect.contains(x, y)) bitmap.pix32(y, x) = r | g<<8 | b<<16; count+=2; } else { UINT8 color; color = blit_ram[count]; if(cliprect.contains(x, y)) bitmap.pix32(y, x) = machine().pens[color]; count++; } } }
// utility function to render a clipped scanline vertically or horizontally inline void k053250_device::pdraw_scanline32(bitmap_rgb32 &bitmap, const pen_t *pal_base, UINT8 *source, const rectangle &cliprect, int linepos, int scroll, int zoom, UINT32 clipmask, UINT32 wrapmask, UINT32 orientation, bitmap_ind8 &priority, UINT8 pri) { // a sixteen-bit fixed point resolution should be adequate to our application #define FIXPOINT_PRECISION 16 #define FIXPOINT_PRECISION_HALF (1<<(FIXPOINT_PRECISION-1)) int end_pixel, flip, dst_min, dst_max, dst_start, dst_length; UINT32 src_wrapmask; UINT8 *src_base; int src_fx, src_fdx; int pix_data, dst_offset; UINT8 *pri_base; UINT32 *dst_base; int dst_adv; // flip X and flip Y also switch role when the X Y coordinates are swapped if (!(orientation & ORIENTATION_SWAP_XY)) { flip = orientation & ORIENTATION_FLIP_X; dst_min = cliprect.min_x; dst_max = cliprect.max_x; } else { flip = orientation & ORIENTATION_FLIP_Y; dst_min = cliprect.min_y; dst_max = cliprect.max_y; } if (clipmask) { // reject scanlines that are outside of the target bitmap's right(bottom) clip boundary dst_start = -scroll; if (dst_start > dst_max) return; // calculate target length dst_length = clipmask + 1; if (zoom) dst_length = (dst_length << 6) / zoom; // reject scanlines that are outside of the target bitmap's left(top) clip boundary end_pixel = dst_start + dst_length - 1; if (end_pixel < dst_min) return; // clip scanline tail if ((end_pixel -= dst_max) > 0) dst_length -= end_pixel; // reject 0-length scanlines if (dst_length <= 0) return; // calculate zoom factor src_fdx = zoom << (FIXPOINT_PRECISION-6); // clip scanline head end_pixel = dst_min; if ((end_pixel -= dst_start) > 0) { // chop scanline to the correct length and move target start location to the left(top) clip boundary dst_length -= end_pixel; dst_start = dst_min; // and skip the source for the left(top) clip region src_fx = end_pixel * src_fdx + FIXPOINT_PRECISION_HALF; } else // the point five bias is to ensure even distribution of stretched or shrinked pixels src_fx = FIXPOINT_PRECISION_HALF; // adjust flipped source if (flip) { // start from the target's clipped end if the scanline is flipped dst_start = dst_max + dst_min - dst_start - (dst_length-1); // and move source start location to the opposite end src_fx += (dst_length-1) * src_fdx - 1; src_fdx = -src_fdx; } } else { // draw wrapped scanline at virtual bitmap boundary when source clipping is off dst_start = dst_min; dst_length = dst_max - dst_min + 1; // target scanline spans the entire visible area src_fdx = zoom << (FIXPOINT_PRECISION-6); // pre-advance source for the clipped region if (!flip) src_fx = (scroll + dst_min) * src_fdx + FIXPOINT_PRECISION_HALF; else { src_fx = (scroll + dst_max) * src_fdx + FIXPOINT_PRECISION_HALF-1; src_fdx = -src_fdx; } } if (!(orientation & ORIENTATION_SWAP_XY)) { // calculate target increment for horizontal scanlines which is exactly one dst_adv = 1; dst_offset = dst_length; pri_base = &priority.pix8(linepos, dst_start + dst_offset); dst_base = &bitmap.pix32(linepos, dst_start + dst_length); } else { // calculate target increment for vertical scanlines which is the bitmap's pitch value dst_adv = bitmap.rowpixels(); dst_offset= dst_length * dst_adv; pri_base = &priority.pix8(dst_start, linepos + dst_offset); dst_base = &bitmap.pix32(dst_start, linepos + dst_offset); } // generalized src_base = source; // there is no need to wrap source offsets along with source clipping // so we set all bits of the wrapmask to one src_wrapmask = (clipmask) ? ~0 : wrapmask; dst_offset = -dst_offset; // negate target offset in order to terminated draw loop at 0 condition if (pri) { // draw scanline and update priority bitmap do { pix_data = src_base[(src_fx>>FIXPOINT_PRECISION) & src_wrapmask]; src_fx += src_fdx; if (pix_data) { pix_data = pal_base[pix_data]; pri_base[dst_offset] = pri; dst_base[dst_offset] = pix_data; } } while (dst_offset += dst_adv); } else { // draw scanline but do not update priority bitmap do {
UINT32 nubus_cb264se30_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { UINT32 *scanline; int x, y; UINT8 pixels, *vram; vram = &m_vram[8*1024]; switch (m_mode) { case 0: // 1 bpp? for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/8; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels&0x80)]; *scanline++ = m_palette[((pixels<<1)&0x80)]; *scanline++ = m_palette[((pixels<<2)&0x80)]; *scanline++ = m_palette[((pixels<<3)&0x80)]; *scanline++ = m_palette[((pixels<<4)&0x80)]; *scanline++ = m_palette[((pixels<<5)&0x80)]; *scanline++ = m_palette[((pixels<<6)&0x80)]; *scanline++ = m_palette[((pixels<<7)&0x80)]; } } break; case 1: // 2 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/4; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels&0xc0)]; *scanline++ = m_palette[((pixels<<2)&0xc0)]; *scanline++ = m_palette[((pixels<<4)&0xc0)]; *scanline++ = m_palette[((pixels<<6)&0xc0)]; } } break; case 2: // 4 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/2; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels&0xf0)]; *scanline++ = m_palette[((pixels&0x0f)<<4)]; } } break; case 3: // 8 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[pixels]; } } break; case 4: // 24 bpp { UINT32 *vram32 = (UINT32 *)&m_vram[0]; UINT32 *base; for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); base = &vram32[y * 1024]; for (x = 0; x < 640; x++) { *scanline++ = *base++; } } } break; default: fatalerror("cb264se30: unknown video mode %d\n", m_mode); } return 0; }
UINT32 nubus_specpdq_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { UINT32 *scanline; int x, y; UINT8 pixels, *vram; // first time? kick off the VBL timer vram = &m_vram[0x9000]; switch (m_mode) { case 0: // 1 bpp for (y = 0; y < 844; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 1152/8; x++) { pixels = vram[(y * 512) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette_val[(pixels&0x80)]; *scanline++ = m_palette_val[((pixels<<1)&0x80)]; *scanline++ = m_palette_val[((pixels<<2)&0x80)]; *scanline++ = m_palette_val[((pixels<<3)&0x80)]; *scanline++ = m_palette_val[((pixels<<4)&0x80)]; *scanline++ = m_palette_val[((pixels<<5)&0x80)]; *scanline++ = m_palette_val[((pixels<<6)&0x80)]; *scanline++ = m_palette_val[((pixels<<7)&0x80)]; } } break; case 1: // 2 bpp for (y = 0; y < 844; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 1152/4; x++) { pixels = vram[(y * 512) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette_val[(pixels&0xc0)]; *scanline++ = m_palette_val[((pixels<<2)&0xc0)]; *scanline++ = m_palette_val[((pixels<<4)&0xc0)]; *scanline++ = m_palette_val[((pixels<<6)&0xc0)]; } } break; case 2: // 4 bpp for (y = 0; y < 844; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 1152/2; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette_val[(pixels&0xf0)]; *scanline++ = m_palette_val[((pixels<<4)&0xf0)]; } } break; case 3: // 8 bpp for (y = 0; y < 844; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 1152; x++) { pixels = vram[(y * 1152) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette_val[pixels]; } } break; default: fatalerror("specpdq: unknown video mode %d\n", m_mode); } return 0; }
inline void deco_zoomspr_device::dragngun_drawgfxzoom( bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, int transparent_color, int scalex, int scaley,bitmap_ind8 *pri_buffer,UINT32 pri_mask, int sprite_screen_width, int sprite_screen_height, UINT8 alpha, bitmap_ind8 &pri_bitmap, bitmap_rgb32 &temp_bitmap, int priority) { rectangle myclip; if (!scalex || !scaley) return; /* scalex and scaley are 16.16 fixed point numbers 1<<15 : shrink to 50% 1<<16 : uniform scale 1<<17 : double to 200% */ /* KW 991012 -- Added code to force clip to bitmap boundary */ myclip = clip; myclip &= temp_bitmap.cliprect(); { if( gfx ) { const pen_t *pal = &m_palette->pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors())); const UINT8 *code_base = gfx->get_data(code % gfx->elements()); if (sprite_screen_width && sprite_screen_height) { /* compute sprite increment per screen pixel */ int dx = (gfx->width()<<16)/sprite_screen_width; int dy = (gfx->height()<<16)/sprite_screen_height; int ex = sx+sprite_screen_width; int ey = sy+sprite_screen_height; int x_index_base; int y_index; if( flipx ) { x_index_base = (sprite_screen_width-1)*dx; dx = -dx; } else { x_index_base = 0; } if( flipy ) { y_index = (sprite_screen_height-1)*dy; dy = -dy; } else { y_index = 0; } if( sx < clip.min_x) { /* clip left */ int pixels = clip.min_x-sx; sx += pixels; x_index_base += pixels*dx; } if( sy < clip.min_y ) { /* clip top */ int pixels = clip.min_y-sy; sy += pixels; y_index += pixels*dy; } /* NS 980211 - fixed incorrect clipping */ if( ex > clip.max_x+1 ) { /* clip right */ int pixels = ex-clip.max_x-1; ex -= pixels; } if( ey > clip.max_y+1 ) { /* clip bottom */ int pixels = ey-clip.max_y-1; ey -= pixels; } if( ex>sx ) { /* skip if inner loop doesn't draw anything */ int y; /* case 1: no alpha */ if (alpha == 0xff) { { for( y=sy; y<ey; y++ ) { const UINT8 *source = code_base + (y_index>>16) * gfx->rowbytes(); UINT32 *dest = &temp_bitmap.pix32(y); UINT8 *pri = &pri_bitmap.pix8(y); int x, x_index = x_index_base; for( x=sx; x<ex; x++ ) { int c = source[x_index>>16]; if (c != transparent_color) { if (priority >= pri[x]) { dest[x] = pal[c]; dest[x] |= 0xff000000; } else // sprites can have a 'masking' effect on other sprites { dest[x] = 0x00000000; } } x_index += dx; } y_index += dy; } } } /* alpha-blended */ else { { for( y=sy; y<ey; y++ ) { const UINT8 *source = code_base + (y_index>>16) * gfx->rowbytes(); UINT32 *dest = &temp_bitmap.pix32(y); UINT8 *pri = &pri_bitmap.pix8(y); UINT32 *tmapcolor = &dest_bmp.pix32(y); int x, x_index = x_index_base; for( x=sx; x<ex; x++ ) { int c = source[x_index>>16]; if (c != transparent_color) { if (priority >= pri[x]) { // this logic doesn't seem correct. Sprites CAN blend other sprites (needed in many places) but based on videos of the character select screen it appears that sprites can't blend already blended sprites // I'm not sure which colour gets used but the video shows a single shade of yellow rather than the yellow blending the yellow) if ((dest[x] & 0xff000000) == 0x00000000) dest[x] = alpha_blend_r32(tmapcolor[x] & 0x00ffffff, pal[c] & 0x00ffffff, alpha); // if nothing has been drawn pull the pixel from the tilemap to blend with else dest[x] = alpha_blend_r32(dest[x] & 0x00ffffff, pal[c] & 0x00ffffff, alpha); // otherwise blend with what was previously drawn dest[x] |= 0xff000000; } else // sprites can have a 'masking' effect on other sprites { dest[x] = 0x00000000; } } x_index += dx; } y_index += dy; } } } }
UINT32 a7000_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int x_size,y_size,x_start,y_start; int x,y,xi; UINT32 count; UINT8 *vram = memregion("vram")->base(); bitmap.fill(machine().pens[0x100], cliprect); x_size = (m_vidc20_horz_reg[HDER]-m_vidc20_horz_reg[HDSR]); y_size = (m_vidc20_vert_reg[VDER]-m_vidc20_vert_reg[VDSR]); x_start = m_vidc20_horz_reg[HDSR]; y_start = m_vidc20_vert_reg[VDSR]; /* check if display is enabled */ if(x_size <= 0 || y_size <= 0) return 0; // popmessage("%d",m_vidc20_bpp_mode); count = 0; switch(m_vidc20_bpp_mode) { case 0: /* 1 bpp */ { for(y=0;y<y_size;y++) { for(x=0;x<x_size;x+=8) { for(xi=0;xi<8;xi++) bitmap.pix32(y+y_start, x+xi+x_start) = machine().pens[(vram[count]>>(xi))&1]; count++; } } } break; case 1: /* 2 bpp */ { for(y=0;y<y_size;y++) { for(x=0;x<x_size;x+=4) { for(xi=0;xi<4;xi++) bitmap.pix32(y+y_start, x+xi+x_start) = machine().pens[(vram[count]>>(xi*2))&3]; count++; } } } break; case 2: /* 4 bpp */ { for(y=0;y<y_size;y++) { for(x=0;x<x_size;x+=2) { for(xi=0;xi<2;xi++) bitmap.pix32(y+y_start, x+xi+x_start) = machine().pens[(vram[count]>>(xi*4))&0xf]; count++; } } } break; case 3: /* 8 bpp */ { for(y=0;y<y_size;y++) { for(x=0;x<x_size;x++) { bitmap.pix32(y+y_start, x+x_start) = machine().pens[(vram[count])&0xff]; count++; } } } break; case 4: /* 16 bpp */ { for(y=0;y<y_size;y++) { for(x=0;x<x_size;x++) { int r,g,b,pen; pen = ((vram[count]<<8)|(vram[count+1]))&0xffff; r = (pen & 0x000f); g = (pen & 0x00f0) >> 4; b = (pen & 0x0f00) >> 8; r = (r << 4) | (r & 0xf); g = (g << 4) | (g & 0xf); b = (b << 4) | (b & 0xf); bitmap.pix32(y+y_start, x+x_start) = b | g << 8 | r << 16; count+=2; } } } break; case 6: /* 32 bpp */ { for(y=0;y<y_size;y++) { for(x=0;x<x_size;x++) { int r,g,b,pen; pen = ((vram[count]<<24)|(vram[count+1]<<16)|(vram[count+2]<<8)|(vram[count+3]<<0)); r = (pen & 0x0000ff); g = (pen & 0x00ff00) >> 8; b = (pen & 0xff0000) >> 16; bitmap.pix32(y+y_start, x+x_start) = b | g << 8 | r << 16; count+=4; } } } break; default: //fatalerror("VIDC20 %08x BPP mode not supported\n",m_vidc20_bpp_mode); break; } return 0; }
UINT32 nubus_wsportrait_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { UINT32 *scanline; int x, y; UINT8 pixels, *vram; // first time? kick off the VBL timer vram = &m_vram[0x80]; switch (m_mode) { case 0: // 1 bpp? for (y = 0; y < 870; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/8; x++) { pixels = vram[(y * 128) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[((pixels>>7)&0x1)]; *scanline++ = m_palette[((pixels>>6)&0x1)]; *scanline++ = m_palette[((pixels>>5)&0x1)]; *scanline++ = m_palette[((pixels>>4)&0x1)]; *scanline++ = m_palette[((pixels>>3)&0x1)]; *scanline++ = m_palette[((pixels>>2)&0x1)]; *scanline++ = m_palette[((pixels>>1)&0x1)]; *scanline++ = m_palette[(pixels&1)]; } } break; case 1: // 2 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/4; x++) { pixels = vram[(y * 256) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[((pixels>>6)&3)]; *scanline++ = m_palette[((pixels>>4)&3)]; *scanline++ = m_palette[((pixels>>2)&3)]; *scanline++ = m_palette[(pixels&3)]; } } break; case 2: // 4 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/2; x++) { pixels = vram[(y * 512) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[((pixels&0xf0)>>4)]; *scanline++ = m_palette[(pixels&0xf)]; } } break; default: fatalerror("wsportrait: unknown video mode %d\n", m_mode); } return 0; }
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(RGB_BLACK); return 0; }
uint32_t nubus_m2hires_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { uint32_t *scanline; int x, y; uint8_t pixels, *vram; vram = &m_vram[0x20]; switch (m_mode) { case 0: // 1 bpp? for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/8; x++) { pixels = vram[(y * 128) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[((pixels>>7)&0x1)]; *scanline++ = m_palette[((pixels>>6)&0x1)]; *scanline++ = m_palette[((pixels>>5)&0x1)]; *scanline++ = m_palette[((pixels>>4)&0x1)]; *scanline++ = m_palette[((pixels>>3)&0x1)]; *scanline++ = m_palette[((pixels>>2)&0x1)]; *scanline++ = m_palette[((pixels>>1)&0x1)]; *scanline++ = m_palette[(pixels&1)]; } } break; case 1: // 2 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/4; x++) { pixels = vram[(y * 256) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[((pixels>>6)&3)]; *scanline++ = m_palette[((pixels>>4)&3)]; *scanline++ = m_palette[((pixels>>2)&3)]; *scanline++ = m_palette[(pixels&3)]; } } break; case 2: // 4 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/2; x++) { pixels = vram[(y * 512) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[((pixels&0xf0)>>4)]; *scanline++ = m_palette[(pixels&0xf)]; } } break; case 3: // 8 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[pixels]; } } break; default: fatalerror("m2hires: unknown video mode %d\n", m_mode); } return 0; }
static inline void K053936GP_copyroz32clip( running_machine &machine, bitmap_rgb32 &dst_bitmap, bitmap_ind16 &src_bitmap, const rectangle &dst_cliprect, const rectangle &src_cliprect, UINT32 _startx,UINT32 _starty,int _incxx,int _incxy,int _incyx,int _incyy, int tilebpp, int blend, int alpha, int clip, int pixeldouble_output, palette_device *palette ) { static const int colormask[8]={1,3,7,0xf,0x1f,0x3f,0x7f,0xff}; int cy, cx; int ecx; int src_pitch, incxy, incxx; int src_minx, src_maxx, src_miny, src_maxy, cmask; UINT16 *src_base; size_t src_size; const pen_t *pal_base; int dst_ptr; int dst_size; int dst_base2; int tx, dst_pitch; UINT32 *dst_base; int starty, incyy, startx, incyx, ty, sx, sy; incxy = _incxy; incxx = _incxx; incyy = _incyy; incyx = _incyx; starty = _starty; startx = _startx; if (clip) // set source clip range to some extreme values when disabled { src_minx = src_cliprect.min_x; src_maxx = src_cliprect.max_x; src_miny = src_cliprect.min_y; src_maxy = src_cliprect.max_y; } // this simply isn't safe to do! else { src_minx = src_miny = -0x10000; src_maxx = src_maxy = 0x10000; } // set target clip range sx = dst_cliprect.min_x; tx = dst_cliprect.max_x - sx + 1; sy = dst_cliprect.min_y; ty = dst_cliprect.max_y - sy + 1; startx += sx * incxx + sy * incyx; starty += sx * incxy + sy * incyy; // adjust entry points and other loop constants dst_pitch = dst_bitmap.rowpixels(); dst_base = &dst_bitmap.pix32(0); dst_base2 = sy * dst_pitch + sx + tx; ecx = tx = -tx; tilebpp = (tilebpp-1) & 7; pal_base = palette->pens(); cmask = colormask[tilebpp]; src_pitch = src_bitmap.rowpixels(); src_base = &src_bitmap.pix16(0); src_size = src_bitmap.width() * src_bitmap.height(); dst_size = dst_bitmap.width() * dst_bitmap.height(); dst_ptr = 0;//dst_base; cy = starty; cx = startx; if (blend > 0) { dst_ptr += dst_pitch; // draw blended starty += incyy; startx += incyx; do { do { int srcx = (cx >> 16) & 0x1fff; int srcy = (cy >> 16) & 0x1fff; int pixel; UINT32 offs; offs = srcy * src_pitch + srcx; cx += incxx; cy += incxy; if (offs>=src_size) continue; if (srcx < src_minx || srcx > src_maxx || srcy < src_miny || srcy > src_maxy) continue; pixel = src_base[offs]; if (!(pixel & cmask)) continue; if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = alpha_blend_r32(pal_base[pixel], dst_base[dst_ptr+ecx+dst_base2], alpha); if (pixeldouble_output) { ecx++; if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = alpha_blend_r32(pal_base[pixel], dst_base[dst_ptr+ecx+dst_base2], alpha); } } while (++ecx < 0); ecx = tx; dst_ptr += dst_pitch; cy = starty; starty += incyy; cx = startx; startx += incyx; } while (--ty); }
UINT32 nubus_procolor816_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { UINT32 *scanline; int x, y; UINT8 pixels, *vram; vram = m_vram + 4; switch (m_mode) { case 0: // 1 bpp? for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/8; x++) { pixels = vram[(y * 640/8) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels&0x80)]; *scanline++ = m_palette[((pixels<<1)&0x80)]; *scanline++ = m_palette[((pixels<<2)&0x80)]; *scanline++ = m_palette[((pixels<<3)&0x80)]; *scanline++ = m_palette[((pixels<<4)&0x80)]; *scanline++ = m_palette[((pixels<<5)&0x80)]; *scanline++ = m_palette[((pixels<<6)&0x80)]; *scanline++ = m_palette[((pixels<<7)&0x80)]; } } break; case 1: // 2 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/4; x++) { pixels = vram[(y * 640/4) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels&0xc0)]; *scanline++ = m_palette[((pixels<<2)&0xc0)]; *scanline++ = m_palette[((pixels<<4)&0xc0)]; *scanline++ = m_palette[((pixels<<6)&0xc0)]; } } break; case 2: // 4 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/2; x++) { pixels = vram[(y * 640/2) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels&0xf0)]; *scanline++ = m_palette[((pixels&0x0f)<<4)]; } } break; case 3: // 8 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640; x++) { pixels = vram[(y * 640) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[pixels]; } } break; case 4: // 15 bpp { UINT16 *vram16 = (UINT16 *)&m_vram[0]; UINT16 pixels; for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640; x++) { pixels = vram16[(y * 640) + (x^1)]; *scanline++ = rgb_t(((pixels>>10) & 0x1f)<<3, ((pixels>>5) & 0x1f)<<3, (pixels & 0x1f)<<3); } } } break; default: fatalerror("procolor816: unknown video mode %d\n", m_mode); break; } return 0; }
UINT32 uv201_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(get_black_pen(machine()), cliprect); if (!(m_cmd & COMMAND_ENB)) { return 0; } for (int y = 0; y < SCREEN_HEIGHT; y++) { for (int x = 0; x < VISAREA_WIDTH; x++) { int pixel = m_bg; DRAW_PIXEL(y, x); } } for (int i = 0; i < 16; i++) { UINT8 xy_hi = (m_cmd & COMMAND_A_B) ? RAM(RAM_XY_HI_A) : RAM(RAM_XY_HI_B); UINT8 y_lo = (m_cmd & COMMAND_A_B) ? RAM(RAM_Y_LO_A) : RAM(RAM_Y_LO_B); UINT16 y = (BIT(xy_hi, 7) << 8) | y_lo; int xord = xy_hi & 0x0f; UINT8 rp_hi_color = RAM_XORD(RAM_RP_HI_COLOR); UINT8 rp_lo = RAM_XORD(RAM_RP_LO); UINT16 rp = ((rp_hi_color << 8) | rp_lo) & 0x1fff; if (rp < 0x800) rp |= 0x2000; UINT8 dx_int_xcopy = RAM_XORD(RAM_DX_INT_XCOPY); int color = ((dx_int_xcopy & 0x60) >> 2) | (BIT(rp_hi_color, 5) << 2) | (BIT(rp_hi_color, 6) << 1) | (BIT(rp_hi_color, 7)); UINT8 dx = dx_int_xcopy & 0x1f; UINT8 dy = RAM_XORD(RAM_DY); int xcopy = BIT(dx_int_xcopy, 7); UINT8 x = RAM_XORD(RAM_X); if (LOG) logerror("Object %u xord %u y %u x %u dy %u dx %u xcopy %u color %u rp %04x\n", i, xord, y, x, dy, dx, xcopy, color, rp); if (rp == 0) continue; if (y > SCREEN_HEIGHT) continue; for (int sy = 0; sy < dy; sy++) { for (int sx = 0; sx < dx; sx++) { UINT8 data = m_in_db_func(rp); for (int bit = 0; bit < 8; bit++) { int pixel = ((BIT(data, 7) ? color : m_bg) ^ m_fmod) & 0x1f; if (m_cmd & COMMAND_Y_ZM) { int scanline = y + (sy * 2); if (m_cmd & COMMAND_X_ZM) { int dot = (x * 2) + (sx * 16) + (bit * 2); DRAW_PIXEL(scanline, dot); DRAW_PIXEL(scanline, dot + 1); DRAW_PIXEL(scanline + 1, dot); DRAW_PIXEL(scanline + 1, dot + 1); } else { int dot = x + (sx * 8) + bit; DRAW_PIXEL(scanline, dot); DRAW_PIXEL(scanline + 1, dot); } } else { int scanline = y + sy; if (m_cmd & COMMAND_X_ZM) { int dot = (x * 2) + (sx * 16) + (bit * 2); DRAW_PIXEL(scanline, dot); DRAW_PIXEL(scanline, dot + 1); } else { int dot = x + (sx * 8) + bit; DRAW_PIXEL(scanline, dot); } } data <<= 1; } if (!xcopy) rp++; } if (xcopy) rp++; } } return 0; }
UINT32 nubus_xceed30hr_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { UINT32 *scanline; int x, y; UINT8 pixels, *vram; vram = &m_vram[1024]; switch (m_mode) { case 0: // 1 bpp? for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/8; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels>>7)&1]; *scanline++ = m_palette[(pixels>>6)&1]; *scanline++ = m_palette[(pixels>>5)&1]; *scanline++ = m_palette[(pixels>>4)&1]; *scanline++ = m_palette[(pixels>>3)&1]; *scanline++ = m_palette[(pixels>>2)&1]; *scanline++ = m_palette[(pixels>>1)&1]; *scanline++ = m_palette[pixels&1]; } } break; case 1: // 2 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/4; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[((pixels>>6)&3)]; *scanline++ = m_palette[((pixels>>4)&3)]; *scanline++ = m_palette[((pixels>>2)&3)]; *scanline++ = m_palette[(pixels&3)]; } } break; case 2: // 4 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640/2; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[(pixels>>4)]; *scanline++ = m_palette[(pixels&0xf)]; } } break; case 3: // 8 bpp for (y = 0; y < 480; y++) { scanline = &bitmap.pix32(y); for (x = 0; x < 640; x++) { pixels = vram[(y * 1024) + (BYTE4_XOR_BE(x))]; *scanline++ = m_palette[pixels]; } } break; default: fatalerror("xceed30hr: unknown video mode %d\n", m_mode); } return 0; }
/* are the priorities 100% correct? they're the same as they were before conversion to DECO52 sprite device, but if (for example) you walk to the side of the crates in the first part of the game you appear over them... */ uint32_t dassault_state::screen_update_dassault(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { address_space &space = machine().dummy_space(); uint16_t flip = m_deco_tilegen[0]->pf_control_r(space, 0, 0xffff); uint16_t priority = m_priority; flip_screen_set(BIT(flip, 7)); m_sprgen[0]->set_flip_screen(BIT(flip, 7)); m_sprgen[1]->set_flip_screen(BIT(flip, 7)); m_sprgen[1]->draw_sprites(bitmap, cliprect, m_spriteram[1]->buffer(), 0x400); m_sprgen[0]->draw_sprites(bitmap, cliprect, m_spriteram[0]->buffer(), 0x400); bitmap_ind16* sprite_bitmap1 = &m_sprgen[0]->get_sprite_temp_bitmap(); bitmap_ind16* sprite_bitmap2 = &m_sprgen[1]->get_sprite_temp_bitmap(); /* Update tilemaps */ m_deco_tilegen[0]->pf_update(nullptr, m_pf2_rowscroll); m_deco_tilegen[1]->pf_update(nullptr, m_pf4_rowscroll); /* Draw playfields/update priority bitmap */ screen.priority().fill(0, cliprect); bitmap.fill(m_palette->pen(3072), cliprect); m_deco_tilegen[1]->tilemap_2_draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); /* The middle playfields can be swapped priority-wise */ if ((priority & 3) == 0) { mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0600, 0x0600, 0x400, 0xff); // 1 m_deco_tilegen[0]->tilemap_2_draw(screen, bitmap, cliprect, 0, 2); // 2 mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0400, 0x0600, 0x400, 0xff); // 8 m_deco_tilegen[1]->tilemap_1_draw(screen, bitmap, cliprect, 0, 16); // 16 mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0200, 0x0600, 0x400, 0xff); // 32 mixdassaultlayer(bitmap, sprite_bitmap2, cliprect, 0x0000, 0x0000, 0x800, 0x80); // 64? mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0000, 0x0600, 0x400, 0xff); // 128 } else if ((priority & 3) == 1) { mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0600, 0x0600, 0x400, 0xff); // 1 m_deco_tilegen[1]->tilemap_1_draw(screen, bitmap, cliprect, 0, 2); // 2 mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0400, 0x0600, 0x400, 0xff); // 8 mixdassaultlayer(bitmap, sprite_bitmap2, cliprect, 0x0000, 0x0000, 0x800, 0x80); // 16? mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0200, 0x0600, 0x400, 0xff); // 32 m_deco_tilegen[0]->tilemap_2_draw(screen, bitmap, cliprect, 0, 64); // 64 mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0000, 0x0600, 0x400, 0xff); // 128 } else if ((priority & 3) == 3) { mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0600, 0x0600, 0x400, 0xff); // 1 m_deco_tilegen[1]->tilemap_1_draw(screen, bitmap, cliprect, 0, 2); // 2 mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0400, 0x0600, 0x400, 0xff); // 8 m_deco_tilegen[0]->tilemap_2_draw(screen, bitmap, cliprect, 0, 16); // 16 mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0200, 0x0600, 0x400, 0xff); // 32 mixdassaultlayer(bitmap, sprite_bitmap2, cliprect, 0x0000, 0x0000, 0x800, 0x80); // 64? mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0000, 0x0600, 0x400, 0xff); // 128 } else { /* Unused */ } m_deco_tilegen[0]->tilemap_1_draw(screen, bitmap, cliprect, 0, 0); return 0; }