Exemple #1
0
short AddArrayDeref(short array, short index, int offset)
/*
 * offset is integer constant.  array,index are entries in the ST.
 *    array[index+offset]
 */
{
   int mul=4, flag;
   flag = STflag[array-1];
   if (IS_DOUBLE(flag)) mul = 8;
   else if (IS_CHAR(flag)) mul = 1;
   assert(!IS_VEC(flag));
/*
 * FIXED: we multiply the offset with mul always... for architectures which 
 * don't support LoadMul/ConstAndIndex, they will be fixed in FixDeref() 
 */
   offset *= mul;
   return(AddDerefEntry(array, index, mul, offset, array));
}
Exemple #2
0
/***************************************************************************
 *      draw_background()
 * Draws the Alizarin Tetris background. Not yet complete, but it's getting
 * better. :-)
 *********************************************************************PROTO*/
void
draw_background(SDL_Surface *screen, int blockWidth, Grid g[],
	int level[], int my_adj[], int their_adj[], char *name[])
{
    char buf[1024];
    int i;
#define IS_DOUBLE(x) ((x==NETWORK)||(x==SINGLE_VS_AI)||(x==TWO_PLAYERS)||(x==AI_VS_AI))

    if (IS_DOUBLE(gametype)) {
	Assert(g[0].w == g[1].w);
	Assert(g[0].h == g[1].h);
    }

    /*
     * clear away the old stuff
     */
    memset(&layout, 0, sizeof(layout));
    
    if (!adjust_symbol[0]) { /* only load these guys the first time */
	load_adjust_symbols();
    }
    /*
     * 	THE BOARD
     */
    if (IS_DOUBLE(gametype)) {
	layout.grid[0].x = ((screen->w / 2) - ((g[0].w*blockWidth))) - 5 * blockWidth - 2;
	layout.grid[0].y = ((screen->h - (g[0].h*blockWidth)) / 2);
	layout.grid[0].w = (g[0].w*blockWidth);
	layout.grid[0].h = (g[0].h*blockWidth);

	layout.grid[1].y = ((screen->h - (g[0].h*blockWidth)) / 2);
	layout.grid[1].w = (g[0].w*blockWidth);
	layout.grid[1].h = (g[0].h*blockWidth);
	layout.grid[1].x = ((screen->w / 2) - 4) + 5 * blockWidth + 6;

	/* Draw the opponent's board */
	draw_bordered_rect(&layout.grid[1], &layout.grid_border[1], 2);
	g[1].board = layout.grid[1];
    }  else {
	layout.grid[0].x = (screen->w - (g[0].w*blockWidth))/2 ;
	layout.grid[0].y = (screen->h - (g[0].h*blockWidth))/2 ;
	layout.grid[0].w = (g[0].w*blockWidth) ;
	layout.grid[0].h = (g[0].h*blockWidth) ;
	/* Don't need a Board[1] */
    }
    /* draw the leftmost board */
    draw_bordered_rect(&layout.grid[0], &layout.grid_border[0], 2);
    g[0].board = layout.grid[0];

    /*
     * 	SCORING, Names
     */
    for (i=0; i< 1+IS_DOUBLE(gametype); i++) {
	layout.name[i].x = layout.grid[i].x;
	layout.name[i].y = layout.grid[i].y + layout.grid[i].h + 2;
	layout.name[i].w = layout.grid[i].w;
	layout.name[i].h = screen->h - layout.name[i].y;

	if (gametype == DEMO) {
	    char buf[1024];
	    SDL_FillRect(widget_layer, &layout.name[i], int_black);
	    SDL_FillRect(screen, &layout.name[i], int_black);
	    SPRINTF(buf,"Demo (%s)",name[i]);
	    draw_string(buf, color_blue, layout.grid_border[i].x +
		    layout.grid_border[i].w/2, layout.grid_border[i].y +
		    layout.grid_border[i].h, DRAW_CENTER | DRAW_CLEAR | DRAW_UPDATE);
	} else {
	    draw_string(name[i], color_blue,
		    layout.grid_border[i].x + layout.grid_border[i].w/2,
		    layout.grid_border[i].y + layout.grid_border[i].h,
		    DRAW_CENTER);
	}
	/* Set up the coordinates for future score writing */
	layout.score[i].x = layout.grid_border[i].x;
	layout.score[i].w = layout.grid_border[i].w;
	layout.score[i].y = 0;
	layout.score[i].h = layout.grid_border[i].y;
	SDL_FillRect(widget_layer, &layout.score[i], int_black);
	SDL_FillRect(screen, &layout.score[i], int_black);

	SPRINTF(buf,"Level %d, Score:",level[i]);
	draw_string(buf, color_blue, layout.grid_border[i].x,
		layout.grid_border[i].y, DRAW_ABOVE | DRAW_CLEAR);

	layout.score[i].x = layout.grid_border[i].x + layout.grid_border[i].w;
	layout.score[i].y = layout.grid_border[i].y;
    }

    /*
     * 	TIME LEFT
     */

#define TIME_WIDTH 	(16*5)
#define TIME_HEIGHT 	28

    if (gametype == DEMO) {
	/* do nothing */
    } else if (IS_DOUBLE(gametype)) {
	draw_string("Time Left", color_blue, 
		screen->w/2, layout.score[0].y, DRAW_CENTER | DRAW_ABOVE);
	layout.time.x = (screen->w - TIME_WIDTH)/2;
	layout.time.y = layout.score[0].y;
	layout.time.w = TIME_WIDTH;
	layout.time.h = TIME_HEIGHT;
	draw_bordered_rect(&layout.time, &layout.time_border, 2);
    } else { /* single */
	int text_h = draw_string("Time Left", color_blue,
		screen->w/10, screen->h/5, 0);
	layout.time.x = screen->w / 10;
	layout.time.y = screen->h / 5 + text_h;
	layout.time.w = TIME_WIDTH;
	layout.time.h = TIME_HEIGHT;

	draw_bordered_rect(&layout.time, &layout.time_border, 2);
    }

    /*
     *	LEVEL ADJUSTMENT
     */
    if (gametype == DEMO) {

    } else if (gametype == AI_VS_AI) {
	for (i=0;i<3;i++) {
	    char buf[80];

	    layout.adjust[0].symbol[i].x = (screen->w - adjust_symbol[i]->w)/2;
	    layout.adjust[0].symbol[i].w = adjust_symbol[i]->w;
	    layout.adjust[0].symbol[i].h = adjust_symbol[i]->h;
	    layout.adjust[0].symbol[i].y = 
		layout.time_border.y+layout.time_border.h + i * adjust_symbol[i]->h;

	    SDL_BlitSafe(adjust_symbol[i], NULL, widget_layer, 
		    &layout.adjust[0].symbol[i]);

	    /* draw the textual tallies */
	    SPRINTF(buf,"%d",my_adj[i]);
	    draw_string(buf, color_red,
		    layout.adjust[0].symbol[i].x - 10, 
		    layout.adjust[0].symbol[i].y, DRAW_LEFT | DRAW_CLEAR);
	    SPRINTF(buf,"%d",their_adj[i]);
	    draw_string(buf, color_red,
		    layout.adjust[0].symbol[i].x + layout.adjust[0].symbol[i].w + 10, 
		    layout.adjust[0].symbol[i].y, DRAW_CLEAR);
	}
    } else if (IS_DOUBLE(gametype)) {
	for (i=0;i<3;i++) {
	    layout.adjust[0].symbol[i].w = adjust_symbol[i]->w;
	    layout.adjust[0].symbol[i].h = adjust_symbol[i]->h;
	    layout.adjust[0].symbol[i].x = (screen->w - 3*adjust_symbol[i]->w)/2;
	    layout.adjust[0].symbol[i].y = 
		layout.time_border.y+layout.time_border.h + i * adjust_symbol[i]->h;
	    SDL_FillRect(widget_layer, &layout.adjust[0].symbol[i], int_black);
	    SDL_FillRect(screen, &layout.adjust[0].symbol[i], int_black);
	    if (my_adj[i] != -1) 
		SDL_BlitSafe(adjust_symbol[my_adj[i]], NULL, widget_layer, 
			&layout.adjust[0].symbol[i]);
	    layout.adjust[1].symbol[i].w = adjust_symbol[i]->w;
	    layout.adjust[1].symbol[i].h = adjust_symbol[i]->h;
	    layout.adjust[1].symbol[i].x = (screen->w)/2 + adjust_symbol[i]->w/2;
	    layout.adjust[1].symbol[i].y = 
		layout.time_border.y+layout.time_border.h + i * adjust_symbol[i]->h;
	    SDL_FillRect(widget_layer, &layout.adjust[1].symbol[i], int_black);
	    SDL_FillRect(screen, &layout.adjust[1].symbol[i], int_black);
	    if (their_adj[i] != -1) 
		SDL_BlitSafe(adjust_symbol[their_adj[i]], NULL, widget_layer, 
			&layout.adjust[1].symbol[i]);
	}
    } else { /* single player */
	for (i=0;i<3;i++) {
	    layout.adjust[0].symbol[i].w = adjust_symbol[i]->w;
	    layout.adjust[0].symbol[i].h = adjust_symbol[i]->h;
	    layout.adjust[0].symbol[i].x = 
		layout.grid_border[0].x + layout.grid_border[0].w +
		2 * adjust_symbol[i]->w;
	    layout.adjust[0].symbol[i].y = 
		layout.time_border.y +layout.time_border.h+ i * adjust_symbol[i]->h;
	    SDL_FillRect(widget_layer, &layout.adjust[0].symbol[i], int_black);
	    SDL_FillRect(screen, &layout.adjust[0].symbol[i], int_black);
	    if (my_adj[i] != -1) 
		SDL_BlitSafe(adjust_symbol[my_adj[i]], NULL, widget_layer, 
			&layout.adjust[0].symbol[i]);
	}
    }

    /*
     * NEXT PIECE
     */
    if (gametype == DEMO) {
	/* do nothing */
    } else if (IS_DOUBLE(gametype)) {
	int text_h = draw_string("Next Piece", color_blue,
		screen->w / 2, 
		layout.adjust[0].symbol[2].y +
		layout.adjust[0].symbol[2].h, DRAW_CENTER);

	layout.next_piece[0].w = 5 * blockWidth;
	layout.next_piece[0].h = 5 * blockWidth;
	layout.next_piece[0].x = (screen->w / 2) - (5 * blockWidth);
	layout.next_piece[0].y = layout.adjust[0].symbol[2].y +
	    layout.adjust[0].symbol[2].h + text_h;
	draw_bordered_rect(&layout.next_piece[0], &layout.next_piece_border[0], 2);

	layout.next_piece[1].w = layout.next_piece[0].w;
	layout.next_piece[1].h = layout.next_piece[0].h;
	layout.next_piece[1].y = layout.next_piece[0].y;
	layout.next_piece[1].x = (screen->w / 2);
	draw_bordered_rect(&layout.next_piece[1], &layout.next_piece_border[1], 2);
    } else {
	int text_h = draw_string("Next Piece", color_blue,
		screen->w/10, 2*screen->h/5, 0);

	layout.next_piece[0].w = 5 * blockWidth;
	layout.next_piece[0].h = 5 * blockWidth;
	layout.next_piece[0].x = screen->w/10;
	layout.next_piece[0].y = (2*screen->h/5) + text_h;

	/* Draw the box for the next piece to fit in */
	draw_bordered_rect(&layout.next_piece[0], &layout.next_piece_border[0], 2);
    }

    /*
     *	PAUSE BOX
     */
    if (gametype == DEMO) {

    } else if (IS_DOUBLE(gametype)) {
	layout.pause.x = layout.next_piece_border[0].x;
	layout.pause.y = layout.next_piece_border[0].h + layout.next_piece_border[0].y + 2 + 
	    layout.next_piece_border[0].h / 3;
	layout.pause.w = layout.next_piece_border[0].w + layout.next_piece[1].w;
	layout.pause.h = layout.next_piece_border[0].h / 3;
    } else {
	layout.pause.x = layout.next_piece_border[0].x;
	layout.pause.y = layout.next_piece_border[0].h + layout.next_piece_border[0].y + 2 +
	    layout.next_piece_border[0].h / 3;
	layout.pause.w = layout.next_piece_border[0].w;
	layout.pause.h = layout.next_piece_border[0].h / 3;
    }

    /* Blit onto the screen surface */
    {
	SDL_Rect dest;
	dest.x = 0; dest.y = 0; dest.w = screen->w; dest.h = screen->h;

	SDL_BlitSafe(flame_layer, NULL, screen, NULL);
	SDL_BlitSafe(widget_layer, NULL, screen, NULL);
	SDL_UpdateSafe(screen, 1, &dest);
    }
    return;
}
Exemple #3
0
void DoArrayStore(short ptr, short id)
{
   short lreg, k, type;

   k = ptr-1;
   type = FLAG2TYPE(STflag[id-1]);
   #if IFKO_DEBUG_LEVEL > 1
      fprintf(stderr, "pnam=%s, pflag=%d, idname='%s', idflag=%d\n", 
              STname[SToff[k].sa[0]-1], STflag[SToff[k].sa[0]-1], 
              STname[id-1], STflag[id-1]);
   #endif
   lreg = LocalLoad(id);
/*
 * NOTE: we added vector store where the array type and variable type
 * may not exactly match. we may have DOUBLE pointer but the variable is 
 * T_VDOUBLE.
 */
#if 0   
   assert(FLAG2TYPE(STflag[SToff[k].sa[0]-1]) == type);
#else
   if (IS_VEC(STflag[id-1]))
   {
      if ( (IS_VDOUBLE(STflag[id-1]) && !IS_DOUBLE(STflag[SToff[ptr-1].sa[0]-1]))
        || (IS_VFLOAT(STflag[id-1]) && !IS_FLOAT(STflag[SToff[ptr-1].sa[0]-1])) )
         fko_error(__LINE__, "type mismatch for vector store!");
   }
   else
   {
      if (FLAG2TYPE(STflag[SToff[k].sa[0]-1]) != type)
         fko_error(__LINE__, "type mismatch for store!");
   }
#endif
   FixDeref(ptr);
   switch(type)
   {
   case T_INT:
      #ifdef X86_64
         assert(lreg < 8);
         InsNewInst(NULL, NULL, NULL, STS, ptr, -lreg, 0);
      #else
         InsNewInst(NULL, NULL, NULL, ST, ptr, -lreg, 0);
      #endif
      break;
   case T_FLOAT:
      InsNewInst(NULL, NULL, NULL, FST, ptr, -lreg, 0);
      break;
   case T_DOUBLE:
      InsNewInst(NULL, NULL, NULL, FSTD, ptr, -lreg, 0);
      break;
#if 1
   case T_VFLOAT:
      InsNewInst(NULL, NULL, NULL, VFST, ptr, -lreg, 0);
      break;
   case T_VDOUBLE:
      InsNewInst(NULL, NULL, NULL, VDST, ptr, -lreg, 0);
      break;
#endif
   default:
      fko_error(__LINE__, "Unknown type %d\n", type);
   }
   GetReg(-1);
}