亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? vga_controller.c

?? altera的ip核
?? C
?? 第 1 頁 / 共 4 頁
字號:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "vga_controller.h"
#include "io.h"
#include "sys/alt_alarm.h"
#include "sys/alt_cache.h"
#include "system.h"
#include "priv/alt_file.h"

// VGA device list (usualy just one)
ALT_LLIST_HEAD(vga_dev_list);

// General use buffer.  Must only use locally
char fast_buffer[1024 * 3];

/******************************************************************
*  Function: vga_dev_init
*
*  Purpose: HAL device driver initialization.  
*           Called by alt_sys_init.
*
******************************************************************/
int vga_dev_init ( vga_controller_dev* vga )
{
  int ret_code = 0;
 
  ret_code = vga_device_register( &(vga->dev) );
 
  return ret_code;
}

/******************************************************************
*  Function: alt_vga_open_dev
*
*  Purpose: Opens the VGA controller for use.  
*           Returns a file descriptor for the controller
*
******************************************************************/
alt_dev* alt_vga_open_dev(const char* name)
{
  alt_dev* dev = (alt_dev*)alt_find_dev(name, &vga_dev_list);

  return dev;
}

/******************************************************************
*  Function: alt_vga_close_dev
*
*  Purpose: Closes the VGA controller.
*
******************************************************************/
void alt_vga_close_dev(alt_dev* fd)
{
  return;
}

/******************************************************************
*  Function: vga_init_no_interrupt
*
*  Purpose: Initializes the VGA controller for the Lancelot VGA
*           daughterboard.  Gets memory for the frame buffer, sets 
*           the resolution of the frame buffer, resets the VGA 
*           controller hardware, gives the controller the base 
*           address of the frame buffer, then enables
*           the controller.  Interrupts are NOT enabled.
*
******************************************************************/
vga_frame_buffer_struct* vga_init_no_interrupt ( vga_controller_dev* vga, int buffer_location)
{
	vga_frame_buffer_struct* vga_frame_buffer;
  int bytes_per_pixel, bytes_per_frame;
  
  // We'll need these values more than once, so let's pre-calculate them.
  bytes_per_pixel = vga->color_depth >> 3;
  bytes_per_frame = (( vga->width * vga->height ) * bytes_per_pixel);

	// Allocate our frame buffers
	if( buffer_location == HEAP )
	{
		vga_frame_buffer = (vga_frame_buffer_struct*) alt_uncached_malloc(sizeof (vga_frame_buffer_struct));
	  vga_frame_buffer->vga_frame0 = (vga_frame_array*) alt_uncached_malloc(( bytes_per_frame ));
	  // If we're double-buffering, grab an extra buffer, if not, just make 
	  // both pointers point to the same buffer.
	  if(vga->frame_buffers == 2)
	  {
	  	vga_frame_buffer->vga_frame1 = (vga_frame_array*) alt_uncached_malloc(( bytes_per_frame ));
	  }
	  else
	  {
	  	vga_frame_buffer->vga_frame1 = vga_frame_buffer->vga_frame0;
	  }
	}
	else
	{
		vga_frame_buffer = (vga_frame_buffer_struct*)buffer_location;
		vga_frame_buffer->vga_frame0 = (vga_frame_array*)(buffer_location + sizeof(vga_frame_buffer_struct));
	  // If we're double-buffering, grab an extra buffer, if not, just make 
	  // both pointers point to the same buffer.
	  if(vga->frame_buffers == 2)
	  {
	  	vga_frame_buffer->vga_frame1 = (vga_frame_buffer->vga_frame0 + bytes_per_frame);
	  }
 	  else
	  {
	  	vga_frame_buffer->vga_frame1 = vga_frame_buffer->vga_frame0;
	  }
	}
	vga_frame_buffer->width = vga->width;
	vga_frame_buffer->height = vga->height;
	vga_frame_buffer->color_depth = vga->color_depth;
	vga_frame_buffer->frame_buffers = vga->frame_buffers;
	vga_frame_buffer->bytes_per_frame = bytes_per_frame;
	vga_frame_buffer->bytes_per_pixel = (vga->color_depth / 8);
	vga_frame_buffer->vga_controller_base = vga->base_addr;
	
  //Clear all frame buffers to black
	vga_clear_screen( vga_frame_buffer, BLACK_8 );
  vga_flip_frame_buffers( vga_frame_buffer );
	vga_clear_screen( vga_frame_buffer, BLACK_8 );
  	
	IOWR_32DIRECT( vga->base_addr, 0, 0x0 ); /* Reset the VGA controller */
	IOWR_32DIRECT( vga->base_addr, 4, ( int )vga_frame_buffer->vga_frame0 ); /* Where our frame buffer starts */
	IOWR_32DIRECT( vga->base_addr, 8, ( ( vga->width * vga->height ) * bytes_per_pixel ) ); /* amount of memory needed */   
	IOWR_32DIRECT( vga->base_addr, 0, 0x1 ); /* Set the go bit. */
	
  return ( vga_frame_buffer );
}

