void pc_render_gfx_4bpp(mame_bitmap *bitmap, struct crtc6845 *crtc, const UINT8 *vram, const UINT16 *palette, int interlace) { int sx, sy, sh; int offs = crtc6845_get_start(crtc)*2; int lines = crtc6845_get_char_lines(crtc); int height = crtc6845_get_char_height(crtc); int columns = crtc6845_get_char_columns(crtc)*2; if (!vram) vram = videoram; if (!palette) palette = dummy_palette; for (sy = 0; sy < lines; sy++) { for (sh = 0; sh < height; sh++) { UINT16 *dest = BITMAP_ADDR16(bitmap, sy * height + sh, 0); const UINT8 *src = &vram[offs | ((sh % interlace) << 13)]; for (sx = 0; sx < columns; sx++) { UINT8 b = *(src++); *(dest++) = palette[(b >> 4) & 0x0F]; *(dest++) = palette[(b >> 0) & 0x0F]; } } offs = (offs + columns) & 0x1fff; } }
int crtc6845_port_w(struct crtc6845 *crtc, int offset, UINT8 data) { struct crtc6845_cursor cursor; int idx; UINT8 mask; if (offset & 1) { /* write to a 6845 register, if supported */ idx = crtc->idx & 0x1f; if (idx < (sizeof(crtc->reg) / sizeof(crtc->reg[0]))) { mask = crtc6845_reg_mask[crtc->config.personality][idx].store_mask; /* Don't zero out bits not covered by the mask. */ crtc->reg[crtc->idx] &= ~mask; crtc->reg[crtc->idx] |= (data & mask); /* are there special consequences to writing to this register? */ switch (idx) { case 0xa: case 0xb: case 0xe: case 0xf: crtc6845_get_cursor(crtc, &cursor); if (crtc->config.cursor_changed) crtc->config.cursor_changed(&cursor); break; default: schedule_full_refresh(); break; } /* since the PC1512 does not support the number of lines register directly, * this value is keyed off of register 9 */ if ((crtc->config.personality == M6845_PERSONALITY_PC1512) && (idx == 9)) { UINT8 char_height; char_height = crtc6845_get_char_height(crtc); crtc6845_set_char_lines(crtc, 200 ); // / char_height); } return TRUE; } } else { /* change the idx register */ crtc->idx = data; } return FALSE; }