summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/video/stic.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/video/stic.c')
-rw-r--r--src/mess/video/stic.c974
1 files changed, 0 insertions, 974 deletions
diff --git a/src/mess/video/stic.c b/src/mess/video/stic.c
deleted file mode 100644
index b5b8dbfb6a4..00000000000
--- a/src/mess/video/stic.c
+++ /dev/null
@@ -1,974 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nathan Woods,Frank Palazzolo
-/**********************************************************************
-
- General Instruments AY-3-8900-1 a.k.a. Standard Television Interface Chip
- (STIC) emulation for Mattel Intellivision
-
- *********************************************************************/
-
-#include "emu.h"
-#include "video/stic.h"
-
-
-const device_type STIC = &device_creator<stic_device>;
-
-//-------------------------------------------------
-// stic_device - constructor
-//-------------------------------------------------
-
-stic_device::stic_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
- device_t(mconfig, STIC, "STIC (Standard Television Interface Chip) Video Chip", tag, owner, clock, "stic", __FILE__),
- m_grom(*this, "grom"),
- m_x_scale(1),
- m_y_scale(1)
-{
-}
-
-
-//-------------------------------------------------
-// ~stic_device - destructor
-//-------------------------------------------------
-
-stic_device::~stic_device()
-{
-}
-
-//-------------------------------------------------
-// device_start - device-specific startup
-//-------------------------------------------------
-
-void stic_device::device_start()
-{
- machine().first_screen()->register_screen_bitmap(m_bitmap);
-
- save_item(NAME(m_stic_registers));
- save_item(NAME(m_gramdirty));
- save_item(NAME(m_gram));
- save_item(NAME(m_gramdirtybytes));
- save_item(NAME(m_color_stack_mode));
- save_item(NAME(m_color_stack_offset));
- save_item(NAME(m_stic_handshake));
- save_item(NAME(m_border_color));
- save_item(NAME(m_col_delay));
- save_item(NAME(m_row_delay));
- save_item(NAME(m_left_edge_inhibit));
- save_item(NAME(m_top_edge_inhibit));
- save_item(NAME(m_backtab_buffer));
- for (int sp = 0; sp < STIC_MOBS; sp++)
- {
- save_item(m_sprite[sp].visible, "STIC sprite/m_sprite[sp].visible", sp);
- save_item(m_sprite[sp].xpos, "STIC sprite/m_sprite[sp].xpos", sp);
- save_item(m_sprite[sp].ypos, "STIC sprite/m_sprite[sp].ypos", sp);
- save_item(m_sprite[sp].coll, "STIC sprite/m_sprite[sp].coll", sp);
- save_item(m_sprite[sp].collision, "STIC sprite/m_sprite[sp].collision", sp);
- save_item(m_sprite[sp].doublex, "STIC sprite/m_sprite[sp].doublex", sp);
- save_item(m_sprite[sp].doubley, "STIC sprite/m_sprite[sp].doubley", sp);
- save_item(m_sprite[sp].quady, "STIC sprite/m_sprite[sp].quady", sp);
- save_item(m_sprite[sp].xflip, "STIC sprite/m_sprite[sp].xflip", sp);
- save_item(m_sprite[sp].yflip, "STIC sprite/m_sprite[sp].yflip", sp);
- save_item(m_sprite[sp].behind_foreground, "STIC sprite/m_sprite[sp].behind_foreground", sp);
- save_item(m_sprite[sp].grom, "STIC sprite/m_sprite[sp].grom", sp);
- save_item(m_sprite[sp].card, "STIC sprite/m_sprite[sp].card", sp);
- save_item(m_sprite[sp].color, "STIC sprite/m_sprite[sp].color", sp);
- save_item(m_sprite[sp].doubleyres, "STIC sprite/m_sprite[sp].doubleyres", sp);
- save_item(m_sprite[sp].dirty, "STIC sprite/m_sprite[sp].dirty", sp);
- save_item(m_sprite_buffers[sp], "STIC sprite/m_sprite[sp].sprite_buffers", sp);
- }
-}
-
-void stic_device::device_reset()
-{
- for (int i = 0; i < STIC_MOBS; i++)
- {
- intv_sprite_type* s = &m_sprite[i];
- s->visible = 0;
- s->xpos = 0;
- s->ypos = 0;
- s->coll = 0;
- s->collision = 0;
- s->doublex = 0;
- s->doubley = 0;
- s->quady = 0;
- s->xflip = 0;
- s->yflip = 0;
- s->behind_foreground = 0;
- s->grom = 0;
- s->card = 0;
- s->color = 0;
- s->doubleyres = 0;
- s->dirty = 1;
- for (int j = 0; j < 16; j++)
- {
- for (int k = 0; k < 128; k++)
- {
- m_sprite_buffers[i][j][k] = 0;
- }
- }
- }
-
- memset(m_stic_registers, 0, sizeof(m_stic_registers));
- m_gramdirty = 1;
- for (int i = 0; i < 64; i++)
- {
- m_gram[i] = 0;
- m_gramdirtybytes[i] = 1;
- }
-
- m_color_stack_mode = 0;
- m_color_stack_offset = 0;
- m_stic_handshake = 0;
- m_border_color = 0;
- m_col_delay = 0;
- m_row_delay = 0;
- m_left_edge_inhibit = 0;
- m_top_edge_inhibit = 0;
-}
-
-ROM_START( stic_grom )
- ROM_REGION( 0x800, "grom", ROMREGION_ERASEFF )
- ROM_LOAD( "ro-3-9503-003.u21", 0, 0x0800, CRC(683a4158) SHA1(f9608bb4ad1cfe3640d02844c7ad8e0bcd974917))
-ROM_END
-
-const rom_entry *stic_device::device_rom_region() const
-{
- return ROM_NAME( stic_grom );
-}
-
-
-
-#define FOREGROUND_BIT 0x0010
-
-// conversion from Intellivision color to internal representation
-#define SET_COLOR(c) ((c * 2) + 1)
-#define GET_COLOR(c) ((c - 1) / 2)
-
-/* initialized to non-zero, because we divide by it */
-
-void stic_device::intv_set_pixel(bitmap_ind16 &bitmap, int x, int y, UINT32 color)
-{
- int w, h;
-
- // output scaling
- x *= m_x_scale;
- y *= m_y_scale;
- color = SET_COLOR(color);
-
- for (h = 0; h < m_y_scale; h++)
- for (w = 0; w < m_x_scale; w++)
- bitmap.pix16(y + h, x + w) = color;
-}
-
-UINT32 stic_device::intv_get_pixel(bitmap_ind16 &bitmap, int x, int y)
-{
- return GET_COLOR(bitmap.pix16(y * m_y_scale, x * m_x_scale));
-}
-
-void stic_device::intv_plot_box(bitmap_ind16 &bitmap, int x, int y, int w, int h, int color)
-{
- bitmap.plot_box(x * m_x_scale, y * m_y_scale, w * m_x_scale, h * m_y_scale, SET_COLOR(color));
-}
-
-
-int stic_device::sprites_collide(int spriteNum1, int spriteNum2)
-{
- INT16 x0, y0, w0, h0, x1, y1, w1, h1, x2, y2, w2, h2;
-
- intv_sprite_type* s1 = &m_sprite[spriteNum1];
- intv_sprite_type* s2 = &m_sprite[spriteNum2];
-
- x0 = STIC_OVERSCAN_LEFT_WIDTH + m_col_delay - STIC_CARD_WIDTH;
- y0 = STIC_OVERSCAN_TOP_HEIGHT + m_row_delay - STIC_CARD_HEIGHT;
- x1 = (s1->xpos + x0) * STIC_X_SCALE; y1 = (s1->ypos + y0) * STIC_Y_SCALE;
- x2 = (s2->xpos + x0) * STIC_X_SCALE; y2 = (s2->ypos + y0) * STIC_Y_SCALE;
- w1 = (s1->doublex ? 2 : 1) * STIC_CARD_WIDTH;
- w2 = (s2->doublex ? 2 : 1) * STIC_CARD_WIDTH;
- h1 = (s1->quady ? 4 : 1) * (s1->doubley ? 2 : 1) * (s1->doubleyres ? 2 : 1) * STIC_CARD_HEIGHT;
- h2 = (s2->quady ? 4 : 1) * (s2->doubley ? 2 : 1) * (s2->doubleyres ? 2 : 1) * STIC_CARD_HEIGHT;
-
- if ((x1 >= x2 + w2) || (y1 >= y2 + h2) ||
- (x2 >= x1 + w1) || (y2 >= y1 + h1))
- return FALSE;
-
- // iterate over the intersecting bits to see if any touch
- x0 = MAX(x1, x2);
- y0 = MAX(y1, y2);
- w0 = MIN(x1 + w1, x2 + w2) - x0;
- h0 = MIN(y1 + h1, y2 + h2) - y0;
- x1 = x0 - x1;
- y1 = y0 - y1;
- x2 = x0 - x2;
- y2 = y0 - y2;
- for (x0 = 0; x0 < w0; x0++)
- {
- for (y0 = 0; y0 < h0; y0++)
- {
- if (m_sprite_buffers[spriteNum1][x0 + x1][y0 + y1] &&
- m_sprite_buffers[spriteNum2][x0 + x2][y0 + y2])
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-void stic_device::determine_sprite_collisions()
-{
- // check sprite to sprite collisions
- for (int i = 0; i < STIC_MOBS - 1; i++)
- {
- intv_sprite_type* s1 = &m_sprite[i];
- if (s1->xpos == 0 || !s1->coll)
- continue;
-
- for (int j = i + 1; j < STIC_MOBS; j++)
- {
- intv_sprite_type* s2 = &m_sprite[j];
- if (s2->xpos == 0 || !s2->coll)
- continue;
-
- if (sprites_collide(i, j))
- {
- s1->collision |= (1 << j);
- s2->collision |= (1 << i);
- }
- }
- }
-}
-
-void stic_device::render_sprites()
-{
- INT32 cardMemoryLocation, pixelSize;
- INT32 spritePixelHeight;
- INT32 nextMemoryLocation;
- INT32 nextData;
- INT32 nextX;
- INT32 nextY;
- INT32 xInc;
-
- for (int i = 0; i < STIC_MOBS; i++)
- {
- intv_sprite_type* s = &m_sprite[i];
-
- if (s->grom)
- cardMemoryLocation = (s->card * STIC_CARD_HEIGHT);
- else
- cardMemoryLocation = ((s->card & 0x003F) * STIC_CARD_HEIGHT);
-
- pixelSize = (s->quady ? 4 : 1) * (s->doubley ? 2 : 1);
- spritePixelHeight = pixelSize * (s->doubleyres ? 2 : 1) * STIC_CARD_HEIGHT;
-
- for (int j = 0; j < spritePixelHeight; j++)
- {
- nextMemoryLocation = (cardMemoryLocation + (j/pixelSize));
- if (s->grom)
- nextData = m_grom[nextMemoryLocation];
- else if (nextMemoryLocation < 0x200)
- nextData = m_gram[nextMemoryLocation];
- else
- nextData = 0xFFFF;
- nextX = (s->xflip ? ((s->doublex ? 2 : 1) * STIC_CARD_WIDTH - 1) : 0);
- nextY = (s->yflip ? (spritePixelHeight - j - 1) : j);
- xInc = (s->xflip ? -1: 1);
-
- for (int k = 0; k < STIC_CARD_WIDTH * (1 + s->doublex); k++)
- {
- m_sprite_buffers[i][nextX + k * xInc][nextY] = (nextData & (1 << ((STIC_CARD_WIDTH - 1) - k / (1 + s->doublex)))) != 0;
- }
- }
- }
-}
-
-void stic_device::render_line(bitmap_ind16 &bitmap, UINT8 nextByte, UINT16 x, UINT16 y, UINT8 fgcolor, UINT8 bgcolor)
-{
- UINT32 color;
-
- for (int i = 0; i < STIC_CARD_WIDTH; i++)
- {
- color = (nextByte & (1 << ((STIC_CARD_WIDTH - 1) - i)) ? fgcolor : bgcolor);
- intv_set_pixel(bitmap, x+i, y, color);
- intv_set_pixel(bitmap, x+i, y+1, color);
- }
-}
-
-void stic_device::render_colored_squares(bitmap_ind16 &bitmap, UINT16 x, UINT16 y, UINT8 color0, UINT8 color1, UINT8 color2, UINT8 color3)
-{
- intv_plot_box(bitmap, x, y, STIC_CSQM_WIDTH * STIC_X_SCALE, STIC_CSQM_HEIGHT * STIC_Y_SCALE, color0);
- intv_plot_box(bitmap, x + STIC_CSQM_WIDTH * STIC_X_SCALE, y, STIC_CSQM_WIDTH * STIC_X_SCALE, STIC_CSQM_HEIGHT * STIC_Y_SCALE, color1);
- intv_plot_box(bitmap, x, y + STIC_CSQM_HEIGHT * STIC_Y_SCALE, STIC_CSQM_WIDTH * STIC_X_SCALE, STIC_CSQM_HEIGHT * STIC_Y_SCALE, color2);
- intv_plot_box(bitmap, x + STIC_CSQM_WIDTH * STIC_X_SCALE, y + STIC_CSQM_HEIGHT * STIC_Y_SCALE, STIC_CSQM_WIDTH * STIC_X_SCALE, STIC_CSQM_HEIGHT * STIC_Y_SCALE, color3);
-}
-
-void stic_device::render_color_stack_mode(bitmap_ind16 &bitmap)
-{
- INT16 w, h, nextx, nexty;
- UINT8 csPtr = 0;
- UINT16 nextCard;
-
- for (h = 0, nexty = (STIC_OVERSCAN_TOP_HEIGHT + m_row_delay) * STIC_Y_SCALE;
- h < STIC_BACKTAB_HEIGHT;
- h++, nexty += STIC_CARD_HEIGHT * STIC_Y_SCALE)
- {
- for (w = 0, nextx = (STIC_OVERSCAN_LEFT_WIDTH + m_col_delay) * STIC_X_SCALE;
- w < STIC_BACKTAB_WIDTH;
- w++, nextx += STIC_CARD_WIDTH * STIC_X_SCALE)
- {
- nextCard = m_backtab_buffer[h][w];
-
- // colored squares mode
- if ((nextCard & (STIC_CSTM_FG3|STIC_CSTM_SEL)) == STIC_CSTM_FG3)
- {
- UINT8 csColor = m_stic_registers[STIC_CSR + csPtr];
- UINT8 color0 = nextCard & STIC_CSQM_A;
- UINT8 color1 = (nextCard & STIC_CSQM_B) >> 3;
- UINT8 color2 = (nextCard & STIC_CSQM_C) >> 6;
- UINT8 color3 = ((nextCard & STIC_CSQM_D2) >> 11) |
- ((nextCard & (STIC_CSQM_D10)) >> 9);
- render_colored_squares(bitmap, nextx, nexty,
- (color0 == 7 ? csColor : (color0 | FOREGROUND_BIT)),
- (color1 == 7 ? csColor : (color1 | FOREGROUND_BIT)),
- (color2 == 7 ? csColor : (color2 | FOREGROUND_BIT)),
- (color3 == 7 ? csColor : (color3 | FOREGROUND_BIT)));
- }
- //color stack mode
- else
- {
- UINT8 isGrom;
- UINT16 memoryLocation, fgcolor, bgcolor;
- UINT8* memory;
-
- //advance the color pointer, if necessary
- if (nextCard & STIC_CSTM_ADV)
- csPtr = (csPtr+1) & (STIC_CSRS - 1);
-
- fgcolor = ((nextCard & STIC_CSTM_FG3) >> 9) |
- (nextCard & (STIC_CSTM_FG20)) | FOREGROUND_BIT;
- bgcolor = m_stic_registers[STIC_CSR + csPtr] & STIC_CSR_BG;
-
- isGrom = !(nextCard & STIC_CSTM_SEL);
- if (isGrom)
- {
- memoryLocation = nextCard & STIC_CSTM_C;
- memory = m_grom;
- for (int j = 0; j < STIC_CARD_HEIGHT; j++)
- render_line(bitmap, memory[memoryLocation + j],
- nextx, nexty + j * STIC_Y_SCALE, fgcolor, bgcolor);
- }
- else
- {
- memoryLocation = nextCard & STIC_CSTM_C50;
- memory = m_gram;
- for (int j = 0; j < STIC_CARD_HEIGHT; j++)
- render_line(bitmap, memory[memoryLocation + j],
- nextx, nexty + j * STIC_Y_SCALE, fgcolor, bgcolor);
- }
- }
- }
- }
-}
-
-void stic_device::render_fg_bg_mode(bitmap_ind16 &bitmap)
-{
- INT16 w, h, nextx, nexty;
- UINT8 isGrom, fgcolor, bgcolor;
- UINT16 nextCard, memoryLocation;
- UINT8* memory;
-
- for (h = 0, nexty = (STIC_OVERSCAN_TOP_HEIGHT + m_row_delay) * STIC_Y_SCALE;
- h < STIC_BACKTAB_HEIGHT;
- h++, nexty += STIC_CARD_HEIGHT * STIC_Y_SCALE)
- {
- for (w = 0, nextx = (STIC_OVERSCAN_LEFT_WIDTH + m_col_delay) * STIC_X_SCALE;
- w < STIC_BACKTAB_WIDTH;
- w++, nextx += STIC_CARD_WIDTH * STIC_X_SCALE)
- {
- nextCard = m_backtab_buffer[h][w];
- fgcolor = (nextCard & STIC_FBM_FG) | FOREGROUND_BIT;
- bgcolor = ((nextCard & STIC_FBM_BG2) >> 11) |
- ((nextCard & STIC_FBM_BG310) >> 9);
-
- isGrom = !(nextCard & STIC_FBM_SEL);
- if (isGrom)
- {
- memoryLocation = nextCard & STIC_FBM_C;
- memory = m_grom;
- for (int j = 0; j < STIC_CARD_HEIGHT; j++)
- render_line(bitmap, memory[memoryLocation + j],
- nextx, nexty + j * STIC_Y_SCALE, fgcolor, bgcolor);
- }
- else
- {
- memoryLocation = nextCard & STIC_FBM_C;
- memory = m_gram;
- for (int j = 0; j < STIC_CARD_HEIGHT; j++)
- render_line(bitmap, memory[memoryLocation + j],
- nextx, nexty + j * STIC_Y_SCALE, fgcolor, bgcolor);
- }
- }
- }
-}
-
-void stic_device::copy_sprites_to_background(bitmap_ind16 &bitmap)
-{
- UINT8 width, currentPixel;
- UINT8 borderCollision, foregroundCollision;
- UINT8 spritePixelHeight, x, y;
- INT16 leftX, nextY;
- INT16 leftBorder, rightBorder, topBorder, bottomBorder;
- INT32 nextX;
-
- for (int i = STIC_MOBS - 1; i >= 0; i--)
- {
- intv_sprite_type *s = &m_sprite[i];
- if (s->xpos == 0 || (!s->coll && !s->visible))
- continue;
-
- borderCollision = FALSE;
- foregroundCollision = FALSE;
-
- spritePixelHeight = (s->quady ? 4 : 1) * (s->doubley ? 2 : 1) * (s->doubleyres ? 2 : 1) * STIC_CARD_HEIGHT;
- width = (s->doublex ? 2 : 1) * STIC_CARD_WIDTH;
-
- leftX = (s->xpos - STIC_CARD_WIDTH + STIC_OVERSCAN_LEFT_WIDTH + m_col_delay) * STIC_X_SCALE;
- nextY = (s->ypos - STIC_CARD_HEIGHT + STIC_OVERSCAN_TOP_HEIGHT + m_row_delay) * STIC_Y_SCALE;
-
- leftBorder = (STIC_OVERSCAN_LEFT_WIDTH + (m_left_edge_inhibit ? STIC_CARD_WIDTH : 0)) * STIC_X_SCALE;
- rightBorder = (STIC_OVERSCAN_LEFT_WIDTH + STIC_BACKTAB_WIDTH * STIC_CARD_WIDTH - 1 - 1) * STIC_X_SCALE;
- topBorder = (STIC_OVERSCAN_TOP_HEIGHT + (m_top_edge_inhibit ? STIC_CARD_HEIGHT : 0)) * STIC_Y_SCALE;
- bottomBorder = (STIC_OVERSCAN_TOP_HEIGHT + STIC_BACKTAB_HEIGHT * STIC_CARD_HEIGHT) * STIC_Y_SCALE - 1;
-
- for (y = 0; y < spritePixelHeight; y++)
- {
- for (x = 0; x < width; x++)
- {
- //if this sprite pixel is not on, then don't paint it
- if (!m_sprite_buffers[i][x][y])
- continue;
-
- nextX = leftX + x;
- //if the next pixel location is on the border, then we
- //have a border collision and we can ignore painting it
- if ((nextX < leftBorder) || (nextX > rightBorder) ||
- (nextY < topBorder) || (nextY > bottomBorder))
- {
- borderCollision = TRUE;
- continue;
- }
-
- currentPixel = intv_get_pixel(bitmap, nextX, nextY);
-
- //check for foreground collision
- if (currentPixel & FOREGROUND_BIT)
- {
- foregroundCollision = TRUE;
- if (s->behind_foreground)
- continue;
- }
-
- if (s->visible)
- {
- intv_set_pixel(bitmap, nextX, nextY, s->color | (currentPixel & FOREGROUND_BIT));
- }
- }
- nextY++;
- }
-
- //update the collision bits
- if (s->coll)
- {
- if (foregroundCollision)
- s->collision |= STIC_MCR_BKGD;
- if (borderCollision)
- s->collision |= STIC_MCR_BRDR;
- }
- }
-}
-
-void stic_device::render_background(bitmap_ind16 &bitmap)
-{
- if (m_color_stack_mode)
- render_color_stack_mode(bitmap);
- else
- render_fg_bg_mode(bitmap);
-}
-
-#ifdef UNUSED_CODE
-void stic_device::draw_background(bitmap_ind16 &bitmap, int transparency)
-{
- // First, draw the background
- int offs = 0;
- int value = 0;
- int row,col;
- int fgcolor,bgcolor = 0;
- int code;
-
- int colora, colorb, colorc, colord;
-
- int n_bit;
- int p_bit;
- int g_bit;
-
- int j;
-
- int x0 = STIC_OVERSCAN_LEFT_WIDTH + m_col_delay;
- int y0 = STIC_OVERSCAN_TOP_HEIGHT + m_row_delay;
-
- if (m_color_stack_mode == 1)
- {
- m_color_stack_offset = 0;
- for(row = 0; row < STIC_BACKTAB_HEIGHT; row++)
- {
- for(col = 0; col < STIC_BACKTAB_WIDTH; col++)
- {
- value = m_ram16[offs];
-
- n_bit = value & STIC_CSTM_ADV;
- p_bit = value & STIC_CSTM_FG3;
- g_bit = value & STIC_CSTM_SEL;
-
- if (p_bit && (!g_bit)) // colored squares mode
- {
- colora = value & STIC_CSQM_A;
- colorb = (value & STIC_CSQM_B) >> 3;
- colorc = (value & STIC_CSQM_C) >> 6;
- colord = ((n_bit & STIC_CSQM_D2) >> 11) + ((value & STIC_CSQM_D10) >> 9);
- // color 7 if the top of the color stack in this mode
- if (colora == 7) colora = m_stic_registers[STIC_CSR + STIC_CSR3];
- if (colorb == 7) colorb = m_stic_registers[STIC_CSR + STIC_CSR3];
- if (colorc == 7) colorc = m_stic_registers[STIC_CSR + STIC_CSR3];
- if (colord == 7) colord = m_stic_registers[STIC_CSR + STIC_CSR3];
- intv_plot_box(bitmap, (x0 + col * STIC_CARD_WIDTH) * STIC_X_SCALE, (y0 + row * STIC_CARD_HEIGHT) * STIC_Y_SCALE, STIC_CSQM_WIDTH * STIC_X_SCALE, STIC_CSQM_HEIGHT * STIC_Y_SCALE, colora);
- intv_plot_box(bitmap, (x0 + col * STIC_CARD_WIDTH + STIC_CSQM_WIDTH)) * STIC_X_SCALE, (y0 + row * STIC_CARD_HEIGHT) * STIC_Y_SCALE, STIC_CSQM_WIDTH * STIC_X_SCALE, STIC_CSQM_HEIGHT * STIC_Y_SCALE, colorb);
- intv_plot_box(bitmap, (x0 + col * STIC_CARD_WIDTH) * STIC_X_SCALE, (y0 + row * STIC_CARD_HEIGHT + STIC_CSQM_HEIGHT) * STIC_Y_SCALE, STIC_CSQM_WIDTH * STIC_X_SCALE, STIC_CSQM_HEIGHT * STIC_Y_SCALE, colorc);
- intv_plot_box(bitmap, (x0 + col * STIC_CARD_WIDTH + STIC_CSQM_WIDTH) * STIC_X_SCALE, (y0 + row * STIC_CARD_HEIGHT + STIC_CSQM_HEIGHT) * STIC_Y_SCALE, STIC_CSQM_WIDTH * STIC_X_SCALE, STIC_CSQM_HEIGHT * STIC_Y_SCALE, colord);
- }
- else // normal color stack mode
- {
- if (n_bit) // next color
- {
- m_color_stack_offset += 1;
- m_color_stack_offset &= (STIC_CSRS - 1);
- }
-
- if (p_bit) // pastel color set
- fgcolor = (value & STIC_CSTM_FG20) + 8;
- else
- fgcolor = value & STIC_CSTM_FG20;
-
- bgcolor = m_stic_registers[STIC_CSR + m_color_stack_offset];
- code = (value & STIC_CSTM_C)>>3;
-
- if (g_bit) // read from gram
- {
- code &= (STIC_CSTM_C50 >> 3); // keep from going outside the array
- //if (m_gramdirtybytes[code] == 1)
- {
- decodechar(m_gfxdecode->gfx(1),
- code,
- m_gram,
- machine().config()->gfxdecodeinfo[1].gfxlayout);
- m_gramdirtybytes[code] = 0;
- }
- // Draw GRAM char
- drawgfx(bitmap,m_gfxdecode->gfx(1),
- code,
- bgcolor*16+fgcolor,
- 0,0, (x0 + col * STIC_CARD_WIDTH) * STIC_X_SCALE, (y0 + row * STIC_CARD_HEIGHT) * STIC_Y_SCALE,
- 0,transparency,bgcolor);
-
- for(j=0;j<8;j++)
- {
- //intv_set_pixel(bitmap, (x0 + col * STIC_CARD_WIDTH + j) * STIC_X_SCALE, (y0 + row * STIC_CARD_HEIGHT + 7) * STIC_Y_SCALE + 1, 1);
- }
-
- }
- else // read from grom
- {
- drawgfx(bitmap,m_gfxdecode->gfx(0),
- code,
- bgcolor*16+fgcolor,
- 0,0, (x0 + col * STIC_CARD_WIDTH) * STIC_X_SCALE, (y0 + row * STIC_CARD_HEIGHT) * STIC_Y_SCALE,
- 0,transparency,bgcolor);
-
- for(j=0;j<8;j++)
- {
- //intv_set_pixel(bitmap, (x0 + col * STIC_CARD_WIDTH + j) * STIC_X_SCALE, (y0 + row * STIC_CARD_HEIGHT + 7) * STIC_Y_SCALE + 1, 2);
- }
- }
- }
- offs++;
- } // next col
- } // next row
- }
- else
- {
- // fg/bg mode goes here
- for(row = 0; row < STIC_BACKTAB_HEIGHT; row++)
- {
- for(col = 0; col < STIC_BACKTAB_WIDTH; col++)
- {
- value = m_ram16[offs];
- fgcolor = value & STIC_FBM_FG;
- bgcolor = ((value & STIC_FBM_BG2) >> 11) + ((value & STIC_FBM_BG310) >> 9);
- code = (value & STIC_FBM_C) >> 3;
-
- if (value & STIC_FBM_SEL) // read for GRAM
- {
- //if (m_gramdirtybytes[code] == 1)
- {
- decodechar(m_gfxdecode->gfx(1),
- code,
- m_gram,
- machine().config()->gfxdecodeinfo[1].gfxlayout);
- m_gramdirtybytes[code] = 0;
- }
- // Draw GRAM char
- drawgfx(bitmap,m_gfxdecode->gfx(1),
- code,
- bgcolor*16+fgcolor,
- 0,0, (x0 + col * STIC_CARD_WIDTH) * STIC_X_SCALE, (y0 + row * STIC_CARD_HEIGHT) * STIC_Y_SCALE,
- 0,transparency,bgcolor);
- }
- else // read from GROM
- {
- drawgfx(bitmap,m_gfxdecode->gfx(0),
- code,
- bgcolor*16+fgcolor,
- 0,0, (x0 + col * STIC_CARD_WIDTH) * STIC_X_SCALE, (y0 + row * STIC_CARD_HEIGHT) * STIC_Y_SCALE,
- 0,transparency,bgcolor);
- }
- offs++;
- } // next col
- } // next row
- }
-}
-#endif
-
-/* TBD: need to handle sprites behind foreground? */
-#ifdef UNUSED_FUNCTION
-void stic_device::draw_sprites(bitmap_ind16 &bitmap, int behind_foreground)
-{
- int code;
- int x0 = STIC_OVERSCAN_LEFT_WIDTH + m_col_delay - STIC_CARD_WIDTH;
- int y0 = STIC_OVERSCAN_TOP_HEIGHT + m_row_delay - STIC_CARD_HEIGHT;
-
- for (int i = STIC_MOBS - 1; i >= 0; --i)
- {
- intv_sprite_type *s = &m_sprite[i];
- if (s->visible && (s->behind_foreground == behind_foreground))
- {
- code = s->card;
- if (!s->grom)
- {
- code %= 64; // keep from going outside the array
- if (s->yres == 1)
- {
- //if (m_gramdirtybytes[code] == 1)
- {
- decodechar(m_gfxdecode->gfx(1),
- code,
- m_gram,
- machine().config()->gfxdecodeinfo[1].gfxlayout);
- m_gramdirtybytes[code] = 0;
- }
- // Draw GRAM char
- m_gfxdecode->gfx(1)->zoom_transpen(bitmap,&machine().screen[0].visarea,
- code,
- s->color,
- s->xflip,s->yflip,
- (s->xpos + x0) * STIC_X_SCALE, (s->ypos + y0) * STIC_Y_SCALE,
- 0x8000 * s->xsize, 0x8000 * s->ysize,0);
- }
- else
- {
- //if ((m_gramdirtybytes[code] == 1) || (m_gramdirtybytes[code+1] == 1))
- {
- decodechar(m_gfxdecode->gfx(1),
- code,
- m_gram,
- machine().config()->gfxdecodeinfo[1].gfxlayout);
- decodechar(m_gfxdecode->gfx(1),
- code+1,
- m_gram,
- machine().config()->gfxdecodeinfo[1].gfxlayout);
- m_gramdirtybytes[code] = 0;
- m_gramdirtybytes[code+1] = 0;
- }
- // Draw GRAM char
- m_gfxdecode->gfx(1)->zoom_transpen(bitmap,&machine().screen[0].visarea,
- code,
- s->color,
- s->xflip,s->yflip,
- (s->xpos + x0) * STIC_X_SCALE, (s->ypos + y0) * STIC_Y_SCALE + s->yflip * s->ysize * STIC_CARD_HEIGHT,
- 0x8000*s->xsize, 0x8000*s->ysize,0);
- m_gfxdecode->gfx(1)->zoom_transpen(bitmap,&machine().screen[0].visarea,
- code+1,
- s->color,
- s->xflip,s->yflip,
- (s->xpos + x0) * STIC_X_SCALE, (s->ypos + y0) * STIC_Y_SCALE + (1 - s->yflip) * s->ysize * STIC_CARD_HEIGHT,
- 0x8000*s->xsize, 0x8000*s->ysize,0);
- }
- }
- else
- {
- if (s->yres == 1)
- {
- // Draw GROM char
- m_gfxdecode->gfx(0)->zoom_transpen(bitmap,&machine().screen[0].visarea,
- code,
- s->color,
- s->xflip,s->yflip,
- (s->xpos + x0) * STIC_X_SCALE, (s->ypos + y0) * STIC_Y_SCALE,
- 0x8000*s->xsize, 0x8000*s->ysize,0);
- }
- else
- {
- m_gfxdecode->gfx(0)->zoom_transpen(bitmap,&machine().screen[0].visarea,
- code,
- s->color,
- s->xflip,s->yflip,
- (s->xpos + x0) * STIC_X_SCALE, (s->ypos + y0) * STIC_Y_SCALE + s->yflip * s->ysize * STIC_CARD_HEIGHT,
- 0x8000*s->xsize, 0x8000*s->ysize,0);
- m_gfxdecode->gfx(0)->zoom_transpen(bitmap,&machine().screen[0].visarea,
- code+1,
- s->color,
- s->xflip,s->yflip,
- (s->xpos + x0) * STIC_X_SCALE, (s->ypos + y0) * STIC_Y_SCALE + (1 - s->yflip) * s->ysize * STIC_CARD_HEIGHT,
- 0x8000*s->xsize, 0x8000*s->ysize,0);
- }
- }
- }
- }
-}
-#endif
-
-void stic_device::draw_borders(bitmap_ind16 &bitmap)
-{
- intv_plot_box(bitmap, 0, 0, (STIC_OVERSCAN_LEFT_WIDTH + (m_left_edge_inhibit ? STIC_CARD_WIDTH : m_col_delay)) * STIC_X_SCALE, (STIC_OVERSCAN_TOP_HEIGHT + STIC_BACKTAB_HEIGHT * STIC_CARD_HEIGHT + STIC_OVERSCAN_BOTTOM_HEIGHT) * STIC_Y_SCALE, m_border_color);
- intv_plot_box(bitmap, (STIC_OVERSCAN_LEFT_WIDTH + STIC_BACKTAB_WIDTH * STIC_CARD_WIDTH - 1) * STIC_X_SCALE, 0, STIC_OVERSCAN_RIGHT_WIDTH, (STIC_OVERSCAN_TOP_HEIGHT + STIC_BACKTAB_HEIGHT * STIC_CARD_HEIGHT + STIC_OVERSCAN_BOTTOM_HEIGHT) * STIC_Y_SCALE, m_border_color);
-
- intv_plot_box(bitmap, 0, 0, (STIC_OVERSCAN_LEFT_WIDTH + STIC_BACKTAB_WIDTH * STIC_CARD_WIDTH - 1 + STIC_OVERSCAN_RIGHT_WIDTH) * STIC_X_SCALE, (STIC_OVERSCAN_TOP_HEIGHT + (m_top_edge_inhibit ? STIC_CARD_HEIGHT : m_row_delay)) * STIC_Y_SCALE, m_border_color);
- intv_plot_box(bitmap, 0, (STIC_OVERSCAN_TOP_HEIGHT + STIC_BACKTAB_HEIGHT * STIC_CARD_HEIGHT) * STIC_Y_SCALE, (STIC_OVERSCAN_LEFT_WIDTH + STIC_BACKTAB_WIDTH * STIC_CARD_WIDTH - 1 + STIC_OVERSCAN_RIGHT_WIDTH) * STIC_X_SCALE, STIC_OVERSCAN_BOTTOM_HEIGHT * STIC_Y_SCALE, m_border_color);
-}
-
-void stic_device::screenrefresh()
-{
- if (m_stic_handshake != 0)
- {
- m_stic_handshake = 0;
- // Render the background
- render_background(m_bitmap);
- // Render the sprites into their buffers
- render_sprites();
- for (int i = 0; i < STIC_MOBS; i++)
- m_sprite[i].collision = 0;
- // Copy the sprites to the background
- copy_sprites_to_background(m_bitmap);
- determine_sprite_collisions();
- for (int i = 0; i < STIC_MOBS; i++)
- m_stic_registers[STIC_MCR + i] |= m_sprite[i].collision;
- /* draw the screen borders if enabled */
- draw_borders(m_bitmap);
- }
- else
- {
- /* STIC disabled, just fill with border color */
- m_bitmap.fill(SET_COLOR(m_border_color));
- }
-}
-
-
-
-READ16_MEMBER( stic_device::read )
-{
- //logerror("%x = stic_r(%x)\n",0,offset);
- switch (offset)
- {
- case STIC_MXR + STIC_MOB0:
- case STIC_MXR + STIC_MOB1:
- case STIC_MXR + STIC_MOB2:
- case STIC_MXR + STIC_MOB3:
- case STIC_MXR + STIC_MOB4:
- case STIC_MXR + STIC_MOB5:
- case STIC_MXR + STIC_MOB6:
- case STIC_MXR + STIC_MOB7:
- return 0x3800 | (m_stic_registers[offset] & 0x07FF);
- case STIC_MYR + STIC_MOB0:
- case STIC_MYR + STIC_MOB1:
- case STIC_MYR + STIC_MOB2:
- case STIC_MYR + STIC_MOB3:
- case STIC_MYR + STIC_MOB4:
- case STIC_MYR + STIC_MOB5:
- case STIC_MYR + STIC_MOB6:
- case STIC_MYR + STIC_MOB7:
- return 0x3000 | (m_stic_registers[offset] & 0x0FFF);
- case STIC_MAR + STIC_MOB0:
- case STIC_MAR + STIC_MOB1:
- case STIC_MAR + STIC_MOB2:
- case STIC_MAR + STIC_MOB3:
- case STIC_MAR + STIC_MOB4:
- case STIC_MAR + STIC_MOB5:
- case STIC_MAR + STIC_MOB6:
- case STIC_MAR + STIC_MOB7:
- return m_stic_registers[offset] & 0x3FFF;
- case STIC_MCR + STIC_MOB0:
- case STIC_MCR + STIC_MOB1:
- case STIC_MCR + STIC_MOB2:
- case STIC_MCR + STIC_MOB3:
- case STIC_MCR + STIC_MOB4:
- case STIC_MCR + STIC_MOB5:
- case STIC_MCR + STIC_MOB6:
- case STIC_MCR + STIC_MOB7:
- return 0x3C00 | (m_stic_registers[offset] & 0x03FF);
- case STIC_GMR:
- m_color_stack_mode = 1;
- //logerror("Setting color stack mode\n");
- /*** fall through ***/
- case STIC_DER:
- return 0x3FFF;
- case STIC_CSR + STIC_CSR0:
- case STIC_CSR + STIC_CSR1:
- case STIC_CSR + STIC_CSR2:
- case STIC_CSR + STIC_CSR3:
- case STIC_BCR:
- return 0x3FF0 | (m_stic_registers[offset] & 0x000F);
- case STIC_HDR:
- case STIC_VDR:
- return 0x3FF8 | (m_stic_registers[offset] & 0x0007);
- case STIC_CBR:
- return 0x3FFC | (m_stic_registers[offset] & 0x0003);
- default:
- //logerror("unmapped read from STIC register %02X\n", offset);
- return 0x3FFF;
- }
-}
-
-WRITE16_MEMBER( stic_device::write )
-{
- intv_sprite_type *s;
-
- //logerror("stic_w(%x) = %x\n",offset,data);
- switch (offset)
- {
- // X Positions
- case STIC_MXR + STIC_MOB0:
- case STIC_MXR + STIC_MOB1:
- case STIC_MXR + STIC_MOB2:
- case STIC_MXR + STIC_MOB3:
- case STIC_MXR + STIC_MOB4:
- case STIC_MXR + STIC_MOB5:
- case STIC_MXR + STIC_MOB6:
- case STIC_MXR + STIC_MOB7:
- s = &m_sprite[offset & (STIC_MOBS - 1)];
- s->doublex = !!(data & STIC_MXR_XSIZE);
- s->visible = !!(data & STIC_MXR_VIS);
- s->coll = !!(data & STIC_MXR_COL);
- s->xpos = (data & STIC_MXR_X);
- break;
- // Y Positions
- case STIC_MYR + STIC_MOB0:
- case STIC_MYR + STIC_MOB1:
- case STIC_MYR + STIC_MOB2:
- case STIC_MYR + STIC_MOB3:
- case STIC_MYR + STIC_MOB4:
- case STIC_MYR + STIC_MOB5:
- case STIC_MYR + STIC_MOB6:
- case STIC_MYR + STIC_MOB7:
- s = &m_sprite[offset & (STIC_MOBS - 1)];
- s->yflip = !!(data & STIC_MYR_YFLIP);
- s->xflip = !!(data & STIC_MYR_XFLIP);
- s->quady = !!(data & STIC_MYR_YSIZE);
- s->doubley = !!(data & STIC_MYR_YFULL);
- s->doubleyres = !!(data & STIC_MYR_YRES);
- s->ypos = (data & STIC_MYR_Y);
- break;
- // Attributes
- case STIC_MAR + STIC_MOB0:
- case STIC_MAR + STIC_MOB1:
- case STIC_MAR + STIC_MOB2:
- case STIC_MAR + STIC_MOB3:
- case STIC_MAR + STIC_MOB4:
- case STIC_MAR + STIC_MOB5:
- case STIC_MAR + STIC_MOB6:
- case STIC_MAR + STIC_MOB7:
- s = &m_sprite[offset & (STIC_MOBS - 1)];
- s->behind_foreground = !!(data & STIC_MAR_PRI);
- s->grom = !(data & STIC_MAR_SEL);
- s->card = ((data & STIC_MAR_C) >> 3);
- s->color = ((data & STIC_MAR_FG3) >> 9) | (data & STIC_MAR_FG20);
- break;
- // Collision Detection - TBD
- case STIC_MCR + STIC_MOB0:
- case STIC_MCR + STIC_MOB1:
- case STIC_MCR + STIC_MOB2:
- case STIC_MCR + STIC_MOB3:
- case STIC_MCR + STIC_MOB4:
- case STIC_MCR + STIC_MOB5:
- case STIC_MCR + STIC_MOB6:
- case STIC_MCR + STIC_MOB7:
- // a MOB's own collision bit is *always* zero, even if a
- // one is poked into it
- data &= ~(1 << (offset & (STIC_MOBS - 1)));
- break;
- // Display enable
- case STIC_DER:
- //logerror("***Writing a %x to the STIC handshake\n",data);
- m_stic_handshake = 1;
- break;
- // Graphics Mode
- case STIC_GMR:
- m_color_stack_mode = 0;
- break;
- // Color Stack
- case STIC_CSR + STIC_CSR0:
- case STIC_CSR + STIC_CSR1:
- case STIC_CSR + STIC_CSR2:
- case STIC_CSR + STIC_CSR3:
- logerror("Setting color_stack[%x] = %x (%x)\n", offset & (STIC_CSRS - 1),data & STIC_CSR_BG, space.device().safe_pc());
- break;
- // Border Color
- case STIC_BCR:
- //logerror("***Writing a %x to the border color\n",data);
- m_border_color = data & STIC_BCR_BC;
- break;
- // Framing
- case STIC_HDR:
- m_col_delay = data & STIC_HDR_DEL;
- break;
- case STIC_VDR:
- m_row_delay = data & STIC_VDR_DEL;
- break;
- case STIC_CBR:
- m_left_edge_inhibit = (data & STIC_CBR_COL);
- m_top_edge_inhibit = (data & STIC_CBR_ROW) >> 1;
- break;
- default:
- //logerror("unmapped write to STIC register %02X: %04X\n", offset, data);
- break;
- }
-
- if (offset < ARRAY_LENGTH(m_stic_registers))
- m_stic_registers[offset] = data;
-}
-
-
-READ16_MEMBER( stic_device::gram_read )
-{
- return m_gram[offset];
-}
-
-WRITE16_MEMBER( stic_device::gram_write )
-{
- data &= 0xff;
- m_gram[offset] = data;
- m_gramdirtybytes[offset] = 1;
- m_gramdirty = 1;
-}
-
-
-
-UINT32 stic_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
- return 0;
-}