int vga_flip_frame_buffers( vga_frame_buffer_struct* vga_frame_buffer )
{
	vga_frame_array* temp_frame;
	int ret_code;
	
	if( vga_frame_buffer->frame_buffers == 2 )
	{
		temp_frame = vga_frame_buffer->vga_frame0;
		vga_frame_buffer->vga_frame0 = vga_frame_buffer->vga_frame1;
		vga_frame_buffer->vga_frame1 = temp_frame;
		IOWR_32DIRECT( vga_frame_buffer->vga_controller_base, 4, ( int )vga_frame_buffer->vga_frame0 );
		ret_code = 0;
	}
	else
	{
		ret_code = 1;
	}
	return(ret_code);
}

int vga_stop ( vga_controller_dev* vga )
{

	IOWR_32DIRECT( vga->base_addr, 0, 0x0 ); /* Reset the VGA controller */

  return (0);
}

void vga_scroll_string_quit(vga_text_scroll_struct* scroll)
{
  free(scroll->string);
  free(scroll);
}

vga_text_scroll_struct* vga_scroll_string_init(int hbegin, int vbegin, int hend, int f_color, int b_color, char* font, int ms_delay, char *string)
{
  vga_text_scroll_struct* scroll;
  scroll = malloc(sizeof (vga_text_scroll_struct));
  
  scroll->hbegin = hbegin;
  scroll->vbegin = vbegin;
  scroll->hend = hend;
  scroll->f_color = f_color;
  scroll->b_color = b_color;
  scroll->string = malloc(strlen(string)+2);
  strcpy(scroll->string, string);
  scroll->font = font;
  scroll->ms_delay = ms_delay;
  scroll->ticks_at_last_move = alt_nticks();
  scroll->text_scroll_index = 0;
  scroll->text_scroll_started = 0;
  scroll->window_width = scroll->hend - scroll->hbegin;
  scroll->length_of_string = strlen(string);
  scroll->string_points = scroll->length_of_string * 8;
  scroll->scroll_points = (scroll->window_width + scroll->string_points);
 
  return(scroll);
  
}


int vga_scroll_string(vga_text_scroll_struct* scroll, vga_frame_buffer_struct* vga_frame_buffer)
{

  int x_start, x_end, x_index, string_x_index, string_char_index, char_row, char_column;
  char character, column_mask;
  char* font_char_ptr;
  char pixels_to_move_by = 1;

  // If it's time to move the scroll..
  if (alt_nticks() >= (scroll->ticks_at_last_move + ((alt_ticks_per_second() * (scroll->ms_delay)) / 1000))) {
    scroll->ticks_at_last_move = alt_nticks();
    
    // Track where we are in the scroll.
    if(scroll->text_scroll_started == 0) {
      scroll->text_scroll_index = 0;
      scroll->text_scroll_started = 1;
    } else if(scroll->text_scroll_index >= scroll->scroll_points)  {
      scroll->text_scroll_started = 0;
    } else {
      scroll->text_scroll_index += pixels_to_move_by;
    }
    
    //Find out where we start
    if (scroll->text_scroll_index < scroll->window_width) {
      x_start = scroll->hbegin + scroll->window_width - scroll->text_scroll_index;
    } else {
      x_start = scroll->hbegin;
    }
    //Find out where we end
    if (scroll->string_points > scroll->text_scroll_index) {
      x_end = scroll->hend;
    } else {
      x_end = (scroll->hend - scroll->text_scroll_index + scroll->string_points);
    }

    // Write the string segment a column (x) at a time
    for(x_index = x_start; x_index < x_end; x_index++) {
      // Find the x index we're at within the string
      // If first part of string hasnt yet reached left side of scroll window
      if (scroll->text_scroll_index < scroll->window_width) {
        string_x_index = (x_index - x_start);
      } else {
        string_x_index = scroll->text_scroll_index - scroll->window_width + x_index - x_start;
      }
      //Find the character we're supposed to be writing
      string_char_index = (string_x_index / 8);
      character = scroll->string[string_char_index];
      char_column = (string_x_index % 8);
      column_mask = (((unsigned int)0x80) >> char_column);
      font_char_ptr = (scroll->font + ((character - 0x20) * FONT_10PT_ROW));
      //We have all the data now, so let's write a column
      for(char_row = 0; char_row < 11; char_row++) {
        // If the font table says this pixel is on, then set it to the foreground color
        if (*(font_char_ptr + char_row) & column_mask) {
          vga_set_pixel(x_index, scroll->vbegin + char_row, scroll->f_color, vga_frame_buffer); 
        // Otherwise, set it to the background color.
        } else {
          vga_set_pixel(x_index, scroll->vbegin + char_row, scroll->b_color, vga_frame_buffer); //background color
        }
      }
    }
    // Erase the leftover column (x) of the last string we wrote.
    vga_draw_line(x_end, scroll->vbegin, x_end, scroll->vbegin + 10, 1, scroll->b_color, vga_frame_buffer);
    // Log what time we moved the scroll.
  }
  return(0);
}


