#include <xparameters.h>
#define VRAM_BASEADDR (char *)XPAR_CGA_0_S00_AXI_BASEADDR
#define XSIZ 60
#define YSIZ 39
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 );
/* Character table */
for( j=0; j<16; j++ ){
for( i=0; i<16 ; i++ ) {
v_putc( i+64, j+9, 16*j+i );
}
}
/* Right side wall */
for( i=0 ; i<44 ; i++ ) {
v_putc( 79, i, i%10 + '0' );
}
/* Bottom wall */
for( i=0 ; i<80 ; i++ ) {
v_putc( i, 44, i%10 + '0' );
}
/* Clear DATA2 array */
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;
}
}
/* Busy wait */
for( i=0; i<256; i++ ){
for( j=0 ; j<1000 ; 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 )
{
volatile char *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×1000回の時間待ちループ。右上にキャラクタを表示しながらループする。
what( i, j ) : data1 配列内の data1[i][j] の生物の状態を返す関数
v_puts( x, y, string ) : (x,y)座標から string 文字列を画面に表示する。
v_putc( x, y, ch ) : (x,y)座標に ch 文字列を表示する。
|