(int *)VRAM_BASEADDR + Y * 80 + Xのアドレスに書き込みます。
| ソース | コメント | 
|---|---|
#include <xparameters.h>
#define VRAM_BASEADDR (int *)XPAR_VGA_0_MEM0_BASEADDR
#define XSIZ 60
#define YSIZ 40
char what( int , int );
void v_puts( int , int , char * );
void v_putc( int , int , char );
static char data1[XSIZ][YSIZ] = {
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
  { 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
};
static char data2[XSIZ][YSIZ];
int
main()
{
  int  i,j,num;
  static char *banner = "Microblaze Softcore Processor Video System";
  v_puts( 0, 0, banner );
  for( j=0; j<16; j++ ){
    for( i=0; i<16 ; i++ ) {
      v_putc( i+64, j+9, 16*j+i );
    }
  }
  for( i=0; i<XSIZ; i++ ){
    for( j=0 ; j<YSIZ ; j++ ) {
      data2[i][j] = 0;
    }
  }
  while(1) {
    for( i=0; i<XSIZ; i++ ){
      for( j=0 ; j<YSIZ ; j++ ) {
        num=0;
        if( what(i-1,j-1) ) num++;
        if( what(i-1,j  ) ) num++;
        if( what(i-1,j+1) ) num++;
        if( what(i  ,j-1) ) num++;
        if( what(i  ,j+1) ) num++;
        if( what(i+1,j-1) ) num++;
        if( what(i+1,j  ) ) num++;
        if( what(i+1,j+1) ) num++;
        if( what(i,j) ) {
          if( num == 2 || num == 3 )
            data2[i][j]=1;
          else
            data2[i][j]=0;
        } else if( num == 3 ) data2[i][j]=1;
      }
    }
    for( i=0; i<XSIZ; i++ ){
      for( j=0 ; j<YSIZ ; j++ ) {
        data1[i][j] = data2[i][j];
        v_putc( XSIZ-i-1, j+5, data2[i][j] ? '@' : ' ' );
        data2[i][j] = 0;
      }
    }
    for( i=0; i<256; i++ ){
      for( j=0 ; j<2000 ; j++ ) {
        v_putc( 79, 0, i );
      }
    }
  }
}
char what( int i, int j)
{
  if( i < 0 ) return 0;
  if( j < 0 ) return 0;
  if( i == XSIZ ) return 0;
  if( j == YSIZ ) return 0;
  return data1[i][j];
}
void v_puts( int x, int y, char *str )
{
  while( *str != '\0' ) {
    v_putc( x++, y, *str++ );
  }
}
void v_putc( int x, int y, char ch )
{
  int *addr;
  addr = VRAM_BASEADDR + (y*80 + x);
  *addr = ch;
}
 | 
 data1[XSIZ][YSIZ] : 生物の初期データ 生物が居るところを 1, 居ない所を 0 としている。 初期データとして、ペンタデカスロン (pentadecathlon) および グライダーガン (gliderguns) が配置されてある。 タイトル表示表示 画面上にすべての文字セットを表示する data2 配列の初期化 data1 配列の各要素毎に、周りの8マスの生物の状態を調べて生物の個数をカウ ントする。 中心に生物がいるとき、まわりに2〜3つの生物が居れば、中心 の生物は生き残る。 中心に生物がいないとき、まわりに3つの生物が居れ ば、中心に生物が誕生する。 次世代の状態を data2 配列に作成する。 data2 配列内を data1 配列にコピーするとともに、 画面上に生物の状態を配置する。 256×2000回の時間待ちループ。右上にキャラクタを表示しながらループする。 what( i, j ) : data1 配列内の data1[i][j] の生物の状態を返す関数 v_puts( x, y, string ) : (x,y)座標から string 文字列を画面に表示する。 v_putc( x, y, ch ) : (x,y)座標に ch 文字列を表示する。  | 
**** Build of configuration Debug for project life **** make all Building file: ../life.c Invoking: MicroBlaze gcc compiler mb-gcc -Wall -O0 -g3 -c -fmessage-length=0 -Wl,--no-relax -I../../life_bsp_0/microblaze_0/include -mxl-barrel-shift -mxl-pattern-compare -mcpu=v8.40.a -mno-xl-soft-mul -MMD -MP -MF"life.d" -MT"life.d" -o"life.o" "../life.c" Finished building: ../life.c ' ' Building target: life.elf Invoking: MicroBlaze gcc linker mb-gcc -Wl,--no-relax -Wl,-T -Wl,../src/lscript.ld -L../../life_bsp_0/microblaze_0/lib -mxl-barrel-shift -mxl-pattern-compare -mcpu=v8.40.a -mno-xl-soft-mul -o"life.elf" ./life.o -Wl,--start-group,-lxil,-lgcc,-lc,--end-group Finished building target: life.elf ' ' Invoking: MicroBlaze Print Size mb-size life.elf |tee "life.elf.size" text data bss dec hex filename 3526 2696 4488 10710 29d6 life.elf Finished building: life.elf.size ' ' Invoking: Xilinx ELF Check elfcheck life.elf -hw ../../life_EDK14.2_PLB_hw_platform/system.xml -pe microblaze_0 |tee "life.elf.elfcheck" elfcheck Xilinx EDK 14.2 Build EDK_P.28xd Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. Command Line: elfcheck -hw ../../life_EDK14.2_PLB_hw_platform/system.xml -pe microblaze_0 life.elf ELF file : life.elf elfcheck passed. Finished building: life.elf.elfcheck ' '