/******************************************************************
*  Function: vga_move_block
*
*  Purpose: Moves a block around the screen, backfilling with 
*           the backfill_color parameter.
*
******************************************************************/

int vga_move_block(int xbegin, int ybegin, int xend, int yend, int x_distance, int y_distance, int backfill_color, vga_frame_buffer_struct* vga_frame_buffer)
{
  int read_x, read_y, write_x, write_y;
  short temp_pixel;
  
  if(x_distance <= 0 && y_distance <= 0) {  
    //Move by rows because they are contiguous in memory (could help speed if in SDRAM)
    for (read_y = ybegin; read_y < yend; read_y++) {
      write_y = read_y + y_distance;
      for(read_x = xbegin; read_x < xend; read_x++) {
        write_x = read_x + x_distance;
        temp_pixel = vga_get_pixel(read_x, read_y, vga_frame_buffer);
        vga_set_pixel(write_x, write_y, temp_pixel, vga_frame_buffer);
        if(read_x >= xend + x_distance || read_y >= yend + y_distance) 
        {
	        vga_set_pixel(read_x, read_y, backfill_color, vga_frame_buffer);
        }
      }
    }
  }
  return (0);
}

/******************************************************************
*  Function: vga_print_string
*
*  Purpose: Prints a string to the specified location of the screen
*           using the specified font and color.
*           Calls vga_print_char
*
******************************************************************/
int vga_print_string(int horiz_offset, int vert_offset, int color, char *font, vga_frame_buffer_struct* vga_frame_buffer, char string[])
{
  int i = 0;
  int original_horiz_offset;

  original_horiz_offset = horiz_offset;

  // Print until we hit the '\0' char.
  while (string[i]) {
    //Handle newline char here.
    if (string[i] == '\n') {
      horiz_offset = original_horiz_offset;
      vert_offset += 12;
      i++;
      continue;
    }
    // Lay down that character and increment our offsets.
    vga_print_char (horiz_offset, vert_offset, color, string[i], font, vga_frame_buffer);
    i++;
    horiz_offset += 8;
  }
  return (0);
}

/******************************************************************

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
六月丁香综合在线视频| 91精品国产美女浴室洗澡无遮挡| 久久在线免费观看| 韩国午夜理伦三级不卡影院| 精品国内二区三区| 国产一区二区三区久久悠悠色av| 久久嫩草精品久久久久| 成人免费高清视频| 亚洲精品成人少妇| 欧美日韩aaaaaa| 国内精品国产成人国产三级粉色| 国产欧美日韩另类一区| 91老司机福利 在线| 亚洲小少妇裸体bbw| 日韩免费性生活视频播放| 狠狠色丁香久久婷婷综合丁香| 国产色婷婷亚洲99精品小说| 成人动漫精品一区二区| 亚洲一区二区三区四区中文字幕| 欧美美女bb生活片| 国产精品一区在线观看乱码| 亚洲日本青草视频在线怡红院 | 26uuu精品一区二区在线观看| 国产乱人伦精品一区二区在线观看| 国产日韩精品一区| 欧美自拍偷拍一区| 激情久久五月天| 亚洲乱码国产乱码精品精98午夜| 欧美另类z0zxhd电影| 国产一区欧美二区| 最新国产精品久久精品| 欧美一卡2卡三卡4卡5免费| 国产98色在线|日韩| 亚洲1区2区3区视频| 亚洲国产精品av| 在线播放91灌醉迷j高跟美女 | 久久超级碰视频| 成人免费在线视频| 欧美一二三区在线| 色久优优欧美色久优优| 国产精品99久久久| 日韩精品免费视频人成| 中文字幕一区免费在线观看 | 欧美午夜精品一区二区蜜桃| 国产美女精品在线| 水蜜桃久久夜色精品一区的特点| 国产视频视频一区| 欧美mv和日韩mv国产网站| 一本久道中文字幕精品亚洲嫩| 精品系列免费在线观看| 亚洲福中文字幕伊人影院| 国产精品美女一区二区在线观看| 欧美一区二区在线看| 一本色道久久综合亚洲aⅴ蜜桃| 国产一区二区三区不卡在线观看| 亚洲不卡av一区二区三区| 最近中文字幕一区二区三区| 久久精品亚洲乱码伦伦中文| 日韩一区二区三区免费观看| 在线观看亚洲一区| 91丨porny丨首页| 成人深夜在线观看| 国产黄色91视频| 韩日av一区二区| 久久国产婷婷国产香蕉| 日韩国产欧美视频| 亚洲国产va精品久久久不卡综合| 日韩美女精品在线| 国产精品久久久久影院亚瑟 | 欧美亚洲国产一区二区三区va | 最好看的中文字幕久久| 国产精品色哟哟| 国产女同性恋一区二区| 久久精品免视看| 久久精品人人做人人爽人人| 久久色成人在线| 精品国产网站在线观看| 精品久久久久av影院| 日韩精品自拍偷拍| 日韩免费电影网站| 日韩免费一区二区| 久久久精品一品道一区| 日本一区二区三区电影| 欧美韩国日本不卡| 亚洲欧洲三级电影| 亚洲精品国产成人久久av盗摄| 亚洲激情校园春色| 亚洲韩国精品一区| 日韩精品1区2区3区| 美女在线一区二区| 国产一区在线不卡| av午夜精品一区二区三区| 99re热这里只有精品免费视频| 色综合久久中文字幕综合网| 欧美色涩在线第一页| 欧美日韩精品一区二区三区蜜桃| 7777精品伊人久久久大香线蕉的| 日韩一级欧美一级| 国产日本一区二区| 亚洲欧美日韩久久| 日韩av二区在线播放| 国产一区二三区好的| 成人国产在线观看| 欧美色倩网站大全免费| 欧美一区二区女人| 国产精品美女一区二区三区| 一区二区成人在线观看| 免费观看久久久4p| 成人国产电影网| 欧美色窝79yyyycom| 26uuu欧美| 一区二区三区久久久| 麻豆精品一区二区三区| 成人黄色大片在线观看| 欧美一区二区三区啪啪| 久久久久久电影| 亚洲高清免费视频| 高清不卡在线观看| 欧美疯狂性受xxxxx喷水图片| 亚洲精品一区二区三区香蕉| 亚洲人成人一区二区在线观看 | 夜夜揉揉日日人人青青一国产精品| 天堂久久久久va久久久久| 国产很黄免费观看久久| 欧美撒尿777hd撒尿| 国产嫩草影院久久久久| 日韩影视精彩在线| 99精品视频在线免费观看| 日韩欧美激情四射| 一区二区不卡在线视频 午夜欧美不卡在| 蜜芽一区二区三区| 欧洲亚洲国产日韩| 日本一区二区三区久久久久久久久不 | 欧美一区2区视频在线观看| 国产精品毛片久久久久久久| 青青草97国产精品免费观看| 97se亚洲国产综合自在线不卡 | 欧美做爰猛烈大尺度电影无法无天| 精品国产凹凸成av人网站| 亚洲国产成人tv| 91玉足脚交白嫩脚丫在线播放| 精品成人私密视频| 日韩av中文在线观看| 色婷婷综合激情| 国产精品久久久久四虎| 国产精品白丝av| 日韩欧美第一区| 日韩黄色在线观看| 欧美日韩一级片在线观看| 日韩美女啊v在线免费观看| 成人小视频免费在线观看| 精品福利一二区| 日本欧美一区二区在线观看| 色婷婷久久一区二区三区麻豆| 亚洲国产成人一区二区三区| 久久99久久久久久久久久久| 欧美二区乱c少妇| 亚洲国产成人av好男人在线观看| 一本在线高清不卡dvd| 国产精品国产三级国产aⅴ原创| 国产一区在线观看麻豆| 久久综合九色综合97婷婷女人| 日本成人在线视频网站| 欧美一区二区在线不卡| 图片区小说区国产精品视频| 欧美四级电影在线观看| 亚洲一区在线观看视频| 欧美色综合天天久久综合精品| 亚洲资源在线观看| 欧美视频一区二区在线观看| 亚洲第四色夜色| 5566中文字幕一区二区电影| 三级精品在线观看| 日韩三级在线观看| 精品一区中文字幕| 国产日韩欧美精品一区| av在线不卡电影| 亚洲色图在线看| 欧美午夜片在线看| 日本特黄久久久高潮| 欧美不卡视频一区| 国产99久久久精品| 1024成人网| 欧美三级电影在线观看| 欧美aⅴ一区二区三区视频| 精品国产伦一区二区三区观看体验 | 99re热视频精品| 亚洲午夜免费视频| 精品国产免费久久| 99在线热播精品免费| 亚洲一区二区三区爽爽爽爽爽| 欧美猛男超大videosgay| 美国十次综合导航| 欧美国产一区视频在线观看| 91猫先生在线| 蜜臀久久99精品久久久画质超高清 | 国产精品国模大尺度视频| 色呦呦日韩精品| 免费国产亚洲视频| 中文字幕av资源一区|